第3章 选择结构程序设计 3.1相关知识点 1. if语句 if语句的三种形式: (1) if语句基本形式,如图3.1所示。 if(表达式) 语句; (2) ifelse形式,如图3.2所示。 if(表达式) 语句1; else 语句2; 图3.1if语句基本形式 图3.2ifelse形式 (3) if语句嵌套形式,如图3.3所示。 if(表达式1) 语句1; else if(表达式2)语句2; … else if(表达式n)语句n; else语句n+1; 图3.3if语句嵌套形式 if语句在使用过程中需要注意的地方: (1) 在以上三种形式的if语句中,if后面的括号中均为表达式。该表达式通常是逻辑表达式或者关系表达式,但也可以是其他类型表达式,如赋值表达式等,甚至也可以是一个变量。例如: if(x=2)和if(x)都是允许的。只要表达式或变量的值为非0,即为“真”。只有当表达式或变量的值为0时,才为“假”。比如在if(x=2)中,由于赋值表达式x=2的值永远都为非0,所以无论变量x的值为多少,该表达式均为“真”。在计算表达式的值时,特别注意区分关系运算符“==”和赋值运算符“=”的区别,要判断两个值是否相等,使用“==”,而不是“=”。 (2) 注意存在以下等价关系: if(x)等价于if(x!=0); if(!x)等价于if(x==0)。 (3) 在if语句中,条件判断表达式必须用圆括号括起来,在语句之后必须加分号。 (4) 在if语句的三种形式中,所有的语句均应为单个语句,如果想在满足一定条件时执行一组语句,则需要把这一组语句用{}括起来,使其构成一条复合语句。 (5) 当if语句中的执行语句又是if语句时,则构成了if语句的嵌套形式。在嵌套内的if语句可能又是ifelse形式的,这将会出现多个if和多个else重叠的情况,这时特别要注意if和else的配对问题。if和else配对的原则为: else总是和位于它上面的、离它最近的、未配对的if进行配对,以上三个条件缺一不可。 2. switch语句 switch语句的一般形式,如图3.4所示。 switch(表达式) { case 常量表达式1:[语句序列1];break; case常量表达式2:[语句序列2]; break; … case常量表达式n:[语句序列n]; break; [default:语句序列n+1; break; ] } 图3.4switch语句 switch语句在使用过程中需要注意的地方: (1) switch语句的执行过程。计算switch关键字后面表达式的值,并逐个与case后面的常量表达式的值进行比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句。如果表达式的值与所有case后面的常量表达式的值均不相等时,则执行default后面的语句。 (2) switch后面的表达式必须是整型表达式或字符表达式。 (3) case后面跟的表达式必须是整型或字符型的常量表达式。 (4) 所有case后的常量表达式的值不能相同,否则会出现错误。 (5) 在case后面可以是多条语句,而且可以不用{}括起来。 (6) 可以没有default分支。 (7) 注意break关键字的使用。break用于case分支语句组的后面,表示程序执行到此时,该break所在的switch语句结束,不再执行后面的内容。如果一个case分支中没有break,则在执行完该分支后,仍然会继续无条件地执行下面分支中的语句。例如,在下列switch语句中,如果变量x的值为1,由于没有在case 1分支后面加入break,所以程序在执行完case 1分支后仍然会执行case 2分支,因此最终输出结果为“x==1 x== 2”,而不是“x==1”。 switch(x) { case 1: printf("x==1 "); case 2: printf("x==2 "); } 3.2实 验 目 的 (1) 熟练掌握各种选择结构,包括ifelse及其嵌套结构,ifelse ifelse形式的多重选择结构,以及switch形式的多重选择结构的使用。 (2) 熟练掌握选择结构中测试表达式的书写。 (3) 学会用选择结构编制简单的程序。 3.3实 验 内 容 3.3.1程序设计 1. 编制程序 要求: 任给三个整数a、b、c,将最大数存放在变量a中,最小数存放在变量c中,并按从大到小的顺序输出。 【指导】 这是一个简单的数据排序的问题,其主要操作是比较和交换,算法步骤如下: (1) 比较a和b,如果a int main() { int a, b, c, temp; printf("Input a,b and c:\n"); scanf("%d%d%d", &a, &b, &c); printf("Before sorting: a=%d, b=%d, c=%d\n", a, b, c); if (a void main() { float weight, cost; printf("Enter weight: \n"); scanf("%f ", &weight); if(weight<10) cost=0.80*weight+0.2; else if(weight<20) cost=0.75*weight+0.2; else cost=0.70*weight+0.2; printf("Delivery cost is %.2f\n",cost); } 【说明】 (1) 单击如图3.7所示的“添加或移除按钮”菜单中的“自定义”命令,弹出如图3.8所示的“自定义”对话框,选中“工具栏”下的“调试”选项,主界面将显示调试工具栏(如图3.9所示); 或者此步骤直接单击主菜单上的“调试”按钮,会显示出调试的各个功能步骤。 (2) 程序调试开始,单击调试工具栏中的按钮 (逐语句(F11))。该按钮的功能是单步执行,即单击一次执行一行(如图3.10所示),编辑窗口中的箭头指向某一行,表示程序将要执行该行。图3.10中下方是局部变量窗口和监视窗口,在监视窗口中可以改变变量的值。 (3) 单击按钮 (逐语句(F11))两次,程序执行到输入语句这一行(如图3.11所示),同时运行窗口(图3.12)显示Enter weight:,继续单击按钮 (逐语句(F11)),在运行窗口中输入25(图3.13),按Enter键后,箭头指向了if(weight<10)这一行(如图3.14所示),在局部变量窗口中可以看到变量weight的值是25.000000。 图3.7选择工具栏 图3.8“自定义”对话框 图3.9调试工具栏 图3.10程序调试开始 图3.11程序单步调试 图3.12运行窗口 图3.13在运行窗口中输入变量weight的值 图3.14程序单步调试,显示变量weight的值 (4) 继续单击按钮 (Step Over)三次,箭头指向printf这一行(如图3.15所示),在变量窗口可以看到变量cost的值为17.700001。 图3.15程序单步调试 (5) 继续单击按钮(Step Over),运行窗口显示运行结果(如图3.16所示)。 图3.16在运行窗口中显示结果 (6) 单击按钮(Stop Debugging),程序调试结束。 3. 编制程序 该程序的功能是根据考试分数划分成绩等级。成绩等级按如下方法分级: 分数大于或等于90分的为A级,大于或等于80且小于90分则为B级,大于或等于70且小于80分则为C级,大于或等于60且小于70分为D级,如果分数小于60则为E级。假设考试分数均为整数,要求用switch语句实现。 【指导】 算法分析: 首先,定义一个整型变量score,保存考试分数; 然后,用score除以10,结果为一个介于0~10的整数,再用这个结果作为switch语句的表达式的值,与不同的case分支进行匹配。 【参考程序】 #include int main() {int score;//存放考试分数的变量 int n; char grade;//存放成绩等级 scanf("%d", &score);//输入考试成绩 n = score/10; switch (n)//判定成绩等级 {case 10: case 9: grade = 'A'; break; case 8: grade = 'B'; break; case 7: grade = 'C'; break; case 6: grade = 'D'; break; case 5: case 4: case 3: case 2: case 1: case 0: grade = 'E'; break; default: printf("Input error!\n"); return; //输入的分数不在0~100 } printf("Grade is %c\n",grade);//输出成绩等级 return 0; } 3.3.2程序分析 运行下面的程序,分析运行结果。 #include int 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,b); return 0; } 【指导】 (1) 输入程序源代码,编译、连接后运行程序,显示程序的结果为: a=2,b=1。 (2) 对程序运行结果的分析: 这是一个switch语句的嵌套形式。外层switch中,x的值为1,所以进入case 1分支中,即执行内层switch语句。在内层switch中,y的值为0,进入内层switch的case 0分支,此时执行a++,a的值变为1,然后执行break语句。由于break只能终止并跳出最近一层的switch语句,所以此处的break是跳出了内层的switch语句。在外层switch语句中,case 1分支中并没有break语句,因此会继续执行case 2分支中的语句组,执行了a++和b++后,a的值变为了2,b的值变为1,在此处遇到了break语句终止并跳出了外层的switch语句。因此,最后输出a和b的值分别为2和1。 3.4思考题 (1) 企业发放的奖金根据利润提成,用switch语句实现。 利润I低于(含等于)100000元的,奖金可提10%; 利润高于100000元,低于(含等于)200000元时,低于100000元的部分按10%提成,高于100000元的部分,可提成7.5%; 当200000元1000000元时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。 (2) 输入三角形三条边a, b, c的值,判断这三条边能否构成三角形。若能,还要显示该三角形是等边三角形、等腰三角形、直角三角形或任意三角形。 提示: 判断构成三角形的条件是任意两边之和大于第三边。 (3) 编写程序计算存款的本金合计。已知银行整存整取存款不同期限的利率分别为: 半年2.55%,一年2.75%,二年3.35%,三年4.00%,五年4.75%。要求输入存钱的本金和期限,输出到期时的本金和利息合计。 提示: 利用输入函数分别输入本金和存款年限。使用switch语句处理不同期限的情况,根据本金及相应的利率算出利息。注意,switch语句中的表达式类型必须是整型或字符型,对于半年(0.5年)的情况,应在switch语句外单独处理。 (4) 编写程序计算飞机票款。输入舱位代码和购票数量,输出总票款。 提示: 国内客票的舱位等级主要分为头等舱(舱位代码为F)、公务舱(舱位代码为C)、经济舱(舱位代码为Y); 经济舱里面又分不同的座位等级(舱位代码为B、H、K、L、M、N、Q、T、X等,价格也不一样)。票价规则为: F舱为头等舱公布价,C舱为公务舱公布价,Y舱为普通舱(经济舱)公布价,B舱为普通舱9折,H舱为普通舱8.5折,K舱为普通舱8折,L舱为普通舱7.5折,M舱为普通舱7折,N舱为普通舱6.5折,Q舱为普通舱6折,T舱为普通舱5.5折,X舱为普通舱5折。程序首先输入F舱、C舱和Y舱的公布价,然后输入舱位代码和购票数量,利用switch语句处理不同折扣的情况,计算出机票款并输出。输入、输出都要有文字说明,结果取2位小数。 (5) 编写程序,计算并输出分段函数的值。 y=x2+x-6,x<0 x2-5x,0≤x<5 x3-1,其他