《(5)--ch5 循环结构程序设计1.ppt》由会员分享,可在线阅读,更多相关《(5)--ch5 循环结构程序设计1.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第5章循环结构程序设计 核心概念核心概念n重复任务的处理n批数据的处理n循环结构n当循环结构n直到循环结构n循环条件的动态变化n循环与数组学习目标学习目标n理解循环结构的含义n掌握for循环的用法n掌握while循环和do-while循环的用法n掌握循环结构中break语句和continue语句的用法n熟练掌握循环结构程序设计章节内容章节内容n5.1 班级体重指数计算器n5.1.1 while循环n5.1.2 do-while循环n5.1.3 for循环n5.1.4 循环的嵌套n5.1.5 goto语句和标号n5.1.6几种循环语句的比较n5.2 break和continue语句n5.2.1
2、循环中的break语句n5.2.2continue 语句n5.3 程序举例5.1 班级体重指数计算器班级体重指数计算器 n智能体重指数计算器只要输入某人身高和体重,通过计算和分析判断,就可以输出其BMI值、BMI分类和健康信息。假如一个班级有30人进行健康检查,则该程序需要重复执行30次,使用比较繁琐。n例例5.1 班级体重指数计算器n利用C语言提供while循环控制语句,设计一个功能更强的智能体重计算器,能够处理任意多个人BMI的计算和健康判断。每次计算出一个学生的BMI信息,都会提示是否退出程序,如果输入字母Y或y,程序会结束执行;如果按任意键,则进行下一个学生的BMI计算。为了区分多个学
3、生的健康信息,要求输入学生学号。5.1 班级体重指数计算器班级体重指数计算器#include#include /*fflush函数的头文件*/void main()float hight,weight,bmi;/*声明身高hight和体重weight两个变量*/char c;/*接受用户从键盘输入的字符*/int no;/*存储学号*/printf(-班级智能体重指数计算器-n);while(1)/*循环while语句,表达式为1表示永远为真*/printf(n请输入您的学号:);/*显示提示信息*/scanf(%d,&no);/*输入学生学号*/printf(请输入您的身高(厘米):);/*
4、显示提示信息*/scanf(%f,&hight);/*输入身高*/printf(请输入您的体重(公斤):);/*显示提示信息*/5.1 班级体重指数计算器班级体重指数计算器 scanf(%f,&weight);/*输入体重*/bmi=weight/(hight/100*hight/100);/*利用公式计算出bmi*/printf(-学号%d同学的健康信息-n,no);printf(1.您的体重指数:%5.2f n,bmi);/*输出bmi的值*/printf(2.根据WHO标准,您BMI处于);if(bmi18.5)printf(体重过低n);printf(3.相关疾病发病低,但其它疾病危险
5、性增加n);else if(bmi25)printf(正常范围n);printf(3.相关疾病发病的危险性处于平均水平n);else if(bmi30)printf(肥胖前期n);printf(3.相关疾病发病的危险性增加n);5.1 班级体重指数计算器班级体重指数计算器 else if(bmi35)printf(I度肥胖n);printf(3.相关疾病发病的危险性中度增加n);else if(bmi40)printf(II度肥胖n);printf(3.相关疾病发病的危险性严重增加n);elseprintf(III度肥胖n);printf(3.相关疾病发病的危险性非常严重增加n);5.1 班级
6、体重指数计算器班级体重指数计算器 fflush(stdin);/*清除键盘缓冲区*/nprintf(如果退出程序,请输入字符Y,继续请按任意键:);nc=getchar();nif(c=Y|c=y)nbreak;/*退出循环*/nfflush(stdin);/*清除键盘缓冲区*/nnprintf(谢谢,再见!n);n5.1 班级体重指数计算器班级体重指数计算器 n运行结果如下:n-班级智能体重指数计算器-n请输入您的学号:1n请输入您的身高(厘米):176n请输入您的体重(公斤):75n-学号1同学的健康信息-n1.您的体重指数:24.21n2.根据WHO标准,您BMI处于正常范围n3.相关疾
7、病发病的危险性处于平均水平n如果退出程序,请输入字符Y,如果继续请按任意键:nn请输入您的学号:2n请输入您的身高(厘米):180n请输入您的体重(公斤):81n-学号2同学的健康信息-n1.您的体重指数:25.00n2.根据WHO标准,您BMI处于肥胖前期n3.相关疾病发病的危险性增加n如果退出程序,请输入字符Y,如果继续请按任意键:Yn谢谢,再见!5.1 班级体重指数计算器班级体重指数计算器 n本例添加了一个while循环语句和提示用户是否退出程序的判断,其他的基本一样。当程序执行while语句时,首先判断循环的条件,如果为非0,执行while包含的语句;如果为0,结束while语句,执行
8、while语句的下一语句。n循环控制结构是结构化程序设计所采用的三种基本控制结构之一,只要编写少量的代码,让计算机反复执行,完成大量的同类运算,这样会使程序语句减少,整个程序结构清晰。nC语言的循环结构由三部分组成:关键字关键字、循环条件循环条件和循环循环体体(某段程序),如果循环条件成立(即为真),反复执行循环体,直到循环条件不成立为止。C语言提供了while、do-while和for三种语句来实现循环结构。5.1.1 while循环循环nwhile语句的一般形式为:nwhile(表达式P)n语句S;n表达式P是循环条件,语句S为循环体。while语句的语义是:先计算表达式P的值,当值为真(
9、非0)时,执行循环体语句,直到表达式的P值为假(0)为止。n注意,在while循环中,循环条件表达式的圆括号不能省略。该表达式中一般应含有变量,并且在循环体中变化,这样才能使循环条件发生变化,否则,会永远循环下去。n循环体可以是一条语句,也可以是多条语句组成的复合语句,也可以是空语句,即仅仅是一个分号。5.1.1 while循环循环 while语句执行流程图表达式循环体TFwhile5.1.1 while循环循环n例例5.2 用while语句求1100的累加和。nvoid main()n int i,sum=0;n i=1;/*循环变量赋初值*/n while(i=100)/*循环条件*/n
10、n sum=sum+i;n i+;/*修正循环变量*/n n printf(sum=%dn,sum);nn运行结果为:nsum=50505.1.1 while循环循环n例例5.3 统计从键盘输入一行字符的个数。nvoid main()n int n=0;n printf(input a string:n);n while(getchar()!=n)n n+;n printf(count is%dn“,n);nn 本例程序中的循环条件为getchar()!=n,其含义是从键盘输入的字符只要不是回车就继续循环。循环体n+完成对输入字符个数计数,但是没有统计最后输入的回车符。从而程序实现了对输入一行
11、字符的字符个数统计。5.1.1 while循环循环例例5.4 从0开始连续输出n个偶数。void main()int a=0,n;printf(n input n:);scanf(%d,&n);while(n-)printf(%d ,a=a*2);a+;程序运行结果如下:input n:50 2 4 6 8n 上面程序中,如果输入了大于0的整数n,执行n次循环,每执行一次,n值减1。如果用户输入了0,循环条件为假,循环体一次都不执行。如果输入了负整数,则出现永远的循环。所以,在设计循环条件的时候一定要仔细考虑,避免出现死循环的情况。5.1.1 while循环循环n例例5.5 求两个正整数的最大
12、公因子。n采用欧几里德算法求解最大公因子,其NS图如5-2所示。输入两个正整数m,nn!=0r=m%nm=nn=r输出最大公共因子m5.1.1 while循环循环void main()int m,n,r;printf(please input two positive integer:);scanf(%d%d,&m,&n);while(n!=0)r=m%n;m=n;n=r;printf(their greatest common divisor is%d.n,m);程序运行结果如下:please input two positive integer:320 198their greatest
13、common divisor is 2.5.1.2 do-while循环循环 ndo-while语句的一般形式为:n don 语句Sn while(表达式P);n表达式P是循环条件,语句S为循环体。do-while语句的执行过程:首先执行循环体中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。do-while和while语句的区别区别是:do-while语句,先执行循环体,后判断条件,所以do-while循环至少要执行一次循环语句,do-while语句执行过程可用右图表示。表达式语句TFdo-while5.1.2 do-while循环循环n循环条件的括号不能省略,最
14、后的分号也不能省略,它表示do-while语句的结束(如果省略,则可以认为是while语句的开始部分,这样产生了混淆)。如果循环体是由多条语句组成的复合语句,while通常和最后一个花括号在一行上,这样可以清晰表示do-while的结束。n例例5.6 用do-while语句求1100的累加和。nvoid main()n int i,sum=0;n i=1;n don n sum=sum+i;n i+;n while(i=100);n printf(%dn,sum);n 5.1.2 do-while循环循环n例5.2和5.6都是求解1100的累加和,while和do-while两种实现的循环体和
15、循环条件相同。所以可以这样判定,对对于同一个问题如果循环体至少执行一次于同一个问题如果循环体至少执行一次,while和do-while的处理是等价的。也可以这样说,当while的循环条件的初始值为“真”时,while和do-while得到的结果是一样的。n有的问题处理逻辑比较适合于先处理,再判断条件,这时采用do-while。有的问题适合于先判断条件,再处理,这时采用while。无论采用哪个语句,都要进行循环变量的循环变量的初始化和修正初始化和修正。为了使循环结构中这两个部分更加清晰,C语言提供了一个for语句,使这两部分与循环条件一起成为其必要的成分。这也是for语句使用更加灵活、更为广泛的
16、原因。5.1.3 for循环循环nfor语句不仅适合于循环次数已经确定的情况,还适合于循环次数不确定的情况,所以说for语句完全可以替代while语句。for语句的一般形式为:for(表达式1;表达式2;表达式3)语句S;n表达式2是循环条件,语句S为循环体,表达式1为设置初始条件(包括循环变量的初始化),表达式3为循环变量的调整(通常为循环变量的修改,有时称为循环步长修改),三个表达式之间用分号分隔开,两个分号都不能缺少。for语句的执行过程:5.1.3 for循环循环(1)先求解表达式1;(2)求解表达式2,若其值为真(非0),则执行循环体语句,然后执行第3步;若其值为假(0),则结束循环
17、,转到第(4)步;(3)求解表达式3,然后无条件转回第(2)步继续执行;(4)循环结束,继续执行for语句下面的语句;其执行过程可用图5-4表示。求解表达式1表达式2计算表达式3语句TFfor5.1.3 for循环循环nfor语句可以等价转换为while语句:表达式1;while(表达式2)语句S;表达式3;n相比之下,for语句最简单、更容易理解,减少出错的几率,所以for语句可理解为:for(循环变量赋初值;循环条件;循环变量增量或减量)循环体语句;5.1.3 for循环循环例例5.7 用for语句求1100的累加和。#include void main()int i,sum=0;for(
18、i=1;i=100;i=i+1)sum=sum+i;printf(sum=%dn,sum);n在循环语句中,习惯用诸如 i,j,k 之类的字母作为循环变量,用来控制循环的执行次数。这些变量又称为循环控制变量。5.1.3 for循环循环nfor循环中的表达式1(循环变量赋初值)、表达式2(循环条件)和表达式3(循环变量增量)都是选择项选择项,即可以缺省,但它们之间的分隔符“;”不能缺省。n(1)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值。n例如:int i=1n for(;i=100;i+)n sum=sum+i;n(2)省略了“表达式2(循环条件)”,表示循环条件永远为真
19、循环条件永远为真,这时成为死循环。此时循环体需要用if语句进行条件判断,用break退出for循环。n例如:for(i=1;i+)n if(i=100)n sum=sum+i;n elsen break;5.1.3 for循环循环n(3)省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在循环体语句中加入修改循环控制变量的语句。例如:for(i=1;i=100;)sum=sum+i;i+;n(4)表达式1、表达式2和表达式3都可以省略,此时for(;)相当于while(1),是一个无限循环结构,循环体需要使用if语句进行条件判断,用break退出for循环。5.1.3 fo
20、r循环循环n(5)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。例如:for(sum=0,i=1;i=100;i+)sum=sum+i;或:for(i=0,j=100;i=100;i+,j-)k=i+j;n(6)循环体可以是简单语句、复合语句,也可以是空语句。5.1.4 循环的嵌套循环的嵌套n一个循环体内又包含着另外一个完整的循环,成为循环的嵌套。如果内循环中也是嵌套循环就是多层循环。while、do-while和for三个循环语句可以相互嵌套。n例例5.8已知每只公鸡5元,每只母鸡3元,三只小鸡1元,现有100元,要买100只鸡,问公鸡、母鸡、小鸡各多少只。n设公鸡、母鸡、小鸡数
21、分别为x、y、z,根据题意:nx+y+z=100 (1)n5x+3y+z/3=100 (2)n这是不定方程组,没有办法直接求解,可以利用计算机的强大计算能力,采用穷举法穷举法输出所有的买鸡方案。x的变化范围为020,y的变化范围为033,由方程(1)求出小鸡数z。从而,由方程(2)可判断公鸡、母鸡、小鸡的总价值是否等于100元。若等于100,则输出结果。程序及运行情况如下:5.1.4 循环的嵌套循环的嵌套void main()int x,y,z;for(x=0;x=20;x+)for(y=0;y=33;y+)z=100-x-y;if(5*x+3*y+z/3)=100)printf(Cock=%
22、2d,Hen=%2d,Chick=%2dn,x,y,z);运行结果为:Cock=0,Hen=25,Chick=75Cock=4,Hen=18,Chick=78Cock=8,Hen=11,Chick=81Cock=12,Hen=4,Chick=845.1.4 循环的嵌套循环的嵌套例例5.9打印56阶矩阵。1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 1819 20 21 22 23 2425 26 27 28 29 305.1.4 循环的嵌套循环的嵌套#include void main()int i,j,n=0;for(i=0;i5;i+)for(j=0;j
23、6;j+)printf(%4d,+n);printf(n);程序运行结果如下:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30多层循环嵌套时,可采用内层循环右缩进格式书写,以使结构清晰。在使用循环变量时,内外、层一定要采用区分度比较大的循环变量,以免产生混乱,特别是在while和do-while循环中。循环的嵌套必须保证,内层的循环语句是外层循环体中的一条语句,内外层两个循环体不能交叉。5.1.5 goto语句和标号语句和标号nC语言提供了可随意跳转可随意跳转的goto语句以及标记跳
24、转位置的标号来实现循环。从理论上讲,goto语句是没有必要的,实践中不使用goto语句也可以很容易地写出代码。但是,在某些场合可以使用goto语句,程序更加有效。goto语句是一种无条件转移语句,goto 语句的一般格式为:goto 语句标号;n其中标号是一个有效的用户自定义标识符,这个标识符后面紧跟一个冒号冒号,与goto语句必须一起出现在同一个函数内同一个函数内的某个语句的前面。执行goto语句时,程序将跳转到该标号处并执行其后的语句。通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。5.1.5 goto语句和标号语句和标号例例5.10 用goto语句和if语句构成
25、循环,求1100的累加值void main()int i,sum=0;i=1;loop:sum=sum+i;i+;if(i=100)goto loop;printf(%dn,sum);5.1.6几种循环语句的比较几种循环语句的比较nfor、while和do-while三种循环,往往都能处理同一个问题。但他们有不同的特点,在实际应用中,要根据具体情况选择不同的循环结构。三种循环的不同点:n(1)使用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。n(2)使用while和do-while循环时,
26、循环体中应包括使循环趋于结束的语句(即修改某些变量使循环条件的值趋向于0的语句),for语句是在表达式3实现循环变量的改变。5.1.6几种循环语句的比较几种循环语句的比较n(3)如果循环次数在执行之前已经确定,往往选择for语句;如果循环次数是根据循环体的执行情况确定的,一般选用while或则do-while语句。虽然goto语句也可以实现循环结构,一般不选择,除非要跳出多层嵌套的循环结构。n(4)当循环体至少执行一次时,三种循环结构都可以实现,当循环体有可能一次都不执行时,不能选择do-while循环。n(5)while循环,首先是判断条件,然后,执行循环体,比较容易把握循环的次数,安全性比
27、较高。而do-while循环容易出错,在实际编程中do-while很少使用。5.2 break和和continue语句语句n循环语句都是根据事先指定的循环条件执行循环体或终止循环,实际情况有可能需要提前终止正在执行的循环操作。例如,百钱百鸡问题,如果不是寻找所有的方案,在使用穷举法时,当寻找到某个方案时,就可以结束循环的执行。n如果在循环体执行时,遇到某种情况,不想继续执行完整个循环体,而是进入下一个循环判断,这时需要continue语句来提前结束本次循环。5.2.1 循环中的循环中的break语句语句 nbreak语句的格式为:nbreak;nbreak语句用在switch中,使程序跳出sw
28、itch语句而执行switch后面的语句。在循环语句for、do-while、while中也可以使用break语句。在循环语句中,通常break语句总是与if语句联在一起,当满足条件时,使程序终止循环而执行循环的下一条语句,即满足条件时,跳出循环。5.2.1 循环中的循环中的break语句语句 例例5.11 统计键盘输入的大写字母、小写字母、数字字符、其他字符的个数,遇到#结束。#include void main()int b=0,s=0,n=0,t=0,i=1;/*b为大写字母个数,s为小写字母个数,n为数字,t为其他字符*/char c;while(1)printf(The No.is%
29、dn,i+);5.2.1 循环中的循环中的break语句语句 do c=getchar();if(c=A&c=a&c=0&c=9)n+;else t+;while(c!=n&c!=#);if(c=#)break;printf(The endn);printf(Capital letters is%dn,b);printf(Small letters is%dn,s);printf(Digits is%dn,n);printf(other character%dn,t);5.2.1 循环中的循环中的break语句语句 程序运行结果如下:The No.is 1HelloThe No.is 2123
30、45The No.is 3/*-+The No.is 4#The endCapital letters is 1Small letters is 4Digits is 5other character 8n在多层循环中,break语句只能跳出所在循环语句,不能跳出所有的循环语句5.2.1 循环中的循环中的break语句语句 例例5.12 中断嵌套循环。void main()int i,j;for(i=0;i2;i+)printf(*外层循环开始执行第%d次*n,i);for(j=0;j3;j+)printf(内层循环开始执行第%d次n,j);if(j=1)printf(执行break语句n);
31、break;printf(内层循环第%d次结束执行n,j);printf(*外层循环第%d次结束执行*n,i);printf(程序执行结束n);5.2.1 循环中的循环中的break语句语句 n程序运行结果如下:n*外层循环开始执行第0次*n内层循环开始执行第0次n内层循环第0次结束执行n内层循环开始执行第1次n执行break语句n*外层循环第0次结束执行*n*外层循环开始执行第1次*n内层循环开始执行第0次n内层循环第0次结束执行n内层循环开始执行第1次n执行break语句n*外层循环第1次结束执行*n程序执行结束5.2.1 循环中的循环中的break语句语句 n分析例5.12的程序可知,外
32、层循环应执行2次,内层循环应执行3次,但内层循环第1次执行break语句时,内层循环结束,外层循环没有受到影响。如果想跳出所有的循环,需要设置变量来实施控制,下面程序采用了外层、中间层和内层三重循环嵌套,内层中断跳出。void main()int i,j,k,running=1;for(i=0;i3&running;i+)printf(*外层循环开始执行第%d次*n,i);for(j=0;j4&running;j+)printf(中间层循环开始执行第%d次n,j);for(k=0;k4&running;k+)printf(内层循环开始执行第%d次n,k);if(k=1)printf(执行bre
33、ak语句n);running=0;break;printf(内层循环第%d次结束执行n,k);printf(中间层循环第%d次结束执行n,j);printf(*外层循环第%d次结束执行*n,i);printf(程序执行结束n);n程序运行结果如下:n*外层循环开始执行第0次*n中间层循环开始执行第0次n内层循环开始执行第0次n内层循环第0次结束执行n内层循环开始执行第1次n执行break语句n中间层循环第0次结束执行n*外层循环第0次结束执行*n程序执行结束n三层循环嵌套,通过设置running变量,控制循环的中断跳出,即外层和中间层的循环控制语句中附加了该条件,如果为假,终止所有循环。5.2
34、.1 循环中的循环中的break语句语句 ncontinue语句的作用是跳过本次循环剩余的语句而强行执行下一次循环,即只结束本次循环的执行。continue语句只能用在for、while、do-while三个循环语句中,与if条件语句一起使用来加速循环,continue语句对循环执行过程的影响如图。5.2.2 continue 语句语句while(表达式1).if(表达式2)continue;.do .if(表达式2)continue;.while(表达式1);for(表达式1;表2;表3).if(表达式4)continue;.n在while语句中,if语句的判断条件表达式2如果成立,执行co
35、ntinue语句,则直接进行表达式1的计算,决定是否进行下次循环。n在do-while语句中,if语句的判断条件表达式2如果成立,执行continue语句,则直接进行表达式1的计算,决定是否进行下次循环。n在for语句中,if语句的判断条件表达式4如果成立,执行continue语句,则直接进行表达式3的计算,再进行表达式2的计算,决定是否进行下次循环,这与while和do-while循环语句不同的地方。5.2.2 continue 语句语句n例例5.13 求输入的十个整数中正整数的个数及其平均值。nvoid main()nint i,a,num=0,sum=0;nfor(i=0;i10;i+)
36、nnscanf(%d,&a);nif(ak真假输出m是素数 输出m不是素数#include#include void main()int m,i,k;printf(please input the number:);scanf(%d,&m);k=(int)sqrt(m);/*强制类型转换,只取整数部分*/for(i=2;ik)printf(%d is a prime numbern,m);else printf(%d is not a prime number.n,m);运行结果如下:please input the number:3737 is a prime number.5.3程序举例程
37、序举例n例例5.15 求100至200间的全部素数。n偶数肯定不是素数,所以从101开始测试到199,步长为2,这样可以减少一半的测试,提高效率。本程序设计一个素数个数计数器,这样可以实现10个素数一行的显示。5.3程序举例程序举例#include#includevoid main()int m,i,k,n=0;/*n为素数个数计数器,初始化为0*/for(m=101;m200;m=m+2)k=(int)sqrt(m);for(i=2;ik)printf(%4d,m);n+;if(n%10=0)/*每输出10个素数就换行*/printf(n);printf(n);5.3程序举例程序举例n运行结
38、果如下:n101 103 107 109 113 127 131 137 139 149n151 157 163 167 173 179 181 191 193 197n1995.3程序举例程序举例例例5.16 从键盘上输入若干个学生成绩,计算平均成绩。#include void main()float score,sum=0;int num=0;printf(Please input scores:);scanf(%f,&score);while(score=0)sum+=score;num+;scanf(%f,&score);printf(%d students average score
39、 is%fn,num,sum/num);运行结果如下:Please input scores:91 80 77 56 65-15 students average score is 73.8000005.3程序举例程序举例n例例5.17 旅客的航空逾重行李费用计算。n例4.16只能对一名旅客逾重行李费进行计算,利用本章的循环控制结构,可以实现多名旅客的逾重行李费计算。当输入行李重量为负数时,退出程序。n#include nvoid main()nnfloat weight,charge;nprintf(This is airport-charge program!n);nprintf(Ente
40、r the luggage s weight,please(input negative to exit):n);5.3程序举例程序举例while(1)scanf(%f,&weight);if(weight50)charge=(weight-50)*30+10*20+10*15+10*12;else if(weight40)charge=(weight-40)*20+10*15+10*12;else if(weight30)charge=(weight-30)*15+10*12;else if(weight20)charge=(weight-20)*12;elsecharge=0;printf
41、(The charge is:%6.2fn,charge);printf(Enter the next airports weight,please:n);printf(The airport-charge program is end.n);5.3程序举例程序举例n程序运行结果如下所示:nThis is airport-charge program!nEnter the luggage s weight,please(input negative to exit):n89nThe charge is:1640.00nEnter the next airports weight,please:n30nThe charge is:120.00nEnter the next airports weight,please:n-1nThe airport-charge program is end.n以上运程序虽然解决了连续工作问题,但是每位旅客的数据都是用完就丢了,没有保存下来,当然就无法查询了。下一章将学习数组,利用数组就可以实现保存和查询功能了。5.3程序举例程序举例作业作业n3、7、8、9
限制150内