《模块4选择结构程序设计电子课件 C语言程序设计案例教程.pptx》由会员分享,可在线阅读,更多相关《模块4选择结构程序设计电子课件 C语言程序设计案例教程.pptx(79页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计案例教程模块4 选择结构程序设计假设学生成绩表如表4-1所示。任务描述模块4 选择结构程序设计(1)试编写程序,根据终结性考核成绩(score)给出相应考核的水平等级(grade)。(2)试编写程序,找出终结性考核成绩(score)的最高分和最低分。D不及格(60),C及格(6079),B良好(8089),A优秀(90100)。如果要对很多学生的成绩进行以上处理,有什么更好的方法?请预习下一个模块。任务描述任务目标(1)能够用逻辑表达式描述客观条件。(2)能够应用分支结构设计算法。(3)培养软件开发必备的逻辑思维能力。模块4 选择结构程序设计(1)根据终结性考核成绩(score)
2、给出相应考核的水平等级。#include main()float score;char grade;printf(“请输入学生成绩:”);scanf(%f,&score);switch(int)(score/10.0)源代码展示模块4 选择结构程序设计 case 10:case 9:grade=A;break;case 8:grade=B;break;case 7:case 6:grade=C;break;default:gradeh=D;printf(score=%.1f,grade=%cn,score,grade);源代码展示模块4 选择结构程序设计(2)找出终结性考核成绩(score)的
3、最高分和最低分(假设3个学生的成绩,10个学生成绩的编程思路以此类推)。#include main()float s1,s2,s3,min,max;printf(please input s1,s2,s3:);scanf(%f%f%f,&s1,&s2,&s3);min=max=s1;源代码展示模块4 选择结构程序设计if(s2max)max=s2;if(s3max)max=s3;printf(min=%.1f,max=%.1fn,min,max);(1)根据终结性考核成绩给出相应考核的水平等级。模拟运行结果如图4-1所示。源代码展示运行结果模块4 选择结构程序设计(1)根据终结性考核成绩给出相
4、应考核的水平等级。模拟运行结果如图4-1所示。(2)找出终结性考核成绩的最高分和最低分。模拟运行结果如图4-2所示。运行结果模块4 选择结构程序设计程序(1):成绩等级有4种,所以要判断成绩在哪个范围之内,采用多分支语句。由于成绩有规律的等级划分,所以用switch比较方便,注意表达式(int)(score/10.0)的使用。程序(2):从一组数据中找出最大值、最小值,先设置最大值(max)、最小值(min)都为第一个数,这样后面的数据依次与当前的最大值、最小值比较就可以了。最后max、min中存储的就是最大值和最小值。C语言提供了可以进行逻辑判断的若干选择语句,由这些选择语句构成程序中的选择
5、结构,又称为分支结构。选择结构是结构化程序设计的3种基本结构之一,在大多数结构化程序设计问题中都将遇到选择问题,因此熟练运用选择结构进行程序设计是程序员必须具备的能力。本模块将详细介绍如何在C程序中实现选择结构。程序分析4.1 关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种。关系运算就是比较运算,即将两个值进行比较,判断是否符合或满足给定的条件。如果符合或满足给定的条件,则称关系运算的结果为“真”;如果不符合或不满足给定的条件,则称关系运算的结果为“假”。4.1.1 关系运算符C语言提供了6种关系运算符:(大于)、=(大于等于)、=(等于)、!=(不等于)。由两个字符组成的运算符之间
6、不允许有空格,如“=”不能写成“=”。关系运算符的优先次序如下。(1)(大于)、=(大于等于)关系运算符的优先级别相同,=(等于)、!=(不等于)的优先级别也相同。前4种高于后两种。4.1.1 关系运算符(2)关系运算符的优先级低于算术运算符。(3)关系运算符的优先级高于赋值运算符。关系运算符是双目运算符,具有自左至右的结合性。【例4-1】关系运算符优先级的实例。ca+b等价于c(a+b)关系运算符的优先级低于算术运算符。ab=c等价于(ab)=c“”优先级高于“=”。a=bc等价于a=(bc)“c等价于a=(bc)关系运算符的优先级高于赋值运算符。4.1.2 关系表达式用关系运算符将两个表达
7、式(算术、关系、逻辑、赋值表达式等)连接起来所构成的表达式,称为关系表达式。关系表达式的值是一个逻辑值,即真或假。C语言没有逻辑型数据,以1代表真,以0代表假。【例4-2】关系表达式的实例。假如a=3,b=2,c=1,则关系表达式ab的值为真,即表达式的值为1;关系表达式b+cbc的计算过程是:先计算ab,结果为真,值为1;再计算1c,结果为假,值为0,所以abc表达式值为0。描述各种简单条件的应用如下。儿童:age=60。及格:score=60。判断整数n 为偶数:n%2=0。4.2 逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。下面介绍C语言中的逻辑运
8、算符和逻辑表达式。4.2.1 逻辑运算符C语言提供了以下3种逻辑运算符。(1)!:逻辑非,条件为真,运算后为假,条件为假,运算后为真。(2)&:逻辑与,相当于日常生活中的“而且”“并且”,只在两条件同时成立时为真。(3)|:逻辑或,相当于日常生活中的“或”,两个条件只要有一个成立时即为真。其中,&和|是双目运算符,!为单目运算符。4.2.2 逻辑表达式(1)!表达式。(2)表达式1&表达式2。(3)表达式1|表达式2。表4-2为逻辑运算的真值表,其表示当a和b的值为不同组合时,各种逻辑运算的结果值。4.2.2 逻辑表达式在一个逻辑表达式中如果包含多个逻辑运算符,则按照以下的优先顺序进行计算。(
9、1)!(逻辑非)级别最高,&(逻辑与)次之,|(逻辑或)最低。(2)&和|的优先级低于关系运算符,!高于算术运算符。(3)逻辑运算符优先级高于赋值运算符。【例4-3】逻辑运算符优先级的实例。ab&xy等价于(ab)&(xy)。a=b|x=y等价于(a=b)|(x=y)。【例4-4】非0值作为逻辑值参与运算。4.2.2 逻辑表达式非0值作为逻辑值参与运算=真。若a=4,则!a=0(假)。若a=4,b=5,则a&b=1(真),a|b=1(真),!a|b=1(真)。4&0|2=1(真),c&d=1。从上例还可以看出,系统给出的逻辑运算结果不是0就是1,不可能是其他数值;而在逻辑表达式中作为参与逻辑运
10、算的运算对象可以是0(作为假),也可以是任何非0的数值(按真对待)。事实上,逻辑运算符两侧的对象不但可以是0和1或者是0和非0的整数,也可以是任何类型的数据(如字符型、实型、指针型)。4.2.2 逻辑表达式需要注意以下两点。(1)在C程序中,不能出现“连不等式”。在数学知识里,用形如0 x100的不等式表示x的取值范围是正确的,但在C语言中,若写成0 x100则是错误的,在C语言中应表达成0 x&xb)&(n=cd)”的结果和m、n的结果。由于ab为假(0),所以赋值后m=0,赋值表达式m=ab也为0。此时整个表达式的结果为0,不进行表达式n=cd的计算,所以n=1(未改变)。掌握C语言的关系
11、运算符和逻辑运算符后,可以用一个逻辑表达式来表示一个复杂的条件。例如,判断儿童和老人:age=60。例如,要判断某一年year是否是闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除;能被4整除,又能被400整除。上面两个条件可以用一个逻辑表达式来表示,即(year%4=0&year%100!=0)|year%400=04.3 if语句if语句用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。4.3.1 简单if语句简单if语句的语法如下。if(表达式)语句功能是判断表达式是否成立,若成立,则执行语句,不成立执行下一条语句,如图4-3所示。【例4
12、-6】从键盘输入2个不相等的数,存入a和b,判断a和b的大小,操作实现使a的值大于b的值。程序代码如下。#include main()int a,b,t;scanf(%d%d,&a,&b);4.3.1 简单if语句if(a=60)printf(及格);4.3.2 ifelse语句c1=c1+1;else printf(不及格);c2=c2+1;上面的程序代码等价于下面的代码。if(score=60)printf(及格);c1=c1+1;if(score60)printf(不及格);c2=c2+1;4.3.3 嵌套if语句一个if语句又包含一个或多个if语句称为if语句的嵌套。嵌套if语句的语法
13、格式如下。if(表达式)if(表达式)语句1;else语句2;else if(表达式)语句3;else语句4;这种在if语句中又包含if的选择结构,常用于解决比较复杂的选择问题,其中每一条语句都必须经过多个条件共同决定才能执行。嵌套if语句的几点说明如下。4.3.3 嵌套if语句(1)嵌套if 语句使用非常灵活,任何if语句都可以嵌套。(2)被嵌套的if语句本身又可以是一个嵌套的if语句。(3)在多种嵌套的if语句中,else总是与离它最近并且没有配对的if配对。可以用下面两种方法解决匹配问题。(1)利用空语句,使if子句数量与else子句数量相同。if()if()语句1;else;elsei
14、f()语句2;else 语句3;4.3.3 嵌套if语句(2)利用确定配对关系,将没有else子句的if语句用括起来。if()if()语句1;elseif()语句2;else 语句3;【例48】编写程序,输入司机的性别、年龄及婚姻状况,根据要求判断公司是否为其投保。公司根据司机情况为其投保。如果满足以下条件之一,公司为其投保:(1)司机已婚;(2)司机为25岁以上的未婚男性;4.3.3 嵌套if语句(3)司机为22岁以上的未婚女性。以上条件都不满足,公司不投保。程序代码如下。#include main()int age,married/*1-已婚,0-未婚*/;char sex/*m-男,f-
15、女*/;printf(请输入员工性别(m/f)、年龄、婚否(1/0)n);scanf(%c%d%d,&sex,&age,&married);if(married)printf(公司为您投保);4.3.3 嵌套if语句elseif(age=25&sex=m)|(age=22&sex=f)printf(公司为您投保);else printf(公司不为您投保);程序运行结果如下。请输入员工性别(m/f)、年龄、婚否(1/0)m 24 0公司不为您投保在程序中,婚否用数字1/0表示,男女用m/f表示,这是我们对此类数据惯用的表示方法,有利于程序设计。4.3.4 多分支ifelseif语句多分支ifel
16、seif语句实际上也是一种特殊的嵌套if语句,不断在else子句中嵌套if语句可形成多层嵌套。用以下形式表示多分支ifelseif语句,使得读起来既层次分明,又不占太多的篇幅。if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else if(表达式m)语句m;else 语句n;以上嵌套的if语句可以理解为:从上向下逐一对if后的表达式进行检测。当某一个表达式的值为非0时,就执行与此有关子句中的语句,其余部分不4.3.4 多分支ifelseif语句执行,直接越过去。如果所有表达式的值都为0,则执行最后的else子句。【例4-9】编写程序,根据输入的学生成
17、绩给出相应的等级,大于或等于90分以上的等级为A,60分以下的等级为E,其余每10分为一个等级。程序代码如下。#include main()int score;printf(Please input score:);scanf(%d,&score);if(score60)4.3.4 多分支ifelseif语句printf(%d-En,score);else if(score70)printf(%d-Dn,score);else if(score80)printf(%d-Cn,score);else if(scoreb)?a:b;等价于:if(ab)max=a;elsemax=b;【例4-10】
18、输入一个字符,如果是大写字母则转换为小写,否则不转换。程序代码如下。4.4 条件运算符和条件表达式#include main()char ch;scanf(%c,&ch);ch=(ch=A&ch=A&ch=Z)?(ch+32):ch;”可以改写为“ch=isupper(ch)?(ch+32):ch;”,其中,函数isupper是判断字母是否是大写字母,它在头文件“ctype.h”中。4.5 switch语句多分支可以使用嵌套的if语句处理,但如果分支较多,嵌套的if语句层数多,会使程序冗长,降低可读性。switch语句又称为开关语句,专门用来处理多分支选择问题,比复合if语句及嵌套if语句更方
19、便灵活,而且程序可读性也更高。switch语句的语法格式如下。switch(表达式)case 常量1:语句1;break;case 常量2:语句2;break;.case 常量n:语句n;break;4.5 switch语句default:语句n+1;其含义为:先计算表达式的值,判断此值是否与某个常量的值匹配,如果匹配,控制流程转向其后的语句,否则,检查default是否存在,若存在则执行其后相应的语句,否则结束switch语句。switch语句流程图如图45所示。switch语句的说明如下。(1)switch括号后面的表达式,允许为任何类型。一般为整型或字符型等有序类型。(2)当“表达式”的
20、值与某个case后面的常量表达式的值相等时,就执行此case后面的语句。如果表达式的值与所有常量表达式都不匹配,就执行default后面的语句(如果没有default就跳出switch,执行switch语句后面4.5 switch语句的语句)。图4-5switch语句流程图(3)各个常量表达式的值必须互不相同,否则出现矛盾。(4)各个case、default出现的顺序不影响执行结果。(5)执行完一个case后面的语句后,若子句最后没有break,流程控制转移到下一个case中的语句继续执行。此时,“case 常量表达式”只是起到语句标号的作用,并不在此处进行条件判断。在执行一个分支后,可以使用
21、break语句使流程跳出switch结构,即终止switch语句的执行(最后一个分支可以不用break语句)。switch语句中本来不包含break语句,但switch语句不像if语句一样只要满足某一条件就可在执行相应的分支后自动结束选择。在switch语句中,当4.5 switch语句表达式的值与某个常量表达式的值相等时,就执行后面对应的语句,然后不进行判断,继续执行后面所有的case分支语句,因此需要在相应的case分支的最后加上break以帮助结束选择。(6)case后面如果有多条语句,不必用括起来。(7)多个case可以共用一组执行语句(注意break使用的位置)。(8)在关键字cas
22、e和常量表达式之间一定要有空格。【例4-11】使用switch语句完成成绩等级的划分。D不及格(60)、C及格(6079)、B良好(8089)、A优秀(90100)。程序代码如下。#include main()4.5 switch语句float score;char ch;scanf(%f,&score);switch(int)(score/10.0)case 10:case 9:ch=A;break;case 8:ch=B;break;case 7:case 6:ch=C;break;4.5 switch语句default:ch=D;printf(score=%.1f,grade=%cn,s
23、core,ch);程序运行结果如下。78score=78.0,grade=C4.6 技 能 训 练选择结构程序设计是非常重要的程序设计方法。选择结构是大部分程序都涉及的基本结构,在实际应用中被广泛应用。通过本模块的学习,应该了解选择结构程序设计的特点和一般规律,并能够灵活使用if语句和switch语句设计程序。这就需要多做练习,从每个例题中挑出重点语句并熟记,学会正确表达数学问题和实际问题的条件,以便分支处理。【例4-12】编写程序,实现银行根据存入的现金和年限计算利息。(1)存款年限为1年时,月息r为5。(2)存款年限为2年时,月息r为6。(3)存款年限为3年以上时,月息r为6.5。(4)存
24、款年限为5年以上时,月息r为8。(5)存款年限为8年以上时,月息r为10。4.6 技 能 训 练从键盘输入本金与年限,计算最终资金数。假定输入的年份为整数,程序代码如下。#include main()int year;float money,r,t;printf(请输入客户存款金额和存款年限:);scanf(%f%d,&money,&year);switch(year)4.6 技 能 训 练case 1:r=0.005;break;case 2:r=0.006;break;case 3:case 4:r=0.0065;break;case 5:case 6:case 7:r=0.008;bre
25、ak;default:r=0.01;t=money+money*r*12*year;printf(Total=%.2fn,t);4.6 技 能 训 练程序运行结果如下。请输入客户存款金额和存款年限:5000 4Total=6560.00【例4-13】编程实现,根据某人的身高体重判断其是否为肥胖类型。已知身体指数与肥胖程度的关系为:t=w/h2(w单位为kg,h单位为m)其中,t表示身体指数,w表示体重,h表示身高。判定标准如下:当t18时,为低体重;当18t25,为正常体重;当25t27时,为超重;4.6 技 能 训 练当t27时,为肥胖。程序代码如下。#include main()float
26、 t,w,h;printf(请输入顾客的体重和身高n);scanf(%f%f,&w,&h);t=w/(h*h);if(t18)printf(体重偏低n);else if(t25)printf(体重正常n);4.6 技 能 训 练else if(t算术运算符关系运算符&(逻辑与)|(逻辑或)赋值运算符,对于有疑问的,可一律用括号来明确。(2)在C程序中,不能出现“连续不等式”。例如,形如0a0&a10。(3)在逻辑表达式的求解中,并不是所有的运算符都被执行,只有在必须执行下一个逻辑运算才能求出表达式解时,才执行下一个运算符。等级考试重点及真题解析例如,当a=5,b=2时,对于表达式a+|b+,因
27、为a+已经为真,所以这时整个表达式的值已经可以确定为真,不用去计算b+的值,这个时候b的值没有变化。(4)关于实数相等的比较。在计算机中,通常存放在内存中的实数是有误差的,因此不能精确相等,将导致x=y的值总是假。可以通过abs(x-y)=0)等级考试重点及真题解析if(x=0)y=0;else y=1;printf(%dn,y);程序段2:int x=-9,y=-1;if(x=0)if(x=0)y=0;else y=1;printf(%dn,y);程序段1中的else与第二个if配对,输出的y值为-1;程序段2中的else与第一个if配对,输出的y值为1。等级考试重点及真题解析由此可见,用复
28、合语句的方式将不需要配对的if语句用括起来,该if语句就被取消了配对资格。程序段3: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(a=%d,b=%dn,a,b);注意程序中第一个case后没有break语句,程序执行时,x=1,执行内嵌的switch,因为y=0,计算a+,并终止内嵌的switch,回到外层,继续执行“case 2”后面的语句“a+;b+”。所以输出结果为“a=2,b=1”
29、。等级考试重点及真题解析二、真题解析1.以下程序的输出结果是()。2017年4月#include main()int a,b,d=241;a=d/100%9;b=(-1)&(-1);printf(%d,%dn,a,b);A.6,1 B.2,1 C.6,0 D.2,0等级考试重点及真题解析表达式“d/100%9”的值为2,因为两个整数相除取整数部分,运算符“%”是取两个整数的余数;(-1)&(-1)得值为1,因为非0值就是真,即为1。所以答案为B。2.下面程序的输出是()。2017年4月A.0 0 3B.0 1 2 C.1 0 3 D.1 1 2main(int a=-1,b=4,k;k=(a+
30、=0)&(!(b-=0);等级考试重点及真题解析printf(%d%d%dn,k,a,b);因为-1小于零,所以表达式“(a+=0)”的值为1,a的值为0;4不小于零,所以表达式“(!(b-=0)”的值为1,b的值为3;二者进行逻辑与运算,k 的值为1。答案为C。3.若执行下面的程序时从键盘上输入3和4,则输出是()。2016年9月A.14B.16C.18 D.20main()等级考试重点及真题解析int a,b,s;scanf(%d%d,&a,&b);s=a;if(ab)s=b;s=s*s;printf(%dn,s);执行语句“if(a5)printf(%dn,x);elseprintf(%
31、dn,x-);if语句的条件表达式“x+5”,因为5不大于5,所以条件为假,同时x值加1为6;然后执行else 后的输出函数,先输出6,x值减1。答案为B。6.下面程序的输出是()。2016年9月A.-1B.0 C.1D.不确定的值main()等级考试重点及真题解析int x=100,a=10,b=20,ok1=5,ok2=0;if(ab)if(b!=15)if(!ok1)x=1;elseif(ok2)x=10;x=-1;printf(%dn,x);等级考试重点及真题解析根据变量的赋值,嵌套if语句的条件“ab”“b!=15”都为真,条件“!ok1”为假,执行配对的else后面的if语句,但条
32、件“ok2”为假,所以不执行“x=10;”,顺序执行下面的“x=-1;”,所以答案为A。7.若k是int型变量,且有下面的程序段:k=-3;if(k=0)printf(#)else printf(&);上面程序片段的输出结果是()。2016年4月A.#B.&C.#&D.有语法错误,无输出结果等级考试重点及真题解析因为“printf(#)”后面缺少分号,所以答案为D。8.表示关系“x=y=z”的C语言表达式为()。2014年9月A.(x=y)&(y=z)B.(x=y)AND(y=z)C.(x=y=z)D.(x=y)&(y=z)C语言中没有“AND”运算符,“&”是位与运算符,能表示数学关系的逻辑
33、表达式只有A,所以答案为A。9.当c的值不为0时,在下列选项中能正确将c的值赋给变量a、b的是()。2013年9月A.c=b=a;B.(a=c)|(b=c);C.(a=c)&(b=c);D.a=c=b;等级考试重点及真题解析A和D明显错误。因为 c的值不为0,a=c则不为0为真,则“|”后面“b=c”不执行,所以B错误,而C中逻辑运算符是“&”,a=c不为0为真,还要运行后面的“b=c”,所以答案为C。10.以下程序的输出结果是()。2013年9月main()int a=-1,b=1,k;if(+a0)&!(b-=0)printf(%d%dn,a,b);else等级考试重点及真题解析print
34、f(%d%dn,b,a);A.-1 1B.01C.1 0D.0 0 执行条件“+a0);D.a=0,b=0,c=0;2.下列运算符中优先级最低的是()。A.|B.!=C.=D.+3.设a、b和c都是int型变量,且a=3,b=4,c=5,则以下表达式中,值为0的表达式是()。A.a&bB.a=bC.a|b+c&b-cD.!(ab)&!c|1)思考与练习4.有以下程序。main()int a=2,b=-1,c=2;if(ab)if(b0)c=0;else c+=1;printf(%dn,c);程序的输出结果是()。思考与练习A.1B.0C.2D.35.以下程序执行的结果是()。main()int
35、 w=4,x=3,y=2,z=1;printf(%dn,(wx?w:z60)printf(%d,a);if(a70)printf(%d,a);if(a80)printf(%d,a);若执行程序时从键盘输入89,则输出的结果是()。A.89B.8989C.898989D.无任何输出7.有以下程序。思考与练习main()int x=10,y=5;switch(x)case 1:x+=y;default:x+=y;case 2:y-;case 3:x-;思考与练习printf(x=%d,y=%d,x,y);程序的输出结果是()。A.x=15,y=5B.x=10,y=5C.x=14,y=4D.x=15
36、,y=48.设有定义“int a=1,b=2,c=3;”,以下语句中执行效果与其他3个不同的是()。A.if(ab)c=a,a=b,b=c;B.if(ab)c=a,a=b,b=c;C.if(ab)c=a;a=b;b=c;D.if(ab)c=a;a=b;b=c;9.若变量已正确定义,在“if(w)printf(%dn,k);”中,以下不可替代w的是()。思考与练习A.ab+cB.ch=getchar()C.a=b+cD.a+10.有以下程序。includemain()int a=1,b=0;if(!a)b+;else if(a=0)if(a)b+=2;else b+=3;思考与练习printf(
37、%dn,b);程序运行后的输出结果是()。A.0B.1C.2D.3二、编程题1.输入一个字符,判断其是否是元音字符。2.编写程序,输入一个整数,打印出它是奇数还是偶数。3.设计一个简易的计算器。输入两个运算数和一个运算符,根据输入的运算符进行相关的计算。思考与练习4.编程实现某快递公司对用户计算运费。路程s越远,每公里运费越低。标准如下(单位为km):s250没有折扣250s5002%折扣500s1 000 5%折扣1 000s2 000 8%折扣2 000s300010%折扣3 000s15%折扣设每公里每吨货物的基本运费为p(price),货物重量为w思考与练习(weight),距离为s,折扣为d(discount),则总运费f(freight)的计算公式为:f=p*w*s*(1-d)5.编写程序,输入某年某月,求该月的天数。6.编写程序,求一元二次方程ax2+bx+c=0的根。求一元二次方程的根,事实上应该有以下几种可能:(1)a=0,不是二次方程。(2)b2-4ac=0,有两个相等的实根。(3)b2-4ac0,有两个不等的实根。(4)b2-4ac0,有两个共轭复数根。判断(disc)=b*b-4*a*c为0,不能直接用disc=0。Thank you