第六章 循环程序设计
本次课的主要内容,
1,while 语句
2,do—while 语句
3,for 语句
4,break 语句与 continue 语句
5、程序举例




二,循环结构
当型循环结构 直到循环结构
表达式
成立
循环体
(一组语句)
不成立
表达式
成立
循环体
(一组语句)
不成立
?while语句
?语法格式,while(表达式 )
循环体语句
?执行流程,
表达式
循环体
假 (0)
真 (非 0)
while
表达式要扩上,括号后
没符号
循环体一般是一个语句
,多个语句时要用 复合
语句
例 用 while循环求
分析,这是一个从 1累加到 100的求和问题,即 1+2+3+…..+100
如果用顺序结构求的话,通常会想到如下语句,
s=0;
s=s+1;
s=s+2;
s=s+3;
……,
s=s+100;
s=0 ; i=1;
s=s+i;
i++ ;
S=0 ; i=1;
i<=100
s=s+i;
i++;
= 0
= 1
ain()
{ int i,s=0;
i=1;
while(i<=100)
{ s =s +i;
i++;
}
printf(“sum=%d\n",s );
}
自己写一个求 100!的程序,
即 t=1*2*3*…*100
例 统计键盘输入字符的个数,以 Ctrl+z 为结束标志
#include <stdio.h>
main()
{ int n=0;
while(getchar()!=EOF)
n++;
printf(,n=%d\n“,n);
}
n=0;
char !=EOF
n++
=1
=0
?do~while语句
?语法格式,
do
循环体语句
while(表达式 ) ; ?执行流程,
do
循环体
表达式
假 (0)
真 (非 0) while
循环体用花括号扩上
注意分号
例 用 do~while循环求
/*ch6_5.c*/
#include <stdio.h>
main()
{ int i,sum=0;
i=1;
do
{ sum+=i;
i++;
}while(i<=100);
printf(“sum=%d",sum);
}
i=1 ; sum=0 ;
sum=sum+i
i<=100
假 (0)
真 (非 0)
i=i+1
自己写一个求 100!的程序,
即 t=1*2*3*…*100
例 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(“sum=%d",sum);
}
#include <stdio.h>
main()
{ int i,sum=0;
scanf("%d",&i);
while(i<=10)
{ sum+=i;
i++;
}
printf(“sum=%d",sum);
}
运行情况,
1
sum=55
11
sum=0
运行情况,
1
sum=55
11
sum=11
?for语句
?语法格式,
for([表达式 1] ;[表达式 2] ;[表达式 3]) 循环体语句
?执行流程,
表达式 2
循环体
假 (0)
真 (非 0)
for
表达式 1
表达式 3
循环体一般是一个
语句,多个的话用
复合语句
例 用 for循环求
#include <stdio.h>
main()
{
int i,sum=0;
for(i=1; i<=100 ; i++)
sum+=i;
printf("%d",sum);
}
i=1; /* 表达式 1*/
while(i<=100) /*表达式 2*/
{
sum+=i;
i++ ; /*表达式 3*/
}
for语句最简单的语法格式可以写为,
for(循环变量赋初值;循环条件;循环变量增值 )
循环体语句
自己写一个求 100!的程序,
即 t=1*2*3*…*100
例,#include<stdio.h>
main( )
{ int i;
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);
}
LT6
LT7
?循环的嵌套
?三种循环可互相嵌套,层数不限
?外层循环可包含两个以上内循环,但不能相互交叉
?嵌套循环的执行流程
(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 /*ch6_5.c*/
#include <stdio.h>
main()
{ int i,j;
for(j=1;j<10;j++)
printf("%4d",j);
printf("\n---------------------------------------\n");
for(i=1;i<10;i++)
for(j=1;j<10;j++)
printf((j==9)?"%4d\n":"%4d",i*j);
} LT8
辅助控制语句
?break语句
?功能:在循环语句和 switch语句中,终止并
跳出循环体或开关体
?说明,
?break只能 终止并跳出 最近一层 的结构
expr
……
break;
……
假 (0)
真 (非 0)
while do
……
break;
…..,
expr
假 (0)
真 (非 0) while
break 语句使用示意图
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;
}
} LT9
?continue语句
?功能:结束本次循环,跳过 循环体中 尚未执行的
语句,进行下一次是否执行循环体的判断
?仅用于循环语句中
expr
……
continue;
……
假 (0)
真 (非 0)
while
真 (非 0)
do
……
continue;
…..,
expr
假 (0)
while
expr2
……
continue;
…..,
假 (0)
真 (非 0)
for
expr1
expr3
例 求输入的十个整数中正数的个数及其平均值
/*ch6_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; /*注意与 break语句比较 */
num++;
sum+=a;
}
printf("%d plus integer's sum,%6.0f\n",num,sum);
printf("Mean value:%6.2f\n",sum/num);
} LT10
?程序举例
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,..,
/*ch6_13.c*/
#include <math.h>
main()
{ int s;
float n,t,pi;
t=1;pi=0;n=1.0;s=1;
while(fabs(t)>1e-6)
{ pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f\n",pi);
} LT11
例 求 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
/*ch6_14.c*/
#include <math.h>
main()
{ long int f1,f2;
int i;
f1=1;f2=1;
for (i=1;i<20;i++)
{printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n");
f1=f1+f2;
f2=f2+f1;
}
}
i=1
1 1
f1=1+1=2;
f2=1+2=3;
i=2
1 1 2 3
f1=2+3=5;
f2=3+5=8;
i=3
1 1 2 3
5 8
…… LT12
作业,阅读教材 第 6章 循环控制
p120 6.2 6.4 6.5
周四实验做:实验七 (不写实验报告)
下周二实验做,实验九、实验十
实验项目:循环结构
(写实验报告)
例 判断 m是否素数
读入 m
k=?m
i=2
当 i?k
m被 i整除 真 假
用 break
结束循环 i=i+1
i?k+1 真 假
输出,m”是素数, 输出,m”不 是素数,
#include <math.h>
main()
{ int m,i,k;
scanf(“%d”,&m);
k=sqrt(m);
for(i=2;I<=k ; i++)
if(m%i==0) break;
if (i>k) printf(“%d is a prime number\n”,m);
else printf(“%d is not a prime number\n”,m);
}
例 译密码
例如 Hello,world!
译成密码,Lipps,asvph!