c语言-第5章循环程序设计.ppt

上传人:tia****nde 文档编号:12805496 上传时间:2020-05-25 格式:PPT 页数:83 大小:7.25MB
返回 下载 相关 举报
c语言-第5章循环程序设计.ppt_第1页
第1页 / 共83页
c语言-第5章循环程序设计.ppt_第2页
第2页 / 共83页
c语言-第5章循环程序设计.ppt_第3页
第3页 / 共83页
点击查看更多>>
资源描述
第5章循环程序设计,管理学院电子商务系,2,第5章循环程序设计,5.1概述5.2while和dowhile循环5.3for循环5.4循环的嵌套5.5循环的控制5.6应用举例5.7程序调试,3,第5章循环程序设计,4,第5章循环程序设计,5,第5章循环程序设计,6,第5章循环程序设计,7,第5章循环程序设计,8,第5章循环程序设计,9,第5章循环程序设计,10,第5章循环程序设计,水温度的量变引起水的物理形态的质变:水在标淮大气压下加温到100摄氏度变成汽降温到0摄氏度变成冰。,11,第5章循环程序设计,物体从地球上抛射速度的量变引起运动形式的质变:小于7911m/s时,在地面上沿弹道飞行;达到7911m/s时,绕地球作椭园轨道运动,成为地球的卫星;增大到11189m/s时,脱离地球成为绕太阳运行的一个行星;速度达到16662m/s时,脱离太阳系成为迢游太空的一个天体。,12,第5章循环程序设计,计算机程序由若干语句顺序组成:顺序结构的程序只能按照语句的先后顺序从前向后依次执行分支结构程序虽然允许在执行了某个判断后跳过某些语句执行后面的语句,但也只能按语句的前后次序执行有时,需要在程序中重复执行某个语句或语句块,就需要循环结构,13,第5章循环程序设计,生活中的例子:击鼓传花:大家坐成一个圈,鼓声响起的时候将花束顺序交到下一个人的手里,依次向下传递,当鼓声突然中断时停止传花,花束落在谁的手里便成为输家4100米接力赛跑:第1个人跑完100米后将接力棒传给第2个人,第2个人再跑100米,然后是第3个人,直到第4个人跑完最后一个100米共同点:都要完成相同的任务:量变的重复内容都有结束条件:发生质变的界限,14,第5章循环程序设计,1.计算sum=1+2+3+100,15,第5章循环程序设计,1.计算sum=1+2+3+100,循环体,循环控制条件,循环控制变量,循环的初始化,#includevoidmain()inti=1,sum=0;while(i=100)sum=sum+i;i+;printf(“Sum=%dn”,sum);,16,第5章循环程序设计,2.计算sum=2+4+6+100,循环体,循环控制条件,循环控制变量,循环的初始化,#includevoidmain()inti=2,sum=0;while(i=100)sum=sum+i;i+=2;printf(“Sum=%dn”,sum);,17,5.2while和dowhile循环,格式:while(表达式)语句do语句while(表达式);说明:括号中的“表达式”是循环控制条件,但不限于关系表达式和逻辑表达式“语句”是单一语句,但可以是复合语句如果while语句的括号后面只有“;”,则循环体为空。如果do-while语句的括号后面(分号前面)还有其他符号,则出现语法错误,18,5.2while和dowhile循环,while语句的执行过程,while语句的执行过程是:计算“表达式”的值;若“表达式”的值不时0,为“真”,继续执行;否则,结束循环,转到while语句后面的语句继续执行程序;执行“语句”部分,即执行循环体;返回继续执行。,19,5.2while和dowhile循环,do-while语句的执行过程,20,5.2while和dowhile循环,循环语句的特点:while循环是“先判断后循环”,如果开始时循环条件不满足,循环体就一次也不执行do-while循环是“先循环后判断”,即使第一次判断的结果为“假”,循环体也已经执行了一次但不论哪种循环,循环体中必须包含能够使循环条件变为“假”的运算,21,5.2while和dowhile循环,循环的变化:sum=1+2+3+100,#includevoidmain()inti=1,sum=0;while(i=100)sum=sum+i+;printf(“Sum=%dn”,sum);,#includevoidmain()inti=1,sum=0;dosum=sum+i;i+;while(i=100);printf(“Sum=%dn”,sum);,22,5.2while和dowhile循环,几何级数2x的力量:一页普通纸的厚度约为0.1mm(1mm=10-3m)珠穆朗玛峰的高度为8844.43m编写程序计算一下,普通纸对折多少次可以超过珠穆朗玛峰的高度?,23,5.2while和dowhile循环,#includevoidmain()doublepaper_height,mountain_height;intnumber;paper_height=0.0001;mountain_height=8844.43;number=0;while(paper_heightmountain_height)paper_height*=2;number+=1;printf(对折第%d次后的高度是%g。n,number,paper_height);,24,5.2while和dowhile循环,几何级数2x的力量:中国战国时期的赵国辩士公孙龙有一个著名命题:“一尺之棰,日取其半,万世不竭”。这是说,一尺长(0.33m)的一根木棰,每天取它一半,世世代代也取不完。这一命题,包含了某些朴素辩证法的思想,它猜测到了物质的无限可分性。但严格说来它并不科学。因为就某一具体物质形态来说,它在被分割到一定程度时就不再是这一事物了。最大的原子是铯,半径为225pm(1pm=10-12m)编写程序计算一下,这只木棰日取一半,取多少天可以比铯原子的半径小?,25,5.2while和dowhile循环,26,5.2while和dowhile循环,#includevoidmain()doublehammer_height,cesium_radius;intnumber;hammer_height=0.33;cesium_radius=225e-12;number=0;while(cesium_radiushammer_height)hammer_height/=2;number+=1;printf(第%d天后的高度是%g。n,number,hammer_height);,27,5.2while和dowhile循环,恩格斯说:“纯粹的量的分割是有一个极限的,到了这个极限它就转化为质的差别;物体纯粹是由分子构成的,但它是本质上不同于分子的东西,正如分子又不同于原子一样”。取到第3天,剩下的部分4.125cm长,这时它还能做为“木棰”吗?取到第31天,它剩下的部分已经没有分子那么大了,这时它不仅不再能成为“木棰”,连木头的物理分子都已经不是了。当然,它还可以被取下去,但随着次数的变化,它必然会发生不同层次的质变。严格说来,应该是“一尺之棰,日取其半,三日可竭”;作为木质应该是“一只之棰,日取其半,一月乃竭”;作为物质,应该是“一尺之棰,日取其半,万世不蝎”。这就是说,不同层次的量变,总是引起与之相应的质变。,28,5.2while和dowhile循环,循环的嵌套,如果在一个循环的循环体内包含另一个完整的循环则称为循环的嵌套,其中被嵌套的循环称为内循环,而嵌套了内循环的是外循环内循环还可以嵌套循环,形成多级(层)嵌套,29,5.2while和dowhile循环,顺序打印1-10的阶乘,即1!,2!,10!,本题的关键是求阶乘数学上,n!=123(n-1)n,30,5.2while和dowhile循环,外循环,内循环,对比程序:#includevoidmain()inti=1;floatf=1;while(i=10)f=f*i;printf(%2d!=%.0fn,i,f);i+;思考一下:8-10的阶乘,#includevoidmain()inti=1,j;floatf;while(i=10)j=1;f=1;while(j=i)f=f*j;j+;printf(“%2d!=%.0fn”,i,f);i+;,31,5.2while和dowhile循环,循环的嵌套不仅可以发生在相同语句之间,如while嵌套while、do-while嵌套do-while,while语句和do-while语句也可以互相嵌套(1)while(.)(2)while()while()dowhile();(3)do(4)dowhile()dowhile();while();,32,5.2while和dowhile循环,错误的嵌套形式,循环必须是完整的,不允许内外循环交叉嵌套f=1;while(i10)i=1;dof=f*i;i+;while(i10);,混乱的控制条件,内外循环的循环控制条件通常是分开的,相对独立的i=1;s=0;while(i3)s=s+f;i=1;f=1;while(i5)i+=2;f=f*i;i+;,33,5.2while和dowhile循环,应用举例,输入一个5位数,计算并输出各位的和,方法一:将输入的5位数看作是5个独立的数字字符,依次读取每一个数字字符,将其转化为对应的数字后再求和将数组字符ch转化为数字的方法为ch-0,34,5.2while和dowhile循环,输入一个5位数,计算并输出各位的和,#includevoidmain()charch;inti=0,sum=0;printf(“Enteranumberwith5digits:”);while(i1e-5);pi=4*pi;printf(PI=%.4fn,pi);,41,5.3for语句,for语句是常用的、特殊的循环控制语句for语句的功能强大,使用灵活,变化多样for语句优点:将“循环初始化条件”、“循环控制条件”、“循环控制变量的修改”集中表示将量变与质变的因素集中表示,42,5.3for语句,for语句的用法for(表达式1;表达式2;表达式3)语句“表达式1”用于循环的初始化“表达式2”是for语句的循环控制条件,当循环控制条件为1(True)或非0时,运行代表循环体的“语句”部分,可以是任何形式的表达式“表达式3”用于修改循环控制变量的值,目的是使“表达式2”的值变为0(False),以结束循环“语句”部分是for语句的循环体,可以是单一语句,也可以是复合语句,43,5.3for语句,for语句的执行过程,44,5.3for语句,使用for语句编程。计算sum=1+2+3+100,#includevoidmain()inti,sum=0;for(i=1;i=100;i+)sum+=i;printf(“sum=%dn,sum);,45,5.3for语句,任意输入10个数,求平均值,#includevoidmain()inti;floatx,sum=0;printf(Enter10numbersonebyone:n);for(i=1;i=10;i+)scanf(%f,46,5.3for语句,循环的嵌套,for语句可以嵌套for语句构成循环的嵌套for语句也可以与while语句、do-while语句互相嵌套,47,5.3for语句,例:顺序打印1-10的阶乘,即1!,2!,3!,10!,#includevoidmain()inti,j;floatf;for(i=1;i=10;i+)f=1;for(j=1;j=i;j+)f=f*j;printf(%2d!=%.0fn,i,f);,#includevoidmain()inti=1,j;floatf;while(i=10)j=1;f=1;while(j=i)f=f*j;j+;printf(“%2d!=%.0fn”,i,f);i+;,48,5.3for语句,例:打印几何图形,对于这类问题,每行中星号的个数、总行数等都应该用循环结构进行控制,而不是直接输出若干行字符串,#includevoidmain()inti,j;for(i=1;i=4;i+)for(j=0;j0)ave=ave/i;printf(Average:%.2fn,ave);,54,5.4循环的控制,下面的程序块常用来对输入的数据进行限制:doscanf(%d,或者,?(讨论一下),技巧,55,例:利用随机数产生一个乘法算式,用户输入算式的运算结果,由程序判断对错。,#include#includevoidmain()intiFor=0,iErr=0;intx,y,iAns;charch;doiFor+;x=rand()%100;y=rand()%100;printf(%dx%d=?,x,y);scanf(%d,56,5.4循环的控制,break语句,break语句的格式为:break;在switch语句中,break语句用于跳过后面的语句,结束switch语句在循环结构中,break语句的作用是跳出循环结构,执行循环后面的语句,在下面的程序块中,由于break语句的作用,循环只进行了1次,printf语句一次也没有执行,并且永远也不会被执行:for(i=1;i100;i+)sum+=i;break;printf(%d,sum);,57,5.4循环的控制,continue语句,continue语句的格式为:continue;continue语句只能用在循环结构中,用于结束本次循环,即跳过循环体中后面的语句,开始下一次循环,下面的语句块中,循环次数是100次,但printf语句一次也没有执行:for(i=1;i100;i+)sum+=i;continue;printf(%d,sum);,58,5.4循环的控制,break语句和continue语句的有效范围都仅限于所在的循环语句之内。如果想从嵌套的循环结构的内循环中直接跳出到外循环之外,使用一个break语句是不行的。可行的方法是:在程序中引入一个标识变量,在各循环的结束位置检测这一标识,用多个break语句作连续的跳转,flag=1while(i10)for(j=i;j10;j+)if(j=2*i)flag=0;break;if(flag!=1)break;printf(%d,i);,59,5.4循环的控制,例:顺序打印100-1000之间所有9的倍数,如果一个数同时也是7的倍数则停止打印,#includevoidmain()inti;for(i=100;i1000;i+)if(i%9!=0)continue;printf(%5d,i);if(i%7=0)break;,60,5.4循环的控制,例:求任意正整数的除了自身以外的最大因数,#includevoidmain()inti,n;printf(Enteranumber:);scanf(%d,61,5.4循环的控制,goto语句,goto语句是从早期程序设计语言遗留下来的一个语句,称为无条件跳转语句,已被淘汰goto语句的使用格式是:goto语句标号;“语句标号”是一个特殊的标识符,由字母、数字或下划线组成(第一个字符不能是数字),后面跟冒号“:”,放在语句行的最前头,#includevoidmain()inti=100;while(i0;i-)x=x/2;printf(Thereare%damebas.n,x);,65,例:谷角猜想,对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此反复,经过有限次运算后,总可以得到自然数1。试编程验证之。,#includevoidmain()intn;printf(Enteranumber:);scanf(%d,66,5.5应用举例,例:打印九九乘法口诀表要求:九九乘法口诀表呈三角形,共有9行。第1行有1列,第2行有2列,第9行有9列。打印方法是,用外循环控制行数,包括打印一行中的所有列和换行,在内循环中,打印某一行上的所有列。,#includevoidmain()inti,j;for(i=1;i=9;i+)for(j=1;j=i;j+)printf(%1dx%1d=%-4d,j,i,j*i);printf(n);,67,例:利用迭代公式求的近似值,结果保留5位有效数字。,用该迭代公式求a的平方根x,实际是求近似值xn+1,即xxn+1,“保留5位有效数字”可理解为|xn+1-xn|/xn+11e-5)printf(Therootis%fn,x);,70,5.6程序调试,对于程序设计而言,即使优秀的程序员也不能保证不会犯错误一个优秀的程序,不在于使用了先进的算法,而在于仅仅包含少量的错误程序中的错误是在所难免的,关键是发现并纠正错误初学程序设计的人有必要从一开始就养成良好的习惯,培养严谨的工作作风,并逐步掌握一些编程技巧,71,5.6程序调试,程序调试的一般策略程序中的错误一般可分为:语法错误比较容易发现,通常,有语法错误的程序不能通过编译和连接,也就不能生成可执行的程序逻辑错误又叫语义错误,也就是不能正确地表达所需要的功能,是较常见的错误之一。其外部表现为,程序可以运行,但有时出错,有时又不出错。逻辑错误通常比较难于被发现,查错和纠错对任何程序员来说都是挑战设计错误比较少见,通常是由于对问题的分析不彻底造成的,纠正这类错误需要重新设计程序,72,5.6程序调试,调试程序的一般步骤为:静态检查,也就是人工检查,是在完成程序设计后,在上机调试前,仔细地对程序代码进行全面的检查。通过静态检查,不仅可以发现程序中的语法错误,也可以发现逻辑错误,甚至发现设计上的缺陷。为便于查错,应力求做到编码的标准化、文档化,增强编码的可读性、可理解性、可维护性。要做到:采用结构化方法,划分功能模块和程序段,采用必要的缩进和对齐,简化表达式,每行只有一个语句,尽量使用注释,使用有意义的标识符,动态检查,是指通过上机调试发现错误的过程。完成编码后,可以借助编译程序检查隐藏的语法错误,如错误标识符、非法的表达式、错误的函数调用等。利用连接程序,可以检查连接错误,如调用了未定义的函数、缺乏必要的函数定义等。通过试运行程序,可以发现一些逻辑错误,如错误的计算、有问题的输入和输出等,73,5.6程序调试,程序中的错误有两种:Error和WarningError是必须要纠正的,任何Error都会导致编译或连接失败Warning一般不影响生成可执行的“程序”,但程序有缺陷合格的程序员不仅要纠正致命Error,也要重视并纠正Warning当程序中错误较多时,应从最前面的错误开始逐一改正有些错误实际出自同样的原因,只要纠正了其中的一个就会消除所有这些错误,74,5.6程序调试,程序的跟踪与调试,以VisualC+6.0为例,1、程序的“调试”运行方式打开主菜单,点击“Go”(快捷键是F5),75,5.6程序调试,2、使程序暂停的方法执行到光标处:将光标放在一个语句行上,单击“debug”工具栏中的“RuntoCursor”按钮设置断点:将光标放在一个语句行上,然后点击“Add/RemoveBreakpoint”按钮,即可在此设置(或取消)一个断点“中断”(Break)方式:当程序运行在调试方式下时,单击“Break”按钮,即可立即“中断”程序的运行;要恢复暂停程序的执行,只要单击“Go”按钮即可,76,5.6程序调试,3、在“暂停”状态下常见的操作单步运行程序。点击“StepOver”按钮或“StepInto”按钮即可一行一行地执行程序,每执行完一行都自动进入暂停状态观察变量的值。使用“Variables”窗口可观察程序中的各种变量的当前值,点击其中的“Locals”选项卡可以显示所定义的变量的值。在“Watch”窗口中,也可以添加或删除要观察的变量的值。当“Watch”有效时,点击选中源代码窗口,把鼠标指向任何变量,稍待片刻,就会弹出该变量的值修改变量的值。要临时修改变量的值,可以双击改变量的“Value”域(在Variables窗口或Watch窗口都有效),进行编辑模拟计算。单击“QuickWatch”按钮,弹出“QuckWatch”对话框,可以用当前程序中的变量组成算式进行简单的模拟运算,77,5.6程序调试,4、查错的技巧程序中隐藏的错误通常难于发现,可以采取一些技巧:在程序中加入一些“调试代码”,输出变量的中间值以帮助判断但这种办法并不理想,一来使用起来不方便,二来破坏了程序的原有结构,三是在不需要的时候还要一一删除,不注意会遗漏。使用条件编译会更好些通过设置断点、跟踪运行等方式调试程序,这是比较高效的方法一旦怀疑某段程序有错,可以在程序段的开始位置设置断点,当程序运行到断点而暂停时,通过一步一步地执行程序,并观察变量的变化,判断错误是否存在。但这种方法也有不利的地方,比如,如果程序段所表达的逻辑比较复杂,或者循环次数很多,都会导致调试困难程序的单元测试法。对程序段的执行逻辑进行仔细分析,划分程序执行路径的种类,针对每种路径设计若干组不同的输入数据,依次使用这些数据来测试程序,观察程序的运行状态和结果,以发现可能隐藏着的错误,78,小强蛋糕店之“成本核算”,小强蛋糕店开张已经快有两个月了,小强起早贪黑、没日没夜地干活,但是每到月底结算的时候,他却发现经济上入不敷出!虽然小强天性“乐善好施”、“学雷锋做好事”,但是如果长期如此,蛋糕店不久也会“关门大吉”了。为了找出原因所在,小强打算应用罗老师传授的“循环程序结构”编写一个计算机程序,对制作的每款蛋糕进行“成本核算”,计算出合理的成本价格,以利于今后的经营。,79,小强蛋糕店之“成本核算”,蛋糕主要原料是面粉、牛奶、奶油、鸡蛋和糖,小强蛋糕的主要原料成分表如下所示:,80,小强蛋糕店之“成本核算”,面粉、牛奶、奶油、鸡蛋和糖的当前市场价格表如下所示:,81,小强蛋糕店之“成本核算”,小强蛋糕店设计的“成本核算”程序cost.c如下:,#includevoidmain()floatflour_w,milk_w,butter_w,egg_w,sugar_w;floatflour_p,milk_p,butter_p,egg_p,sugar_p;floatave_p;charis_repeat=y;flour_p=3;milk_p=6;butter_p=10;egg_p=5;sugar_p=3;printf(请按以下顺序输入蛋糕成分数量。n);printf(面粉、牛奶、奶油、鸡蛋、糖:n);scanf(%f%f%f%f%f,82,小强蛋糕店之“成本核算”,while(is_repeat=y)ave_p=(flour_w*flour_p+milk_w*milk_p+butter_w*butter_p+egg_w*egg_p+sugar_w*sugar_p)/500;printf(这款蛋糕的主要成本价格是%.2f元。n,ave_p);printf(还需要对其它蛋糕进行成本核算吗?n);getchar();printf(需要输入y,否则输入n:);scanf(%c,83,小强蛋糕店之“成本核算”,小强感觉计算某个产品成本时都要重新输入相应的各个成分,十分不便。看来,需要请教罗老师,有没有更好的办法?,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!