C语言课件第05章.ppt

上传人:sccc 文档编号:5384449 上传时间:2023-07-02 格式:PPT 页数:41 大小:347.51KB
返回 下载 相关 举报
C语言课件第05章.ppt_第1页
第1页 / 共41页
C语言课件第05章.ppt_第2页
第2页 / 共41页
C语言课件第05章.ppt_第3页
第3页 / 共41页
C语言课件第05章.ppt_第4页
第4页 / 共41页
C语言课件第05章.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C语言课件第05章.ppt》由会员分享,可在线阅读,更多相关《C语言课件第05章.ppt(41页珍藏版)》请在三一办公上搜索。

1、第5章 循环结构的程序设计,5.1 循环结构问题的提出5.2 解决单重循环的问题5.3 解决多重循环的问题5.4 简单的程序调试,5.1 循环结构问题的提出,在用计算机解决大量的实际问题时,经常会遇到如下许多重复运算的问题。(1)求某一同学一学期的平均分。解决方法是将该同学这一学期所有考核成绩累加,再除以考核门数,就得到该生的平均分。,(2)计算:1*2*3*n。这是一个累乘的问题,每个乘数与前面的一个数都有固定的关系(后面的数比前面的数大1)。因此每次累乘的数都是前面的数加1,方法相同,实际这是一个重复累乘的问题。这一类问题,重复的次数有些情况是已知的,有些情况是未知的。但是这些问题都带有重

2、复性的工作,解决这类问题,采用循环结构最为适当。,有些问题,采用单重循环就能解决,比如上面所举的两个例子,都可以采用单重循环;而有些问题,比如说二维表格数据输出的问题,则需要采用双重循环才能解决。C语言提供了三种实现循环结构的语句,它们分别是:while语句、do-while语句和for语句,三种循环语句各有不同的特点,我们可以灵活使用。,5.2 解决单重循环的问题,5.2.1 while循环语句while循环语句的形式如下:while(表达式)循环体语句while循环语句的执行过程如图5-1所示。,图5-1 while语句的执行,说明(1)用while语句构成的是“当型”循环结构,它的特点是

3、:“先判断,后执行”,如果表达式的最初值为0,则循环体语句一次也不执行。只有当表达式的值为非0时,才能执行循环体语句。执行完循环体语句后,再返回循环的开始部位,判断表达式的值,决定是否继续循环。,(2)循环体语句只能是一条语句,如需要使用多条语句,必须采用复合语句的形式。(3)循环体内一定要有能够改变表达式的值的操作,最终使其表达式的值变为0,否则将形成无休止的“死”循环。,例5.1 求:1+2+3+n的累加求和的值。问题分析:(1)我们首先需要设置一个存放累加求和的变量sum,每一次加一个数放入变量sum中;(2)再设置一个存放加数的变量i,每一次累加时被加的数均需比前一个数大1;(3)最后

4、还需设置一个结束累加的变量n,确定累加到什么数为止。,根据以上分析,写出源程序如下:main()int i,n,sum;i=1;sum=0;printf(Please input n:);scanf(%d,while(i=n)/*累加的数i 小于或等于终止数n就循环累加,否则结束循环*/,sum=sum+i;i+;printf(sum=%dn,sum);说明(1)存放累加求和的变量sum,说明后必须赋初值,一般为0,否则由于说明的变量其原有初值不确定,导致结果有误。,(2)程序中sum=sum+i;语句是一个累加求和功能的语句,它是将变量sum中的数值加上变量i中的数值,求和后再放入变量sum

5、中,此时变量sum中存放的数值已经变为新的数值,原有数值已被覆盖掉。以上程序运行情况如下:Please input n:100sum=5050,5.2.2 do-while 循环语句do-while 循环语句的形式如下:do 循环体语句 while(表达式);do-while语句的执行过程如图5-2所示。,图5-2 do-while语句的执行过程,说明(1)用do-while语句构成的仍是“当型循环”结构。它的特点是:“先执行,后判断”。遇到do关键字后,首先执行循环体语句,然后计算表达式的值,如表达式的值为非0,则继续执行循环体语句,然后再计算表达式的值,如表达式的值为0,则结束循环,执行d

6、o-while语句后面的语句。因此这种循环结构,最少也可以执行一次循环体语句。,(2)循环体语句仍然只能是一条语句,如需要使用多条语句,必须采用复合语句的形式。(3)循环体语句中也一定要有改变表达式的值的操作,最终使其表达式的值变为0,结束循环。否则将成为“死”循环。(4)在关键字while的小括号的后面,一定要加分号“;”,千万不能忘记,它表示do-while语句到此结束。,例5.2 求:n!,即计算123n的值。源程序如下:main()int i,n,s;i=1;s=1;printf(Please input n:);scanf(%d,do s=s*i;/*使用“累乘”的公式*/i+;wh

7、ile(i=n);printf(%d!=%dn,n,s);,说明(1)存放累乘求和的变量s,说明后必须赋初值,一般为1,否则由于说明的变量其原有初值不确定,导致结果有误。(2)程序中s=s*i;语句是一个累乘求和功能的语句,它是将变量s中的数值乘上变量i中的数值,累乘后再放入变量s中,此时变量s中存放的数值已经变为新的数值,原有数值已被覆盖掉。,以上程序运行情况如下:Please input n:55!=120,5.2.3 for循环语句for循环语句的形式如下:for(表达式1;表达式2;表达式3)循环体语句for语句的执行过程如图5-3所示。,图5-3 for语句的执行过程,说明(1)由图

8、5-3可知,for循环语句的特点仍是“先判断,后执行循环体”。遇到for关键字,先计算表达式1的值,然后再判断表达式2的值,如其值为非0,则执行循环体语句,执行完循环体语句后,再来计算表达式3的值,然后再判断表达式2的值。如其值为0,则结束for循环语句,执行for循环语句后面的语句。,(2)循环体语句仍然只能是一条语句,必要时可采用复合语句的形式。(3)此结构仍需最终使表达式2的值变为0,以结束循环。否则将会造成“死”循环。(4)for语句的表示形式相当灵活,其中:表达式1和表达式3均可省略,但一定要确保表达式2最终值等于0。表达式1或表达式3省略后,其分号“;”必须有,不能省略,即:for

9、(;表达式2;)循环体语句,(5)通常情况下:表达式1代表循环控制变量的初值,表达式2代表循环控制变量的终值,而表达式3代表循环控制变量的增量,例如:求n!,可简单表示成:s=1;for(i=1;i=n;i+)s=s*i;,5.2.4 三种循环语句的比较for循环和while循环语句结构均是先判断循环条件,条件成立,才执行循环体,具有“先判断,后执行”特点;而do-while循环语句则是先执行循环体,然后再判断循环条件,具有“先执行,后判断”的特点。,5.3 解决多重循环的问题,5.3.1 三种循环语句的混合嵌套问题例5.8 求2100之间的所有素数,并输出。问题分析判断一个数是否是素数的方法

10、,我们在前面已经介绍了。设某一个数为a,判断该数是否为素数,就是用这个数分别被2去除,如果都不能被除尽,则该数为素数,如有一次被除尽,则该数就不是素数。,现需求2100之间的所有素数,判断素数的方法是相同的,只要利用循环依次从2100之间取一个数,判断是否是素数,如是素数就输出显示,不是素数就继续判断下一个数,直至判断到100为止。源程序如下:,#include math.hmain()int n,i,j,flag,x=0;for(i=2;i=100;i+)flag=1;j=2;n=(int)sqrt(double)i);while(flag,if(flag)printf(%d,i);x+;i

11、f(x%5=0)printf(n);,程序运行时,当i=2或3时,变量j的初值也为2,大于变量n的值,内嵌的while循环不执行,flag变量值为1,输出素数2或3;当i3时,进入内层循环,若i为素数,flag的值不变,仍为1,若i不是素数,flag的值变为0,并立即结束内循环。当退出内循环后,if语句判断flag的值为1时,输出素数i;若i不是素数,flag的值变为0,不做输出。,外层循环继续取下一个数,通过内层循环判断是否是素数,直到外层循环取的数i大于100后,结束外层循环,结束程序运行。,通过以上例子我们看到,外层循环的目的是,每次循环分别从2100的数中取某一个数,已知循环的次数为9

12、9次,采用for循环比较合适;而内层循环是判断某个数是否是素数,在每一次的除法中,当某一次除法运算出现余数为0时,表明该数不是素数,立即结束内层循环,所以内层循环次数事先难以确定,因此采用while循环最为适当。,在解决多重循环问题时,往往需要具体问题具体分析,根据实际问题的内容和特点,采用不同的循环结构。因此在解决多重循环问题时,三种循环结构并举,适合哪一种循环结构,就采用哪一种循环结构。读者可在实践过程中灵活使用。,5.3.2 continue语句和break语句在循环中的应用1Continue 语句continue语句的一般形式:continue;该语句的功能是:结束本次循环。也就是说,

13、不管在该语句的后面是否还有其他执行语句,遇到continue;语句,本次循环到此结束,接着进行下一次循环的判断。,例5.9 将10100之内的不能被5整除的数输出。源程序如下:main()int n;for(n=10;n=100;n+)if(n%5=0)continue;printf(%d,n);,程序运行时,当n能被5整除时,将执行continue;语句,这次循环到此结束,不再执行printf(%d,n);语句,只有当n不能被5整除时,才执行printf(%d,n);语句。,2Break 语句break语句的一般形式是:break;在循环结构中使用break;语句,可强制结束循环。不管循环条

14、件是否成立,都将跳出它所在的本重循环,结束本重循环的执行。注意:它不能跳出多重循环,只能跳出本重循环。,例5.10 使用break语句的例子。源程序如下:main()int i,s;s=0;for(i=1;i5)break;printf(s=%dn,s);,此例中,如果没有break语句,则循环将执行10次;而含有break语句后,当循环执行到第3次时,i等于3,s的值为6,if语句的条件成立,将会执行到break语句,于是for循环到此结束,提前终止了循环。break语句只能用于循环语句和switch语句中。break语句是终止循环,而continue语句只是结束本次循环,两条语句功能不同,请不要混淆。,5.4 简单的程序调试,读者可能在上机操作时,遇到了一个头疼的问题,怎么修改程序也总是报错,不知从何入手。这就是程序调试的问题。归纳起来,程序出错大致有三种情况:编译时出错、运行时出错和运行结果不符合要求。,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号