C语言学习知识程序设计第3版何钦铭颜晖第3章分支结构.docx
《C语言学习知识程序设计第3版何钦铭颜晖第3章分支结构.docx》由会员分享,可在线阅读,更多相关《C语言学习知识程序设计第3版何钦铭颜晖第3章分支结构.docx(18页珍藏版)》请在冰点文库上搜索。
C语言学习知识程序设计第3版何钦铭颜晖第3章分支结构
第3章分支结构
【练习3-1】例3-4中使用else-if语句求解多分段函数,为了检查else-if语句的三个分支是否正确,已经设计了三组测试用例,请问还需要增加测试用例吗?
为什么?
如果要增加,请给出具体的测试用例并运行程序。
解答:
最好再增加两组测试用例,因为尚未对分段函数参数的边界值进行测试。
可再给出x=0和x=15时的两种情况。
【练习3-2】计算符号函数的值:
输入一个整数x,计算并输出下列分段函数sign(x)的值。
-1x<0
y=sign(x)=0x=0
1x>0
解答:
#include
intmain(void)
{
intx,y;
printf("Enterx:
");
scanf("%d",&x);
if(x>0)y=1;
elseif(x==0)y=0;
elsey=-1;
printf("sign(%d)=%d\n",x,y);
return0;
}
【练习3-3】统计学生平均成绩与及格人数:
输入一个正整数n,再输入n个学生的成绩,计算平均成绩,并统计所有及格学生的人数。
试编写相应程序。
解答:
#include
intmain(void)
{
intcount,i,n;
doublegrade,total;
printf("Entern:
");
scanf("%d",&n);
total=0;
count=0;
for(i=1;i<=n;i++){
printf("Entergrade#%d:
",i);
scanf("%lf",&grade);
total=total+grade;
if(grade>=60)count++;
}
printf("Gradeaverage=%.2f\n",total/n);
printf("Numberofpass=%d\n",count);
return0;
}
【练习3-4】统计字符:
输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
试编写相应程序。
解答:
#include
intmain(void)
{
inti;
intblank,digit,letter,other;
charc;
blank=digit=letter=other=0;
for(i=1;i<=15;i++){
c=getchar();
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
letter++;
elseif(c>='0'&&c<='9')
digit++;
elseif(c==''||c=='\n')
blank++;
else
other++;}
printf("letter=%d,blank=%d,digit=%d,other=%d\n",letter,blank,digit,other);
return0;
}
【练习3-5】输出闰年:
输出21世纪中截至某个年份之前的所有闰年年份。
判断闰年的条件是:
能被4整除但不能被100整除,或者能被400整除。
试编写相应程序。
解答:
#include
intmain(void)
{
intyear;
printf("Enteryear:
");
scanf("%d",&year);
for(;year>=2000;year--){
if((year%4==0&&year%100!
=0)||year%400==0)
printf("Itisaleapyear\n");
else
printf("Itisnotaleapyear\n");}
return0;
}
【练习3-6】在例3-8程序中,如果把switch语句中所有的break都去掉,运行结果会改变吗?
如果有变化,输出什么?
为什么?
解答:
如果去掉所有的break语句,运行结果会改变,输出price=0.0,因为不管choice值与其中某个常量表达式相等,当去掉break语句时,其后的所有语句段都将运行,故每次都将执行到price=0.0语句为止。
【练习3-7】成绩转换:
输入一个百分制成绩,将其转换为五分制成绩。
百分制成绩到五分制成绩的转换规则:
大于或等于90分为A,小于90分且大于或等于80分为B,小于80分且大于或等于70分为C,小于70分且大于或等于60分为D,小于60分为E。
试编写相应程序。
解答:
#include
intmain(void)
{
doublegrade;
printf("Inputgrade:
");
scanf(“%lf”,&grade);
If(grade>=90)printf("A");
elseif(grade>=80)printf("B");
elseif(grade>=70)printf("C");
elseif(grade>=60)printf("D");
elseprintf("E");
return0;
}
或
#include
intmain(void)
{
doublescore;
chargrade;
printf("Inputyourscore:
");
scanf("%lf",&score);
switch(int(score/10)){
case10:
case9:
grade='A';break;
case8:
grade='B';break;
case7:
grade='C';break;
case6:
grade='D';break;
default:
grade='E';break;
}
printf("Yourgradeis:
%c",grade);
return0;
}
【练习3-8】查询水果的单价:
有4种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄(grapes),单价分别是3.00元/公斤,2.50元/公斤,4.10元/公斤和10.20元/公斤。
在屏幕上显示以下菜单(编号和选项),用户可以连续查询水果的单价,当查询次数超过5次时,自动退出查询;不到5次时,用户可以选择退出。
当用户输入编号1~4,显示相应水果的单价(保留两位小数);输入0,退出查询;输入其他编号,显示价格为0。
试编写相应程序。
[1]apples
[2]pears
[3]oranges
[4]grapes
[0]Exit
解答:
#include
intmain(void)
{
intri;
intchoice;
floatprice;
for(ri=1;ri<=5;ri++){
printf("[1]apples\n");
printf("[2]pears\n");
printf("[3]oranges\n");
printf("[4]grapes\n");
printf("[0]Exit\n");
scanf("%d",&choice);
if(choice==0)
break;
else{
switch(choice){
case1:
price=3.00;break;
case2:
price=2.50;break;
case3:
price=4.10;break;
case4:
price=10.20;break;
default:
price=0;break;
}
printf("price=%0.2f\n",price);
}
return0;
}
【练习3-9】请读者重新编写例3-4的程序,要求使用嵌套的if-else语句,并上机运行。
解答:
#include
intmain(void)
{
doublex,y;
printf("Enterx:
");
scanf("%lf",&x);
if(x>15){
y=2.5*x-10.5;
}
else{
if(x<0)
y=0;
else
y=4*x/3;
}
printf("f(%.2f)=%.2f\n",x,y);
return0;
}
【练习3-10】在例3-12中,改写if语句前,y=x+1;和y=x+2;两条语句的执行条件是什么?
改写后呢?
解答:
改写前:
y=x+1的执行条件是x<1;y=x+2的执行条件是1<=x<2。
改写后:
y=x+1的执行条件是x<1;y=x+2的执行条件是2<=x。
习题3
一.选择题
1.能正确表示逻辑关系:
“a≥10或a≤0”的C语言表达式是D。
A.a>=10ora<=0B.a>=0|a<=10
C.a>=10&&a<=0D.a>=10||a<=0
2.在嵌套使用if语句时,C语言规定else总是C。
A.和之前与其具有相同缩进位置的if配对
B.和之前与其最近的if配对
C.和之前与其最近的且不带else的if配对
D.和之前的第一个if配对
3.下列叙述中正确的是D。
A.break语句只能用于switch语句
B.在switch语句中必须使用default
C.break语句必须与switch语句中的case配对使用
D.在switch语句中,不一定使用break语句
1x>0
4.有一函数y=0x=0,以下程序段中错误的是C。
-1x<0
A.if(x>0)y=1;B.y=0;
elseif(x==0)y=0;if(x>0)y=1;
elsey=-1;elseif(x<0)y=-1;
C.y=0;D.if(x>=0)
if(x>=0);if(x>0)y=1;
if(x>0)y=1;elsey=0;
elsey=-1;elsey=-1;
5.下列程序段的输出结果是C。
intmain(void)
{
inta=2,b=-1,c=2;
if(a
if(b<0)
c=0;
elsec++;
printf("%d\n",c);
return0;
}
A.0B.1C.2D.3
6.下列程序段的输出结果是A。
intmain(void)
{
intx=1,a=0,b=0;
switch(x)
{
case0:
b++;
case1:
a++;
case2:
a++;b++;
}
printf("a=%d,b=%d\n",a,b);
return0;
}
A.a=2,b=1B.a=1,b=1
C.a=1,b=0D.a=2,b=2
7.在执行以下程序时,为使输出结果为:
t=4,则给a和b输入的值应满足的条件是C。
intmain(void)
{
inta,b,s,t;
scanf("%d,%d",&a,&b);
s=1;t=1;
if(a>0)s=s+1;
if(a>b)t=s+t;
elseif(a==b)t=5;
elset=2*s;
printf("t=%d\n",t);
return0;
}
A.a>bB.a
C.0a>b
二、填空题
1.表示条件:
1010&&x<100)||(x<0)。
2.已知a=7.5,b=2,c=3.6,则表达式a>b&&c>a||a
c>b的值为0。
3.若从键盘输入58,则以下程序段的输出结果是585858。
intmain(void)
{
inta;
scanf("%d",&a);
if(a>50)printf("%d",a);
if(a>40)printf("%d",a);
if(a>30)printf("%d",a);
return0;
}
4.下列程序运行的输出结果是9。
intmain(void)
{
charc=‘b’;
intk=4;
switch(c)
{
case'a':
k=k+1;break;
case'b':
k=k+2;
case'c':
k=k+3;
}
printf("%d\n",k);
return0;
}
3.程序设计题
1.比较大小:
输入3个整数,按从小到大的顺序输出。
试编写相应程序。
解答:
#include
intmain(void)
{
inta,b,c;
charop='<';
printf("Entera:
");
scanf("%d",&a);
printf("Enterb:
");
scanf("%d",&b);
printf("Enterc:
");
scanf("%d",&c);
if(a>b)
if(b>c)printf("%d%c%d%c%d",c,op,b,op,a);
else{
if(a>c)printf("%d%c%d%c%d",b,op,c,op,a);
elseprintf("%d%c%d%c%d",b,op,a,op,c);
}
else{
if(a>c)printf("%d%c%d%c%d",c,op,a,op,b);
else{
if(belseprintf("%d%c%d%c%d",a,op,c,op,b);
}
}
return0;
}
2.高速公路超速处罚:
按照规定,在高速公路上行驶的机动车,超过本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。
请编写程序根据车速和限速判别对该机动车的处理。
解答:
#include
intmain(void)
{
doublespeed,rate_limiting;
printf("Enterspeed:
");
scanf("%lf",&speed);
printf("Enterrate_limiting:
");
scanf("%lf",&rate_limiting);
if(rate_limiting*1.5>speed>rate_limiting*1.1)
printf("罚款200元");
elseif(speed>rate_limiting*1.5)
printf("罚款200元,并吊销驾驶证");
else;
return0;
}
3.出租车计价:
某城市普通出租车收费标准如下:
起步里程3公里,起步费10元;超起步里程后10公里内,每公里2元,超过10公里以上的部分加收50%的空驶补贴费,即每公里3元;营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
运价计费尾数四舍五入,保留到元。
编写程序,输入行驶里程(公里)与等待时间(分钟),计算并输出乘客应支付的车费(元)。
解答:
#include
intmain(void)
{
intmile,time,cost;
printf("Inputmileandtime:
");
scanf("%d%d",&mile,&time);
cost=0;
mile=mile+time/5;
if(mile<=3)
cost=10;
elseif(mile<=13)
cost=10+(mile-3)*2;
else
cost=10+10*2+(mile-13)*3;
printf("cost=%d\n",cost);
return0;
}
4.统计学生成绩:
输入一个正整数n,再输入n个学生的成绩,统计五分制成绩的分布。
百分制成绩到五分制成绩的转换规则:
大于或等于90分为A,小于90分且大于或等于80分为B,小于80分且大于或等于70分为C,小于70分且大于或等于60分为D,小于60分为E。
试编写相应程序。
解答:
#include
intmain(void)
{
intmark,n,i,sum;
doubleaverage;
intcounta,countb,countc,countd,counte;
printf("Entern:
");
scanf("%d",&n);
counta=countb=countc=countd=counte=sum=0;
for(i=1;i<=n;i++){
scanf("%d",&mark);
sum=sum+mark;
if(mark>=90)counta++;
elseif(mark>=80)countb++;
elseif(mark>=70)countc++;
elseif(mark>=60)countd++;
elsecounte++;
}
average=sum*1.0/n;
printf("average=%.1f\n",average);
printf("A:
%d,B:
%d,C:
%d,D:
%d,E:
%d\n",counta,countb,countc,countd,counte);
return0;
}
5.三角形判断:
输入平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验他们能否构成三角形。
如果这3个点能构成一个三角形,输出周长和面积(保留2位小数);否则,输出“Impossible”。
试编写相应程序。
提示:
在一个三角形中,任意两边之和大于第三边。
三角形面积计算公式如下:
解答:
#include
#include
intmain(void)
{
doublex1,y1,x2,y2,x3,y3;
doublearea,l,a,b,c,s;
printf("Enterx1andy1:
");
scanf("%lf%lf",&x1,&y1);
printf("Enterx2andy2:
");
scanf("%lf%lf",&x2,&y2);
printf("Enterx3andy3:
");
scanf("%lf%lf",&x3,&y3);
a=sqrt(pow(fabs(x2-x1),2)+pow(fabs(y2-y1),2));
b=sqrt(pow(fabs(x3-x2),2)+pow(fabs(y3-y2),2));
c=sqrt(pow(fabs(x1-x3),2)+pow(fabs(y1-y3),2));
if(a+b>c&&a+c>b&&b+c>a){
l=a+b+c;
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("l=%.2lf\n",l);
printf("area=%.2lf\n",area);
}
else
printf("Impossible");
return0;
}