C程序设计(第五版)-第4章 选择结构程序设计课后习题答案
原文链接:https://blog.csdn.net/gjggj/article/details/92249633
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
3.2 题目:a || b + c && b - c -> 3||4 + 5 && 4-5
解析: 优先算术运算4+5得到7,非0则为真,4-5得到-1,非0则为真,接下来逻辑与判断,最终逻辑或判断
答案: 1
3.3 题目:!(a > b) && !c || 1 -> !(3>4) && !5 || 1
解析 : !优先级最高,!(3>4)最终结果为真,!5为假; 其次 &&,真&&假得到假,最终||,1为真,假或真为真
答案: 1
3.4 题目:!(x = a) && (y = b) && 0 -> !(x=3) && (y=4)&&0
解析: 这里&&优先级最低是最后一个逻辑运算,因此不管如何,最终&&0,则肯定为假
答案: 假-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
4. 有3个整数a, b, c,由键盘输入,输出其中最大的数。
解题思路: 每个数字两两与剩余两个数字进行比较,若比剩下的两个数大则最大,例如:a>b && a>c则a是最大的
#include <stdio.h>
#include <windows.h>
int main()
{
printf("------------------\n");
int a, b, c, d;
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
d = a;
}
if (c > d)
{
d = c;
}
printf("%d", d);
return 0;
}
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。
解题思路: 首先判断输入的数字是否大于1000且是正数,然后使用sqrt函数对数据进行取平方根,最主要的是最终在输出是调整输出格式,小数部分为0位,只需要正数部分,且整数部分不会超过4位,
#include <stdio.h>
#include <math.h>
int main()
{
printf("------------------\n");
int a, r;
scanf("%d", &a);
while (a >= 1000)
{
printf("请输入小于1000的数\n");
scanf("%d", &a);
}
r = sqrt(a);
printf("%d的平方根=%d\n", a, r);
return 0;
}
6.有一个函数,编写程序,输入x的值,输出y相应的值。
#include <stdio.h>
#include <windows.h>
int main()
{
printf("------------------\n");
float x, y;
scanf("%f", &x);
if (x < 1)
{
y = x;
}
if (x >= 1 && x < 10)
{
y = 2 * x - 1;
}
if (x >= 10)
{
y = 3 * x - 11;
}
printf("x=%.2f, y=%.2f", x, y);
return 0;
}
7. 有一个函数,
有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后,上机运行程序,观察和分析结果。
#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;
}
解题思路: 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>
#include <windows.h>
int main()
{
printf("------------------\n");
int a;
scanf("%d", &a);
if (a >= 90)
{
printf("A");
}
else if (a >= 80 && a <= 89)
{
printf("B");
}
else if (a >= 70 && a <= 79)
{
printf("C");
}
else if (a >= 60 && a <= 69)
{
printf("D");
}
else
{
printf("E");
}
return 0;
}
9. 给一个不多于5位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为321,应输出123。
①求出它是几位数;
思路:因为整数除以整数的结果是整数,所以一个数每除以10,位数就少1,所以可以采用while循环依次除以10,直到结果为0,每除以10位数加1。
②分别输出每一位数字;
99999除以10000则输出9;9999除以1000则输出9, 以此方法可依次从输出最高位数字。每次除以得到最高位数,再余除除去最高位,得到剩下的数,以此为循环
③按逆序输出各位数字,例如原数为321,应输出123。
思路与第二题相同,只不过将整个过程逆序即可
#include <stdio.h>
#include <windows.h>
int main()
{
printf("------------------\n");
// 计算几位数
int n, r;
int count = 0;
scanf("%d", &n);
int x = n;
while (x != 0)
{
// n = n/10
x /= 10;
++count;
}
printf("数字是 %d 位数。\n", count);
// 正序输出
int total = 1;
for (int i = 1; i < count; ++i)
{
total *= 10;
}
int y = n;
for (int i = 0; i < count; ++i)
{
r = y / total;
y = y % total;
total /= 10;
printf("%d\n", r);
}
// 逆序输出
int z = n;
do
{
printf("%d\n", z % 10);
z /= 10;
} while (z != 0);
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>
#include <windows.h>
int main()
{
printf("------------------\n");
double I, salary = 0;
printf("enter performance:");
scanf("%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;
return 0;
}
(2) 使用switch语句编写程序。
解题思路: 与第一题思路没有太大差别,区别在于switch语句的case子句中需要是一个常量整数,并且switch中若子句中没有break将循序向下执行,直到遇到break才会跳出switch语句,如果这时候将利润除以10w,则得到0-9的数字,其中0表示小于10w,1表示介于10-20w,2、3表示介于20-40w,4、5表示介于40-60w,6、7、8、9表示介于60~100w,否则就是大于100w
#include <stdio.h>
#include <windows.h>
int main()
{
printf("------------------\n");
double I, salary = 0;
printf("enter performance:");
scanf("%lf", &I);
if (I < 0)
{
printf("请输入一个正数\n");
system("pause");
return -1;
}
double salary1 = 100000 * 0.1; // 10W的奖金提成
double salary2 = salary1 + (200000 - 100000) * 0.075; // 20W的奖金提成
double salary3 = salary2 + (400000 - 200000) * 0.05; // 40W的奖金提成
double salary4 = salary3 + (600000 - 400000) * 0.03; // 60W的奖金提成
double salary5 = salary4 + (1000000 - 600000) * 0.015; // 100W的奖金提成
// 求利润首位 , 可得出对应区间
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>
#include <windows.h>
int main()
{
printf("------------------\n");
int ary[4];
int temp;
for (int i = 0; i < 4; i++)
{
scanf("%d", &ary[i]);
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4 - i; j++)
{
if (ary[j] > ary[j + 1])
{
temp = ary[j + 1];
ary[j + 1] = ary[j];
ary[j] = temp;
}
}
}
printf("------------------\n");
for (int j = 0; j < 4; j++)
{
printf("%d ", ary[j]);
}
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 <windows.h>
#include <math.h>
int main()
{
printf("------------------\n");
int h;
double x, y, m, n, r;
printf("Please input a coordinate (x,y):");
scanf("%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程序设计(第五版)-第1章 程序设计和C语言课后习题答案
C程序设计(第五版)-第2章 算法--程序的灵魂课后习题答案
C程序设计(第五版)-第3章 最简单的C程序设计—顺序程序设计课后习题答案
C程序设计(第五版)-第4章 选择结构程序设计课后习题答案
C程序设计(第五版)-第5章 循环结构程序设计课后习题答案
C程序设计(第五版)-第6章 利用数组处理批量数据课后习题答案
C程序设计(第五版)-第7章 用函数实现模块化程序设计课后习题答案