总述
学完第四章后,便马不停蹄的开始第五章循环了,一是为了解决之前好多不懂得问题,可以用这一章的知识解决,二也是问了一下其他学计算机的大一同学,快的已经学指针了,慢的也到数组了,所以我得加快步伐,现在的自学进度还是太慢。
在学习这一章之前呢,我被推荐了一个新的编译工具visual studio 2019,所以以下程序都是在vs 2019上面跑的,之前的vc++ 6.0成为了时代的眼泪,但因为刚接触vs 2019,也要熟悉一段时间新的环境。
话不多说,直接开始跑步进入第五章。
注:本博客所有知识点均出自C程序设计(第五版)
5.1为什么需要循环控制
第四章介绍了选择结构,但是我们在做题时发现,只有选择结构,很多程序都不能实现,所以我们需要学习循环结构。
循环结构和顺序结构,选择结构是结构化程序设计的3种基本结构,他们是各种复杂程序的基本构成单元。
如下便为一个循环结构程序
#include<stdio.h> //编译预处理指令
int main() //定义主函数
{
//函数开始
int i = 1, sum = 0; //定义整型i=1.sum=0
while (i <= 100) //当i小于等于100时循环
{
sum = sum + 1; //sum等于sum的值加1
i++; //i等于i的值加1
}
printf("sum=%d\n", sum); //输出sum=sum的值
return 0; //函数值返回0
} //函数结束
5.2用while语句实现循环
5.1中的循环结构,就是用的最基本的while循环,下面就来介绍一下while循环。
while语句的一般形式如下:
while(表达式)语句
其中“语句”就是循环体,循环体只能是一个语句(简单或复合都行)。
“表达式”被称为循环条件表达式。
while的执行流程:只要当循环条件表达式为真(即给定的条件成立),就执行循环体语句。
注:while循环的特点是先判断条件表达式,后执行循环体语句。
再次看一下这个程序
#include<stdio.h> //编译预处理指令
int main() //定义主函数
{
//函数开始
int i = 1, sum = 0; //定义整型i=1.sum=0
while (i <= 100) //当i小于等于100时循环
{
sum = sum + 1; //sum等于sum的值加1
i++; //i等于i的值加1
}
printf("sum=%d\n", sum); //输出sum=sum的值
return 0; //函数值返回0
} //函数结束
(1)如果循环体包含一个以上的语句,就要用花括号括起来,作为复合语句出现。如果不加花括号,则while语句的范围只到while后面的第一个分号处。
(2)循环之前,要给i和sum赋初值。
(3)在循环体中应有使循环趋向结束的语句。
5.3用do···while语句实现循环
do···while是c语言除了while外提供的另外一种语句来实现循环结构,大致和while差不都,有几小点不一样。
直接看程序比较好理解,如下
#include<stdio.h> //编译预处理指令
int main() //定义主函数
{
//函数开始
int i = 1,sum = 0; //定义整型i,sum并赋值
do //do循环先执行一道
{
sum = sum + 1; //sum等于sum的值加1
i++; //i自加1
}
while (i <= 100); //判断i小于等于100的真假看是否循环
printf("sum=%d\n", sum); //输出sum=sum的值
return 0; //函数值返回0
} //函数结束
注:do···while语句的特点是,先无条件的执行循环体,然后判断循环条件是否成立。(就是这里与while不一样,可以理解一下)
根据程序我们也可以看出do···while的一般形式:
do
语句
while(表达式);
区分while和do···while:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则,二者结果的不相同(指二者具有相同的循环体的情况)。
5.4用for语句实现循环
for语句是比while和do···while更为灵活的语句,可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以替代while语句。
for语句的一般形式:
for(表达式1:表达式2:表达式3)
语句
表达式1:设置初始条件,只执行一次。
表达式2:是循环条件表达式,用来判定是否继续循环。
表达式3:作为循环的调整,例如使循环变量增值,它是在执行完循环体后才进行的。
所以for可以写成如下:
for(循环变量赋初值;循环条件;循环变量增值)
语句
以上我们可以看到,for语句比前面两个更加简单,方便。并且完全可以替代前两个语句。
注:for语句中的三个表达式可省略,但分号不能省略,且省略后要保证循环能正常进行,就得在之前完成这些操作。
如:for(i=1;i<=100;i++)可以改写成
i=1;
for(;i<=100;i++)
很直观,后面两个语句也可以这样省略。但一定要保证循环能正常进行。
5.5循环的嵌套
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层嵌套。(好家伙,套娃)
3种循环(while循环,do···while循环和for循环)可以互相嵌套。
5.6几种循环的比较
(1)3中循环都可以用来处理同一问题,一般情况下他们可以互相代替。
(2)for语句的功能更强,凡用while循环能完成的,用for循环都能实现。
(3)用while和do···while循环时,循环变量初始化的操作应在while和do···while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
(4)while循环,do···while循环和for循环都可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue会在5.7介绍)。
5.7改变循环执行的状态
5.7.1用break语句提前终止循环
break语句可以提前终止循环,如下
#include<stdio.h> //编译预处理指令
#define SUM 100000 //指定符号常量SUM代表100000
int main() //定义主函数
{
//函数开始
float amount, aver, total; //定义单精度浮点数amount,aver,total
int i; //定义整形i
for (i = 1, total = 0; i <= 1000; i++) //for循环语句1:赋值i=1,total=0;语句2:如果i小于等于1000执行循环;语句三:循环结束后i自加1
{
printf("please enter amount:"); //输出please enter amount:
scanf_s("%f", &amount); //输入单精度浮点数赋到amount的地址
total = total + amount; //total等于total+amount的值
if (total >= SUM) //如果total大于SUM
break; //跳出该循环
}
aver = total / i; //aver等于total除以i
printf("num=%d\naver=%10.2f\n", i, aver); //输出num=i的值,aver为十个字节两位小数的aver的值
return 0; //函数值返回0
}