资源描述
第八讲 WHILE、DO WHILE FOR语句
1、 WHILE语句
while循环控制
语句一般格式
while (表达式) 语句
表达式:
l 一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式
l 用来控制循环体是否执行
语句:
l 称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句
l 是循环重复执行的部分
功能:
计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句
【例】编写程序,求100个自然数的和
即: s=1+2+3+ … +100
思路:寻找加数与求和的规律
加数i——从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。
求和——设变量 sum 存放和,循环求sum=sum+i,直至i超过100。
程序:
main( )
{ int i,sum;
i=1; sum=0;
while (i<=100)
{ sum=sum+i;
i++;
}
printf("sum=%d\n",sum);
}
注意:
l 如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=101) 。
l 在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。
l 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。
思考程序段的输出?
while (i<=100)
{ i++;
sum=sum+i; }
l 为了保证循环正常运行,应该特别注意:
– 循环控制条件的描述
– 控制条件的初始状态(初始值)
– 循环体内部对控制条件的影响
2、do-while语句
l 语句一般格式
do 语句
while (表达式);
l 功能:
– 先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。
【例】用do-while语句 求100个自然数的和
说明:
l while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构
l 区别:
l do- while 语句先执行循环体再判断条件,循环体至少执行一次;
l while 语句先判断条件再执行循环体,循环体有可能一次也不执行
l do—while循环体中一定要有能使表达式值趋于0的操作(如i++),否则会出现死循环。
do-while语句的简单应用
【例】用辗转相除法求m和n的最大公约数
程序:
main( )
{ int m,n,r;
scanf("%d, %d",&m,&n);
if (m<n)
{ r=m; m=n; n=r; }
do
{ r=m%n;
m=n;
n=r;
}while(r!=0);
printf("%d\n",m);
}
3、for语句
l 语句一般格式
for (表达式1;表达式2;表达式3)
语句
l 功能:
– 计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。
3.1省略for语句的表达式:
⑴ 表达式1、2、3全省略,即:
for ( ; ; )
就等同于:while (1),会无限循环(死循环)
⑵ 省略表达式1和表达式3,即:
for(;表达式2;)
就等同于:while( 表达式2 )
⑶ 省略表达式2,即:
for(表达式1; ;表达式3)
就等同于:表达式1; while(1){…表达式3;}
注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行
例如:
⑴ i=1;
for ( ; i<=100; i++) sum+=i;
⑵ for (i=1; ; i++)
{ … if(i>100)…
…}
⑶ for (i=1; i<=100; )
{…i++; … }
⑷ i=1;
for ( ; ; )
{ … if(i>100) …
i++; … }
3.2说明:
所有用 while 语句实现的循环都可以用for 语句实现。
for(表达式1;表达式2 ;表达式3)
语句;
等价于:
表达式1;
while (表达式2)
{ 语句;
表达式3;
}
3.3for语句的简单应用:
【例】求n! ,即计算p=1×2×3×…×n的值。
思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。
设置:
· 乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入)
· 累乘器 p ,每次循环令p = p*i
程序:
main( )
{ int i, n; long p;
p=1;
printf("Enter n:");
scanf("%d",&n);
for (i=1; i<=n; i++)
p = p * i;
printf("p = %ld \n",p);
}
思考:
· 如何输出1!, 2!, … , n! ?
· 如何求s =1!+ 2!+ … + n! ?
3.4熟悉几个循环语句
l while (!x) x++;
当 x=0 时,执行循环体x++;
l while ((c=getchar( )) != '\n') n=n+1;
n 称为计数器,作用是统计输入字符的个数
l while (num++<=2) ; printf("%d\n",num);
循环体是空语句,退出循环后输出num的值
l do x*=-3; while(x>5);
先执行循环体x*=-3,再判断条件(x>5)
l for (n=0; n<26; n++) printf("%c ", n+'A');
作用是输出26个大写字母
l for (sum=0, i=1; i<=100; sum=sum+i, i+=2) ;
作用是计算100以内的奇数和
4、几种循环语句的比较
l while和do-while语句的表达式只有一个,for语句有三个。
l while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。
while语句多用于循环次数不定的情况
do-while语句多用于至少要运行一次的情况
for语句多用于要赋初值或循环次数固定的情况
5、循环的嵌套
l 如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套
l 例如:
#include <stdio.h>
main( )
{ int i, j;
for ( i=1; i<10; i++ )
for ( j=1; j<=i; j++ )
printf ((j==i)?"%4d\n":"%4d",i*j);
}
注意:
l while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。
l 多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。
l 例如:
for(a=1;a<=10;a++)
{ for (b=0;b<=5;b++)
…… }
外循环执行了10次,内循环执行6次
循环正常结束时,内循环执行了10×6=60次
展开阅读全文