06高级程序语言.ppt
第六讲第六讲 控制流控制流-循环结构程序设计循环结构程序设计教材教材:C程序设计导论程序设计导论1本讲重点本讲重点1 1熟练掌握三种循环语句的基本结构以及循环语句的嵌套。熟练掌握三种循环语句的基本结构以及循环语句的嵌套。2 2掌握掌握gotogoto语句的一般形式。语句的一般形式。3.3.熟练掌握熟练掌握breakbreak、continuecontinue语句使用语句使用4.4.使用三种基本结构编写简单的程序使用三种基本结构编写简单的程序2循环结构循环结构n功能:重复执行某一种动作(代码)若干次。功能:重复执行某一种动作(代码)若干次。goto语句构成的循环语句构成的循环while循环循环dowhile循环循环for循环循环while、dowhile、for三种循环的比较三种循环的比较break、continue语句的作用及在循环中的应用语句的作用及在循环中的应用n循环的嵌套使用循环的嵌套使用:一个循环中又包含另一个循环成为循环的嵌套一个循环中又包含另一个循环成为循环的嵌套.上上面讲到的三种循环可以互相嵌套面讲到的三种循环可以互相嵌套.36.1 while语句语句1 1、功能:、功能:whilewhile语句一般完成当型循环,语句一般完成当型循环,2 2、语句格式为:、语句格式为:while while(表达式(表达式p p)语句语句3 3、执行过程:当表达式、执行过程:当表达式P P为非零时,反复执行为非零时,反复执行A A操作,直到操作,直到P P为假时为假时才停止。才停止。A当当P为真为真A P4Sum=sum+ii+当当i=1006.1 while语句语句 100例例3.9:求求 n n=1#include void main(void)int i,sum=0;i=1;要点要点:语句一面要么是单条语句,要么是复合语句语句一面要么是单条语句,要么是复合语句 while(i=100)循环体若不止一条语句时,循环体若不止一条语句时,sum=sum+i;应用应用括起来。括起来。i+;在循环体中应有使循环趋于结束在循环体中应有使循环趋于结束的语句,以避免的语句,以避免“死循环死循环”。printf(“%d”,sum);i=156.1 while语句语句例例:个位数是个位数是6,且能被,且能被3整除的整除的5位数共有多少个?位数共有多少个?.#include void main(void)long int n=10006;int count=0;while(n=99999)if(n%3=0)count+;n+=10;printf(“count=%dn”,count);66.2 do-while语句语句1、功能:、功能:dowhile语句一般完成直到型循环,语句一般完成直到型循环,2、格式为:、格式为:do 语句块;语句块;while(表达式(表达式p););3、执行过程:先执行循环体,后判定表达式,当表达式的值为、执行过程:先执行循环体,后判定表达式,当表达式的值为“假假”时,循环结束。时,循环结束。PATF直到直到P为假为假A76.2 do-while语句语句 100例如例如:求求 n n=1#include void main(void)int i,sum=0;i=1;dosum=sum+i;i+;while(i=100);printf(“%d”,sum);从上面对一个问题的两种解决方法可以看出从上面对一个问题的两种解决方法可以看出:while循环与循环与do_while循环在循环在绝大多数情况下是可以相互转化的绝大多数情况下是可以相互转化的.86.3 for语句语句1、功能、功能:用于循环次数已确定或给定循环条件的情况,适合于描述一个事用于循环次数已确定或给定循环条件的情况,适合于描述一个事物从初始态到终止态的变化过程。最为灵活。物从初始态到终止态的变化过程。最为灵活。2、语句格式为:、语句格式为:for(表达式(表达式1;表达式表达式2;表达式表达式3)语句语句3、执行过程为、执行过程为:(1)先求解表达式先求解表达式1(初值)(初值);(2)求解表达式求解表达式2,并判定其值是否为真并判定其值是否为真(非非0),若为真若为真,则执行其所包含的语则执行其所包含的语句句,然后执行下面的步骤然后执行下面的步骤3;若为假若为假,则直接执行步骤则直接执行步骤5;(3)执行循环体语句后执行循环体语句后,求解表达式求解表达式3;(4)转回执行步骤转回执行步骤2;(5)执行执行for下面的语句下面的语句.9求解表达式求解表达式1表达式表达式2语句语句求解表达式求解表达式3for循环下面的语句循环下面的语句TF106.3 for语句语句 100例例:求求 n n=1#include void main(void)int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“%d”,sum);116.3 for语句语句-使用要点使用要点1、for语句中的表达式语句中的表达式1可以省略可以省略,但在但在for循环之前应给循环变量赋值循环之前应给循环变量赋值.例如例如:i=1;for(;i=100;i+)sum=sum+i;2、表达式、表达式2也可以省略也可以省略,但循环将陷入死循环但循环将陷入死循环.例如例如:for(i=1;i+)sum=sum+i;3、表达式、表达式3也可以省略也可以省略,但应在循环体中增加使循环变量值改变的语句但应在循环体中增加使循环变量值改变的语句.例如例如:for(sum=0,i=0;i=100;)sum=sum+i;i+;4、表达式、表达式1和表达式和表达式3同时省略也允许同时省略也允许,例如例如:i=1;sum=0;for(;i=100;)sum=sum+i;i+;这是完全与这是完全与while循环等同循环等同.5、三个表达式都可以省略、三个表达式都可以省略,但但“;”不能省略。不能省略。for(;)sum=sum+i;循环将无休止的执行下去循环将无休止的执行下去126.3 for语句语句-使用要点使用要点6、表达式、表达式1中的表达式可以是循环变量的赋初值的表达式中的表达式可以是循环变量的赋初值的表达式,也可是与赋初也可是与赋初值根本无关的其他表达式值根本无关的其他表达式,或者两者兼而有之或者两者兼而有之.例如例如:for(sum=0,i=1;i=100;i+)sum=sum+i;表达式表达式3也可以出现同样的情况也可以出现同样的情况,例如例如:for(sum=0,i=1;i=100;sum=sum+i,i+);7、表达式、表达式2一般清况下是关系表达式或逻辑表达式一般清况下是关系表达式或逻辑表达式,也可以是其他表达式也可以是其他表达式,例如例如:for(;(c=getchar()!=n;printf(“%c”,c);若输入若输入:cauc 输出为输出为cauc,不是输出不是输出ccaauucc.136.3 for语句语句-范例范例 例例3.11:求求n!#include void main(void)int i,n;long fact=1;printf(“please input n”);scanf(“%d”,&n);for(i=1;i=n;i+)fact*=i;printf(“%d!=%ld”,n,fact);14例例4-10 求一个等差数列前求一个等差数列前n项的和:项的和:ai+1-ai=d (i=1,2,3)分析:分析:1 输入输入n、d和等差数列的第一个数和等差数列的第一个数a的取值。的取值。2 sum、i的初值置的初值置0 3 a+sumsum 4 计算数列中下一个数的取值计算数列中下一个数的取值 a+da 5 i+1i 6 重复重复3、4、5步直到步直到i大于大于n 7 输出结果输出结果n#include void main(void)int a,d,n,i;int ai,sum=0;printf(“input a=?td=?tn=?n”);scanf(“%d%d%d”,&a,&d,&n);ai=a;for(i=1;i=n;i+)sum+=ai;ai+=d;printf(“sum=%dn”,sum);156.4 循环语句嵌套循环语句嵌套 while(表达式表达式1)while(表达式表达式2)while(表达式表达式1)do while(表达式表达式2)while(表达式表达式1)for(;)166.4 循环语句嵌套循环语句嵌套例例3.12 输出图形输出图形 *#include void main(void)int i,j;for(i=1;i=3;i+)for(j=1;j=8;j+)putchar(*);printf(“n”);176.4 循环语句嵌套循环语句嵌套例例3.13 编写一个九九乘法表的程序编写一个九九乘法表的程序分析:九九乘法表分分析:九九乘法表分9行,行,第第i行共行共i个小项。个小项。i*j i=1,2,9 j=1,2,i#include void main(void)int i,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(“%1d*%1d=%4d”,i,j,i*j);printf(“n”);186.5 breakbreak语句语句1.break1.break语句的功能:用于从循环体内跳出循环体,即提前结束循环。语句的功能:用于从循环体内跳出循环体,即提前结束循环。例例:计算计算r=1r=1到到r=10r=10的圆面积的圆面积,当面积大于当面积大于100100时结束循环时结束循环,for(rfor(r=1;r=10;r+)=1;r100)breakarea100)break;printf(“%f”,areaprintf(“%f”,area););2 2、使用要点:、使用要点:breakbreak只能用在循环语句和只能用在循环语句和switchswitch语句中语句中.196.5 breakbreak语句语句例例3.14 某银行利息某银行利息2.8%(以复利计)。假设某储户存入本金以复利计)。假设某储户存入本金8000元,当满足元,当满足以下条件之一,储户从银行将钱取出。以下条件之一,储户从银行将钱取出。(1)储蓄满)储蓄满10年年 (2)连本带金超过)连本带金超过10000元元 1年个年个 编程求储户会在第几年将钱取出,取出时连本带息是多少?编程求储户会在第几年将钱取出,取出时连本带息是多少?#include void main(void)int year;float money=8000;for(year=1;year10000)break;printf(“%d year%fn”,year,money);20例例:百鸡问题:一只公鸡值百鸡问题:一只公鸡值5个钱,一只母鸡值个钱,一只母鸡值3个钱,三只小鸡值个钱,三只小鸡值1个钱,现有个钱,现有100个个钱,要买钱,要买100个鸡,是否可以?要求三种鸡都有。个鸡,是否可以?要求三种鸡都有。分析:设公鸡、母鸡、小鸡各分析:设公鸡、母鸡、小鸡各x、y、z只,则可知只,则可知z=100-x-y,且,且5x+3y+z/3=100 采用试探法;采用试探法;#include void main(void)int x,y,z;for(x=0;x=20;+x)for(y=0;y34;y+)z=100-x-y;if(z%3=0)&(5*x+3*y+z/3)=100)break;if(x&y&z&y34)printf(“cook=%d hen=%d chicken=%dn”,x,y,z);printf(“this is one solution.n”);break;216.6 continuecontinue语句语句1、功能、功能:结束本次循环结束本次循环,接着判定下一次是否执行循环。接着判定下一次是否执行循环。2、continue与与break的区别的区别:continue只结束本此循环只结束本此循环,而而break终止本层循环终止本层循环.例例3.15:把:把100200之间的不能被之间的不能被3整除的数输出整除的数输出.#include void main(void)int n;for(n=100;n=200;n+)if(n%3=0)continue;printf(“%d”,n);226.7 gotogoto语句语句1、一般形势为、一般形势为:goto 语句标号语句标号;2、例:、例:100#include 求求 n void main()n=1 int i,sum=0;i=1;运行结果为运行结果为:5050 loop:if(i=100)sum=sum+i;i+;goto loop;printf(“%d”,sum);3、说明:目前、说明:目前goto语句很少使用语句很少使用,过多的使用过多的使用goto语句会降低语句会降低程序的可读性。程序的可读性。236.8 应用举例应用举例例例3.17:输入一行字符,分别统计其中字母、空格、数字及其他字符的个数。输入一行字符,分别统计其中字母、空格、数字及其他字符的个数。分析:分析:1 读入一个字符到变量读入一个字符到变量c 2 判断判断c是哪一类,再给相应计数的变量加是哪一类,再给相应计数的变量加1 3 重复重复1、2直到直到c等于等于n#include void main(void)int letter=0,space=0,digit=0,other=0;char c;while(c=getchar()!=n)if(c=a&c=A&c=0&c=9)digit+;elseother+;printf(“letter=%d,space=%d,digit=%d,other=%dn”,letter,space,digit,other);246.8 应用举例应用举例例例3.18:打印出打印出21000之间的所有完数。完数指这样的数,该数的各个因子之之间的所有完数。完数指这样的数,该数的各个因子之和等于该数本身。和等于该数本身。分析:例如:分析:例如:6=1+2+3 28=1+2+4+7+14所以所以6和和28都是完数。都是完数。典型枚举问题,即取典型枚举问题,即取21000之之间的每个数间的每个数m,计算,计算m的因子的因子和,即可判别和,即可判别m是否是完数是否是完数#include void main(void)int m,i,s;for(m=2;m=1000;m+)s=0;for(i=1;i=m/2;i+)if(m%i=0)s+=i;if(m=s)printf(“%6d”,m);printf(“n”);256.8 应用举例应用举例例例3.19:编程求编程求266.8 应用举例应用举例#include void main(void)double x,x0=0,x1=2,y,step,result=0;int n=2000;step=(x1-x0)/n;for(x=x0;xx1;x+=step)y=1+x*x;result+=y*step;printf(“result=%.2fn”,result);276.8 应用举例应用举例例例3.20:求求Fibonacci数列的前数列的前20项。项。Fibonacci数列满足以下递推关系:数列满足以下递推关系:f(0)=1 f(1)=1 f(n)=f(n-1)+f(n-2)#include void main(void)long f0=1,f1=1,f2;int i;printf(“%8ld%8ld”,f0,f1);for(i=3;i=20;i+)f2=f0+f1;printf(“%8ld”,f2);if(i%6=0)printf(“n”);f0=f1;f1=f2;286.8 应用举例应用举例例例3.21:除法测试,随机产生除法测试,随机产生10道题,被除数道题,被除数20200,除数,除数29,用户键入答,用户键入答案,每题案,每题10分,计算机判卷。分,计算机判卷。分析:分析:1 产生随机数产生随机数a、b,直到,直到a能被能被b整除整除 2 显示除法式显示除法式a/b,用户输入答案到变量,用户输入答案到变量c 3 判断判断c是否等于是否等于a/b,是,则加,是,则加1分,否则本题不加分分,否则本题不加分 4 重复重复13共共10次次问题,如何产生随机数?问题,如何产生随机数?库函数库函数 rand()srand()296.8 应用举例应用举例#include#include void main(void)int i,a,b,c,s=0;for(i=1;i=10;i+)doa=rand()%181+20;b=rand()%8+2;while(a%b);printf(“%d/%d=”,a,b);scanf(“%d”,&c);if(a/b=c)s+=10;printf(“ok!n”);elseprintf(“error!n”);printf(“score=%dn”,s);30THE ENDTHE END31