目录
3.循环语句
3.1 while-先判断,再执行
3.2 for-与while一样的效果,但形式更优
3.3 do......while-先执行,在判断(至少执行一次)
循环的使用:for>while>do......while(具体按实际情况来看)
引言:什么是循环呢?
循环:重复执行一组“相同”或“相似”操作的流程
如:我们每天都要吃饭、睡觉这就是一个循环。
3.1 while循环
在前面我们已经掌握了,if语句:
if(表达式)
语句;
//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语句的循环控制变量
#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的死循环,
// 前闭后开的写法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;
}