当前位置:文档之家› c语言第4章 选择结构程序设计习题答案

c语言第4章 选择结构程序设计习题答案

第4章选择结构程序设计习题(P111)4.2 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?答:C语言中用1表示真,0表示假;系统按照“非0为真,0为假”判断一个逻辑量的真假。

4.3 写出下面各逻辑表达式的值。

设a=3,b=4,c=5。

(1)a+b>c&&b==c (2)a||b+c&&b-c (3)!(a>b)&&!c||1(4)!(x=a)&&(y=b)&&0 (5)!(a+b)+c-1&&b+c/2解:该题在求解过程中注意:一、优先级。

逻辑运算符(&&和||)低于算术运算符和关系运算符而高于赋值运算符,在逻辑运算符中,逻辑非最高,逻辑与其次,逻辑或最低;二、逻辑表达式的求值规则。

(P94)所以得以上表达式的值分别为:(1)0 (2)1 (3)1 (4)0 (5)14.4有3个整数a、b、c,由键盘输入,输出其中最大的数。

分析:这是一个规模较小的求最值的算法,习题1.6用函数的方法实现。

该题不用函数调用实现,但方法是最值,再依次和第二、第三个数比较得结果。

其中都要用到单分支或双分支选择结构语句。

参考程序如下:main(){ int a,b,c,max; /*定义4个整型变量,其中a,b,c存原始数据,max存最值*/printf("\ninput the value of a,b,c:"); /*提示输入*/scanf("%d%d%d",&a,&b,&c); /*格式符之间无分隔符,输入时可以以空格、回车、跳格分隔*/if(a>b) max=a;else max=b;if(max<c) max=c;printf("\nmax=%d\n",max);}法二:main(){ int a,b,c,max;printf("\ninput the value of a,b,c:");scanf("%d%d%d",&a,&b,&c);max=a;if(max<b) max=b;if(max<c) max=c;printf("\nmax=%d\n",max);}4.6有一个函数:写一段程序,输入x,输出y的值。

分析:这是一个典型的分断函数的求解应用。

运行时从键盘输入x的值,再判断其范围根据表达式计算y x值的范围,需要用到嵌套的分支选择语句。

具体方法比较多,可以先确定任意一个范围,在确定其余范围时可以用到前一条件不满足的隐含条件。

注意嵌套语句中else和if 的配对关系。

另外仍然要注意C语言表达式和数学表达式的区别,乘号(*)在C语言表达式中一定不能省略。

参考程序如下:#include<stdio.h>main(){ float x,y;printf("input x:");scanf("%f",&x);if(x<1)y=x;else if(x<10) /* 使用了隐含条件x >=1 */y=2*x-1;else /* 前两个条件都不满足,则隐含条件为 x>=10 */y=3*x-11;printf("y=%f\n",y);}对上述参考答案中加粗部分语句的改写方法:思考:还有其他的改写方法吗?请动手写一写。

4.8给出一百分制成绩,要求输出成绩等级'A'、'B'、'C'、'D'、'E'。

90以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。

分析:该题是一个多分支选择的应用。

C 语言中实现多分支选择的方法可以用if~else 嵌套语句或用switch if~else 实现的时候注意else 和if 的配对,方法同上题;用switch 语句实现的时候注意成绩处理为可以列举的值,方法是将成绩取整后整除10,这样百分制的成绩只有11种可能了。

参考程序如下:法一(if~else 语句实现): main(){ float score; /*存放输入的百分制成绩*/char grade; /*存放等级*/printf("\nPlease input the score: "); /*提示输入*/scanf("%f",&score); /* 完成输入*/while(score>100 || score < 0) /*对输入的成绩进行合法性检查*/{ printf("Score input error!\nPlease input the score:"); /*若不合法则提示重新输入*/scanf("%f",&score); /*重新输入*/}printf("\n");/*以下对成绩进行判断,计算出对应的等级*/if(score>=90) grade='A';else if(score>=80) grade='B';else if(score>=70) grade='C';else if(score>=60) grade='D';else grade='E';printf("Score=%g Grade is %c \n",score,grade); /*输出结果*/}法二(switch语句实现):main(){ float score;char grade;printf("\nPlease input the score: ");scanf("%f",&score);while(score>100 || score < 0){ printf("Score input error!\nPlease input the score:");scanf("%f",&score);}printf("\n");switch( (int)score/10 ) /*先将成绩取整,再整除10,得商的整数部分*//* 以下case后为switch后表达式计算出来可能的值*/{ case 10:case 9: grade='A'; break; /* 两个case值共用一组执行语句*/case 8: grade='B'; break;case 7: grade='C'; break;case 6: grade='D'; break;default: grade='E';}printf("Score=%g Grade is %c\n",score,grade);}4.9 给一个不多于5位的正整数,要求:求出它是几位数;分别输出每一位数字;按逆序输出各位数字。

分析:该题的关键是将一个整数分解为各位数字,可以用整除和取余相结合的方法实现,并分别用不同1~5位之间不确定,所以适合用switch开关语句实现。

参考程序如下:main(){ long int num; /* num存放输入的原始数据,由于最大的5位数是99999,它超出了int型的范围(-32768 ~ +32767)所以定义为long型*/int w,a,b,c,d,e; /* 变量w用于存放数的位数,其余存放5位数的各位数字*/printf("Please input a number(0~99999):"); /*提示输入*/scanf("%ld",&num); /* 输入长整型数据*/while( num<0 || num>99999 ) /* 检查输入数据的合法性*/{ printf("\nInput Error! Please re-enter:");scanf("%ld",&num);}/* 一组if~else的嵌套确定输入的num是几位数*/if(num<10) w=1;else if(num<100) w=2;else if(num<1000) w=3;else if(num<10000) w=4;else w=5;/* 根据位数分解num的各位数字*/switch( w ){ case 5: e=num/10000; /* 万位存于变量e中*/case 4: d=num/1000%10; /* 千位存于变量d中*/case 3: c=num/100%10; /* 百位存于变量c中*/case 2: d=num/10%10; /* 十位存于变量b中*/case 1: a=num%10; /* 个位存于变量a中*/}/* 顺序、逆序输出分解后的各位数字*/switch(w){ case 5: printf("Shunxu:%d%d%d%d%d\n", e,d,c,b,a);printf("Nixu:%d%d%d%d%d\n", a,b,c,d,e);break;case 4: printf("Shunxu:%d%d%d%d\n",a,b,c,d);printf("Nixu:%d%d%d%d\n",d,c,b,a);break;case 3: printf("Shunxu:%d%d%d\n",a,b,c);printf("Nixu:%d%d%d\n",c,b,a);break;case 2: printf("Shunxu:%d%d\n",a,b);printf("Nixu:%d%d\n",b,a);break;case 1: printf("Shunxu:%d%d\n",a,b);printf("Nixu:%d%d\n",b,a);break;}}4.11 输入4个整数,要求按照由小到大的顺序输出。

相关主题