第六章循环控制如:sum=1+2+3+…+100;,i1002i实际问题:一组重复执行的语句。一个同学在运动场跑十圈,另一个同学计数,每跑一圈输出所跑圈数信息。例:C语言用四种形式循环while语句do…while语句for语句if语句与goto语句goto语句及与if语句构成循环1.goto语句2.用if构成循环.例:求100211001ii语法:goto标号;功能:无条件转向标号处。标号:用标识符命名。main(){inti,sum=0;i=1;loop:if(i=100){sum=sum+i;i++;gotoloop;}printf(%d,sum);}}算法描述:1)i=1,sum=0;2)若i≤100,sum=sum+i,否则,转4);3)i=i+1,转2);4)输出结果,结束。思考:当循环次数由外部输入时的处理??若这100个数是任意的??若循环控制由一个特定的条件控制??while语句1.语法形式:while(表达式)语句块2.执行过程:先判断表达式的值。若0(为真)则执行紧随其后的一条语句或块,返回2否则while执行完毕。当型循环––while语句:流程图:表达式语句0=0下一语句将上例用while语句写出main(){inti=1,sum=0;while(i=100){sum+=i;i++;}}提示:循环体中应有使表达式=0的语句。否则会出现无限循环–––死循环。例:输入10个学生某门课程的成绩,求:平均分。对任意的10个int型数,找最大者。歌唱大赛评分时,有十个评委,记分规则为:去掉一个最高分和一个最低分,再求平均得分。银行存款年息r,第一年存x元,每年连本带利存,求n年后本息为多少。思考:当循环次数由外部输入时的处理??若这100个数是任意的??若循环控制由一个特定的条件控制??直到型do…while语句特点是:至少执行循环语句一次。功能:先执行语句,再判表达式的值,若0,重复,否则结束循环。流程图语句表达式0=0语法:do{语句}while(表达式);main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i=100);printf(%d,sum);}程序如下:do…while语句的循环体一定要用花括号括起来。for语句1.语法:1.计算表达式1,2.执行表达式2,若表达式2的值0,则执行语句块;转3。否则:结束循环3.计算表达式3,转2.一种形式更为灵活的循环语句。2.执行过程:for(表达式1;表达式2;表达式3)语句块3.流程图:计算表达式1求表达式2值语句计算表达式3结束for语句=0(假)0(真)用for语句写出上述例子for用while代替的流程表达式1;while(表达式2){语句表达式3;}for(i=1;i=100;i++)sum+=i;for语句完全可以用while代替,但for直观、简单、方便4.for语句的几种特例例:任意输入两个整数a,b,求biaiimain(){inti,j,a,b,sum;printf(pleaseinputtwonumber!\n)scanf(%d%d,&a,&b);i=a;j=b;可以省略表达式1,但须保留分号;这时在for之前就得赋值给循环变量;书上P70页说明1。if(ab){i=b;j=a;}for(;i=j;i++)sum=sum+i;printf(\nsum=%d,sum);}表达式2一般不可省略,否则为无限循环相当于:while(1){sum=sum+i;i++;}例:for(i=1;;i++)sum=sum+i;相当于条件永真、永不为0,若用while表示表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。例:for(sum=0,i=1;i=100;){sum=sum+i;i++;}若同时省略表达式1,表达式3,则相当于while(表达式2)语句。相当于while(i=100){sum+=i;i++;}例:for(;i=100;){sum+=i;i++;}三个表达式均省略即for(;;)语句则相当于while(1)语句表达式1、表达式3可以是逗号表达式,以使循环变量值在修改时可以对其它变量赋值。例:for(sum=0,i=1;i=100;i++,i++)相当于:sum=0;for(i=1;i=100;i=i+2)表达式2可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体.例:for(i=0;(c=getchar())!='\n';i+=c);例:输入n个学生的成绩,请统计其平均分。分析:循环次数是n,就是确定的,由键盘输入scanf(“%d”,&n);for(i=1;i=n;i++){}输入每个学生的成绩grade,并累计到sumscanf(“%d”,&grade);sum+=grade每次循环处理一个学生的信息……求平均=sum/n与其它语言一样,当循环体中又包含了另一个完整的循环语句时–––嵌套。C有三种循环语句,均可以相互嵌套:while(){…while(){…}}循环的嵌套内嵌各循环间在结构上只能“包含”,不能“交叉”for(;;){…while(){}do{}while();…}for(i=1;i=3;i++){for(j=1;j=3;j++)printf(“%5d”,i*j);printf(“\n”);}请说出其功能例:但:while(){…while(){}…}会理解为正确的形式。但要注意语句的包含关系例:求100—200间的素数。分析:1)对任一个数m,判断其是否是素数的方法一般可采用:从2—m/2,若都不能整除m,则m是素数。2)它是从m=100开始,直到m=200的循环1),构成外循环。break语句和contiune语句例:计算圆的面积r2,半径取1,2,3,4…,当面积100时结束。for(r=1;1;r++){area=pirr;if(area100)break;}printf(“%f”,area);break语句语法:break;功能:强制结束本层循环语句或结束本层switch语句。从结构化程序要求出发,用break,退出循环,进入for语句的下一条语句。注:break只能用于循环语句和switch语句。continue语句一般语法形式:continue;功能:结束本次循环,即跳过循环体中本语句下面尚未执行过的语句,直接进行下一次循环的判定(对for语句,首先执行表达式3)main(){intn;for(n=100;n200;n++)if(n%3!=0)printf(%d,n);}编写程序,打印100~200中不能被3整除的数。main(){intn;for(n=100;n=200;n++){if(n%3==0)continue;printf(%d,n);}}用continuecontinue语句起了结束本次循环的作用。程序举例例1:求Fibonacci数例:1,1,2,3,5,8,…前40个数。即设有一对新生兔子,从第三个月开始它们每个月都生育一对兔子,按此规律,并假设没有死亡,40个月后共有多少对兔子。规律:F1=1,F2=1Fn=Fn–1+Fn–2(n2)递推类型算法设计的方法是不断用旧值递推出新值,用新值代替旧值的过程.要素:递推初值,递推公式,递推次数程序要点:每输出4个数时换行。f1=f1+f2;f2=f1+f2;交替的结果正好为一序列程序如下:main(){longintf1,f2;inti;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;}}f1=1,f2=1fori=1to20输出f1,f2f1=f1+f2f2=f2+f1例:“百钱百鸡问题”:大公鸡5元一只,大母鸡3元一只,小鸡1元三只,问一百元刚好可买大公鸡、大母鸡、小鸡各多少只(至少各有一只以上),使鸡的总数正好是100只即对问题的所有可能状态都分别测试到,直到找到解或将全部可能状态都测试过为止的过程分析:设可买公鸡、母鸡、小鸡各x,y,z=100-x-y只,则必须满足z%3==0&&5*x+3*y+(100-x-y)/3==100,则程序执行可结束。用穷举法进行如下://百钱百鸡问题#includestdio.hvoidmain(){intx=0,y=0,z=0;//x,y,z为大公鸡、大母鸡、小鸡只数printf(大公鸡大母鸡小鸡\n\n,x,y,z);for(x=1;x=100/5;x++)for(y=1;y=100/3;y++){z=100-x-y;if(z%3==0&&5*x+3*y+z/3==100){printf(%6d%12d%12d\n\n,x,y,z);}}}百马百担问题:有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问大、中、小马各多少匹。水果拼盘问题:有苹果、桔子、香蕉、菠萝、梨5种水果拼盘,每个水果拼盘一定有3个不同的水果,问可以制作出多少种水果拼盘?爱因斯坦阶梯问题:设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶,每步跨5阶,最后余4阶,每步跨6阶,余5阶,跨7阶,正好到阶梯顶。求最小阶数。对水果拼盘问题:苹果、桔子、香蕉、菠萝、梨的拼法,按规范方法处理:先选择苹果,则第二种水果只能从桔子到梨进行选择,是一种渐进的选择。同理,第三种水果只能从香蕉到梨进行选择。由于是渐进关系,所以可设1-5分别代表苹果到梨,构成循环。也可分别设为符号常量,当然也可用枚举。例:两个乒乓球队进行比赛,各出3人,甲队为A、B、C3人,乙队为X、Y、Z3人。已抽签决定了比赛名单,有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编程找出3对赛手的名单。#includestdio.h//乒乓球队比赛问题voidmain(){chara,b,c;//甲队三名队员a,b,c,乙方三名队员x,y,zfor(a='X';a='Z';a++)for(b='X';b='Z';b++){if(a!=b){for(c='X';c='Z';c++){if(c!=a&&c!=b)if(a!='X'&&c!='X'&&c!='Z')printf(a--%cb--%cc--%c,a,b,c);}}}}