S2-分支语句和循环语句(2)

目录

  3.循环语句

     3.1 while-先判断,再执行

     3.2 for-与while一样的效果,但形式更优

     3.3 do......while-先执行,在判断(至少执行一次)

循环的使用:for>while>do......while(具体按实际情况来看)


引言:什么是循环呢?

循环:重复执行一组“相同”或“相似”操作的流程

如:我们每天都要吃饭、睡觉这就是一个循环。

3.1 while循环

在前面我们已经掌握了,if语句:

if(表达式)
    语句;
当表达式为真时,if语句后的语句才执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际例子是:同一件事情我们需要重复完成很多次。
那我们怎么用程序表达呢?
C语言中给我们引入了:while语句,可以实现循环。
//while语法结构
while(表达式)
        循环语句;
while循环语句执行的流程:

如实现在屏幕上打印1-10

//在屏幕上打印1-10
#include<stdio.h>//预处理,头文件对printf函数的声明
int main()
{
	int i = 1;//循环的初始化
	while (i <= 10)//循环的判断
	{
		printf("%d ", i);
		i++;//循环的调整
	}

	return 0;
}

从上面这个实例中我们可以知道:

1、while语句和if语句相似:

(1)表达式为真,才执行后面的循环语句;

(2)while后面只能控制一条语句,循环体如果要包含一个以上的语句,必须使用代码块(复合语句)

2、但也有区别,一个循环有着三个重要组成:

(1)循环的初始化部分(用来初始化循环变量的)

(2)循环的条件判断部分(表达式,用来判断循环什么时候终止)

(3)循环的调整部分(用于循环条件的调整---使循环条件趋于假的语句,如果无此语句,则循环变量始终不改变,无限循环)

3.1.1 while语句中的break和continue

1、break的作用和应用

//break代码实例
#include<stdio.h>
int main()
{
	int i = 1;//循环的初始化
	while (i <= 10)//循环的条件判断
	{
		if (5 == i)//当比较一个变量和常量是否相等是,好的习惯是变量放在右边
		{
			break;//break-打破,终止-终止循环
		}
		printf("%d ", i);
		i++;//循环的调整
	}
	return 0;
}

输出是什么?

总结:

(1)break在循环中的作用:循环中break的作用是永远终止循环(在循环中只要遇到break,就停止后期的所有的循环,直接终止循环

(2)应用:在某种情况(条件)满足时,想让循环提前终止。

(3)break只在switch和循环中应用(在switch中break的作用是实现分支)

2.continue的作用和应用

//continue代码实例
#include<stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
		{
			continue;//终止本次循环,进行下一次循环的入口判断
		}
		printf("%d ", i);
		i++;
	}
	return 0;
}

输出什么呢?

输出:1 2 3 4之后陷入死循环 

//continue代码实例2
#include<stdio.h>
int main()
{
	int i = 0;
	while (i < 10)
	{
		i++;
		if (5 == i)
		{
			continue;//终止本次循环,进入下一次循环的入口判断
		}
		printf("%d ", i);
	}
	return 0;
}

输出什么呢?

输出:1 2 3 4 6 7 8 9 10

总结:

(1)continue在while的作用:终止本次循环,进入下一次循环的入口判断(也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分)

(2)应用:当某种情况(条件)满足是,这一次循环内部后面的代码我不想它执行了

(3)continue只在循环中应用

补充:我们还可从上面两个代码得出---在循环体中语句的先后位置必须符合逻辑,否则会影响运算结果。

再看几个代码

//代码什么意思
//代码1
#include<stdio.h>
int main()
{
	int ch = 0;//定义一个整形变量
	while ((ch = getchar()) != EOF)//getchar-输入一个字符,读取失败返回EOF(按ctrl+z)
	{
		putchar(ch);//putchar()-输出一个字符在屏幕上
	}
	return 0;
}

注意:getchar和putchar只针对字符

这里介绍大家一个网站:https://cplusplus,com ->进去后点【legacy version】老版本可以查找这些库函数的详细知识。

 我们可以知道:

(1)getchar()是一个无参函数(参数:传递给函数的叫参数)

(2)返回值:读取成功,返回其ASCII值;读取失败,返回EOF

ch=getchar();具体是如何赋值的如下

 注:getchar函数没有参数,所接受的字符可以赋给字符型或整型变量,也可以作为表达式的一部分。

//代码2
#include<stdio.h>
int main()
{
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>\n");
	scanf("%s", password);//数组名本来就是地址
	printf("请确认密码(Y/N):>\n");
	ch = getchar();
	if ('Y' == ch)
		printf("确认正确\n");
	else
		printf("确认失败\n");
	return 0;
}

 我们发现还没有输入确认密码,就直接失败了,这是为什么呢?

scanf-按照指定的格式,输入数据

scanf默认回车和空格是输入不同组之间的间隔和结束标志。也就是说他不会在读取空格和

‘\n’。

getchar-每调用一次读取一个字符(包括空格符、‘\n’)

getchar---可应用于清理缓存区

调用一次读一个字符---多个----循环(getchar!=‘\n’)

//代码3
#include<stdio.h>
int main()
{
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>\n");
	scanf("%s", password);//数组名本来就是地址
	while (getchar() != '\n')//消除\n-清理缓存区
	{
		;
	}
	printf("请确认密码(Y/N):>\n");
	ch = getchar();
	if ('Y' == ch)
		printf("确认正确\n");
	else
		printf("确认失败\n");
	return 0;
}

//只打印数字字符,跳过其他字符的

//只打印数字字符,跳过其他字符的
#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch >= '0' && ch <= '9')
		{
			putchar(ch);
		}
	}
	return 0;
}

 

 3.2 for循环

我们已经知道了while循环,为什么还要一个for循环呢?

我们先来看看for的语法结构吧

3.2.1 语法

for ( 表达式 1 ; 表达式 2 ; 表达式 3 )
        循环语句 ;

表达式1

表达式1为初始化部分,用来初始化循环变量的

表达式2

表达式2为条件判断部分,用来判断循环什么时候终止的

表达式3

表达式3为调整部分,用于循环条件的调整(循环中,必须有使循环条件趋于假的语句)

for循环的流程执行图:

 我们对for与while进行对比:

打印1-10

#include<stdio.h>
int main()
{
	int i = 0;//初始化
	while (i < 10)//条件判断
	{
		i++;//调整
		printf("%d ", i);
	}
	return 0;
}
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

由于风格的问题while形式比较分散,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

3.2.2 break和continue在for循环中

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
		{
			break;
		}
		printf("%d ", i);
	}
	return 0;
}

输出:1 2 3 4

break在for与while中是一样的作用:终止循环(注:在多层循环中,一个break语句只向外跳一层)

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (5 == i)
		{
			//break;
			continue;
		}
		printf("%d ", i);
	}
	return 0;
}

输出:1 2 3 4 6 7 8 9 10

continue在for与while中作用是一样的:终止本次循环(不执行continue后面的语句)进入下一次循环,但还是有一点区别,for回去是先进入调整部分,再进入条件判断部分,而while可能跳过调整部分

从这我们又看出for比while更优

3.2.3 for语句的循环控制变量

建议:
1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i < 5; i++)
	{
		printf("%d ", i);
		i = 1;
	}
	return 0;
}

输出:1 2 2 2陷入2的死循环,

2. 建议 for 语句的循环控制变量的取值采用 前闭后开区间 写法。
// 前闭后开的写法
for ( i = 0 ; i < 10 ; i ++ )
两边都是闭区间
for ( i = 0 ; i <= 9 ; i ++ )

3.2.4 一些for循环的变种

//代码1
#include<stdio.h>
int main()
{
	for (; ; )
	{
		printf("hehe\n");
	}
	return 0;
}

输出:hehe的死循环

for 循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问 题。
省略掉判断部分,判断就恒为真,循环就死循环
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

输出:9次hehe(外层循环一次内层循环3次)

//代码3
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

这里我们省略了内层循环的变量初始化部分,输出是多呢?

输出:3次hehe

//代码4-使用多余一个变量控制循环
#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	for (i = 0, j = 0; i < 2 && j < 5; i++, j++)
	{
		printf("hehe\n");
	}
	return 0;
}

输出:两次hehe

3.3 do......while循环

3.3.1 do......while语句的语法

do
     循环语句 ;
while ( 表达式 );

注:while(表达式);后有‘;’

3.3.2执行流程

 3.3.3do......while的特点

先执行,在判断——循环至少执行一次,使用的场景有限,所以不常用

#include<stdio.h>
int main()
{
	int i = 0;
	do
	{
		i++;
		printf("%d ", i);
	}while (i < 10);
	return 0;
}

3.3.4break和continue在do...while的作用和while一样

#include<stdio.h>
int main()
{
	int i = 0;
	do
	{
		i++;
		if(5==i)
		{
			continue;
		}
		printf("%d ", i);
	}while (i < 10);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值