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

C语言程序设计第五版 谭浩强 第四章 课后习题 答案谭浩强 C 语言程序设计第五版第 4 章课后习题答案 1 什么是算术运算 什么是关系运算 什么是逻辑运算 答 算术运算时数学里基础的加减乘数求余数等 关系运算时求两个或者多个变量或者表达式之间的关系 逻辑运算时将多个变量或者表达式链接起来的逻辑关系 C 语言程序设计第五版课后答案谭浩强 2 C 语言中如何表示 真 和 假 系统如何判断一个量的 真 和 假 答 C 语言中将数值为 1 作为真 为 0 作

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

点我看视频讲解+可运行源码
记得一键三连哦

第四章 选择结构程序设计

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

【答案解析】

算熟运算:

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

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

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

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

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

解析:

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

结果:31

关系运算:

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

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

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

例如, > 优先于 == 。而 >< 优先级相同。
并且,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符(=)。

逻辑运算:

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

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

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

例如:(a

y),表示(a

y)同时成立则为真。

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

例如:(a

y),表示(a

y)两个对象中任意一个成立则结果为真。

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

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

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

示例:

注:&&优先级大于||,((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

解题思路:

  1. 关系运算符的优先级高于赋值运算符,但是低于算术运算符;
  2. &&表示两边条件同为真则成立,||表示两边条件任意一个为真则成立,!取条件反义。
  3. 逻辑运算符优先级: ! > && > ||
  4. 有括号优先括号。
3.1 题目:a + b > c && b == c -> 3+4>5&&4==5

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

答案: 0

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

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

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

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

答案: 1

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

C语言程序设计第五版

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

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

答案: 1

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

C语言程序设计第五版课后答案

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

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

答案: 假-0

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

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

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  
     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; } 

C语言程序设计课后答案谭浩强

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

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

答案:

#include  
     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; } 

C语言程序设计第五版 谭浩强

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

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

答案:

#include  
     #include  
     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\uad\uad\ \ \ (x<1)\\2x-1\uad\ \ (1<=x<10)\\3x-11\uad(x>=10) \end{cases} y=x   (x<1)2x1  (1<=x<10)3x11(x>=10)

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

答案:

#include  
     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; } 

C语言程序设计第五版第六题答案

7. 有一个函数,

y = { − 1 ( x < 0 ) 0     ( x = 0 ) 1     ( x > 0 ) y= \begin {cases} -1\uad(x<0) \\ 0\uad\ \ \ (x=0) \\ 1\uad\ \ \ (x>0) \end{cases} y=1(x<0)0   (x=0)1   (x>0)

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

解题思路: 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。

流程图:

C语言程序设计第五版流程图

答案:
课后习题答案

#include  
     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。

流程图:

c语言谭浩强课后习题答案

答案:

C语言程序设计第五版

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

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

答案:

#include  
     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  
     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; } 

C语言程序设计第五版课后答案

②分别输出每一位数字;

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

答案:

#include  
     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  
     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; } 

C语言程序设计第五版习题答案

10.企业发放的奖金根据利润提成。利润I低于或等于元的,奖金可提成10%;利润高于元,低于元(

时,超过元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:(1) 使用if语句编写程序。(2) 使用switch语句编写程序。
(1) 使用if语句编写程序。

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

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

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

答案:

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

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

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

c语言谭浩强课后答案

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

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

答案:

#include  
     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; } 

c语言程序设计第五版第11题答案

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

第12题

解题思路: 塔的半径为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  
     #include  
     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; else h = 10; printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h); system("pause"); return 0; } 

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

点我看视频讲解+可运行源码
记得一键三连哦

更多相关文章

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208468.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:31
下一篇 2026年3月19日 上午11:31


相关推荐

  • 阿里 Blink 正式开源,重要优化点解读

    阿里 Blink 正式开源,重要优化点解读

    2021年6月29日
    102
  • 【聘】字节跳动—豆包大模型领域专家热招募中!

    【聘】字节跳动—豆包大模型领域专家热招募中!

    2026年3月12日
    11
  • 鼠标捕获(setCapture,releaseCapture)的学习

    鼠标捕获(setCapture,releaseCapture)的学习鼠标捕获(setCapture)作用是将鼠标事件捕获到当前文档的指定的对象——对指定的对象设置鼠标捕获。这个对象会为当前应用程序或整个系统接收所有鼠标事件。所谓鼠标捕获,是指对鼠标事件(onmousedown,onmouseup,onmousemove,onclick,ondblclick,onmouseover,onmouseout)进行捕捉,使在容器内的子对象的鼠标事件均…

    2022年6月5日
    35
  • ManualResetEvent类的用法

    ManualResetEvent类的用法ManualResetEvent类作用1.事件初始状态设为false,task线程在第一个WaitOne()处阻塞。2.manualResetEvent.Set()事件状态设为true,task线程在每一个WaitOne()处都不阻塞。3.manualResetEvent调用Set()再调用Reset(),task线程在第一个WaitOne()处阻塞。4.manualResetEvent.Set()事件状态设为true,task线程在第一个WaitOne()处阻塞然后被释放。5.三个线程异步执行,set()

    2022年7月18日
    24
  • PMS权限管理和鉴权过程

    PMS权限管理和鉴权过程一 权限的管理基础知识 系统的权限机制分为 权限解析 权限分配 鉴权 动态添加权限 PermissionIn PackageParse Permission 中包含一个对应的 PermissionIn 权限信息的表示 其中包含权限等级的定义 NORMAL DANGER SIGNERATURE 另外实现了序列化 用户于进程间通信 3 BasePermis

    2025年7月6日
    4
  • 菜鸟学数据库——超键、候选键、主键、外键

    菜鸟学数据库——超键、候选键、主键、外键这些年的一些经历告诉我 很多初学者搞不清超键 候选键等 被数据库中的各种键搞的一头雾水 下面就跟大家一起聊聊数据库中的那些键 首先看看各种键的定义 超键 superkey 在关系中能唯一标识元组的属性集称为关系模式的超键候选键 candidatekey 不含有多余属性的超键称为候选键主键 primarykey 用户选作元组标识的一个候选键程序主键外键 f

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号