收藏 分享(赏)

cxm-C语言程序设计课件第4章.ppt

上传人:hskm5268 文档编号:5397856 上传时间:2019-02-28 格式:PPT 页数:65 大小:3.51MB
下载 相关 举报
cxm-C语言程序设计课件第4章.ppt_第1页
第1页 / 共65页
cxm-C语言程序设计课件第4章.ppt_第2页
第2页 / 共65页
cxm-C语言程序设计课件第4章.ppt_第3页
第3页 / 共65页
cxm-C语言程序设计课件第4章.ppt_第4页
第4页 / 共65页
cxm-C语言程序设计课件第4章.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、2019/2/17,1,C语言程序设计,第四章 程序流程控制,主讲: 计算机学院 曹晓梅,2019/2/17,3,内容提要,算法的基本概念以及表示方法,简单介绍流程图 C程序的3种基本流程控制结构:顺序结构、选择结构(也叫分支结构)、循环结构,每种结构的控制语句: if、switch控制选择结构 for、while、dowhile控制循环结构 break、continue、goto等语句的用法 循环嵌套程序的设计及运行过程 一些常用算法的基本思想: 分段函数求解问题 判断一个整数是否为质数 求两个正整数的最大公约数 各种求和问题,掷骰子游戏的多种解法,求阶乘,打印规则的图形,穷举问题的多种求解

2、方法,2019/2/17,4,算法与语句,算法(Algorithm)就是为解决一个具体问题而采取的有限的操作步骤,算法通过语句来实现 计算机算法分两类:数值运算算法、非数值运算算法 程序=数据结构+算法 算法的正确性衡量标准: 有穷性:算法包含有限步操作 确定性:每一步都应确定无歧义 有效性:每一步都应能有效执行且能得到确定的结果 0或多个输入: 程序允许无输入 1或多个输出:任何程序都必须有输出,哪怕是提示信息,解决求数值解的问题,解决需要用分析推理、逻辑推理才能解决的问题,数据的描述和组织形式,对操作或行为的描述,即操作步骤,2019/2/17,5,算法与语句,常用的算法描述方法有:自然语

3、言、传统流程图、NS流程图、伪代码等,这里只介绍传统流程图。 例:求n!的算法思想: n!=1*2*3*n 由于计算机执行乘法时每次只能求两个数相乘,因此上面的公式在程序中必定需要通过反复相乘来实现。 第一个变量,存放求多少的阶乘(int n); 第二个变量,存当前累乘的结果(int fac); 第三个变量存当前将要与累乘器相乘的因子,并且该因子的变化是从1到n每次增加1(int i) 流程图如下页所示,2019/2/17,6,3种基本结构的 特点:单入口,单出口,2019/2/17,7,C语句分类,C语言的语句有五大类: (1)9种控制语句:这一类语句用于实现流程控制,选择结构和循环结构必须

4、通过控制语句实现。 ifelse语句:是实现选择结构最常用的语句 switch语句:用于控制某些多分支的选择结构 for( )语句:最常用最灵活的循环控制语句,当型循环 while( )语句:循环结构最安全的控制语句,当型循环 dowhile( )语句:控制先执行后判断的直到型循环结构 continue语句:表示提前结束本次循环,忽略其后循环体中的其他语句 break语句:可用于switch语句(结束switch)或循环体中(结束本层循环) goto语句:流程跳转语句,很灵活,可实现各种结构,建议少用或不用 return语句:专门用于函数返回,被调函数执行到return就返回到调用点 (2)变

5、量定义语句:用来定义变量,形如:int a,b; (3)表达式语句:C语言中任何一个表达式最后加上分号构成表达式语句,赋值语句和函数调用语句是最常用的表达式语句 (4)复合语句:以一对大括号括起的0或多条语句,在语法上仍为一条语句 (5)空语句:只有一个分号构成的语句,表示什么也不做,2019/2/17,8,顺序结构,顺序结构的特点:语句按顺序依次执行,不涉及到任何条件的判断。 顺序结构所使用的语句:变量定义语句、函数调用语句、赋值语句、return语句等。无需用其他流程控制语句 优点:结构简单易懂 缺点:对程序的健壮性、完备性往往无法兼顾 例:程序4.1 从键盘上输入a,b,c的值,并以它们

6、为三角形的三条边,求三角形的面积。 算法思想:根据数学知识,设一个变量s用于求三角形周长的一半,即s=(a+b+c)/2,再利用一般三角形求面积的公式求解:,2019/2/17,9,程序4.1 求任意三角形的面积 #include #include /包含平方根函数sqrt的声明 int main( ) double a,b,c,s,area; /定义5个double变量printf(“Please input a,b,c:n”); /屏幕提示 scanf(“%lf%lf%lf“, ,顺序结构, 输入 3 4 5 输出area=6.000000,编程提示:存原始数据的变量,用读入方式使其获得的

7、值更灵活,也可赋值,但是通用性下降,问题1:可能会输入负数 问题2:即使输入的都是正数,未必能构成一个三角形 顺序结构无法解决需要作出判断的问题!,2019/2/17,10,选择结构的特点:通过某一个或若干条件的约束,有选择性地执行特定语句-在符合一定条件时,执行特定操作;在不符合条件时,不执行操作或执行另外的操作 选择结构使用的流程控制语句:if语句、switch语句 优点:保证程序的健壮性、完备性 ifelse语句形式: if (表达式) 语句块1else 语句块2 执行过程:先计算表达式,若非0(真) 则执行语句块1;如果表达式为0(假) 则执行语句块2,选择结构,不平衡的ifelse语

8、句(单分支if),ifelse语句(双分支if),表达式的值可以是任何类型,条件表达式和逻辑表达式最常用,不平衡的ifelse语句(if语句),不执行操作,2019/2/17,11,程序4.1 求任意三角形的面积 #include #include /包含平方根函数sqrt的声明 int main( ) double a,b,c,s,area; /定义5个double变量printf(“Please input a,b,c:n”); /屏幕提示 scanf(“%lf%lf%lf”, ,选择结构(if语句),问题1:可能会输入负数 问题2:即使输入的都是正数,未必能构成一个三角形 顺序结构无法解

9、决需要作出判断的问题!,程序4.2 改进程序4.1,在构成三角形时求面积,否则给提示信息,if (a0&b0&c0&a+bc&a+cb&b+ca),else printf(“Error input!n“);,此else分支不能省略,否则在不能构成三角形时将没有任何输出,就不是一个正确的算法了,2019/2/17,12,程序4.3 生成50以内的两个随机数,比较大小,输出较大者及两者之差的值。若第1个数大于第2个数,输出you are lucky! #include #include /含srand和rand函数的原型 #include /含time函数的原型 int main( ) int a

10、 ,b ; /定义两个整型变量a和bsrand(time(NULL); /调用当前系统时钟产生随机种子 a=rand()%50; /产生一个50以内的随机数赋给ab=rand()%50; /产生另一个50以内的随机数赋给bif(ab) /如果a大于b printf(“the larger number is a:%dn“,a) ; /输出较大者printf(“a-b=%dn“,a-b); /输出a与b的差值else /如果a不大于b,即ab) printf(“you are lucky!n“); /if语句 return 0; ,选择结构(if语句),若删除此句,则每次产生的随机数都是一样的,

11、这是调用系统时钟产生随机种子,上机运行观察结果,上机测试观察运行结果并分析: (1)删除srand(time(NULL); (2)删除else后的一对大括号,若删除此一对括号,则语句printf(“b-a=%dn”,b-a);成为一条不受条件控制的语句,2019/2/17,13,ifelse语句形式: if (表达式) 语句块1else 语句块2 if语句形式: if (表达式) 语句块1 最常用的嵌套ifelse语句形式: if (表达式1) 语句块1else if (表达式2) 语句块2else 语句块n,选择结构(if语句),else总是与其前面与之最靠近的并且未与其它else匹配过的i

12、f相对应; 每个else都代表了与其对应if完全相反的条件,编程时应充分利用else所代表的条件简化程序,整个嵌套的ifelse语句从语法上仍为一条语句,2019/2/17,14,选择结构(if语句),程序4.4 用嵌套if进行符号函数求解 #include int main( ) int x,sign;printf(“Please input x:“);scanf(“%d“, ,/语句2处嵌入ifelse,此else代表的条件是x=0,此else代表的条件是x0,if (x=0)if (x0)sign=1;elsesign=0; else sign=-1;,语句1处嵌入ifelse,此els

13、e代表的条件是x0,此else代表的条件是x=0,显然左边的方法更直观,此题还有多种其他写法请读者思考,2019/2/17,15,选择结构(if语句),程序4.5 根据输入的百分制成绩score,转换成 相应的五分制成绩grade并打印输出。转换标准为: int score; char grade; /定义两个变量 scanf(“%d“, /输出百分成绩及等级 ,有效的分数应满足: 0=score=100,此else代表的条件为: 0=score&score=100,完整的条件为: 90=score&score=100,此else代表的条件为: 0=score&score90,完整的条件为:

14、80=score&score90,此else代表的条件为: 0=score&score80,完整的条件为: 70=score&score80,此else代表的条件为: 0=score&score70,完整的条件为: 60=score&score70,此else代表的条件为: 0=score&score60,2019/2/17,16,选择结构(switch语句),switch语句是控制选择结构流程的又一主要语句,某些嵌套的if-else语句可以改用switch语句 switch case的语句格式为: switch(表达式) case 常量表达式1:语句系列1 case 常量表达式2:语句系列2

15、 case 常量表达式n:语句系列n default: 语句系列n+1 ,表达式类型可以是整型、字符型、枚举型,但不能是实型,常量表达式是switch中的表达式可能得到的有限个常量值,类型应与switch中的表达式一致,每个case后只能有1个常量表达式, switch中的表达式计算得到的结果与哪一个常量表达式的值相等,程序流程就从该常量后开始,执行其后的语句系列,default分支语法上可以省略,但是建议要有,这表示switch后的表达式与以上n个常量表达式都不相等的时候所进行的处理,有利于提高程序的健壮性,break语句和switch最外层的右大括号就是该选择结构的出口,遇到第一个brea

16、k结束,如果没有break则到右大括号才结束,2019/2/17,17,程序4.5 根据输入的百分制成绩score,转换成 相应的五分制成绩grade并打印输出。转换标准为: int score; char grade; /定义两个变量 scanf(“%d“, ,选择结构(switch语句),方法二:用switch语句实现百分制转五级分制,此break可以省略,在VC+下运行程序观察结果,遗憾:每次运行程序只能输入一个成绩,一次运行无法输入多个百分成绩进行转换!,9月22日8:00-9:30 教2-325上机,做实验一 顺序结构编程练习,请务必提前做好准备!,#include #define

17、PI 3.14159 int main() double r,h,s1,s2,v; printf(“请输入圆柱地面半径和高(用空格格隔开,输入完请回车):“); scanf(“r=%lf,h=%lf“,r,h); s1=2*r*PI*h; s2=s1+r*r*PI*2; v=r*r*PI*h;,1、程序纠错,printf(“侧面积: s1=%dn“,s1 ); printf(“表面积: s2=%dn“,s2 ); printf(“体积: v=%dn“,v ); return 0; ,课堂练习,2. 分析以下程序的运行结果: main() int x,y,z,w; z=(x=1)?(y=1,y+

18、=x+5):(x=7,y=3);w=y*a/4; printf(“%d %d %d %dn”,x,y,z,w); ,正确答案 1 7 7 169,3. 以下程序的输出结果是,#include main() int a=1,b=-1,c=3;if(ab)if(b0) c=0; else c+;printf(“%d”,c); ,正确答案 3,#include int main (void) double capital,deposit,rate;int year;printf(“请输入存款期(年):n“);scanf(“%d“, ,4、计算银行利息,年利率=2.25% 期限1年2.79% 期限2年

19、3.33% 期限3年3.6% 期限5年,#include int main() double rate,capital,deposit; int year;printf(“请输入存款期(年):n“);scanf(“%d“, ,问题及改进,2019/2/17,22,循环结构的特点:某些操作在一定条件约束下在程序中可被重复执行,或者重复执行到满足一定的条件时停止 循环结构使用的流程控制语句:for语句、while语句、dowhile语句; 辅助语句:break语句、continue语句 for语句形式: for(表达式1;表达式2;表达式3)语句块 执行过程见右边流程图 注意:for语句中的3个表

20、达式可以省略1个或多个,最多3个都可省略,但是分号不能省。,循环结构,当型循环,直到型循环,用于求初值,只计算一次,用来作为控制循环的条件,非0值则执行语句块;若为0,则结束for语句,语句块执行结束后自动执行此表达式,然后再重新计算表达式2,就是循环体,通常用复合语句,只能是一条语句,整个for语句在语法上就是一条语句,假,表达式2,真,语句块,表达式1,表达式3,循环体内应有修改表达式2值的语句,避免出现死循环!,上题进一步改进,2019/2/17,23,循环结构(for语句),程序4.6 从键盘上输入一个非负整数n,求n! #include int main( ) int n,i; /定

21、义两个整型变量,i表示乘数 double fac=1; printf(“Please input n:n“); /提示输入数据的信息scanf(“%d”, ,若输入为:-5 输出结果为:Error input! 若输入为:4 输出结果为:4!=2.400000e+001 若输入为:100 输出结果为:100!=9.332622e+157,fac的类型应当定义为double类型,因为阶乘的结果很容易非常大,应当定义范围最广的数据类型作为累乘器的类型,并且一定要初始化为1,对n作判断,保证程序的健壮性,用%e以指数形式输出一个较大的结果比较合理,执行的操作不变,但是变量是在不断变化的,for语句中

22、表达式省略示例,=1;,+;, fac*=i+; if (in) break; ,循环次数确定,2019/2/17,24,程序4.7 输入1个正整数m,判断m是否为质数,输出判断结果 质数的概念:大于1的自然数中,除了1和它自己外,不能被任何其他整数所整除 的数。 算法思路:设一个变量prime表示结果,值为1表示是质数,值为0则不是质数最初可以先假定m是质数,即prime初值为1,设一个变量i作为除数,从2变化到m-1,只要其中有一个能被m整除(即满足m%i=0),就说明m不是质数,立即修改prime为0,否则继续取下一除数计算 除数终值到底取多少:除数的终值需要到m-1吗?数学已上证明,除

23、数最大只要到sqrt(m)就已经保证所有可能的因子均已被判断 循环条件的控制:本题是循环次数不可确定的循环问题,用for语句也可以解决.以上分析表明循环终止有两种可能:(1)被某一个i整除,(2)i的值已变到终值处.因此循环条件体现为两个条件共同控制,即:prime&i=(int)sqrt(m) 特殊正整数的处理:当m为1时,直接给出prime=0,不必循环,循环结构(for语句),2019/2/17,25,循环结构(for语句),程序4.7 从键盘输入一个正整数m,判断m是否为质数,输出判断结果 #include #include /包含sqrt的原型 int main( ) int m,i

24、,k,prime=1; scanf(“%d“, ,对prime的初始化不能缺少,如果m是负数,则返回不再进行判断,对于特殊正整数1直接给出不是质数的结论,变量k存除数的上界,变量i是每一次参与运算的除数,从2变化到k,增加步长为1,用两个条件共同控制,循环必将因为prime为0或ik而终止,前者表明m不是质数,后者表明m是质数,prime保持初值1,判断m是否能被i整除,若能则prime赋值为0,不是质数,循环终止时prime可能为1可能为0,根据其值输出不同的结论,循环体是这一条if语句,2019/2/17,26,while语句:与for语句一样能控制当型循环 while语句的形式: whi

25、le(表达式)语句块 执行过程见右边流程图 for语句与while语句的等价关系:(1)for中的表达式1相当于出现在while之前的对循环变量的初始化(2)for语句的表达式2相当于while语句的表达式,都表示当该表达式为真时执行循环体(3)for语句的语句块和表达式3一起,相当于while循环的语句块,是被反复执行的循环体,循环结构(while语句),假,表达式,真,语句块,循环控制条件,循环体,通常用一条复合语句,2019/2/17,27,循环结构(while语句),程序4.6 从键盘上输入一个非负整数n,求n! #include int main( ) int n,i; double

26、 fac=1; printf(“Please input n:n“); scanf(“%d”, ,方法二:改用while循环求阶乘,i=1; while (i=n) fac*=i ; i+; ,2019/2/17,28,程序2.2:三位的非负整数按位分离输出,#includeint main( )int i,n; /定义两个整型变量i,n,变量先定义后使用n=578; /通过赋值语句使n获得一个3位整数值i=n%10; /对10取余求得个位数printf(“%d“,i); /输出个位数i=n/10%10; /先整除10再对10取余求得十位数printf(“%d“,i); /输出十位数i=n/1

27、00; /用整除100求得百位数printf(“%dn“,i); /输出百位数return 0;,该程序显然不具有通用性,不能处理任意位数的整数按位分离问题,2019/2/17,29,循环结构(while语句),程序4.8 从键盘读入任意位的非负整数,按位分离后逆序输出 #include int main( ) int i,n; scanf(“%d”, ,算法思想: 在被处理的数不等于0时: (1)利用对10取余得到个位数 (2)输出该个位数 (3)对被分离的数利用整除10 降一阶,若不为0回到步骤(1) 若为0停止处理,等价于n!=0,用循环求解问题的关键: (1)以什么作为控制循环的条件

28、(2)重复不断地执行的是哪些 操作,即循环体是什么 (3)在循环体内对变量如何变化 每个变量的意义要明确,2019/2/17,30,循环结构(while语句),程序4.9 从键盘读入两个正整数,用辗转相除法求最大公约数#include int main( ) int dividend,divider,remainder; /读入dividend,dividerremainder=dividend%divider; while (remainder) dividend=divider; divider=remainder; remainder=dividend%divider ; printf

29、(“hcd: %dn“,divider); return 0; ,算法思想: (1)将两个正整数分别作为被除数 (dividend)和除数(divider) (2)被除数整除除数得余数(remainder) (3)若余数不为0,则除数转为被除数, 余数转为除数,继续步骤(2) (4)若余数为0则结束循环,使余数 为0的除数就是最大公约数,余数不为0为循环条件,上一次的除数作为下次的被除数,上一次的余数作为下次的除数,求新的余数,使余数为0的除数就是最大公约数,第一次求余数,2019/2/17,31,while语句与for语句都控制当型循环,共同特点:先判断循环条件,为真才执行循环体,故循环体最

30、少执行0次 dowhile语句控制直到型循环,其特点是:先执行循环体,再判断条件,当条件为真时继续执行循环体,条件为假,循环结束。因此循环体至少执行1次。 dowhile语句的形式: do语句块 while(表达式); 执行过程见右边流程图,循环结构(dowhile语句),假,表达式,真,语句块,循环控制条件,循环体,可以是多条语句,此处一定要有分号,2019/2/17,32,循环结构(dowhile语句),程序4.10 模拟投骰子,以6点为目标,投中目标两次获胜,最多允许投10次(方法1:用dowhile语句) #include #include #include int main( ) i

31、nt count=0,y=0,dice; srand(time(0); dodice=1+rand()%6; count+; if(dice=6) y+; while(count10 ,模拟投骰子可以通过调用随机函数产生1至6之间的随机数. 在程序中必须设置一个变量用来统计已经投了多少次, 再设另一个变量统计投中了多少次。 投骰子的动作肯定要做,且做一次还不能完成,因此适合 使用dowhile语句实现。 循环体应该完成: (1)调用随机函数产生一个随机数来模拟投骰子; (2)统计投掷次数的变量无条件加1; (3)如果随机数的值等于6,则统计投中次数的变量值加1 循环条件是:投掷次数小于10并且

32、投中次数小于2,记录投中的次数,记录投掷的次数,记录点数,产生随机种子,生成16随机数模拟投骰子,投掷次数无条件加1,如果点数等于6,投中次数加1,投掷次数小于10且投中次数小于2为循环条件,输出投掷次数和投中次数,2019/2/17,33,循环结构(dowhile语句),程序4.10 模拟投骰子,以6点为目标,投中目标两次获胜,最多允许投10次(方法1:用dowhile语句) #include #include #include int main( ) int count=0,y=0,dice; srand(time(0); dodice=1+rand()%6; count+; if(dic

33、e=6) y+; while(count10 ,while(count10 ,(方法2:用while语句),此处不能加分号,如果加了分号,语法上正确,表示该循环体为空语句,而语句块就成为一条无条件的语句,结果将出错,(方法3:用for语句),for(;count10 ,2019/2/17,34,程序4.11 利用格里高利公式求的近似值 格里高利公式为:/4=1-1/3+1/5-1/7+ 两种求解要求:算法分析:先求/4,最后再乘以4,用一个累加器进行求和; 分子无变化,分母可用项号i的表达式:2*i-1表示 每一个累加项正负号交替,设一个符号变量,每项加过以后取负 循环体内的主要操作: (1)

34、求当前项,即符号变量*1.0/(2*i-1) (2)将当前项加入到累加器中 (3)改变符号变量的值,以保证累加项正负号交替 (4)表示第几项的变量i加1 循环条件根据题目要求设定,循环结构(3种语句),项数确定,适合用for语句,规定求解精度,适合用whie或dowhile语句,2019/2/17,35,/要求1:求前5001项的 /累加和作为的近似值 #includeint main(void) int sign,i; double item,pi,sum=0; sign=1; for(i=1;i=5001;i+) item=sign*1.0/(2*i-1); sum=sum+item; s

35、ign=-sign; pi=4*sum; printf(“pi=%fn“, pi) ; return 0; ,/要求2:求的近似值直到 /累加项绝对值小于1E-4 #include #include int main(void) int sign,i=1; double item,pi,sum=0; sign=1; do item=sign*1.0/(2*i-1); sum=sum+item; sign=-sign;i+; while (fabs(item)=1e-4); pi=4*sum; printf(“pi=%fn“, pi) ; return 0; ,2019/2/17,36,dowh

36、ile语句一个非常实用的用法:保证读入的数据符合要求,也就是说,如果读入的数不符合要求,则提示重新读入,直到满足要求为止 例4.7:判断一个输入的正整数m是否为质数 当时对输入的m,如果小于等于0,则简单地返回不做任何处理。现在使用dowhile可以要求读到m大于0为止。 int main( ) int m,i,k,prime=1; scanf(“%d“, ,循环结构(dowhile语句),do printf(“input a data0:n“);scanf(“%d“,读到第一个大于0的整数就停止,本节作业: P74 三 1,2,3 ,有条件的同学可以打印作业。,2019/2/17,37,循环

37、嵌套,循环嵌套最主要的是理解其三种循环控制语句的循环体内可以嵌入更深层次的循环控制语句,从而构成了循环的嵌套,3种语句可以互相嵌套。,执行过程: (1)先对外层循环控制变量取一个值,满足条件进入循环体 (2)执行循环体中的内层循环,内层循环结束后,回到外层 (3)改变外层循环控制变量的值,回到步骤(1) (4)当外层循环条件不满足时停止整个循环,例如:小时,例如:分,例如:秒,2019/2/17,38,例4.12:从键盘上输入1个正整数n,求1!+2!+3!+n!的结果 #include int main( ) int i,j,n;double f,sum=0;do printf(“Pleas

38、e input n:n“);scanf(“%d“, ,内循环,求i!,外循环,求1!+2!+n!,如果读入3,结果 sum=9.000000E+000,2019/2/17,39,循环嵌套,程序4.13 打印一个由*号组成的 五 行等腰上三角形。 #include int main( ) int i ,j ; for (i=1;i= 5 ; i+) for (j=1;j=(5-i)+14;j+) /+14使图形居中printf(“%2c“, ); /打印前导空格for (j=1;j=2*i-1;j+) /打印本行图形printf(“%2c“, * );printf(“n“); /换行 retur

39、n 0; ,外层循环控制行的变化,n,n;,scanf(“%d”,n,n-i,打印一个n行等腰上三角形,每行图形依次为ABCD,读入控制的完整代码如教材所示,用dowhile保证n在一定的范围内,i+64);,算法: 一般用两层循环打印一个形状规则的图形 外层循环控制行变化 外层循环体中依次完成下面3个步骤: (1)根据行数和图形的形状,打印每行的前导空格(确定 本行图形的起始位置)。若行号为i,i从1开始计,考虑 最后一行(假设为n)前不留前导空格,则第i行前导空格的 单位为: n-i,用一个内层循环控制打印前导空格 (2)根据行号与当前行图形的个数及形状的关系进行控制 输出当前行的图形。等

40、腰三角形,其图形元素个数为2*i-1, 这里i为当前行的行号,用一个内层循环打印图形 (3)换行,2019/2/17,40,一个用穷举法解决问题的典型例,注意算法设计的重要性,同一题有多种解法,效率不一样. 程序4.14 百钱百鸡问题:鸡翁一,值钱5;鸡母一,值钱3;鸡雏三,值钱1。百钱买百鸡,问鸡翁、母、雏各几何? 分析:设公鸡,母鸡和雏鸡的数量分别为x,y,z,有下列关系成立: x+y+z=100 (百鸡) 5x+3y+z/3=100 (百钱) 15x+9y+z=300 (百钱) 3个变量的范围:0=x=20,0=y=33,0=z=100,循环嵌套,2019/2/17,41,/例4.14百

41、鸡百钱问题方法1 /用3 层循环控制 #include int main(void) int x,y,z;for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+) if(x+y+z=100,满足百鸡,满足百钱,同时满足,2,两, z=100-x-y;,利用百鸡条件用x,y的表达式表示z,从而去掉第3层循环,if(,这时只需要判断百钱的条件就可以了,2019/2/17,42,break语句的用法1:用于switch语句中,表示结束该分支的操作,从而结束switch语句,真正实现了多分支控制 break语句的用法2:用于3种循环语句的循环体中,配合一定的条

42、件,执行到break直接退出本层循环,从而增加了从循环体中结束循环的方式(此前只能因循环控制条件为假而终止循环) 程序4.10 模拟投骰子问题的第4种实现方法使用break语句 模拟投骰子循环条件是两个:投掷次数小于10并且投中次数小于2,前3种方法都是将这两个条件同时列在控制循环的条件表达式中,用break就可以减少一个循环条件,其他流程控制语句(break),2019/2/17,43,程序4.10 模拟投骰子问题的第4种实现方法 循环体中使用break语句,#include #include #include int main( ) int count=0,y=0,dice; srand(

43、time(0); while(count10 ,两个条件同时满足,这是原方法2的代码,用while语句控制循环,if (y=2) break;,),减少一个条件,break用于循环体中,一般要配合if使用才有意义,流程图,增加了从循环体中退出循环的出口,2019/2/17,44,continue语句的用法:只能用于循环语句的语句块中 continue语句的功能:提前结束本次循环,忽略循环体中其后的语句,直接进入下一次条件的判断 与break语句不同:continue不能退出循环 程序4.10 模拟投骰子问题的第5种实现方法使用continue语句 模拟投骰子的循环体中,变量y自增1是有条件的,

44、必须在dice=6时,换句话说,当dice!=6时,y+不执行,这可以用continue来改写,其他流程控制语句(continue),2019/2/17,45,程序4.10 模拟投骰子问题的第5种实现方法 循环体中使用continue语句,#include #include #include int main( ) int count=0,y=0,dice; srand(time(0); while(count10 ,两个条件同时满足,这是原方法2的代码,用while语句控制循环,流程图,!,continue;,增加了一种提前结束循环体回到循环条件重新判断的方式,1设有程序段int k=10;

45、while(k=0) k=k-1;这下面描述中正确的是_.a)while循环执行10次 b)循环是无限循环c)循环体语句一次也不执行 d)循环体语句执行一次,C正确,因为k被赋值为0,while中的条件为假,随堂练习,2. 下面程序段的运行结果是_.int n=0;while(n+=2);printf(“%d“,n);a)2 b)3 c)4 d)有语法错,正确答案选C,因为n+是先取n的当前值作为表达式的结果,之后n再自增。因此当n+表达式的值为3时退出循环,此时n的值已自增为4,随堂练习,3. 以下程序段_. x=-1;dox=x*x; while(!x);a)是死循环 b)循环执行二次c)

46、循环执行一次 d)有语法错误,正确答案选C,随堂练习,4.下面程序的运行结果是_. # include void main() int a,s,n,count;a=2;s=0;n=1;count=1;while(count=6)n=n*a;s=s+n;+count;printf(“s=%dn“,s);,正确答案126,随堂练习,5.下面程序段的运行结果是_i=1;s=3;do s+=i+; if(s%7=0) continue;else +i;while(s15);printf(“%d“,i);,正确答案 8,随堂练习,6.下面程序段的运行结果是_ #include main() int k;for(k=1;k5;k+)switch(k) case 1:case 2: printf(“%dn”,k);case 3: printf(“%dn”,k); break;default: printf(“OK!n”); ,正确答案 1 1 2 2 3 OK!,随堂练习,7.调试下面程序,并给出的运行结果_ #include main() int i,j,k;char space= ;for(i=1;i=4;i+) for(j=1;j=i;j+)printf(“%c”,space);for(k=1;k=6;k+)printf(“*”);printf(“n”); ,

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

当前位置:首页 > 中等教育 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报