C语言-第3章控制流语句(成).ppt_第1页
C语言-第3章控制流语句(成).ppt_第2页
C语言-第3章控制流语句(成).ppt_第3页
C语言-第3章控制流语句(成).ppt_第4页
C语言-第3章控制流语句(成).ppt_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第3章 控制流语句,3.1 程序的语句 3.2 C语言的三种基本结构 3.3 选择结构 3.3.1 if语句 3.3.2 switch语句 3.4 循环结构 3.4.1 while语句 3.4.2 do-while语句 3.4.3 for语句 3.4.4 与循环有关的控制语句 3.4.5 循环结构程序举例,第3章作业 实验3 实验4 实验5,2,程序的功能是通过执行语句实现的。每条语句都有一定的功能。C语言中的语句可以分为以下五类: 1表达式语句 由各种表达式加上分号“;”组成。如:x=1; 2函数调用语句 在函数调用后边加上分号“;”就构成了函数调用语句。如:printf(“%d”,a)

2、;,3.1 程序的语句,3,3控制语句 控制语句用于控制程序的流程,以实现程序的各种结构方式。如:if语句,while语句,break语句等。 4复合语句 把多个语句用” ”括起来组成的一个语句称复合语句。 5空语句 只有分号“;”组成的语句称为空语句。空语句不执行任何操作。,3.1 程序的语句,4,1顺序结构:程序的执行流程按照程序中语句的先后,从第一条语句开始,顺序地执行每一条语句。 2选择结构:对给定的条件进行判断,并根据逻辑结果选择执行语句。由选择结构可以派生出另一种基本结构,多路选择控制结构。,3.2 C语言的三种基本结构,3循环结构 :根据特定的条件决定某个程序段重复执行。有两种基

3、本形态:while型(当型)循环和do_while型(直到型)循环。,5,先执行语句1, 再执行语句2, 两者是顺序执行的关系。,先计算表达式的值, 当表达式的值为“真”时, 执行语句1;否则,执行语句2。,3.2 C语言的三种基本结构,6,图 3-3 多路选择结构示意图,N,Y,N,N,表达式,Y,K1,语句1,K2,N,Y,Kn,语句n,根据表达式的值(k1,k2,kn)不同而分别执行语句1,语句2,语句n。,7,先计算表达式的值,当表达式的值为“真”时,重复执行语句,当表达式的值为“假”时,跳出循环。所以,语句可能一次也不执行。,先执行语句,然后再计算表达式的值,当表达式的值为“真”时,

4、重复执行语句,直到表达式的值为“假”时,跳出循环。循环体至少被执行一次。,3.2 C语言的三种基本结构,8,选择结构是根据对条件的判断,选择执行不同的操作。C语言提供了两种语句来实现选择结构:if 语句和switch语句。 一、if语句(3.2 条件分支语句) 1、单分支 if(表达式) 语句; 执行过程:计算表达式的值,如果为真,执行语句,否则退出该if语句。流程图如下所示。,3.3 选择结构,9,10,2、双分支 if(表达式) 语句1; else 语句2;,执行过程:首先计算表达式的值,若表达式的值为“真”,则执行语句1;若表达式的值为“假”,则执行语句2。,11,3、多分支 if(表达

5、式1)语句1; else if(表达式2)语句2; else if(表达式3)语句3; else if(表达式m)语句m; else 语句n; 执行过程:依次对多个条件进行判断,若某一条件为“真”,则转去执行该条件下的语句,执行完后跳出if结构;若所有条件都为“假”,则执行最后一个else后的语句。,12,13,例如: 求三个整数中最大数。 双分支 if(ab) max=a; else max=b; (可改写为:max=ab?a:b;) 单分支 if(maxc) max=c;,例如: 输入x值,计算y并输出。 x+1 -5x0 Y= x+2 0x 5 x+3 5x10 0 其它,14,程序段2

6、: scanf(“%f”, ,程序段1: scanf(“%f”, ,15,程序段3: if(x0) if(x-5) y=x+1; else y=0;,出现嵌套时,else与if如何配对?(C系统规定:从最内层开始,else总是与它上面最近的未曾配对的if配对。 如果为: if(条1) if(条2)语句1; else 语句2; 问:else与哪个if配对? 根据C系统规定,else应与第2个if配对,则此时的流程图是怎样的?,if语句的嵌套if或else后面的语句本身又是if语句,16,如果题目原意是希望else与第1个if配对,如何修改这一程序结构?将嵌套部分加上“”即可,此时对应流程图是怎样

7、的? 由此可见,若ifelse结构中的if后嵌入一个单分支if语句,则需用“”将嵌入的if语句括起来,以避免歧义。安全起见,我们可以将嵌套部分都用“”括起来。,注意事项: (1)if后面的表达式可以为任意类型的表达式,只要表达式的值为非0,则为真;值为0则为假。 如:if(a 等价于 if(x) 同理:if(x=0)等价于if(!x),17,(2)if和else后面有多个语句时,要用“”将这多个语句括起来作为一个复合语句。 (3)if后面的表达式之后不能有分号,否则运行时会出错。 如:int a=1,b=2; if(ab) a=b; printf(“%d,%dn”, a,b); 运行结果:1,

8、 2 加上分号后的结果:2, 2 (4)双分支ifelse结构可用条件运算符?:改写。 (5)if语句可以嵌套,嵌套时要注意else与if的配对。 练习:编程实现:输入x值,计算y值并输出。 x (x1) y= 2x-1 (1x10) 3x-11 (x10),18,switch(表达式) case 常量表达式1: 语句组1; case 常量表达式2: 语句组2; case 常量表达式3: 语句组3; case 常量表达式n: 语句组n; default:语句组n+1; ,2、功能:首先计算表达式的值,并逐个与case后面的常量表达式的值相比较。当与某个case后常量表达式的值相等时,以此作为入

9、口,执行该case后面的所有语句组。若表达式的值与任何case均不相同,则执行default后的语句组。,1、一般格式:,二、switch语句(3.3 开关分支语句),19,【例3-8】由键盘输入学生成绩等级,输出成绩范围。其中A代表90分以上,B代表8089,C代表7079,D代表6069,E代表60分以下。 【程序分析】 (1)定义grade变量,用于存放学生成绩等级 (2)输入学生成绩等级grade (3)根据grade,确定并输出成绩范围,20,【程序1】 main() char grade; printf(ninput grade : ); scanf(%c, ,【程序1运行结果】

10、input grade : C 70-79 60-69 0-59 error,该结果显然与我们所期望的结果不同,为什么? P54switch语句的功能 。,21,【程序2】 main() char grade; printf(ninput grade : ); scanf(%c, ,【程序2运行结果】 input grade : C 70-79,但实际应用时,我们希望只执行某一个case就可以了,此时可在每个case后加上break(跳出某种结构)来实现此要求,使得执行完某一个case后,跳出switch结构,如程序2。,由此可见,使用switch语句时,一般要加上break。,22,例:输入

11、百分制成绩,输出成绩等级A, B, C, D, E。 (1)用if语句 main() int grade; printf(“ninput the grade:”); scanf(“%d”, ,23,(2)用switch语句 能否写成: switch(grade) case =90: printf(“An”); break; case =80: printf(“Bn”); break; 不能。因为case后应为常量表达式,所以需要将原来的分支作修改。原来分支:100grade90, 90grade80, 80grade70, 70grade60, grade60, 如何修改分支? 分析分隔点的变

12、化规律,发现每个分隔点都是10的倍数,因此可将分支修改为:grade/10=9或10, grade/10=8, grade/10=7, grade/10=6, 其它, 此时switch后的表达式就为grade/10,case后的表达式就为常量表达式。,24,所以该程序用switch语句实现应写成: switch(grade/10) case 10: case 9: printf(“An”); break; case 8: printf(“Bn”); break; case7: printf(“Cn”); break; case 6: printf(“Dn”); break; default:

13、printf(“En”); break; ,注:多个case可以共用一组执行语句,不能写成:case 10,9: printf(“An”);,25,3、使用switch语句,应注意: (1)switch结构的执行部分是一个由一些case子句和一个可缺省的default子句组成的复合语句,特别注意要用一对“”括起来。 (2)switch后面的表达式一般是整型表达式或字符型表达式,与之相对应的case后面的常量表达式也应是一个整型表达式或字符型表达式 (3)在执行switch语句时,根据其后表达式的值找相匹配的case子句,要注意“case 常量表达式”只是起语句标号的作用,并不是在该处进行条件判

14、断。当找到相匹配的case子句即入口标号时,就从此标号开始执行后面的所有语句。因此,应该在执行一个case子句后必须增加一条间断语句break来使流程跳出switch结构。,26,(4)各个case和default出现的次序任意,不影响执行结果。 (5)每一个case能够拥有一条或多条语句,其最大的不同之处在于使用多条语句时不需要用“”括起来。 (6)多个case可以共用一组执行语句。 (7)每一个case的常量表达式的值不允许相同。 (8)switch结构允许嵌套。,27,练习: 【例3-7】已知a=16,b=2,要求输入一个算术运算符(+、-、*或/),对a,b进行算术运算,并输出计算结果

15、。,【程序分析】 (1)定义变量a、b,用于存放16和2;定义字符型变量ch用来接收输入的运算符; (2)输入运算符; (3)对输入的运算符进行判断,选择分支执行; (4)输出运算结果。,28,#include stdio.h main() int a,b,c; char ch; a=16; b=2; printf(input operator: +,-,*,/: n); ch=getchar(); switch(ch) case +: c=a+b;break; case -: c=a-b;break; case *: c=a*b;break; case /:c=a/b;break; defa

16、ult: printf(input errorn); printf(%d%c%d=%dn,a,ch,b,c); ,29,练习: 编程实现:输入收入,输出应征税款。设收入与应征税款的对应关系如下: 收入 1600 (免税);收入 3200 (征税5%); 收入 6400 (征税10% );收入 9600 (征税20%); 其它(征税35%)。 要求:(1)用if语句;(2)用switch语句。,30,循环结构是根据特定的条件决定某个程序段重复执行。C语言提供了三种语句来实现循环结构:while 语句、do-while语句和for语句。,3.4 循环结构,31,1、一般格式 while(表达式)

17、语句; 2、执行过程 先计算表达式的值,若表达式的值为真(非0),执行循环体,每执行一次,就判断一次表达式的值,直到表达式的值为假(0)时结束循环。while语句的流程图如下图所示。,while语句,循环条件,循环体,32,图4-1 while语句流程图,while语句,33,while语句,【例4-1】求1+2+3+100(“连加”问题:有限项连加) 【连加问题的一般思路】 (1)设一个实型变量s来存放“和”,且s=0; (2)设一个i来存放连加的各项,且i=第一项或0; (3)不断将连加各项放到s中相加,即:s=s+i; (4)推出前一项与后一项的递推关系式,使得i值不断变化。 该题中:后

18、一项=前一项+1(即:i=i+1),34,while语句,【程序源代码】 #include stdio.h main() float s; int i; s=0; i=1; 循环变量 while( i =100) s=s+i; i=i+1; (该语句使循环变量i的值产生了变化) printf(1+2+.+100=%fn, s); ,【程序运行结果】 1+2+100=5050,35,3、说明: (1)循环体若包含一个以上的语句,必须用“ ”组成复合语句。 (2)循环体内必须有使循环趋向于结束的语句(即使循环变量的值产生变化的语句),否则会出现“死循环” 。 练习:(1)编程:求1+3+5+7+9

19、9 (2)编程:求12+22+32+n2,n由键盘输入。 (3)编程:求s=12+23+34+n(n+1),n由键盘输入。,while语句,36,while语句,例:求s=1+2+3+4+,直到s=50000为止。 (“连加”问题:无限项连加),程序段1: s=0; i=1; while(s50000) s=s+i; i=i+1; ,程序段2: s=0; i=1; while(1) s=s+i; i=i+1; if(s=50000) break; ,练习:求s=2+4+8+16+32+, 直到s=50000为止。,37,while语句,例:100!=1*2*3*100(“连乘”问题) 【连乘问

20、题的一般思路】 (1)设一个实型变量s来存放“积”,且s=1(s初值一定不能为0); (2)设一个i来存放连乘的各项,且i=第一项; (3)不断将连乘各项放到s中相乘,即:s=s*i; (4)推出前一项与后一项的递推关系式,使得i值不断变化。 该题中:后一项=前一项+1(即:i=i+1),38,while语句,【程序源代码】 #include stdio.h main() double s; int i; s=1; i=1; while(i=100) s=s*i; i=i+1; printf(“s=%lfn”, s); 练习:求n!,n由键盘输入。,39,1、一般格式 do 循环体 while

21、(表达式);,2、执行过程 首先执行一次循环体,然后再计算表达式的值,当表达式的值为真(非0)时,继续执行循环体,重复上述过程,直到表达式的值为假(0)时,结束循环。do-while语句的流程图如下图所示。,do-while语句,40,图4-2 do-while语句流程图,do-while语句,41,3、说明: (1)do-while语句由do开始,用while结束,语句结束处的分号不能缺少。 (2)dowhile与while的区别:前者先执行语句,后判断条件,循环体至少执行1次;后者先判断条件,后执行语句,循环体至少执行0次。 【例4-1】求1+2+3+100(用dowhile语句) s=0

22、; i=1; do s=s+i; i=i+1; while(i=100);,do-while语句,42,1、一般格式 for(表达式1;表达式2;表达式3) 循环体 2、执行过程 首先计算表达式1的值,再判断表达式2,如果其值为真(非0),则执行循环体,并计算表达式3;然后再判断表达式2,一直到其值为假(0)时结束循环。 for语句的流程图如下图所示。,for语句,43,for 语 句,练习:分析下面程序段的运行结果。,44,for语句,【例4-1】求1+2+3+100。(用for语句) s=0; for(i=1; i=100; i+) s=s+i; 练习:求100!,用for语句实现。,45

23、,for语句,3、说明P67 (1)表达式1、表达式2、表达式3及循环体均可省略,但分号不能省。 如:for( ; ; ); 正确 如:求1+2+3+100还可写成如下几种形式: s=0; i=1; for( ; i100)break; s=0; for(i=1; i=100; ) s=s+i; i+; s=0; for(i=1; i=100; s=s+i,i+); for(s=0,i=1; i=100; s=s+i,i+); (2)表达式1、表达式3部分可以包含多个表达式,用逗号隔开。如:上例中的,46,for语句,4、循环的嵌套(多重循环) 一个循环体中又包含另一个循环结构,称为循环的嵌套

24、。(常见:二重、三重) 如: while(i=10) while(j=10) 三种循环结构可互相嵌套。 循环次数=内循环次数外循环次数,内循环,外循环,47,for语句,如:分析下面程序段的运行结果 s=0; for(i=1;i=3;i+) s=s+i; for(j=1;j=3;j+) s=s+j; printf(“s=%dn”, s); 结果:24 循环次数=3*3=9,若改成 if(j%2=0)s=s+j; 结果如何?,48,与循环有关的控制语句,1、break语句 用在switch语句和循环结构中 作用:使流程跳出switch结构 结束本层循环,不再进行本层循环条件判断 2、contin

25、ue语句 只用在循环结构中 作用:结束本次循环,跳过循环体中剩余语句,返回到本层循环条件处进行条件判断。,49,break语句和continue语句,(1) while(表达式1) while(表达式2) if(表达式3)break; ,(2) while(表达式1) while(表达式2) if(表达式3)continue; ,50,练习:分析下面程序段的运行结果 (1) for(i=1; i=10; i+) if(i%2=0) continue; printf(“%4d”, i); (2)s=0; for(i=1; i=10; i+) if(i%3=0) break; s=s+i; pri

26、ntf(“s=%dn”, s);,结果:1 3 5 7 9,结果:s=3,改为break; 结果如何?,改为continue; 结果如何?,(1),(s=37),break语句和continue语句,51,程序举例,1、连加、连乘问题 如:求1+2+3+100;求100!=1*2*3*100 2、求给定范围内满足条件的数(的个数,之和) 【例】:求200到1000之间能被3整除但不能被7整除的数的个数(或:之和)。 分析: (1)设一个s来存放个数,且s=0; (2)判断任一数i if(i%3=0 (3)当i从200变化到1000时,将第(2)步置于循环结构中,求出总个数。 (4)输出个数s。

27、,52,程序举例,【程序段】 s=0; for(i=200; i=1000; i+) if(i%3=0 【例】:求三位数中,各位数字的立方和等于该数本身的数的个数(即:求“水仙花数”的个数),如:407=43+03+73,如果求满足条件的数之和, 只需将s+改为s=s+i;,53,程序举例,【分析】: (1)设一个s存放个数,且s=0 (2)判断任一数i if(pow(i的百位数字,3)+pow(i的十位数字,3)+pow(i的个位数字,3)=i) s+; 如何求i的百位数字(a)、十位数字(b)、个位数字(c)? a=i/100; b=i/10%10; c=i%10; (3)当i从100变化

28、到999时,采用循环结构,求得总个数 (4)输出总个数s。 【程序段】:s=0; for(i=100; i=999; i+) a=i/100; b=i/10%10; c=i%10; if(pow(a,3)+pow(b,3)+pow(c,3)=i) s+; printf(“s=%fn”, s);,54,程序举例,练习: (1)求1999中能被3整除,且至少有一位数字为5的所有整数的个数。 (2)若某数的平方,其低位与该数本身相同,则称该数为守形数。如:52=25, 252=625, 6252=390625,称5, 25, 625为守形数。求21000中守形数的个数。 【例】 求1到500之间能被

29、5整除的前若干个偶数之和,当和大于200时退出。 【程序】:s=0; for(i=1; i200) break; printf(“s=%fn”, s);,55,程序举例,【例】 求100到200之间素数的个数。 分析: (1)设一个变量s来存放素数的个数,且s=0 (2)判断任一数i是否为素数 什么是素数?大于1,且除了1和它本身之外,不能被其它任何整数整除的整数。(如:7是素数,因为它不能被2, 3, , 6整除;而9不是素数,因为用2, 3, , 8去除9,9能被3整除。) 如何判断一个数i是否为素数? 一般:用2, 3, , i-1去除,若全都除不尽,则i为素数(但若i很大,则除的次数相

30、当多)。,56,程序举例,改进: 用2, 3, , sqrt(i)去除,若全都除不尽,则i为素数(如:判断13是否为素数?只需用2, 3去除,而不需用4, 5, , 12去除,这样大大减少了除的次数。由于13均不能被2, 3整除,故13是素数。) 如何判断i不能被2, 3, , sqrt(i)之间任一整数整除? 法1:设一变量flag来标记是否除尽,且flag=1;若i被其中一个数除尽,则flag=0,且结束循环。循环结束后判断flag值:若flag=1,则i为素数;若flag=0,则不是。,57,程序举例,法2:设一变量j存放用来除的2, 3, , sqrt(i),若i被其中一个数j除尽,则

31、结束循环。循环结束后判断j值:若jsqrt(i),则i为素数;若j=sqrt(i),则不是。 注意:1不是素数,2是素数。用以上方法无法判断1,如:求1到200之间素数的个数,用以上方法会将1也算作素数,所以直接从2开始分析2到200之间素数的个数。 (3)当i从100变化到200时,采用循环结构,求得总个数s。 (4)输出总个数s。,58,程序举例,程序1: int i,j,flag; float s; s=0; for(i=100;i=200;i+) flag=1; for(j=2;j=sqrt(i);j+) if(i%j=0) flag=0; break; if(flag=1) s+;

32、printf(“s=%fn”, s);,注意:该语句的位置,程序2: int i,j; float s; s=0; for(i=100;isqrt(i) s+; printf(“s=%fn”, s);,59,程序举例,【例】 求21000中的完数的个数(因子和等于它本身的数称为完数,例如28的因子是1, 2, 4, 7, 14,且1+2+4+7+14=28,则28是完数)。 分析:(1)设s存放个数,且s=0 (2)判断任一数i是否为完数 先求因子之和,设n存放和,且n=0 如何找i的因子? 一般:用1, 2, , i-1去除i;若i能被某数整除,则该数就是i的一个因子,将该数放到n中相加(但

33、当i很大时,则除的次数相当多,故需改进,类似“素数”问题。) 改进:用1, 2, , i/2去除i;若i能被某数整除,则该数是i的一个因子,将该数放到n中相加。 n=0 for(j=1; j=i/2; j+) if(i%j=0) n=n+j;,60,程序举例,再判断 if(n=i) s+; (3)当i从2变化到1000时,将第(2)步置于循环结构中,求得总个数s (4)输出总个数s。,程序: int i,j; float s,n; s=0; for(i=2; i=1000; i+) n=0; /*n存放因子之和*/ for(j=1; j=i/2; j+) if(i%j=0) n=n+j; if

34、(n=i) s+; printf(“s=%fn”, s);,61,程序举例,【例】 输入两个整数,求它们的最大公约数和最小公倍数。 分析:(1)输入两数a, b (2)求最大公约数(“辗转相除法”) 用a除以b,若整除(即余数为0),则b为最大公约数;否则将b赋给a,将余数赋给b,再用a除以b,直到余数为0。以下程序段是否正确?,while(a%b!=0) a=b; b=a%b; ,while(a%b!=0) t=a%b; a=b; b=t; ,错误,t=a%b; while(t!=0) a=b; b=t; t=a%b; ,62,程序举例,(3)求最小公倍数=原来两数的乘积(由于在求最大公约数

35、时,a,b的值改变了,故需在求最大公约数之前先将原来两数的乘积用一个变量m保存下来)除以最大公约数。 (4)输出。 程序:scanf(“%d%d”, ,63,程序举例,3、“迭代”问题 【例】 “猴子吃桃”问题(采用迭代法,也称“递推法”)。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个,到第10天早上想吃时,见只剩下一个桃子了。求第1天共摘了多少个桃子?,分析:(递推法:已知 未知) s10=1 s9=(s10+1)*2 s8=(s9+1)*2 si=(si+1+1)*2 s1=(s2+

36、1)*2,64,程序举例,程序: s=1; for(i=9;i=1;i-) s=(s+1)*2; printf(“%dn”, s); 练习: 某飞机制造厂,第一年生产100架飞机,从第二年起每年的产量是前一年的产量减去半架再翻一番。请问第10年的产量是多少?10年内总产量是多少?,65,程序举例,4、数列 【例】 已知一分数序列为:2/1, 3/2, 5/3, 8/5, 13/8, ,后一项的分子是前一项的分子及分母之和,后一项的分母是前一项的分子, 求:(1)第30项;(2)前面30项之和。 【法1】: 分析:设a, b, m分别存放分子、分母、各项,则m=a/b;设s存放和。 根据题意:后

37、一项的分子是前一项的分子及分母之和,后一项的分母是前一项的分子,用C语言描述如下,是否正确? a=a+b; b=a;,错误。应改成:t=a; a=a+b; b=t;,66,程序举例,程序: a=2; b=1; s=0; for(i=1; i=30; i+) m=a/b; s=s+m; t=a; a=a+b; b=t; printf(“the 30th is:%fnthe sum is:%fn”, m,s); 【法2】:用“数组”实现,67,程序举例,【例】已知一数列,前三个数为1, 1, 2,从第4个数起,依次等于前三个数之和。 求:(1)第20个数;(2)求前20个数之和。 【法1】: f1

38、=1; f2=1; f3=2; s=f1+f2+f3; for(i=4; i=20; i+) f4=f1+f2+f3; s=s+f4; f1=f2; f2=f3; f3=f4; printf(“the 20th is:%fnthe sum is:%fn”, f4,s);,(注:不能写成:f3=f4; f2=f3; f1=f2; 为什么?),68,5、穷举问题 基本思想:对问题的所有可能状态一一测试,直到找到满足条件的解或将全部可能状态都测试过为止。穷举算法的循环控制有两种:计数法与标志法。 计数法要求在程序执行前必须清楚循环的执行次数,然后逐次测试,直到循环结束。 标志法是达到某一目标后,使循

39、环结束。当无条件使用计数法时,可以使用标志法。,程序举例,69,【例4-8】36块砖,36人搬,男搬4,女搬3,两个小孩抬一砖,要求一次搬完,试设计一个程序,求解男、女、小孩各需多少。,【程序分析】 假设m、w、c分别表示男、女、小孩的数量,则:4*m+3*w+0.5*c=36。其中m的取值范围为(0,9),w的取值范围为(0,12),c=36-m-w。采用计数法。,程序举例,70,【程序源代码】 #include stdio.h main() int m,w,c; for(m=0;m=9;m+) for(w=0;w=12;w+) c=36-m-w; if(4*m+3*w+0.5*c=36)

40、printf(m=%dtw=%dtc=%dn,m,w,c); 【程序运行结果】 m=3 w=3 c=30,程序举例,练习: 教材P85:第8题,71,【例4-9】爱因斯坦的阶梯问题。 设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶,正好到阶梯顶。试设计一个程序计算阶梯总数。 【程序分析】 设阶梯数为lad,根据题意,设lad的初值为7,增量为7,采用标志法求解。,程序举例,72,【程序源代码】 #include stdio.h main() int lad; for(lad=7; ; lad+=7) if(lad%2=1

41、【程序运行结果】 ladders is 119,程序举例,73,程序举例,6、连加、连乘问题的二重循环 【例】 求1!+2!+3!+100! 【法1】:二重循环 分析: (1)这是一个连加问题,设s存放连加之和,且s=0;连加各项分别为:1!, 2!, , i!, , 100!,而求连加的各项值本身又是一个连乘问题。 (2)求第i项(i!=1*2*3*i)连乘问题 设t存放连乘之积,且t=1;设j存放连乘的各项(1,2,3,i),且j=第一项;采用循环结构,不断将连乘各项j放到t中相乘:t=t*j 循环结束后,将第i项(即t值,注:不是i值,因为i表示的是连加各项的项数(1,2,3,100);

42、t表示的才是连加的各项值(1!,2!,3!,100!)。)放到s中相加:s=s+t,74,程序举例,(3)当i从1变化到100时,将第(2)步置于循环结构中,求得和s (4)输出和s。 程序: s=0; for(i=1; i=100; i+) t=1; for(j=1; j=i; j+) t=t*j; s=s+t; printf(“s=%fn”, s);,(注意该语句的位置),75,程序举例,【法2】:单重循环 分析:将该题看成是一个一般的连加问题,而连加问题的关键在于推出前一项与后一项的关系:后一项=前一项后一项的项数。 故设i存放各项的项数,设t存放各项,设s存放和。,程序2: s=1; t=1; for(i=2; i=100; i+) t=t*i; s=s+t; printf(“s=%fn”, s);,程序1: s=0; t=1; for(i=1; i=100; i+) s=s+t; t=t*(i+1); printf(“s=%fn”, s);,76,程序举例,练习:(1)求1!+2!+3!+n!,n由键盘输入。 (2)P76例5.6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论