第5章选择控制结构.ppt
2022/12/61/56第5章选择控制结构 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望2022/12/62/56本章学习内容本章学习内容本章学习内容本章学习内容 算法的描述方法算法的描述方法算法的描述方法算法的描述方法 用于单分支控制的用于单分支控制的用于单分支控制的用于单分支控制的ifif语句语句语句语句 用于双分支控制的用于双分支控制的用于双分支控制的用于双分支控制的if-elseif-else语句语句语句语句 用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 breakbreak语句在语句在语句在语句在switchswitch语句中的作用语句中的作用语句中的作用语句中的作用 关系运算符关系运算符关系运算符关系运算符 条件运算符条件运算符条件运算符条件运算符 逻辑运算符逻辑运算符逻辑运算符逻辑运算符 程序测试程序测试程序测试程序测试2022/12/63/56生活中的问题求解:生活中的问题求解:生活中的问题求解:生活中的问题求解:Problem:Problem:烤蛋糕(烤蛋糕(烤蛋糕(烤蛋糕(Baking a CakeBaking a Cake)How to solve:How to solve:1.1.StartStart2.2.将烤箱预热将烤箱预热将烤箱预热将烤箱预热3.3.准备一个盘子准备一个盘子准备一个盘子准备一个盘子4.4.在盘子上抹上一些黄油在盘子上抹上一些黄油在盘子上抹上一些黄油在盘子上抹上一些黄油5.5.将面粉、鸡蛋、糖和香精混合在一起搅拌均匀将面粉、鸡蛋、糖和香精混合在一起搅拌均匀将面粉、鸡蛋、糖和香精混合在一起搅拌均匀将面粉、鸡蛋、糖和香精混合在一起搅拌均匀6.6.将搅拌好的面粉团放在盘子上将搅拌好的面粉团放在盘子上将搅拌好的面粉团放在盘子上将搅拌好的面粉团放在盘子上7.7.将盘子放到烤箱内将盘子放到烤箱内将盘子放到烤箱内将盘子放到烤箱内8.8.End End5.15.1生活中与计算机中的问题求解生活中与计算机中的问题求解生活中与计算机中的问题求解生活中与计算机中的问题求解 (Problem Solving ProcessProblem Solving Process)2022/12/64/56分治策略分治策略分治策略分治策略(Divide and Conquer Strategy Divide and Conquer Strategy)Problem:Problem:准备早餐(准备早餐(准备早餐(准备早餐(Prepare a BreakfastPrepare a Breakfast)1.Start2.准备早餐准备早餐3.End2022/12/65/561.Start1.Start2.2.准备早餐准备早餐准备早餐准备早餐 2.1 2.1 准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治 2.2 2.2 准备一些薯条准备一些薯条准备一些薯条准备一些薯条 2.3 2.3 冲一杯咖啡冲一杯咖啡冲一杯咖啡冲一杯咖啡3.End3.End分治策略分治策略分治策略分治策略(Divide and Conquer Strategy Divide and Conquer Strategy)2022/12/66/561.Start1.Start2.2.准备早餐准备早餐准备早餐准备早餐 2.1 2.1 准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治 2.1.1 2.1.1 拿来两片面包拿来两片面包拿来两片面包拿来两片面包 2.1.2 2.1.2 准备一些金枪鱼酱准备一些金枪鱼酱准备一些金枪鱼酱准备一些金枪鱼酱 2.2 2.2 准备一些薯片准备一些薯片准备一些薯片准备一些薯片 2.3 2.3 冲一杯咖啡冲一杯咖啡冲一杯咖啡冲一杯咖啡3.End3.End分治策略分治策略分治策略分治策略(Divide and Conquer Strategy Divide and Conquer Strategy)2022/12/67/561.Start1.Start2.2.准备早餐准备早餐准备早餐准备早餐 2.1 2.1 准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治 2.1.1 2.1.1 拿来两片面包拿来两片面包拿来两片面包拿来两片面包 2.1.2 2.1.2 准备一些金枪鱼酱准备一些金枪鱼酱准备一些金枪鱼酱准备一些金枪鱼酱 2.2 2.2 准备一些薯片准备一些薯片准备一些薯片准备一些薯片 2.2.1 2.2.1 将土豆切成片将土豆切成片将土豆切成片将土豆切成片 2.2.2 2.2.2 油炸这些土豆片油炸这些土豆片油炸这些土豆片油炸这些土豆片 2.3 2.3 冲一杯咖啡冲一杯咖啡冲一杯咖啡冲一杯咖啡3.End3.End分治策略分治策略分治策略分治策略(Divide and Conquer Strategy Divide and Conquer Strategy)2022/12/68/56分治策略分治策略分治策略分治策略(Divide and Conquer Strategy Divide and Conquer Strategy)1.Start1.Start2.2.准备早餐准备早餐准备早餐准备早餐 2.1 2.1 准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治准备一个金枪鱼三明治 2.1.1 2.1.1 拿来两片面包拿来两片面包拿来两片面包拿来两片面包 2.1.2 2.1.2 准备一些金枪鱼酱准备一些金枪鱼酱准备一些金枪鱼酱准备一些金枪鱼酱 2.2 2.2 准备一些薯片准备一些薯片准备一些薯片准备一些薯片 2.2.1 2.2.1 将土豆切成片将土豆切成片将土豆切成片将土豆切成片 2.2.2 2.2.2 油炸这些土豆片油炸这些土豆片油炸这些土豆片油炸这些土豆片 2.3 2.3 冲一杯咖啡冲一杯咖啡冲一杯咖啡冲一杯咖啡 2.3.1 2.3.1 烧些开水放入杯中烧些开水放入杯中烧些开水放入杯中烧些开水放入杯中 2.3.2 2.3.2 在水杯中加入一些咖啡和糖在水杯中加入一些咖啡和糖在水杯中加入一些咖啡和糖在水杯中加入一些咖啡和糖3.End3.End2022/12/69/565.25.2算法的概念算法的概念算法的概念算法的概念及其描述方法及其描述方法及其描述方法及其描述方法 面向对象程序面向对象程序 =对象对象 +消息消息 面向过程的程序面向过程的程序 =数据结构数据结构 +算法算法 计算机中的算法计算机中的算法(Algorithm)为解决一个具体问题而采取的、确定的、有限的操为解决一个具体问题而采取的、确定的、有限的操为解决一个具体问题而采取的、确定的、有限的操为解决一个具体问题而采取的、确定的、有限的操作步骤,仅指计算机能执行的算法作步骤,仅指计算机能执行的算法作步骤,仅指计算机能执行的算法作步骤,仅指计算机能执行的算法A specific and step-by-step set of instructions for A specific and step-by-step set of instructions for carrying out a procedure or solving a problem,usually carrying out a procedure or solving a problem,usually with the requirement that the procedure terminate at with the requirement that the procedure terminate at some pointsome point2022/12/610/565.25.2算法的概念算法的概念算法的概念算法的概念及其描述方法及其描述方法及其描述方法及其描述方法 算法的特性算法的特性有穷性有穷性有穷性有穷性 在合理的时间内完成在合理的时间内完成在合理的时间内完成在合理的时间内完成确定性,无歧义确定性,无歧义确定性,无歧义确定性,无歧义 如果如果如果如果x x0000,则输出,则输出,则输出,则输出YesYesYesYes;如果如果如果如果x x0000,则输出,则输出,则输出,则输出NoNoNoNo有效性有效性有效性有效性 能有效执行能有效执行能有效执行能有效执行负数开平方负数开平方负数开平方负数开平方没有输入或有多个输入没有输入或有多个输入没有输入或有多个输入没有输入或有多个输入 有一个或多个输出有一个或多个输出有一个或多个输出有一个或多个输出 2022/12/611/565.25.2算法的概念算法的概念算法的概念算法的概念及其描述方法及其描述方法及其描述方法及其描述方法 算法的描述方法算法的描述方法自然语言描述自然语言描述自然语言描述自然语言描述传统流程图(传统流程图(传统流程图(传统流程图(FlowchartFlowchart)在在在在19661966年,年,年,年,Bohra Bohra 与与与与 Jacopini Jacopini 提出提出提出提出N-SN-S结构化流程图结构化流程图结构化流程图结构化流程图 19731973年,美国学者年,美国学者年,美国学者年,美国学者I.Nassi I.Nassi 和和和和 B.Shneiderman B.Shneiderman 提出提出提出提出伪码(伪码(伪码(伪码(PseudocodePseudocode)表示)表示)表示)表示2022/12/612/56流程图流程图流程图流程图(FlowchartFlowchart)Flowchart represents algorithm graphically.Start/EndSymbolSymbolSemanticSemanticProcessInput/OutputTestConnectorFlow of activities2022/12/613/56计算机中的问题求解过程计算机中的问题求解过程Example Example:买苹果,计算价钱:买苹果,计算价钱:买苹果,计算价钱:买苹果,计算价钱Calculate and display the price of a number of apples Calculate and display the price of a number of apples if the quantity in kg and price per kg are given.if the quantity in kg and price per kg are given.quantityquantity pricePerkg pricePerkgpricepriceprice=quantity*pricePerkgprice=quantity*pricePerkgInputInputProcessOutputOutputFirst identify the input and output of the problem.First identify the input and output of the problem.2022/12/614/56顺序结构(顺序结构(Sequence Structure)给变量赋值给变量赋值赋值表达式语句赋值表达式语句赋值表达式语句赋值表达式语句 赋值表达式赋值表达式赋值表达式赋值表达式 ;price=quantity*pricePerkg;输入输出数据输入输出数据标准库函数标准库函数标准库函数标准库函数调用语句调用语句调用语句调用语句 scanf(%d,&pricePerkg);printf(%d,price);ABC2022/12/615/56【例例5.1】计算两整数的最大值计算两整数的最大值 num1num1 num2 num2maxmax?InputInputProcessOutputOutput2022/12/616/56if-elseSingle SelectionDouble SelectionMultiple Selectionifif-else-if选择结构(分支结构)选择结构(分支结构)选择结构(分支结构)选择结构(分支结构)(Selection StructureSelection Structure)2022/12/617/565.35.3关系运算符与关系表达式关系运算符与关系表达式关系运算符与关系表达式关系运算符与关系表达式Relational OperationDescriptionExamples of ExpressionValueLess than6 91(true)=Less than or equal to5 Greater than2 60(false)=Greater than or equal to9=51(true)=Equal to7=50(false)!=Not equal to6!=51(true)2022/12/618/565.45.4用于用于用于用于单分支单分支单分支单分支控制的条件语句控制的条件语句控制的条件语句控制的条件语句(SingleSingle Selection Selection)Step aStep aconditionconditionStep mStep mStep nStep nStep xStep xtruetruefalsefalsestep astep aconditionconditionstep mstep mstep nstep nstep bstep btruetruefalsefalsePseudocode StructurePseudocode Structurestep aif startstep mstep nend_ifstep b2022/12/619/56if if StatementStatementThe structure is similar to single selection(flowchart)The structure is similar to single selection(flowchart)Syntax:ifif (expression)(expression)statement;statement;ororifif (expression)(expression)statement1;statement1;statement2;statement2;复合语句复合语句compound statement被当做一条语句看待被当做一条语句看待表达式非表达式非表达式非表达式非0 0为真为真为真为真2022/12/620/56if if StatementStatementThe structure is similar to single selection(flowchart)The structure is similar to single selection(flowchart)Syntax:ifif (expression)(expression)statement;statement;ororifif (expression)(expression)statement1;statement1;statement2;statement2;Dont forget the Dont forget the bracesbraces!Dont forget the Dont forget the parenthesesparentheses!2022/12/621/56#include main()int a,b,max;printf(Input a,b:);scanf(%d,%d,&a,&b);if(a b)max=a;if(a=b)max=b;printf(max=%dn,max);Input a,b:_Input a,b:20 15_Input a,b:20 15max=20_【例例例例5.15.1】计算两整数的最大值计算两整数的最大值计算两整数的最大值计算两整数的最大值 2022/12/622/56Pseudocode StructurePseudocode StructureStep aif startStep mStep nend_ifelse startStep xStep yend_elseStep zStep aStep aconditionconditionStep mStep mStep nStep nStep zStep ztruetruefalsefalseStep xStep xStep yStep yStep aStep aconditionconditionStep mStep mStep nStep nStep zStep ztruetruefalsefalseStep xStep xStep yStep y5.55.5用于用于用于用于双分支双分支双分支双分支控制的条件语句控制的条件语句控制的条件语句控制的条件语句(DoubleDouble SelectionSelection)2022/12/623/56if-elseif-else StatementStatementThe structure is similar to double selection(flowchart)The structure is similar to double selection(flowchart)Syntax:ifif (expression)(expression)statement1;statement1;elseelse statement2;statement2;or ifif (expression)(expression)statement1;statement1;statement3;statement3;elseelse statement2;statement2;statement4;statement4;2022/12/624/56NoNoYesYesFlowchart:Calculate the MaximumFlowchart:Calculate the MaximumFlowchart:Calculate the MaximumInput Input a and ba and bOutput maxOutput maxa b?a b?max max b bmax max a aStartStartEndEnd【例例例例5.25.2】计算两整数的最大值计算两整数的最大值计算两整数的最大值计算两整数的最大值 2022/12/625/56scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);if(a b)if(a b)max=a;max=a;elseelse max=b;max=b;Turn Flowchart to C ProgramTurn Flowchart to C ProgramTurn Flowchart to C ProgramNoNoYesYesInput a and bInput a and bOutput maxOutput maxa b?a b?max max b bmax max a aStartStartEndEnd【例例例例5.25.2】计算两整数的最大值计算两整数的最大值计算两整数的最大值计算两整数的最大值 printf(max=%dn,printf(max=%dn,max);max);2022/12/626/56#include main()int a,b,max;printf(Input a,b:);scanf(%d,%d,&a,&b);if (a b)max=a;else max=b;printf(max=%d,max);if (a b)max=a;if (a=b)max=b;【例例例例5.25.2】计算两整数的最大值计算两整数的最大值计算两整数的最大值计算两整数的最大值 2022/12/627/56#include main()int a,b,max;printf(Input a,b:);scanf(%d,%d,&a,&b);if (a b)max=a;else max=b;printf(max=%d,max);max=a b?a:b;表达式表达式表达式表达式1?1?1?1?表达式表达式表达式表达式2:2:2:2:表达式表达式表达式表达式3 3 3 35.65.6条件运算符和条件表达式条件运算符和条件表达式条件运算符和条件表达式条件运算符和条件表达式【例例例例5.35.3】2022/12/628/565.75.7用于用于用于用于多分支多分支多分支多分支控制的条件语句控制的条件语句控制的条件语句控制的条件语句(Multiple SelectionMultiple Selection)Multi-way Multi-way if ifStep aifif(expression1)Step m ifif(expression2)Step n Step zStep aStep aexpression1expression1Step mStep mStep nStep nStep zStep ztruetruefalsefalseexpression2expression2truetruefalsefalseStep aStep aexpression1expression1Step mStep mStep nStep nStep zStep ztruetruefalsefalseexpression2expression2truetruefalsefalse2022/12/629/565.75.7用于用于用于用于多分支控制多分支控制多分支控制多分支控制的条件语句的条件语句的条件语句的条件语句(Multiple SelectionMultiple Selection)Cascaded Cascaded if ifStep aifif (expression1)Step m else ifelse if(expression2)Step n else else Step x Step zStep aStep aexpression1expression1Step mStep mStep nStep nStep zStep ztruetruefalsefalseexpression2expression2truetruefalsefalseStep xStep xStep aStep aexpression1expression1Step mStep mStep nStep nStep zStep ztruetruefalsefalseexpression2expression2truetruefalsefalseStep xStep x2022/12/630/565.8用于多路选择的用于多路选择的switch语句语句 The structure is similar to multiple selection(flowchart)switchswitch(expressionexpression)casecase value1value1:statement1;statement1;break;break;case case value2value2:statement2;statement2;break;break;defaultdefault :statementX;statementX;break;break;Dont forget the Dont forget the braces!braces!Dont forget the Dont forget the colons!colons!Dont forget the Dont forget the blank!blank!2022/12/631/56Important Rule!switchswitch(expressionexpression)casecase value1value1:statement1;statement1;break;break;case case value2value2:statement2;statement2;break;break;defaultdefault :statementX;statementX;break;break;Must be Must be intint or or charchar!5.8用于多路选择的用于多路选择的switch语句语句 注意!注意!注意!注意!2022/12/632/56Example:switch(month)case 1:printf(Januaryn);break;case 2:printf(Februaryn);break;case 3:printf(Marchn);break;default:printf(Othersn);break;printf(End);Assume month=1,Assume month=1,so so this step will be this step will be executed.Later executed.Later casecase is terminated is terminated here.Jump to here.Jump to January_JanuaryEnd _5.85.8用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 2022/12/633/56Example:switch(month)case 1:printf(Januaryn);break;case 2:printf(Februaryn);break;case 3:printf(Marchn);break;default:printf(Othersn);break;printf(End);this step will be this step will be executed.Later executed.Later March_MarchEnd _Assume month=3,Assume month=3,so so casecase is terminated is terminated here.Jump to here.Jump to 5.85.8用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 2022/12/634/56Example:switch(month)case 1:printf(Januaryn);break;case 2:printf(Februaryn);break;case 3:printf(Marchn);break;default:printf(Othersn);break;printf(End);Nowwhat will Nowwhat will happen if this happen if this breakbreak is taken out from the is taken out from the program?program?5.85.8用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 2022/12/635/56Example:switch(month)case 1:printf(Januaryn);break;case 2:printf(Februaryn);case 3:printf(Marchn);break;default:printf(Othersn);break;printf(End);No more!No more!5.85.8用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 2022/12/636/56Example:switch(month)case 1:printf(Januaryn);break;case 2:printf(Februaryn);case 3:printf(Marchn);break;default:printf(Othersn);break;printf(End);this step will be this step will be executed.Later executed.Later February_March _Assume month=2,Assume month=2,so so casecase is terminated is terminated here.Jump to here.Jump to End _execution continues.Thus,execution continues.Thus,this step is executed.So this step is executed.So 5.85.8用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 2022/12/637/56Example:switch(month)case 1:printf(Januaryn);break;case 2:printf(Februaryn);case 3:printf(Marchn);break;default:printf(Othersn);break;printf(End);Nowwhat will Nowwhat will happen if these happen if these breakbreaks s are taken out are taken out from the program?from the program?And And if month=1?if month=1?And And if month=34?if month=34?5.85.8用于多路选择的用于多路选择的用于多路选择的用于多路选择的switchswitch语句语句语句语句 最好不省略最好不省略!2022/12/638/56【例例例例5.55.5】计算器程序计算器程序计算器程序计算器程序 编程设计一个简单的计算器程序,要求用户从键盘输入如编程设计一个简单的计算器程序,要求用户从键盘输入如编程设计一个简单的计算器程序,要求用户从键盘输入如编程设计一个简单的计算器程序,要求用户从键盘输入如下形式的表达式:下形式的表达式:下形式的表达式:下形式的表达式:操作数操作数操作数操作数1 1 运算符运算符运算符运算符op op 操作数操作数操作数操作数2 2 然后,计算并输出表达式的值然后,计算并输出表达式的值然后,计算并输出表达式的值然后,计算并输出表达式的值 指定的运算符为指定的运算符为指定的运算符为指定的运算符为 加(加(加(加(+)减(减(减(减(-)乘(乘(乘(乘(*)除(除(除(除(/)2022/12/639/56mainmain()()intint data1,data2;/*data1,data2;/*定义两个操作符定义两个操作符定义两个操作符定义两个操作符*/charchar op;/*op;/*定义运算符定义运算符定义运算符定义运算符*/printf(Please enter the expression:);printf(Please enter the expression:);scanf(%d%c%d,&data1,&op,&data2);/*scanf(%d%c%d,&data1,&op,&data2);/*输入运算表达式输入运算表达式输入运算表达式输入运算表达式*/switchswitch(op)(op)casecase+:/*+:/*处理加法处理加法处理加法处理加法*/printf(%d+%d=%dn,data1,data2,data1+data2);printf(%d+%d=%dn,data1,data2,data1+data2);breakbreak;casecase-:/*-:/*处理减法处理减法处理减法处理减法*/printf(%d-%d=%dn,data1,data2,data1-data2);printf(%d-%d=%dn,data1,data2,data1-data2);breakbreak;casecase*:/*:/*处理乘法处理乘法处理乘法处理乘法*/printf(%d*%d=%dn,data1,data2,data1*data2);printf(%d*%d=%dn,data1,data2,data1*data2);breakbreak;casecase/:/*/:/*处理除法处理除法处理除法处理除法*/ifif(0=data20=data2)printf(Division by zero!n);printf(Division by zero!n);elseelse printf(%d/%d=%dn,data1,data2,data1/data2);printf(%d/%d=%dn,data1,data2,data1/data2);breakbreak;defaultdefault:printf(Invalid operator!n);printf(Invalid operator!n);【例例例例5.55.5】Why?注注释掉会怎掉会怎样?2022/12/640/56思考题思考题思考题思考题 语句语句语句语句if(0=data2)if(0=data2)的必要性的必要性的必要性的必要性避免避免避免避免“除零错误除零错误除零错误除零错误”19981998年年年年1111月,月,月,月,科学美国人科学美国人科学美国人科学美国人杂志描述了美国导弹巡杂志描述了美国导弹巡杂志描述了美国导弹巡杂志描述了美国导弹巡洋舰约克敦号上的一起事故,除零错导致军舰推进系统洋舰约克敦号上的一起事故,除零错导致军舰推进系统洋舰约克敦号上的一起事故,除零错导致军舰推进系统洋舰约克敦号上的一起事故,除零错导致军舰推进系统的关闭的关闭的关闭的关闭 为什么不用为什么不用为什么不用为什么不用if(data2=0)if(data2=0)?如果要求输入的算术表达式中的操作数和运算符之如果要求输入的算术表达式中的操作数和运算符之如果要求输入的算术表达式中的操作数和运算符之如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符,那么程序如何修改?间可以加入任意多个空格符,那么程序如何修改?间可以加入任意多个空格符,那么程序如何修改?间可以加入任意多个空格符,那么程序如何修改?2022/12/641/56mainmain()()intint data1,data2;data1,data2;charchar op;op;printf(Please enter the expression:);printf(Please enter the expression:);scanf(%d%c%d,&data1,&op,&data2);scanf(%d%c%d,&data1,&op,&data2);/*%c/*%c前有一个空格前有一个空格前有一个空格前有一个空格*/switchswitch(op)(op)casecase+:+:printf(%d+%d=%dn,data1,data2,data1+data2);printf(%d+%d=%dn,data1,data2,data1+data2);breakbreak;casecase-:-:printf(%d-%d=%dn,data1,data2,data1-data2);printf(%d-%d=%dn,data1,data2,data1-data2);brea