1、1第五章第五章 循环结构程序设计循环结构程序设计 教学目标教学目标掌握掌握whilewhile语句、语句、do-whiledo-while语句和语句和forfor语句的使用;语句的使用;掌握循环嵌套的运用;掌握循环嵌套的运用;掌握设计循环程序的递推法和穷举法;掌握设计循环程序的递推法和穷举法;了解了解gotogoto语句和用语句和用gotogoto语句构成循环结构的方法;语句构成循环结构的方法;了解了解breakbreak语句和语句和contiunecontiune语句在循环体中的作用。语句在循环体中的作用。基本要求基本要求 能够正确地理解和描述控制循环的表达式,能够正能够正确地理解和描述控制
2、循环的表达式,能够正确地使用确地使用forfor、whilewhile和和do-whiledo-while这三种循环来解决实际这三种循环来解决实际问题。问题。11/14/2022 15:14:19长江大学计算机科学学院2 循环结构的特点:循环结构的特点:在给定条件在给定条件(循环条件循环条件)成立时,反复成立时,反复执行某程序段执行某程序段(循环体循环体),直到给定条件不,直到给定条件不成立时为止。成立时为止。循环的实现方式:循环的实现方式:1.用用goto语句和语句和if语句构成循环。语句构成循环。2.用用while循环语句。循环语句。3.用用do-while循环语句。循环语句。4.用用fo
3、r循环语句。循环语句。11/14/2022 15:14:20长江大学计算机科学学院35.1 goto语句及用语句及用goto语句构成循环语句构成循环 1.语句标号语句标号 语句标号就是给程序中的某一个语句定义的标号,可以语句标号就是给程序中的某一个语句定义的标号,可以是任意合法的标识符(是任意合法的标识符(注意:不能用整数注意:不能用整数)。)。C程序中的任何一个可执行语句之前都可以加上语句标程序中的任何一个可执行语句之前都可以加上语句标号。例如号。例如:stop:printf(ENDn);语句标号和语句之间用冒号分隔。语句标号和语句之间用冒号分隔。语句标号常用作为语句标号常用作为goto语句
4、的转向目标。如:语句的转向目标。如:goto stop;如果程序中没有用如果程序中没有用goto语句改变程序的执行顺序,也就语句改变程序的执行顺序,也就没有必要出现语句标号。没有必要出现语句标号。11/14/2022 15:14:20长江大学计算机科学学院42.goto语句语句 goto语句称为无条件转向语句。语句称为无条件转向语句。一般形式为:一般形式为:goto 语句标号语句标号;作用:把程序的执行转移到语句标号所在的位作用:把程序的执行转移到语句标号所在的位置。置。注意:这个语句标号必须与此注意:这个语句标号必须与此goto语句在同语句在同一个函数之内。一个函数之内。goto语句不符合结
5、构化程序设计的原则,一般语句不符合结构化程序设计的原则,一般应避免使用。应避免使用。主要用途:主要用途:1.与与if语句一起构成循环结构。语句一起构成循环结构。2.能够大大地提高程序的执行效率时。能够大大地提高程序的执行效率时。11/14/2022 15:14:20长江大学计算机科学学院53.用用goto语句构成的循环结构语句构成的循环结构#include stdio.hvoid main()int n=0;char ch;printf(input a stringn);loop:ch=getchar();n+;if(ch!=n)goto loop;n=n-1;/*不要字符不要字符n*/pri
6、ntf(%d,n);goto语句通语句通常与条件语句常与条件语句配合构成配合构成条件条件转移语句转移语句,用,用来实现来实现构成循构成循环环或或跳出循环跳出循环等功能。等功能。例例5.1 统计统计从键盘输入的从键盘输入的一行字符的个一行字符的个数。数。11/14/2022 15:14:20长江大学计算机科学学院6例例5.2 输入一组数据求和输入一组数据求和#include void main()int number,sum=0;loop:scanf(%d,&number);sum+=number;if(number!=0)goto loop;printf(The total sum is%dn
7、,sum);从键盘输入完一组数据后,再输入一个从键盘输入完一组数据后,再输入一个0 0作作为为结束输入结束输入数据的数据的标志标志。11/14/2022 15:14:20长江大学计算机科学学院75.2 while循环语句循环语句由由whilewhile语句构成的循环称为语句构成的循环称为“当型当型”循环。循环。whilewhile循环的循环的一般形式一般形式如下:如下:while(while(表达式表达式)循环体语句循环体语句whilewhile语句的语句的执行过程执行过程:先计算先计算whilewhile表达式的值,当表达式的值为表达式的值,当表达式的值为非零时,便执行循环体语句,之后再计算
8、该表达非零时,便执行循环体语句,之后再计算该表达式的值,由此构成循环,直到有一次求得表达式式的值,由此构成循环,直到有一次求得表达式的值为零时才结束循环,并继续执行循环体语句的值为零时才结束循环,并继续执行循环体语句之外的后续语句。之外的后续语句。图图5.1 while循环流程图循环流程图11/14/2022 15:14:20长江大学计算机科学学院8#include void main()int n=0;char ch;printf(input a string:n);ch=getchar();while(ch!=n)n+;ch=getchar();printf(%d,n);用用while语句
9、改写例语句改写例5.1的程序的程序统计从键盘输入的一行字符的个数。统计从键盘输入的一行字符的个数。说明:说明:(1)while(1)while语句中语句中的表达式可以是的表达式可以是任意合任意合法的法的C C表达式。表达式。(2)(2)如果循环体语句是如果循环体语句是复合语句复合语句,一定要用,一定要用 括起来。括起来。(3)(3)在循环体语句中应在循环体语句中应该包含能够使循环趋于该包含能够使循环趋于结束的操作,以避免出结束的操作,以避免出现死循环。现死循环。11/14/2022 15:14:20长江大学计算机科学学院9例例5.3 编程求编程求1+2+3+100的值。的值。这是一个求这是一个
10、求累加和累加和的问题。设置的问题。设置2 2个变量个变量:i i:循环控制变量循环控制变量(也作为加数也作为加数),),初值为初值为1 1,每循环一次每循环一次i i的值增的值增1 1,一直循环到,一直循环到i i的值超的值超过过100100为止。为止。sumsum:存放这存放这100100个数的和值,先求个数的和值,先求0+10+1的的和并将其放在和并将其放在sumsum中,然后把中,然后把sumsum中的数加上中的数加上2 2再存放在再存放在sumsum中,依次类推。中,依次类推。sumsum累加的过程要放在循环体中,由计算累加的过程要放在循环体中,由计算机来判断所加的数是否已经超过机来判
11、断所加的数是否已经超过100100。11/14/2022 15:14:20长江大学计算机科学学院10#include void main()int i,sum;i=1;sum=0;while(i=100)sum=sum+i;i+;/*变量i既作为循环变量,控制循环次数,*/*同时又作为实际变量(加数)使用。*/printf(sum=%dn,sum);例例5.3程序程序,求求1+2+3+100的值的值sum=0sum=0sum=0sum=0ii程序运行结果为程序运行结果为:sum=505011/14/2022 15:14:20长江大学计算机科学学院115.3 用用do-while语句构成的循环语
12、句构成的循环 由由do-whiledo-while语句构成的循环称为语句构成的循环称为“直到型直到型”循环循环。do-whiledo-while语句的一般形式:语句的一般形式:dodo 循环体语句循环体语句 while(while(表达式表达式);do-whiledo-while语句的执行过程语句的执行过程:先执行循环体语句,再求表达式的值,若表达式的值为先执行循环体语句,再求表达式的值,若表达式的值为“真真”(非非0)0)则再执行循环体语句,由此则再执行循环体语句,由此构成循环构成循环,直到表达,直到表达式的值为式的值为“假假”(0)(0)时结束循环。如图时结束循环。如图5.35.3所示。所
13、示。do-whiledo-while语句和语句和whilewhile语句的语句的区别区别在于在于do-whiledo-while是先是先执行循环体语句,后判断循环条件,因此执行循环体语句,后判断循环条件,因此do-whiledo-while至少要至少要执行一次循环体。执行一次循环体。11/14/2022 15:14:20长江大学计算机科学学院12#include void main()int i,sum;i=1;sum=0;do sum=sum+i;i+;while(i=100);printf(sum=%dn,sum);用用do-while语句改写例语句改写例5.3的程序的程序题目:求题目:求
14、1+2+3+1001+2+3+100的值的值注意注意:N_SN_S流程图的直到型循环结构的流程图的直到型循环结构的循环条件循环条件的描述方法的描述方法与与C C语言的语言的do-whiledo-while语句的语句的循环条件循环条件的测试方法稍有不同。的测试方法稍有不同。i=100i100i100时结束循环是同一概念的两时结束循环是同一概念的两种描述方式。种描述方式。sum=0sum=0sum=0sum=0ii这里这里一定要一定要有一个有一个分号分号11/14/2022 15:14:20长江大学计算机科学学院135.4 for语句和用语句和用for语句构成的循环语句构成的循环 forfor语句
15、的一般形式为:语句的一般形式为:for(for(表达式表达式1 1;表达式表达式2 2;表达式表达式3)3)循环体语句循环体语句forfor循环语句的执行过程是:循环语句的执行过程是:(1)(1)计算计算“表达式表达式1 1”的值。的值。(2)(2)计算计算“表达式表达式2 2”的值;的值;若其值为若其值为非零非零,转至,转至步骤步骤(3)(3);若其值为若其值为零零,则转至,则转至步骤步骤(5)(5)。(3)(3)执行一次循环体语句。执行一次循环体语句。(4)(4)计算计算“表达式表达式3 3”;然后转向;然后转向步骤步骤(2)(2),构成循环构成循环。(5)(5)结束循环结束循环,执行,执
16、行forfor循环之后的语句。循环之后的语句。11/14/2022 15:14:21长江大学计算机科学学院14for语句语句非常适合非常适合计数循环计数循环,其常规使用方法为,其常规使用方法为:“表达式表达式1 1”用来给循环变量赋初值或做一些初始工作;用来给循环变量赋初值或做一些初始工作;“表达式表达式2 2”用来作为判断循环是否结束的条件;用来作为判断循环是否结束的条件;“表达式表达式3 3”用来修改循环变量的值,使得循环能够趋于结用来修改循环变量的值,使得循环能够趋于结束。束。for语句的语句的常规常规使用方法使用方法#include void main()/*程序1*/int i,su
17、m;for(i=1,sum=0;i=100;i+)sum=sum+i;printf(sum=%dn,sum);“表达式表达式1 1”是逗号表达是逗号表达式式给循环变量赋初值给循环变量赋初值做一些做一些初始工作,准备累加!初始工作,准备累加!判断判断循环是否结束!循环是否结束!使使得得循环循环能够能够趋于结束。趋于结束。11/14/2022 15:14:21长江大学计算机科学学院15 从语法上来讲,从语法上来讲,三个表达式三个表达式都可以是都可以是任意合法的任意合法的C C表达式表达式,各表达式之间用各表达式之间用“;”隔开,并且这隔开,并且这三个表达式三个表达式都是都是任选项任选项。如下几种形
18、式的如下几种形式的forfor循环语句,都能正确地求出循环语句,都能正确地求出1+2+3+1001+2+3+100的值。的值。for语句的语句的非常规非常规使用方法使用方法#include#include void main()/void main()/*程序程序2 2*/intint i=1,sum=0;i=1,sum=0;for(for(;i=100;i+)i=100;i+)sum=sum+i;sum=sum+i;printf(printf(“sumsum=%dn=%dn”,sum);sum);表达式表达式1 1省略!省略!#include#include void main()/void
19、 main()/*程序程序3 3*/intint i=1,sum=0;i=1,sum=0;for(for(;i=100 i=100;)sum=sum+i;sum=sum+i;i+;i+;printf(printf(“sumsum=%dn=%dn”,sum);,sum);循环体语句是复合循环体语句是复合语句,花括号不能语句,花括号不能省省!表达式表达式1 1和和表达式表达式3 3都省都省略略!11/14/2022 15:14:21长江大学计算机科学学院16for语句的非常规使用方法语句的非常规使用方法2#include#include void main()/void main()/*程序程序4
20、 4*/intint i=1,sum=0;i=1,sum=0;for(for(;)sum=sum+i+;sum=sum+i+;if(i100)if(i100)gotogoto pendpend;pendpend:printf(printf(“sumsum=%dn=%dn”,sum);,sum);三个表达式三个表达式都被省略都被省略!分隔符分隔符“;”不能省。不能省。由于没有由于没有表达式表达式2 2,用,用gotogoto语句语句结束结束循环。循环。#include#include void main()/void main()/*程序程序5 5*/intint i,sum=0;i,sum=0
21、;for(for(i=1i=1;i=100 i=100;sum=sum+i+sum=sum+i+);printf(printf(“sumsum=%dn=%dn”,sum);,sum);循环体语句是一个空语句!循环体语句是一个空语句!11/14/2022 15:14:21长江大学计算机科学学院17注意注意在循环体语句之前不能有在循环体语句之前不能有分号分号#include void main()int i,sum=0;for(i=1;i=100;i+);sum=sum+i;printf(sum=%dn,sum);运行结果为:sum=101 循环体语句是一个循环体语句是一个空语句空语句!sum=s
22、um+i;只在循环结束以后才被执行到。11/14/2022 15:14:21长江大学计算机科学学院18例例5.4 求求n!。即计算。即计算123n的值。的值。分析:分析:该题的算法与该题的算法与累加求和累加求和的算法的算法基本相同基本相同。注意:注意:多个数相乘的多个数相乘的结果结果可能会可能会很大很大,所以在程序中采用,所以在程序中采用长整型变量长整型变量来存放乘积的值。来存放乘积的值。#include void main()int i,n;long s=1;printf(Enter n:);scanf(%d,&n);for(i=1;i=n;i+)s=s*i;printf(%d!=%ldn,
23、n,s);程序运行结果为:程序运行结果为:Enter n:66!=72011/14/2022 15:14:21长江大学计算机科学学院19例例5.5 编程计算多个圆的面积编程计算多个圆的面积 圆的半径从圆的半径从0.50.5mm开始开始,按增按增1 1 mm的的规律递增。规律递增。直接用半径直接用半径r r作为作为forfor语句的循环控制语句的循环控制变量,每循环一次使变量,每循环一次使r r的值增的值增1,1,直到直到r r大大于于5.55.5为止。为止。#include void main()float r,s;for(r=0.5;r=5.5;r+)s=3.14159*r*r;printf
24、(r=%f,s=%fn,r,s);变量变量r r具有具有双双重功能重功能,它既,它既是是循环控制变循环控制变量量,又是,又是圆的圆的半径值。半径值。循环循环体共执行体共执行6 6次,次,当当r r增到增到6.56.5时,时,条件表达式条件表达式r=5.5r=5.5的值为的值为0 0,从而退出循,从而退出循环。环。程序运行结果为:程序运行结果为:r=0.500000 s=0.785398r=1.500000 s=7.068577r=2.500000 s=19.634937r=3.500000 s=38.484478r=4.500000 s=63.617199r=5.500000 s=95.033
25、096 11/14/2022 15:14:21长江大学计算机科学学院205.5 5.5 循环结构的嵌套循环结构的嵌套 在一个循环语句的循环体内又完整地包在一个循环语句的循环体内又完整地包含了另一个循环语句,称为循环嵌套。含了另一个循环语句,称为循环嵌套。11/14/2022 15:14:21长江大学计算机科学学院21 为了增加程序的可读性,为了增加程序的可读性,循环嵌套的书写循环嵌套的书写尽量尽量采用采用缩进形式。缩进形式。例例5.6 5.6 循环嵌套的应用循环嵌套的应用-输出九九乘法表。输出九九乘法表。#include void main()int i,j;for(i=1;i=9;i+)fo
26、r(j=1;j=i;j+)printf(%1d*%1d=%2d ,i,j,i*j);printf(n);11/14/2022 15:14:21长江大学计算机科学学院22程序的运行结果为:程序的运行结果为:1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16
27、8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 例例5.65.6程序输出的九九乘法表程序输出的九九乘法表11/14/2022 15:14:21长江大学计算机科学学院235.6 break语句和语句和continue语句语句 break语句语句在循环控制中的作用是强行结在循环控制中的作用是强行结束该语句所在的整个循环结构,转向执行循束该语句所在的整个循环结构,转向执行循环体语句后的下一条语句(环体语句后的下一条语句(减少循环的执行减少循环
28、的执行次数次数)。)。continue语句语句的作用是提前结束多次循的作用是提前结束多次循环中的某一次循环,即跳过循环体语句中位环中的某一次循环,即跳过循环体语句中位于于continue语句之后的其余语句,从而进入语句之后的其余语句,从而进入下一次循环(下一次循环(循环的执行次数没有变化,但循环的执行次数没有变化,但某一次循环的循环体语句没有全部执行某一次循环的循环体语句没有全部执行)。)。11/14/2022 15:14:21长江大学计算机科学学院241.break语句语句 当当break语句用在语句用在switch语句中时,可语句中时,可以使流程以使流程跳出跳出由由switch语句构成的多
29、分支语句构成的多分支结构。结构。当当break语句用在语句用在do-while、for或或while循环语句中时循环语句中时,也可以也可以使程序终止循环,跳使程序终止循环,跳出循环结构出循环结构。通常。通常break语句总是与语句总是与if语句语句配合使用,即当满足某个给定的条件要求配合使用,即当满足某个给定的条件要求时便跳出循环。时便跳出循环。11/14/2022 15:14:21长江大学计算机科学学院25例例5.7 在循环体中使用在循环体中使用break语句。语句。#include void main()int i,s;s=0;for(i=1;i5)break;printf(s=%dn,s
30、);程序的输出结果如下:程序的输出结果如下:s=1 s=3 程序中的循环语句本应程序中的循环语句本应循环循环1010次次,但是,当循,但是,当循环进行到环进行到第第3 3次次时,时,i i的的值为值为3 3,s s的值为的值为6 6,ifif语句中的表达式语句中的表达式s5s5的的值为值为1 1,于是执行,于是执行breakbreak语句,语句,跳出跳出forfor循环循环,从而提前从而提前终止终止了了循环循环的的执行。执行。11/14/2022 15:14:21长江大学计算机科学学院26在循环体中使用在循环体中使用break语句。语句。注意注意 只能在只能在do-whiledo-while、
31、forfor、whilewhile循环语句或循环语句或switchswitch语语句体内使用句体内使用breakbreak语句,其语句,其作用是使程序提前终止它作用是使程序提前终止它所在的语句结构,转去执所在的语句结构,转去执行下一条语句;若程序中行下一条语句;若程序中有上述四种结构语句的嵌有上述四种结构语句的嵌套使用,则套使用,则breakbreak语句语句只能只能终止终止它所在的它所在的最内层的语最内层的语句结构句结构。#include void main()int a=0,i;for(i=1;i5;i+)switch(i)case 1:a+=2;case 3:break;case 2:a
32、+=1;default:a+=2;printf(%d,a);运行结果:运行结果:255711/14/2022 15:14:21长江大学计算机科学学院272.continue语句语句 例例5.8 在循环体中使用在循环体中使用continue语句。语句。#include void main()int i,s=0;for(i=1;i=8;i+)s=s+i;printf(ni=%d ,i);if(i%2=0)continue;printf(s=%dn,s);continuecontinue语句只能在语句只能在do-whiledo-while、forfor和和whilewhile循环语句循环语句中使用,
33、其作用中使用,其作用是是提前结束提前结束多次循环中的多次循环中的某一次循环某一次循环。运行结果:运行结果:i=1 s=1i=2 i=3 s=6i=4 i=5 s=15i=6 i=7 s=28i=8 在执行的在执行的8 8次循环次循环中,当中,当i i的值为偶的值为偶数时,执行数时,执行continuecontinue语句,语句,其作用是其作用是跳过跳过printf(“sprintf(“s=%=%dn”,dn”,s s););语句,语句,继续执继续执行下一次循环行下一次循环。11/14/2022 15:14:21长江大学计算机科学学院285.7 循环结构程序举例循环结构程序举例 常用的循环处理算
34、法常用的循环处理算法穷举法穷举法递推法递推法1.1.穷举法穷举法 “穷举法穷举法”也称为也称为“枚举法枚举法”或或“试试凑法凑法”,即即采用循环结构将所有可能采用循环结构将所有可能出现的情况一一进行测试,判断是否满出现的情况一一进行测试,判断是否满足给定的条件。足给定的条件。11/14/2022 15:14:21长江大学计算机科学学院29 题目题目:从键盘从键盘输入全班的学习输入全班的学习成绩,统计出最成绩,统计出最高分、最低分和高分、最低分和平均分。平均分。分析分析:由于由于不不知道学生人数知道学生人数,程序中用一个程序中用一个负负数数来作为来作为结束输结束输入成绩的标志入成绩的标志。例例5
35、.9 极值问题极值问题#include void main()int x,max,min,n;float sum=0;max=0;min=100;n=0;printf(Enter x(-1 to end):);scanf(%d,&x);while(x=0)sum=sum+x;n=n+1;if(xmax)max=x;if(x0)printf(max=%d,min=%d,aver=%fn,max,min,sum/n);运行结果如下:运行结果如下:Enter x(-1 to end):87 76 53 99 58 -1max=99,min=53,aver=74.599998 11/14/2022 1
36、5:14:21长江大学计算机科学学院30例例5.10 素数问题素数问题#include void main()int m,i,flag;printf(Enter a integer:);scanf(%d,&m);flag=1;/*先假定m是素数*/for(i=2;i=m-1;i+)if(m%i=0)flag=0;break;printf(%d:,m);if(flag)printf(YES!n);else printf(NO!n);素数是一个大于2,且只能被1和它自己整除的整数。编程求输入的某个正整数是否为素数。若是,输出YES,若不是,输出NO。分析:判别某数m是否为素数的最简单方法是:穷举出
37、所有可能的除数2、3、4、一直到m-1,分别判定m能否被它们整除,只要有一个能整除,m就不是素数;只有全部都不能整除时,m才是素数。运行结果如下:运行结果如下:Enter a integer:157 157:YES!实际上只要试除到实际上只要试除到m/2或或sqrt(m)就就足够了。足够了。11/14/2022 15:14:21长江大学计算机科学学院31例例5.11 百钱买百鸡问题百钱买百鸡问题 “鸡翁一,值钱三;鸡母一,值钱五;鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”。分析:设鸡翁x只、鸡母y只、鸡雏z只。解题的思路是:鸡翁数x的值可能是0,33中的任何一个值;鸡母数y的值可
38、能是0,20中的任何一个值;将所有可能出现的情况都一一进行测试,若满足要求就把这种情况输出,作为可能的一个解。#include void main()int x,y,z;for(x=0;x=33;x+)for(y=0;y=20;y+)z=100-x-y;if(x*3.0+y*5.0+z/3.0=100.0)printf(x=%d,y=%d,z=%dn,x,y,z);该程序能从该程序能从七百多种七百多种可能的组合情况可能的组合情况中中挑选出挑选出四种四种满足要求的答案。运行结满足要求的答案。运行结果如下:果如下:x=4,y=12,z=84x=11,y=8,z=81x=18,y=4,z=78 x=
39、25,y=0,z=75 11/14/2022 15:14:21长江大学计算机科学学院32例例5.12 长材料截取短料的最优化方法长材料截取短料的最优化方法 题目题目:有一根长度为323米的钢材料,要将它截取成两种规格a、b的长度分别为17米和27米的短料,每种至少1段,问分隔成a,b各多少段后,剩余的残料 r 最少?分析:规格a的钢材料的个数na可能为:1、2、3、(321-27)/17。#include void main()int na,nb,a,b,r,rmin;na=1;nb=1;rmin=323-17-27;for(na=1;na=(323-27)/17;na+)nb=(323-na
40、*17)/27;r=323-na*17-nb*27;if(r rmin)rmin=r;a=na;b=nb;printf(a=%d,b=%d,min=%dn,a,b,rmin);运行结果如下:运行结果如下:a=11,b=5,min=1 11/14/2022 15:14:21长江大学计算机科学学院332.递推法递推法 “递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。例例5.13 猴子吃桃问题猴子吃桃问题:小猴在某天摘桃若干个,当天吃掉一半,觉得还不过瘾,又多吃了一个。第二天吃了剩下的桃子的一半又多一个;以后每天都这样吃下去,直到第8天要吃时只剩下一个桃子了,问
41、小猴子第一天共摘下了多少个桃子?分析分析:这是一个“递推”问题,先从最后一天的桃子数推出倒数第二天的桃子数,再从倒数第二天的桃子数推出倒数第三天的桃子数。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1 的一半减1,递推公式为:x xn n=xn-1n-1/2 1。即:x xn-1n-1=(x xn n+1)2。11/14/2022 15:14:21长江大学计算机科学学院34例例5.13 猴子吃桃问题的程序猴子吃桃问题的程序#include void main()int tao,n;tao=1;/*已知第8天的桃子数*/for(n=7;n=1;n=n-1)tao=(tao+1)*2;pr
42、intf(tao(1)=%dn,tao);程序执行后输出结果如下:tao(1)=382 11/14/2022 15:14:21长江大学计算机科学学院35例例5.14 斐波那契数列斐波那契数列:1,1,2,3,5,8 此数列的第一项和第二项为1,从第三项开始,每一项的值是前两项的值之和;编程输出该数列的前15项。每行输出5个数。分析:斐波那契数列的递推公式递推公式为:fn=fn-1+fn-2,用第1项和第2项的值求出第3项的值以后,再用第2项和第3项的值求出第4项的值,#include void main()int i,f1=1,f2=1,f3;printf(n%5d%5d,f1,f2);for
43、(i=3;i=15;i+)f3=f1+f2;printf(%5d,f3);if(i%5=0)printf(n);f1=f2;f2=f3;程序执行后输出结果如下:程序执行后输出结果如下:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 11/14/2022 15:14:21长江大学计算机科学学院36例例5.15 求求pi的近似值的近似值 分析分析:本题的递推公式比上面的两个例子复杂,只能将分子和分母分别递推出新的值后再做除法运算。其递推方法和求解的步骤如下:1.分母n的初值为1,递推公式:n=n+2;2.分子s的初值为1.0,递推公式:s=(-1)*s;3.公
44、式中某项的值为:t=s/n。从以上求pi的公式来看,不能决定n的最终值应该是多少;但可以用最后一项t=s/n的绝对值小于小于0.0001来作为循环的结束条件。题目题目:用公式 pi/4=1-1/3+1/5-1/7 求pi的近似值,直到最后一项的绝对值小于10-4为止。11/14/2022 15:14:21长江大学计算机科学学院37#include#include math.h void main()int n;float t,s,pi;pi=0;/*变量pi用来存放累加和*/n=1;/*第一项的分母值为1*/s=1.0;/*第一项的分子值为+1*/t=s/n;/*先求出第一项的值*/while
45、(fabs(t)=0.0001)pi=pi+t;n+=2;s=-1*s;t=s/n;/*递推出下一项的值*/printf(pi=%fn,pi*4);程序执行后输出以下结果。程序执行后输出以下结果。pi=3.141397pi/4=1-1/3+1/5-1/7+1/911/14/2022 15:14:21长江大学计算机科学学院38 分析:求最大公约数的迭代步骤如下:(1)输入两个正整 数m,n;(2)用m除以n得到 一个余数r;(3)若r=0,则n为最大公约数,程序结束;否则用n取代m,用r取代n,转去执行第(2)步。例例5.16 求两个正整数的最大公约数求两个正整数的最大公约数#include v
46、oid main()int m,n,r;printf(Enter m,n:);scanf(%d,%d,&m,&n);r=m%n;while(r!=0)m=n;n=r;r=m%n;printf(gcd=%dn,n);程序执行后输出结果如下:程序执行后输出结果如下:Enter m,n:14,8gcd=211/14/2022 15:14:21长江大学计算机科学学院39分析:两个数的最大公约数肯定不会比其中的小者大。用穷举法求最大公约数用穷举法求最大公约数#include void main()int m,n,r;printf(Enter m,n:);scanf(%d,%d,&m,&n);r=m1)i
47、f(m%r=0&n%r=0)break;/*找到r即为最大公约数,中止循环。*/r=r-1;/*从大到小穷举出所有可能的数*/printf(gcd(%d,%d)=%dn,m,n,r);11/14/2022 15:14:21长江大学计算机科学学院40例例5.17 高次方程求根。高次方程求根。二分法的递推方法如下:(1)输入两个点的x坐标值a,b,使f(a)*f(b)0,即确保在区间a,b内有一根。(2)求区间a,b的中点c=(a+b)/2。(3)计算f(c)的值,若该值小于给定的精度要求,则 c为求 得的近似根,程序结束;否则执行步骤(4)。(4)若f(a)与f(c)同号,则a,c无根,用c代替
48、a;否则c,b 无根,用c代替b;使求根区间缩小一半,并重复上述 步骤(2)(4),直到求出近似根为止。高次方程求根的三种常用算法:牛顿迭代法;二分法二分法;弦截法。11/14/2022 15:14:21长江大学计算机科学学院41#include#include math.hvoid main()float a,b,c,fa,fb,fc;do printf(Enter a,b:);scanf(%f,%f,&a,&b);fa=3*a*a*a-4*a*a-5*a+13;fb=3*b*b*b-4*b*b-5*b+13;while(fa*fb0);do c=(a+b)/2;fc=3*c*c*c-4*c*c-5*c+13;if(fa*fc0)a=c;else b=c;while(fabs(fc)0.0001);printf(3*x*x*x-4*x*x-5*x+13=0nx=%f,y=%fn,c,fc);例例5.17 求高次方程求高次方程3x3-4x2-5x+13=0的根的根 程序执行后输出结果如下:程序执行后输出结果如下:Enter a,b:1,8Enter a,b:-5,83*x*x*x-4*x*x-5*x+13=0 x=-1.548908,f=0.000039 11/14/2022 15:14:21长江大学计算机科学学院