当前位置: 首页 > article >正文

C Primer Plus 第7章习题

你该逆袭了

红色标注的是:错误的答案
蓝色标注的是:正确的答案
绿色标注的是:做题时有疑问的地方
橙色标注的是:答案中需要着重注意的地方

练习题

  • 一、复习题
    • 1、
    • 2、
    • 我的答案:第4问 错误
    • 正确答案:第4问的答案
    • 3、
    • 4、
    • 5、
    • 6、
    • 我的答案:错误
    • 正确答案:
    • 7、
    • 我的答案:正确
    • 补充知识点:
    • 8、
      • 我的答案:(有理解不到位的地方,已经在程序中备注)
    • 9、
      • 我的答案:错误
      • 正确答案:
    • 10、程序中有注意点
  • 二、编程练习
    • 1、
      • 我的答案:
        • 1、方法一
        • 2、方法二
    • 2、
    • 3、
      • 我的答案:
      • 标准答案:
      • 知识点
    • 4、不知道该怎么用两个感叹号替换原来的感叹号
      • 我的答案:错误,不会做
      • 正确答案:看完答案,就是自己想得太多
    • 5、同样是第4题的疑问,其实就是自己想多了,很简单
      • 正确答案:
    • 6、
      • 我的答案:
      • 标准答案:利用 判断标记
    • 7、没什么价值
      • 疑问:局部变量,当程序运行结束,空间就释放了,可以这样使用吗?
    • 8、
      • 我的答案:
      • 标准答案:
    • 9、
      • 我的答案:
      • 标准答案:
    • 10、这种简单,就不做了,一样的道理
      • 标准答案:
    • 11、
      • 我的答案:自己在做的时候,注意点已经备注在代码中,当时也纠结了很久,逐行代码监视才找出的问题!!!
      • 标准答案:其风格明显更简洁,规范

一、复习题

1、

在这里插入图片描述
我的答案:
false
true
false

2、

在这里插入图片描述

我的答案:第4问 错误

number >= 90 && number < 100;
ch != 'q' && ch != 'k';
number >= 1 && number <= 9 && number != 5;

number < 1 && number>9;  //错误

正确答案:第4问的答案

number < 1 || number>9;

3、

在这里插入图片描述
我的答案:

#include <stdio.h>

int main()
{
	int weight = 0;
	int height = 0;

	scanf("%d %d", &weight, &height);
	if (weight < 100 && height>64)
	{
		if (height >= 72)
		{
			printf("you are very tall for your weight.\n");
		}
		else if (height < 72 && height>64)
		{
			printf("you are tall for your weight.\n");
		}
		else if (weight > 300 && height < 48)
		{
			printf("you are quite short for your weight.\n");
		}
	}
	else
	{
		printf("your weight is ideal.\n");
	}

	return 0;
}

4、

在这里插入图片描述
在这里插入图片描述
我的答案:
a.1
b.0
c.1
d.6
e.10
f.0

5、

在这里插入图片描述
我的答案:

1 *#% 2 *#% 3 $#% 4 *#% 5 *#% 6 $#% 7 *#% 8 *#% 9 $#% 10 *#% 11 *#% 

所以结果是:*#%*#%$#%*#%*#%$#%*#%*#%$#%*#%*#%

6、

在这里插入图片描述

我的答案:错误

fat hat cat Oh no!
fat hat cat Oh no!
fat hat cat Oh no!

正确答案:

fat hat cat Oh no!
hat cat Oh no!
cat Oh no!

7、

在这里插入图片描述

我的答案:正确

#include <stdio.h>

int main()
{
	char ch = 0;
	int lc = 0;
	int uc = 0;
	int oc = 0;

	while ((ch = getchar()) != '#')
	{
		if ('a' <= ch && ch <= 'z')
		{
			lc++;
		}
		else if (ch >= 'A' && ch <= 'Z')
		{
			uc++;
		}
		else
		{
			oc++;
		}
	}
	printf("%d lowercase, %d uppercase, %d other", lc, uc, oc);

	return 0;
}

补充知识点:

添加头文件 #include <ctype.h>
if(islower(ch))
if(isupper(ch))

8、

在这里插入图片描述

我的答案:(有理解不到位的地方,已经在程序中备注)

#include <stdio.h>

int main()
{
	int age = 20;

	while (age++ <= 65)
	{                         //我自己理解不到位的地方
		if ((age % 20) == 0)  //注意:此时 age 已经变成了 21 ,所以 if 语句不会执行  // 我还以为age 还是 20 呢,这是我理解不到位的地方
		{
			printf("you are %d.here is a raise.\n", age);
		}
		if (age = 65)  //常量赋值
		{
			printf("you are %d.here is your gold watch.\n", age);
		}
	}

	return 0;
}

//所以结果会一直死循环下去

在这里插入图片描述

9、

在这里插入图片描述

我的答案:错误

step1
step2
step1
step1
step3
step1
done

正确答案:

这是我理解不到位的地方:以为执行完printf(“step2\n”);之后,laststep:(“step3\n”);是不执行的。其实是我错了,这个laststep 还是要执行的!
在这里插入图片描述
在这里插入图片描述

10、程序中有注意点

在这里插入图片描述
我的答案:

#include <stdio.h>

int main()
{
	char ch = 0;

	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
			case '\n': 
			{
				break;
			}
			case 'c':
			{
				printf("step 1\n");
				break;
			}
			case 'b':
			{
				printf("step 1\n");
				break;
			}
			case 'h':
			{
				printf("step 1\n");
				printf("step 3\n");
				break;    //注意:必须添加 break,否则,default语句 也要再运行一遍!
			}
			default:
			{
				printf("step 1\n");
				printf("step 2\n");
				printf("step 3\n");
			}
		}
		if (ch == 'b')
		{
			break;
		}
	}
	printf("done\n");

	return 0;
}

二、编程练习

1、

在这里插入图片描述

我的答案:

1、方法一
while ((scanf("%c", &ch) == 1) && ch != '#')
#include <stdio.h>

int main()
{
	int space = 0;
	int newline = 0;
	int other = 0;
	char ch = 0;

	while ((scanf("%c", &ch) == 1) && ch != '#')
	{
		switch (ch)
		{
		case ' ':
		{
			space++;
			break;
		}
		case '\n':
		{
			newline++;
			break;
		}
		default:
		{
			other++;
			break;
		}
		}
	}
	printf("%d 个空格,%d 个回车键,%d 个其他字符\n", space, newline, other);

	return 0;
}

在这里插入图片描述

2、方法二
while ((ch = getchar()) != '#')
#include <stdio.h>

int main()
{
	int space = 0;
	int newline = 0;
	int other = 0;
	char ch = 0;

	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
			case ' ':
			{
				space++;
				break;
			}
			case '\n':
			{
				newline++;
				break;
			}
			default:
			{
				other++;
				break;
			}
		}
	}
	printf("%d 个空格,%d 个回车键,%d 个其他字符\n", space, newline, other);

	return 0;
}

在这里插入图片描述

2、

在这里插入图片描述
我的答案:

#include <stdio.h>

int main()
{
	char ch = 0;
	int count = 0;

	while ((ch = getchar()) != '#')
	{
		count++;
		printf("%c 对应的ascii值是 %d  ", ch, (int)ch);
		if ((count % 8) == 0)
		{
			putchar('\n');
		}
	}

	return 0;
}

3、

在这里插入图片描述

我的答案:

#include <stdio.h>

int main()
{
	int oucount = 0;
	int jicount = 0;
	double ousum = 0;
	double jisum = 0;
	int input = 0;

	while ((scanf("%d", &input) == 1) && input != 0)
	{
		if (input % 2 == 0)
		{
			oucount++;
			ousum += input;
		}
		else
		{
			jicount++;
			jisum += input;
		}
	}
	printf("一共有 %d 个偶数,平均值是:%lf\n", oucount, ousum / oucount);
	printf("一共有 %d 个奇数,平均值是:%lf\n", jicount, jisum / jicount);

	return 0;
}

在这里插入图片描述

标准答案:

#include <stdio.h>

int main()
{
	int odd_sum = 0;
	int even_sum = 0;
	int odd_count = 0;
	int even_count = 0;
	int input = 0;

	while (scanf("%d", &input))  //这个地方跟我的答案不一样
	{
		if (input == 0)
		{
			break;
		}
		if (input % 2 == 0)
		{
			even_sum += input;
			even_count++;
		}
		else
		{
			odd_sum += input;
			odd_count++;
		}
	}

	printf("%d 个偶数,他们的平均值就是:%lf\n", 
		even_count, (double)even_sum / (double)even_count);
	printf("%d 个奇数,他们的平均值就是:%lf\n", 
		odd_count, (double)odd_sum / (double)odd_count);

	return 0;
}

在这里插入图片描述

知识点

1.0 * even_sum 将结果隐式转换为浮点型数据

printf("%d 个偶数,他们的平均值就是:%lf\n",
		even_count, 1.0 * even_sum / even_count);
	printf("%d 个奇数,他们的平均值就是:%lf\n",
		odd_count, 1.0 * odd_sum / odd_count);

4、不知道该怎么用两个感叹号替换原来的感叹号

在这里插入图片描述

我的答案:错误,不会做

#include <stdio.h>

int main()
{
	int ch = 0;
	int count = 0;

	while ((ch = getchar()) != '#')
	{
		if (ch == '.')
		{
			ch = '!';
			count++;
			continue;
		}
		if (ch == '!')
		{
			printf("%s", "!!");  //该怎么用 两个感叹号 替代 原来的感叹号 ??
			count++;
		}
	}

	return 0;
}

正确答案:看完答案,就是自己想得太多

#include <stdio.h>

int main()
{
	char ch = 0;
	int count = 0;

	while ((ch = getchar()) != '#')
	{
		if (ch == '.')
		{
			printf("!");
			count++;
		}
		else if (ch == '!')
		{
			printf("!!");
			count++;
		}
		else
		{
			putchar(ch);
		}
	}

	printf("\n一共进行 %d 次调换\n", count);

	return 0;
}

5、同样是第4题的疑问,其实就是自己想多了,很简单

在这里插入图片描述

正确答案:

#include <stdio.h>

int main()
{
	char ch = 0;
	int count = 0;

	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
		case '.':
			printf("!");
			count++;
			break;
		case '!':
			printf("!!");
			count++;
			break;
		default:
			putchar(ch);
			break;
		}
	}

	printf("\n一共进行 %d 次调换\n", count);

	return 0;
}

6、

在这里插入图片描述

我的答案:

#include <stdio.h>

int main()
{
	char ch = 0;
	char now = 0;
	char pre = 0;
	int count = 0;

	while ((ch = getchar()) != '#')
	{
		now = ch;
		if (now == 'i' && pre == 'e')
		{
			count++;
		}
		pre = ch;
	}
	printf("%d 个 ei\n", count);

	return 0;
}

在这里插入图片描述

标准答案:利用 判断标记

#include <stdio.h>

int main()
{
	char ch = 0;
	int flag = 0;
	int count = 0;

	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
		case 'e':
			flag = 1;  //标记
			break;
		case 'i':
			if (flag == 1)  //标记
			{
				count++;
				flag = 0;  //标记
			}
			break;
		default:
			flag = 0;  //标记
			break;
		}
	}

	printf("一共出现了 %d 次\n", count);

	return 0;
}

7、没什么价值

在这里插入图片描述

我的答案:标准答案比较简单,就是数学式子罗列而已

#include <stdio.h>
#define JI 1000

double salary(int x)
{
	double sum = 0;
	if (x >= 0 && x <= 40)
	{
		sum = x * JI;
	}
	else
	{
		sum = 40 * JI + (x - 40) * 1.5 * JI;
	}
	return sum;
}

double shui(double x)
{
	double shuijin = 0;
	if (x <= 300)
	{
		shuijin = x * 0.15;
	}
	else if(x > 300 && x <= 450)
	{
		shuijin = 45 + (x - 300) * 0.2;
	}
	else
	{
		shuijin = 45 + 30 + (x - 450) * 0.25;
	}
	return shuijin;   //这样做可以吗? shuijin是在这个函数里面创建的
}                     //函数运行结束,这个函数的空间也就释放了,shuijin 也就没有,
                      //那还能 return 回主函数吗?
double lirun(double x, double y)
{
	int z = 0;
	z = x - y;
	return z;
}


int main()
{
	int shijian = 0;
	double sala = 0;
	double shu = 0;
	double li = 0;

	scanf("%d", &shijian);

	sala = salary(shijian);
	shu = shui(sala);
	li = lirun(sala, shu);

	printf("%lf 是基本工资,%lf 是税金,%lf 是利润\n", sala, shu, li);

	return 0;
}

在这里插入图片描述

疑问:局部变量,当程序运行结束,空间就释放了,可以这样使用吗?

答:可以,C Primer Plus 书中很多代码,都是这么使用的。

double shui(double x)
{
	double shuijin = 0;
	if (x <= 300)
	{
		shuijin = x * 0.15;
	}
	else if(x > 300 && x <= 450)
	{
		shuijin = 45 + (x - 300) * 0.2;
	}
	else
	{
		shuijin = 45 + 30 + (x - 450) * 0.25;
	}
	return shuijin;   //这样做可以吗? shuijin是在这个函数里面创建的
}                     //函数运行结束,这个函数的空间也就释放了,shuijin 也就没有,
                      //那还能 return 回主函数吗?

8、

在这里插入图片描述

我的答案:

#include <stdio.h>

void menu()
{
	printf("*****************************************************************\n");
	printf("enter the number corresponding to the desired pay rate or action:\n");
	printf("1) $ 8.75/hr          2) $9.33/hr\n");
	printf("3) $ 10.00/hr         4) $11.20/hr\n");
	printf("5) quit\n");
	printf("*****************************************************************\n");
}

double salary(int x,double y)
{
	double sum = 0;
	if (x >= 0 && x <= 40)
	{
		sum = x * y;
	}
	else
	{
		sum = 40.0 * y + (x - 40.0) * 1.5 * y;
	}
	return sum;
}

double shui(double x)
{
	double shuijin = 0;
	if (x <= 300)
	{
		shuijin = x * 0.15;
	}
	else if(x > 300 && x <= 450)
	{
		shuijin = 45 + (x - 300) * 0.2;
	}
	else
	{
		shuijin = 45.0 + 30.0 + (x - 450) * 0.25;
	}
	return shuijin;   //这样做可以吗? shuijin是在这个函数里面创建的
}                     //函数运行结束,这个函数的空间也就释放了,shuijin 也就没有,
                      //那还能 return 回主函数吗?
double lirun(double x, double y)
{
	double z = 0;
	z = x - y;
	return z;
}

int main()
{
	int shijian = 0;
	double sala = 0;
	double shu = 0;
	double li = 0;
	int xuanxiang = 0;

	do 
	{
		menu();
		printf("请输入你的选项:");
		scanf("%d", &xuanxiang);
		if (xuanxiang == 5)
		{
			printf("程序结束!\n");
			break;
		}
		printf("请输入工作的时间:");
		scanf("%d", &shijian);
	
		switch (xuanxiang)
		{
			case 1:
			{
				sala = salary(shijian, 8.75);
				break; 
			}
			case 2:
			{
				sala = salary(shijian, 9.33);
				break;
			}
			case 3:
			{
				sala = salary(shijian, 10.00);
				break;
			}
			case 4:
			{
				sala = salary(shijian, 11.20);
				break;
			}
			default:
			{
				printf("请输入1~5的数值。\n");
				break;
			}
		}
		shu = shui(sala);
		li = lirun(sala, shu);

		printf("%lf 是基本工资,%lf 是税金,%lf 是利润\n", sala, shu, li);

	}while(1);

	
	return 0;
}

在这里插入图片描述

标准答案:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9、

在这里插入图片描述

我的答案:

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

int panduan(int x)
{
	for (int n = 2; n <= sqrt(x); n++)
	{
		if ((x % n) == 0)
		{
			return 0;
		}
	}
	return 1;   //注意:应该放在这个地方,我也想了一会儿呢
}

int main()
{
	int input = 0;
	int flag = 0;

	printf("请输入数据:");
	while (scanf("%d", &input) == 1)
	{
		flag = panduan(input);
		if (flag == 1)
		{
			printf("%d 是素数\n", input);
		}
		else
		{
			printf("不是素数\n");
		}
		printf("请输入下一个数据:");
	}
	

	return 0;
}

标准答案:

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

int main()
{
	int input = 0;
	int flag = 1;

	do
	{
		printf("请输入数据:");
		scanf("%d", &input);
		if (input < 2)
		{
			if (input == 0)
			{
				break;  //直接跳出 do while 循环,程序终止
			}
			else
			{
				printf("你所输入的数据不在范围内,请重新输入。\n");
				continue;  //注意点:注意这了从程序的哪里开始!!!
			} 
		}
		for (int i = input; i > 1; i--)
		{
			int j = 1;
			for (j = 2; j < sqrt(i); j++)
			{
				if ((i % j) == 0)
				{
					flag = 0;
					break;
				}
			}
		}
		if (flag == 1)
		{
			printf("%d 是素数\n", input);
		}
	} while (input != 0);

	return 0;
}

10、这种简单,就不做了,一样的道理

在这里插入图片描述
在这里插入图片描述

标准答案:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

11、

在这里插入图片描述

我的答案:自己在做的时候,注意点已经备注在代码中,当时也纠结了很久,逐行代码监视才找出的问题!!!

#include <stdio.h>
#define YANGYU 2.05
#define TIANCAI 1.15
#define HULUOBO 1.09

void menu()
{
	printf("**************************\n");
	printf("1)洋芋\n");
	printf("2)请甜菜\n");
	printf("3)胡萝卜\n");
	printf("4)退出订购\n");
	printf("**************************\n");
}

double SUM(double x,double y,double z)
{
	double zongshoujia = 0;
	zongshoujia = YANGYU * x + TIANCAI * y + HULUOBO * z;
	if (zongshoujia >= 100)
	{
		zongshoujia = zongshoujia - 5;
		return zongshoujia;
	}
	return zongshoujia;
}

double YUNFEI(double x)
{
	double yunfei = 0;
	if (x <= 5)
	{
		yunfei = 6.5;
		return yunfei;
	}
	else if (x >= 5 && x <= 20)
	{
		yunfei = 14.0;
		return yunfei;
	}
	else
	{
		yunfei = 14 + (x - 20.0) * 0.5;
		return yunfei;
	}
}

int main()
{
	int xuanxiang = 0;

	//重量
	double yangyuzhongliang = 0;
	double tiancaizhongliang = 0;
	double huluobozhongliang = 0;
	double yy = 0;
	double tc = 0;
	double hlb = 0;
	double zongzhongliang = 0;

	//总运费
	double zongyunfei = 0;

	//总售价
	double sum = 0;

	//总额
	double zonge = 0;


	do
	{
		menu();
		scanf("%d", &xuanxiang);
		if (4 == xuanxiang)
		{
			break;
		}
		switch (xuanxiang)
		{
			case 1:
			{
				printf("请输入洋芋的重量:");
				scanf("%lf", &yangyuzhongliang);
				yy += yangyuzhongliang;
				break;
			}
			case 2:
			{
				printf("请输入甜菜的重量:");
				scanf("%lf", &tiancaizhongliang); 
				tc += tiancaizhongliang;
				break;
			}
			case 3:
			{
				printf("请输入胡萝卜的重量:");
				scanf("%lf", &huluobozhongliang);
				hlb += huluobozhongliang;
				break;
			}
			default:
			{
				printf("你输入的选项不存在,请重新选择:");
				break;
			}
		}

		//不应给把这段话放在这儿,不然每次都要运行一遍,将上一次循环的值再加一遍
		// 
		//yy += yangyuzhongliang;  
		//tc += tiancaizhongliang;
		//hlb += huluobozhongliang;

	} while (1);

	sum = SUM(yy, tc, hlb);
	zongzhongliang = yy + tc + hlb;
	zongyunfei = YUNFEI(zongzhongliang);
	zonge = sum + zongyunfei;
	printf("%lf 磅的洋芋,%lf 磅的甜菜,%lf 磅的胡萝卜\n", 
		yy, tc, hlb);
	printf("这么多蔬菜的售价:%lf\n", sum);
	printf("这么多蔬菜的总重量:%lf\n", zongzhongliang);
	printf("这么多蔬菜的总运费:%lf\n", zongyunfei);
	printf("这么多蔬菜最后加上优惠和运费,总的价格是:%lf\n", zonge);

	return 0;
}

在这里插入图片描述

标准答案:其风格明显更简洁,规范

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/news/330353.html

相关文章:

  • 国产化框架PaddleYOLO结合Swanlab进行作物检测
  • 数据库管理-第245期 主流国产数据库RAC架构概览(20240929)
  • 《深度学习》OpenCV 角点检测、特征提取SIFT 原理及案例解析
  • Linux中的进程间通信之共享内存
  • Python知识点:如何使用Kafka与Python进行流数据处理
  • 如何配置flutter(超详细的哦)
  • 第18周 第2章JSON入门
  • Ubuntu24.04桌面版下的网络管理
  • V3D——从单一图像生成 3D 物体
  • github 远程仓库删除 本地重新上传
  • WeChat_DevTools 断点调试方法总结
  • 基于docker-compose部署openvas
  • Pycharm 本地搭建 stable-diffusion-webui
  • Redis-预热雪崩击穿穿透
  • 重生之我们在ES顶端相遇第 18 章 - Script 使用(进阶)
  • 【系统架构设计师】专题:测试基础知识
  • 力扣题解1870
  • [Linux#57][HTTP] URL结构 | 原理 | 请求与响应 | postman | fiddler
  • 活动公司都是怎么去寻找客户的
  • MySQL--数据库约束(详解)