第一种:用while语句实现循环
while语句可简单地记为: 只要当循环条件表达式为真(即给定的条件成立),就执行循环体语句。
注意:while循环的特点是先判断条件表达式,后执行循环体语句。
#include<stdio.h>
int main()
{
int i=1,sum=0; //定义变量i的初值为1,sum的初值为0
while(i<=100) //当i>100,条件表达式i<=100的值为假,不执行循环体
{ //循环体开始
sum=sum+i; //第1次累加后,sum的值为1
i++; //加完后,i的值加1,为下次累加做准备
} //循环体结束
printf("sum=%d\n",sum); //输出1+2+3…+100的累加和
return 0;
}
第二种:用do⋯while语句实现循环
注意:do…while语句的特点是,先无条件地执行循环体,然后判断循环条件是否成立。
#include <stdio.h>
int main()
{
int i=1,sum=0;
do
{
sum=sum+i;
i++;
}while(i<=100);
printf("sum=%d\n",sum);
return 0;
}
在一般情况下,用while语句和用do…while语句处理同一问题时,若二者的循环体部分是一样的,那么结果也一样。
但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。
针对上面while表达式一开始为假的例子说明
while语句
#include <stdio.h>
int main()
{
int i,sum=0;
printf("please enter i,i=?");
scanf("%d",&i);
while(i<=10)
{
sum=sum+i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
这里的结果sum=0,是因为一开始输入的i=11不满足i<=10的条件,所以不进入循环体,sum的最终值为初始值0。
do…while语句
#include <stdio.h>
int main()
{
int i,sum=0;
printf("please enter i,i=?");
scanf("%d",&i);
do
{
sum=sum+i;
i++;
}while(i<=10);
printf("sum=%d\n",sum);
return 0;
}
这里的结果sum=11,是因为do…while语句的特点是先执行再判断,输入i=11,先进循环体执行sum=sum+i ; i++ ;最后判断i<=10,此时i不满足条件,输出sum=11。
第三种:用for语句实现循环
for(表达式1;表达式2;表达式3)
语句
表达式1: 设置初始条件,只执行一次。可以为零个、一个或多个变量设置初值。
表达式2: 是循环条件表达式,用来判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环。
表达式3: 作为循环的调整,例如使循环变量增值,它是在执行完循环体后才进行的。
意思就是一个for循环体,先从表达式1开始赋初值(这个表达式1只执行一次,后续循环不再重新赋初值),然后到表达式2(判断当前条件是否满足for循环的条件,满足就进入下面的循环体,反正直接跳过),上述满足条件进入循环体执行完语句后到表达式3,执行完表达式3后返回表达式2再判断当前条件是否满足,以此循环,直到表达式3返回的值不满足表达式2退出循环。
改变循环执行的状态
第一种:用break语句提前终止循环
作用:使流程跳到循环体之外,接着执行循环体下面的语句。
例子:在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。
#include <stdio.h>
#define SUM 100000 //指定符号常量SUM代表10万
int main()
{
float amount,aver,total;
int i;
for (i=1,total=0;i<=1000;i++)
{
printf("please enter amount:");
scanf("%f",&amount);
total=total+amount;
if(total>=SUM) break;
}
aver=total/i;
printf("num=%d\naver=%10.2f\n",i,aver);
return 0;
}
for语句指定执行循环体1000次。每次循环中,输入一个捐款人的捐款数,并累加到total中。设置了if语句,在每一次累加捐款数amount后,立即检查累加和total是否达到或超过SUM(即100 000),若超过就执行break语句,流程跳转到循环体的花括号外,提前结束循环。
第二种:用continue语句提前结束本次循环
作用:结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前,接着执行for语句中的“表达式3”,然后进行下一次是否执行循环的判定
例子:输出100~200之间的不能被3整除的数。
#include <stdio.h>
int main()
{ int n;
for (n=100;n<=200;n++)
{ if (n%3==0)
continue;
printf("%d ",n);
}
printf("\n");
return 0;
}
当n能被3整除时,执行continue语句,流程跳转到表示循环体结束的右花括号的前面(注意不是右花括号的后面),从而跳过printf函数语句,结束本次循环,然后进行循环变量的增值(n++),只要n<=200,就会接着执行下一次循环。
break语句和continue语句的区别
continue语句只结束本次循环,而非终止整个循环。break语句结束整个循环,不再判断执行循环的条件是否成立。
#include <stdio.h>
int main()
{
int i,j,n=0;
for(i=1;i<=4;i++)
for(j=1;j<=5;j++,n++) //n用来累计输出数据的个数
{ if(n%5==0) printf("\n"); //控制在输出5个数据后换行
printf("%d\t",i*j);
}
printf("\n");
return 0;
}
正常输出
break语句
#include <stdio.h>
int main()
{
int i,j,n=0;
for(i=1;i<=4;i++)
for(j=1;j<=5;j++,n++) //n用来累计输出数据的个数
{ if(n%5==0) printf("\n"); //控制在输出5个数据后换行
if (i==3 && j==1) break;
printf("%d\t",i*j);
}
printf("\n");
return 0;
}
当i==3时直接终止此次循环for(j=1;j<=5;j++,n++),返回上面的循环for(i=1;i<=4;i++),所以第三行的没有输出,程序来到第四行输出。
continue语句
#include <stdio.h>
int main()
{
int i,j,n=0;
for(i=1;i<=4;i++)
for(j=1;j<=5;j++,n++) //n用来累计输出数据的个数
{ if(n%5==0) printf("\n"); //控制在输出5个数据后换行
if (i==3 && j==1) continue;
printf("%d\t",i*j);
}
printf("\n");
return 0;
}
当i==3时跳出此次循环for(j=1;j<=5;j++,n++)的表达式1(j=1)时的循环,返回到循环for(j=1;j<=5;j++,n++)表达式3(j++,n++),然后再到表达式2判断(j<=5)继续循环,所以第三行的第一个数没有输出,程序来到第二个数输出,最终输出为4个数。