1、2本章学习内容3算法(Algorithm)的概念 4算法的特性 5算法的分类 6算法的表示方法7描述算法和实现算法8流程图(Flowchart)Start/EndProcessInput/OutputTestConnectorFlow of activities9问题求解步骤(Problem Solving Process)10Example 1:买苹果,计算价钱 11 12main()scanf(%d,&quantity);scanf(%d,&pricePerkg);price=quantity*pricePerkg;printf(%d,price);13main()int quantity
2、,price_per_kg,price;scanf(%d,&quantity);scanf(%d,&pricePerkg);price=quantity*pricePerkg;printf(%d,price);14main()int quantity,price_per_kg,price;scanf(%d,&quantity);scanf(%d,&pricePerkg);price=quantity*pricePerkg;printf(%d,price);15伪码(Pseudocode)16顺序结构ABab17顺序(Sequence)结构的NS图price=quantity*pricePerk
3、g;scanf(%d,&pricePerkg);printf(%d,price);NS图18计算两个数中的最小者计算两个数中的最小者.19选择结构ABabpYN当当p为为“真真”当当p为为“假假”20ABNYNS图图传统流程图传统流程图21 22 23main()int num1,num2,min;scanf(%d%d,&num1,&num2);if (num1 num2)min=num1;else min=num2;printf(%d,min);2425step aif startstep mstep nend_ifstep b26if StatementSyntax:复合语句复合语句com
4、pound statement被当作一条语句看待被当作一条语句看待27if StatementSyntax:28if StatementSingle Selection Pseudocode:if startstep 1step 2step kend_if Statement:if (expression)statement 1statement 2statement k29if Statement main()int num1,num2,min;printf(“Input 2 numbers:“);scanf(“%d%d”,&num1,&num2);min=num1;if(num1 num2
5、)min=num2;printf(“Smallest:%dn”,min);Input 2 numbers:_num2?num1?min?Input 2 numbers:20 15_20152015Input 2 numbers:20 15Smallest:15_30Example:main()int mark;scanf(“%d”,&mark);if(mark=60)printf(“Passn”);printf(“Your mark is%d”,mark);31Example:main()int mark;scanf(“%d”,&mark);if(mark=60)printf(“Passn”)
6、;printf(“Your mark is%d”,mark);32双分支选择结构(Double Selection)Step aif startStep mStep nend_ifelse startStep xStep yend_elseStep z33if-else StatementSyntax:oror34if-else StatementDouble Selection Pseudocode:if startstep 1step kend_ifelse startstep 1step nend_else Statement:if (expression)statement 1stat
7、ement kelse statement 1statement n35if-else Statement Example:if(num1 num2)min=num1;elsemin=num2;printf(“Smallest:%dn”,min);num215num1min?_10Smallest:10_36if-else Statement Example:if(num1 num2)min=num1;elsemin=num2;printf(“Smallest:%dn”,min);num215num1min?_15Smallest:15_37if-else Statement if(num1
8、num2)min=num1;max=num2;else min=num2;max=num1;printf(“Min=%d,Max=%dn”,min,max);num2125num1700min?_max?Min=125,Max=700_12570038【例例】:求一个整数的绝对值:求一个整数的绝对值mainmain()()int aint a,absaabsa;printfprintf(“enter one number:enter one number:”););scanfscanf(“%d%d”,&a,&a););absa=aabsa=a;ifif(a0a0)absa=-aabsa=-a;
9、printfprintf(“|%d|=%d|%d|=%d”,a,absa,a,absa););39看作是一条单独的语句,而不看作是一条单独的语句,而不把它作为把它作为if语句的一部分语句的一部分然后会认为然后会认为else没有所属的没有所属的if40条件表达式 表达式表达式3N表达式表达式2Y表达式表达式1 141条件运算符if(num1 num2)min=num1;elsemin=num2;printf(“Smallest:%dn”,min);min=num1 num2 num1 num2;printf(“Smallest:%dn”,min);4243step aif(expression)
10、step mstep nstep b44step aif startstep mstep nend_ifstep bstep aif(expression)step mstep nelse step xstep ystep bGuesshow does multiple selection look like?45多分支选择结构(Multiple Selection)Step a(expression1)Step m (expression2)Step n Step z46多分支选择结构(Multiple Selection)Step a(expression1)Step m (express
11、ion2)Step n Step x Step z47else-if表达式1 语句1 语句2 语句3 语句4表达式2表达式3 图4-9 多分支选择结构48例:体型判断49例 用不带else子句的if语句编程50例 用在if子句中嵌入if 语句的形式编程 51例 用在else子句中嵌入if语句的形式编程 52if语句的嵌套53if语句的嵌套if(expr1)if(expr2)语句语句1 else 语句语句2else if(expr3)语句语句3 else 语句语句4内嵌内嵌if内嵌内嵌if当内嵌当内嵌ifif语句不包语句不包含含elseelse语句时,容语句时,容易出错。易出错。if(expr1
12、)if(expr2)语句语句1 else if(expr3)语句语句3 else 语句语句4内嵌内嵌if若若if与与else数目不一样时,为数目不一样时,为实现程序设计者本来的意图实现程序设计者本来的意图,可以加花括号来确定匹配,可以加花括号来确定匹配关系关系54例:例:if(a=b)if(b=c)printf(“a=b=c”);else printf(“a!=b”);修改:修改:if(a=b)if(b=c)printf(“a=b=c”);else printf(“a!=b”);实现实现if else 正确配对方法:加正确配对方法:加 55Ifelse配对规则可能产生的“副作用”)0(1)0(
13、0)0(1xxxy当当当问题问题:有如下符号函数,要求输入不同的:有如下符号函数,要求输入不同的x的值的值能输出正确的符号数。能输出正确的符号数。算法思路算法思路1:先可以用简单的:先可以用简单的if语句实现,用语句实现,用三个三个if 语句就可以。语句就可以。算法思路算法思路2:要求用简单的:要求用简单的ifelse语句实现语句实现,参阅以下几个程序,请分析他的正确性,如,参阅以下几个程序,请分析他的正确性,如果结果有错,请分析出错原因。果结果有错,请分析出错原因。56程序程序1:程序程序2:if(x=0)if(x0)y=1;else if(x=0)y=0;else y=0;else y=1
14、;else y=-1;程序程序3:输入:输入x=0验证验证 程序程序4:输入:输入x=-5验证验证 y=-1;y=0;if(x!=0)/*不满足不满足*/if(x=0)/*不满足不满足*/if(x0)y=1;if(x0)y=1;else y=0;else y=-1;5758条件语句举例条件语句举例-159条件语句举例条件语句举例-16061例:读入一个整数,判断其能否被3整除。62例:输入三角形的三个边长,求出三角形的面积。63if 语句的说明1.表达式既可以是关系表达式、逻辑表达式,也 可以是数值类型表达式。当为0时,为假值;非0为真值。2.关系运算符=不能写成赋值运算符=。3.在if 语句
15、和else语句中若有多个操作语句,则应用花括号 和 将它们括起成为一个复合语句。4.注意:一般情况下这样使用 if 是错误的:if(表达式);语句序列;64输入星期中的某一天,显示对应的英文#includemain()int i;printf(“Input 1-7:”);scanf(“%d”,&i);if (i=1)printf(“Today is Monday!n”);else if(i=2)printf(“Today is Tuesday!n”);else if(i=3)printf(“Today is Wednesday!n”);else if(i=4)printf(“Today is
16、Thursday!n”);else if(i=5)printf(“Today is Friday!n”);else if(i=6)printf(“Today is Saturday!n”);else printf(“Today is Sunday!n”);此例似显此例似显复杂,是否复杂,是否有更好的办法有更好的办法?65有了if 语句,为什么还要switch语句?66The structure is similar to multiple selection(flowchart)67Important Rule!68流程图:流程图:表达式表达式e e?语句序列语句序列S1S1;breakbre
17、ak;语句序列语句序列S2S2;breakbreak;语句序列语句序列S3S3;breakbreak;语句序列语句序列S S;a1 a1 default default a3 a3 a2 a2 case case69Example:switch(month)case 1:printf(“Januaryn”);break;case 2:printf(“Februaryn”);break;case 3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);January_JanuaryEnd _70Example:
18、switch(month)case 1:printf(“Januaryn”);break;case 2:printf(“Februaryn”);break;case 3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);March_MarchEnd _71Example:switch(month)case 1:printf(“Januaryn”);break;case 2:printf(“Februaryn”);break;case 3:printf(“Marchn”);break;default:prin
19、tf(“Othersn”);break;printf(“End”);72Example:switch(month)case 1:printf(“Januaryn”);break;case 2:printf(“Februaryn”);case 3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);73Example:switch(month)case 1:printf(“Januaryn”);break;case 2:printf(“Februaryn”);case 3:printf(“Marchn”);br
20、eak;default:printf(“Othersn”);break;printf(“End”);February_ March _ End _74Example:switch(month)case 1:printf(“Januaryn”);break;case 2:printf(“Februaryn”);case 3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);最好不省略最好不省略75特殊情况下,如果特殊情况下,如果switchswitch表达式的多个值都需要执行相同的语句表达式的多个值都需要执行
21、相同的语句可以采用下面的格式:可以采用下面的格式:switch switch(i i)case 1:case 1:case 2:case 2:case 3:case 3:语句语句1;break;1;break;case 4:case 4:语句语句2;break;2;break;case 5:case 5:case 6:case 6:语句语句3;break;3;break;default:default:语句语句4;4;执行过程:执行过程:当整型变量当整型变量i i的值为的值为1 1、2 2或或3 3时,时,执行语句执行语句1 1;当整型变量当整型变量i i的值为的值为4 4时执行语句时执行语句
22、2 2;当整型变量当整型变量i i的值为的值为5 5、6 6时,执行时,执行语句语句3 3,否则执行语句否则执行语句4 4。【例例】输入月份打印输入月份打印19991999年该月有多少天。年该月有多少天。#include#include main()main()int monthint month;int dayint day;printfprintf(“please input the month number:please input the month number:”););scanfscanf(“%d%d”,&month,&month););76switch switch(month
23、month)case 1:case 1:case 3:case 3:case 5:case 5:case 7:case 7:case 8:case 8:case 10:case 10:case 12:day=31;break:case 12:day=31;break:case 4:case 4:case 6:case 6:case 9:case 9:case 11:day=30;break;case 11:day=30;break;case 2:day=28;break;case 2:day=28;break;default:day=-1:default:day=-1:if if(day=-1
24、day=-1)printfprintf(“invalid month input!ninvalid month input!n”);else printf else printf(“1999.%d has%d daysn1999.%d has%d daysn”,month,day,month,day););77例例5-16 main()int x=1,y=0,a=0,b=0;switch(x)case 1:switch(y)case 0:a+;break;case 1:b+;break;case 2:a+;b+;break;case 3:a+;b+;printf(“na=%d,b=%d”,a,
25、b);运行结果:运行结果:a=2,b=178(1 1)e e必须是()括起来,而且不能为空。必须是()括起来,而且不能为空。switchswitch()非法。()非法。(2 2)每个)每个casecase和和defaultdefault后可以有多个语句(是一个程序段)组成,后可以有多个语句(是一个程序段)组成,并且可以包括条件分支语句和循环语句,且不需要使用括并且可以包括条件分支语句和循环语句,且不需要使用括 起来(复合语句形式)。起来(复合语句形式)。(3 3)标号后的)标号后的“:”不能省略不能省略 ,语句后的,语句后的“;”分号也不能省略。分号也不能省略。(4 4)由于在执行一个)由于在
26、执行一个casecase语句之后,控制将自动转移到语句序列后语句之后,控制将自动转移到语句序列后 的下一个语句,因此在一个的下一个语句,因此在一个casecase结束后,下一个结束后,下一个casecase开始之前,开始之前,采用一个采用一个breakbreak语句或语句或returnreturn语句退出语句退出switchswitch语句是必要的。语句是必要的。79 switch语句与语句与if语句不同,语句不同,switch语句只能对等式进行测试,而语句只能对等式进行测试,而if 语句可以计算关系表达式或逻辑表达式等。语句可以计算关系表达式或逻辑表达式等。如果有两条以上基于同一个变量的条件
27、表达式,那么最好使用如果有两条以上基于同一个变量的条件表达式,那么最好使用switch语句语句。例如:与其使用下述的。例如:与其使用下述的if语句格式:语句格式:if if(x=1x=1)printfprintf(”x is equal to one.nx is equal to one.n”);elseif elseif(x=2x=2)printfprintf(”x is equal to two.nx is equal to two.n”);elseif elseif(x=3x=3)printfprintf(”x is equal to three.nx is equal to three
28、.n”);else else printf printf(”x is not equal to one,two,three.nx is not equal to one,two,three.n”);80不如使用如下不如使用如下switchswitch代码,它更易于阅读和维护:代码,它更易于阅读和维护:switchswitch(x x)case 1 case 1:printfprintf(”x is equal to one.nx is equal to one.n”);break break;case 2case 2:printfprintf(”x is equal to two.nx is
29、equal to two.n”);break break;case 3case 3:printfprintf(”x is equal to three.nx is equal to three.n”);break break;defaultdefault:printfprintf(”x is not equal to one,two,three.nx is not equal to one,two,three.n”);使用使用switch语句的前提条件是条件表达式必须语句的前提条件是条件表达式必须是基于同一个变量。是基于同一个变量。81switch和else-if的比较82【例例5-165-1
30、6】:阅读下面程序:计算结果。:阅读下面程序:计算结果。#include#include main main()()int a=2int a=2,b=7b=7,c=5c=5;switchswitch(a0a0)case 1case 1:switchswitch(b0b0)case 0case 0:printfprintf(“”);break;break;case 1case 1:printfprintf(“!”););breakbreak;case 2case 2:switchswitch(c=5c=5)case 0case 0:printfprintf(“*”););break;break;
31、case 1 case 1:printfprintf(“#”););break;break;default default:printfprintf(“$”);break;break;defaultdefault:printfprintf(“&”);printfprintf(“nn”);执行结果:执行结果:#&在嵌入在嵌入switch语句语句中,外层的中,外层的switch与内层的与内层的 switch中中的的 case语句中常量语句中常量允许相同,此时不允许相同,此时不会发生冲突。不同会发生冲突。不同的的 break 也只使程也只使程序中断本层的序中断本层的 switch,不会发生,不会发生混乱。混乱。83例4.7:计算器程序84例4.785空空格格86作业