C程序设计(谭浩强)第五版课后题答案 第四章
1. 什么是算术运算?什么是关系运算?什么是逻辑运算?
算术运算:
算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。
其中加减优先级为4;乘除优先级为3;乘方、开方优先级为2。
在一道算式中,如果有多级运算存在,则应先进行高级运算,再进行低一级的运算。
如果只存在同级运算;则从左至右的顺序进行;如果算式中有括号,则应先算括号里边,再按上述规则进行计算。
关系运算:
关系的基本运算有两类:一类是传统的集合运算(并、差、交等);
另一类是专门的关系运算(选择、投影、连接、除法、外连接等),而在C语言中,关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。
常见的关系运算符包括:<、<=、>、>=、==、!= 等种类。
其中,前4种关系运算符(<、<=、>、>= )的优先级别相同为6,后2种(==、!=)优先级为7。
如果只存在同级运算;则从左至右的顺序进行,关系运算符的优先级高于赋值运算符(=:优先级为14)。
逻辑运算:
在逻辑代数中,有与、或、非三种基本逻辑运算。
表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。
而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。
常见的逻辑运算符包括:&&(优先级为11)、||(优先级为12)、! (优先级为2)等种类
&&: 与 是双目运算符,要求有两个运算对象,表示两个运算对象都成立,则结果为真,否则结果为假。
||:或 是双目运算符,要求有两个运算对象,表示两个运算对象只要任意一个成立,则结果为真,否则结果为假。
注意:a || b || c,只要a为真,就不必判断b和c。
!:非 是单目运算符,只要求有一个运算对象,表示取运算对象反义,运算对象为真则结果为假,运算对象结果为假则结果为真。
若在一个逻辑表达式中包含多个逻辑运算符,则优先次序为: ! > && > ||。若一个逻辑表达式中包含括号括起来的子逻辑,则优先括号内的子逻辑判断。
2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。
逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。
对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。
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) -> 1 &&0 -> 0
3.2:a || b + c && b - c
转化为 a ||((b+c)&&(b-c)) -> 3 ||((4+5)&&(4-5)) -> 3 || 1 -> 1
3.3:!(a > b) && !c || 1
转化为 (!(a > b)&&(!c))|| 1 -> (!(3 > 4)&&(!5))|| 1 -> 0 || 1 -> 1
3.4:!(x = a) && (y = b) && 0
转化为 (!(x=a)&&(y=b))&& 0 -> (!(x=3)&&(y=4))&& 0 -> 0 && 0 -> 0
3.5:!(a + b) + c - 1 && b + c / 2
转化为 ((!(a+b))+c-1)&&(b+(c/2)) -> ((!(3+4))+5-1)&&(4+(5/2)) -> 1 && 1 -> 1
4. 有3个整数a, b, c,由键盘输入,输出其中最大的数。
#include<stdio.h> int main() { int a,b,c; printf("请输入三个整数:\n"); scanf("%d%d%d",&a,&b,&c); if(a<b) { int t=a; a=b; b=t; } if(c>a) { int t=a; a=c; c=t; } printf("最大数为:%d\n",a); return 0; }
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。
#include<stdio.h> #include<math.h> int main() { float a,b=0; scanf("%f",&a); if(a>=1000 || a<0) { printf("请输入小于1000的正整数:\n"); scanf("%f",&a); } b=sqrt(a); printf("%4.0f的平方根为%4.0f:\n",a,b); return 0; }
6. 有一个函数:
写程序,输入x的值,输出y相应的值。
#include<stdio.h> int main() { int x,y=0; printf("请输入x的值:\n"); scanf("%d",&x); if(x<1) y=x; if(1<=x<10) y=2*x-1; if(x>=10) y=3*x-11; printf("%d\n",y); return 0; }
7. 有一个函数:
有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后,上机运行程序,观察和分析结果。
(1)
#include<stdio.h> int main() { int x,y; printf("enter x:"); scanf("%d",&x); y=-1; if(x!=0) if(x>0) y=1; else y=0; printf("x=%d,y=%d\n",x,y); return 0; }
(2)
#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; }
(1).
if语句使用过程中,else总是匹配距离自己最近的且没有配对的if。
因此x!=0具有两种情况x>0和x<0;因此x=0时y=-1;x>0时y=1;x<0时y=0。
与题意不符。
(2).
if语句使用过程中,else总是匹配距离自己最近的且没有配对的if。
因此x>=0具有两种情况x>=0和x<0;因此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’。
#include<stdio.h> int main() { int i; printf("请输入成绩:"); scanf("%d",&i); switch(i/10) { case 9 : printf("A\n") ;break; case 8 : printf("B\n") ;break; case 7 : printf("C\n") ;break; case 6 : printf("D\n") ;break; default :printf("E\n"); } return 0; }
9. 给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。
#include<stdio.h> #include<math.h> int main() { int i,x,n,j,m=0; int a[5]; printf("请输入一个少于5位数的正整数:\n"); scanf("%d",&x); j=x; while(x>0) { x=x/10; m++; } for(i=0;i<m;i++) { a[i]=j%10; j=j/10; } printf("这是个%d位数\n",m); printf("各个数是:"); for(i=0;i<m;i++) printf(" %d",a[i]); printf("\n"); printf("逆序输出为:"); for(i=0;i<m;i++) printf("%d",a[i]); 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语句编写程序。
#include <stdio.h> int main() { double i,salary = 0; printf("请输入奖金:"); scanf("%lf", &i); if (i<0) { printf("请输入一个正数\n"); 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; 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); return 0; }
(2) 使用switch语句编写程序。
#include <stdio.h> int main() { double i,salary = 0; printf("请输入奖金:"); scanf("%lf", &i); if (i<0) { printf("请输入一个正数\n"); 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); return 0; }
11. 输入4个整数,要求按由小到大的顺序输出。
#include <stdio.h> int main() { int a,b,c,d,t; printf("请输入4个整数:"); scanf("%d%d%d%d", &a,&b,&c,&d); if (a<b){ t=a;a=b;b=t; } if(c<d){ t=c;c=d;d=t; } if(a<c){ t=a;a=c;c=t; } if(b<c){ t=b;b=c;c=t; } if(b<d){ t=b;b=d;d=t; } if(c<d){ t=c;c=d;d=t; } printf("%d %d %d %d\n",a,b,c,d); return 0; }
12. 有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
#include <stdio.h> #include <math.h> void main() { int h; double x, y, m, n, r; printf("请输入坐标(x,y):"); scanf("%lf,%lf", &x,&y); if (fabs(x) > 3 || fabs(y) > 3) { h = 0; printf("坐标(%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; else h = 10; printf("坐标(%f,%f)的高度h=%d\n", x, y, h); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探