C语言课件第05章

上传人:汽*** 文档编号:579033275 上传时间:2024-08-25 格式:PPT 页数:41 大小:347.53KB
返回 下载 相关 举报
C语言课件第05章_第1页
第1页 / 共41页
C语言课件第05章_第2页
第2页 / 共41页
C语言课件第05章_第3页
第3页 / 共41页
C语言课件第05章_第4页
第4页 / 共41页
C语言课件第05章_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C语言课件第05章》由会员分享,可在线阅读,更多相关《C语言课件第05章(41页珍藏版)》请在金锄头文库上搜索。

1、第第5章章 循环结构的程序设计循环结构的程序设计5.1 循环结构问题的提出循环结构问题的提出5.2 解决单重循环的问题解决单重循环的问题5.3 解决多重循环的问题解决多重循环的问题5.4 简单的程序调试简单的程序调试5.1 循环结构问题的提出循环结构问题的提出在在用用计计算算机机解解决决大大量量的的实实际际问问题题时时,经常会遇到如下许多重复运算的问题。经常会遇到如下许多重复运算的问题。(1)求求某某一一同同学学一一学学期期的的平平均均分分。解解决决方方法法是是将将该该同同学学这这一一学学期期所所有有考考核核成成绩绩累累加加,再再除除以以考考核核门门数数,就就得得到到该该生生的的平平均分。均分

2、。(2)计计算算:1*2*3*n。这这是是一一个个累累乘乘的的问问题题,每每个个乘乘数数与与前前面面的的一一个个数数都都有有固固定定的的关关系系(后后面面的的数数比比前前面面的的数数大大1)。因因此此每每次次累累乘乘的的数数都都是是前前面面的的数数加加1,方方法法相同,实际这是一个重复累乘的问题。相同,实际这是一个重复累乘的问题。这这一一类类问问题题,重重复复的的次次数数有有些些情情况况是是已已知知的的,有有些些情情况况是是未未知知的的。但但是是这这些些问问题题都都带带有有重重复复性性的的工工作作,解解决决这这类类问问题题,采用循环结构最为适当。采用循环结构最为适当。有有些些问问题题,采采用用

3、单单重重循循环环就就能能解解决决,比比如如上上面面所所举举的的两两个个例例子子,都都可可以以采采用用单单重重循循环环;而而有有些些问问题题,比比如如说说二二维维表表格格数数据据输输出出的的问问题题,则则需需要要采采用用双双重重循循环环才才能能解决。解决。C语语言言提提供供了了三三种种实实现现循循环环结结构构的的语语句句,它它们们分分别别是是:while语语句句、do-while语语句句和和for语语句句,三三种种循循环环语语句句各各有有不不同同的的特特点,我们可以灵活使用。点,我们可以灵活使用。5.2 解决单重循环的问题解决单重循环的问题5.2.15.2.1whilewhile循环语句循环语句

4、while循环语句的形式如下:循环语句的形式如下: while(表达式)循环体语句表达式)循环体语句while循循环环语语句句的的执执行行过过程程如如图图5-1所所示。示。图图5-1 while语语句句的的执执行行说明说明(1)用用while语语句句构构成成的的是是“当当型型”循循环环结结构构,它它的的特特点点是是:“先先判判断断,后后执执行行”,如如果果表表达达式式的的最最初初值值为为0,则则循循环环体体语语句句一一次次也也不不执执行行。只只有有当当表表达达式式的的值值为为非非0时时,才才能能执执行行循循环环体体语语句句。执执行行完完循循环环体体语语句句后后,再再返返回回循循环环的的开开始始

5、部部位位,判判断断表表达达式式的值,决定是否继续循环。的值,决定是否继续循环。(2)循循环环体体语语句句只只能能是是一一条条语语句句,如如需需要要使使用用多多条条语语句句,必必须须采采用用复复合合语语句句的的形式。形式。(3)循循环环体体内内一一定定要要有有能能够够改改变变表表达达式式的的值值的的操操作作,最最终终使使其其表表达达式式的的值值变变为为0,否则将形成无休止的,否则将形成无休止的“死死”循环。循环。例例5.15.1 求求:1+2+3+n的的累累加加求求和和的的值。值。问题分析:问题分析:(1)我我们们首首先先需需要要设设置置一一个个存存放放累累加加求求和和的的变变量量sum,每每一

6、一次次加加一一个个数数放放入入变变量量sum中;中;(2)再再设设置置一一个个存存放放加加数数的的变变量量i,每每一一次次累累加加时时被被加加的的数数均均需需比比前前一一个个数数大大1;(3)最最后后还还需需设设置置一一个个结结束束累累加加的的变变量量n,确定累加到什么数为止。确定累加到什么数为止。根据以上分析,写出源程序如下:根据以上分析,写出源程序如下:main ( ) int i, n, sum; i=1; sum=0; printf ( Please input n : ); scanf (%d, &n ); while ( i=n ) /* 累累加加的的数数i 小小于于或或等等于终止

7、数于终止数n就循环累加,否则结束循环就循环累加,否则结束循环*/ sum=sum+i; i+; printf (sum=%dn, sum );说明说明(1)存存放放累累加加求求和和的的变变量量sum,说说明明后后必必须须赋赋初初值值,一一般般为为0,否否则则由由于于说说明明的的变量其原有初值不确定,导致结果有误。变量其原有初值不确定,导致结果有误。(2)程程序序中中sum=sum+i; 语语句句是是一一个个累累加加求求和和功功能能的的语语句句,它它是是将将变变量量sum中中的的数数值值加加上上变变量量i中中的的数数值值,求求和和后后再再放放入入变变量量sum中中,此此时时变变量量sum中中存存

8、放放的的数数值值已已经变为新的数值,原有数值已被覆盖掉。经变为新的数值,原有数值已被覆盖掉。以上程序运行情况如下:以上程序运行情况如下:Please input n : 100 sum=50505.2.25.2.2do-whiledo-while循环语句循环语句do-while 循环语句的形式如下:循环语句的形式如下: do 循环体语句循环体语句 while (表达式)表达式);do-while语句的执行过程如图语句的执行过程如图5-2所示。所示。图图5-2 do-while语句的执行过程语句的执行过程说明说明(1)用用do-while语语句句构构成成的的仍仍是是“当当型型循循环环”结结构构。

9、它它的的特特点点是是:“先先执执行行,后后判判断断”。遇遇到到do关关键键字字后后,首首先先执执行行循循环环体体语语句句,然然后后计计算算表表达达式式的的值值,如如表表达达式式的的值值为为非非0,则则继继续续执执行行循循环环体体语语句句,然然后后再再计计算算表表达达式式的的值值,如如表表达达式式的的值值为为0,则则结结束束循循环环,执执行行do-while语语句句后后面面的的语语句句。因因此此这这种种循循环环结结构构,最最少少也也可可以以执执行行一一次次循循环体语句。环体语句。(2)循循环环体体语语句句仍仍然然只只能能是是一一条条语语句句,如如需需要要使使用用多多条条语语句句,必必须须采采用用

10、复复合合语句的形式。语句的形式。(3)循循环环体体语语句句中中也也一一定定要要有有改改变变表表达达式式的的值值的的操操作作,最最终终使使其其表表达达式式的的值值变为变为0,结束循环。否则将成为,结束循环。否则将成为“死死”循环。循环。(4)在在关关键键字字while的的小小括括号号的的后后面面,一一定定要要加加分分号号“;”,千千万万不不能能忘忘记记,它它表表示示do-while语句到此结束。语句到此结束。例例5.25.2 求求:n!,即即计计算算123n的值。的值。源程序如下:源程序如下:main ( ) int i, n, s; i =1; s =1; printf ( Please in

11、put n: ); scanf (%d, &n ); do s = s*i ; /* 使用使用“累乘累乘”的公式的公式 */ i+; while ( i=n); printf (%d!= %dn, n, s );说明说明(1)存存放放累累乘乘求求和和的的变变量量s,说说明明后后必必须须赋赋初初值值,一一般般为为1,否否则则由由于于说说明明的的变变量其原有初值不确定,导致结果有误。量其原有初值不确定,导致结果有误。(2)程程序序中中s = s*i; 语语句句是是一一个个累累乘乘求求和和功功能能的的语语句句,它它是是将将变变量量s中中的的数数值值乘乘上上变变量量i中中的的数数值值,累累乘乘后后再再

12、放放入入变变量量s中中,此此时时变变量量s中中存存放放的的数数值值已已经经变变为为新新的的数数值值,原有数值已被覆盖掉。原有数值已被覆盖掉。以上程序运行情况如下:以上程序运行情况如下:Please input n : 5 5!=1205.2.35.2.3forfor循环语句循环语句for循环语句的形式如下:循环语句的形式如下: for ( 表表达达式式1;表表达达式式2;表表达达式式3 ) 循环体语句循环体语句for语句的执行过程如图语句的执行过程如图5-3所示。所示。图图5-3 for语语句句的的执执行行过过程程说明说明(1)由由图图5-3可可知知,for循循环环语语句句的的特特点点仍仍是是

13、“先先判判断断,后后执执行行循循环环体体”。遇遇到到for关关键键字字,先先计计算算表表达达式式1的的值值,然然后后再再判判断断表表达达式式2的的值值,如如其其值值为为非非0,则则执执行行循循环环体体语语句句,执执行行完完循循环环体体语语句句后后,再再来来计计算算表表达达式式3的的值值,然然后后再再判判断断表表达达式式2的的值值。如如其其值值为为0,则则结结束束for循循环环语语句句,执执行行for循环语句后面的语句。循环语句后面的语句。(2)循循环环体体语语句句仍仍然然只只能能是是一一条条语语句句,必要时可采用复合语句的形式。必要时可采用复合语句的形式。(3)此此结结构构仍仍需需最最终终使使

14、表表达达式式2的的值值变变为为0,以以结结束束循循环环。否否则则将将会会造造成成“死死”循循环。环。(4)for语语句句的的表表示示形形式式相相当当灵灵活活,其其中中:表表达达式式1和和表表达达式式3均均可可省省略略,但但一一定定要要确确保保表表达达式式2最最终终值值等等于于0。表表达达式式1或或表表达达式式3省省略略后后,其其分分号号“;”必必须须有有,不不能能省略,即:省略,即:for ( ; 表达式表达式2 ; ) 循环体语句循环体语句(5)通通常常情情况况下下:表表达达式式1代代表表循循环环控控制制变变量量的的初初值值,表表达达式式2代代表表循循环环控控制制变变量量的的终终值值,而而表

15、表达达式式3代代表表循循环环控控制制变变量量的的增增量量,例例如如:求求n!,可可简简单单表表示示成成:s=1; for ( i=1; i=n; i+) s=s*i;5.2.45.2.4三种循环语句的比较三种循环语句的比较for循循环环和和while循循环环语语句句结结构构均均是是先先判判断断循循环环条条件件,条条件件成成立立,才才执执行行循循环环体体,具具有有“先先判判断断,后后执执行行”特特点点;而而do-while循循环环语语句句则则是是先先执执行行循循环环体体,然然后后再再判判断断循循环环条条件件,具具有有“先先执执行行,后后判判断断”的的特特点。点。5.3 解决多重循环的问题解决多重

16、循环的问题5.3.15.3.1三种循环语句的混合嵌套问题三种循环语句的混合嵌套问题例例5.85.8 求求2100之间的所有素数,并输出。之间的所有素数,并输出。问题分析问题分析判判断断一一个个数数是是否否是是素素数数的的方方法法,我我们们在在前前面面已已经经介介绍绍了了。设设某某一一个个数数为为a,判判断断该该数数是是否否为为素素数数,就就是是用用这这个个数数分分别别被被2去去除除,如如果果都都不不能能被被除除尽尽,则则该该数数为为素素数数,如有一次被除尽,则该数就不是素数。如有一次被除尽,则该数就不是素数。现现需需求求2100之之间间的的所所有有素素数数,判判断断素素数数的的方方法法是是相相

17、同同的的,只只要要利利用用循循环环依依次次从从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 & j3时时,进进入入内内层层循循环环,若若i为为素素数数,flag的的值值不不变变,仍仍为

18、为1,若若i不不是是素素数数,flag的的值值变变为为0,并并立立即即结结束束内内循循环环。当当退退出出内内循循环环后后,if语语句句判判断断flag的的值值为为1时时,输输出出素素数数i;若若i不不是是素素数数,flag的的值值变变为为0,不不做做输出。输出。外外层层循循环环继继续续取取下下一一个个数数,通通过过内内层层循循环环判判断断是是否否是是素素数数,直直到到外外层层循循环环取取的的数数i大大于于100后后,结结束束外外层层循循环环,结结束束程程序序运行。运行。通通过过以以上上例例子子我我们们看看到到,外外层层循循环环的的目目的的是是,每每次次循循环环分分别别从从2100的的数数中中取

19、取某某一一个个数数,已已知知循循环环的的次次数数为为99次次,采采用用for循循环环比比较较合合适适;而而内内层层循循环环是是判判断断某某个个数数是是否否是是素素数数,在在每每一一次次的的除除法法中中,当当某某一一次次除除法法运运算算出出现现余余数数为为0时时,表表明明该该数数不不是是素素数数,立立即即结结束束内内层层循循环环,所所以以内内层层循循环环次次数数事事先先难难以以确确定定,因因此此采采用用while循循环环最为适当。最为适当。在在解解决决多多重重循循环环问问题题时时,往往往往需需要要具具体体问问题题具具体体分分析析,根根据据实实际际问问题题的的内内容容和和特特点点,采采用用不不同同

20、的的循循环环结结构构。因因此此在在解解决决多多重重循循环环问问题题时时,三三种种循循环环结结构构并并举举,适适合合哪哪一一种种循循环环结结构构,就就采采用用哪哪一一种种循循环环结结构。读者可在实践过程中灵活使用。构。读者可在实践过程中灵活使用。5.3.25.3.2 continuecontinue语语句句和和breakbreak语句在循环中的应用语句在循环中的应用1Continue 语句语句continue语语句句的的一一般般形形式式: continue; 该语句的功能是:结束本次循环。也该语句的功能是:结束本次循环。也就是说,不管在该语句的后面是否还有其就是说,不管在该语句的后面是否还有其他

21、执行语句,遇到他执行语句,遇到continue;语句,本次循语句,本次循环到此结束,接着进行下一次循环的判断。环到此结束,接着进行下一次循环的判断。例例5.95.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 ); 语语

22、句句,只只有有当当n不不能能被被5整整除除时时,才才执执行行printf (%d, n ); 语语句。句。2Break 语句语句break语句的一般形式是:语句的一般形式是: break;在在循循环环结结构构中中使使用用break;语语句句,可可强强制制结结束束循循环环。不不管管循循环环条条件件是是否否成成立立,都都将将跳跳出出它它所所在在的的本本重重循循环环,结结束束本本重重循循环环的的执执行行。注注意意:它它不不能能跳跳出出多多重重循循环环,只能跳出本重循环。只能跳出本重循环。例例5.105.10 使用使用break语句的例子。语句的例子。源程序如下:源程序如下:main ( ) int

23、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备13022795号 | 川公网安备 51140202000112号