第五章 循环型程序设计
?概述
C语言可实现循环的语句:
?用 goto 和 if 构成循环
?while 语句
?do ~ while 语句
?for 语句
?goto语句及用 goto构成循环
?goto语句一般格式:
goto 语句标号 ;
….…..
标号:语句 ;
?功能:无条件转移语句
?说明:
?不能用整数作标号
?只能出现在 goto所在函数内,且唯一
?只能加在可执行语句前面
?限制使用 goto语句
例 用 if 和 goto语句构成循环,求
/*ch5_1.c*/
#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
循环初值
循环终值循环变量增值
循环条件
循环体
例 从键盘输入一组数据,以 0结束输入,求数据和
/*ch5_11.c*/
#include <stdio.h>
main()
{ int number,sum=0;
read_loop,scanf("%d",&number);
if(!number) goto print_sum;
sum+=number;
goto read_loop;
print_sum,printf("The total sum is %d\n",sum);
}
?while语句
?一般形式,
while(表达式 )
循环体语句;
?执行流程,
expr
循环体
假 (0)
真 (非 0)
while
?特点:先判断表达式,后执行循环体
?说明:
?循环体有可能一次也不执行
?循环体可为任意类型语句
?下列情况,退出 while循环
?条件表达式不成立(为零)
?循环体内遇 break,return,goto
?无限循环, while(1)
循环体 ;
例 用 while循环求
/*ch5_2.c*/
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
while(i<=100)
{ sum=sum+i;
i++;
}
printf("%d",sum);
}
循环初值
循环终值循环变量增值
循环条件
循环体
例 显示 1~10的平方
/*ch5_21.c*/
#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
?do~while语句
?一般形式,do
循环体语句;
while(表达式 );
?执行流程,
do
循环体
expr
假 (0)
真 (非 0) while
?特点:先执行循环体,后判断表达式
?说明:
?至少执行一次循环体
?do~while可转化成 while结构
expr
循环体
假 (0)
真 (非 0)
循环体
While循环
例 用 do~while循环求
/*ch5_3.c*/
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
do
{ sum+=i;
i++;
}while(i<=100);
printf("%d",sum);
}
例 while和 do~while比较
/*ch5_4.c*/
#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);
}
?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++);
}
main()
{ int i,j,k;
for(i=0,j=100;i<=j;i++,j--)
{ k=i+j;
printf("%d+%d=%d\n",i,j,k);
}
}
#include<stdio.h>
main()
{ char c;
for(;(c=getchar())!='\n';)
printf("%c ",c);
}
#include <stdio.h>
main()
{ int i,c;
for(i=0;(c=getchar())!='\n';i+=3)
printf("%c ",i+c);
}
例 ( f0r)梯形法求数值积分
0
y
xa a+h a+ih a+(i+1)h b
f(x)
?循环的嵌套
?三种循环可互相嵌套,层数不限
?外层循环可包含两个以上内循环,但不能相互交叉
?嵌套循环的执行流程
(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/*ch5_5.c*/
#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
例 求输入的十个整数中正数的个数及其平均值
/*ch5_12.c*/
#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!
?概述
C语言可实现循环的语句:
?用 goto 和 if 构成循环
?while 语句
?do ~ while 语句
?for 语句
?goto语句及用 goto构成循环
?goto语句一般格式:
goto 语句标号 ;
….…..
标号:语句 ;
?功能:无条件转移语句
?说明:
?不能用整数作标号
?只能出现在 goto所在函数内,且唯一
?只能加在可执行语句前面
?限制使用 goto语句
例 用 if 和 goto语句构成循环,求
/*ch5_1.c*/
#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
循环初值
循环终值循环变量增值
循环条件
循环体
例 从键盘输入一组数据,以 0结束输入,求数据和
/*ch5_11.c*/
#include <stdio.h>
main()
{ int number,sum=0;
read_loop,scanf("%d",&number);
if(!number) goto print_sum;
sum+=number;
goto read_loop;
print_sum,printf("The total sum is %d\n",sum);
}
?while语句
?一般形式,
while(表达式 )
循环体语句;
?执行流程,
expr
循环体
假 (0)
真 (非 0)
while
?特点:先判断表达式,后执行循环体
?说明:
?循环体有可能一次也不执行
?循环体可为任意类型语句
?下列情况,退出 while循环
?条件表达式不成立(为零)
?循环体内遇 break,return,goto
?无限循环, while(1)
循环体 ;
例 用 while循环求
/*ch5_2.c*/
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
while(i<=100)
{ sum=sum+i;
i++;
}
printf("%d",sum);
}
循环初值
循环终值循环变量增值
循环条件
循环体
例 显示 1~10的平方
/*ch5_21.c*/
#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
?do~while语句
?一般形式,do
循环体语句;
while(表达式 );
?执行流程,
do
循环体
expr
假 (0)
真 (非 0) while
?特点:先执行循环体,后判断表达式
?说明:
?至少执行一次循环体
?do~while可转化成 while结构
expr
循环体
假 (0)
真 (非 0)
循环体
While循环
例 用 do~while循环求
/*ch5_3.c*/
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
do
{ sum+=i;
i++;
}while(i<=100);
printf("%d",sum);
}
例 while和 do~while比较
/*ch5_4.c*/
#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);
}
?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++);
}
main()
{ int i,j,k;
for(i=0,j=100;i<=j;i++,j--)
{ k=i+j;
printf("%d+%d=%d\n",i,j,k);
}
}
#include<stdio.h>
main()
{ char c;
for(;(c=getchar())!='\n';)
printf("%c ",c);
}
#include <stdio.h>
main()
{ int i,c;
for(i=0;(c=getchar())!='\n';i+=3)
printf("%c ",i+c);
}
例 ( f0r)梯形法求数值积分
0
y
xa a+h a+ih a+(i+1)h b
f(x)
?循环的嵌套
?三种循环可互相嵌套,层数不限
?外层循环可包含两个以上内循环,但不能相互交叉
?嵌套循环的执行流程
(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/*ch5_5.c*/
#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
例 求输入的十个整数中正数的个数及其平均值
/*ch5_12.c*/
#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!