C程序设计(谭浩强版)第四章课后习题

1.C语言中如何让表示“真”和“假”?

C语言编译系统在表示逻辑运算结果时,用数值“1”代表“真”,用”0“代表”假“。

系统如何判断一个量的”真“和”假“?

在判断一个逻辑量的值时,以非0代表”真“,以”0“作为”假“。


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

&&逻辑与运算符只有两者都为真,结果才为真

||逻辑或运算符两者中只要有一个为真,结果则为真

非运算符(!)>算术运算符优先级>关系运算符>逻辑运算符(&&,||)>赋值运算符

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

a+b=7>c所代表的值5,所以左边值为真1,右边b==c为假,4不可能等于5,所以1&&0

结果为0(假)

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

先计算b+c=7,再与a进行或运算3||7结果为真,b-c=-1,结果不为0为真

所以最后1&&1结果为1(真)

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

先计算括号内的a>b(3>4)其结果为假,然后进行括号外的非运算最后结果为1(真)

右边c||1结果为真,

所以最后1&&1结果为1(真)

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

先计算括号内的赋值运算,将a的值3赋给x,这样一来x=3,再进行非运算,所以左侧!3为假

右侧将b的值赋给y,这样y=4,4&&0结果为假,

所以最后0&&0结果为0(假)

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

先计算括号内的a+b=7,再根据运算符优先级进行非运算,!7为0(假),0+5-1=4

左侧结果为1(真),右侧先计算c/2=2,在进行b+2=6为1(真)

所以最后1&&1结果为1(真)


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

无非就是三个数输入后进行两两比较,用t来暂时存储两者中的最大值

然后再和最后没有比较过的数进行比较,最后输出三者中的最大值。

代码如下:

    int a, b, c,t,max;
	printf( "请输入三个整数 a,b,c:\n" );
	scanf_s( "%d %d %d", &a, &b, &c );
	t = ( a > b ) ?  a : b;//先将a和b进行比较,如果a大于b则将a的值赋给t,反之,则将b的值赋给t(t就是a和b中的最大值)
	max = ( t > c ) ?  t : c;//再将t和c进行比较,如果t>c,则将t的值赋给max,反之则将c的值赋给max。
	printf( "三者中最大数值为:\n%d", max );

运行结果:

C程序设计(谭浩强版)第四章课后习题_第1张图片


 4.从键盘输入一个小于1000的正数,要求输出它的平方根

(如果平方根不是整数,则输出其整数部分)。

要求在输入数据后先对其进行检查是否小于1000的正数。若不是,则要求重新输入。

请记住sqrt是求平方根函数,用的时候需要在头文件上加上#include

代码如下:

    int a;
	printf( "请输入一个小于1000的正数:\n" );
	scanf_s( "%d", &a );
	if ( a > 1000 || a <= 0 ) {
		printf( "请重新输入!\n" );
		scanf_s( "%d", &a );
	}
	printf( "它的平方根为:\n%d", ( int ) sqrt( a ) );

运行结果:

C程序设计(谭浩强版)第四章课后习题_第2张图片


 5.有一个函数:

                                C程序设计(谭浩强版)第四章课后习题_第3张图片

写程序,输入x的值,输出y的值

代码如下:

    int x, y;
	printf( "请输入x的值:\n" );
	scanf_s( "%d", &x );
	if ( x < 1 )
		y = x;
	else if (  x>=1 && x < 10 )
		y = 2*x - 1;
	else if ( x >= 10 )
		y = 3 * x - 11;
	printf( "%d", y );

运行结果:

C程序设计(谭浩强版)第四章课后习题_第4张图片

 C程序设计(谭浩强版)第四章课后习题_第5张图片

 C程序设计(谭浩强版)第四章课后习题_第6张图片


 6.有一函数:

                        C程序设计(谭浩强版)第四章课后习题_第7张图片

 有人编写了以下的两个程序,请分析他们是否能实现题目要求。

(1)

    int x, y;
	printf( "enter x:\n" );
	scanf_s( "%d", &x );
	y = -1;
	if ( x != 0 )
		if ( x > 0 )
			y = 1;
	else
		y = 0;
	printf( "x=%d\ty=%d", x, y );

流程图:

C程序设计(谭浩强版)第四章课后习题_第8张图片

 运行结果:

C程序设计(谭浩强版)第四章课后习题_第9张图片

(2)

    int x, y;
	printf( "enter x:\n" );
	scanf_s( "%d", &x );
	y = 0;
	if ( x >= 0 )
		if ( x > 0 )
			y = 1;
//
	else
		y = -1;
	printf( "x=%d,y=%d\n", x, y );

流程图:

C程序设计(谭浩强版)第四章课后习题_第10张图片

 运行结果:

C程序设计(谭浩强版)第四章课后习题_第11张图片

 可以看到两个都是if-else配对错误

切记:else一般与离得最近的if配对

为了使自己能够明白,建议还是写成if()+{}的形式,更清楚明白,

不建议上述两个的写法。新手就不是很理解的层次关系。

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

代码如下:

switch做法

#include
#include

    int main( ) {
	double score;
	char grade='0';
	printf( "请输入您的成绩:\n" );
	scanf_s( "%lf", &score );
	while ( score>100||score<0 )
	{

		printf( "输入的分数不规范!\n" );
		printf( "请重新输入!\n" );
		scanf_s( "%lf", &score );
	}
	switch ( (int)(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'; break;
	}
	printf( "您的分数为%5.1lf\n等级为:%c", score, grade );
	return 0;
}

运行结果:

C程序设计(谭浩强版)第四章课后习题_第12张图片

 if-else做法:

#include
#include

    int main( ) {
	double score;
	char grade='0';
	printf( "请输入您的成绩:\n" );
	scanf_s( "%lf", &score );
	while ( score>100||score<0 )
	{

		printf( "输入的分数不规范!\n" );
		printf( "请重新输入!\n" );
		scanf_s( "%lf", &score );
	}
    if (score>=90&&score<=100 )
    {
		grade = 'A';
	}
	else if ( score>=80&&score<=89 )
	{
		grade = 'B';
	}
	else if ( score>=70&&score<=79 )
	{
		grade = 'C';
	}
	else if (score>=60&&score<=69 ) 
	{
		grade = 'D';
	}
	else {
		grade = 'E';
	}
	printf( "您的分数为%5.1lf\n等级为:%c", score, grade );
	return 0;
}

运行结果和switch一样的我就不展示了。


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

  1. 求出它是几位数
  2. 分别输出每一位数字
  3. 按逆序输出各位数字,例如原数为321,应输出123。

比如8768%10=8   个位

(8768/10)%10=876%10=6   十位

(8768/100)%10=87%10=7   百位

(8768/1000)%10=8%10=8   千位

再用变量去存放这些提取出来的数字,进行往后运算。

由此就能把各个数位中的数字提取出来

代码如下:

    int a;//输入数字
	int b, c, d, e, f;//存放位数
	int temp=0;//存放几位数
	printf( "请输入一个不大于五位数的正整数:\n" );
	scanf_s( "%d", &a );
	while ( a>99999 )
	{
		printf( "输入的数字不规范!\n" );
		printf( "请重新输入!\n" );
		scanf_s( "%d", &a );
	}
	if (a>9999 ) {
		temp = 5;
	}else if (a>999 ) {
		temp = 4;
	}else if (a>99 ) {
		temp = 3;
	}else if (a>9 ) {
		temp = 2;
	}else {
		temp = 1;
	}
	printf( "它的位数为:\n%d\n", temp );
	b = a % 10;//个位
	c = (a/10)%10;//十位
	d = (a/100)%10;//百位
	e = (a/1000)% 10;//千位
	f = ( a / 10000 ) % 10;//万位
	switch ( temp )
	{
	case 1:
		printf( "%d\n", b );
		printf( "其反序数字为:\n" );
		printf( "%d", b );
		break;
	case 2:
		printf( "%d%d", c, b );
		printf( "其反序数字为:\n" );
		printf( "%d%d\n", b, c );
		break;
	case 3:
		printf( "%d%d%d", d, c, b );
		printf( "其反序数字为:\n" );
		printf( "%d%d%d\n", b, c, d );
		break;
	case 4:
		printf( "%d%d%d%d\n", e,d,c,b );
		printf( "其反序数字为:\n" );
		printf( "%d%d%d%d", b,c,d,e );
		break;
	case 5:
		printf( "%3d %3d %3d %3d %3d\n", f, e, d, c, b );
		printf( "其反序数字为:\n" );
		printf( "%d%d%d%d%d", b, c, d, e, f );
		break;
	}

运行结果:

C程序设计(谭浩强版)第四章课后习题_第13张图片


10. 企业发放的奖金根据利润提成。

利润I低于或等于10 0000 元的,奖金可提成10%;

利润高于 10 0000 元,低于20 0000 元(100 000

20 0000<I<40 0000时,低于20 0000 元的部分仍按上述办法提成(下同)。

高于20 0000 元的部分按 5%提成;40 0000

60 0000<I≤100 0000时,高于60 0000 元的部分按1.5%提成;

I>100 0000 时,超过100 0000 元的部分按 1%提成。

从键盘输入当月利润I,求应发奖金总数

要求:

  • 用if语句编程序

  • 用switch语句编程序

if-else语句

关键在于正确写出每个区间的奖金计算公式。

例如利润在40 0000~60 0000元时,

利润为:10 0000X0.1+10 0000X0.075+20 0000X0.05元

代码如下:

int i;
double bonus, bon1, bon2, bon4, bon6, bon10;
bon1 = 100000 * 0.1;
bon2 = bon1 + 100000 * 0.075;
bon4 = bon2 + 200000 * 0.05;
bon6 = bon4 + 200000 * 0.03;
bon10 = bon6 + 400000 * 0.015;
printf( "请输入利润i:\n" );
scanf_s( "%d", &i );
if ( i <= 100000 ) {
	bonus = i * 0.1;
}
else if ( i <= 200000 )
{
	bonus = bon1 + ( (double)i - 100000 ) * 0.075;
}
else if ( i<=400000 )
{
	bonus = bon2 + ( ( double ) i - 200000 ) * 0.05;
}
else if (i<=600000 ) {
	bonus = bon4 + ( ( double ) i - 400000 ) * 0.03;
}
else if ( i<=1000000 )
{
	bonus = bon6 + ( ( double ) i - 6000000 ) * 0.015;
}
else {
	bonus = bon10 + ( ( double ) i - 1000000 ) * 0.01;
}
printf( "奖金是:\n%10.2lf\n", bonus );

运行结果:

C程序设计(谭浩强版)第四章课后习题_第14张图片

 switch语句

代码如下:

int i;
double bonus, bon1, bon2, bon4, bon6, bon10;
int branch;
bon1 = 100000 * 0.1;
bon2 = bon1 + 100000 * 0.075;
bon4 = bon2 + 200000 * 0.05;
bon6 = bon4 + 200000 * 0.03;
bon10 = bon6 + 400000 * 0.015;
printf( "请输入利润i:\n" );
scanf_s( "%d", &i );
branch = i / 100000;
if (branch>10 ) {
	branch = 10;
}
switch ( branch )
{
case 0:bonus = i * 0.1; break;
case 1:bonus = bon1+((double)i-100000)*0.075; break;
case 2:
case 3:bonus = bon2+( ( double ) i-200000)*0.05; break;
case 4:
case 5:bonus = bon4+( ( double ) i-400000)*0.03; break;
case 6:
case 7:
case 8:
case 9:bonus = bon6 + ( ( double ) i - 600000 ) * 0.015; break;
case 10:bonus = bon10 + ( ( double ) i - 1000000 ) * 0.01; break;
}
printf( "奖金是:\n%10.2lf\n", bonus );

运行结果:

C程序设计(谭浩强版)第四章课后习题_第15张图片


10.输入四个整数,要求按由小到大的顺序输出

这次我依然用的还是循环做的,我个人觉得循环还是比较方便的!

用到了两种循环,正序和倒序的输出,不懂的同学可以看下循环的知识。

(循环不只可以正着写,也可以反着写)

代码如下:

//第一种方法
int a [ 4 ];
printf( "请输入四个整数:\n" );
for ( int i = 0; i < 4;i++ ) {
	scanf_s( "%d", &a [ i ] );
}
for ( int i = 0; i < 4;i++) {
	for ( int j = i + 1; j < 4;j++ ) {
		if (a[i]>a[j] ) {
			int t;
			t = a [ j ];
			a [ j ] = a [ i ];
			a [ i ] = t;
		}
	}
}
printf( "从小到大的顺序为\n" );
for ( int i = 0; i < 4;i++ ) {
	printf( "%3d", a [ i ] );
}


//第二种方法
int a [ 4 ];
printf( "请输入四个整数:\n" );
for ( int i = 0; i < 4;i++ ) {
	scanf_s( "%d", &a [ i ] );
}
for ( int i = 0; i < 4;i++) {
	for ( int j = i + 1; j < 4;j++ ) {
		if (a[i]=0;i-- ) {
	printf( "%3d", a [ i ] );
}

运行结果:

C程序设计(谭浩强版)第四章课后习题_第16张图片


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

我认为本题的精髓就是求输入的点到各中心点的距离

如果到各个点的距离如果四个距离

只要有一个得出的距离大于1则说明在塔外,那么高度h为0,

反之则高度h为10.

代码如下:

#include
#include
int main( ) {
	int h = 10;
	double x1 = 2, y1 = 2, x2 = -2, y2 = 2, x3 = -2, y3 = -2, x4 = 2, y4 = -2;
	double x, y, d1, d2, d3, d4;
	printf( "请输入一个点的坐标(x,y):\n" );
	scanf_s( "%lf,%lf", &x, &y );
	d1 = pow( ( x - x4 ), 2 ) + pow( ( y - y4 ), 2 );
	d2 = pow( ( x - x1 ), 2 ) + pow( ( y - y1 ), 2 );
	d3 = pow( ( x - x2 ), 2 ) + pow( ( y - y2 ), 2 );
	d4 = pow( ( x - x3 ), 2 ) + pow( ( y - y3 ), 2 );
	if (d1>1&&d2>1&&d3>1&&d4>1 ) 
		h = 0;
	printf( "该点的高度为:\n%d", h );
	return 0;
}

 运行结果:

C程序设计(谭浩强版)第四章课后习题_第17张图片

C程序设计(谭浩强版)第四章课后习题_第18张图片


 12.计算输入的数据是否为闰年

闰年条件判断如下:

1.不能被4整除的部分非闰年
2.判断剩下可以被4整除的部分能否被100整除
        如果不能被100整除是闰年例如2008年
        如果能被100整除继续判断
                能被400整除是闰年
                否则非闰年

代码如下:

int i;
	printf( "请输入需要比对的年份:\n" );
	scanf_s( "%d", &i );
	//第一种
	if ( i % 4 != 0 )
		printf( "%d不是闰年\n", i );
	else if ( i % 4 == 0 && i % 100 != 0 )
		printf( "%d是闰年\n", i );
	else if ( i % 100 == 0 && i % 400 == 0 )
		printf( "%d是闰年\n",i );
	else
		printf( "%d不是闰年\n",i );
	printf( "\n" );
	//第二种
	if((i%4==0&&i%100!=0)||i%400==0)
		printf( "%d是闰年\n", i );
	else
		printf( "%d不是闰年\n", i );
    printf( "\n" );
	//第三种
	if ( !( i % 4 == 0 && i % 100 != 0 ) || i % 400 == 0 )
		printf( "%d不是闰年\n", i );
	else
		printf( "%d是闰年\n", i );
    printf( "\n" );
	//第四种
	int t;//用t的值表示判定真假
	//t=1为真,则是闰年 t=0为假,则不是闰年
	if (i%4==0 ) {
		if ( i % 100 == 0 ) {
			if ( i % 400 == 0 ) {
				t = 1;
			}
			else {
				t = 0;
			}
		}
		else
			t = 1;
	}
	else
		t = 0;
	if(t)    //如果判定t不为假(0)
		printf( "%d是闰年\n", i );
	else
		printf( "%d不是闰年\n", i );

运行结果:

C程序设计(谭浩强版)第四章课后习题_第19张图片C程序设计(谭浩强版)第四章课后习题_第20张图片

不对的地方还请发评论或者私信我谢谢! 

你可能感兴趣的:(C程序设计,谭浩强版,第五版,课后习题,c语言)