C语言程序设计第五章程序控制结构1本章学习内容5-2☼算法的描述方法☼单分支控制语句:if☼双分支控制语句:if-else☼多分支控制语句:ifelseif☼多路选择语句:switch☼break语句在switch语句中的作用☼运算符:☼关系运算符☼条件运算符☼逻辑运算符算法的概念及其描述数据结构+算法=程序数据结构:数据的描述和组织形式算法:为解决一个具体问题而采取的确定的有限的操作步骤。算法特性:有穷性确定性有效性没有输入或有多个输入有一个或多个输出5-3算法的特性有穷性在合理的时间内完成确定性,无歧义如果x≥0,则输出Yes;如果x≤0,则输出No有效性能有效执行负数开平方没有输入或有多个输入有一个或多个输出5-4算法的概念及其描述算法的描述方法–自然语言描述–传统流程图(Flowchart)•在1966年,Bohra与Jacopini提出–N-S结构化流程图•1973年,美国学者I.Nassi和B.Shneiderman提出–伪码(Pseudocode)表示5-5算法的概念及其描述伪码(Pseudocode)•人工的,非正式的辅助人们进行算法设计的语言。6if8点以前thendo私人事务;elseif8点到11:45点then上课;else自习;日常生活流程图(Flowchart)5-7开始\结束框符号Semantic一般处理框输入\输出框判断框连接符流程线2019/12/186-8构成程序的三种基本结构顺序结构选择结构(分支结构)循环结构任何程序均可只用这三种结构综合描述只用这三种结构编制的程序,叫结构化程序程序必须符合结构化规则2019/12/189结构化程序设计的核心思想采用顺序、选择和循环三种基本结构作为程序设计的基本单元只有一个入口;只有一个出口;无死语句,即不存在永远都执行不到的语句;无死循环,即不存在永远都执行不完的循环。采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计构成程序的三种基本结构例:买苹果,计算价钱5-10•数量•单位价格总价总价=数量*单位价格InputProcessOutput首先要确认输入与输出顺序结构•给变量赋值–赋值表达式语句/赋值表达式;总价=数量*单位价格;•输入输出数据–标准库函数调用语句scanf(%d,&pricePerkg);printf(%d,price);5-11ABC顺序结构——应用举例(1)5-12例:求一个数的绝对值解:(1)问题分析:step1:给出一个数num=-55step2:求num的绝对值step3:输出结果公式:abs=fabs(num)(利用数学函数fabs())流程图及代码5-13num=-55开始abs=fabs(num)输出num,abs结束#includestdio.h#includemath.hmain(){intnum,abs;num=-55;abs=fabs(num);printf(|%d|=%d,num,abs);}5_1.c常用函数对应的头文件函数函数头文件数学函数math.h字符串函数string.h输入输出函数stdio.h动态存储分配函数stdlib.h/malloc.h5-14选择结构(分支结构)5-15•分类:•单分支:if•双分支:if-else•多分支:if-else-if•作用:控制程序的流向•组成:常量,变量,表达式(常用:关系、逻辑表达式)本章学习内容5-16☼算法的描述方法☼单分支控制语句:if☼双分支控制语句:if-else☼多分支控制语句:ifelseif☼多路选择语句:switch☼break语句在switch语句中的作用☼运算符:☼关系运算符☼条件运算符☼逻辑运算符关系运算符与关系表达式5-17关系运算符含义示例值优先级小于691(true)高=小于等于5=51(true)大于260(false)=大于等于9=51(true)==等于7==50(false)低!=不等于6!=51(true)关系运算符与关系表达式关系运算符运算出的结果为0和非00,表示假,即该关系不成立非0,表示真,即该关系成立绝大多数编译器,关系运算得到的非0结果为1,但是不要利用这个1优先级:、=、、=优先于==、!=5-18关系运算符与关系表达式例:设a=3,b=2,c=1,计算下列表达式的值5-191.ab2.abc10inta=0;if(a=0)printf(OK);inta=0;if(a==0)printf(OK);如何避免?inta=0;if(0==a)printf(OK);inta=0;if(0=a)printf(OK);编译出错!!==与=3.a=b1变量的值就是赋值表达式的值本章学习内容5-20☼算法的描述方法☼单分支控制语句:if☼双分支控制语句:if-else☼多分支控制语句:ifelseif☼多路选择语句:switch☼break语句在switch语句中的作用☼运算符:☼关系运算符☼条件运算符☼逻辑运算符格式:5-21if(表达式)语句;if(表达式){语句1;语句2;}单分支控制的条件语句复合语句被当做一条语句单语句格式:复合语句格式:单分支控制的条件语句5-22yesno语句A条件成立否条件表达式.T..F.语句例5.1计算两整数的最大值5-23#includestdio.hmain(){inta,b,max;printf(Inputa,b:);scanf(%d,%d,&a,&b);if(ab)max=a;if(a=b)max=b;printf(max=%d\n,max);}Inputa,b:20,15↙max=20_5_1.c本章学习内容5-24☼算法的描述方法☼单分支控制语句:if☼双分支控制语句:if-else☼多分支控制语句:ifelseif☼多路选择语句:switch☼break语句在switch语句中的作用☼运算符:☼关系运算符☼条件运算符☼逻辑运算符用于双分支控制的条件语句格式:5-25if(表达式)语句A;else语句B;语句A真语句B假入口出口表达式!=0表达式值非0时,执行语句A,跳出结构;表达式值为0时,执行语句B,跳出结构;else部分可以没有if(表达式)语句A;当表达式值为0时,跳出结构;表达式!=0语句A真假入口出口用于双分支控制的条件语句5-26if(表达式){语句A1;语句A2;}else{语句B1;语句B2;}复合语句格式:语句A1真语句B1假入口出口表达式!=0语句A2语句B2例5.1计算两整数的最大值5-27NoYesInputaandbOutputmaxab?maxbmaxaStartEnd例5.1计算两整数的最大值5-28NoYesInputaandbOutputmaxab?maxbmaxaStartEndscanf(%d,%d,&a,&b);if(ab)max=a;elsemax=b;printf(max=%d\n,max);5-29#includestdio.hmain(){inta,b,max;printf(Inputa,b:);scanf(%d,%d,&a,&b);if(ab)max=a;if(a=b)max=b;printf(max=%d\n,max);}例5.1计算两整数的最大值if(ab)max=a;elsemax=b;本章学习内容5-30☼算法的描述方法☼单分支控制语句:if☼双分支控制语句:if-else☼多路选择语句:switch☼break语句在switch语句中的作用☼运算符:☼关系运算符☼条件运算符☼逻辑运算符条件运算符和条件表达式5-31#includestdio.hmain(){inta,b,max;printf(Inputa,b:);scanf(%d,%d,&a,&b);if(ab)max=a;elsemax=b;printf(max=%d,max);}表达式1?表达式2:表达式3max=ab?a:b;条件表达式5-32一般形式:(ab)?a:bab条件成立该表达式的值就是aab条件不成立该表达式的值是b此种表达式切忌用得过于繁杂例5.2:求分段函数的值5-33(参见教材P40:常用标准数学函数)解:有分段函数:y=X01X=0exp(-x)#includemath.h例5.2:求分段函数的值5-34#includestdio.h#includemath.hmain(){floatx,y;printf(Inputx:);scanf(%f,&x);if(x0)y=exp(-x);elsey=1;printf(“y=%f\n”,y);}5_2.c例5.3阅读程序,求程序结果5-35#includestdio.hmain(){inta=3,b=2,c=1;if(ab){if(ac)printf(a=%d\n,a);elseprintf(b=%d\n,b);}printf(over!\n);}if与else配对5_3.c本章学习内容5-36☼算法的描述方法☼单分支控制语句:if☼双分支控制语句:if-else☼多分支控制语句:ifelseif☼多路选择语句:switch☼break语句在switch语句中的作用☼运算符:☼关系运算符☼条件运算符☼逻辑运算符5-37多分支选择结构if的一种扩展形式if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;…………elseif(表达式n)语句n;else语句n+1;else部分可以没有多分支选择结构5-38Stepaexpression1StepmStepnStepztruefalseexpression2truefalseStepxStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepx使用if语句需注意事项•条件判断表达式一定用圆括号括起。•复合语句必须用{}引起。•每一个else必须与一个if项匹配。•else总是与离它最近的if相匹配。5-39例5.4:输入学生分数,系统自动评级5-40#includestdio.hmain(){intscore;printf(pleaseinputthescore:);scanf(%d,&score);if(score=90)printf(A\n);if(score=80&&score90)printf(B\n);if(score=70&&score80)printf(C\n);if(score=60&&score70)printf(D\n);elseprintf(E\n);}if(score60)X5_4.c程序有无问题?例5.4:输入学生分数,系统自动评级5-41#includestdio.hmain(){intscore;printf(pleaseinputthescore:);scanf(%d,&score);if(score=90)printf(A\n);elseif(score=80)printf(B\n);elseif(score=70)printf(C\n);elseif(score=60)printf(D\n);elseprintf(E\n);}5_4_1.c例5.5猜数游戏5-43编程设计一个简单的猜数游戏:先由计算机想一个“数”请人猜,如果人猜对了,则计算机提示:“Right!”;否则提示:“Wrong!”,并告诉人所猜的数是大还是小。解析:计算机想一个数:magic人猜测的数:guess判断两数是否相同?输出判断结果:Right/Wrong“想”的数:用随机函数rand()产生•随机函数rand()–产生的随机数在0~RAND_MAX之间,RAND_MAX在stdlib.h中定义为符号常量,且不大于双字节整数的最大值32767。•#includestdl