循环的使用:for>while>do......while(具体按实际情况来看)
引言:什么是循环呢?
循环:重复执行一组“相同”或“相似”操作的流程
如:我们每天都要吃饭、睡觉这就是一个循环。
3.1 while循环
在前面我们已经掌握了,if语句:
1. if(表达式) 2. 语句;
当表达式为真时,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更优