c语言选择控制结构_第1页
c语言选择控制结构_第2页
c语言选择控制结构_第3页
c语言选择控制结构_第4页
c语言选择控制结构_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

c语言选择控制结构第1页/共71页生活中的问题求解:Problem:

烤蛋糕(BakingaCake)Howtosolve:

Start

将烤箱预热

准备一个盘子

在盘子上抹上一些黄油

将面粉、鸡蛋、糖和香精混合在一起搅拌均匀将搅拌好的面粉团放在盘子上

将盘子放到烤箱内End生活中的问题求解

(ProblemSolvingProcess)第2页/共71页Problem:

准备早餐(PrepareaBreakfast)

分治策略

("DivideandConquer"Strategy)1. Start2. 准备早餐3. End第3页/共71页1.Start2.准备早餐

2.1准备一个金枪鱼三明治2.2准备一些薯条2.3冲一杯咖啡3.End

分治策略

("DivideandConquer"Strategy)第4页/共71页1.Start2.准备早餐

2.1准备一个金枪鱼三明治2.1.1拿来两片面包2.1.2准备一些金枪鱼酱

2.2准备一些薯片2.3冲一杯咖啡3.End

分治策略

("DivideandConquer"Strategy)第5页/共71页1.Start2.准备早餐2.1准备一个金枪鱼三明治2.1.1拿来两片面包2.1.2准备一些金枪鱼酱

2.2准备一些薯片

2.2.1将土豆切成片2.2.2油炸这些土豆片

2.3冲一杯咖啡3.End分治策略

("DivideandConquer"Strategy)

第6页/共71页分治策略("DivideandConquer"Strategy)1.Start2.准备早餐2.1准备一个金枪鱼三明治2.1.1拿来两片面包2.1.2准备一些金枪鱼酱

2.2准备一些薯片2.2.1将土豆切成片2.2.2油炸这些土豆片

2.3冲一杯咖啡2.3.1烧些开水放入杯中2.3.2在水杯中加入一些咖啡和糖3.End第7页/共71页面向过程的程序=数据结构+算法计算机中的算法(Algorithm)为解决一个具体问题而采取的、确定的、有限的操作步骤,仅指计算机能执行的算法算法的概念及其描述方法第8页/共71页有穷性在合理的时间内完成确定性,无歧义如果x≥0,则输出Yes;如果x≤0,则输出No有效性能有效执行负数开平方没有输入或有多个输入有一个或多个输出算法的特性第9页/共71页自然语言描述传统流程图(Flowchart)在1966年,Bohra与Jacopini提出N-S结构化流程图1973年,美国学者I.Nassi和B.Shneiderman提出伪码(Pseudocode)表示算法的描述方法第10页/共71页Flowchartrepresentsalgorithmgraphically.流程图(Flowchart)Start/EndSymbolSemanticProcessInput/OutputTestConnectorFlowofactivities第11页/共71页计算机中的问题求解过程Example:买苹果,计算价钱Calculateanddisplaythepriceofanumberofapplesifthequantityinkgandpriceperkgaregiven.

quantitypricePerkgpriceprice=quantity*pricePerkgInputProcessOutputFirstidentifytheinputandoutputoftheproblem.第12页/共71页给变量赋值赋值表达式语句

赋值表达式;

price=quantity*pricePerkg;输入输出数据标准库函数调用语句

scanf("%d",&pricePerkg);

printf("%d",price);顺序结构(Sequence

Structure)ABC第13页/共71页计算两整数的最大值

num1num2max????InputProcessOutput第14页/共71页if-elseSingleSelectionDoubleSelectionMultipleSelectionIfif-else-if选择结构(分支结构)

(SelectionStructure)第15页/共71页关系运算符与关系表达式RelationalOperationDescriptionExamplesofExpressionValue<Lessthan6<91(true)<=Lessthanorequalto5<=51(true)>Greaterthan2>60(false)>=Greaterthanorequalto9>=51(true)==Equalto7==50(false)!=Notequalto6!=51(true)第16页/共71页用于单分支控制的条件语句

(SingleSelection)StepaconditionStepmStepnStepxtruefalsestepaconditionstepmstepnstepbtruefalsePseudocodeStructurestepaif<conditionistrue>start stepm stepnend_ifstepb第17页/共71页Thestructureissimilartosingleselection(flowchart)ifStatementSyntax:

if

(expression) statement;or

if

(expression){ statement1; statement2; }复合语句compoundstatement被当作一条语句看待表达式非0为真第18页/共71页ifStatementSyntax:

if

(expression) statement;or

if

(expression){ statement1; statement2; }Don’tforgetthebraces

!!Don’tforgettheparentheses

!!第19页/共71页#include<stdio.h>main(){inta,b,max;printf("Inputa,b:");scanf("%d%d",&a,&b);

if(a>b) max=a;if(a<=b) max=b;printf("max=%d\n",max);}Inputa,b:2015max=20_单分支(1):计算两整数的最大值第20页/共71页单分支(2):求绝对值输入1个整数,输出它的绝对值(实现fabs函数)当number<0时,number=-number;当number>=0时,保持不变第21页/共71页源程序-求绝对值#include<stdio.h>intmain(void){intnumber; printf("Enteranumber:");scanf("%d",&number);if(number<0){number=-number;}printf("Theabsolutevalueis%d.\n",number);return0;}Enteranumber:10

Theabsolutevalueis10.Enteranumber:-300

Theabsolutevalueis300.第22页/共71页PseudocodeStructureStepaif<conditionistrue>start Stepm Stepnend_ifelsestart Stepx Stepyend_elseStepzStepaconditionStepmStepnStepztruefalseStepxStepyStepaconditionStepmStepnStepztruefalseStepxStepy用于双分支控制的条件语句(

Double

Selection)第23页/共71页Thestructureissimilartodoubleselection(flowchart)if-else

StatementSyntax:

if

(expression)

statement1;

else

statement2;or

if

(expression)

{ statement1; statement2;}

else

{ statement3; statement4;}第24页/共71页NoYesFlowchart:CalculatetheMaximumInputaandbOutputmaxa>b?maxbmaxaStartEnd计算两整数的最大值第25页/共71页scanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;TurnFlowcharttoCProgramNoYesInputaandbOutputmaxa>b?maxbmaxaStartEnd计算两整数的最大值printf("max=%d\n",max);第26页/共71页#include<stdio.h>main(){inta,b,max;

printf("Inputa,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;双分支(1):计算两整数的最大值第27页/共71页#include<stdio.h>main(){inta,b,max;

printf("Inputa,b:");scanf("%d,%d",&a,&b);

if(a>b) max=a;

else max=b;printf("max=%d",max);}}

max=a>b?a:b;表达式1?表达式2:表达式3条件运算符和条件表达式第28页/共71页双分支(2):判断数字的奇偶性例3-7输入1个整数,判断该数是奇数还是偶数number%2==0读入一个整数if(该数能被2整除)

则该数为偶数else

该数为奇数第29页/共71页源程序-判断数字的奇偶性#include<stdio.h>intmain(void){intnumber;printf("Enteranumber:");scanf("%d",&number);if(number%2==0){printf("Tnenumberiseven.\n");}else{printf("Tnenumberisodd.\n");}return0;}Enteranumber:329

Tnenumberisodd.Enteranumber:1028Tnenumberiseven.第30页/共71页用于多分支控制的条件语句(1)

(MultipleSelection)Multi-wayifStepaif

(expression1){ Stepm}if

(expression2)

{ Stepn}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepaexpression1StepmStepnStepztruefalseexpression2truefalse第31页/共71页用于多分支控制的条件语句(2)

(MultipleSelection)CascadedifStepaif

(expression1){ Stepm}elseif

(expression2){ Stepn}

else{ Stepx}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepxStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepx第32页/共71页If-else-if示例:分段计算水费第33页/共71页源程序-分段计算水费#include<stdio.h>intmain(void){doublex,y;printf("Enterx:");scanf("%lf",&x);if(x<0){y=0;}elseif(x<=15){y=4*x/3;}else{y=2.5*x-10.5;}printf("f(%.2f)=%.2f\n",x,y);return0;}Enterx:-0.5f(-0.50)=0.00Enterx:9.5f(9.50)=12.67Enterx:21.3f(21.30)=42.75第34页/共71页嵌套的if–else语句if(表达式1)if(表达式2)

语句1else

语句2elseif(表达式3)

语句3else

语句4用于多分支控制的条件语句(3)

(MultipleSelection)第35页/共71页嵌套的if-else结构示例:设计程序,从键盘任意输入三个整数,编程输出三者之中的最小数。If(a<=b){if(c<=a)min=c;elsemin=a;}else{if(c<=b)min=c;elsemin=b;}temp=a<b?a:b;min=temp<c?temp:c;第36页/共71页用于多路选择的switch语句

Thestructureissimilartomultipleselection(flowchart)switch(expression){

case

value1:

statement1; break;

case

value2:

statement2; break;

……

default

:

statementX; break;}Don’tforgetthebraces!!Don’tforgettheblank!!

第37页/共71页ImportantRule!switch(expression){

case

value1:

statement1; break;

case

value2:

statement2; break;

……

default

:

statementX; break;}Mustbeintorchar!用于多路选择的switch语句

注意!第38页/共71页Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");Assumemonth=1,so……thisstepwillbeexecuted.Later……caseisterminatedhere.Jumpto…January_JanuaryEnd_用于多路选择的switch语句

第39页/共71页Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");…thisstepwillbeexecuted.Later…March_MarchEnd_Assumemonth=3,so……caseisterminatedhere.Jumpto…用于多路选择的switch语句

第40页/共71页Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break;}printf("End");Now…whatwillhappenifthisbreakistakenoutfromtheprogram?用于多路选择的switch语句

第41页/共71页Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n");

case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");Nomore!用于多路选择的switch语句

第42页/共71页Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n");

case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");…thisstepwillbeexecuted.Later…February_March_Assumemonth=2,so……caseisterminatedhere.Jumpto…End_…executioncontinues.Thus,thisstepisexecuted.So…用于多路选择的switch语句

第43页/共71页Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n");

case3: printf("March\n"); break; default: printf("Others\n"); break;} printf("End");Now…whatwillhappenifthesebreaksaretakenoutfromtheprogram?And…ifmonth=1?And…ifmonth=34?用于多路选择的switch语句

最好不省略!第44页/共71页假设自动售货机出售4种商品,薯片(crisps)、爆米花(popcorn)、巧克力(chocolate)和可乐(cola),售价分别是每份3.0、2.5、4.0和3.5元。在屏幕上显示以下菜单,用户可以查询一个商品的价格,菜单样式:[1]Selectcrisps[2]Selectpopcorn

[3]Selectchocolate[4]Selectcola

[0]Exit示例:自动售货机第45页/共71页#include<stdio.h>intmain(void){intchoice,i;doubleprice;printf("[1]Selectcrisps\n");

printf("[2]Selectpopcorn\n");

printf("[3]Selectchocolate\n");

printf("[4]Selectcola\n");

printf("[0]exit\n");

printf("Enterchoice:");

scanf("%d",&choice);

switch(choice){case1:price=3.0;break;

case2:price=2.5;break;case3:price=4.0;break;case4:price=3.5;break;default:price=0.0;break;}printf("price=%0.1f\n",price);printf("Thanks\n");}[1]Selectcrisps[2]Selectpopcorn

[3]Selectchocolate[4]Selectcola

[0]ExitEnterchoice:1price=3.0Thanks[1]Selectcrisps[2]Selectpopcorn

[3]Selectchocolate[4]Selectcola

[0]ExitEnterchoice:7price=0.0Thanks第46页/共71页编程设计一个简单的计算器程序,要求用户从键盘输入如下形式的表达式:操作数1运算符op操作数2

然后,计算并输出表达式的值指定的运算符为 加(+) 减(-) 乘(*) 除(/)示例:计算器程序第47页/共71页main(){

intdata1,data2;/*定义两个操作符*/

charop;/*定义运算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*输入运算表达式*/

switch(op) {

case'+':/*处理加法*/ printf("%d+%d=%d\n",data1,data2,data1+data2);

break;

case'-':/*处理减法*/ printf("%d-%d=%d\n",data1,data2,data1-data2);

break;

case'*':/*处理乘法*/ printf("%d*%d=%d\n",data1,data2,data1*data2);

break;

case'/':/*处理除法*/

if(0==data2) printf("Divisionbyzero!\n");

else

printf("%d/%d=%d\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }}第48页/共71页思考题语句if(0==data2)的必要性——避免"除零错误"1998年11月,《科学美国人》杂志描述了美国导弹巡洋舰约克敦号上的一起事故,除零错导致军舰推进系统的关闭为什么不用if(data2==0)?如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符,那么程序如何修改?第49页/共71页main(){

intdata1,data2;

charop; printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*%c前有一个空格*/

switch(op) {

case'+': printf("%d+%d=%d\n",data1,data2,data1+data2);

break;

case'-': printf("%d-%d=%d\n",data1,data2,data1-data2);

break;

case'*': printf("%d*%d=%d\n",data1,data2,data1*data2);

break;

case'/':

if(0==data2) printf("Divisionbyzero!\n");

else

printf("%d/%d=%d\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }}空格第50页/共71页思考题如果要求对浮点数进行运算,那么程序如何修改?修改例5.5程序,使其能进行浮点数的算术运算,同时允许使用字符*、x与X作为乘号,并且允许输入的算术表达式中的操作数和运算符之间可以加入任意多个空格符。第51页/共71页main(){

floatdata1,data2;

charop; printf("Pleaseentertheexpression:"); scanf("%f%c%f",&data1,&op,&data2);

switch(op) {

case'+': printf("%f+%f=%f\n",data1,data2,data1+data2);

break;

case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);

break;

case'*':

case'x': case'X': printf("%f*%f=%f\n",data1,data2,data1*data2);

break;

case'/':

if(fabs(data2)<=1e-7)/*实数与0比较*/ printf("Divisionbyzero!\n");

else

printf("%f/%f=%f\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }}取绝对值函数第52页/共71页Symbol

Description

&& 与(AND)当且仅当两者都为真,则结果为真|| 或(OR)只要两者中有一个为真,结果就为真! 非(NOT)逻辑运算符和逻辑表达式

(LogicalOperators)aba&&ba||b!a!b000011010110100101111100!&&||高低第53页/共71页逻辑与

&&

逻辑或||逻辑非!(x>1)&&(y>1)(x>1)||(y>1)(x>1)!(x>1)即x<=1

逻辑运算符的含义第54页/共71页3<x<5能表示3到5的区间么?

正确表示方法:(x>3)&&(x<5)Question:第55页/共71页ch是大写英文字母(ch>='A')&&(ch<='Z')判断某一年year是否是闰年的条件是满足下列二者之一能被4整除,但不能被100整除;能被400整除;

year%4==0&&year%100!=0||year%400==0优先级:%

==(!=)

&&

||

((year%4==0)&&(year%100!=0))||(year%400==0)逻辑运算符和逻辑表达式

(LogicalOperators)第56页/共71页Example:(a>=1)&&(b++==5)

(0>=1)&&(b++==5)

0&&(b++==5)

0a0b5短路特性:尽量使用最少的操作数来确定表达式的值,这就意味着表达式中的某些操作数可能不会被计算

第57页/共71页题目:若有变量说明“inta=0,b=1,c=2;”

执行语句“if(a>0&&++b>0)

c++;elsec--;”后

变量a、b、c的值分别是

。第58页/共71页题目:设有变量说明“inta=12,b=15,c;”,则对表达式c=(a||(b-=a))求值后,变量b和c的值分别为

A)3,1

B)15,12

C)15,1

D)3,12第59页/共71页if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){letter++;}elseif(ch>='0'&&ch<='9'){

digit++;}else

{other++;}实现多路选择判断输入字符的类型:第60页/共71页测试的主要方式给定特定的输入,运行被测软件检查软件的输出是否与预期结果一致测试用例的选取方法尽量覆盖所有分支,减少重复覆盖测试的目的通过运行测试用例找出软件中的Bug成功的测试在于发现迄今为止尚未发现的Bug测试人员的主要任务是站在使用者的角度,通过不断使用和攻击,尽可能多地找出Bug测试的过程就像黑客的攻击过程,专门找软件漏洞本章扩充内容第61页/共71页采用测试用例,通过运行程序查找程序错误的方法实质是一种抽样检查,彻底的测试是不可能的彻底的测试不现实,要考虑时间、费用等限制,不允许无休止的测试测试只能证明程序有错,不能证明程序无错——E.W.Dijkstra测试能提高软件质量,但提高软件质量不能依赖于测试本章扩充内容第62页/共71页白盒测试(结构测试)在完全了解程序的结构和处理过程的情况下,按照程序内部的逻辑测试程序,检验程序中的每条逻辑路径是否都能按预定要求正确工作主要用于测试的早期黑盒测试(功能测试)把系统看成一个黑盒子,不考虑程序内部的逻辑结构和处理过程,只根据需求规格说明书的要求,设计测试用例,检查程序的功能是否符合它的功能说明主要用于测试的后期软件测试方法的分类通常结合使用选择有限数量的重要路径进行白盒测试,对重要的功能需求进行黑盒测试第63页/共71页#include<stdio.h>#include<math.h>main(){

floata,b,c;

printf("Inputthethreeedgelength:"); scanf("%f,%f,%f",&a,&b,&c);

if(a+b>c&&b+c>a&&a+c>b) /*三角形的基本条件*/ {

if(a==b||b==c||c==a) printf("等腰三角形");

else

if(a*a+b*b==c*c||a*a+c*c=

温馨提示

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

最新文档

评论

0/150

提交评论