C语言谭浩强第五版课后题答案第4章

第4章 选择结构程序设计

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

算术运算:算术运算是数学中的基本运算之一,它包括了加减乘除和取余等运算。在计算机编程中,算术运算是最基础的操作之一。C语言作为一种计算机编程语言,具有强大的算术运算功能。

算术运算符有:+ - * / %(取余)等,详情可见书上52页

关系运算:指比较,大于、大于等于,小于、小于等于,等于、不等于,具体在书上90页

逻辑运算:两个条件进行运算,逻辑与、逻辑或、逻辑非。具体在书上91页

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

对于逻辑表达式,若其值为“真",则以1表示,若其值为“假”,则以0表示。但是在判断一个逻辑量的值时,系统会以0作为“假”,以非0作为“真”

3.写出下面各逻辑表达式的值。设a=3,b=4,c=5。

ps:算术运算符优先级>关系运算符>逻辑运算符(不是绝对,逻辑非优先级最高)

(1)a + b > c && b == c

答:3+4 > 5 && 4 == 5

       因为3+4等于7大于5,所以为真

       4 == 0为假

       &&逻辑与运算,有一个假则为假

       所以为假,结果是0

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

答:3 || 4 + 5 && 4 - 5

       因为算术运算符优先级>关系运算符>逻辑运算符

       所以就变成 3 || 9&&-1

       逻辑与的优先级>逻辑或

       9为真 -1是非0,也为真 所以为1

       3 || 1 逻辑或其中一个为真则为真,结果是1

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

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

  第一种:最后结果这里是 || 逻辑或运算1,其中一个为真则为真,这里已经逻辑或1了,所以一眼判断结果为1

  第二种:3>4为假 0

     !(0)&& !5 || 1

     !0 为1 

     1 &&  0 || 1

    0 || 1 所以结果为1

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

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

第一种:&&逻辑与运算,有一个假则为假 结果为0

第二种:! x && y && 0

              ! (3)&&(4)&& 0

              0 && 4 && 0

       所以结果为0

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

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

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

          0 + 5-1 && 4+2

           4 && 6 所以结果为1

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

#include<stdio.h>
int main()
{
	int a, b, c;
	printf("请输入3个整数:");
	scanf("%d,%d,%d",&a,&b,&c);
	if (a < b)//如果a<b
		if (b < c)//就执行这里,b<c,a<b,所以最大就为c
			printf("最大的数为:%d", c);
		else
			printf("最大的数为:%d", b);//否则在这个if语句中,b>c,最大为b
	else if (a < c)//a<c,a<b,最大就为c
		printf("最大的数为:%d", c);
	else
		printf("最大的数为:%d", a);
	return 0;
}

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

求平方根需要使用数学函数sqrt

所以头文件需要引用#include<math.h>

第一种解法:

#include<stdio.h>
#include<math.h>
int main()
{
	int a, b;
	printf("请输入一个小于1000的整数:");
	scanf("%d", &a);
	if (a > 1000)
	{
		printf("输入有错,请重新输入:");
		scanf("%d", &a);
	}
	else
	{
		b = sqrt(a);
		printf("%d的平方根是%d",a,b);
	}
}

这个解法在运行之后,若输入大于1000的数,只处理了一次,提醒用户输入有错,请重新输入,所以是存在问题的

下面的解法将程序改为多次检查,直到正确输入为止。

#include<stdio.h>
#include<math.h>
int main()
{
	int a,b;
	printf("请输入一个小于1000的整数:");
	scanf("%d", &a);
	while (a > 1000)
	{
		printf("输入有错,请重新输入:");
		scanf("%d", &a);
		b = sqrt(a);
	}
	printf("%d的平方根整数部分是%d", a, b);
	return 0;
}

6.有一个函数:

写程序,输入x的值,输出y相应的值。

根据题意可以分析:

条件1 :x<1

条件2:x>=1且x<10

条件3:x>=10

可以根据if语句,将三个条件使用两个if语句,来判断x<1与x<10。

if x<1 输出..........

else if x<10 输出..........

else 输出..........

具体代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int x, y;
	printf("请输入x:");
	scanf("%d", &x);
	if (x < 1)
	{
		y = x;
		printf("x=%d,y=x=%d", x, y);
	}
	else if (x < 10)
	{
	    y = 2 * x - 1;
	    printf("x=%d,y=2*x-1=%d",x,y);
    }
	else
	{
		y = 3 * x - 11;
		printf("x=%d,y=3*x-11=%d", x, y);
	}
	return 0;
}

7.

两段代码如下:

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

程序1:不能实现题目的要求。如果输入的x<0,则输出y=0。

             悬空else和离它最近且未匹配的if进行匹配

程序2:也不能实现题目的要求。如果输出的x<0,则输出y=0。

             和程序1是同样的问题

8.给出一个百分制成绩,要求输出成绩等级ABCDE
要求:90分以上为A,80-90分:B,70-79分:C ,60-69:D,60分以下:E

这里和我做的C程序设计试题汇编(小绿书)这个题类似

但是我选择的最笨的if语句来执行的,运行暂时也没有发现问题

#include<stdio.h>
int main()
{
	int score = 0;
	printf("请输入成绩:");
	scanf("%d", &score);
	while (score > 100 || score < 0)
	{
		printf("输入有错,请重新输入");
		scanf("%d", &score);
	}
	if (score >= 90)
	{
		printf("A");
	}
	else if (score > 80 && score < 89)
	{
		printf("B");
	}
	else if (score > 70 && score < 79)
	{
		printf("C");
	}
	else if (score > 60 && score < 69)
	{
		printf("D");
	}
	else
		printf("E");
	return 0;
}

但是if.....else这种比较麻烦,可以使用更简洁的Switch语句

如下:

#include<stdio.h>
int main()
{
	int score = 0;
	char grade;
	printf("请输入成绩:");
    scanf("%d", &score);
	while (score > 100 || score < 0)
	{
		printf("输入有错,请重新输入:");
		scanf("%d", &score);
	}
	switch (score / 10)
	{
	case 10:
	case 9:grade = 'A'; break;
	case 8:grade = 'B'; break;
	case 7:grade = 'C'; break;
	case 6:grade = 'D'; break;
	case 5:
	case 4:
	case 3:
	case 2:
	case 1:
	case 0:grade = 'E';
	}
	printf("成绩是%d,对应的等级是%c\n", score, grade);
}

9.给出一个不多于5位的正整数,要求:

1.求出它是几位数

// 整形运算,得到的结果还是整形
//如果数字大于等于10000就是5位数
//如果数字大于等于1000,小于等于9999,就是四位数
//如果数字大于等于100,小于等于999,就是三位数
//如果数字大于等于1,小于等于99,就是两位数
//否则就是一位数
#include<stdio.h>
int main()
{
	int num;
	printf("请输入一个不大于五位的正整数:");
	scanf("%d", &num);
	if (!(num >= 0 && num <= 99999))//如果这个数大于等于0且小于等于9999为真,则逻辑非为假;如果为假,逻辑非后则为真
	{
		printf("输入错误");
		return -1;
	}
	if (num >= 10000)
	{
		printf("这个数字是五位数");
	}
	else if (num >= 1000 && num <= 9999)
	{
		printf("这个数是四位数");
	}
	else if (num >= 100 && num <= 999)
	{
		printf("这个数是三位数");
	}
	else if (num >= 10 && num <= 99)
	{
		printf("这个数是两位数");
	}
	else
	{
		printf("这个数是一位数");
	}
	return 0;
}

2.分别输出每一位数字

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

3.按逆序输出各位数字,例如原数为321,输出为123

#include<stdio.h>
int main()
{
	int num;
	printf("请输入一个不大于五位的正整数:");
	scanf("%d", &num);
	if (!(num >= 0 && num <= 99999))
	{
		printf("输入错误");
		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.

根据题意分析:

10w以下,按照10%提成

10~20万,10万按照10%提成,高出部分按照7.5%提成

20~40万,20万按照20万走,高出20万部分按照5%提成

40~60万,40万按照40万走,高出40万部分按照3%提成

60~100万,60万按照60万走,高出60万部分按照1.5%提成

大于100万,100万按照100万走,高出100万部分按照1%提成

1.计算各个档次最高额的薪资

salary_10=100000*10%,10~20的奖金:salary_10+(I-100000)*7.5%

salary_20=100000*7.5%+salary_10,20~40的奖金:salary_20+(I-200000)*5%

salary_40=100000*5%+salary_20,40~60的奖金:salary_40+(I-400000)*3%

salary_60=100000*3%+salary_40,60~100的奖金:salary_60+(I-600000)*1.5%

salary_100=400000*1.5%+salary_60,大于100的奖金:salary_100+(I-1000000)*1%

(1)用if语句编程序

#include<stdio.h>
int main()
{
	double I;
	printf("请输入你的利润:");
	scanf("%lf", &I);
	double salary_10 = 100000 * 0.1;
	double salary_20 = (100000 * 0.075) + salary_10;
	double salary_40 = (100000 * 0.05) + salary_20;
	double salary_60 = (100000 * 0.03) + salary_40;
	double salary_100 = (400000 * 0.15) + salary_60;
	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 - 100000) * 0.05;
	}
	else if (I > 400000 && I <= 600000)
	{
		salary = salary_40 + (I - 100000) * 0.03;
	}
	else if (I > 600000 && I <= 1000000)
	{
		salary = salary_60 + (I - 100000) * 0.015;
	}
	else if (I > 1000000)
	{
		salary = salary_60 + (I - 100000) * 0.01;
	}
	printf("你的奖金是:%.2f\n", salary);
}

(2)用Switch语句编程序

#include<stdio.h>
int main()
{
	double I;
	printf("请输入你的利润:");
	scanf("%lf", &I);
	double salary_10 = 100000 * 0.1;
	double salary_20 = (100000 * 0.075) + salary_10;
	double salary_40 = (100000 * 0.05) + salary_20;
	double salary_60 = (100000 * 0.03) + salary_40;
	double salary_100 = (400000 * 0.15) + salary_60;
	double salary;
	int level =(int)(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.输入四个整数,要求按由小到大的顺序输出。

由于目前才到第四章,没有学到递归函数与其他更简洁的方法,所以就采用创建临时变量来对这四个整数进行比较

#include<stdio.h>
int main()
{
	int tmp, a, b, c, d;
	printf("请输入四个整数:");
	scanf("%d %d %d %d", &a, &b, &c, &d);
	if (a > b)
	{
		tmp = a;
		a = b;
		b = tmp;
	}
	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("a=%d b=%d c=%d d=%d", a, b, c, d);
	return 0;
}

12.

求输入位置的高度:其实就是判断坐标是否在圆内

在圆内10m

在圆外0m

输入的坐标绝对值都在3以内,判断输入点,距离圆心的长度,是否大于半径

直角边的第一条边长:输入坐标的(x的绝对值-2)的绝对值就是边长

直角边的第二条边长:输入坐标的(y的绝对值-2)的绝对值就是另一条边长

求数据的绝对值需要用到数学函数fabs

#include <stdio.h>
#include<math.h>
int main()
{
	double x, y;//输入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);//斜边边长 a^2+b^2
	if (bevel > 1)
	{
		printf("该点的建筑高度是0m\n");
	}
	else
	{
		printf("该点的建筑高度是10m\n");
	}
	return 0;
}

  • 40
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值