C语言循环控制语句基本用法
循环语句使用的基本思想:
对于事先循环次数已知的称为计数控制的循环,一般使用for循环;对于事先循环次数不知的称为条件控制的循环,一般使用while或者do while循环语句;对于一个循环语句包括另外一个循环语句的称为嵌套循环;
一、while语句
一般形式:
赋初始值;赋初始值;赋初始值;
while(循环控制表达式)
{
循环体语句;
}流程图:
循环控制表达式是在执行循环体语句前判断的:
while语句的执行过程
循环控制表达式是在执行循环体语句前判断的;
如果表达式的值一开始就为0,则语句一次也不会被执行;
a.计算循环控制表达式的值;
b.如果循环控制表达式的值为真,则执行循环体语句,并返回步骤;
c.如果循环控制表达式的值为假,则跳过循环,接着执行后面的语句;
例1、输出1-100之间所有的奇数;
#include <stdio.h>void main(){int i=1;//记得赋初始值;while(i <= 100){if(i%2 != 0)//判断奇偶;(i%2==0)输出偶数;{printf(“%5d”,i);}i++;}} 死循环(例举一种情况) #include <stdio.h>void main(){int i=1;while(i <= 100);//这里加上分号就很有可能变成死循环{if(i%2 != 0){printf(“%5d”,i);}i++;}}
二、do…while语句
一般形式
do
{
循环体语句;
}
while(循环控制表达式);
while();后面有一个分号
流程图
先执行循环体语句,再进行表达式判断;
do…while语句的执行过程:
a.计算循环体语句;
b.计算循环控制表达式的值;
c.如果循环控制表达式的值为真,并返回步骤;
d.如果循环控制表达式的值为假,则跳过循环,接着执行后面的语句;
由于是先执行,后判断表达式的真假,所以循环体中的语句至少被执行一次;
while 与 do…while的区别: (1)#include <stdio.h> (2)#include <stdio.h>void main() void main() { { int i=11; int i=11;while(i<=10) do{ {printf(“i = %d\n”,i); printf(“i = %d\n”,i);i++; i++;} } while(i<=10);} }没有任何输出 输出:i=11
程序(1)是因为先判断后执行,所以当条件一开始就不满足的情况下,循环一次也不执行,所以没有任何输出;
程序(2)是因为先执行后判断,已经执行过了一次再进行的判断,所以循环至少执行了一次,输出 i=11。
例2:1-100之间的数字竞猜游戏(随机数值固定的情况下)
#include <stdio.h>#include <stdlib.h>void main(){int person,machine;//用户猜的数,系统随机数int i = 0; //猜的次数printf(“输入一个1-100之间的数:”);machine = rand()%100+1;do{ scanf(“%d”,&person);if(person>machine){printf(“这个数大了!\n”);}else if(person<machine){printf(“这个数小了!\n”);}else{printf(“你猜对了!\n”);}i++; }while(person!=machine);printf(“您一共猜了%d次\n”,i);}
rand()函数生成的是0–32767之间的整数;使用时需要包括头文件 stdlib.h;
rand()%b ==> [ 0, b-1 ] 之间;
rand()%b+a ==> [ a,a+b-1 ]之间;
三、for语句
一般形式:
for(初始化表达式;循环控制表达式;循环变量增量)
{
循环语句;
}
for语句中的表达式分隔符分号,有且只有两个,不可以省略;
也可以表示为其他形式:
初始化表达式 初始化表达式 for( ;循环控制表达式;循环变量增量) for( ;循环控制表达式; ) { { 循环语句; 循环语句; 循环变量增量; } } 当循环控制表达式省略时,则表示循环条件永真,不做处理的话,可能会导致死循环;
流程图:
for语句的执行过程:
a. 由初始化表达式开始;
b.执行循环控制表达式,若其值为真(非0),则执行循环内语句,然后执行循环变量增量语句;
c.若其值为假(0),则结束循环,执行循环外语句;
例3:(算法一:穷举法) 韩信点兵问题
韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。编程求韩信至少有多少兵?
穷举法:从1开始,直到上述条件成立i,i则为所求的值;
解法一:
#include <stdio.h>void main(){int i;for(i=1; ;i++){if(i%5==1 && i%6==5 && i%7==4 && i%11==10){printf(“%d\n”,i);break;}}}
利用无限循环找出第一个满足条件的值,然后跳出循环;
解法二:(对于循环次数未知的条件控制循环,一般使用while或者do while语句)
#include <stdio.h>void main(){int i = 0;do{i++;}while(!(i%5==1 && i%6==5 && i%7==4 && i%11==10));printf(“%d\n”,i);}
算法二:递推法:下一项的值是在前一项的前提下推算出来的。
求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。
#include <stdio.h>void main(){int i, p=1,q=1;for(i=1;i<=20;i++){printf(“%d %10d\n”,p,q);p=p+q;q=q+p;}}
四、goto语句和if语句构成循环
一般不使用goto语句和if语句构成循环;
**例:**计算1+2+…+100的和
#include <stdio.h>void main(){int i,sum;i=1;sum=0;round: if(i<=100) { sum = sum + i; i++; goto round; }printf(“%d\n”,sum);} 91280357