c语言第5章-循环结构.ppt

上传人:牧羊曲112 文档编号:6504254 上传时间:2023-11-07 格式:PPT 页数:61 大小:714KB
返回 下载 相关 举报
c语言第5章-循环结构.ppt_第1页
第1页 / 共61页
c语言第5章-循环结构.ppt_第2页
第2页 / 共61页
c语言第5章-循环结构.ppt_第3页
第3页 / 共61页
c语言第5章-循环结构.ppt_第4页
第4页 / 共61页
c语言第5章-循环结构.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《c语言第5章-循环结构.ppt》由会员分享,可在线阅读,更多相关《c语言第5章-循环结构.ppt(61页珍藏版)》请在三一办公上搜索。

1、1,回顾,选择结构的关键在于正确描述条件,考虑不同条件下应做的动作。关系运算符,逻辑运算符掌握if语句三种基本结构的语法,场景,注意事项嵌套if结构是在主if块中还包含另一个if 语句C语言规定,嵌套if结构中每个else部分总是属于前面最近的那个缺少对应的else部分的if语句switch结构适用于条件表达式为单值的多分支选择。条件表达式或变量结果必须是整型或字符型条件运算符是 ifelse 语句的另一种表现形式,第五章,循环结构程序设计,3,导入,在第三章里我们已经知道,循环结构就是在一定条件成立的情况下反复执行一些语句或操作,即有些语句会被反复多次执行。要想写好循环,首先要能够从问题的描

2、述和解题步骤中去发现是否需要使用循环。在分析问题时,要注意识别出解决步骤中重复执行的类似动作,这是重要的线索,说明可能需要引进一个循环结构,统一处理这些重复的动作,尤其是重复次数不确定或者过多的情况。,4,本章目标,掌握循环结构的使用时机掌握循环的三种结构牢记构成循环的要素掌握使用continue和break提前结束循环的用法掌握嵌套循环理解三种循环结构各自的特点和适用情况,5,引入,例子1、输出一排50个“*”作为分割线;重复打印50次“*”例子2、一个老师给多个班上同一门课,每次考试后都要统计各个分数段的人数(不及格,中等,良好,优秀)和平均分。如何设计一个程序来完成此功能设有4个计数器,

3、分别记录各个分数段的人数。用一个单元来存放总分数,用一个单元来存放总人数。重复以下动作:读入一个学生的成绩总人数加一总分数加上当前的学生成绩判断当前学生成绩属于哪一个分数段,对应的分数段人数加一,6,循环结构的必要性,例1、应用中我们经常会遇到采用若干个“-”或“*”形成一行,作为项目间的分割线或者对输出进行布局,程序是如何编写这样的输出呢?分析:如果使用当前学习过的顺序设计,有两种方法。1、通过一条printf语句一次性输出指定数量的字符。printf(“-n”);printf(“-n”);printf(“-n”);写printf语句时需要仔细核实字符数量,以免出错。2、连续写n条print

4、f语句,每个printf语句输出一个字符.Printf(“-”);Printf(“-”);Printf(“-”);Printf(“-”);当n过大时,就会出现整个屏幕都是printf语句,不仅书写繁琐,而且可读性也很差。,7,循环结构的必要性,例2、实现数学中常见的累加和问题,求1-4所有数的立方和分析:需要调用4次pow函数来分别计算1-5所有数的立方和,然后再进行多次累加。long a,s;a=pow(1,3);s=s+a;a=pow(2,3);s=s+a;a=pow(3,3);s=s+a;a=pow(4,3);s=s+a;上面两个程序很明显无法令人满意,里面有太多重复的类似的语句,尤其是

5、当重复次数大到一定程度时(10000),其程序书写的繁琐已经使得其失去了计算机辅助计算的优越性。,8,循环结构的必要性,通过观察可以发现,这两个程序共同的特点就是有很多重复类似的操作语句,如果能够将其合并或者简化将会使程序变得更为简洁,也更有效率。针对例2,里面重复的类似语句主要是两个,一个是计算当前数的立方,另一个是把当前计算出的立方结果加到结果变量s上。可以采用如下思路进行简化:变量i代表当前需要计算立方和的数,赋初值为1,s代表立方和的结果,赋初值为0;(int i=1,s=0)如果a的值小于等于100,就重复以下动作:(while(i100)计算i的立方并将其加到变量s上(s+=pow

6、(i,3);)将i的值加1(i+;)这样通过100次的重复操作,即完成了这个计算任务。这样的重复类似动作通过循环语句实现就会变得很清晰,只要把重复动作的控制条件想清楚了,就不难写出如下程序,9,循环结构的必要性,可见,在程序设计中使用循环结构还是非常必要的,循环结构常见的应用情况包括:输出同样字符构成的图案。如常见的若干个“-”构成的点划线,*型图案等需要对一系列类似的数据做同样的处理。如已知50个学生三门课的成绩,计算每个学生的平均分,既是对50组类似的数据,进行同样的加和求平均数的操作。数学计算中常用的累加,累乘等运算。产生一批可以通过统一规律算出来的数据。如根据前两项的值计算出斐波那契数

7、列前20项。从第三项开始,每一项都是由其前两项的和产生。需要反复从一个结果计算出另一个结果,10,常用的循环结构,C语言中对循环结构的表示,大体可以分为两类,即“当型”循环和“直到”型循环。1、当型循环。此种循环为先判断条件是否成立,然后再根据判断结果决定是否执行一次循环体,即当循环条件满足时,才执行一次循环体。故称为“当型”循环。如图6-1所示。执行过程:1、循环变量赋初值2、计算条件表达式的值,若为假,则跳过循环,执行后续语句;若为真,则跳到步骤3)。3、执行循环体语句一次,执行结束后,跳到2)重复执行,11,常用的循环结构,2、直到型循环此种循环先执行一次循环体,然后才进行条件判断,即重

8、复执行循环体直到条件表达式为假为止,故称为“直到型”循环。如图6-2所示。执行过程:1、循环变量赋初值2、执行循环体语句一次。3、计算条件表达式的值,若为假,则跳过循环,执行后续语句;若为真,则跳到步骤2)重复执行。,12,常用的循环结构,二者比较:共同点:都属于循环结构,即在一定条件成立情况下循环执行循环体。不同点:当型循环是先进行条件判断,然后再根据判断结果决定是否执行循环体,故如果一开始条件表达式即为假,则循环体一次都不会被执行到。而对于直到型循环,循环体则至少会被执行一次,即使初始时条件表达式为假,因为是先执行后判断。在条件表达式初始值为真时,这两种循环完全等价。,13,常用的循环结构

9、,1、铁路售票系统,针对某列火车,具有n个座位,进行售票。(注:由于有多个售票点同时进行卖票,故单个售票点并不清楚当前车票是否还有剩余。)分析:对于具体的售票点而言,由于其当前并不清楚车票的剩余情况,故其必须先进行核实,当有剩余票的时候才能卖票,具体卖票的动作包括出票给顾客,同时将剩余票数减一。故属于当型循环,即只有在“有票”这个条件成立的前提下才能执行卖票的动作。流程图如下:,示例:看下面两则例题,判断适合采用哪种循环结构实现,并画出流程图。,14,常用的循环结构,2、猜数游戏,即系统自动产生一个1-100的随机数,看谁能使用最少的次数猜中。分析:系统产生随机数后,用户至少需要猜测1次,才知

10、道是否猜中,即用户需要不断猜数,直到猜中为止。故其适用于直到型循环,流程图如下:,15,构成循环结构的要素,从发现重复类似的动作到写出一个循环结构,需要考虑和解决很多具体问题。首先是确定哪些是循环中要处理的动作,即循环体;再有就是循环的控制,即在循环开始时数据的状态、循环得以继续(或终止)的条件、以及如何在循环停止后得到需要的数据。程序设计时对应需要解决的问题包括:循环的条件如何表示?哪些语句是重复多次执行的?循环中涉及哪些变量?循环开始前应该给它们什么初值?循环体中应该如何修改它们?,16,构成循环结构的要素,我们将上述几个条件称为构成循环的要素,即循环体,循环变量,循环条件循环条件:循环得

11、以继续或终止的条件,通常采用条件表达式表示,当条件表达式为真时执行循环体,为假时结束循环。循环体:重复执行的语句体。循环变量:控制循环次数的变量,即出现在循环条件表达式中的变量,其控制循环是否要重复执行。需要在循环开始前为其赋初值,循环体中需要修改循环变量的值,如果循环体中忘记修改循环变量的值,可能会造成循环无法退出,即死循环,同时也可能引起其他意向不到的结果,如内存溢出等。,17,C 语言中的各种循环,do-while,for,需要多次重复执行一个或多个任务的问题考虑使用循环来解决可以是完全相同的任务,也可是按一定规律变化的任务,18,C 语言中的各种循环,条 件P,A,当型循环(while

12、/for),直到型循环(do-while),真,假,假,条 件P,A,假,真,19,while 循环,while(表达式)语句;,while 循环的一般语法:,Index=0;while(index 100).index+;,工作原理,示例,循环执行的条件,循环体,初始化出口/入口迭代,关键词,20,while循环,说明:1、表达式是控制循环的条件,它可以是任何类型的表达式,结果为逻辑值0或非0。2、循环体语句可以是一条语句或多条语句,若循环体含有多条语句,则必须用大括号把它们括起来,成为复合语句。3、while语句的特点是:先判断,后执行。若表达式一开始就为假,则循环一次也不执行。4、注意每

13、循环一次要修改循环变量的值,以确保循环能够在有限次数后由于循环条件不满足而退出。5、关键字while和后面的表达式用空格分隔,表达式必须用括号括起来,后面不要有“;”,否则会认为while循环的循环体为空。,21,While循环示例,例如:前面提到的售火车票问题读出当前的火车票剩余数量当(剩余票数大于0)打印纸质票给旅客;剩余票数减1;告知顾客无票;,Int count=?/循环变量while(count 0)/循环条件printTicket();/循环体count-;/处理循环变量printf(“票已售罄!”);,22,While循环示例,例如:假设班级有62个学生,从键盘输入每个学生的当前

14、课程成绩,计算整个班级的平均分(流程图+代码),输入完成如何表示:用一个变量表示当前读入学生的数量,每读入一个学生成绩后,数量+1,当数量大于62时,即表示输入完成。int count=0;float score,sum=0;while(count 62)scanf(“%f”,23,/分析程序运行结果#includevoid main()int num=1,result;while(num=10)result=num*10;printf(%d 10%d n,num,result);num+;,while 循环示例1,1,null,10,2,输出:1 10 10,2 10 203 10 304

15、10 405 10 506 10 607 10 708 10 809 10 9010 10 100,11,100,24,while 循环示例2,问题描述:从键盘输入若干个整数,输入-1表示输入结束。统计 输入整数的数量,并计算这些整数的和并打印。分析:输入/输出算法描述是否有重复的部分什么时候重复结束,#include void main()int c=0,count=0,num=0;scanf(%d,输入:1234567-1共输入7个整数,和为:27,25,for(表达式1;表达式2;表达式3)语句;,for 循环的一般语法:,for 循环,counter=0;inum=1;cnt=100;

16、,counter=10;inum 0,counter+;inum=inum+1;cnt-,分号用于分隔 for 循环的三个表达式,1,2,3,4,26,for 循环,说明:表达式1完成变量的初始化工作,表达式2是循环是否继续的条件表达式,表达式3常用语循环变量的更新,语句部分是循环体。执行过程:执行表达式1,此步骤只在循环开始前做一次,用于对循环变量初始化。求表达式2的值,如果得到0,即循环条件不满足,则循环结束,否则就继续。执行作为循环体的语句。执行表达式3,完成对循环变量值的修改。转到2继续执行。,for语句等价于下列语句:表达式1;while(表达式2)语句;表达式3;,27,for 循

17、环示例1,for语句最简单的形式:for(循环变量赋初值;循环条件;循环变量增值),例如:for(i=1;i=100;i+)sum=sum+i;,相当于:i=1;while(i=100)sum=sum+i;i+;,用for语句简单、方便。,28,for 循环示例2,采用for循环输出前面的乘法表,/分析程序运行结果#includevoid main()int num,result;for(num=1;num=10;num+)result=num*10;printf(%d 10%d n,num,result);,输出:1 10 10 2 10 203 10 304 10 405 10 506 1

18、0 607 10 708 10 809 10 9010 10 100,29,for 循环示例3,使用for循环:检测给定整数是否素数。分析:一个自然数,若除了1和它本身外不能被其它整数整除,则称为素数。例如2,3,5,7。根据定义,测试自然数k能否被2,3,k-1整除,只要能被其中一个整除,则k不是素数,否则是素数。程序中设立标志量flag,flag为0时,k不是素数,flag不为0时,k是素数。流程图如下:,30,判断素数:设置一个标记变量,表示k是否为素数,开始时为真;然后,从1开始到k,逐个测试,如果其中的某一个数能够整除k,则说明k不是素数,修改标志变量为假,否则继续。如果循环结束后,

19、均没有数能够整除k,则说明k是素数。,31,#include void main()int k,flag=1,i;printf(“请输入需要测试的数:”);scanf(“%d”,32,for 循环,注意:for循环中表达式1、表达式2和表达式3都可以没有,也可以一部分有,但是其中的分号不能少。缺少第一个和第三个表示不作那部分动作,如循环变量的初始化也可放在for语句的前面做,循环变量的迭代也可以放到循环体里完成;缺少第二个则表示循环条件为1,也就是一个条件始终为真的循环,此时若在循环体也没有循环结束的语句,则会成为无休止循环,也称死循环。这种无休止循环有些时候是有意义的,如操作系统里的命令解释

20、循环,以及有些需要24*7运行的程序,都可以借助死循环来实现。,33,for 循环的表达式,for 循环中有三个表达式for 语句中的各个表达式都可以省略。但一般要么三个都省,用于设计死循环,否则都不省,只省略一个条件的情况很少用。分号分隔符不能省略,for(;);,可省略,不能省略,34,省略三个表达式,for(;)printf(这将一直进行下去);i=getchar();if(i=X|i=x)break;,即不为循环变量赋初值,不设置循环条件(认为表达式2为真值),不修改循环变量的值,无终止地执行循环体。此时应在循环体内设法结束循环,否则会成为死循环,35,do-while 循环,do 语

21、句;while(表达式);,do-while 循环的一般语法:,do.scanf(“%c”,工作原理,示例,36,问题描述:猜数游戏。要求猜一个介于110之间的数字,根据用户猜测的数与标准值进行对比,并给出提示,以便下次猜测能接近标准值,直到猜中为止。分析:流程图循环条件如何表示,do-while 循环示例,37,do-while 循环示例,int number=5,guess;printf(猜一个介于 1 与 10 之间的数n);do printf(请输入您猜测的数:);scanf(%d,猜一个介于 1 与 10 之间的数请输入您猜测的数:3太小请输入您猜测的数:5您猜中了!答案为 5,输入

22、数字 5 后,dowhile 循环中的条件为假,输出结果消息后,程序终止。,38,比较 while 和 do-while,while(循环条件)循环体;,do 循环体;while(循环条件);,do-while 循环是先执行后判断,所以,即使开始条件为假,循环体也至少会被执行一次。,while循环是先判断后执行,所以,如果条件为假,则循环体一次也不会被执行。,比较 while 和 do-while 循环的工作原理,39,例5.3 while和do-while循环的比较#include#include void main()void main()int sum=0,i;int sum=0,i;s

23、canf(“%d,,运行结果:1 sum=55 再运行一次:11sum=11,说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。,运行结果:1 sum=55 再运行一次:11sum=0,40,嵌套循环,循环也可以像其他控制结构一样进行嵌套,即循环结构的循环体里仍然包含循环结构,而且可以多级嵌套。通常将最外面的一层循环称为外层循环,里面的一个或多个循环称为内层循环。具有一个外层循环和一个内层循环的双重循环是较常见的嵌套循环结构,此时外层循环每执行一次,内层循环都要完整的执行一次。例子:假设要统计某小区内某栋楼的居住人数,这栋楼有5个单元,每个单元

24、有12户人家。统计的方法是从第一单元开始,依次统计12户人家的居住人数,然后再统计第二单元,直到五个单元全部统计完成。此例中统计5个单元为外层循环,统计每个单元内的12户人家则为内层循环,即每统计一个单元都要访问12户人家。int sum=0,i,j;for(i=0;i5;i+)for(j=0;j12;j+)sum+=curCount;,41,嵌套循环示例,注意:1、i控制外层循环执行的次数,j控制内层循环执行的次数,不要试图用一个变量同时控制内层和外层循环,容易出错。2、有很多情况下内层循环变量的取值会与外层循环变量的当前值有关系。3、循环嵌套的重点是逐层分析,注意内层循环变量每次执行时的初

25、始状态和外层循环变量的当前值。例如:打印如下星形图案*,42,#include Void main()Int i,j;For(i=0;i5;i+)For(j=0;ji;j+)Printf(“*”);Printf(“n”);,43,嵌套循环示例,例:求10到40之间的所有素数。在前例中介绍了如何判断给定整数k是否素数的方法,即用循环考察k%i(i=2,3,k-1)若存在某个i使k%i为0,则k不是素数,否则k是素数。k是通过输入提供的。本例要求10到40之间的所有素数,可以在外层加一层循环,用于提供要考察的整数:k=10,11,39,40。即外层循环提供要考察的整数k,内层循环则判别k是否素数。

26、,44,#include void main()int k,flag=1,i;for(k=10;k=40;k+)for(i=2;ik,flag=1;i+)if(k%i=0)flag=0;if(flag=1)printf(“k 是素数!n”);elseprintf(“k 不是素数!n”);,45,嵌套循环示例,下面通过跟踪程序的运行,了解程序的执行流程及各变量值的变化情况。这种以具体数据代入程序跟踪运行的方法有助于理解程序中算法和思路。虽然效率低一些,却很实用。k=10:l=1,i=2 因为k%2=0,所以l=0(k不是素数)k=11:l=1,i=2,3,10 因为k%i!=0,所以l=1(k是

27、素数)k=12:l=1,i=2 因为k%2=0,所以l=0(k不是素数)k=40:l=1,i=2 因为k%2=0,所以l=0(k不是素数)所以输出:11 13 17 19 23 29 31 37以上程序还可以改进:素数中除了2以外,其它均为奇数,因此,外层循环可以改为:for(k=11;k40;k+=2)若自然数k是素数,则k不能被2,3,整除。所以内层循环可以改为:for(i=2;i=sqrt(k);i+)并在程序开头增加命令#include math.h。,46,break语句和continue语句,为了使程序设计更加灵活,能够方便的在从循环中退出或跳转,C语言提供了continue语句和

28、break语句。,while()continue;,while()break;,跳出整个循环,继续下一次循环,47,continue语句,程序设计过程中,有时不希望结束循环,但要跳过当前的迭代,继续执行下一次循环。Continue语句即可实现这样的功能。它的书写格式为:continue;这里,continue是系统关键字,不能再用于其它用途。下面是使用continue的一个例子:int day;for(day=1;day7;day+)If(day=4)Continue;其它语句块此例中,变量day从1变化到7执行“其它语句块”,当day的值为4时,会执行continue语句,跳过当前循环,即位

29、于continue后的循环体语句均被跳过,直接进入day+,然后继续下一次循环,48,问题描述:求整数1100的累加值,但要求跳过所有个位为3的数。,#includevoid main()int i,sum=0;for(i=1;i=100;i+)if(i%10=3)continue;sum+=i;printf(sum=%d n,sum);,continue 语句示例,null,0,13,1,循环执行到 i=13,78,输出:sum=4570,1,循环执行到 i=101,101,4570,49,break语句,在选择结构中我们已经使用过了break语句,用于终止switch块中代码的执行,跳出s

30、witch结构,并继续执行switch结构后的第一行语句。Break语句在循环体内的作用和switch基本相同,用于跳出当前循环,转而执行其后面的语句。需要特殊注意的是,如果在多重循环中使用break语句,只会跳出当前的循环,不会一下跳出多重循环。例如:int n,sum;for(;)scanf(“%d”,50,break 语句,跳出 for 循环for(;)printf(这将一直进行下去);i=getchar();if(i=X|i=x)break;,跳出 while 循环while(1)if(x=10)break;,跳出 do-while 循环do if(x=10)break;while(x

31、 15);,51,问题描述:统计从键盘输入的若干个字符中有效字符的个数,以换行符作为输入结束。有效字符是指第一个空格符前面的字符,若输入字符中没有空格符,则有效字符为除了换行符之外的所有字符。,#includevoid main()int count=0,ch;printf(n 请输入一行字符:);while(ch=getchar()!=n)if(ch=)break;count+;printf(n 共有%d 个有效字符。n,count);,break 语句示例,H,0,_,请输入一行字符:Hello world,共有 5 个 有效字符,1,循环执行 5 次,5,52,各种循环的比较,C语言中构

32、成循环结构的有while、do_while和for循环语句。下面对它们进行粗略比较。三种循环语句均可处理同一个问题。它们可以相互替代。例1、求10个数中的最大值。思路:从键盘上输入第一个数,并假定它是最大值存放在变量max中。以后每输入一个数便与max进行比较,若输入的数较大,则最大值是新输入的数,把它存放到max。当全部10个数输入完毕,最大值也确定了,即max中的值。,53,各种循环的比较,for语句和while语句先判断循环控制条件,后执行循环体;而do_while语句是先执行循环体,后进行循环控制条件的判断。for语句和while语句可能一次也不执行循环体;而do_while语句至少执

33、行一次循环体。for和while循环属于“当型”循环;而do_while循环属于“直到型”循环。do_while语句和while语句多用于循环次数不定的情况,如例6-5。对于循环次数确定的情况,使用for语句更方便,如例6-7 do_while语句更适合于第一次循环肯定执行的场合。,54,各种循环的比较,例如,输入学生成绩,为了保证输入的成绩均在合理范围内,可以用do_while语句进行控制。(直到输入成绩数据合法为止)do scanf(%d,显然,用for语句或while语句不如用do_while语句更自然。,55,循环结构综合实例-1,某教师同时承担三个班级的同一门课程,每个班的人数不同,

34、要求编写一个程序实现计算每个班级的平均分。分析:根据题意,需要依次输入三个班的学生成绩,每输入一个班后计算出平均分,故这里面应该有两层重复动作,一个是班级的重复(1-3),另一个是学生的重复(1-n),故需要使用双重循环。外层处理班级的循环次数一定,1-3,故可采用for循环,内层循环由于各个班级的学生人数不固定,需要采用特殊标记作为结束标志,建议采用while循环实现。具体流程图如下:,56,开始,变量i表示班级,初始为1;变量count记录每个班人数变量sum记录每个班总分数,i=3,计算每个班级的平均分输出结果,结束,班级人数计数器清零班级总分数清零以-1作为输入结束标记,score=-

35、1,读入一个成绩保存到score中,读入一个成绩保存到score中,班级总人数+1当前成绩加到总分数上,输出平均成绩 总成绩/总人数,是,否,是,否,57,Void main()int i,count=0;float sum,score;for(i=1;i3;i+)fflush(stdin);count=0;sum=0;printf(“Please Input No%d class scores:”,i);scanf(“%f”,58,开始,变量i表示班级,初始为1;变量count记录每个班人数变量sum记录每个班总分数,i=3,计算每个班级的平均分输出结果,结束,班级人数计数器清零班级总分数清

36、零以-1作为输入结束标记,score=-1,读入一个成绩保存到score中,班级总人数+1当前成绩加到总分数上,输出平均成绩 总成绩/总人数,是,否,是,否,59,Void main()int i,count=0;float sum,score;for(i=1;i3;i+)fflush(stdin);count=0;sum=0;printf(“Please Input No%d class scores:”,i);while(1)scanf(“%f”,60,循环结构综合实例-2,接收终端键盘输入的若干字符,以换行符n结束,统计其中元音字符的数量。分析:前面我们已经做过如何判断一个字符是否为元音,这里只需要对每个输入的字符都进行一次判断即可,故只需要将判断单个字符是否为元音的那部分程序套入循环结构中即可。简单流程图如下:,61,Void main()int count=0;char ch;while(1)fflush(stdin);ch=getch();if(ch!=n)switch(ch)case a:count+;break;case e:count+;break;case i:count+;break;case o:count+;break;case u:count+;break;elsebreak;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号