1、3.1基本概念和表示方法基本概念和表示方法3.2 关系运算符与关系表达式关系运算符与关系表达式3.3 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式3.4 用用if语句实现选择结构语句实现选择结构3.5 用用switch语句实现选择结构语句实现选择结构3.6 选择结构程序设计综合举例选择结构程序设计综合举例n程序是对数据进行加工处理以得到期望的结果程序是对数据进行加工处理以得到期望的结果.包括两个方面包括两个方面:(1)对数据的描述对数据的描述。程序中要指定数据的类型和组。程序中要指定数据的类型和组织形式,这就是织形式,这就是数据结构数据结构(data structure)。(2)对操作的描述对
2、操作的描述。描述计算机进行操作的步骤。描述计算机进行操作的步骤。这就是这就是算法算法(algorithm)n 程序、数据结构和算法三者之间的关系如下:程序、数据结构和算法三者之间的关系如下:程序程序=数据结构数据结构+算法算法3.1 算法的基本概念和表示方法算法的基本概念和表示方法3.1.1 算法的基本概念算法的基本概念3.1.2 算法的表示算法的表示3.1.2 结构化程序设计结构化程序设计3.1算法的基本概念和表示方法算法的基本概念和表示方法n算法是对一个问题求解步骤的描述算法是对一个问题求解步骤的描述n求解问题的方法,求解问题的方法,n指令的有限序列。指令的有限序列。n每条指令表示一个或多
3、个操作。每条指令表示一个或多个操作。n算法的特征:算法的特征:1.有穷性有穷性:一一个算法(对任何合法的输入)在执行有穷个步骤个算法(对任何合法的输入)在执行有穷个步骤后能够结束,并且在有限时间内完成。后能够结束,并且在有限时间内完成。2.确定性确定性:算法中的每一步都有确切的含义算法中的每一步都有确切的含义 3.可行性可行性:算法中的操作能够用已经实现的基本运算执行有限次算法中的操作能够用已经实现的基本运算执行有限次来实现。来实现。4.输入输出信息输入输出信息:一个算法可一个算法可n个输入数据要加工处理,也可能个输入数据要加工处理,也可能m个输出信息。个输出信息。3.1.1 算法的基本概念算
4、法的基本概念3.1.2算法的表示算法的表示n表示算法的方法:表示算法的方法:n自然语言表示法自然语言表示法n伪代码表示法伪代码表示法n流程图表示法流程图表示法 1.伪代码(伪代码(Pseudocode)表示法)表示法一种非正式的语言。一种非正式的语言。介于自然语言和程序代码之间的中间语言介于自然语言和程序代码之间的中间语言来表示算法。来表示算法。伪代码描述的算法,表达了程序设计者的伪代码描述的算法,表达了程序设计者的思路,能很容易地被转换成程序代码思路,能很容易地被转换成程序代码 伪代码不是程序代码,并不能被计算机识伪代码不是程序代码,并不能被计算机识别。别。3.1.2算法的表示算法的表示1.
5、伪代码(伪代码(Pseudocode)表示法)表示法 3.1.2算法的表示算法的表示例例3-1 求两个数的较大者。求两个数的较大者。解决这个问题用到解决这个问题用到选择控制结构选择控制结构:判断条件的真假做决策。判断条件的真假做决策。该算法的伪代码描述如下:该算法的伪代码描述如下:输入输入x,y;If xy Then max=yElse max=xEnd if输出输出 max1.伪代码(伪代码(Pseudocode)表示法)表示法 3.1.2算法的表示算法的表示例例3-2 要统计出输入的要统计出输入的100个数之和。个数之和。解决这个问题要用解决这个问题要用循环控制结构循环控制结构:要求要求1
6、00个数之和,就必须重复地进行累加,个数之和,就必须重复地进行累加,该算法的伪代码描述如下:该算法的伪代码描述如下:sum=0conut=0输入一个数给xsum=sum+xcount=count+1输出 sum重复100 次,重复的条件:count B true A=B true,A b:%dn,ab);printf(a=b:%dn,a=b);printf(a=b:%dn,a=b);printf(a!=b:%dn,a!=b);printf(ab:%dn,ab);printf(a=b:%dn,a b+2!(a b)x y&a b|!(x a)1 0 n逻辑运算符优先级次序:逻辑运算符优先级次序:
7、!最高,最高,&其次,其次,|最低。最低。n当表达式中出现算术运算符、关系运算符和当表达式中出现算术运算符、关系运算符和逻辑运算符时,算术运算符优先级最高,其逻辑运算符时,算术运算符优先级最高,其次关系运算符,逻辑运算符级别最低,次关系运算符,逻辑运算符级别最低,n例如,例如,(c70)&(!valid)当当c=60,valid=0时,表达式结果为时,表达式结果为1;当当c=80,valid=1时,表达式结果为时,表达式结果为0。3.3 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式n短路与:短路与:A&B 当当A是是false时,整个表达式的结果为时,整个表达式的结果为false。不。不再计算
8、再计算B的值,的值,n短路或:短路或:A|B 当当A是是true时,整个表达式的结果为时,整个表达式的结果为true。不。不再计算再计算B的值。的值。例如:例如:int x,y;x=1;x!=1&y 表达式结果为表达式结果为0,尽管尽管y没有值。没有值。3.3 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式例如,例如,12a 12&a 12)&(a 20)。例如例如 a1或者或者a10逻辑表达式表示为:逻辑表达式表示为:a=10或者或者 (a=10)。例如,判断三个边例如,判断三个边a,b,c是否构成三角形,逻辑表是否构成三角形,逻辑表达式表示为:达式表示为:a+bc&a+cb&b+ca3.3
9、逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式例如,例如,int x;x=0 等价于等价于 !x x!=0 等价于等价于 x3.3 逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式例例3-4 逻辑运算符的应用。逻辑运算符的应用。void main()int a=1,b=0;printf(a=1,b=0 n逻辑运算结果逻辑运算结果n);printf(!a:%dn,!a);printf(!b:%dn,!b);printf(a&b:%dn,a&b);printf(a|b:%dn,a|b);printf(b=0:%dn,b=0);printf(!b:%dn,!b);printf(a!=0:%dn,a!=0)
10、;printf(a:%dn,a);3.4 用用if语句实现选择结构语句实现选择结构3.4.1 实现单分支的实现单分支的if语句语句3.4.2 实现双分支的实现双分支的if语句语句3.4.3 实现多分支的实现多分支的if语句嵌套语句嵌套n if语句语句:使程序根据相应的条件去使程序根据相应的条件去执行对应的语句。执行对应的语句。3.4.1 实现单分支的实现单分支的if语句语句n实现单分支的实现单分支的if语句一般形式:语句一般形式:if(布尔表达式布尔表达式)语句;语句;例如例如 求某数求某数X的绝对值的绝对值.if(x y)z=x;else z=y;语句1和语句2可为单个语句或复合语句。例例3
11、-5 输入一个年份,判断是否闰年输入一个年份,判断是否闰年n解题思路:解题思路:判断闰年判断闰年year条件是:年份能被条件是:年份能被4整除而不能被整除而不能被100整除,或者被整除,或者被400整除。整除。n解题思路:解题思路:输入年份输入年份year,判断是否闰年:判断是否闰年:(year%4=0&year%100!=0)|(year%400=0)输出判断结果。输出判断结果。void main()int year;printf(Enter the year:);scanf(%d,&year);if(year%4=0&year%100!=0)|(year%400=0)printf(%d i
12、s a leap year.n,year);else printf(%d is not a leap year.n,year);Enter the year:20122012 is a leap year.3.4.2 实现双分支的实现双分支的if语句语句3.4.3实现多分支的实现多分支的if语句嵌套语句嵌套nif语句中内嵌的语句语句中内嵌的语句1或语句或语句2又可为又可为if语句,称语句,称为为if 语句的嵌套。语句的嵌套。n嵌套的嵌套的if语句的一般格式:语句的一般格式:if(布尔表达式布尔表达式1)语句语句1else if(布尔表达式布尔表达式2)语句语句2;else if(布尔表达式布尔
13、表达式3)语句语句3;else if(布尔表达式布尔表达式m)语句语句m;else 语句语句m+1;表示可选例如,根据的例如,根据的x 值,求出值,求出y 值:值:-1 (x0)if(x0)y=-1;else if(x=0)y=0;else y=-1;if(x0)y=-1;else if(x=0)y=0;else y=-1;if(xb)if(ac)max=a;else max=c;else if(bc)max=b;else max=c;void main()int a,b,c,max;printf(Enter the a,b,c:);scanf(%d%d%d,&a,&b,&c);if(ab)i
14、f(ac)max=a;else max=c;else if(bc)max=b;else max=c;3.4.4条件运算符与条件表达式条件运算符与条件表达式n条件表达式的形式:条件表达式的形式:e1?e2:e3ne1是逻辑表达式。是逻辑表达式。ne2和和e3类型要一致。类型要一致。例如:例如:int x=4,y=8,z=2;int k=x 0?x:-x;/y为为x的绝对值的绝对值 int max=a b?a:b;/max取取a,b中的大值中的大值 printf(ab?ab“:a=b);/根据条件表达式的值,打印不同的字符串根据条件表达式的值,打印不同的字符串3.4.4条件运算符与条件表达式条件运
15、算符与条件表达式nswitch语句的作用是根据表达式的值,使流程语句的作用是根据表达式的值,使流程跳转到不同的语句跳转到不同的语句nswitch语句的一般形式语句的一般形式:switch(表达式)(表达式)case 常量常量1:语句:语句1 case 常量常量2:语句:语句2 case 常量常量n:语句:语句n default :语句语句n+13.5 用用switch语句实现选择结构语句实现选择结构整型整型(或或字符字符型型)nswitch语句的一般形式语句的一般形式:switch(表达式)(表达式)case 常量常量1:语句:语句1 case 常量常量2:语句:语句2 case 常量常量n:
16、语句:语句n default :语句语句n+1不能相同不能相同3.5 用用switch语句实现选择结构语句实现选择结构Char Mygrade;Mygrade=getchar();switch(MyGrade)case A:printf(5);break;case B:printf(4);break;case C:printf(3);break;case D:printf(2);break;default:printf(0);break;例如:将成绩例如:将成绩A、B、C、D、E转换成转换成5分制分制3.5 用用switch语句实现选择结构语句实现选择结构执行执行break语语句,将跳出句,将
17、跳出switch块块输出结果:输出结果:(a)MyGrade=A,输出,输出“5”。(b)MyGrade=B,输出,输出“4”.(c)MyGrade=C,输出输出“3”.(d)MyGrade=D,输出输出“2”.(d)MyGrade不为不为AB之间的字之间的字符,输出符,输出“0”。Char Mygrade;Mygrade=getchar();switch(MyGrade)case A:printf(5);case B:printf(4);case C:printf(3);case D:printf(2);default:printf(0);例如:将成绩例如:将成绩A、B、C、D、E转换成转换
18、成5分制分制3.5 用用switch语句实现选择结构语句实现选择结构 分出输出结果:分出输出结果:(a)MyGrade=A,输出,输出“54320”。(b)MyGrade=B,输出,输出“4320”.(c)MyGrade=C,输出为输出为“320”.(d)MyGrade不为不为AB之间的之间的字符,输出字符,输出“0”。switch语句每一个语句每一个case判断,只指明流程分支的入口点,而不是指定分判断,只指明流程分支的入口点,而不是指定分支的出口点,分支的出口点需要用相应的跳转语句支的出口点,分支的出口点需要用相应的跳转语句break来标明。来标明。Char Mygrade;Mygrade
19、=getchar();switch(MyGrade)case A:case B:case C:case D:printf(passed);break;default:printf(“failed);在一些特殊的情况下,多个不同的在一些特殊的情况下,多个不同的case值要值要执行一组相同的操作。执行一组相同的操作。3.5 用用switch语句实现选择结构语句实现选择结构带有带有break的的switch语句的流程图语句的流程图例例3-7 输入一个输入一个0100的整数,实现学生的整数,实现学生成绩的百分制到等级制的转换。成绩的百分制到等级制的转换。void main()char grade;in
20、t score;printf(Enter the score:);scanf(%d,&score);switch(score/10)/两个整型数相除的结果还是整型两个整型数相除的结果还是整型 case 10:/判断值为判断值为10和和9时的操作是相同的时的操作是相同的 case 9:grade=A;break;case 8:grade=B;break;case 7:grade=C;break;case 6:grade=D;break;default:grade=F;printf(grade is%cn,grade);Enter the score:80grade is B3.6 选择结构程序设
21、计综合举例选择结构程序设计综合举例例例3-8 求一元二次方程求一元二次方程ax2+bx+c=0的解。的解。n解题思路:解题思路:输入三个浮点数送入输入三个浮点数送入double型变量型变量 a,b,c。令令t=b2-4ac,有几种情形:有几种情形:当当a=0,不是一元二次方程。不是一元二次方程。判断浮点型判断浮点型a等于等于0,不能用,不能用a=0,用,用|a|10-6。当当t=0,有两相等的实根。有两相等的实根。判断浮点型判断浮点型t等于等于0,用,用|t|0,输出两个实根。,输出两个实根。当当t 0,有两个共轭复根。输出以有两个共轭复根。输出以p+qi和和p-qi的形式,的形式,其中:其中
22、:p=-b/2a,q=sqrt(|t|)/2a#includeint main()double a,b,c,t;double x1,x2;double p,q;printf(Input a,b,c?);scanf(%lf,%lf,%lf,&a,&b,&c);if(fabs(a)1e-6)printf(不是一元二次方程不是一元二次方程n);/判断判断a=0 else t=b*b-4*a*c;p=-b/(2*a);if(fabs(t)0)x1=(-b+sqrt(t)/(2.0*a);x2=(-b-sqrt(t)/(2.0*a);printf(x1=%8.4fnx2=%8.4fn,x1,x2);el
23、se /t0p=-b/(2*a);q=sqrt(fabs(t)/(2*a);printf(x1=%8.4f+%8.4f in,p,q);printf(x1=%8.4f-%8.4f in,p,q);例例3-9 房屋公积金贷款计算器的设计。房屋公积金贷款计算器的设计。已知某银行已知某银行2011年房屋公积金的贷款年利率如下:年房屋公积金的贷款年利率如下:4.45(五年及五年以下五年及五年以下),4.90(五年以上五年以上)。设个人购。设个人购房抵押贷款的还款方式是房抵押贷款的还款方式是等额本息还款法等额本息还款法:即从使用:即从使用贷款的第二个月起,每月以相等的额度平均偿还贷款贷款的第二个月起,每
24、月以相等的额度平均偿还贷款本金和利息。每月等额还本付息额计算公式如下:本金和利息。每月等额还本付息额计算公式如下:每月还每月还款额款额 其中:其中:P:贷款本金贷款本金,R:月利率(月利率月利率(月利率=年利率年利率/12),N:还款期数(还款期数还款期数(还款期数=贷款年限贷款年限12)。)。要求用户输入贷款本金(万元)和年限后,计算出每月要求用户输入贷款本金(万元)和年限后,计算出每月还款额、利息合计和还款总额。还款额、利息合计和还款总额。#define R1 4.45#define R1 4.45#define R2 4.9#define R2 4.9#include#include v
25、oid main()void main()double p;int y,n;double p;int y,n;double r double r,m m printf(printf(输入贷款数额输入贷款数额(万元)万元):);:);scanf(%lf,&p);scanf(%lf,&p);printf(printf(输入贷款年限输入贷款年限:);:);scanf(%d,&y);scanf(%d,&y);switch(y)switch(y)case 0:case 0:case 1:case 1:case 2:case 2:case 3:case 3:case 4:case 4:case 5:r=(
26、double)R1/12/100;break;case 5:r=(double)R1/12/100;break;/计算月利率计算月利率 default:r=(double)R2/12/100;default:r=(double)R2/12/100;n=y n=y*12;12;p=p p=p*10000;10000;m=p m=p*(r(r*pow(1+r,n)/(pow(1+r,n)-1);pow(1+r,n)/(pow(1+r,n)-1);printf(printf(每月还款数额每月还款数额(元元):%.2fn,m);):%.2fn,m);printf(printf(利息合计利息合计(元元)
27、:%.2f ):%.2f 还款总额还款总额(元元):%.2fn,):%.2fn,m m*n-p,mn-p,m*n);n);本章小结本章小结补充实验:补充实验:1.从键盘输入一行英文单词串,里面可以包含空格,标点符号从键盘输入一行英文单词串,里面可以包含空格,标点符号,、.。要求输出所有单词。要求输出所有单词。例如例如,输入:输入:I am a student,you are a teacher.输出:输出:Iamastudentyouare a teacher补充作业题目:补充作业题目:1.已知已知a=5,b=10,c=-6,判断判断下面逻辑表达式的值下面逻辑表达式的值 true 或或false?(1)ab&ac(2)ac(3)a=c|ba(4)b15&c0(5)10!=15&!(1020)|150);a=b+c