资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,循环结构程序设计,学习的意义,许多实际问题中往往需要有规律地重复某些操作,如菜谱中可以有:,“,打鸡蛋直到泡沫状,”,这样的步骤,也就是说,在鸡蛋没有打成泡沫状时要反复地打。相应的操作在计算机程序中就体现为某些语句的重复执行,这就时所谓的,循环,。,下面来思考一个问题:,如何编程来计算,1+2+3+100,?,程序如下:,int s=0;,s=s+1;,s=s+2;,s=s+3;,s=s+100;,printf(“s=%d”,s);,重复,100,次,?,有!就是用循环来编程。,有没有更好的方法来计算呢?,第,3,章已讨论,程序结构,顺序结构,选择结构,循环结构,继续讨论,前面已讨论,While,、,do-while,、,for,语句,循环嵌套,Break,、,continue,、,goto,语句,exit(),函数,循环结构类型的选择及转换,循环结构程序设计举例,小结,学习目标,理解循环结构的含义;,掌握,C,语言三种循环结构的特点;,掌握,while,、,do-while,、,for,、,goto,、,break,、,continue,语句的使用方法;,掌握不同循环结构的选择及其转换方法;,掌握混合控制结构程序设计的方法。,学习内容,循环结构的程序设计,1.while,语句,一般形式:,while(,表达式,),循环体语句;,执行流程:,F,T,expr,循环体,while,其中:,while,后面的括号()不能省。,while,后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。,表达式的值是是循环的控制条件。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句,。,特点:先判断表达式,再执行循环体,【,例,】,用,while,语句求,1,100,的累计和。,#include,void main(),int i=1,sum=0;,while(i=100),sum+=i;,i+;,printf(sum=%dn,sum);,循环初值,循环终值,循环条件,循环体,循环变量增值,运行结果:,sum=5050,【,例,】,显示,1,10,的平方,#include,void main(),int i=1;,while(i 0),/a 0,为假,,b+,不可能执行,b+;,int num=0;,/,字符计数,while(1),if(getche()=n),/,如果输入的字符是回车符,则返回,return;,num+;,(4),在执行,while,语句之前,循环控制变量必须初始化,否则执行的结果将是不可预知的。,(5),要在,while,语句的某处(表达式或循环体内)改变循环控制变量,否则极易构成死循环。,(6),允许,while,语句的循环体又是,while,语句,从而形成双重循环。,while,语句注意事项:,例:计算,10!,#include,void main(),int i;,/i,应赋初始值,10,long s=1;,while(i=1),s*=i-;,printf(10!=%ldn,s);,i=1;,while(i 100),/,死循环,因为,i,的值没变化,永远小于,100,sum+=i;,printf(sum=%dn,sum);,i=1;,while(i=9),j=1;,while(j=9),printf(%d*%d=%dn,i,j,i*j);,j+;,i+;,【,例,】,求两个正整数的最大公因子。,我们采用,Euclid,(欧几里德)算法来求最大公因子,其算法是:,(1),输入两个正整数,m,和,n,。,(2),用,m,除以,n,,余数为,r,,如果,r,等于,0,,则,n,是最大公因子,算法结束,否则,(3),。,(3),把,n,赋给,m,,把,r,赋给,n,,转,(2),。,#include,void main(),int m,n,r;,printf(Please input two positive integer:);,scanf(%d%d,while,(n!=0),r=m%n;,/,求余数,m=n;,n=r;,printf(Their greatest common divisor is%dn,m);,运行结果:,Please input two positive integer:24 56,Their greatest common divisor is 8,2.do_while,语句,一般形式:,do,循环体语句;,while(,表达式,);,执行流程:,其中:,while,后面的括号()不能省。,while,最后面的分号,;,不能省。,while,后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。,表达式的值是是循环的控制条件。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句,。,F,T,expr,循环体,do,while,特点:先执行循环体,再判断表达式,【,例,】,用,do_while,语句求,1,100,的累计和。,#include,void main(),int i=1,sum=0;,do,sum+=i;,i+;,while(i 0);,(1),如果,do-while,后的表达式的值一开始就为假,循环体还是要执行一次。,(2),在,if,语句、,while,语句中,表达式后面都不能加分号,而在,do-while,语句的表达式后面则必须加分号,否则将产生语法错误。,(3),循环体中的语句可为任意类型的,C,语句。,(4),和,while,语句一样,在使用,do-while,语句时,不要忘记初始化循环控制变量,否则执行的结果将是不可预知的。,(5),要在,do-while,语句的某处(表达式或循环体内)改变循环控制变量的值,否则极易构成死循环。,(6)do-while,语句也可以组成多重循环,而且也可以和,while,语句相互嵌套。,3.for,语句,一般形式:,for(,表达式,1,;表达式,2,;表达式,3),循环体语句;,执行流程:,其中:,for,后面的括号()不能省。,表达式,1,:,一般为赋值表达式,给控制变量赋初值。,表达式,2,:,关系表达式或逻辑表达式,循环控制条件。,表达式,3,:,一般为赋值表达式,给控制变量增量或减量。,表达式之间用分号分隔。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句。,F,T,expr2,循环体,for,expr1,expr3,for,语句很好地体现了正确表达循环结构应注意的三个问题:,控制变量的初始化。,循环的条件。,循环控制变量的更新。,【,例,】,用,for,语句求,1,100,的累计和。,#include,void main(),int i,sum=0;,for(i=1;i=100;i+),sum+=i;,printf(sum=%dn,sum);,运行结果:,sum=5050,for,语句注意事项:,例:计算,1*2+3*4+5*6+99*100,。,int i,j;,long sum=0;,for(i=1,j=2;i=99;i=i+2,j=j+2),sum+=i*j;,printf(sum=%ldn,sum);,(1),表达式,1,、表达式,2,、和表达式,3,可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。,逗号表达式,逗号表达式,#include,void main(),int i,sum=0;,i=1;,for(;i=100;i+),sum+=i;,printf(sum=%dn,sum);,#include,void main(),int i,sum=0;,i=1;,for(;i 100)break;,sum+=i+;,printf(sum=%dn,sum);,省掉表达式,1,2,3,for,语句注意事项:,for(a=1;a+),printf(,(3),表达式,2,如果为空则相当于表达式,2,的值是真,。,死循环!,(4),循环体中的语句可为任意类型的,C,语句。,(5)for,语句也可以组成多重循环,而且也可以和,while,语句和,do-while,语句相互嵌套。,(6),循环体可以是空语句。,例:计算用户输入的字符数(当输入是回车符时统计结束,),。,#include,void main(),int n=0;,printf(input a string:n);,for(;getchar()!=n;n+),;,printf(%d,n);,表示循环体为空语句,并非表示,for,语句结束,三种循环可互相嵌套,层数不限,外层循环可包含两个以上内循环,但不能相互交叉,嵌套循环的执行流程,(1)while(),while(),.,(2)do,do,while();,.,while();,(3)while(),do,while();,.,嵌套循环的跳转,禁止:,从外层跳入内层,跳入同层的另一循环,向上跳转,4.,循环嵌套,(4)for(;),do,while();,while(),.,外循环,内循环,内循环,【,例,】,循环嵌套,输出九九表,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,3,6,9,12,15,18,21,24,27,9,18,27,36,45,54,63,72,81,.,i,j,#include,void main(),int i,j;,for(i=1;i 10;i+),printf(%4d,i);,printf(n-n);,for(i=1;i 10;i+),for(j=1;j 10;j+),printf(j=9)?%4dn,:%4d,i*j);,i10,printf,假,(0),真,(,非,0),i=1,j+,j=1,j10,真,(,非,0),假,(0),i+,外循环,内循环,for(i=1;i10;i+),for(j=1;j=a&c=z),/,是小写字母,putchar(c-a+A);,/,输出其大写字母,else,/,不是小写字母,break;,/,循环退出,运行结果:,howareyou,HOWAREYOU,方法:,通过设置一标志变量,tag,,然后在每层循环后加上一条语句:,if(tag)break;,其值为,1,表示跳出循环体,为,0,则不跳出。,for(),while(),if()break;,while,循环后的第一条语句,int tag=0;,for(),while(),if(),tag=1;,break;,if(tag)break;,for,循环后的第一条语句,多重循环中,,break,的使用,问:在嵌套循环的情况下,如何让,break,语句跳出最外层的的循环体?,continue,语句,功能:,结束本次循环,跳过,循环体中,尚未执行的语句,进行下一次是否执行循环体的判断。,说明:,(1),仅用于循环语句中,。,(2),在嵌套循环的情况下,,continue,语句只对包含它的,最内层,的循环体语句起作用。,for(),while(),if(),continue;,while,循环后的第一条语句,【,例,】,求输入的十个整数中正数的个数及其平均值。,#include,void main(),int i,a,num=0;,float sum=0;,for(i=0;i 10;i+),scanf(%d,/,输入一整数,if(a=0),continue;,/,如果为负,则输入下一个整数,num+;,/,正数个数增,1,sum+=a;,/,正数和累加,printf(%d plus integers sum:%.0fn,num,sum);,printf(average value:%.2fn,sum/num);,运行结果:,8 plus integers sum:45,average value:5.63,假设输入的,10,个整数为:
展开阅读全文