C Primer Plus 第7章习题

你该逆袭了
红色标注的是:错误的答案

蓝色标注的是:正确的答案

绿色标注的是:做题时有疑问的地方

橙色标注的是:答案中需要着重注意的地方

练习题

一、复习题

1、

我的答案:

false

true

false

2、

我的答案:第4问 错误

c 复制代码
number >= 90 && number < 100;
ch != 'q' && ch != 'k';
number >= 1 && number <= 9 && number != 5;

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

正确答案:第4问的答案

c 复制代码
number < 1 || number>9;

3、

我的答案:

c 复制代码
#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、

我的答案:

c 复制代码
1 *#% 2 *#% 3 $#% 4 *#% 5 *#% 6 $#% 7 *#% 8 *#% 9 $#% 10 *#% 11 *#% 

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

6、

我的答案:错误

c 复制代码
fat hat cat Oh no!
fat hat cat Oh no!
fat hat cat Oh no!

正确答案:

c 复制代码
fat hat cat Oh no!
hat cat Oh no!
cat Oh no!

7、

我的答案:正确

c 复制代码
#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;
}

补充知识点:

c 复制代码
添加头文件 #include <ctype.h>
if(islower(ch))
if(isupper(ch))

8、

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

c 复制代码
#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、

我的答案:错误

c 复制代码
step1
step2
step1
step1
step3
step1
done

正确答案:

这是我理解不到位的地方:以为执行完printf("step2\n");之后,laststep:("step3\n");是不执行的。其实是我错了,这个laststep 还是要执行的!

10、程序中有注意点

我的答案:

c 复制代码
#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、方法一
c 复制代码
while ((scanf("%c", &ch) == 1) && ch != '#')
c 复制代码
#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、方法二
c 复制代码
while ((ch = getchar()) != '#')
c 复制代码
#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、

我的答案:

c 复制代码
#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、

我的答案:

c 复制代码
#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;
}

标准答案:

c 复制代码
#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 将结果隐式转换为浮点型数据

c 复制代码
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、不知道该怎么用两个感叹号替换原来的感叹号

我的答案:错误,不会做

c 复制代码
#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;
}

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

c 复制代码
#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题的疑问,其实就是自己想多了,很简单

正确答案:

c 复制代码
#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、

我的答案:

c 复制代码
#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;
}

标准答案:利用 判断标记

c 复制代码
#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、没什么价值

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

c 复制代码
#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 书中很多代码,都是这么使用的。

c 复制代码
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、

我的答案:

c 复制代码
#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、

我的答案:

c 复制代码
#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;
}

标准答案:

c 复制代码
#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、

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

c 复制代码
#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;
}

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



相关推荐
XH华3 小时前
初识C语言之二维数组(下)
c语言·算法
Uu_05kkq7 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
嵌入式科普9 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A9 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J10 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
仍然探索未知中11 小时前
C语言经典100例
c语言
爱吃西瓜的小菜鸡12 小时前
【C语言】矩阵乘法
c语言·学习·算法
Stark、13 小时前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
deja vu水中芭蕾13 小时前
嵌入式C面试
c语言·开发语言
stm 学习ing15 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl