300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > C语言程序设计第五版 谭浩强 第四章 课后习题 答案

C语言程序设计第五版 谭浩强 第四章 课后习题 答案

时间:2021-04-04 02:28:12

相关推荐

C语言程序设计第五版 谭浩强 第四章 课后习题 答案

谭浩强C语言程序设计第五版 第4章 课后习题 答案

点我看视频讲解+可运行源码

记得一键三连哦

第四章 选择结构程序设计

1. 什么是算术运算?什么是关系运算?什么是逻辑运算?

【答案解析】

算熟运算:

算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。

其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果有多级运算存在,则应先进行高级运算,再进行低一级的运算。

C语言中的算熟运算符包括:+-*/++--%等种类。

如果只存在同级运算;则从左至右的顺序进行;如果算式中有括号,则应先算括号里边,再按上述规则进行计算。

示例:$ (1 + 1)^{2} * 4+5 * 3$

解析:

先进行括号内运算1+1,然后进行乘方运算得到结果4.接下来与4相乘,得到结果16因为乘法优先级大于加法,因此先进行5*3,得到结果15最终相加得到结果31

结果:31

关系运算:

关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),而在C语言中,关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。

常见的关系运算符包括:<<=>>===!=等种类。

其中,前4种关系运算符(<、<=、>、>= )的优先级别相同,后2种(==、!=)也相同。而前4种高于后2种。

例如,>优先于==。而><优先级相同。

并且,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符(=)。

逻辑运算:

在逻辑代数中,有与、或、非三种基本逻辑运算。表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。

常见的逻辑运算符包括:&&||!等种类

&&与是双目运算符,要求有两个运算对象,表示两个运算对象都成立,则结果为真,否则结果为假。

例如:(a<b) && (x>y),表示(a<b)和(x>y)同时成立则为真。

||:是双目运算符,要求有两个运算对象,表示两个运算对象只要任意一个成立,则结果为真,否则结果为假。

例如:(a<b) && (x>y),表示(a<b)和(x>y)两个对象中任意一个成立则结果为真。

**!**是单目运算符,只要求有一个运算对象,表示取运算对象反义,运算对象为真则结果为假,运算对象结果为假则结果为真。

例如:!(a>b),表示(a>b)成立时结果为假,不成立时结果为真。

若在一个逻辑表达式中包含多个逻辑运算符,则优先次序为:!>&&>||。当然若一个逻辑表达式中包含括号括起来的子逻辑,则优先括号内的子逻辑判断。

示例:

(1>2)||(2>3)&&(4>3) 结果为0

!(1>2)||(2>3)&&(4>3)结果为1

注:&&优先级大于||,((2>3)&&(4>3))无法同时成立,则结果为假,然后与(1>2)结果进行逻辑或运算,两者都为假因此第一次结果为假。 而第二次!优先级最高,先对(1>2)的结果取逻辑非,得到结果为真,因此结果为真。

2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

答案:

在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。

逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。

对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值为1

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

解题思路:

关系运算符的优先级高于赋值运算符,但是低于算术运算符;&&表示两边条件同为真则成立,||表示两边条件任意一个为真则成立,!取条件反义。逻辑运算符优先级: ! > && > ||有括号优先括号。

3.1 题目:a + b > c && b == c -> 3+4>5&&4==5

解析:3+4>5 优先3+4得到结果7,因此7>5结果为真; 4==5为假,一真一假逻辑与最终结果为假。

答案:0

#include <stdio.h>int main(){int a = 3, b = 4, c = 5;printf("%d\n", a || b + c && b - c);system("pause");//这一句是为了让控制台不退出return 0;}

3.2 题目:a || b + c && b - c -> 3||4 + 5 && 4-5

解析:优先算术运算4+5得到7,非0则为真,4-5得到-1,非0则为真,接下来逻辑与判断,最终逻辑或判断

答案:1

#include <stdio.h>int main(){int a = 3, b = 4, c = 5;printf("%d\n", a || b + c && b - c);system("pause");//这一句是为了让控制台不退出return 0;}

3.3 题目:!(a > b) && !c || 1 -> !(3>4) && !5 || 1

解析: !优先级最高,!(3>4)最终结果为真,!5为假; 其次 &&,真&&假得到假,最终||,1为真,假或真为真

答案:1

#include <stdio.h>int main(){int a = 3, b = 4, c = 5;printf("%d\n", !(a > b) && !c || 1);system("pause");//这一句是为了让控制台不退出return 0;}

3.4 题目:!(x = a) && (y = b) && 0 -> !(x=3) && (y=4)&&0

解析:这里&&优先级最低是最后一个逻辑运算,因此不管如何,最终&&0,则肯定为假

答案:假-0

#include <stdio.h>int main(){int a = 3, b = 4, c = 5;int x, y;printf("%d\n", !(x = a) && (y = b) && 0);system("pause");//这一句是为了让控制台不退出return 0;}

3.5 题目:!(a + b) + c - 1 && b + c / 2 -> !(3+4)+5-1 && 4+5/2

解析:在vs中优先对(a+b)取非得到0,0+5-1结果为4,因此最终为真(此题涉及不同平台结果不同的问题,因为在有的平台下编译器会优先算术运算,则最终取非得到结果为假)

**答案: ** 1

#include <stdio.h>int main(){int a = 3, b = 4, c = 5;printf("%d\n", !(a + b) + c - 1);printf("%d\n", !(a + b) + c - 1 && b + c / 2);system("pause");//这一句是为了让控制台不退出return 0;}

4. 有3个整数a, b, c,由键盘输入,输出其中最大的数。

解题思路:每个数字两两与剩余两个数字进行比较,若比剩下的两个数大则最大,例如:a>b && a>c则a是最大的

答案:

#include <stdio.h>int main(){int a, b, c;scanf("%d %d %d", &a, &b, &c);if (a == b && a == c) {printf("Three numbers are equal\n");}else if (a == b && a > c) {printf("a and b are the largest number\n", a); }else if (a == c && a > b) {printf("a and c are the largest number\n", a); }else if (b == c && b > a) {printf("c and b are the largest number\n", a); }else if (a > b && a > c) {printf("a=%d is the largest number\n", a); }else if (b > a && b > c) {printf("b=%d is the largest number\n", b); }else {printf("c=%d is the largest number\n", c); } return 0;}

5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。

解题思路:首先判断输入的数字是否大于1000且是正数,然后使用sqrt函数对数据进行取平方根,最主要的是最终在输出是调整输出格式,小数部分为0位,只需要正数部分,且整数部分不会超过4位,

答案:

#include <stdio.h>#include <math.h>int main(){float a, b;scanf_s("%f", &a);if (a >= 1000 || a < 0) {printf("请输入小于1000的正数\n");scanf_s("%f", &a);b = sqrt(a);}else {b = sqrt(a);}printf("a=%4.0f, b=%4.0f\n", a, b);system("pause");//这一句是为了让控制台不退出return 0;}

6. 有一个函数,编写程序,输入x的值,输出y相应的值。

y = { x ( x < 1 ) 2 x − 1 ( 1 < = x < 10 ) 3 x − 11 ( x > = 10 ) y= \begin {cases} x\qquad\qquad\ \ \ (x<1)\\2x-1\qquad\ \ (1<=x<10)\\3x-11\qquad(x>=10) \end{cases} y=⎩⎪⎨⎪⎧​x(x<1)2x−1(1<=x<10)3x−11(x>=10)​

解题思路:根据输入的不同x值进行条件判断,不同的条件采用不同的表达式进行计算即可

答案:

#include <stdio.h>int main(){int x, y;scanf_s("%d", &x);if (x < 1) {y = x;}else if (x >= 1 && x < 10) {y = 2 * x - 1;}else {y = 3 * x - 11;}printf("y = %d\n", y);system("pause");//这一句是为了让控制台不退出return 0;}

7. 有一个函数,

y = { − 1 ( x < 0 ) 0 ( x = 0 ) 1 ( x > 0 ) y= \begin {cases} -1\qquad(x<0) \\ 0\qquad\ \ \ (x=0) \\ 1\qquad\ \ \ (x>0) \end{cases} y=⎩⎪⎨⎪⎧​−1(x<0)0(x=0)1(x>0)​

有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后,上机运行程序,观察和分析结果。

#include <stdio.h>int main(){int x, y;printf("enter x:");scanf("%d", &x);y=-1;if (x != 0)if (x > 0)y=1;elsey=0;printf("x=%d,y=%d\n", x, y);return 0;}

解题思路:if语句使用过程中,else总是匹配距离自己最近的且没有配对的if,因此x!=0具有两种情况x>0和x<0;因此x==0时y保持-1;x!=0&&x>0时y=1;x!=0&&x<0时y=0。

流程图:

答案:

#include <stdio.h>int main(){int x, y;printf("enter x:");scanf("%d", &x);y=0;if (x >= 0)if (x > 0) y=1;else y=-1;printf("x=%d,y=%d\n", x, y);return 0;}

解题思路:if语句使用过程中,else总是匹配距离自己最近的且没有配对的if,因此x>=0具有两种情况x>0和x0;因此x<0时y保持0;x>=0&&x>0时y=1;x>=0&&x0时y=-1。

流程图:

答案:

8. 给出一百分制成绩,要求输出成绩等级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,8089分为’B’,7079分为’C’ ,60~69分为’D’ ,60分以下为’E’。

解题思路:根据不同的阶段成绩区间作为成绩的判断条件,属于哪个区间则输出对应等级即可

答案:

#include <stdio.h>int main(){int score;printf("enter score:");scanf_s("%d", &score);if (score >= 90) {printf("A\n");}else if (score >= 80 && score < 90) {printf("B\n");}else if (score >= 70 && score < 80) {printf("C\n");}else if (score >= 60 && score < 70) {printf("D\n");}else {printf("E\n");}system("pause");return 0;}

9. 给一个不多于5位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为321,应输出123。

①求出它是几位数;

解题思路:大于10000就是5位,否则大于1000就是四位,否则大于100是三位…

答案:

#include <stdio.h>int main(){int num;printf("enter num:");scanf_s("%d", &num);if (num > 99999 || num < 0) {printf("请输入0~99999之间的正数\n");return -1;}if (num >= 10000) {printf("5\n");}else if (num >= 1000) {printf("4\n");}else if (num >= 100) {printf("3\n");}else if (num >= 10) {printf("2\n");}else {printf("1\n");}system("pause");return 0;}

②分别输出每一位数字;

解题思路:99999除以10000则输出9;9999除以1000则输出9,…

答案:

#include <stdio.h>int main(){int num;printf("enter num:");scanf_s("%d", &num);if (num > 99999 || num < 0) {printf("请输入0~99999之间的数字\n");return -1;}if (num / 10000 > 0) {//取出万位数字printf("%d ", num / 10000);}if (num%10000 >= 1000) {//取余10000则可以取出低四位的数据,除以1000则得到千位的数字printf("%d ", (num % 10000) / 1000);}if (num%1000 >= 100) {//取余1000则可以取出低三位的数据,除以100则得到百位的数字printf("%d ", (num % 1000) / 100);}if (num%100 >= 10) {//取余100则可以取出低两位的数据,除以10则得到十位的数字printf("%d ", (num % 100) / 10);}if (num%10 >= 0) {//取余10则取出个位数字printf("%d ", num % 10);}printf("\n");system("pause");return 0;}

③按逆序输出各位数字,例如原数为321,应输出123。

解题思路:思路与第二题相同,只不过将整个过程逆序即可

答案:

#include <stdio.h>int main(){int num;printf("enter num:");scanf_s("%d", &num);if (num > 99999 || num < 0) {printf("请输入0~99999之间的数字\n");return -1;}if (num % 10 >= 0) {printf("%d ", num % 10);}if (num % 100 >= 10) {printf("%d ", (num % 100) / 10);}if (num % 1000 >= 100) {printf("%d ", (num % 1000) / 100);}if (num % 10000 >= 1000) {printf("%d ", (num % 10000) / 1000);}if (num / 10000 > 0) {printf("%d ", num / 10000);}printf("\n");system("pause");return 0;}

10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7. 5%;200000<I≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提成;400000<<I≤600000元时,高于400000元的部分按3%提成;600000<1≤1000000时,高于600000元的部分按1.5%提成;I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:(1) 使用if语句编写程序。(2) 使用switch语句编写程序。

(1) 使用if语句编写程序。

解题思路:先将每一档的最大奖金算出来,在某一个区间时,则那小于这一档的奖金加上多出部分的奖金即可,例如:

先列出100000档的奖金是10000,则180000就是10000 + (180000-100000) * 0.075;

列出200000档的奖金是第一档加上多出100000部分的7.5%得到17500,则300000就是17500 + (300000-200000)*0.05;

答案:

#include <stdio.h>int main(){double I, salary = 0;printf("enter performance:");scanf_s("%lf", &I);if (I < 0) {printf("请输入一个正数\n");system("pause");return -1;}double salary1 = 100000 * 0.1;//10万的奖金double salary2 = (200000 - 100000) * 0.075 + salary1;//20万的奖金double salary3 = (400000 - 200000) * 0.05 + salary2;//40万的奖金double salary4 = (600000 - 400000) * 0.03 + salary3;//60万的奖金double salary5 = (1000000 - 600000) * 0.015 + salary4;//100万的奖金if (I <= 100000) {salary = I * 0.1;//小于100000按10%提成}else if (I > 100000 && I <= 200000) {salary = salary1 + (I - 100000) * 0.075;//多出10万的按比例计算,加上10w的奖金}else if (I > 200000 && I <= 400000) {salary = salary2 + (I - 200000) * 0.05;//多出20万的按比例计算,加上20w的奖金}else if (I > 400000 && I <= 600000) {salary = salary3 + (I - 400000) * 0.03;//多出40万的按比例计算,加上40w的奖金}else if (I > 600000 && I <= 1000000) {salary = salary4 + (I - 600000) * 0.015;//多出60万的按比例计算,加上60w的奖金}else if (I > 1000000){salary = salary5 + (I - 1000000) * 0.01;//多出100万的按比例计算,加上100w的奖金}printf("salary:%f\n", salary);system("pause");return 0;}

(2) 使用switch语句编写程序。

解题思路:与第一题思路没有太大差别,区别在于switch语句的case子句中需要是一个常量整数,并且switch中若子句中没有break将循序向下执行,直到遇到break才会跳出switch语句,如果这时候将利润除以10w,则得到09的数字,其中0表示小于10w,1表示介于1020w,2、3表示介于2040w,4、5表示介于4060w,6、7、8、9表示介于60~100w,否则就是大于100w

答案:

#include <stdio.h>int main(){double I, salary = 0;printf("enter performance:");scanf_s("%lf", &I);if (I < 0) {printf("请输入一个正数\n");system("pause");return -1;}double salary1 = 100000 * 0.1;//大于100000时0~100000的奖金double salary2 = (200000 - 100000) * 0.075 + salary1;//大于200000时0~20万的奖金double salary3 = (400000 - 200000) * 0.05 + salary2;//大于400000时0~40万的奖金double salary4 = (600000 - 400000) * 0.03 + salary3;//大于600000时0~60万的奖金double salary5 = (1000000 - 600000) * 0.015 + salary4;//大于1000000时0~100万的奖金int grade = I / 100000;switch(grade) {case 0:salary = I * 0.1; break;case 1:salary = salary1 + (I - 100000) * 0.075; break;case 2://会顺序执行到下一个break处case 3:salary = salary2 + (I - 200000) * 0.05; break;case 4:case 5:salary = salary3 + (I - 400000) * 0.03; break;case 6:case 7:case 8:case 9:salary = salary4 + (I - 600000) * 0.015; break;default:salary = salary5 + (I - 1000000) * 0.01; break;}printf("salary:%f\n", salary);system("pause");return 0;}

11. 输入4个整数,要求按由小到大的顺序输出。

解题思路:四个数中先找到最小的,剩下的三个数中找到第二小的,剩下的两个数中找到第三小的。

答案:

#include <stdio.h>int main(){int a, b, c, d;int max_num;scanf_s("%d %d %d %d", &a, &b, &c, &d);int tmp;//找到最小的数if (a > b) {tmp = a; a = b; b = tmp; // a>b两个数据交换,则给a存储小的b}if (a > c) {tmp = a; a = c; c = tmp;}if (a > d) {tmp = a; a = d; d = tmp;}//找到第二小的数,不需要和最小的数比较if (b > c) {tmp = b; b = c; c = tmp;}if (b > d) {tmp = b; b = d; d = tmp;}//找到第三小的数据,不需要和第一和第二小比较if (c > d) {tmp = c; c = d; d = tmp;}printf("%d %d %d %d\n", a, b, c, d);system("pause");return 0;}

12. 有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

解题思路:塔的半径为1m,则x坐标小于-3或者大于3,以及y坐标大于3或者小于-3则都是0m的建筑;其余则判断输入的坐标是否在各个圆塔的圆形范围内。该点到各个圆心的距离是否大于1,小于则是10m建筑,否则为0m建筑。

math.h中提供了fabs(double)求一个浮点数的绝对值,输入x,y坐标

fabs(fabs(x) - 2)得到输入坐标距离圆心的横轴距离;

fabs(fabs(y) - 2)得到舒服坐标距离圆心的纵轴距离;

三角形两个直角边长平方相加,然后开平方根得到第三边长,若大于1,则不再圆塔范围内。

答案:

#include <stdio.h>#include <math.h>void main(){int h;double x, y, m, n, r;printf("Please input a coordinate (x,y):");scanf_s("%lf,%lf", &x, &y);if (fabs(x) > 3 || fabs(y) > 3) {h = 0;printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h);return 0;}m = fabs(x) - 2; n = fabs(y) - 2;r = sqrt(m * m + n * n);if (r > 1)h = 0;elseh = 10;printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h);system("pause");return 0;}

点我看视频讲解+可运行源码

记得一键三连哦

更多相关文章

C语言程序设计第五版 谭浩强 第五章 课后习题 答案

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。