第 5章 循环结构程序设计
1、掌握 while,do-while和 for循环结构的运用;
2、掌握 break和 continue程序控制语句的使用;
3、用 goto语句和 if语句构成循环。
概述
C语言可实现循环的语句:
– 用 goto 和 if 构成循环
– while 语句
– do ~ while 语句
– for 语句
goto语句及用 goto构成循环
goto语句一般格式:
goto 语句标号 ;
….…..
标号:语句 ;
功能:无条件转移语句
说明:
不能用整数作标号
只能出现在 goto所在函数内,且唯一
只能加在可执行语句前面
限制使用 goto语句例 用 if 和 goto语句构成循环,求
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
loop,if(i<=100)
{ sum+=i;
i++;
goto loop;
}
printf("%d",sum);
}
sum=0+1
sum==1+2=3
sum=3+3=6
sum=6+4
……
sum=4950+100=5050
循环初值循环终值循环变量增值循环条件循环体
while语句
一般形式
,while(表达式 )
循环体语句;
执行流程

表达式循环体假 (0)
真 (非 0)
while
特点:先判断表达式,后执行循环体
说明:
循环体有可能一次也不执行
循环体可为任意类型语句
下列情况,退出 while循环
条件表达式不成立(为零)
循环体内遇 break,return,goto
无限循环,while(1)
循环体 ;
例 用 while循环求
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
while(i<=100)
{ sum=sum+i;
i++;
}
printf("%d",sum);
}
循环初值循环终值循环变量增值循环条件循环体请大家思考:
编程序求出,1-2+3-4+5-6………… +99-100的值
do~while语句
一般形式,do
循环体语句;
while(表达式 );
执行流程

do
循环体
expr
假 (0)
真 (非 0) while
特点:先执行循环体,后判断表达式
说明:
至少执行一次循环体
do~while可转化成 while结构
expr
循环体假 (0)
真 (非 0)
循环体
While循环例 用 do~while循环求
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
do
{ sum+=i;
i++;
}while(i<=100);
printf("%d",sum);
}
例 while和 do~while比较
#include <stdio.h>
main()
{ int i,sum=0;
scanf("%d",&i);
do
{ sum+=i;
i++;
}while(i<=10);
printf("%d",sum);
}
main()
{ int i,sum=0;
scanf("%d",&i);
while(i<=10)
{ sum+=i;
i++;
}
printf("%d",sum);
}
分析下面程序的运行结果:
#include <stdio.h>
main()
{ int i=1;
while(i<=10)
{ printf("%d*%d=%d\n",i,i,i*i);
i++;
}
}
运行结果:
1*1=1
2*2=4
3*3=9
4*4=16
5*5=25
6*6=36
7*7=49
8*8=64
9*9=81
10*10=100
for语句
一般形式
,for([expr1] ;[ expr2] ;[ expr3])
循环体语句;
执行流程

expr2
循环体假 (0)
真 (非 0)
for
expr1
expr3
for语句一般应用形式,
for(循环变量赋初值;循环条件;循环变量增值 )
{
循环体语句;
}
说明:
for语句中 expr1,expr2,expr3 类型任意,都可省略,但分号;不可省
无限循环,for(;;)
for语句可以转换成 while结构
expr1;
while(expr2)
{
循环体语句;
expr3;
}
例 用 for循环求
#include <stdio.h>
main()
{ int i,sum=0;
for(i=1;i<=100;i++)
sum+=i;
printf("%d",sum);
}
例,#include<stdio.h>
main( )
{ int i=0;
for(i=0;i<10;i++)
putchar(‘a’+i);
}
运行结果,abcdefghij
例,#include<stdio.h>
main( )
{ int i=0;
for(;i<10;i++)
putchar(‘a’+i);
}
例,#include<stdio.h>
main( )
{ int i=0;
for(;i<10;)
putchar(‘a’+(i++));
}
例,#include<stdio.h>
main( )
{ int i=0;
for(;i<10;putchar(‘a’+i),i++);
}
循环的嵌套
三种循环可互相嵌套,层数不限
外层循环可包含两个以上内循环,但不能相互交叉
嵌套循环的执行流程
(1) while()
{ ……
while()
{ ……
}
…...
}
(2) do
{ ……
do
{ ……
}while( );
…...
}while( );
(3) while()
{ ……
do
{ ……
}while( );
…….
}
(4) for( ; ;)
{ ……
do
{ ……
}while();
……
while()
{ ……
}
…...
}
嵌套循环的跳转禁止:
从外层跳入内层
跳入同层的另一循环
向上跳转例 循环嵌套,输出九九表
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
9 18 27 36 45 54 63 72 81
……………..
i
j#include <stdio.h>
main()
{ int i,j;
for(i=1;i<10;i++)
printf("%4d",i);
printf("\n---------------------------------------\n");
for(i=1;i<10;i++)
for(j=1;j<10;j++)
printf((j==9)?"%4d\n":"%4d",i*j);
}
i<10
printf
假 (0)
真 (非 0)
i=1
j++
j=1
j<10
真 (非 0)
假 (0)
i++
for(i=1;i<10;i++)
for(j=1;j<10;j++)
printf((j==9)?"%4d\n":"%4d",i*j);
外循环内循环辅助控制语句
break语句功能:在循环语句和 switch语句中,终止并跳出循环体或开关体说明:
– break只能 终止并跳出 最近一层 的结构
– break不能用于循环语句和 switch语句之外的任何其它语句之中
expr
……
break;
……
假 (0)
真 (非 0)
while do
……
break;
…...
expr
假 (0)
真 (非 0) while
expr2
……
break;
…...
假 (0)
真 (非 0)
for
expr1
expr3
switch
expr
语句组 1
break;
语句组 2
break;
语句组 n
break;
语句组
break;
…...
const 1 const 2 const n default
case
例 break举例:输出圆面积,面积大于 100时停止
#define PI 3.14159
main()
{
int r;
float area;
for(r=1;r<=10;r++)
{ area=PI*r*r;
if(area>100)
break;
printf("r=%d,area=%.2f\n",r,area);
}
}
例 break举例:小写字母转换成大写字母,直至输入非字母字符
#include <stdio.h>
main()
{
int i,j;
char c;
while(1)
{ c=getchar();
if(c>='a' && c<='z')
putchar(c-'a'+'A');
else
break;
}
}
continue语句
功能:结束本次循环,跳过 循环体中 尚未执行的语句,进行下一次是否执行循环体的判断
仅用于循环语句中
expr
……
continue;
……
假 (0)
真 (非 0)
while
真 (非 0)
do
……
continue;
…...
expr
假 (0)
while
expr2
……
continue;
…...
假 (0)
真 (非 0)
for
expr1
expr3
例 求输入的十个整数中正数的个数及其平均值
#include <stdio.h>
main()
{ int i,num=0,a;
float sum=0;
for(i=0;i<10;i++)
{ scanf("%d",&a);
if(a<=0) continue;
num++;
sum+=a;
}
printf("%d plus integer's sum,%6.0f\n",num,sum);
printf("Mean value:%6.2f\n",sum/num);
}
程序举例
t=1,pi=0,n=1.0,s=1
当 |t|?1e-6
pi=pi+t
n=n+2
s=-s
t=s/n
pi=pi*4
输出 pi
分子,1,-1,1,-1…
分母,1,3,5,7,...
例 求 Fibonacci数列,1,1,2,3,5,8,…… 的前 40个数
f1=1,f2=1
for i=1 to 20
输出 f1,f2
f1=f1+f2
f2=f2+f1
1
5
34
233
1597
10946
75025
514229
3524578
24157817
1
8
55
377
2584
17711
121393
832040
5702887
39088169
2
13
89
610
4181
28657
196418
1346269
9227465
63245986
3
21
144
987
6765
46368
317811
2178309
14930352
102334155
例 判断 m是否素数读入 m
k=?m
i=2
当 i?k
m被 i整除真 假用 break
结束循环
i=i+1
i?k+1真 假输出,m”是素数,输出,m”不 是素数,
例 译密码例如 Hello,world!
译成密码,Lipps,asvph!
#include<stdio.h>
main()
{ char c;
while((c=getchar())!=?\n?)
{ if ((c>=?a?&&c<=?z?)||(c>=?A?&&c<=?Z?))
{ c=c+4;
if(c>?Z?&&c<=?Z?+4||c>?z?) c=c-26;
}
printf(“%c”,c);
}
}