谭浩强【C语言程序设计】第四章习题详解


目录

​编辑

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

2. C语言中如何表示“真”和“假”? 系统如何判断一个量的“真”和“假”?

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

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

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

6.有一个函数:y= x (x < 1);2x-1 (1 <= x < 10);3x-11 (x >= 10)写程序,输入 x的值,输出y相应的值。

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

8. 给出一百分制成绩,要求输出成绩等级A'、'B'、'C'、'D'、'E'。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为''D',60分以下为'E'。

9. 给一个不多于5位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为 321,应输出 123。

10.企业发放的奖金根据利润提成。利润 I 低于或等于 100 000元的,奖金可提成10%;利润高于 100 000 元,低于200 000元((1000001000000时,超过1000 000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:(1) 用 if语句编程序;(2) 用 switch语句编程序。≤200000)时,低于>

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

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


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

  1. 算术运算:指的是四则运算,加减乘除,乘方,开方这些运算统称。(运算符:+  -  *  /  %  ++  --)
  2. 关系运算:在C语言中,关系运算也可以称为比较运算,用于进行两个量、或者两个表达式结果之间的关系表示。(运算符:<  >  <=  >=  ==  !=)
  3. 逻辑运算:对表达式进行逻辑与或非上的逻辑真假测试。(运算符:&&  ||  !)

2. C语言中如何表示“真”和“假”? 系统如何判断一个量的“真”和“假”?

  1. 在C语言中,用0表示假,用1表示真。
  2. 虽然C用语言中,假的用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 > 5 && 4 == 5

1 && 0

0

(2)a‖b+c && b-c

3 || 4 + 5 && 4-5

3 || 9 && -1

3 || 1

1

(3)!(a>b) && !c‖1

!(3 > 4) && !5 || 1

!(0) && 0 || 1

1 && 0 || 1

0 || 1

1

(4)!(x=a) && (y=b) && 0

!(x=3) && (y=4) && 0

!(3) && 4 && 0

0 && 4 && 0

0 && 0

0

(5)!(a+b)+c-1 && b+c/2

!(3+4) + 5 - 1 && 4 + 5/2

!(7) + 5 - 1 && 4 + 5/2

0 + 5 - 1 && 4 + 5/2

4 && 4 + 2

4 && 6

1

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

#include <stdio.h>

int main()
{
	int a, b, c, max = 0;
	printf("请输入要比较的三个数:>");
	scanf("%d%d%d", &a, &b, &c);
	if (a > b)
		max = a;
	else
		max = b;
	if (max < c)
		max = c;
	printf("最大值是:%d\n", max);

	return 0;
}

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

#include <stdio.h>
#include <math.h>

int main()
{
	int num = 0;
	printf("请输入一个数:>");
	scanf("%d", &num);
	if (num >= 1000)
	{
		printf("输入数据有误,请重新输入:>");
		scanf("%d", &num);
	}
	int ret = (int)sqrt(num);
	printf("%d\n", ret);

	return 0;
}

6.有一个函数:
y= x (x < 1);2x-1 (1 <= x < 10);3x-11 (x >= 10)
写程序,输入 x的值,输出y相应的值。

#include <stdio.h>

int main()
{
	float x, y;
	printf("请输入x的值:");
	scanf("%f", &x);

	if (x < 1)
	{
		y = x;
	}
	else if (x >= 1 && x < 10)
	{
		y = 2 * x - 1;
	}
	else
		y = 3 * x - 11;
	printf("y = %.2f\n", y);

	return 0;
}

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

else总是会找离自己最近的else if进行配对,因此本题中的else虽然与外层if对齐,但是与它配对的却是内层if。所以这段代码不

能够实现题目要求。

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

 这段代码的错误和第一小题一样,所以也实现不了题目要求。

8. 给出一百分制成绩,要求输出成绩等级A'、'B'、'C'、'D'、'E'。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为''D',60分以下为'E'。

#include <stdio.h>

int main()
{
	float score;
	printf("请输入你的成绩:");
	scanf("%f", &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");

	return 0;
}

9. 给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为 321,应输出 123。

#include <stdio.h>

int main()
{
	int num = 0;
	printf("请输入一个不大于5位的正整数:");
	scanf("%d", &num);
	if (!(num >= 0 && num <= 99999))
	{
		printf("输入有误\n");
		return -1;
	}
	printf("%d ", num % 10);
	if (num > 10)
		printf("%d ", (num / 10) % 10);
	if (num > 100)
		printf("%d ", (num / 100) % 10);
	if (num > 1000)
		printf("%d ", (num / 1000) % 10);
	if (num > 10000)
		printf("%d ", (num / 10000) % 10);

	return 0;
}

10.企业发放的奖金根据利润提成。利润 I 低于或等于 100 000元的,奖金可提成10%;利润高于 100 000 元,低于200 000元((100000<I≤200000)时,低于 100 000元的部分按10%提成,高于 100 000 元的部分,可提成 7.5%;200 000<I≤400 000 时,低于200 000元的部分仍按上述办法提成(下同)。高于200 000元的部分按5%提成;400000<I≤600000元时,高于 400 000 元的部分按3%提成;(600000<1≤1000000时,高于600 000元的部分按 1.5%提成;l>1000000时,超过1000 000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
要求:
(1) 用 if语句编程序;

#include <stdio.h>

int main()
{
	double I;
	printf("请输入你的利润:");
	scanf("%lf", &I);

	double salary_10 = 100000 * 0.1;
	double salary_20 = salary_10 + (100000 * 0.075);
	double salary_40 = salary_20 + (200000 * 0.05);
	double salary_60 = salary_40 + (200000 * 0.03);
	double salary_100 = salary_60 + (400000 * 0.015);

	double salary = 0;
	if (I < 100000)
	{
		salary = I * 0.1;
	}
	else if (I > 100000 && I <= 200000)
	{
		salary = salary_10 + (I - 100000) * 0.075;
	}
	else if (I > 200000 && I <= 400000)
	{
		salary = salary_20 + (I - 200000) * 0.05;
	}
	else if (I > 400000 && I <= 600000)
	{
		salary = salary_40 + (I - 400000) * 0.03;
	}
	else if (I > 600000 && I <= 1000000)
	{
		salary = salary_60 + (I - 600000) * 0.015;
	}
	else if (I > 1000000)
	{
		salary = salary_100 + (I - 1000000) * 0.01;
	}
	printf("你的奖金是:%.2f\n", salary);

	return 0;
}

(2) 用 switch语句编程序。

#include <stdio.h>

int main()
{
	double I;
	printf("请输入你的利润:");
	scanf("%lf", &I);

	double salary_10 = 100000 * 0.1;
	double salary_20 = salary_10 + (100000 * 0.075);
	double salary_40 = salary_20 + (200000 * 0.05);
	double salary_60 = salary_40 + (200000 * 0.03);
	double salary_100 = salary_60 + (400000 * 0.015);

	double salary = 0;
	int level = I / 100000;
	switch (level)
	{
	case 0:
		salary = I * 0.1;
		break;
	case 1:
		salary = salary_10 + (I - 100000) * 0.075;
		break;
	case 2:
	case 3:
		salary = salary_20 + (I - 200000) * 0.05;
		break;
	case 4:
	case 5:
		salary = salary_40 + (I - 400000) * 0.03;
		break;
	case 6:
	case 7:
	case 8:
	case 9:
		salary = salary_60 + (I - 600000) * 0.015;
		break;
	default:
		salary = salary_100 + (I - 1000000) * 0.01;
		break;
	}
	printf("你的奖金是:%.2f\n", salary);

	return 0;
}

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

#include <stdio.h>

int main()
{
	int num1, num2, num3, num4;
	printf("请输入4个数字:");
	scanf("%d%d%d%d", &num1, &num2, &num3, &num4);

	if (num1 > num2)
	{
		int tmp = num1;
		num1 = num2;
		num2 = tmp;
	}
	if (num1 > num3)
	{
		int tmp = num1;
		num1 = num3;
		num3 = tmp;
	}
	if (num1 > num4)
	{
		int tmp = num1;
		num1 = num4;
		num4 = tmp;
	}
	if (num2 > num3)
	{
		int tmp = num2;
		num2 = num3;
		num3 = tmp;
	}
	if (num2 > num4)
	{
		int tmp = num2;
		num2 = num4;
		num4 = tmp;
	}
	if (num3 > num4)
	{
		int tmp = num3;
		num3 = num4;
		num4 = tmp;
	}
	printf("%d %d %d %d", num1, num2, num3, num4);

	return 0;
}

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

 

#include <stdio.h>
#include <math.h>

int main()
{
	double x, y;
	printf("请输入x,y轴坐标<x,y>:");
	scanf("%lf,%lf", &x, &y);

	if (fabs(x) > 3 || fabs(y) > 3)
	{
		printf("该点的建筑高度是0m\n");
		return 0;
	}
	//计算输入位置距离圆心的长度,先计算两个边长
	double a_x = fabs(fabs(x) - 2);
	double b_y = fabs(fabs(y) - 2);
	double bevel = sqrt(a_x * a_x + b_y * b_y);
	if (bevel > 1)
		printf("该点的建筑高度是0m\n");
	else
		printf("该点的建筑高度是10m\n");
	return 0;
}
  • 57
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值