C Primer Plus(第6版)第七章编程练习答案

       间隔一月多才发第七章是因为开始写毕业论文了,向各位道歉,之后会加快速度。第六章从阅读量上看还是较受欢迎的,涨了二十多个关注,开心噢=w=,进入正题。

       首先,最近尝试安装了Visual Stdio 2017,比起Dev C++来说复杂很多但真正工程肯定得用它,为了方便目前以后者为主。不过学完这本书后,我会继续学计算机专业其他课程,然后开始学着用VS。毕竟很多新特性、新需求在VS上才能实现。

       其次,关于这一章,学习的过程整体不算困难,我卡壳的地方有三个。一是P188程序7.5里头关于使用“标记”这一方法,二是P195程序7.7里关于“标记”应用实例,三是P198程序7.9里求多个数最值时设min=MAX、max=MIN的技巧。

       前两者都是关于如何用“标记”方法解决逻辑问题,后者是一种解决结构问题的手段。

       这些方法给时间是能够想出替代品的,但这三个案例里给出的是前人千锤百炼总结的技巧,类似于数学题的巧解方法。如果不是出生科班有老师教授,那么我认为这值得类似于我这样的自学萌新反复理解然后尝试,以期达到掌握。

       最后,提及我发现的一些问题,1、多重选择的else if结构以if开头,中间用多个else if,结尾用else结束,但实际上也能用else if结尾,switch结构最后的default也是同理可以省略的。2、switch结构里case:后面输入 return 0作为语句,你可以结束整个程序,目前章节还没提及这个我是参考别人写的第八题中如何实现“输入5,结束整个程序”而得知的,相信后面的章节会讲解。  

      附上程序。

#include 
#include 
int main(void)
{
	char c, prev;
	int m, p, q;
	
	m = p = q = 0;
	
	while((c = getchar()) != '#')
	{
		if(!isspace(c))
		m++;//统计其他字符数 
		if(c == '\n')
		p++;//统计换行数 
		if(isspace(c))
		q++;//统计换行数与空格的总和(即空白数) 
		prev = c;
	}
	q = q - p;//没有函数能直接算空格数,只能间接算:空白数-换行数=空格数 
	if(prev != '\n')
	p++;//参照P194考虑,#在一行中间算换行数需要加一的情况,且不能放在空格数计算前,否则会少算空格数 
	
	printf("空格数为%d,换行符数为%d,其他字符数%d", q, p, m);
	 
	return 0;
}
#include 
int main(void)
{
	char c;
	int n;
	
	n = 0;
	
	while((c = getchar()) != '#')
	{
		if(c != '\n')//这个if使最后不把Enter也打印出来 
		{
		n++;
		printf("%c-%d   ", c, c);
		if(n % 8 == 0)
		printf("\n");
		}
	} 
	 
	return 0;
}
#include 
int main(void)
{
	int n, p, q, odd_and, even_and;
	float odd_avg, even_avg; 
	
	p = q = odd_and = even_and = 0;
	
	scanf("%d", &n);
	 
	while(n != 0)
	{
		if(n % 2 == 0)
		{
			p++;
			odd_and += n;
		}
		else
		{
			q++;
			even_and += n;
		}
		scanf("%d", &n);	
	}
	
	if(p != 0 && q != 0)
	{
	odd_avg = odd_and / p;
	even_avg = even_and / q;
	printf("偶数个数为%d,偶数均值为%f,奇数个数为%d,奇数均值为%f", p, odd_avg, q, 
	even_avg);
	}	
	
	if(q != 0) //要考虑到用户只输入奇数或偶数的情况
	{
		even_avg = even_and / q;
		printf("奇数个数为%d,奇数均值为%f", q, even_avg);
	}
	
	if(p != 0)
	{
		odd_avg = odd_and / p;
		printf("偶数个数为%d,偶数均值为%f", p, odd_avg);
	}
	
	return 0;
 } 
#include 
#define tra '!'
int main(void)
{
	char c;
	int n;
	
	n = 0;
	
	while(
			(c=getchar())
	 						!= '#')//模仿p182写法 
	{
		
		if(c == '!')//?变形要放在!变形前,不然?变成的!会接着变成!! 
		{
			printf("!");
			n++;
		}
		if(c == '?')
		{
			c = tra;
			n++;
		}
		printf("%c", c);
	}
	printf("\n%d", n);
	
	return 0;
 } 
#include 
#define tra '!'
int main(void)
{
	char c;
	int n;
	
	n = 0;
	
	while(
			(c=getchar())
	 						!= '#')//模仿p182写法 
	{
		switch(c)
		{
			case '!':
				printf("!");
				n++;
				break;
			case '?':
				c = tra;
				n++;
				break;//switch语句不一定要跟default做结尾,且两个case语句间的复合语句不需要括起来 
		 } 
		 printf("%c", c);
	}
	printf("\n%d", n);
	
	return 0;
}
#include 
#define tra '!'
int main(void)
{
	char c;
	int n;
	
	n = 0;
	
	while((c=getchar()) != '#')
	{
		if(c == 'e' && (c=getchar()) == 'i')
		{
			n++;
		 } 
	
	}
	printf("%d", n);
	
	return 0;
}
#include 
#define bas 10.00
#define T 40//基本工作时间 
#define v 1.5//加班时间增速 
#define mon1 300//税率截点1 
#define mon2 450//税率截点2 
#define tax1 0.15//税率1 
#define tax2 0.20//税率2 
#define tax3 0.25//税率3  
#define Tax1 (mon1 * tax1)//$300缴税 
#define Tax2 (Tax1 + (tax2 * (mon2 - mon1)))//$450缴税 
int main(void)
{
	int h;
	double bill, tax;
	
	printf("请输入您的周工作时间(单位小时)\n");
	scanf("%d", &h); 
	
	if(h > T)
		h = (h - T) * v +T;
		
	bill = bas * h;
	printf("您的报酬为%.2f\n", bill);
		
	if(bill <= mon1)
		tax = bill * tax1;
	else if(bill <= mon2)
		tax = Tax1 + (tax2 * (bill - mon1));
	else
		tax = Tax2 + (tax3 * (bill - mon2));
		
	printf("您的纳税额为%.2f\n您的净收入为%.2f", tax, bill - tax);
	 	
	return 0;
}
#include 
#define T 40//基本工作时间 
#define v 1.5//加班时间增速 
#define mon1 300//税率截点1 
#define mon2 450//税率截点2 
#define tax1 0.15//税率1 
#define tax2 0.20//税率2 
#define tax3 0.25//税率3  
#define Tax1 (mon1 * tax1)//$300缴税 
#define Tax2 (Tax1 + (tax2 * (mon2 - mon1)))//$450缴税 
int main(void)
{
	int h, n;
	double bill, tax, des;
	
	printf("*****************************************************************\n");
	printf("Enter the number corresponding to the desired pay rate or action:\n");
	printf("1) $8.75/hr     \t2) $9.33/hr\n3) $10.00/hr     \t4) $11.20/hr\n5) quite\n");
	printf("*****************************************************************\n");
	
	while(scanf("%d", &n) == 1)
	{
		switch(n)
		{
			case 1:
				printf("请输入您的周工作时间(单位小时)\n");
				scanf("%d", &h); 
				des = 8.75;
				break;
			case 2:
				printf("请输入您的周工作时间(单位小时)\n");
				scanf("%d", &h); 
				des = 9.33;
				break;
			case 3:
				printf("请输入您的周工作时间(单位小时)\n");
				scanf("%d", &h); 
				des = 10.00;
				break;
			case 4:
				printf("请输入您的周工作时间(单位小时)\n");
				scanf("%d", &h); 
				des = 11.20;
				break;
			case 5:
				return 0;//这里的return 0,只要知道直接结束了整个程序就可以了,符合题目要求 
			default :
				printf("请输入正确选项\n");
				continue;//continue不能在switch()中使用,这里是和while()匹配 
		}
		if(h > T)
		h = (h - T) * v +T;
		
		bill = des * h;
		printf("您的报酬为%.2f\n", bill);
		
		if(bill <= mon1)
			tax = bill * tax1;
		else if(bill <= mon2)
			tax = Tax1 + (tax2 * (bill - mon1));
		else
			tax = Tax2 + (tax3 * (bill - mon2));
		
		printf("您的纳税额为%.2f\n您的净收入为%.2f\n", tax, bill - tax);
	}
		 
	return 0;
}
#include 
#include 
int main(void)
{
	unsigned long n, x, y;
	bool t;
	
	printf("请输入一个数\n");
	while(scanf("%lu", &n) == 1)
	{
		for(x = 2; x <= n; x++)
		{
			for(y = 2, t = true; y < x; y++)
			{
				if( x % y == 0)
					t = false;
			}
			if(t)
				printf("%lu以内%lu是素数\n", n, x);	
		}
	}
	return 0;
}
#include  
#define mon1 17850.00//税率截点1 
#define mon2 23900//税率截点2 
#define mon3 29750//税率截点3
#define mon4 14875//税率截点4
#define tax1 0.15//税率1 
#define tax2 0.28//税率2 
#define Tax1 (mon1 * tax1)//$17850缴税 
#define Tax2 (mon2 * tax1)//$23900缴税 
#define Tax3 (mon3 * tax1)//$29750缴税 
#define Tax4 (mon4 * tax1)//$14875缴税 
int main(void)
{
	int n;
	double bill, tax;
	
	printf("*****************************************************************\n");
	printf("请输入您的纳税种类:\n");
	printf("1) 单身          \t2) 户主\n3) 已婚,共有     \t4) 已婚,离异\n5) 离开系统\n");
	printf("*****************************************************************\n");
	
	while(scanf("%d", &n) == 1)
	{
		switch(n)
		{
			case 1:
				printf("请输入您的工资\n");
				scanf("%lf", &bill); 
				tax = (bill >= mon1) ? (Tax1 + (bill - mon1) * tax2) : bill * tax1;
				break;
			case 2:
				printf("请输入您的工资\n");
				scanf("%lf", &bill); 
				tax = (bill >= mon2) ? (Tax2 + (bill - mon2) * tax2) : bill * tax1;
				break;
			case 3:
				printf("请输入您的工资\n");
				scanf("%lf", &bill); 
				tax = (bill >= mon3) ? (Tax3 + (bill - mon3) * tax2) : bill * tax1;
				break;
			case 4:
				printf("请输入您的工资\n");
				scanf("%lf", &bill); 
				tax = (bill >= mon4) ? (Tax4 + (bill - mon4) * tax2) : bill * tax1;
				break;
			case 5:
				return 0;//这里的return 0,只要知道直接结束了整个程序就可以了,符合题目要求 
			default :
				printf("请输入正确选项\n");
				continue;//continue不能在switch()中使用,这里是和while()匹配 
		}
		printf("您的纳税额为%.2lf,请再次选择纳税种类\n", tax);
	}
	return 0;
}
#include 
#define sort1 2.05//洋蓟的价格 
#define sort2 1.15//甜菜的价格 
#define sort3 1.09//胡萝卜的价格 
#define weight1 5//重量截点1 
#define weight2 20//重量截点2 
#define cost1 6.5//包运费1 
#define cost2 14//包运费2 
#define cost3 0.5//包运费3 
int main(void)
{
	char n;
	int w1, w2, w3, W1, W2, W3, W;
	double COST1, COST2;
	
	W1 = W2 = W3 = 0;
	
	printf("*****************************************************************\n");
	printf("请输入您的选择种类:\n");
	printf("a) 洋蓟     \tb) 甜菜\nc) 胡萝卜     \tq) 推出订购\n");
	printf("*****************************************************************\n");
	
	while((n = getchar()) != 'q')
	{
		switch(n)
		{
			case 'a':
				printf("请输入您需要的磅数:\n");
				scanf("%d", &w1);
				W1 += w1;
				printf("请输入您的选择种类:\n");
				break;
			case 'b':
				printf("请输入您需要的磅数:\n");
				scanf("%d", &w2);
				W2 += w2;
				printf("请输入您的选择种类:\n");
				break;
				printf("请输入您的选择种类:\n");
			case 'c':
				printf("请输入您需要的磅数:\n");
				scanf("%d", &w3);
				W3 += w3;
				printf("请输入您的选择种类:\n");
				break;
		}
	}	
		W = W1 + W2 + W3;
	
		COST1 = (W1 * sort1) + (W2 * sort2) + (W3 * sort3);

		COST1 = (COST1 >= 100) ? COST1 * 0.95 : COST1;
	
		if(W <= weight1)
			COST2 = COST1 + cost1;
		else if(W <= weight2)
			COST2 = COST1 + cost2;
		else if(W > weight2)
			COST2 = COST1 + cost2 + (W - weight2) * cost3;
		
			printf("洋蓟的售价为$2.05/pound,甜菜的售价为$1.15/pound,胡萝卜的售价为$1.09/pound.\n");
			printf("洋蓟订购%dpound费用为$%.2lf,甜菜订购%dpound费用为$%.2lf,胡萝卜订购%dpound费用为$%.2lf.\n", W1, W1 * sort1, W2, W2 * sort2, W3, W3 * sort3);
			printf("订购价格为%.2lf,包运费为%.2lf,总价格为%.2lf", COST1, COST2 - COST1, COST2);
		 
	return 0;
 } 

       最后说点题外话,这几天搞毕业论文,让我有点心绪起伏。

       我本科专业是消防工程,世殊事异现在也算是不亚于计算机的热门了,别的不说光看18年考注册消防工程师就有90多万人了(目前是全国最难的考试,三年通过率从0.94%涨到3.40%),就像当初一窝蜂涌入互联网领域,消防现在也有这个趋势了。原来消防把持在公安部现役武警的体制内是拥有行业壁垒的,现在私有化进程下也算是个未开垦的处女地吧,未来当有多少英雄豪杰在这个舞台上叱咤风云,令人神往。

       学计算机我不是科班出身,没有老师自己摸索是很费功夫的,这变相也占用了学专业的时间和精力。而在消防,我可以非常自豪地说我们学校算是国内数一数二了,每天授课的老师们真的算是这个领域的专家了,而且一个个倾囊相授、尽职尽责。那我现在算是舍本逐末、舍近求远吗?

       思考许久,我认为是值得的。消防+计算机(互联网、人工智能、大数据等等)算是一座未开发的金矿,我之前跟老师做课题和做软件的公司合作,我就发现我们懂消防但是不懂计算机、他们懂计算机但是不明白消防。这种信息差不仅产生了巨大的耗费,而且这种“落差”是能产生“势能”的,兼具二者的人应该有巨大优势和利益。

        主动进来也许会占得先机,当然也欢迎有能力和兴趣的朋友可以尝试跨界一下,毕竟这也不是我的蛋糕嘛(笑)。

       不过我对计算机的喜爱更多的是根植于黑客帝国式的憧憬吧,相信在三四十年后的那个未来科幻世界里,懂得计算机技术的人将能主宰自己的命运,晚安。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C Primer Plus(第6版)第七章编程练习答案)