-
while
-
for
-
do while
一、while语句
我们已经掌握了,if语句:
if(条件)
语句;
while语句,可以实现循环
//while 语法结构
while(表达式)
循环语句;
while语句执行的流程:
(1)while语句结构
while循环的实例:打印0到10
(2)while语句中的break与continue
*break用法
、
总结: break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:
while中的break是用于永久终止循环的。
*continue用法
总结: 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;
}
运行结果:
*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;
}
我们要思考,为什么我们输入密码后,直接就输出了???
打开监视窗口,可以看到程序运行到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;
}
此时一个字符串的便能成功设置。但多个字符串能不能成功输出呢?
联系上面分析,我们可以知道,多个字符串仍会失效。
因为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;
}
至此,代码功能完备。
二、for循环
语法:
for(表达式1;表达式2;表达式3)
循环语句;
注:
表达式1 表达式1为初始化部分,用于初始化循环变量的。 表达式2 表达式2为条件判断部分,用于判断循环时候终止。 表达式3 表达式3为调整部分,用于循环条件的调整。
for循环的执行流程图:
(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;
}
(2)for循环中的break与continue
for
break在for循环中的作用与在while语句一样,均为跳出循环
continue
可以看到程序能够运行,不会陷入死循环,这与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(表达式);
执行流程
(1)do…while循环举例
//do...while打印1到10
int main()
{
int i = 0;
do//先执行一次循环
{
printf("%d ", i);
i++;
} while (i <= 10);//注意分号
return 0;
}
(二)do while循环中的break和continue
break
continue