第4章 选择结构程序设计.docx
《第4章 选择结构程序设计.docx》由会员分享,可在线阅读,更多相关《第4章 选择结构程序设计.docx(16页珍藏版)》请在冰点文库上搜索。
第4章选择结构程序设计
第4章选择结构程序设计
4.1if语句
【学习目标】
(1)掌握if语句的语句格式与应用
(2)掌握复合if语句的语句格式与应用
(3)掌握条件运算符的用法
实例13if语句——根据条件确定公司是否已经为司机投保
【实例任务】
如果司机满足下列条件之一,公司则为他们投保。
这三个条件是:
(1)司机已婚。
(2)司机为30岁以上的未婚男性。
(3)司机为25岁以上的未婚女性。
如果以上条件一个也不满足,则公司不为司机投保。
请编写一个程序,根据用户输入司机的婚姻状态、性别和年龄,判断该司机是否已投保。
运行结果如图4-1所示。
图4-1运行结果
【程序代码】
#include"stdio.h"
main()
{chargender,ms;
intage;
/*接受司机的详细信息*/
printf("\n\n\t司机的详细信息\n\n");
printf("\n\t司机的婚姻状况(y/n):
");
scanf("\n%c",&ms);
printf("\n\t司机的性别(M/F):
");
scanf("%d",&age);
/*多重if结构*/
if(ms=='Y'||ms=='y')/*检查司机的婚姻状况*/
printf("\n\t该司机已投保\n");
elseif((gender=='M'||gender=='m')&&(age>30))
/*如果未婚,检查是否是30岁以上的男性*/
printf("\n\t该司机已投保\n");
elseif((gender=='F'||gender=='f'&&age>25))
/*检查是否是25岁以上的女性*/
printf("\n\t该司机已投保\n");
else
printf("\n\t该司机已投保\n");
getch();}
【相关知识】
1.选择结构程序设计
选择结构又称分支结构,有二分支或多分支结构。
这种结构根据条件判断结果,选择执行不同的程序分支。
选择结构是程序的基本结构之一,几乎所有程序都包含选择结构。
C语言中可以用两种控制语句来实现程序的分支控制,即if语句和switch语句。
用它们均可构成选择结构。
2.单分支选择if语句
单分支选择if语句的形式为:
if(表达式)语句;
执行过程,先判断表达式的值,如果成立,则行后面的语句。
否则什么也不执行。
3.双分支选择if语句
双分支选择if语句的形式为:
if(表达式)语句l;else语句2;
这个条件语句的执行过程,先判断表达式的值,如果成立,执行语句1,如果不成立,执行语句2。
4.多分支选择if语句
多分支选择if语句的形式为:
if(表达式1)语句1;
elseif(表达式2)语句2;
elseif(表达式3)语句3;
………
elseif(表达式n)语句n;
else语句n+1;
其语句是,依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。
然后跳到整个if语句之外继续执行程序。
如果所有的表达式均为假,则执行语句n+1。
然后继续执行后续程序。
实际上第三种if语句是第二种语句的嵌套形式。
我们可以把第一个判断的else部分看成是一个内嵌语句,它本身是一个语句,而且可以依次类推,即可写成:
if(表达式1)语句1;
else{if(表达式2)语句2;
else{if(表达式3)语句3;
………
else{if(表达式n)语句n;
else语句n+1;}…}}
关于这三种形式的语句的使用,有几点请注意:
(1)if之后的条件,必须以“(表达式)”的形式出现,即括号不可少,而表达式可为任意表达式,可以是关系表达式或逻辑表达式,也可以为其他表达式。
(2)在后两种if语句中,有多个内嵌语句,每个内嵌语句都必须以“;”结束。
(3)三种形式的if语句中内嵌语句处只能有一个语句。
如果要用n个语句,则必须使用{}将它们组成一个复合语句。
5.if语句的嵌套
在if语句中又内嵌if语句则称为语句的嵌套。
前面已说明,多分支选择if语句本身就可看成为if语句的嵌套形式。
其一般形式为:
if()
if()语句1;/*内嵌if语句*/
else语句2;
else
if语句3;/*内嵌if语句*/
else语句4;
在使用内嵌if语句时,要注意if和else的配对,因为if语句的第一种形式中只有if没有else。
C语言在编译源程序时总是将else与它前面最近的if配对。
6.条件表达式构成的选择结构
C语言另外还提供了一个特殊的运算符——条件运算符,由此构成的表达式也可以形成简单的选择结构,这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,使得可以根据不同的条件使用不同的数据参与运算。
它的运算符符号是“?
:
”。
这使C语言提供的唯一的三目运算符,即要求有三个运算对象。
它的表达式形式如下:
表达式1?
表达式2:
表达式3
条件表达式的运算功能,当“表达式1”的值为非零时,“表达式2”的值就是整个条件表达式的值;当“表达式1”的值为零时,“表达式3”的值作为整个条件表达式的值。
此运算符优先于赋值运算符,但低于关系运算符与算术运算符。
例如有如下表达式:
y=x>10?
100:
200
首先要求出条件表达式的值,然后赋给y。
在条件表达式中,要先求出x>10的值。
若x大于10,取100作为表达式的值并赋予变量y;若x小于或等于10,则取200作为表达式的值并赋予变量y。
【课堂精练】
1.输入三个实数,按从小到大顺序输出。
程序运行结果如图4-2所示。
图4-2程序的运行结果
根据程序的运行结果,请将下面程序补充完整并调试。
#include"stdio.h"
main()
{floata,b,c,t;
printf("请输入三个数a,bandc:
\n");
scanf("%f%f%f",&a,&b,&c);
printf("输入的三个数为:
");
printf("%6.2f,%6.2f,%6.2f\n",a,b,c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
___________________________________
if(b>c)
{t=b;b=c;c=t;}
printf("排序后的三个数为:
");
printf("%6.2f,%6.2f,%6.2f\n",a,b,c);
getch();}
2.编程实现:
根据性别sex和身高tall给某数据分类,如果sex为‘F’,当tall>=150时,输出A,否则输出B;若sex不为‘F’,当tall>=172时,输出A,否则输出B。
程序的运行结果如图4-3所示。
图4-3程序运行结果
根据程序运行结果,请将下面程序补充完整并调试。
#include"stdio.h"
main()
{inttall;
charsex;
printf("请输入性别和身高:
");
scanf("%c%d",&sex,&tall);
if(sex=='F')
{if(tall>=150)/*内嵌if-else语句*/
_________________________________________
elseprintf("B");}
else
{if(tall>=172)
printf("A");
elseprintf("B");}
getch();}
4.2switch语句
【学习目标】
(1)掌握switch语句的语句格式与应用
(2)掌握switch语句中break语句的用法
实例14switch语句——计算长方形、圆形、和三角形的面积
【实例任务】
编写一个程序,用于计算长方形、圆形和三角形的面积。
根据用户的选择要能计算相应形状的面积。
程序的运行结果如图4-4所示。
图4-4程序运行结果
【程序代码】
#include"stdio.h"
#definePI3.14
main()
{floatradius,length,breadth,height,base;
doublearea;
intchoice;
printf("\n\t形状的类型\n");
printf("\n\t1.长方形\n");
printf("\t2.圆形\n");
printf("\t3.三角形\n");
printf("\t4.退出\n");
printf("\n\t请输入选项(1/2/3/4):
");
scanf("%d",&choice);
switch(choice)
{case1:
printf("\n请输入长方形的详细信息");
printf("\n长为:
");
scanf("%f",&length);
printf("\n宽为:
");
scanf("%f",&breadth);
area=length*breadth;
printf("\n该长方形的面积为%7.2f\n",area);
break;
case2:
printf("\n请输入圆形的详细信息");
printf("\n半径为:
");
scanf("%f",&radius);
area=PI*radius*radius;
printf("\n该圆形的面积为%7.2f\n",area);
break;
case3:
printf("\n请输入三角形的详细信息");
printf("\n高为:
");
scanf("%f",&height);
printf("\n底边为:
");
scanf("%f",&base);
area=0.5*height*base;
printf("\n该三角形为%7.2f\n",area);
break;
case4:
printf("\n退出程序\n");
break;
default:
printf("\n选项错误\n");}
getch();}
【相关知识】
1.switch语句以及用switch语句和break语句构成的选择结构
switch语句是一种多分支选择结构,语句形式如下:
switch(表达式)
{case常量表达式1:
语句1;
case常量表达式2:
语句2;
……
case常量表达式n:
语句n;
default:
语句n+1;}
switch语句是C语言的关键字,switch后面用花括号括起来的部分称为switch语句体。
紧跟在switch后一对圆括号中的表达式可以是整型表达式及后面将要学习的字符型表达式。
表达式两边的一对括号不能省略。
case也是关键字,与其后面的常量表达式合称case语句标号。
常量表达式的类型必须与switch后面圆括号中的表达式类型相同,各case语句标号的值应该互不相同。
case语句标号后的语句1,语句2等,可以使一条语句,也可以是若干语句。
必要时,case语句标号后的语句可以省略不写。
default也是关键字,起标号的作用,代表所有case标号之外的那些标号。
default标号可以出现在语句体中任何标号位置上。
在switch语句中也可以没有default标号。
在关键字case和常量表达式之间一定要有空格,例如case10:
不能写成case10:
。
2.switch语句的执行过程
当执行switch语句时,首先计算紧跟其后一对括号中的表达式的值,然后在switch语句体内寻找与该值吻合的case标号。
如果有与该值相等的标号,则执行该标号后开始的各语句,包括在其后的所有case和default中的语句,直到switch语句体结束;如果没有与该值相等标号,并且存在default标号,则从default标号后的语句开始执行,直到switch语句体结束;如果没有与该值相等的标号,同时又没有default标号,则跳过switch语句体,执行之后的语句。
【课堂精练】
1.根据输入的成绩段,输出成绩的等级。
程序运行结果如图4-5所示。
图4-5程序运行结果
根据程序运行结果,请将下面程序补充完整并调试。
#include"stdio.h"
main()
{intg;
printf("请输入成绩为:
");
scanf("%d",&g);/*g中存放学生的成绩*/
printf("成绩为:
%d",g);
switch(g/10)/*g/10为整除*/
{case10:
case9:
printf("\n成绩等级为:
A\n");break;
case8:
printf("\n成绩等级为:
B\n");break;
case7:
printf("\n成绩等级为:
C\n");break;
case6:
printf("\n成绩等级为:
D\n");break;
___________________________________________}
getch();}
2.由键盘输入三个整数a、b、c,输出三个数中最大的一个。
程序运行结果如图4-6所示。
图4-6程序的运行结果
根据程序运行结果,请将下面程序补充完整并调试。
#include"stdio.h"
main()
{inta,b,c,max;
printf("请输入三个整数:
\n");
scanf("%d,%d,%d",&a,&b,&c);
______________________
______________________
else
______________________
if(c>max)
______________________
printf("三个数中最大的数是:
%d",max);
getch();
}
4.3课后习题
4.3.1项目练习
一.练习目的
1.进一步巩固选择结构程序设计语句的使用
2.进一步巩固break语句的使用方法
3.提高编程和调试程序的能力
二.练习内容
1.接受用户输入的三种商品的价格。
如果购买的三种商品中至少有一种商品的价格大于50或者三种商品的总额大于100,则折扣率为15%,否则折扣率为0,计算并显示用户应付的钱数。
2.判断所输入的一个年份是否为闰年。
3.利用if结构编写程序,输入x值,求解以下分段函数的y值。
当x<1时,y=x+1;当1≤x<10,y=2x+5;当x≥10时,y=x2+8。
4.编写一个程序,根据用户输入的期末考试成绩,输出相应的成绩评定信息。
成绩大于等于90分输出“优”;成绩大于等于80分小于90分输出“良”;成绩大于等于60分小于80分输出“中”;成绩小于60分输出“差”。
5.利用switch语句编写一个计算器程序,用户输入四则运算表达式,输出计算结果。
P65
4.3.2练习题
一.选择题
1.在if语句的嵌套中,else总是与__________配对;
(A)它前面未配对的if(B)它前面最近的未配对的if
(C)它上面书写在同一列的if(D)它在同一行的if
2.判断char型变量ch是否为大写字母的正确表达式是__________。
(A)‘A’<=ch<=‘Z’(B)(ch>=‘A’)&(ch<=‘Z’)
(C)(ch>=‘A’)&&(ch<=‘Z’)(D)(‘A’<=ch)AND(‘Z’>=ch)
3.已知intx=10,y=20,z=30;以下语句执行后x,y,z的值是__________。
if(x>y)z=x;x=y;y=z;
(A)x=10,y=20,z=30(B)x=20,y=30,z=30
(C)x=20,y=30,z=10(D)x=20,y=30,z=20
4.请阅读以下程序:
main()
{inta=5,b=0,c=0;
if(a=b+c)printf(“***\n”);
elseprintf(“$$$\n”);
getch() ;
}
以上程序_______。
(A)有语法错不能通过编译(B)可以通过编译但不能通过连接
(C)输出***(D)输出$$$
5.当a=1,b=3,c=5,d=4时,执行完下面一段程序后x的值是_______。
if(a
if(celse
if(aif(belsex=3;
elsex=6;
elsex=7;
(A)1(B)2(C)3(D)6
6.若w=1,x=2,y=3,z=4,则条件表达式ww:
yy:
z的值是_______。
(A)4(B)3(C)2(D)1
二.填空题
1.以下程序运行后的输出结果是__________。
main()
{intx=10,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf("%d,%d\n",x,y);getch() ;}
2.以下程序运行后的输出结果是__________。
main()
{intk=2,i=2,m;
m=k+=i*=k;
printf("%d,%d\n",m,i);getch();}
3.以下程序运行后的输出结果是__________。
main()
{intm=5;
if(--m>5)printf(“%d\n”,m);
elseprintf(“%d\n”,m--);getch();}
4.设有变量定义:
inta=10,c=9;
则表达式(--a!
=c++)?
—a:
++c的值是_______。
5.若运行时输:
35/<回车>,则以下程序的运行结果是_______。
#include"stdio.h"
main()
{floatx,y;
charo;
doubler;
scanf(“%f%f%c”,&x,&y,&o);
switch(o)
{case‘+’:
r=x+y;break;
case‘-’:
r=x-y;break;
case‘*’:
r=x*y;break;
case‘/’:
r=x/y;break;}
printf(“%f”,r);
getch();}