在日常生活中经常会遇到需要重复处理的问题,这就需要用到循环控制结构,通过循环来重复一件事。
C语言中有三大循环:while循环、do while循环、for循环。
语法:
while(条件判断){
……………………;
……………………;
……………………;
}
大括号内的叫做循环体,是代码重复的事件,while后面接的是条件语句用来判断是否进入循环体,用自然语言表示为当条件语句为真时重复循环体,不成立时跳出循环。这个条件判断语句和if的条件判断是一样的。
一个完整的循环要有入口和出口,入口就是条件判断语句成立的时候,出口是条件语句不成立的时候,如果只有入口没有出口就会变成死循环。比如:
int a = 1;
while(1){
a++;
}
这就只有入口没有出口,while后面的1始终成立a++这句话就会一直运行。
解决办法是条件语句里的变量在循环体内要有变化,要么增大要么减小。
给个例子,求1-100的和。
#include
int main()
{
int i = 1;//定义i的初始值
int sum = 0;//定义sum的初值
while(i<=100){//控制循环的出口,当i大于100时跳出循环
sum += i;//求和
i++;//每次循环使i加1,从而可以跳出循环,并且为下次循环做准备
}
printf("sum = %d",sum);
}
最后结果输出sum = 5050。
注意点:
1、当循环体大于一条语句时必须有大括号,否则循环只会执行到while后面第一个分号处。
2、对于i与sum必须要有初值,否则他们的值是不可预知的,不一定都是0。
3、必须要有i++,否则循环永远不会结束。
语法:
do{
//循环体;
}while(条件判断);
do while语句和while语句的道理其实是差不多的,都要有入口和出口,都要有变量的变化。但是do while要注意在写完while后要加分号,而while语句是不需要分号的。
do while在执行的时候先执行循环体再判断while后面的条件,而while语句是先判断条件再执行循环体。如果条件判断语句一开始为真并且循环体一样的话,两种循环的执行结果则一样,如果条件判断语句一开始为假,则两种循环的结果就不一样。
比如:
while循环
#include
int main()
{
int i,sum = 0;
scanf("%d",i);
while(i<=100){
sum+=i;
i++;
}
printf("%d",sum);
}
do while循环
#include
int main()
{
int i,sum = 0;
scanf("%d",i);
do{
sum+=i;
i++;
}while(i<=100);
printf("%d",sum);
}
对于这两段代码,如果都输入1,在一开始两个判断语句都为真,则输出结果都为5050,如果输入101,一开始的判断语句都为假,那么while语句的输出结果为0,do while的输出结果为101,因为while语句先判断101<=100为假则不会进入循环,直接输出sum为0的值,而do while先执行循环体,然后i变成了102,然后判断102<=100为假,再输出sum为101的值。
语法:
for(循环变量赋初值;循环条件判断;循环变量增值或减少){
//循环体
}
for循环的语法与while循环的语法不一样,for循环循环变量的初值和变化是写在小括号里的,并且之间用分号隔开,必须用分号,如果循环体的语句大于一条要用大括号括起来,否则只会执行到for后面的第一个分号。
用for实现1-100的和
#include
int main()
{
int i,sum = 0;
for(i = 1;i <= 100;i++){
sum += i;
}
printf("%d",sum);
}
这段代码的执行过程是,先给i赋初值,然后判断i是否小于等于100,然后执行循环体,然后再i++,第一次执行完毕,从第二次开始先判断i是否小于等于100,成立的话就执行循环体,然后i++,不成立就跳出循环,这和while循环有点类似,先判断再执行。
for循环里的三个条件并不是必要的,比如如果没有赋初值,for(;i<=100;i++),赋初值可以省略但是分号不可省略,这时候在for循环外面就需要将i的初值赋好。
int i = 1;
for(;i<=100;i++){
}
这和将赋初值放在小括号里是一个道理。
如果没有循环判断或者循环变量的变化,循环将进入死循环。需要在循环体内控制跳出循环的条件。
也可以三个都没有,for( ; ; ){} 这就是标准的死循环。
一个循环体内又包含另一个完整的循环体结构,成为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。但是每嵌套一层循环,程序的时间消耗就会成倍增加,所以在算法的设计是要尽量减少循环的嵌套。
三种循环可以互相嵌套,只要保证每个循环的语法正确,那嵌套后的语法也是正确的。
break语句用来提前跳出循环,当循环执行到某个特定条件时需要提前结束循环,就需要用if语句加break来实现。
例:在1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时的捐款人数,以及平均每人捐款数目。
#include
int main()
{
float amount,aver,total = 0;
int i;
for(i = 1;i<=1000;i++{
printf("please enter amount:");
scanf("%d",&amount);
total += amount;
if(total >= 100000) break;
}
aver = total/i;
printf("num=%d\naver=%.2f\n",i,aver);
return 0;
}
这里的break的作用就是当total大于等于10万时跳出循环。要注意的是这个if语句后面只有一个break语句,所以if的条件只对break有效。
continue用来提前提前结束本次循环,接着执行下一次循环。用了continue后,本次循环中continue下面的语句不再执行,直接进入下一次循环。
例:输出100-200不能被三整除的数。
#include
int main()
{
int i = 100;
for(i = 100;i<=200;i++){
if(i%3 == 0) continue;
printf("%d\t",i);
}
return 0;
}
这里当i能被3整除时直接执行下一个循环,不会输出i。
求100-200内的全部素数。
#include
int main()
{
int i;
for(i = 100;i<=200;i++){
int j;
for(j = 2;j<=i;j++){
if(i%j == 0) break;
}
if(j == i) printf("%d\t",i);
}
return 0;
}
这个问题用了一个嵌套循环,外循环控制从100-200的数,内循环用来判断这个数是否为素数。内循环从2开始如果i%j为0表名j是i的一个因数,此时i便不是素数,一旦找到一个因数则不再继续执行循环直接跳出,如果内循环一直运行到最后才结束,说明这是个素数,那么判断j是否等于i如果等于就输出。