第四章 选择结构4.1 关系运算符及其表达式 4.2 逻辑运算符及其表达式 4.3 if语句 4.4 switch语句 4.5 程序举例4.6 C语言趣味程序实例34.7 本章小结关键字:if语句 if语句嵌套 switch语句 选择结构是一种应用非常广泛的程序控制结构,是计算机科学用来描述自然界和社会生活中分支现象的手段。其特点是:根据所给定选择条件为 真(即分支条件成立)与否,决定从各实际可能的不同操作分支中执行某一分支的相应操作,并且任何情况下恒有“无论分支多寡,必择其一;纵然 分支众多,仅选其一”的特性。4.1关系运算符及其表达式 关系运算是对两个运算对象进行大小关系的比较运算。C语 言的关系运算符共有6个,>(大于 )、 >=(大于等于 )、 < (小于 )、 <= (小于等于)、 ==(等于 ) 、 != (不等于)。 关系运算符中>,>=,<,<=优先级相同,高于相同级别的==,!=。运算方向 自左向右。由关系运算符组成的表达式称为关系表达式 。关系表达式的一般形式为: 表达式 关系运算符 表达式 例如:a>4 a+b 假”两种,由于C语言中没有逻辑型数据,因此用“1”和“0”分别表示逻辑真和逻辑假。例如: 3>2 的值为“真”,即为1。 5>4==2的值为“假”,即为0。 【程序文本4.1】关系表达式示例。#include “stdio. h”main(){ int a,b,c,d,e; c=2; d=4; e=6; a=c>d; b=d tf(“a=%d,b=%d”,a,b);}程序运行结果:a=0,b=1 C语言中提供了三种逻辑运算符,!(逻辑非 )、&& (逻辑 与 )、|| (逻辑或 )。逻辑非的优先级别最高,逻辑与次之,逻辑或最低。运算方向自左向右。逻辑运算符与其他运算符的优先级从高到低 依次是:逻辑非(!)、算术运算符、关系运算符、逻辑与(&&)、逻辑或(||)、赋值运算符。由逻辑运算符组成的表达式称为逻辑表达式。 例如: !a b&&c 2||d逻辑表达式的值为1(结果为“真”时)和0(结果为“假”时)。 4. 2逻辑运算符及其表达式 【程序文本4.2】逻辑表达式示例。#include “stdio.h”main(){ int x,y,m ,n; x=3; y=7; m=9; printf(“%d\n”,x+y>m&&x==y); printf(“%d\n” ,x||y+m&&y-m); printf(“%d\n”,!(x+y)||m-1&&y+m/2); } 程序运行结果: 0 1 1 4.3 if语句 实现选择结构最常用的方法是采用if语句。它根据给定的条件进行判断(真或假), 以决定执行某个分支程序段。C语言提供了3种基本的if语句形式。4.3.1 if语句的三种形式1.单分支结构 这是一种最简单的i f形式,格式为: if(表达式) { 语句序列; }执行 过程:如果表达式的值为真,则执行其后的语句,否则跳过该if的语句,直接执行下一条语句。 【程序文本4.1】输入两个实数,按从小到大 的顺序输出这两个数。#include “stdio.h”main(){ float x,y,t; printf(“请输入两个实数 (x,y):”);scanf(“%f,%f”,&x,&y);if(x>y){t=x;x=y;y=t;} printf(“%5.2 f,%5.2f”,x,y);} 程序运行结果:(运行2次): 请输入两个实数(x,y):32,45↙ 32.00,45.00 请输入两个实数(x,y):45,32↙ 32.00,45.00 从运行结果可以看出,只有“x>y”为真时才执行复合语句“{ t=x;x=y;y=t;}”,当程序只需实现单分支选择时,就可以使用这种形式的if语句来完成。 2.双分支if…else语句这是 一种使用比较频繁的条件语句,格式为:if(表达式) {语句序列1; }else {语句序列2; }执行过程:如果表 达式的值为“真”,则执行语句1,否则执行语句2。 【程序文本4.2】输入一名学生的C语言成绩,判断是否及格。#include “ stdio.h”main(){ int x; printf(“请输入一名学生的C语言成绩:\n”); scanf(“%d”,& x); if(x>=60)printf(“及格\n”); else printf(“不及格\n”);} 程序运行结果:(运行 2次):请输入一名学生的C语言成绩:89↙及格请输入一名学生的C语言成绩:58↙不及格 执行本程序时,当输入的成绩大于等于60时 ,执行if后面的语句,输出“及格”;当输入的成绩小于60时,执行else后面的语句,输出“不及格”。对于选择结构程序只能执行if后 面的语句或者else后面的语句,绝对不可能同时执行两个分支。3. 多分支if…else…if语句这种多分支语句其实是固定在else 分支下嵌套着另一个if…else语句,格式为:if (表达式1) 语句序列1;else if(表达式2) 语句序 列2; else if(表达式3) 语句序列3; …else if(表达式n) 语句序列n; else 语句序列n+1; 执行过程:程序先判断表达式1的值,当其 结果为“真”时,则执行语句1;否则判断表达式2的值,当其值为“真”时,则执行语句2;否则判断表达式3的值,当其值为“真”时,则执行 语句3;否则接着进行判断,依此类推,直到找到结果为“真”的表达式,并执行与之相关的语句。如果经过判断,所有的表达式都为“假”,那么 就执行最后一个else之后的语句。 【程序文本4.3】现有一分段函数,输入任意一个x值,输出对应的y值。y =x+3 (x>3)x (x=3)x-3 (x<3)#include “stdio.h”main(){ int x,y; p rintf(“\n请输入x的值:”); scanf(“%d”,&x); if(x<3) y=x+3; else if( x==3) y=x; else y=x-3;printf(“x=%d, y=%d”,x,y);} 程序运行情况如下(运行3次):请输入x的值:2↙x=2,y=5请输入x的值:3↙x=3,y=3请输入x 的值:4↙x=4,y=1 在应用if-else-if多分支结构时,应注意每个else是和其前面最近的if配对使用的。一般来讲,中 间的各个else不能省略,但最后一个else可以省略,这时表示当所有的表达式的值都为假时,执行该选择结构下面的语句。 4.3. 2 if语句的嵌套if语句的嵌套是指在if语句中又含有了if语句的形式。可以嵌套在if子句中,也可以嵌套在else子句中,可以多层 嵌套。其一般形式为: if(表达式1) if(表达式2) 语句序 列1; else 语句序列2; else if(表达式3) 语句序列3; else 语句序列4; 在if语句的嵌套结构中并不需要对称,可以根据实际情况上面格式中的一部分,并且可以进行if语句的多重嵌套。【程序文本4.4】 从键盘输入3个数,如果这3个数能构成一个三角形,则输入该三角形的形状信息(等边、等腰、任意三种情况)。#include “std io.h”main(){ float a,b,c; printf(“\n请输入a,b,c的值:”); scanf(“%f,%f ,%f”,&a,&b,&c);if(a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b) if(a==b& &b==c) printf(“等边三角形!\n”); else if(a==b||b==c||a==c) printf(“等腰三角形!\n”); else printf(“任意三角形!\n”) ; else printf(“不能构成三角形!\n”); } 程序运行情况如下(运行4次)请输入a,b,c的值:6,6, 6↙ 等边三角形!请输入a,b,c的值:6,6,8↙ 等腰三角形!请输入a,b,c的值:6,7,8↙ 任意三角形!请输入a, b,c的值:2,3,6↙ 不能构成三角形!4.3.3 条件运算符 条件运算符“?:”是C语言中唯一的一个三目运算符,要求3个 运算对象同时参加运算。条件表达式的语法格式为: 表达式1?表达式2:表达式3 其运算规则为:如果表达式1为“真 ”,则求解表达式2的值,并将其作为整个条件表达式的值;否则就求解表达式3的值,并将其作为整个条件表达式的值。例如: int a,b ,max; a=3; b=4; a>b?max=a:max=b;执行时先判断a和b的大小,a的 值是3,b的值是4,“a>b”的值为“假”,执行表达式“max=b”, 所以最后max的值为4。通常可以用前面介绍的if语句来改写 ,上例中的条件表达式可改写为: if(a>b) max=a; else max=b; 4.4 switch语句 我们在解决实际问题时,经常要用到多分支的选择。虽然用if语句的嵌套格式可以实 现,但有时不太方便简洁,C语言提供了一个用于多分支的switch语句,用它来解决多分支问题更加方便有效。其一般形式为: swi tch(表达式){ case常量表达式1: 语句组1; case常量表达式2: 语句组2; case常量表达式n: 语句组n; default : 语句组n+1; }其执行过程为: 将“表达式”的值与“常量表达式”的值依次进行比较,当发现了某个匹配 的值时,就执行该case后面的语句,直到遇到break语句或switch语句结束的“}”为止。如果没有匹配的值,则执行defaul t后面的语句。 【程序文本4.5】为某运输公司编制计算运费的程序。运行程序时,由用户输入运输距离s和运量w,程序输入单价p和总金额 t。运费标准为:当s<1000km时,没有优惠,单价为6元/(吨·公里);当1000km≤s<2000km时,优惠5%;当2000 km≤s<3000km时,优惠8%;当3000km≤s<5000km时,优惠10%;当s≥5000km时,优惠12%; #incl ude “stdio.h”main(){ int s,w,g; float p,t; printf(“请输入距离s和运量w的 值:”); scanf(“%d, %d”,&s,&w); g=s/1000; switch(g) {case 0: p= 6;break;case 1: p=60.95;break;case 2: p=60.92;break; case 3: case 4: p=60.90;break; defalt: p=60.88;break;} t=psw; pri ntf(“单价p是%.3f\n总价t是%.3f\n”,p,t);}程序运行结果:请输入距离s和运量w的值:900,100↙单价p是 6.000总价t是540000.000请输入距离s和运量w的值:3500,100↙单价p是5.400总价t是1890000.000 4.5 程序举例【例1】输入年份,判断是否为润年。分析:能被4整除,不能被100整除或能被400整除的年份为润年。#include “stdio.h”main(){ int year; printf(“\n请输入年份:”); scanf(“%d”,&yea r); if((year%4==0&& year%100!=0)|| year%400==0) printf(“%d年是闰年。 \n”,year); else printf(“%d年不是闰年。\n”,year);}程序运行结果:(运行2次)请输入年份: 1996↙1996年是闰年。请输入年份:2014↙2014年不是闰年。 【例2】实现英寸与厘米的换算。分析:设置一个变量flag ,用于选择换算的方向,flag的值为1表示英寸换算成厘米,flag的值为2表示厘米换算成英寸。#include “stdio.h” main(){ float y,r=2.54; int flag; printf(“请输入要换算的数据和换算的方式(1.英寸 →厘米,2. 厘米→英寸):\n”); scanf(“%f,%d”,&y,&flag); if(flag==2||flag== 1) if(flag==1) printf(“%8.2f英寸=%8.2f厘米”,y,yr); else pr intf(“%8.2f厘米=%8.2f英寸”,y,y/r);else printf(“数据错误!\n”); }程序运行结果:( 运行2次)请输入要换算的数据和换算的方式(1.英寸→厘米,2. 厘米→英寸):2,1↙2.00英寸= 5.08厘米请输入要换 算的数据和换算的方式(1.英寸→厘米,2. 厘米→英寸):4,2↙4.00厘米= 1.57英寸 【例3】某企业利润提成 的规则如下: (1)利润低于或等于10万元的,可提成奖金10%; (2)利润高于10万元,低于20万元时,低于10万元的部分按10 %提成,另外10万元可以提成7.5%; (3)利润高于20万元,低于40万元时,其中20万按前面的方法发放,另外20万元可以提成5 %; (4)利润高于40万元,40万按前面的方法提成,高于部分按3%提成。请从键盘输入利润,输出应发的提成。 用if语句编写 程序如下:#include “stdio.h” main() { int pf; float pr; printf( “\n请输入利润总数(单位:万元):”); scanf(“%d”,&pf); if(pf<=10) pr=pf0.1 0; else if(pf<20) pr=100.10+(pf-10)0.075; else if(pf<40) pr=100.10+100.075+(pf-20)0.05; else pr=100.10+100.075+200.05+(pf-40)0.03; printf(“\n应发的奖金是:%f万元。”,pr); } 程序运行结果:(运行4次)请输入利润总数(单位:万元): 5↙应发的奖金是:0.500000万元。 请输入利润总数(单位:万元):13↙应发的奖金是:1.225000万元。请输入利润总数( 单位:万元):25↙应发的奖金是:2.000000万元。请输入利润总数(单位:万元):60↙应发的奖金是:3.350000万元。 用switch语句编写程序如下: #include “stdio.h” main() { int pf; f loat pr; printf(“\n请输入利润总数(单位:万元):”); scanf(“%d”,&pf); swit ch(pf/10) { case 0: pr=pf10;break; case 1: pr=100. 10+(pf-10)0.075;break; case 2: case 3: pr=100.10+100.075+(pf-20)0.05;break; default: pr=100.10+100.075+200.05+(pf-40)0.03;} printf(“\n应发的奖金是:%f万元。”,pr);} 4.6 本章小结 C语言提供了6种关系运算符:>(大于),>=(大于等于),<(小于),<=(小于),==(等于),!=(不等于);提供了3种逻辑运算符:&&(逻辑与),||(逻辑或),!(逻辑非)。if语句的控制条件通常用关系表达式或逻辑表达式构造,也可以用一般表达式表示。 选择结构主要是通过if语句和switch语句来实现的,if语句的基本形式有三种:单分支、双分支、多分支结构。一般,采用if语句实现简单分支结构程序,用switch和break语句实现多分支结构程序。虽然用if语句的嵌套也能实现多分支结构程序,但有时用switch和break语句实现多分支结构能使程序简单明了。 |
|