版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章 程序流程控制语句,算法的描述方法 基本流程控制语句 几类基本算法:递推法、迭代法、穷举法,一、 if语句 例程3_4: 输入任意四个整数a、b、c和d,求四个数中的最大值。 /*功能:说明if 语句的格式 EX3_4.c */ main() int a,b,c,d,max; printf(Please input four numbers:); scanf(%d%d%d%d, ,3.3 选择结构控制语句,程序运行情况如下: Please input four numbers:11 22 18 19 max=22,3.3 选择结构控制语句,1if语句的一般格式 if(表达式) 语句组1;
2、 else 语句组2; (1)if语句中的“表达式”必须用“()”括起来。 (2)else子句(可选)是if语句的一部分,须与if配对使用,不能单独使用。 (3)当if和else下面的语句组,仅由一条语句时,也可不使用复合语句形式(即去掉花括号)。,3.3 选择结构控制语句,2if语句的执行过程 (1)缺省else子句时 当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,否则直接转向执行下一条语句。 (2)指定else子句时 当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。 用单步执行方式演示例程3_4的执行过程。 3i
3、f语句的嵌套与嵌套匹配原则 if语句允许嵌套。所谓if语句的嵌套是指,在“语句组1”或(和)“语句组2”中,又包含有if语句的情况。 if语句嵌套时,else子句与if的匹配原则:与在它上面、距它最近、且尚未匹配的if配对。 为明确匹配关系,避免匹配错误,强烈建议:将内嵌的if语句,一律用花括号括起来。,3.3 选择结构控制语句,练习:分析下列程序段中ifelse的匹配关系,并将内嵌的if-else子句用括起来。 if(n500) cost=0.15; else if(n300) cost=0.10; else if(n100) cost=0.075; else if(n50) cost=0.
4、 05; else cost=0;,3.3 选择结构控制语句,应用选择结构控制语句if_else进行程序设计举例 例题3_5:教材86页例题4.4;,3.3 选择结构控制语句,条件运算符:有两个符号:?、:,它与三个操作数组成三元运算。 一般形式: ? : 求值规则:,3.3 选择结构控制语句,优先级: 逻辑 条件 赋值 结合性: 自右至左 例如: int max,a=5;b=3; max=ab?a:b 练习:试用条件运算符改写例题3_4,3.3 选择结构控制语句,应用选择结构控制语句if_else进行程序设计举例 例题3_6: 教材89页例题4.5;,3.3 选择结构控制语句,4.说明 (1
5、)if后面的“表达式”,除常见的关系表达式或逻辑表达式外,允许是整型、实型、字符型等。 (2)if语句允许嵌套,但嵌套的层数不宜太多。在实际编程时,应适当控制嵌套层数(23层)。 (3)“语句组1”和“语句组2”,可以只包含一个简单语句,也可以是复合语句。 (4) 只要if else语句中的语句组是表达式语句,则可以用条件表达式语句替代。 (5)不管是简单语句,还是复合语句中的各个语句,if_else 中每个语句后面的分号必不可少: if (num1num2) max=num1; else max=num2; if行后面的赋值语句“max=num1;”分号不能省略。但不要误认为if和else是
6、2个独立的语句,它们都属于if语句中的一部分,else是if语句的子句。,3.3 选择结构控制语句,二、switch语句 C语言提供了switch语句直接处理多分支选择。 例程3_7 从键盘上输入一个百分制成绩score,按下列原则输出其等级: score90,等级为A; 80score90,等级为B; 70score80,等级为C; 60score70,等级为D;score60,等级为E。 /*switch语句的使用 EX3_7.C */ main() int score, grade; printf(“Input a score(0-100): ”); scanf(“%d”, /*将成绩整
7、除10,转化成switch语句中的case标号*/,3.3 选择结构控制语句,switch (grade) case 10: case 9: printf(“grade=An”); break; case 8: printf(grade=Bn); break; case 7: printf(grade=Cn); break; case 6: printf(grade=Dn); break; case 5: case 4: case 3: case 2: case 1: case 0: printf(“grade=En”); break; default: printf(“ score is o
8、ut of range!n”); ,3.3 选择结构控制语句,程序运行情况如下: Input a score(0100): 85 grade=B 1switch语句的一般形式 switch(表达式) case 常量表达式1:语句组1;break; case 常量表达式2:语句组2;break; . case 常量表达式:语句组n;break; default:语句组n+1;break; ,3.3 选择结构控制语句,2switch语句的执行过程 (1)当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出s
9、witch语句,转向执行switch语句的下一条。 (2)如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default 后面的语句(组)。然后,再执行switch语句的下一条。 例程3_7执行过程演示(Ex3_7.c),3.3 选择结构控制语句,3.3 选择结构控制语句,3说明 (1)switch后面的“表达式”,可以是int、char和枚举型中的一种。 (2)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。 (3)case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找
10、到入口标号,就从此标号开始执行,不再进行标号判断,所以必须在每个标号语句组后加上break语句,以便结束switch语句。 思考题:如果去掉以上程序中的所有break语句,且输入的成绩为75,输出结果如何?,3.3 选择结构控制语句,3说明 (4)各case及default子句的先后次序,不影响程序执行结果。 (5)多个case子句,可共用同一语句(组)。 例如,在例程3_7中的 “case 10: ”和“case 9: ”共用语句“printf(”grade=An“); break;”; “case 5: ”-“case 0: ”共用语句“printf(”grade=En“); break;
11、”。 (6)用switch语句实现的多分支结构程序,可以用if语句或if语句的嵌套来实现。,3.3 选择结构控制语句,教材152-158页: 4.2题(1)、(2)题; 4.3题(1)题; 4.4题(1)、(2)题;,作业,用switch语句实现的多分支结构程序,可以用if语句的嵌套来实现。 练习:用if语句的嵌套结构改造例程3_7 应用选择结构控制语句switch进行程序设计举例 例题3_8: 教材98页例题4.8; 算法描述:,3.3 选择结构控制语句,op=+,op,开始,op=-,op=*,op=/,op=非法运算符,结束,依据算法描述编写程序: 练习:尝试采用if语句的嵌套结构改造例
12、题3_8,选择控制语句使用的一些要点和技巧: 1掌握语句的语法格式 2掌握语句的动态执行过程 3. 学会构造选择判断表达式 4注意语句嵌套格式的匹配用法,3.3 用好选择结构语句的要点,3.4 循环控制语句,循环结构:就是在给定条件成立时反复执行某一程序段的程序结构。被反复执行的程序段称为循环体。 C语言有while 、 do - while 、和for语句三种循环结构语句。 前两个语句也称为条件循环,即根据条件来决定是否继续循环;后一个语句称为计数循环,即根据设定的执行次数来执行循环。,1.一般格式 while(表达式) 循环体语句组; 2.执行过程:如右图所示 (1)求解表达式,如果其值为
13、逻辑真(非0),转(2);否则转(3); (2)执行循环体语句组,然后转(1); (3)执行while语句的下一条语句。,一、 while语句,3、说明: (1)先判断表达式,后执行语句。 (2)表达式数据类型同if语句后的表达式一样是逻辑值类型。 (3)循环体多于一个语句句时,用一对括起。,一、 while语句,例程3_10 用while语句求1100的累计和。 算法分析:根据已有的数学知识,求解“1+2+100”很容易。现在考虑程序计算的思路: 首先设置一个累计器sum,其初值为0,利用sum += i来计算(i依次取1、2、100),只要解决以下3个问题即可: (1)将i的初值置为1;
14、(2)重复计算“sum += i”,每执行1次“sum += i”后,i增1; (3)当i增到101时,停止计算。此时,sum的值就是1100的累计和。,一、 while语句,sum=1+2+3+100,0,sum,1,2,100,sum+1,sum,sum+2,sum,sum+100,sum,作100次加法,sum+i,sum,累加器,计数器,/*程序功能:求1100的累计和*/ main() int i=1,sum=0;/*初始化循环控制变量i和累计器sum*/ while( i=100 ) sum += i;/*实现累加*/ i+; /*循环控制变量i增1*/ printf(sum=%d
15、n,sum); ,程序运行情况如下: sum=5050 演示例程3.10单步执行过程(Ex36.c) 练习:编程计算n!,n值从键盘输入。 编程提示:计算n!的算法描述见教材77页-29页;,/*程序功能:求n!*/ main() int n,i=1; long fac=1; printf(“please input a number:”); scanf(“%d”, ,二、 do-while语句,1一般格式 do 循环体语句组; while(表达式);/*本行的分号不能缺省*/ 当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。 2执行过程右图所示 (1)执行循环体语句组。 (2)计算
16、表达式。如果表达式的值为非 0(真),则转向(1)继续执行;否则,转向(3)。 (3)执行do-while的下一条语句。,循环体,表达式,真,假,3、说明: (1)先执行语句,后判断表达式。 (2)第一次循环判断条件为真时,while,do-while等价;第一次循环判断条件为假时,二者不同。,二、 do-while语句,例程3.11 用do-while语句求解1100的累计和。 /*程序功能:求1100的累计和*/ main() int i=1, sum=0; /*定义并初始化循环控制变量及累计器*/ do sum += i; /*累加*/ i+; while(i=100); /*循环继续条
17、件:i=100*/ printf(“sum=%dn”,sum); do-while语句比较适用于处理:不论条件是否成立,先执行1次循环体语句组的情况。,教材152-158页: 4.2题(3)题; 4.3题(2)-(5)题; 4.4题(3)题; 4.6题 4.9题,作业,1for语句的一般格式: for(表达式1;表达式2;表达式3) 循环体语句组; 2for语句的执行过程如右图所示。 (1)求解表达式1(变量赋初值)。 (2)求解表达式2(循环继续条件),如果其值非0,执行(3);否则,转至(4)。 (3)执行循环体语句组,并求解表达式3(循环变量增值),然后转向(2). (4)执行for语句
18、的下一条语句。,三、 for语句,3说明 (1)“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。 (2)“循环变量赋初值”表达式1,既可以是给循环变量赋初值的赋值表达式,也可以是其它表达式(如逗号表达式)。 例如:, for(sum=0;i=100;i+) sum += i; for(sum=0,i=1;i=100;i+) sum += i; (3)“循环继续条件”表达式3是一个逻辑量。,例程3_12 用for语句求解1100的累加和。 /*例程EX_312.c*/ main() int i,sum; for(sum=0,i=0;i=100;
19、i=i+2) sum+=i; printf(“sum=%d”,sum); 注:正确构造循环结构应注意三方面的问题:循环控制变量的初始化,循环的条件和循环控制变量的更新。for语句在书写形式上正好体现了这种紧密的逻辑关系。 练习:编程计算n!,n值从键盘输入,循环控制采用for语句。,1、语句形式: goto 语句标号;,例如: goto label; label: .,语句标号用标识符表示,它的定名规则与变量名相同。,四、 goto语句及循环,2、语句执行流程: 在程序执行过程中,如果遇到goto语句,则程序执行流程无条件地转向语句标号后的语句继续执行。,3、说明 语句标号仅仅对goto 语句
20、有效,对其它语句不影响。 同一个程序中,不允许有同名语句标号。 goto语句通常与if语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能。,例程3_13 用go to 语句与if语句求解1100的累加和。,/*例程EX3_13.c*/ main() int i,sum; i=1;sum=0; label:sum+=i; if(i=100) goto label; printf(sum=%d,sum) 例程EX3_13.c演示,例程3_14: 见教材例4_9 算法设计:见教材103页,单重循环应用实例,基于ANSI标准的随机数库函数是srand()和rand()函数。 void san
21、d(unsigned int seed): 随机数发生器初始化函数。其中参数seed为随机数种子,类型为unsigned int,取值范围从0-65535 。使用格式:srand(seed); int rand( ):产生一个0-32767之间的随机整数,头文件:stdlib.h,常用计算表达式: a+rand()%(b-a+1):产生任意整数区间a,b的随机整数; (float)rand()/32767:产生0-1之间的随机小数; a+(b-a)*rand()%1000/1000.0:产生任意实数区间a,b的随机实数。,42,预备知识随机数库函数用法,这二个函数的工作过程如下: 1) 首先给
22、srand()提供一个种子,种子取值范围从0-65535; 2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间) 3) 根据需要多次调用rand(),可得到新的随机数;,43,随机数生成示例1:一个产生0-32767之间的随机数程序: #include #include #include /使用当前时钟做种子 void main( ) int i; srand(5); for( i = 0; i 10;i+ ) printf( %dn, rand() ); 示例1程序运行两次,大家有何发现?,44,运行示例1大家发现示例1产生的随机数每次都是一
23、样的。要使得程序每次运行产生的随机数是不一样,可调用time()函数为随机数产生seed, 由于time()的值每时每刻都不同,所以每次运行程序的种子不同,从而产生的随机数也不同。,45,示例2:一个产生0-32767之间的随机数程序: #include #include #include /*使用当前时钟做种子*/ void main( ) int i; long t; t=(unsigned)time(NULL); srand(t); for( i = 0; i 10;i+ ) printf( %dn, rand() ); 注:由于srand函数调用time()函数作为种子,故需使用头文件
24、:time.h; unsigned int time(NULL)功能:返回机器当前的日历时间的秒数。,46,示例3:0-1之间的随机数: include include include main( ) int i; srand( (unsigned)time( NULL ) ); for( i = 0; i 10;i+ ) printf( %5.2fn, rand()/32767.0); ,47,示例4:产生1-100之间的随机数可以这样写: include include include main( ) int i; srand( (unsigned)time( NULL ) ); for(
25、 i = 0; i 10;i+ ) printf( %dn, rand()%100+1); ,48,示例4:产生10个1-100之间的随机数可以这样写: include include include main( ) int i; srand( (unsigned)time( NULL ) ); for( i = 0; i 10;i+ ) printf( %dn, rand()%100+1); ,49,例程3_15: 见教材103页例4_12 算法设计:见教材104页流程图 依据算法描述编写程序:见教材107页。,单重循环应用实例,教材152-158页: 4.2题(4)题; 4.3题(7)题;
26、 4.10题 自学教材112页例题4.12,总结算法规律和要点,并仿照例题4.12完成159页4.12题,作业,五、循环嵌套及其应用 循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。 注意:内外层循环控制变量不允许同名;不允许在循环体外用go to语句直接转入循环体内。 循环嵌套的合法结构,见教材116页图4-25!,循环嵌套示例1:分析下列程序的执行结果。 /*EXR1.C,说明循环嵌套的执行过程*/ #include main() int i,j; for(i=0;i3;i+) printf(i=%d:,i); for(j=0;j4
27、;j+) printf(j=%d,j); printf(n); ,演示示例1的动态执行过程,例程3_16编程输出九九乘法表。/*EX3_16.C*/ 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,算法分析:乘法表
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026新疆昌吉州吉木萨尔县五彩湾镇卫生院招聘8人笔试备考题库及答案详解
- 2026陕西宝鸡宝石花产业运营服务有限公司招聘43人笔试参考题库及答案详解
- 2026数字海南有限公司面向社会招聘笔试参考题库及答案详解
- 2026四川遂宁市第三人民医院招聘非在编专业技术人员3人笔试备考题库及答案详解
- 2026山东威海粮油发展有限公司招聘1人备考题库有答案详解
- 2026年口腔正畸学复习题(含答案)
- 2026年科技成果转化能力考试卷及答案
- 2026稀美资源(贵州)科技有限公司招聘11人笔试参考题库及答案详解
- 2026重庆市无人机产业协会招聘备考题库及一套答案详解
- 2026江苏泰兴市人民医院招聘2人备考题库及参考答案详解一套
- 企业安全生产智能化管理系统
- 放射科护理小讲课
- 衢州动物殡葬管理办法
- 变电值班员岗位培训课件
- 皮带配料秤巡检知识培训
- 学堂在线 中国传统文化 章节测试答案
- 天津市红桥区2024-2025学年七年级下学期期末语文试题(含答案)
- 北京市朝阳区2024-2025学年高一下学期期末质量检测数学试题【含答案解析】
- DB4401∕T 152-2022 既有建筑幕墙安全检查技术规程
- 江苏省泰州市泰兴市2024-2025学年高一下学期期末调研测试化学试题(含答案)
- 潮汕文化英文介绍课件
评论
0/150
提交评论