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为真!重要的事情说三遍,这里的负数也是真!第五题跟编译器有关系,这里说的优先级都是VS2022的,用其他的编译器答案可能是假。

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");
		}
		else
			printf("该点坐标高度为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;
}

运算结果:

  • 26
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值