循环语句
  • while
  • for
  • do while

 

 

一、while语句

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

if(条件)
语句;

while语句,可以实现循环

//while 语法结构
while(表达式)
循环语句;

 

while语句执行的流程:

分支与循环语句(while,for,do while)_for

 

 

(1)while语句结构

while循环的实例:打印0到10

分支与循环语句(while,for,do while)_for_02

 

(2)while语句中的break与continue

*break用法

分支与循环语句(while,for,do while)_do while_03

 

总结: break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:

while中的break是用于永久终止循环的。

 

*continue用法

分支与循环语句(while,for,do while)_do while_04

分支与循环语句(while,for,do while)_C语言_05

 

总结: continue在while循环中的作用就是:

continue是用于终止本次循环的。

也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

 

 

(3)getchar和putchar

getchar表示键盘输入读取字符,putchar表示键盘输出

//代码什么意思?

#include <stdio.h> 
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF) putchar(ch);
return 0;
}

运行结果:

分支与循环语句(while,for,do while)_for_06

 

 

*EG*

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int ret = 0;  //接受getchar的返回值
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password); //输入密码,并存放在passsword数组中
	printf("请确认:>Y/N");
	ret = getchar();   // Y/N
	if (ret == 'Y')
		printf("确认成功\n");
	else
		printf("放弃确认\n");
	return 0;
}

分支与循环语句(while,for,do while)_for_07

我们要思考,为什么我们输入密码后,直接就输出了???

打开监视窗口,可以看到程序运行到scanf("%s", password);后直接跳到ret = getchar();并且ret=10。


解释——> scanf,getchar都是输入函数,读取数据时从一个叫输入缓冲区的地方取数据,当执行scanf后,我们需要输入密码(字符串),并按下回车才能使程序执行下一步,于是我们输入密码123456后我们按了回车,此时输入缓冲区实际得到’123456\n’的字符串,而不是’123456’。

’\n’实际上就是回车,scanf取得字符串‘123456’,留了个‘\n’,getchar取得后赋值给ret,而’\n’的ASCLL码值就是10,于是ret = 10;ret得到了值。于是不会等待我们输入Y\N,而是直接进入if语句,且ret != ‘Y’,于是程序直接输出“放弃确认”。

为此,我们应该将输入缓冲区清空,使getchar不能得到‘\n’,因此程序应更改为:

//示例二
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int ret = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	//输入缓存区还剩一个'\n',
	//读取一个'\n',将输入缓存区清空
	getchar();  
    //读取’\n‘
	printf("请确认:>Y/N");
	ret = getchar();
	if (ret == 'Y')
		printf("确认成功\n");
	else
		printf("放弃确认\n");
	return 0;
}

分支与循环语句(while,for,do while)_C语言_08

 

此时一个字符串的便能成功设置。但多个字符串能不能成功输出呢?

分支与循环语句(while,for,do while)_C语言_09

联系上面分析,我们可以知道,多个字符串仍会失效。

因为scanf只会读取空格前的代码,所以取掉第一个字符串后,还会留下一个字符串和‘\n’,用上面的的代码,getchar会取得第二个字符串中的第一个元素,只要这个元素 != ‘Y’,依旧会直接输出结果。这时可以用while循环改进。

 

改进

//最终成形代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int ret = 0;
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);
	//在输入缓冲区一直取元素,直到输入缓冲区清空
	while(ch = getchar() !='\n');
	{
		;
	}
	printf("请确认:>Y/N");
	ret = getchar();
	if (ret == 'Y')
		printf("确认成功\n");
	else
		printf("放弃确认\n");
	return 0;
}

分支与循环语句(while,for,do while)_do while_10

至此,代码功能完备。

 

二、for循环

 

语法:

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

注:

表达式1 表达式1为初始化部分,用于初始化循环变量的。 表达式2  表达式2为条件判断部分,用于判断循环时候终止。 表达式3 表达式3为调整部分,用于循环条件的调整。

 

for循环的执行流程图:

分支与循环语句(while,for,do while)_do while_11

 

 

(1)for循环举例

//while循环的实例:打印0到10
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0;//初始化部分 
	//判断部分
	while (i < 10)//括号内写条件,条件成立执行下一步(进入循环),
	{
		i++;// 调整部分
		printf("%d\n", i );
	}
	return 0;
}

 

在while语句中,变量初始化部分,判断部分,调整部分是分开的,当代码相当长时,不易于更改变量。

于是我们引入一个新循环——for循环。for循环中变量初始化部分,判断部分,调整部分链接在一起,更改方便。

//利用for循环打印1到10
int main()
{
	int i = 0;//定义变量
	//初始化部分  判断部分 调整部分 
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

分支与循环语句(while,for,do while)_while_12

 

(2)for循环中的break与continue

for

分支与循环语句(while,for,do while)_for_13

break在for循环中的作用与在while语句一样,均为跳出循环

 

continue

分支与循环语句(while,for,do while)_for_14

可以看到程序能够运行,不会陷入死循环,这与while语句中的contiune效果不同。

间接说明for循环相对while存在优势。

 

 

for语句的循环控制变量一些建议:

1.不可在for循环体内修改循环变量,防止 for 循环失去控制。

2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法

如:

int i = 0;
//前闭后开的写法for(i=0; i<10; i++)
{}

//两边都是闭区间for(i=0; i<=9; i++)
{}

 


问:

1.打印几个呵呵?100个

int main()
{
	int a = 0;
	int b = 0;

	for (a = 0; a < 10; a++)
	{
		for (b = 0; b < 10; b++)
		{
			printf("呵呵\n");
		}
	}

	return 0;
}

 

2.打印几个呵呵?10个

int main()
{
	int a = 0;
	int b = 0;

	for (; a < 10; a++)
	{
		for (; b < 10; b++)
		{
			printf("呵呵\n");
		}
	}

 

3.打印几个呵呵?2个

int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}

 

4.循环几次?  0次

int main()
{
int i = 0;
int k = 0;
  for(i =0,k=0; k=0; i++,k++)  // =是判断,代码就没有开始循环,条件为0->假
  k++;
return 0;
}

 


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

 

执行流程

分支与循环语句(while,for,do while)_C语言_15

 

(1)do…while循环举例

//do...while打印1到10
int main()
{
	int i = 0;
	do//先执行一次循环
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);//注意分号
			return 0;
}

分支与循环语句(while,for,do while)_while_16

 

(二)do while循环中的breakcontinue

break

分支与循环语句(while,for,do while)_while_17

 

continue

分支与循环语句(while,for,do while)_while_18