1、然后再计算表达式的值,重复上述过程,直到表达式的值为“假(0)”时结束循环,流程控制转到循环结构的下一语句。利用while语句对例5.1实现编程。例5.1程序如下:#includevoid main() int i,sum,x; i=1;sum=0; /循环控制变量i、累加变量sum赋初值 while (i=10) /循环继续的条件 printf(Enter a data:); scanf(%d,&x); /输入累加的数据 sum=sum+x; /进行累加求和 i+; /循环控制变量递增 sum=%dn,sum); /输出计算结果使用while循环结构应注意以下几点:(P57)while循环结
2、构的特点是“先判断,后执行“。如果表达式的值一开始就为“假”则循环体一次也不执行。循环体中,如果包含一个以上的语句,则应用花括号括起来。循环体内一定要有改变循环继续条件的语句,使得循环趋向于结束,否则循环将无休止地进行下去,即形成“循环”如上例中的语句:i+。为使循环能够正确开始运行,还要做好循环前的准备工作。如上例中的语句i=1和sum=0 ,分别给循环控制变量初始化和对累加求和单元清零。例52 将4.3改为从键盘上输入30名学生的成绩,对其进行处理。如果成绩及格,则输出“Passed”;否则输出“Failed”。每个学生成绩的处理流程都是一样的,30名学生成绩的处理无非是对每个学生成绩处理
3、流程进行30次的重复,而每次只需输入不同的学生成绩即可。因此,该问题的求解算法是:只需在例4.3的基础上加一个循环处理。设一个变量n用来累计已处理完的学生成绩的个数,当处理完30个成绩后,程序结束。二、for语句 (P58)for (表达式1;表达式2;表达式3) 循环体语句for循环结构的执行过程如图:例53 用for循环实现例5.1 for(i=1,sum=0;i=10;i+)使用for循环结构应注意以下几点:(P59)for循环结构也具有“先判断,后执行”的特点。for循环结构相当于如下形式的while结构:表达式1;while(表达式2)循环体表达式3;从语法上看,for的3个成分都是
4、表达式,他们之间都以分号“;”隔开。表达式1和表达式3通常是赋值表达式或函数调用,有时也可以是逗号表达式,一般用来实现对循环控制变量初始化和循环控制变量增(减)值。表达式2通常是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,是用来表示循环继续的条件,只要其值为非零,就可执行循环体。例如:for(i=1,sum=0;=100;i+,i+) sum+=i;其中,表达式1与表达式3都是逗号表达式。此外,for的3个表达式还允许部分或全部省略。当省略表达式1时,应该在进入for循环结构之前有适当的给循环控制变量初始化的语句;当省略表达式3时,应该在循环体内含有改变循环控制变量的值的语句;当
5、表达式2 省略时,应该在循环体内设置相应的语句来结束循环,否则循环将无休止地继续下去(因为循环继续的条件被认为总为“真”)。由于for循环结构书写形式灵活多样,如果在3个表达式中过多地加入与循环控制无关的内容,容易降低可读性。因此,通常使用一种更为简单明了的for循环结构形式,即为: for(循环控制变量赋初值;循环条件;循环控制变量增(减)值)例如,将例5.3中的for循环结构改为: sum=0;for (i=1;例54 输入整数 n,求n !这是一个“连乘”的问题。为得到连乘的积,程序中需要有:用来存放连乘积的变量(fac),其初值为1;控制连乘个数的循环控制变量(i),其初值为1,终值为
6、n,每次增量为1;每次要连乘的乘数,由于其恰好与循环控制变量(i)的值相吻合,因此可用循环控制变量的值代替。程序如下: int n,i,fac;Please enter n:n); fac=1; for(i=1;=n; fac=fac*i;%d!=%dn,n,fac);说明:上例中的for循环结构还可以改为以下几种形式。形式1(省略表达式1):i=1;For (;形式2(省略表达式3):For (i=1;) fac=fac*i; i+;形式3(循环体为空语句): fac=fac*i,i+) ;do while(表达式);dowhile循环结构的执行过程如图所示:例55用dowhile循环结构实
7、现例5.1 do while(i=10);使用dowhile循环结构应注意以下几点:dowhile循环结构的特点是“先执行,后判断”,因此无论循环继续的条件是否成立,循环体中的语句至少被执行一次。这是他与while循环结构的本质区别。如果循环体包含一个以上的语句,则也应该用花括号括起来,以复合语句的形式出现。循环体内一定要有改变循环条件的语句,使得循环趋向于结束。循环嵌套是指:在一个循环体内又包含了另一个完整的循环结构。3种循环不仅可以自身嵌套,而且还可以互相嵌套。例56 编程输出以下形式的乘法“九九表”1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=62*1=2 2*2=
8、4 2*3=6 2*4=8 2*5=10 2*6=12 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 首先观察第1行乘法表的变化规律:被乘数为1不变,而乘数从1变化到9,每次增量为1。因此,构造如下循环即可实现第1行乘法表的输出: for (j=1;j=9;j+) printf(“%1d*%1d=%2d”,1,j,1*j);再观察第2行乘法表的变化规律:与第1行惟一不同的是被乘数为2,而处理过程完全一样。因此,只需将被乘数改为2,对上述循环再执行一次即可。同理,第3行,第4行,只需让被乘数从1变化到9对上述循环执行9次即可。因此,在上述循环的外面再加上一个循
9、环(即构成双重循环),即可得所求的乘法“九九表”。 int i,j;i+) /i作为外循环控制变量控制被乘数变化 for(j=1;j+) / j作为内循环控制变量控制乘数变化%1d*%1d=%2d ,i,j,i*j); /i*j即为两个数的乘积n /换行双重循环的执行过程是:先执行外循环,当外循环控制变量i取初值1后,执行内循环,在内循环j从1变化到9的过程中,i始终不变,直到内循环执行完毕,到了外循环,i才变为2,而后再执行内循环,j又从1变化到9如此下去,直到外循环控制变量i超过终值,整个双重循环才执行完毕。例571全班有30名学生,每名学生考8门课。要求分别统计出每名学生各门课的平均成绩
10、。首先考虑一名学生各门课的平均成绩。设置循环控制变量i控制课程数,其变化从1到8,每次增量为1。算法表示如下图1。每个学生的处理过程是一样的,因此,只需对上述流程重复执行30遍(即形成双重循环,每遍输入不同学生的各门课成绩)。设置循环控制变量j控制学生人数,其变化从1到30,每次增量为1。算法表示如下图2。 int i,j,score,sum; float aver; j=1; while(jmax) else if (x int sign=1; float n,pi,t; t=1.0; n=1.0; pi=0.0; pi=pi+t; n=n+2; sign=-sign; t=sign/n;
11、while(fabs(t)=1e-6); pi=pi*4;pi=%fn,pi);例510 对求全班平均成绩问题进行一般化处理。即要求程序在每次运行时能够处理任意个数的成绩。由于要求程序能够处理任意个数的成绩,程序循环的次数是不确定的。因此可以采取一个专门的值来指示数据输入的结束,这个值就称为“标记值”或称为“信号值”。用户将所有要处理的正常数据键入以后,键入该“ 标记值”(用于表示已输入完最后一个处理数据),此时,程序接收到这个“标记值”,即终止循环。 int n,score,sum; float average;n=0;Enter score,-1 to end: while(score!=
12、-1) sum=sum+score; n=n+1; printf( if (n!=0) average=(float)sum/n;Class average is %5.2fn,average); elseNO score were entered.n程序说明:由于考试成绩通常是非负数据,所以本例可用“-1”作为“标记值”;由于不能被0除,所以在进行求平均成绩之前要进行测试,以保证程序正确运行;在请求键入数据的提示信息中,明确地把标记值告诉用户,是一种良好的程序设计习惯。例511 输入一个整数n(n3),判断是否为素数(质数)。数学方法已证明:若要判断一个整数n否为素数,只需用2n各数去除n,
13、如果都除不尽,n就是素数;只要有一次除尽了,n就不是素数。设置一个开关变量flag,用于标识是否除尽。Flag初值为1(“真”,一旦某一次除尽了就将其置为0(“假”),从而终止循环。当循环结束时,若flag为“真”,就表明n是素数。 int n,i,flag;Enter a integer: i=2; flag=1; while(i(int)sqrt(n)&flag) if (n%i=0) flag=0; if (flag)%d is prime number.n,n);%d is not prime number.n例5 12 输出如下形式的图案。*这是一个6行8列的星形矩阵。对于这类图案的
14、输出关键是找出其规律,理解控制变量所代表的实际意义。分析语句: printf(“*”);的功能;对该语句重复若干次其结果是:* int i,j;=6; for(j=1;*总结:通过上述例题可以看出,所谓循环就是在循环条件为“真”时,让计算机反复执行一组指令,直到循环条件为“假”时终止。实际应用中用到的大多数循环通常分为两类:一类是次数确定的循环,一类是次数不确定的循环。次数确定的循环通常采用计数器的方式控制循环。循环控制变量用来控制循环的次数,循环控制变量要有:初始值、每次变化的增量及控制循环是否终止的终值和测试条件。次数不确定的循环通常采用“标记值”的方式控制循环。“标记值”表示获取数据的结
15、束,“标记值”是在所有合法的数据项都提供给程序后的键入值。“标记值”必须不同于正常的数据项,以免发生混淆。无论是用计数器控制循环,还是用标记值控制循环,在实现过程中,都要注意使开发的程序具有通用性。3种循环的比较:3种循环都可以用来处理同一问题,一般情况下他们可以互相代替。dowhile循环类似于while循环,不同之处是他们执行循环体和计算表达式的先后顺序不同。此外,从流程图可以看出,dowhile循环至少要执行一次循环体,而while和for循环在进入循环体之前,首先要判断循环条件的表达式,如果条件不成立,则循环体一次也不执行就结束循环流程,所以,这两种循环可能执行零次或若干次。while
16、和dowhile循环,在while后面指定循环条件,在循环体中包含应重复执行的操作语句。而for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。用while和dowhile循环时,循环变量初始化的操作应在while和dowhile之前完成。而for语句可以在表达式1中实现循环变量的初始化。break语句的功能是使执行从包含他的最内层循环或开关语句中跳出,转到switch结构或循环结构外的下一语句执行。这将导致包含他的最内层循环或switch语句的终止。break语句的一般形式:break;例513 计算r=1到r=10的圆的面积,直到其面积大于100为
17、止。 int r; float pi=3.14159; float area; for(r=1;r100) break;r=%d area is %fn,r,area);从for循环可以看到:当area100时,执行break语句,循环将提前结束,即不再执行其余的几次循环。使用break语句应注意以下几点:(P70)break语句只能用于switch结构或循环结构中。在循环结构中应用时,一般要有if语句配合使用。在嵌套的循环结构中使用时,break语句只能跳出(或终止)包含他的最内层循环,而不能同时跳出(或终止)多层循环。continue语句的作用是结束本次循环,使得包含他的循环开始下一次循环
18、。continue语句的一般形式为: continue;例514 输出100200范围内不能被5整除的数。执行continue int n; for(n=100;n=200;n+) if (n%5=0) continue;%dt使用continue语句时要注意以下几点:continue语句只能用于循环结构中,通常也要有if语句配合使用。continue语句和break语句虽然都实现了程序执行方向的无条件转移,但他们的区别是:continue语句只能结束本次循环,而不是终止整个循环的执行;break语句则是立即结束整个循环的过程,不再进行条件判断。例如;以for循环为例。for(表达式1;表达式3) for(表达式1; continue; 三、goto(转向语句)goto语句为无条件转向语句,其功能是:把程序控制转移到标号指定的语句处,使程序从指定的标号处的语句开始继续执行。goto语句的一般形式为:goto 标号;标号:语句;标号是由用户命名的标识符,其后要跟一个冒号。标号的命名规则与变量名相同,其作用识用来表示goto 的目标。标号可以用
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1