2019.1.22写了五个小时的《C Primer Plus》第七章编程练习答案

下午本来说要陪一个同学回高中宣讲,但他的学校通知他延后,于是下午两点开始写第七章课后题……
晚上19:26才调试完成……
各位看出什么BUG一定要在下面留言啊

7.12.1

编写一个程序读取输入,读到#字符停止,然后报告读取空格数,换行符数目以及所有的其它字符数目。

#include<stdio.h>
int main(void)
{
	char input;
	int space=0,enter=0,others=0;
	printf("Please type a stentence,type # to end my act.\n");
	while((input=getchar())!='#')
	{
		switch(input)
		{
			case ' ':
				space++;
				break;
			case '\n':
				enter++;
				break;
			default:
				others++;
				break;
		}
		
	}
	printf("Space\tEnter\tOthers\n%d\t%d\t%d\n",space,enter,others);
	return 0;
}

7.12.2

编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。一行打印8个字符。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。

#include<stdio.h>
int main(void)
{
	char input[2000];
	int a=0;
	while((input[a]=getchar())!='#')
	{
		a++;
	}
	int b=0;
	for(b;b<a;b++){
		printf("%c-%d\t",input[b],input[b]);
		if((b+1)%8==0)
		printf("\n");
	}
	return 0;
}

7.12.3

编写一个程序,读取整数,直到用户输入0。输入结束后,程序应该报告输入的偶数(不包括0)个数、这些偶数的平均值,输入的奇数个数以及奇数的平均值。

#include<stdio.h>
int main(void)
{
	int input=0,evensum=0,oddsum=0,even=0,odd=0;
	printf("Please enter an integer,0 to end.\n");
	scanf("%d",&input);
	while(input!=0)
	{
		if(input%2==0){
			even++;
			evensum+=input;
		}
		else{
		odd++;
		oddsum+=input;
		}
		printf("Please enter next integer,0 to end.\n");
		scanf("%d",&input);
	}
	printf("number of even number:%d\naverage of even number:%f\nnumber of odd number:%d\naverage of odd number:%f\n",even,(float)evensum/even,odd,(float)oddsum/odd);
	return 0;
}

7.12.4

使用if else语句编写一个程序读取输入,读到#停止。用感叹号代替句号,用两个感叹号代替原来的感叹号,最后报告进行了多少次替代。

#include<stdio.h>
int main(void)
{
	char input,replace=0;
	while((input=getchar())!='#')
	{
		if(input=='.'){
			input='!';
			replace++;
		}
		else if(input=='!'){
			printf("%c",'!');//这个不叫替换吧?
			replace++;
		}
		putchar(input);
	}
	printf("\nReplace times:%d\n",replace);
	return 0;
}

虽然感觉输出两次’!'不叫替换,但效果和题目描述一样吧?

7.12.5

用switch重写练习4。

#include<stdio.h>
int main(void)
{
	char input,replace=0;
	while((input=getchar())!='#')
	{
		switch(input){
			case '.':
				input='!';
				replace++;
				break;
			case '!':
				putchar(input);
				replace++;
			default:
				break;
		}
		putchar(input);
	}
	printf("\nReplace times:%d\n",replace);
	return 0;
}

7.12.6

编写程序输入,读到#停止,报告ei出现的次数。

#include<stdio.h>
int main(void)
{
	char a,next;
	int count=0;
	printf("Please type in stences,type # to end.\n");
	a=getchar();
	while((next=getchar())!='#'&&a!='#')
	{
		if(a=='e'&&next=='i'){
			count++;
		}
		a=next;
	}
	printf("Times:%d\n",count);
	return 0;
}

一开始思路是混乱的……

7.12.7

编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入
做如下假设:
a.基本工资 = 1000美元 / 小时
b.加班(超过40小时) = 1.5倍时间
c.税率: 前300美元为15%
续150美元为20%
余下的为25%
用#define定义符号常量,不用在意是否符合当前的税法

#include<stdio.h>
#define salary 10.00
#define overtime 40//超过40h为加班时间
#define ratio 1.5//加班工时为1.5倍 
#define tax1 0.15//第一部分税率 
#define tax2 0.2//第二部分税率 
#define tax3 0.25//第三部分税率 
#define break1 300//税率第一个分界点(收入)
#define break2 450//税率第二个分界点(收入) 
//#define salary1 break1*(1-tax1)//恰好达到第一个分界点税后收入
//#define salary2 ((break2-break1)*(1-tax2)+salary1)//恰好达到第二个分界点税后收入 
int main(void)
{
	float time,origin,total,tax,after_tax;
	printf("Please enter your working hours.\n");
	scanf("%f",&time);
	origin=time;
	
	if(time>overtime)
	time=(time-overtime)*ratio+overtime;
	
	total=time*salary;//计算税前薪水 
	if(total>=0&&total<=break1){
		tax=total*tax1;
		after_tax=total-tax;
	}
	else if(total>break1&&total<=break2){
		tax=break1*tax1+(total-break1)*tax2;
		after_tax=total- tax;
	}
	else {
		tax=break1*tax1+(break2-break1)*tax2+(total-break2)*tax3;
		after_tax=total-tax;
	}
	printf("Hours\tTotal wages\tTax\tAfter-tax income\n"
			"%.2f\t%.2f\t\t%.2f\t%.2f\n",origin,total,tax,after_tax);
	return 0;
}

和书上那道收电费的例题还是有点区别的

7.12.8

修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单
使用 switch 完成工资等级的选择。
运行程序后,显示的菜单应该类似这样:

*******************************************************************************
Enter the number corresponding to the desired pay rate of action:
1) $8.75/hr                                             2) $9.33/hr
3) $10.00/hr	                                        4) $11.20/hr
5) quit
*******************************************************************************

如果选择一个1~4其中的一个数字,程序应该询问用户工作的小时数。
程序要通过循环运行,除非用户输入 5。
如果输入1~5 以外的数字,程序应该提醒用户输入正确的选项,
然后再重复显示菜单提示用户输入。
使用#define创建符号常量表示各工资等级和税率

#include<stdio.h>
#define overtime 40//超过40h为加班时间
#define ratio 1.5//加班工时为1.5倍 
#define tax1 0.15//第一部分税率 
#define tax2 0.2//第二部分税率 
#define tax3 0.25//第三部分税率 
#define break1 300//税率第一个分界点(收入)
#define break2 450//税率第二个分界点(收入)
int main(void)
{
	float salary;
	int a;
	printf("************************************************************************************\n"
			"Enter the number corresponding to the desired pay rate or action:\n"
			"1) $8.75/hr\t\t2) $9.33/hr\n3) $10.00/hr\t\t4) $11.20/hr\n5) quit\n"
			"************************************************************************************\n");
	while((a=getchar())!='5'){
		switch(a)
		{
			case '1':
				salary=8.75;
				break;
			case '2':
				salary=9.33;
				break;
			case '3':
				salary=10.00;
				break;
			case '4':
				salary=11.20;
				break;
			default:
				printf("Please enter a correct option.\n");
		
		}
		if(a=='1'||a=='2'||a=='3'||a=='4'){
			float time,origin,total,tax,after_tax;
			printf("Please enter your working hours.\n");
			scanf("%f",&time);
			origin=time;
			
			if(time>overtime)
			time=(time-overtime)*ratio+overtime;
			
			total=time*salary;//计算税前薪水 
			if(total>=0&&total<=break1){
				tax=total*tax1;
				after_tax=total-tax;
			}
			else if(total>break1&&total<=break2){
				tax=break1*tax1+(total-break1)*tax2;
				after_tax=total- tax;
			}
			else {
				tax=break1*tax1+(break2-break1)*tax2+(total-break2)*tax3;
				after_tax=total-tax;
			}
			printf("Hours\tTotal wages\tTax\tAfter-tax income\n"
					"%.2f\t%.2f\t\t%.2f\t%.2f\n\n\n",origin,total,tax,after_tax);
//					"\nEnter the number corresponding to the desired pay……(Enter '5' to quit)\n"
				printf("************************************************************************************\n"
				"Enter the number corresponding to the desired pay rate or action:\n"
				"1) $8.75/hr\t\t2) $9.33/hr\n3) $10.00/hr\t\t4) $11.20/hr\n5) quit\n"
				"************************************************************************************\n");
		}
		getchar();//读取在摁回车时产生的\n,若无这个,则会被循环读取并赋值给a... 
	}
	return 0;
}

7.12.9

编写一个程序,只接受正整数输入,
然后显示所有小于等于该数的素数。

//这个程序太夸张了…… 
#include<stdio.h>
int main(void)
{
	int a,b,c;
	scanf("%d",&a);
	if(a>=0)
	for(b=2;b<=a;b++){
		for(c=2;c<b;c++){
			if(b%c==0)//判断b是否为素数 
			break;
		}
		if(c==b)
		printf("%d ",b); 
	}
	return 0;
}

我写出来的代码我自己都看不懂( ̄_ ̄|||)
不过好像能用……

7.12.10

1988年的美国联邦税收计划是近代最简单的税收方案。
它分为4个类别,每个类别有两个等级。
下面是税收计划的摘要(美元数为应征税的收入):
类别 税金
单身 17850美元按15%计,超出部分按28%计
户主 23900美元按15%计,超出部分按28%计
已婚,共有 29750美元按15%计,超出部分按28%计
已婚,离异 14875美元按15%计,超出部分按28%计
例如:一位工资为20000美元的单身纳税人,应缴纳税费 0.15x17850+0.28x(20000-17850)美元。
编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。
程序应通过循环让用户可以多次输入。

#include<stdio.h>
#define tax1 0.15
#define tax2 0.28
int main(void)
{
	int part1,part2;
	float tax;
	char a;
	printf("*************************************************\n"
		"请选择您的类别,键入一个数字并按回车\n1)单身\t\t2)户主\n3)已婚,共有\t4)已婚,离异\n退出请按5\n"
		"*************************************************\n");
	while((a=getchar())!='5'){
		switch(a)
		{
			case '1':
				part1=17850;
				break;
			case '2':
				part1=23900;
				break;
			case '3':
				part1=29750;
				break;
			case '4':
				part1=14875;
				break;
			default:
				printf("请输入正确的选项\n");
				break;
		}
		if(a=='1'||a=='2'||a=='3'||a=='4'){
			printf("请输入您的应纳税收入:");
			scanf("%d",&part2);
			if(part2<=part1){
				tax=part2*tax1;
			}
			else
			{
				tax=part1*tax1+(part2-part1)*tax2;
			}
			printf("您需缴纳的税金为:%.2f\n\n\n",tax);
		}
		printf("*************************************************\n"
		"请选择您的类别,键入一个数字并按回车\n1)单身\t\t2)户主\n3)已婚,共有\t4)已婚,离异\n退出请按5\n"
		"*************************************************\n");
		getchar();
	}
	return 0;
}

还是有些BUG,不过我目前好像没办法完美解决……
就是输入一串数字再回车,你们懂的,又是缓冲区的问题……

7.12.11

ABC邮政杂货店出售的鲜蓟售价为2.05美元/磅,甜菜售价为1.15美元/磅,胡萝卜售价为1.09美元/磅。添加运费之前,100美元的订单有%5的打折优惠。少于或等于5磅的订单收取6.5美元的运费和包装费,5磅~20磅的订单收取14美元的运费和包装费,超过20磅的订单在14美元的基础上每续重1磅增加0.5美元。编写一个程序,在循环中用switch语句实现用户输入不同的字母时有不同的响应,即输入a响应是让用户输入鲜蓟的磅数,b是甜菜的磅数,c是胡萝卜的磅数,q退出订购。程序要记录累计的重量。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序要显示所有的购买信息:物品售价、订购的重量(磅)、订购的蔬菜费用、订单的总费用、折扣(if you)、运费和包装费、以及所有的费用总额。

#include<stdio.h>
#define artichoke 2.05//洋蓟价格 
#define beet 1.15//甜菜价格 
#define carrot 1.09
#define discount 0.05
#define edge 100//大于等于这个数会打折
#define break1 5//运费的第一个断点:5磅 
#define break2 20
#define freight1 6.5//第一种运费 
#define freight2 14//第二种运费
#define freight3 0.5//超出,每磅收取的运费 
int main(void)
{
	char a;
	float ar=0,be=0,ca=0,b,weight=0,cost,freight,total;//三种蔬菜分别的重量,b就是个中间量,weight为总重量,cost为蔬菜花费,freight为运费,total为总费用 
	int c=0;
	printf("************************************************\n"
			"a)洋蓟\t\tb)甜菜\nc)胡萝卜\tq)退出并打印账单\n"
			"************************************************\n");
	while((a=getchar())!='q'){
		switch(a)
		{
			case 'a':
				printf("请输入需要购买的洋蓟磅数:");
				scanf("%f",&b);
				ar+=b;
				break;
			case 'b':
				printf("请输入需要购买的甜菜磅数:");
				scanf("%f",&b);
				be+=b;
				break;
			case 'c':
				printf("请输入需要购买的胡萝卜磅数:");
				scanf("%f",&b);
				ca+=b;
				break;
			default:
				printf("请选择正确的选项\n");
				break;
		
		}
		printf("************************************************\n"
		"a)洋蓟\t\tb)甜菜\nc)胡萝卜\tq)退出并打印账单\n"
		"************************************************\n请继续选择:");
	getchar();
	}
	//计算买菜费用与折扣 
	cost=artichoke*ar+beet*be+carrot*ca;
	if(cost>100){
		cost*=(1-discount);
		c=1;
	}
	//计算运费及包装费 
	weight=ar+be+ca;
	if(weight==0)
		freight=0;
	else if(0<weight<=break1)
		freight=freight1;
	else if(weight<=break2)
		freight=freight2;
	else
		freight=freight3+(weight-break2)*0.5;
	
	total=cost+freight;
	//输出部分 
	printf("\t洋蓟\t\t甜菜\t\t胡萝卜\n物品售价:%.2f\t\t%.2f\t\t%.2f\n"
			"订购重量:%.2f\t\t%.2f\t\t%.2f\n"
			"总重量:%.2f\n",artichoke,beet,carrot,ar,be,ca,weight);
	if(c==1)
	printf("折扣:%.2f\n",discount);
	printf("运费和包装费:%.2f\n"
			"订单总费用:%.2f\n",freight,total);
	
	return 0;
}

这几道题的代码长度真的吓到我了
写到最后一道题时头有点晕

2019年1月22日21点34分

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值