第四章课后习题(一)
4.1 算术&关系&逻辑运算
题目概述:
- 什么是算术运算?
- 算术运算就是指加减乘除和整数的模运算(取余数运算)
- 这些都是我们从小到大学的,无非就是四则运算
- 什么是关系运算?
- 关系运算就是比较运算,将两个数值进行比较,判断其比较结果是否符合给定的条件
- 请参考课本P103 4.1.2 关系运算符和关系表达式
- 什么是逻辑运算?
- 逻辑运算指两个条件进行运算,有逻辑与、逻辑或、逻辑非三种
- 请参考课本P103 4.1.3 逻辑运算符和逻辑表达式
4.2 真假问题
题目概述:
C语言中如何表示“真”和“假”? 系统如何判断一个量的“真”和“假”?
答:
如果有一个逻辑表达式,若其值为“真”,系统会以 1表示,若其值为“假”,会以 0表示。但是在判断一个逻辑量的值时,系统会以 0作为“假”,以非 0作为“真”。例如
3 &&5的值为“真”,系统给出 3&&5的值为1。
4.3 计算逻辑表达式
题目概述:
本题若出现错误,欢迎纠错!
写出下面各逻辑表达式的值,设a=3,b=4,c=5
-
a + b > c && b == c
- 先看&&左边 :a + b > c → 3 + 4 > 5 → 7 > 5 为真
- 再看&&右边:b == c ? 4 == 5? 为假
- 对于&&运算符,有1个假最终结果为0
- 答案:0
-
a || b + c && b - c
- 先看&&左边: 先优先计算算术运算符,也就是 a||9,为真
- 再看&&右边: b-c = -1,是一个非0数字,非0也是真
- 对于&&运算符,两个都是真,最终结果为真
- 答案:1
-
!(a > b) && !c || 1
- 先看&&左边:!优先级最高,!(3>4)为真
- 再看&&右边:!优先级最高,!c为假||1为真,对于||中,有1真则真
- 对于&&运算符,两个都是真,最终结果为真
- 答案:1
-
!(x = a) && (y = b) && 0
- 这里一看有很多(),他们的优先级最高,但是我们看最后有个0,0则假
- 对于&&运算符:只要有一个为假整体为假
- 答案:0
-
!(a + b) + c - 1 && b + c / 2
- 先看&&左边:!(a + b)为0, 0 + c →5 为真
- 再看&&右边:b + c / 2 为真
- 对于&&运算符:只要有一个为假整体为假
- 答案:1
4.4 分段函数问题
待完善。
4.5 三个整数求最大值
题目概述:
由键盘输入3个整数a、b、c,要求输出其中最大的数,请编写程序
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{
if (b < c)
max = c;
else
max = b;
}
else
{
if (a > c)
max = a;
else
max = c;
}
printf("%d", max);
return 0;
}
- 答案不唯一,这个只是自己写的其中一个判断方法,具体思路是
- 先判断a是否大于b,如果a小于b成立的话,进入if语句,判断b是否比c大,如果b比c大,那么最大的就是b,否则就是c
- 如果a小于b不成立,那么走else语句,判断a是否大于c,如果a比c大,那么最大值就是a,否则是c
- 进入else语句无需再判断a是否大于b,因为在if语句语句判断过了
4.6 成绩赋级
题目概述:
给出一个百分制的成绩,要求输出成绩等级’A’ ‘B’ ‘C’ ‘D’ ‘E’。90 分以上为 A,80~89 分为 B,70~79 分为 C,60~69 分为 D,60 分以下为 E。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
float score = 0;
char level = 0;
scanf("%f", &score);
if (score <= 100 && score >= 0)
{
switch ((int)(score / 10))
{
case 10:
case 9:
level = 'A';
break;
case 8:
level = 'B';
break;
case 7:
level = 'C';
break;
case 6:
level = 'D';
break;
default:
level = 'E';
}
printf("level:%c", level);
}
else
{
printf("输出错误");
}
return 0;
}
-
这题最好输入的是浮点数,因为你的成绩不一定都是整数,有可能带个小数点比如说99.5
-
输入后,最好先用if-else判断分数的合法性,因为你的分数是不可能超过100(暂定满分100)或者是小于0分的
-
如果用switch语句,需要注意的是:switch语句中的表达式只能是整型和字符型,而不能是浮点型和字符串类型
-
那么如果我们非要用switch语句怎么办,很简单,只需要强制类型转换
-
强制类型转换是把变量从一种类型转换为另一种数据类型。例如,本题中的浮点型变量float如果想存储一个 int类型的值到switch语句判断,只需要把float类型强制转换为 int 类型。使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型,如下所示:
(type_name) expression ↓ (int)(score / 10);
-
-
4.7 蹂躏正整数
题目概述:
给1个不多于5位的正整数,要求:
①求出他是几位数
②分别输出每一位数字
③按逆序输出各位数字,例如原数321,应输出123
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int count = 0;//位数
int m = 0;
int ten_thousand = 0;//万位
int thousand = 0;//千位
int hundred = 0;//白位
int ten = 0;//十位
int indiv = 0;//个位
scanf("%d", &n);
if (n <= 99999)
{
//计算位数
if (n > 9999)
count = 5;
else if (n > 999)
count = 4;
else if (n > 99)
count = 3;
else if (n > 9)
count = 2;
else
count = 1;
printf("count = %d\n", count);
//计算每个位数分别的数字是多少
ten_thousand = n / 10000;
thousand = (n / 1000) % 10;
hundred = (n / 100) % 10;
ten = (n / 10) % 10;
indiv = n % 10;
//逆序输出
switch (count)
{
case 5:
printf("%d%d%d%d%d", indiv,ten,hundred,thousand,ten_thousand);
break;
case 4:
printf("%d%d%d%d", indiv, ten, hundred, thousand);
break;
case 3:
printf("%d%d%d", indiv, ten, hundred);
break;
case 2:
printf("%d%d", indiv, ten);
case 1:
printf("%d", indiv);
}
}
else
{
printf("超出题目要求");
}
return 0;
}
运行结果如下:
- 如果用选择语句来做本题的话,其实非常的反人类
- 需要先计算出位数,也就是count,记录输入的数字占了多少位数
- 然后分别算出每一个位数的值,也就是12345位置中,占万位的是1,千位的是2…,算出来之后才能用case语句逆序输出
- 最后分别根据位数来输出不同位级的逆序输出(比如说5位数走case 5输出5位数,比如说4位数走case 4输出4位数)
- 因为本章节是选择语句的章节,所以才用选择语句来做,其实用循环语句更加方便,如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int count = 0;
int m = 0;
scanf("%d", &n);
if (n <= 99999)
{
while (n != 0)
{
count++;
m = n % 10;
printf("%d", m);
n /= 10;
}
printf("\n");
printf("n的位数是:%d", count);
}
else
{
printf("超出了5位数要求");
}
return 0;
}
运行结果如下: