配色: 字号:
计算机程序设计基础(C语言)第5章 循环结构
2022-11-06 | 阅:  转:  |  分享 
  
第5章 循环结构 循环的基本要素有三个:循环入口(即循环的初始化条件)循环出口(即循环的终止条件)循环体(反复执行的部分) C语言提供了3种
循环语句实现循环结构5.1 while语句5.2 do-while语句5.3 for语句 5.4 转移语句5.5 举例巩固练习语义
:计算表达式的值,当值为非0 (真)时,执行循环体语句。重复上述操作,直到表达式的值为0(假)时,跳出循环,转而执行while语句
的后续语句。5.1 while语句 while语句的一般形式为: while (表达式)
语句; while (i<=100) { sum=sum+i; i=i+1; }【例5.1】计算 思考
: 2.求1+1/2+1/3+…..+1/n3.求1-1/2+1/3-….. -1/n / 求n个自然数的累加和 /#inc
lude "stdio.h"main(){int n,i=1,sum=0; printf("Enter a number :");
scanf("%d",&n);while (i<=n) { sum+=i; i++; } printf("Sum is
%d",sum);}sum称为累加器,使用前要进行初始化,一般初始化为0i被称为计数器,使用前要进行初始化,一般初始化为0或1使
用while语句应注意以下几点:while语句中的表达式可以是任意表达式,一般是关系表达或逻辑表达式,只要表达式的值为非0 (真)
则继续循环。 如: while (n- -) printf("%d ",n);循环体可以是空语句、单语句或
用花括号括起来的复合语句。 应注意循环条件的选择以避免死循环。例如下列循环语句:  while(n=10) pri
ntf("%d ",n++);while语句从语法上来说是一条完整的控制语句。死循环允许while语句的循环体语句又是while语
句,从而形成循环嵌套。 如: i=1;while(i<=9) / 外循环 /{ j=1; while(j<=i
) / 内循环 / { printf("%4d ",ij); j++; } i++; printf("
\n");}使用while语句应注意以下几点:九九乘法表6. while语句实现的循环结构特点: 先判断循环条件,后执行循
环体。若一开始循环条件就不成立,则循环体一次也不执行: int i=0; while(i>100)
sum+=i;使用while语句应注意以下几点:5.2 do-while语句do-while语句的一般形式为:
do  语句; while(表达式);语义:先执行循环体语句一次,再判别表达式的值,若为非
0 (真)则继续执行循环体语句,否则终止循环,转而执行do while语句后面的语句。注意观察【例5.3】一个人口统计程序,198
0年世界人口已达45亿,按年增长率1%计算,问什么年份开始世界人口突破100亿大关。 while(p<1e+10) {
p=p(1+rate); year++; }初值:年:year=1980 人口:p=4.5e+09以后每年的人
口: p=p(1+0.01)#include “stdio.h”main( ){ int year=19
80; double rate=0.01,p=4.5e+09; do { p=p(1+rate); ye
ar++; } while(p<1e+10); printf("year=%d,%e\n",year,p);}5.3 f
or语句一般形式为: for(表达式1;表达式2;表达3) 语句 执行过程: ① 计算表达式1的值
,为循环变量赋初值。 ② 计算表达式2的值,若值为非0 (真),则执行循环体一次,否则跳出循环。 ③ 计算表达式3的
值,转回第②步重复执行。 如:sum=0; for (k=1; k<=100; k++) sum+
=k;赋值控制循环结束循环变量增值或减值例:求n个自然数的累加和do { sum+=i; i++; }
while ( i<=n );for ( i=1;i<=n;i++ ) sum+=i;#include “stdio.
h”main(){ int i,n,o_sum,e_sum; scanf("%d",&n); e_sum=0; o_su
m=0; for(i=1;i<=n;i++) if(i%2==0) e_sum+=i; el
se o_sum+=i;printf("o_sum=%d,e_sum=%d\n ",o_sum,e_sum);}
【例5.4】编程计算正整数1到n中的奇数之和以及偶数之和。 注意: 三个表达式均可省略,但两个分号不能省略。省略表达式1:此时必
须在for语句之前给循环变量赋初值。 如:k=1; for ( ; k<=100 ; k++) s+=k
;省略表达式2:认为条件永远为真,出现“死循环”。 如:for ( k=1; ; k++) { s+=k
; if(k>=100) break; }省略表达式3:应另设法使循环正常执行。 如:for ( k=
1 ; k<=100 ; ) { s+=k ; k++; }全省略: “死循环” 如: for (
; ; ) sum+=k; 关于:for(表达式1;表达式2;表达3) 语句 循环体也可以省略,但分号不可省略。“;”代
表空语句,表示不执行任何操作,但在语法上不可少。 如:for (k=1 ; k<=10000 ; k++) ;
表达式1和3还可包含与循环变量无关的其它表达式。 如:for ( s=0, k=1; k<=100 ; k++,
s=s+k); for (k=0; k<=100; k++, k++) s+=k;表达式2可为任意
表达式,只要值为非零,就执行循环体。 如:for ( k=0; (c=getchar ( ))!=’\n’ ;
k++) ; for (; (c=getchar ( ))!=’\n’ ;) printf(“%
c”,c);思考:使用三种循环语句实现: 1+22+33+……+100100 关于:for(表达式1
;表达式2;表达3) 语句 三种循环语句可相互嵌套,构成多重循环。① for( ) { …   while( )    {…
}  … }② do { …  for( )   {…}  … }while( );③
while( ) { …  for( )   {…}  … }④ for() { …  for( )
{…} … }for(i=1;i<=2;i++){ j=1; while(j<=5) pri
ntf(“%d”,j); printf(“\n”);}【例5.6 】有1、2、3三个数字,编写程序输出由这三个数组成的互不相同且无
重复数字的两位数。即输出:12,13,21,23,31,32。#include “stdio.h”main(){ int i,
j,k; printf("\n"); for(i=1;i<4;i++)    /二重循环/  for(j=1;j<4;j
++)   { if (i!=j)    /确保i、j两位互不相同/    { k=i10+j;
printf("%d\n",k); }   }} 三位数?【例5.7 】编程打印三角形表示(黑色区域)的九九乘法表
1 2 3 4 5 6 7 8 91 12 2 43 3
6 9 4 4 8 12 165 5 10 15 20 256 6 12 18
24 30 367 7 14 21 28 35 42 498 8 16 24 32 40
48 56 649 9 18 27 36 45 54 63 72 81#include "stdio.h
"main( ){ int i,j,p;for(i=1;i<=9;i++){ for(j=1;j<=i;j++) { p=i
j; printf("%4d",p); } printf(“\n”); //换行}}5.4 转移语句C语言提供的4种
转移语句为:goto,break,continue和return。 goto语句 goto语句也称为无条件转移语句,其一般格式如下
: goto 语句标号; 改变程序正常流向,转去执行语句标号所标识的语句。 语句标号用标识符定义,置于某一语句行的前面,
语句标号后加冒号(:) ,起标识语句的作用。如: label: i++; …… goto label;一般形式
为:break; break语句只能用在switch 语句或循环语句中作用: 跳出switch语句或跳出本层循环,转去执行后面的程
序语句。 main(){int i, s; s=0; for(i=1; i<=10; i++) { s=s+i;
if(s>5) break; printf(“s=%d\n” , s ); }}5.4 转移语句-
break语句 一般格式是:continue; 语义:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一
次循环条件的判断与执行。注意(1)只能用在循环体中 ,(2)只结束本层本次的循环,并不跳出循环。#include "stdio.
h"main(){ int k=0,s=0,i; for( i=1; i<3; i++ ) {s=s+i;
if(s>2) continue; k=k+s; } printf("s=%d,k=%d\n",s,k)
;}5.4 转移语句- continue语句例:打印1-100之内能被7整除的数#include “stdio.h”main(){
int n; for (n=1; n<=100; n++) { if ((n%7)==0)
printf (“%d ”,n); } }思考:如何控制每行打印5个数((n%7)!=0)continue;【例
5.11】打印fibonacci数列:1,1,2,3,5,8,13,21,…的前36个数分析: 由题意可得下列递推公式:
F1=1 F2=1 Fn=Fn-1+Fn-2 (n=3~36)#include "
stdio.h"main(){ long f1,f2; int i; f1=1; f2=1; for(i=1;i<
=18; i++) { printf("%12ld%12ld",f1,f2); if(i%2==0
) printf("\n"); f1=f1+f2; f2=f2+f1; } }一行打印4个数本
章 举 例 本 章 举 例 【例5.12】有一个古老的传说(棋盘上的麦粒):有一位宰相发明了国际象棋,国王打算奖赏他。国王问他想
要什么,宰相对国王说:“陛下,请您在棋盘上的第一小格里,赏给我1粒麦子,第2个小格里给2粒,第3个小格里给4粒,以后每一小格给的麦
子都是前一小格的2倍。您像这样把棋盘上的64个小格用麦粒摆满,就把这些麦粒赏给我吧!”请问国王需要拿出多少麦粒?答案:1.8446
71019#include “stdio.h”main(){ int i; double p,sum; p=1, su
m=1; for(i=1;i<64;i++) { p=2; sum+=p; } print
f(“%le”,sum);}相当与求:1+2+4+…+263 如果i>=n,则说明for 语句是正常退出,即n不能被2~n
-1之间的任何数整除#include "stdio.h"main() { int n, i ; scanf("%d",
&n); for (i=2; i break; } if (i>= n ) printf ("%4d is prime\n",n)
; }只要n能被2~n-1之间的任何一个数整除立即退出循环【例5.16】输出2~100以内的素数。【例5.16】 :
判断一个整数n是否是素数(只能被1和本身整除的数称为素数) 如果i>=k,则说明for 语句是正常退出,即n不能被2~k
之间的任何数整除#include "stdio.h"main() { int n, i; scanf("%d", &n)
; for (i=2; i reak; } if (i>= n ) printf ("%4d is prime\n",n);
}其实循环只需从2到n的平方根就可以了。【例5.16】输出2~100以内的素数。k=sqrt(n);kk, k;【例5
.16】 : 判断一个整数n是否是素数(只能被1和本身整除的数称为素数)#include “math.h”【例5.16】输出2
~100以内的素数。【例5.16】 : 判断一个整数n是否是素数(只能被1和本身整除的数称为素数)#include "stdi
o.h"#include “math.h”main() { int n, i, k; scanf("%d", &n);
k=sqrt(n); for (i=2; i ==0) break; } if (i>= k ) printf ("%4d is prime
\n",n); }其实n无需输入,可以循环取值。for (n=2;n<=100;n++) { }去掉2以上
的所有偶数再次优化行数x 前导空格数a 输出字符个数n 1 3 1 2 2
3 3 1 5 4 0 7 3 1 5
2 2 3 1 3 1 归纳:x a=4-x
n=2x-1 补充例题1(习题5.3(6)): 打印如下图形

#include "stdio.h" main ( ){ int x,n,a; for ( x=1; x<=4;
x++) { for (a=1; a<=4-x ; a++) printf (" "); for (n=1; n<=
2x-1; n++) printf (""); printf ("\n"); } for (x=3;x>=1; x
--) { for (a=1; a<=4-x; a++) printf (" ") ; for (n=1; n<
=2x-1; n++) printf (""); printf ("\n"); } }

1 222 33333 444444
4 33333 222 1 如果??行数x 前导
空格数a 输出字符个数n 1 3 1 2 2 3 3 1
5 4 0 7 3 1 5 2 2 3 1
3 1 归纳:x a=4-x n=2x-1(输出数)#i
nclude "stdio.h"main ( ){ int x,n,a; for ( x=1; x<=4; x++) {
for (a=1; a<=4-x ; a++) printf (" "); for (n=1; n<=2x-1;
n++) printf (""); printf ("\n"); } for (x=3;x>=1; x--) {
for (a=1; a<=4-x; a++) printf (" ") ; for (n=1; n<=2x-1
; n++) printf (""); printf ("\n"); } } 1
222 33333 4444444 33333 222
1printf ("%d",x);printf ("%d",x); #include "stdio.h"
main ( ){ int x,n,a; for ( x=1; x<=4; x++) { for (a=1; a<=4-
x ; a++) printf (" "); for (n=1; n<=2x-1; n++) printf ("%d
",x); printf ("\n"); } for (x=3;x>=1; x--) { for (a=1
; a<=4-x; a++) printf (" ") ; for (n=1; n<=2x-1; n++) pri
ntf ("%d",x); printf ("\n"); } }for (n=1; n<=x; n++)
printf ("%d",n);for(n=x-1;n>0; n--) printf("%d",n);for (n=1; n<=
x; n++) printf ("%d",n);for( n=x-1;n>0;n--)printf("%d",n);
1 121 12321 1234321 12321
121 1 又如果??补充例题2:从输入的若干个正数中选择最大值,用-1结束输入
#include “stdio.h”main() { int x, max=0, i ; scanf(“%d”, &x)
; if (x>0 && x!=-1) max=x; /确保输入的第一个数是正数且非-1/ do
{ scanf(“%d”,&x); if ( x>max) max=x; } whil
e(x!=-1); printf (“max=%d ”,max); }补充例题3:输入一个多位数字,以相反的顺序打印
该数。如: 输入3456,输出6543#include “stdio.h”main (){ int number, ri
ght, t=0; printf(“ enter your number:\n”); scanf(“%d”, &num
ber); do { right=number%10; t=t10+right;
number=number/10; } while (number!=0); printf(“%d\n”, t);
} #define N 6 / 6名学生 / #define M 5
/ 5门课程 / main ( ) { int i, j ; float g, sum, ave;
for(i=1; i<=N; i++) { sum=0; for(
j=1; j<=M; j++) { scanf(“%f”,&g); sum+=g; }
ave=sum/M; printf (“No. %d ave=%5.2f\n”,i,ave); }
}补充例题4:输入6名学生5门课程的成绩,分别求每个学生的平均成绩1.以下程序中,while循环的循环次数是______ 
。main(){ int i=0: while(i<10) { if(i<1)continue; i
f(i==5)break; i++: } …… }A)1 B)10 C)6 D)死循环,不能确定次数
巩 固 练 习D)死循环,不能确定次数2.以下程序运行时,从键盘输入:01<回车>,程序执行后输出结果是______ :#incl
ude "stdio.h"main(){ char k;int i; for(i=1;i<3;i++) { scan
f("%c",&k); switch(k) { case ''0'':printf("another\n");
case ''1'':printf("number\n");} } }A)another B)another  C)ano
ther D)number number  number  number  number anoth
er  number巩 固 练 习A)3.以下程序的输出结果是______。#include "stdio.h"main()
{int a=0,i;for(i=1;i<5;i++) { switch(i) {case 0: cas
e 3:a+=2; case 1: case 2:a+=3; default:a+=5;}
} printf("%d\n",a);}A)3l  B)13  C)10  D)20巩 固 练 习A)3l 4
.以下程序的输出结果是______。#include "stdio.h"main(){ int i=0,a=0; while(
i<20) {for(;;) {if((i%10)==0)break; else
i--; } i+=11;a+=i;} printf("%d\n",a);}A)21 B)32 C)33 D)11巩 固 练
习B)325. 以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出:#include "stdi
o.h"main(){ int n,k; float score,sum,ave; sum=0.0; for(n=1;n<=1
0;n++) { for(k=1;k<=4;k++) {scanf("%f",&score); sum
+=score; } ave=sum/4.0; printf("NO%d:%f\n",n,ave); } }程
序运行后结果不正确,调试中发现有一条语句出现在程序的位置不正确。这条语句是________。 A)sum=0.0;  B)sum+=score; C)ave=sum/4.0;  D)printf("NO%d:%f\n",n,ave);巩 固 练 习A)sum=0.0;6. 以下程序运行后的输出结果是 【 】 。#include "stdio.h"main(){int x=15;while(x>10 && x<50) {x++; if(x/3){x++;break;} else continue; }printf("%d\n",x);}巩 固 练 习17本章小结C语言提供了三种循环语句用于实现循环结构。for语句一般用于实现给定循环变量初值,步长增值及循环次数的循环结构。当循环次数及循环控制条件要在循环过程中才能确定的循环可用while或do-while语句。三种循环语句可以相互嵌套组成多重循环,循环之间可以并列但不能交叉。 三种循环语句分析用while和do―while循环时,循环变量的初始化操作在循环之前进行,而for循环是在表达式1中进行的。while循环和for循环都是先判断表达式,后执行循环体,而do-while循环是先执行循环体后判断表达式,也就是说do-while的循环体最少被执行一次,而while 循环和for就不一定了。这三种循环都可以用break语句跳出循环,用continue语句结束本次循环。续。。。。 在结构化程序设计中,三种基本结构并不孤立在循环结构的循环体中可能出现选择结构、顺序结构;在选择结构的内嵌语句中也可能出现循环、顺序结构;而如果把循环语句和选择语句看成是一条完整的语句时,它们本身又是构成顺序结构的一个元素,因此合理使用这三种基本结构,就能实现各种算法。 续。。。。
献花(0)
+1
(本文系籽油荃面原创)