第 6章 循环结构程序设计第 6章 循环结构程序设计
6.1 while语句
6.2 do-while语句
6.3 for语句
6.4 终止循环语句
6.5 多重循环
6.6 程序设计举例第 6章 循环结构程序设计
6.1 while语句格式,while ( 条件表达式 )
功能,条件表达式描述循环的条件,语句描述要反复执行的操作,称为循环体 。
先计算条件表达式的值,当条件表达式的值为真时,
代表循环的条件成立,执行循环体 。 当条件表达式的值为假时,代表循环的条件不成立,退出循环,执行循环下一条语句 。
while语句是当循环的条件成立时,反复执行的循环。
第 6章 循环结构程序设计说明,
(1) while语句是先判断,后执行 。 如果循环的条件一开始不成立
( 条件表达式为假 ),则循环一次都不执行 。
(2) 循环体中必须有改变循环条件的语句,否则循环不能终止,形成无限循环 。
(3) 循环体为多条语句时,必须采用复合语句 。
(4) 当循环条件为永真条件时,将变成无限循环 。 可以利用 break
语句终止循环的执行 。
(5) 等价的 if 语句加 goto语句形式如下,
标号,if ( 条件表达式 )
{ 循环体 ;
goto 标号 ;
}
第 6章 循环结构程序设计例 6 – 1 求一些正数的和。
/*程序 6 - 1,求一些正数之和 */
main(
{float x; /*存放当前输入的数 */
float sum=0; /*存放和,初值为 0*/
printf( ″%f″,&x) ; /*输入第一个数 */
while ( x>0
{sum+=x; /*累加 */
scanf( ″%f″,&x) ; /*输入下一个数,仍然放入 x中,接下去判断循环的条件是否满足 */
}
printf( ″和 =%6.2f″,sum) ; /*输出所求一些数的和 */
}
输入数据,1.1 2.2 3.3 4.4 0
0作为一些数的结束。
运行结果,和 = 11.00
第 6章 循环结构程序设计例 6 – 2 计算 1+2+3+… +100 。
/*程序 6 - 2,计算 1+2+3+…+100 */
main( )
{int i=1; /*i 存放项,初值为 1*/
int sum=0;
while ( i<=100
{sum+=i; /*当 i<=100,累加 */
i++; /*i的值改变为下一个自然数,改变后接下去判断循环的条件是否满足 */
}
printf( ″1+2+3+…+100=%d″,sum) ; /*输出所求和 */
}
运行结果,1+2+3+…+100=5050
第 6章 循环结构程序设计例 6-3 求一些正数的积。
/*程序 6-3,求一些正数的积 */
main( )
{float x; /*存放当前输入的数 */
float m=1; /*存放积,初始化为 1*/
scanf( ″%f″,&x) ;
while( x>0
{m*=x; /*累乘 */
scanf( ″%f″,&x) ; /*输入下一个数,仍然放 x中 */
}
printf( ″积 =6.2%″,m) ;
}
输入数据,1.2 2 5 0
运行结果,积 = 12.10
第 6章 循环结构程序设计例 6 –4 计算 1*2*3*…*100,实际上求 100!。
/*程序 6-4,计算 1*2*3*…*100*/
main( )
{int i=1;
double m=1;
while ( i<=100)
{m*=i;
i++;
}
printf( ″1*2*3*…*100=%f″,m) ;
}
运行结果,1*2*3*…*100= 9.332 621 544 394 410 22e+157
第 6章 循环结构程序设计
6.2 do-while语句
do-while语句是 while语句的倒装形式 。
格式,do 语句 while ( 条件表达式 )
功能,先执行循环体,再计算条件表达式的值 。 当条件表达式的值为真时,代表循环的条件成立,继续执行循环 。 当条件表达式的值为假,代表循环的条件不成立,退出循环 。
do-while语句是反复执行循环,直到循环的条件不成立。
第 6章 循环结构程序设计说明,
(1) do-while语句是先执行,后判断 。 如果循环的条件一开始就不成立,循环也将执行一次 。
(2) 与 while语句一样,循环体中同样必须有改变循环条件的语句,否则循环不能终止,形成无限循环 。
(3) 循环体为多条语句时必须采用复合语句 。
(4) 当循环条件为永真条件时,将变成无限循环 。 可利用 break语句终止循环的执行 。
(5) 与其它高级语言不同,C语言的直到循环与当循环的条件是同一的,其它高级语言中是互为相反条件 。
第 6章 循环结构程序设计
(6) 等价的 if语句加 goto语句形式如下,
循环体 ;
标号,if
{循环体 ;
goto标号 ;
}
第 6章 循环结构程序设计例 6-5 求一些正数的和。
/*程序 6 - 5,求一些正数的和 */
main( )
{float x;
float sum=0;
do
{scanf( ″%f″,&x) ;
sum+=x;
}while( x>0) ;
sum=sum—x; /*x最后一个值作为一些数的终止条件应从和中去掉 */
printf( ″和 =%6.2″,sum) ;
}
第 6章 循环结构程序设计例 6-6 计算 1+2+3+…+100。
程序如下,
/*程序 6-6,1+2+3+…+100 */
main( )
{int i=1;
int sum=0;
do
{sum+=i;
i++;
} while ( i<=100) ;
printf( ″1+2+3+…+100=%d″,sum) ;
}
第 6章 循环结构程序设计例 6-7
程序如下,
/*程序 6 - 7,求一些正数的积 */
main( )
{float x;
float m=1;
do
{scanf( ″%f″,&x) ;
m*=x;
}while( x>0) ;
m=m/x; /*x最后一个值作为一些数的终止条件应从积中去掉 */
printf( ″积 =6.2%″,m) ;
}
第 6章 循环结构程序设计例 6-8 计算 1*2*3*…*100
程序如下,
/*程序 6 - 8,计算 1*2*3*…*100*/
main( )
{int i=1;
double m=1;
do
{m*=i;
i++;
} while ( i<=100) ;
printf( ″1*2*3*…*100=%f″,m) ;
}
第 6章 循环结构程序设计
6.3 for语句格式,for( 表达式 1; 表达式 2; 表达式 3)
表达式 1为循环的初值表达式,表达式 2为循环的条件表达式,表达式 3为改变循环条件的表达式 。 循环执行的次数隐含于循环中 。
第 6章 循环结构程序设计功能,
(1) 计算表达式 1,循环控制变量得到初值。
(2) 计算表达式 2,如果表达式 2为真,代表循环的条件成立,执行循环。如果表达式 2的值为假,代表循环的条件不成立,也就是终止循环的条件成立,退出循环,执行循环的下一条语句。
(3) 计算表达式 3,改变循环条件,回第 (2)步。
第 6章 循环结构程序设计例如,for( k=10; k<20; k++)
printf( ″k=%d\n″,k) ;
表达式 1为 k=10,表达式 2为 k<20,表达式 3为 k++。
① 计算表达式 1,k得到初值 10
② 计算表达式 2,k<20为真,执行第一次循环,输出,k=10
③ 计算表达式 3,k的值变为 11
④ 计算表达式 2,k<20为真,执行第二次循环,输出,k=11
⑤ 计算表达式 3,k的值变为 12
⑥ 计算表达式 2,k<20为真,执行第三次循环,输出,k=12
⑦ 计算表达式 3,k的值变为 13
……
最后,
① k 的值变为 19,执行第 20次循环,输出,k=19
② 计算表达式 3,k 的值变为 20
③ 计算表达式 2,k<20为假,终止整个循环的执行,退出循环。
第 6章 循环结构程序设计例 6-9 计算 1+2+3+…+100,1*2*3*…*100 。
/*程序 6-9,计算 1+2+3+…+100,1*2*3*…*100*/
main( )
{int i; /*循环控制变量 */
int s;
float m; /*和 s,积 m*/
/*求和 */
s=0;
for( i=1; i<=100; i++
s+=i;
/*求积 */
m=1;
for( i=1; i<=100; i++
m*=i;
/*输出和,积 */
printf( ″1+2+3+…+100=%d\n″,s) ;
printf( ″ 1*2*3*…*100=%f\n″,m) ;
}
第 6章 循环结构程序设计
(1) 循环体为多条语句时,也必须采用复合语句描述 。
(2) 表达式 1可省略,分号不能省 。 此时应在循环外给循环赋初值,执行循环时,将跳过第一步 。 如,
for( ; i<=100; i++) sum+=i;
(3) 如果表达式 2省略 (分号不能省 ),则不判断循环条件,
相当循环条件永真,形成无限循环 。 如,
for( i=1; ; i++) sum+=i
第 6章 循环结构程序设计
(4) 表达式 3也可省略,分号也不能省,此时循环体中应有改变循环条件的语句 。 如,
for( i=1; i<=100; ) {sum+=i; i++; }
(5) 当缺省表达式 1,表达式 2,表达式 3中的一个,两个或全部,或当采用逗号表达式时,可产生 for语句的多种变化形式 。 例如,
① for( ; ; ) 语句 ; /*形成无限循环 */
② for( ; 表达式 2; ) 语句 ; /*相当于 while循环 */
③ for( sum=0,i=1; i<=100; i++) sum+=i; [ZK(]/*累加器清 0嵌入初值表达 /*式 1中 */
④ for( sum=0; i<=100; sum+=i,i++) ; /*将原循环体嵌进表达式 3中 */
第 6章 循环结构程序设计
(6) for语句最简单的应用形式是通过一个循环控制变量来控制循环,类似于其它语言中的 for语句 。
for( 循环控制变量赋初值 ; 循环控制变量 <=终值 ; 循环控制变量增值 )
例如,
① for( i=1; i<=1000; i++)
printf( ″%4d\n″,i) ;
② for( ch=′a′; ch<=′z′; ch++)
printf( ″%4c\n″,ch) ;
第 6章 循环结构程序设计
(7) for语句中三个表达式必须用分号分隔。
(8) for语句同 while语句,也是先判断,后执行 。
(9) 等价的 if语句加 goto语句的形式如下,
表达式 1;
标号,if( 表达式 2)
{循环体 ;
表达式 3;
goto
}
第 6章 循环结构程序设计例 6 – 10 求 100个数的最大值。
/*程序 6-10,求 100个数的最大值 */
main( )
{float x; /*存放当前输入数 */
int i; /*循环控制变量 */
float max; /*最大值 */
printf( ″输入第 1个数,″) ;
scanf( ″%f″,&x) ;
max=x; /*最大值初始化 */
for( i=2; i<=100; i++
{printf( ″输入第 %d个数,″,i) ;
scanf( ″%f″,&x) ;
if ( x>max) max=x; /*将当前数与最大值进行比较 */[ZK)]
}
printf( ″最大值 =%f\n″,max) ;
}
第 6章 循环结构程序设计例 6-11 用 2000个 X填充屏幕。
程序如下,
/*程序 6 - 11,用 2000个 X填充屏幕 */
main( )
{int i;
for ( i=1; i<=2000; i++
printf( ″X″),
}
第 6章 循环结构程序设计例 6-12 判断正整数 n是否为素数。
图 6-1
第 6章 循环结构程序设计
/*程序 6-12,素数判断 */
main( )
{int n;
int i;
int p;
printf( ″请输入要判断的正整数 n,″) ;
scanf( ″%d″,&n);
p=1;
for( i=2; i<n; i++
if ( n%i==0) p=0;
if ( p==1
printf( ″%d是素数 ″,n) ;
else
printf( ″%d不是素数 ″,n) ;
}
输入数据,7
运行结果,7是素数第 6章 循环结构程序设计
6.4 终止循环语句
1,continue语句格式,continue;
功能,终止本次循环的执行,即跳过当前这次循环中 continue语句后尚未执行的语句,接着进行下一次循环条件的判断。
说明,continue语句往往与 if 语句联用。
第 6章 循环结构程序设计例 6-13 求 10个正整数之和。
/*程序 6 - 13,求 10个正整数之和 */
main( )
{int i,n;
int s=0;
for( i=1; i<=10; n++
{scanf( ″%d″,&n) ;
if( n<0) continue;
s+=i;
}
printf( ″和 =%4d″,s) ;
}
第 6章 循环结构程序设计
2,break
在第 5章 5.2节中已经介绍过用 break语句可以跳出 switch语句,其实 break语句还可终止整个循环的执行 。
格式,break;
第 6章 循环结构程序设计例 6-14 判断 n是否为素数。
/*程序 6-14,素数判断程序 */
main( )
{int n;
int i;
int p;
printf( ″请输入要判断的数,″) ;
scanf( ″%d″,&n) ;
p=1;
for( i=2; i<=n/2; i++
if( n%i==0
{p=0;
break;
}
if( p==1) printf( ″%d是素数 ″,n) ;
else printf( ″%d非素数 ″,n) ;
}
第 6章 循环结构程序设计
6.5 多重循环例 6-15 计算 1! +2! +3! +…+100 !。
/*程序 6-15,计算 1! +2! +3! +…+100! */
main( )
{int i,j
double t;
double s;
s=0;
for( i=1; i<=100,i++) /*求和 */
{t=1;
for( j=1; j<=i; j++) /*求阶乘 */
t*=j;
s+=t;
}
printf( ″1! +2! +3! +…+100! =%f″,s) ;
}
第 6章 循环结构程序设计上面两重循环问题可以单重循环实现,执行效率大为提高。
/*程序 6- 15,计算 1! +2! +3! +…+100! */
main( )
{int i,j
double t;
double s;
t=1;
s=1;
for( i=2; i<=100,i++)
{t*=i;
s+=t;
}
printf( ″1! +2! +3! +…+100! =%f″,s) ;
}
第 6章 循环结构程序设计例 6-16 输出下三角形式九九乘法表。
* 1 2 3 4 5 6 7 8 9
1 1
2 2 4
3 3 6 9
4 4 8 12 16
……
9 9 18 27 36 45 54 63 72 81
第 6章 循环结构程序设计
/*程序 6-16,输出下三角形式九九乘法表 */
main( )
{int i,j;
clrscr( );
printf( ″ 九九乘法口诀表 \n″) ;
/*输出表头 */
printf( ″%4c″,′*′) ;
for( i=1; i<=9; i++
printf( ″%4d″,i) ;
printf( ″\n″) ;
for( i=1; i<=9; i++
{printf( ″%4d″,i) ;
/*输出第 i 行 */
for( j=1; j<=i; j++
printf( ″%4d″,i*j) ;
printf( ″\n″) ;
}
}
第 6章 循环结构程序设计
6.6 程序设计举例
1,循环语句的选择
while语句,do-while语句用于条件循环,for语句用于计数循环 。 while语句,for语句是先判断循环条件,后执行循环体,如果循环的条件一开始就不成立,循环一次都不执行 。
do -while语句是先执行循环体,后判断循环条件,循环至少执行一次 。
知道循环的次数选用 for语句实现循环 ; 不知道循环的次数选用 while语句,do-while语句实现循环 ; 保证循环至少执行一次,选用 do-while语句实现循环 。
第 6章 循环结构程序设计
(1) while语句的 for语句形式,
for( ; 条件表达式 ; )
(2) do-while语句 for语句形式,
for( ; 条件表达式 ; )
(3) for语句的 while语句形式,
表达式 1;
while( 条件表达式 2)
{
表达式 3;
}
第 6章 循环结构程序设计
2.
从循环执行的条件与退出循环的条件正反两方面加以综合考虑 。 有些问题循环的条件是隐含的,甚至需要人为地去构造 。 通常将一些非处理范围的数据,一般是一些特殊的数据作为循环条件构造的基础,这样构造的条件称为,伪条件,。
如求一些数的和是一个累加问题,需要循环完成,但循环条件并没给出 。 我们可用一个很小的数,比如 -
1E20,或一个很大的数,比如 1E20,来构造循环的条件,
数大于 -1E20或数小于 1E20,只要处理的一些数不比 -
1E20小或比 1E20大 。
第 6章 循环结构程序设计
3,循环体的设计注意循环体外的语句不要放至循环体中,循环体中的语句不要放至循环体外。
第 6章 循环结构程序设计例 6-17 求一些数的最小值。
/*程序 6-17,求一些数的最小值 */
main( )
{float x; /*存放当前数 */
float min=1e20; /*最小值初始化为一个很大的数 */
do
{scanf( ″%f″,&x) ;
if ( x<min) min=x;
} while ( x<1e30) ; /*假定要处理的数不超过 1e30,以一个更大的数终止循环 */
printf( ″最小值 =%f″,min) ;
}
第 6章 循环结构程序设计例 6-18 求两个整数的最大公约数。
/*程序 6-18,求两个整数的最大公约数 */
main( )
{int m,n;
int r; /*余数 */
printf( ″请输入两个整数 m,n,″) ;
scanf( ″%d,%d″,&m,&n) ;
r=m%n;
while ( r! =0
{m=n;
n=r,
r=m%n;
}
printf( ″最大公约数 =%d″,n) ;
}
第 6章 循环结构程序设计例 6-19 求 2~ n之间的所有素数,假定每行输出 5 个素数。
图 6 - 2
第 6章 循环结构程序设计
/*程序 6-19,求 2~n之间的所有素数 */
main( )
{int n;
int i,j;
int p,count=0;
printf( ″请输入 n,″) ;
scanf( ″%d″,&n) ;
printf( ″2~ %d之间素数如下,\n″,n) ;
for( i=2; i<=n; i++
{for( p=1,j=2; j<=i/2; j++
if ( i%j==0
{p=0;
break; }
if ( p==1
{ count++;
printf( ″%6d″,i
if( count%5==0) printf( ″\n″) ; [ZK)]
}
}}
第 6章 循环结构程序设计例 6-20 求 Fibonacci数列的前 60项 。 Fibonacci数列第
1 项为 1,第 2 项为 1,从第 3 项开始,每项等于前两项之和。
/*程序 6-20,求 Fibonacci数列的前 100项 */
main( )
{int i;
long int f1=1,f2=1;
int f;
printf( ″%10d%10d″,f1,f2) ;
for( i=3; i<=60; i++
{f=f1+f2;
printf( ″%10d″,f) ;
f1=f2;
f2=f;
}
}
第 6章 循环结构程序设计例 6-21 四则运算计算器程序。
/*程序 6-21,四则运算计算器程序 */
main( )
{float a,b;
char op;
float j;
scanf( ″%f″,&a) ; /*输入第一个操作数 */
scanf( ″%c″,&op) ; /*输入第一个运算符 */
while ( op ! = ′=′
{scanf( ″%f″,&b) ; /*输入下一个操作数 */
switch ( op
第 6章 循环结构程序设计
{case ′+′,j=a+b; break;
case ′—′,j=a—b; break;
case ′*′,j=a*b; break;
case ′/′,j=a/b; break; /*假定 b不为 0*/
}
scanf( ″%c″,&op) ; /*输入下一个运算符 */
if ( op![KG-*4]=′=′) a=j;
}
printf( ″计算结果 =%f″,j) ;
}
第 6章 循环结构程序设计例 6-22 假定有 100个同学的 C语言课程考试成绩,计算这门课程的平均成绩和 90~ 100分,80~ 89分,70~ 79
分,70分以下各个等级的人数 。
/*程序 6-22,C语言成绩处理 */
main( )
{ float cj;
int i;
float t;
float av;
int d9,d8,d7,d6;
t=0.0;
d9=d8=d7=d6=0;
for( i=1; i<=100; i++
第 6章 循环结构程序设计
{printf( ″请输入第 %d个同学 C语言成绩,″,i) ;
scanf( ″%f″,&cj);
t+=cj;
if( cj>=90) d9++;
else if( cj>=80) d8++;
else if( cj>=70) d7++;
else d6++;
}
av=t/100;
printf( ″C语言平均成绩 =%5.2f\n″,av) ;
printf( ″90~ 100分人数 =%d,80~ 89分人数 =%d\n″,d9,d8) ;
printf( ″70~ 79分人数 =%d,70分以下人数 =%d \n″,d7,d6) ;
}