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

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

时间:2023-02-18 10:35:24

相关推荐

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

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

解析:C语言中这些东西太多了,这里只讲最常见的。

(1)算术运算最常见的有:加减乘除、自增、自减、取模

运算符(优先级):++、--*、/、%+、-

(2)关系运算最常见的是关系运算:大于、小于、等于、大于等于、小于等于、不等于

运算符(优先级):>、<、>=、<===、 !=

(3)逻辑运算基本就是再说 “与或非” 三兄弟

运算符(优先级):!&&、||

&&:逻辑与,要求左右两边同时为真输出才会为真;

||:逻辑或,符号左右两边只需要有一个为真输出便为真;

!:逻辑非,讲符号右边的内容在逻辑上取反;

注:这里的 !非,优先等级非常高。

以上所提到的所有操作符优先级排列:

++、--剩下的算数运算符;关系运算符;剩下逻辑运算符

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

解析:纯概念题,书上有原话,我简单概述一下。

在C语言中判断真假很简单:“0为假,非0为真”,具体判断又分为两种:“逻辑常量和逻辑变量”

逻辑常量只有两个:“0和1,0为假,1为真”.

逻辑变量,就跟他的名字一样,会变!因此,逻辑变量可以是数字、字母、符号甚至是表达式,判断方式也是0为假,非0为真。

3. 写出下面各逻辑表达式的值。设a=3,b=4,c=5。

解析:这一题就是上面两题的综合实践版。

(1)a+b>c && b ==c ——>3+4>5&& 4==5 ——>7>c&& 4==5 ——>真 && 假——>假

(2)a||b+c && b-c ——> 3||4+5 && 4-5 ——> 3||9 && -1 ——>真||真&&真 ——>真

(3)!(a>b) && !c||1 ——> !(3>4) && !5||1 ——>!(假) && !真||真——>真 && 假||真——>真

(4)!(x=a) && (y=b) && 0 ——>假

(5)!(a+b)+c-1 && b+c/2 ——> !(3+4)+5-1 && 4+5/2 ——> !(7)+4 && 6.5——> 0+4 && 6.5 ——>真

注:逻辑运算符优先级:!> && > ||。0为假,非0为真!非0为真!非0为真!重要的事情说三遍,这里的负数也是真!第五题跟编译器有关系,这里说的优先级都是VS的,用其他的编译器答案可能是假。

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

解析:这个题目比较简单,就是一个很单纯的关系运算,我们可以使用if语句进行操作,放代码!

int main(){int num1, num2, num3;int tmp = 0;scanf("%d %d %d", &num1, &num2, &num3);if (num1 <= num2){tmp = num1;num1 = num2;num2 = tmp;}if (num1 <= num3){tmp = num1;num1 = num3;num3 = tmp;}printf("最大值为:%d\n", num1);return 0;}

运算结果:

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

解析:这一题有歧义,“输出其整数部分”,是说输出四舍五入后得整数还是没有四舍五入得整数?因此我这里给了两个答案,大家按需索取。要注意这里要用到一个<math.h>的函数sqrt。放代码!

(1)四舍五入版

int main(){while (1){int num1;printf("请输入1-999的整数:>");scanf("%d", &num1);if (num1 >= 1000){printf("\n输入错误请重新输入!\n");}else{printf("%d开平方得:%.0f", num1, sqrt((double)num1));return 0;}}}

运算结果:

(2)非四舍五入版:

int main(){while (1){int num1;printf("请输入1-999的整数:>");scanf("%d", &num1);if (num1 >= 1000){printf("\n输入错误请重新输入!\n");}else{printf("%d开平方得:%d", num1, (int)sqrt((double)num1));return 0;}}

运算结果:

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

解析:这题跟第五题是一样的,运用了之前讲到的算数运算、逻辑运算和判断语句,程序的框架就是用if去分割。题目简单而且不严谨,一般数学运算不会总是整数,但是我相信谭浩强是想要用整数去运算的,放代码!

int main(){int x, y;printf("请输入x的值:");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);return 0;}

当x<1时,运算结果:

当1<=x<10时。运算结果:

当x>=10时。运算结果:

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

解析:else匹配在最近的if上,因此这两个人写的程序都会出现else不匹配的情况,需要在else上的if套上{}。

(1)

当 x == 0时y = -1;当x > 0时y = 1;当x<0时y = 0

(2)

当 x <0时y = 0;当x > 0时y = 1;当x = 0时y = -1

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

解析:这题的关键在于判断语句和关系运算,基本没有难点。

int main(){while (1){int num = 0;printf("请输入成绩(0-100):>");scanf("%d", &num);if (num >= 0 && num <= 100){if (num >= 90){printf("成绩等级为'A'\n");}else if (num >= 80 && num <= 89){printf("成绩等级为'B'\n");}else if (num >= 70 && num <= 79){printf("成绩等级为'C'\n");}else if (num >= 60 && num <= 69){printf("成绩等级为'D'\n");}else{printf("成绩等级为'E'\n");}/*如果把return 0移动到这里这个循环的作用就只有判断范围*/}else{printf("输入错误,请重新输入!\n");}}return 0;//return 0在这里就可以循环使用

运算结果:

9. 给一个不多于5位的正整数,要求:

①求出它是几位数;

②分别输出每一位数字;

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

解析:这题的难点在于如何逆序,可以使用整除和取模来做,取10的模获得的就是个位的数字,整除10获得的就是十位的数字,整除100获得的就是百位的数字,整除1000获得的就是千位的数字,整除10000获得的就是万位的数字。可以用if语句使用判断数据范围的方法来做。

void print_ni(int num, int count){if (num > 0){printf("%d ", num % 10);print_ni(num / 10, ++count);}}void print(int num, int count){if (num > 0){print(num / 10, ++count);printf("%d ", num % 10);++count;}else{printf("共%d位\n", count);}}int main(){while (1){int num = 0;int count = 0;printf("请输入0-99999的数字:>");scanf("%d", &num);printf("\n");if (num > 99999 || num < 0){printf("输入错误,请重新输入!\n");}else{print_ni(num, count);printf("\n");print(num, count);}printf("\n");}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语句

解析:这一题跟前面的是一样的,就是题目长,用if语句进行分类讨论就可以了,直接放代码!

double bonuses(double I){double bonus = 0.0;double bonus1 = 100000 * 0.1;//10万的奖金double bonus2 = (200000 - 100000) * 0.075 + bonus1;//20万的奖金double bonus3 = (400000 - 200000) * 0.05 + bonus2;//40万的奖金double bonus4 = (600000 - 400000) * 0.03 + bonus3;//60万的奖金double bonus5 = (1000000 - 600000) * 0.015 + bonus4;//100万的奖金if (I <= 100000 && I >= 0){bonus = I * 0.1;//小于100000按10%提成}else if (I > 100000 && I <= 200000) {bonus = bonus1 + (I - 100000) * 0.075;//多出10万的按比例计算,加上10w的奖金}else if (I > 200000 && I <= 400000) {bonus = bonus2 + (I - 200000) * 0.05;//多出20万的按比例计算,加上20w的奖金}else if (I > 400000 && I <= 600000) {bonus = bonus3 + (I - 400000) * 0.03;//多出40万的按比例计算,加上40w的奖金}else if (I > 600000 && I <= 1000000) {bonus = bonus4 + (I - 600000) * 0.015;//多出60万的按比例计算,加上60w的奖金}else if (I > 1000000) {bonus = bonus5 + (I - 1000000) * 0.01;//多出100万的按比例计算,加上100w的奖金}return bonus;}int main(){while (1){double I, bonus = 0;printf("请输入利润:>");scanf_s("%lf", &I);printf("\n");if (I < 0){printf("请输入一个正数\n");}bonus = bonuses(I);printf("奖金为:%.2f\n", bonus);}return 0;}

(2)switch语句

解析:switch语句稍微难一点点,但是!我们看到题目里是以10w递增的,所以这里我们可以用I/10w来做分级,放代码!

double bonuses(double I){double bonus = 0.0;double bonus1 = 100000 * 0.1;//10万的奖金double bonus2 = (200000 - 100000) * 0.075 + bonus1;//20万的奖金double bonus3 = (400000 - 200000) * 0.05 + bonus2;//40万的奖金double bonus4 = (600000 - 400000) * 0.03 + bonus3;//60万的奖金double bonus5 = (1000000 - 600000) * 0.015 + bonus4;//100万的奖金int grade = I / 100000;switch (grade){case 0:bonus = I * 0.1; break;case 1:bonus = bonus1 + (I - 100000) * 0.075; break;case 2://会顺序执行到下一个break处case 3:bonus = bonus2 + (I - 200000) * 0.05; break;case 4:case 5:bonus = bonus3 + (I - 400000) * 0.03; break;case 6:case 7:case 8:case 9:bonus = bonus4 + (I - 600000) * 0.015; break;default://这里用default做利润I>100w的情况bonus = bonus5 + (I - 1000000) * 0.01; break;}return bonus;}int main(){while (1){double I, bonus = 0;printf("请输入利润:>");scanf_s("%lf", &I);printf("\n");if (I < 0){printf("请输入一个正数\n");}bonus = bonuses(I);printf("奖金为:%.2f\n", bonus);}return 0;}

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

解析:这一题和之前一题基本是一致的,就是简单的比较大小重新赋值。

int main(){int num1, num2, num3, num4, temp;scanf("%d %d %d %d", &num1, &num2, &num3, &num4);/*---------------------------------------------*/if (num1 > num2)//轮番比较确定出最小的数字{temp = num1;num1 = num2;num2 = temp;}if (num1 > num3){temp = num1;num1 = num3;num3 = temp;}if (num1 > num4){temp = num1;num1 = num4;num4 = temp;}/*---------------------------------------------*/if (num2 > num3)//轮番比较确定出第二小的数字{temp = num2;num2 = num3;num3 = temp;}if (num2 > num4){temp = num2;num2 = num4;num4 = temp;}/*---------------------------------------------*/if (num3 > num4)//轮番比较确定出第三小的数字{temp = num3;num3 = num4;num4 = temp;}/*---------------------------------------------*/printf("%d<%d<%d<%d", num1, num2, num3, num4);return 0;}

运算结果:

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

解析:这题实际上是一道数学题,圆心的坐标分别是(-2,2)、(2,2)、(-2,-2)、(2,-2),圆的半径是1,所以|1|<x<|3|,|1|<y<|3|,最重要的是满足坐标在圆的范围内,这里可以使用点到点的距离来判定即sqrt(x^2+y^2)<=1。为了将负数转换成正数这里引用fabs函数,#include<math.h>。放代码!

void calculate(double x, double y){if (1 <= x && x <= 3 && 1 <= y && y <= 3){x = fabs(x) - 2; y = fabs(y) - 2;double r = sqrt(x * x + y * y);if (r <= 1){printf("该点坐标高度为10\n");}elseprintf("该点坐标高度为0\n");}else{printf("该点坐标高度为0\n");}}int main(){while (1){double x, y;printf("请输入x和y点的坐标:>");scanf("%lf %lf", &x, &y);calculate(fabs(x), fabs(y));}return 0;}

运算结果:

如果觉得《C语言程序设计第五版谭浩强课后答案 第四章习题答案》对你有帮助,请点赞、收藏,并留下你的观点哦!

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