C Primer Plus(第六版)第七章编程题答案参考

由于是自己做的,所以可能会出现小错误以及写的不够好的地方 ,欢迎交流~(=´ω`=)

7-1 报告读取的空格数、换行符数和所有其他字符的数量

#include <stdio.h>
//题意好像是要求除去空格和换行之后其他字符的数量
//我一开始以为是所有字符了,不过不想改了……
int main(void) {
	int blk = 0;//空格数
	int n_num = 0;//换行符
	int  all_al = 0;//所有字符
	char ch;
	printf("请输入字符串,以#作为结尾:");
	while ((ch = getchar()) != '#') {
		all_al++;
		if (ch == ' ')
			blk++;
		else if (ch == '\n')
			n_num++;
	}
	printf("%d个字符中,有%d个空格,%d个换行符。", all_al, blk, n_num);
	return 0;
}

7-2 打印8个“字符-ASCII码”组合

#include <stdio.h>
int main(void) {
	char ch;
	int count = 0;
	printf("请输入字符串,以#作为结尾:");
	while ((ch = getchar()) != '#') {
		count++;
		printf("%c-%d ", ch, ch);
		if (count % 8 == 0) {
			printf("\n");
		}
	}
	return 0;
}

7-3 报告奇数偶数的个数与平均值

#include <stdio.h>
int main(void) {
	int num;
	int odd = 0;//奇数
	int  even = 0;//偶数
	int sum_even = 0;
	int sum_odd = 0;
	float average_odd = 0;
	float average_even = 0;
	printf("请输入一组整数,以空格为间隔,以0作为结尾:");
	while (scanf("%d", &num) == 1) {
		if (num == 0)
			break;
		if (num % 2 == 0) {
			even++;
			sum_even += even;
		}
		else {
			odd++;
			sum_odd += odd;
		}
	}
	average_even = sum_even / even;
	average_odd = sum_odd / odd;
	printf("总共有%d个偶数(不包括0),其平均数为%.3f。\n总共有%d个奇数,其平均数为%.3f。", even, average_even, odd, average_odd);
	return 0;
}

7-4 替换符号

#include <stdio.h>
int main(void) {
	int count = 0;
	char ch;
	printf("请输入字符串(包含.以及!),以#作为结尾:");
	while ((ch = getchar()) != '#') {
		if (ch == '.') {
			count++;
			putchar('!');
			continue;
		}
		if (ch == '!') {
			count++;
			putchar('!'); 
			putchar('!');//putchar一次只能一个字符
			continue;
		}
		putchar(ch);
	}
	printf("\n总共进行了%d此替换", count);
	return 0;
}

7-5 switch重写7-4

#include <stdio.h>
int main(void) {
	int count = 0;
	char ch;
	printf("请输入字符串(包含.以及!),以#作为结尾:");
	while ((ch = getchar()) != '#') {
		switch (ch) {
		case '.':
			count++;
			putchar('!');
			break;
		case '!':
			count++;
			putchar('!');
			putchar('!');
			break;
		default:
			putchar(ch);
			break;
		}
	}
	printf("\n总共进行了%d此替换", count);
	return 0;
}

7-6 报告ei出现的次数

#include <stdio.h>
int main(void) {
	char former, present;
	int count = 0;
	printf("请输入字符串(以#作为结尾):");
	while ((present = getchar()) != '#') {
		if ( present == 'i' && former == 'e') {//former必须放在后面
			count++;
		}
		former = present;
	}
	printf("该字符串中ei出现的次数为%d", count);
	return 0;
}

7-7 计算工资-1

#include <stdio.h>
#define BASE_REVENUE 10
#define TAX_RATE_300 0.15
#define TAX_RATE_450 0.2
#define TAX_RATE_REST 0.25
int main(void) {
	float work_time = 0;
	double revenue = 0;//总收入
	double tax_num = 0;//税金
	double new_revenue = 0;
	float add_time = 0;//加班时间
	printf("请输入一周工作多少小时:");
	scanf("%f", &work_time);
	if (work_time <= 40) {
		revenue = work_time * BASE_REVENUE;
		if (revenue <= 300) {
			tax_num = revenue * TAX_RATE_300;
			new_revenue = revenue - tax_num;
		}
		else if (revenue > 300) {//一定不会超过400
			tax_num = 300 * TAX_RATE_300 + (revenue - 300) * TAX_RATE_450;
			new_revenue = revenue - tax_num;
		}
	}
	else {//有加班时间
		add_time = work_time - 40;
		revenue = (40 + add_time * 1.5) * BASE_REVENUE;
		if (revenue <= 450 && revenue > 300) {//一定超过300
			tax_num = 300 * TAX_RATE_300 + (revenue - 300) * TAX_RATE_450;
			new_revenue = revenue - tax_num;
		}
		else if (revenue > 450) {
			tax_num = 300 * TAX_RATE_300 + 150 * TAX_RATE_450 + (revenue - 450) * TAX_RATE_REST;
			new_revenue = revenue - tax_num;
		}
	}
	printf("您这周工作%.2f小时,工资总额为%.3lf,其中税金为%.3lf,最后净收入为%.3lf。", work_time, revenue,tax_num, new_revenue);
	return 0;
}

7-8 计算工资-2

#include <stdio.h>
#define BASE_REVENUE_1 8.75
#define BASE_REVENUE_2 9.33
#define BASE_REVENUE_3 10.00
#define BASE_REVENUE_4 11.20
#define TAX_RATE_300 0.15
#define TAX_RATE_450 0.2
#define TAX_RATE_REST 0.25
double Revenue(float work_time, float base_revenue);
double Tax(double revenue);
double NI(double revenue, double tax_num);
int main(void) {
	int choice;
	float work_time = 0;
	double revenue_tol = 0;
	double tax_tol = 0;
	double net_revenue = 0;
	int flag = 1;
	while (flag) {
		//显示菜单
		printf("*****************************************************************\n");
		printf("Enter the number correspomding to the desired pay rate or action;\n");
		printf("1)$8.75/hr\t\t\t\t2)$9.33/hr\n");
		printf("3)$10.00/hr\t\t\t\t4)$11.20/hr\n");
		printf("5)quit\n");
		printf("*****************************************************************\n");
		//接收用户输入
		scanf("%d", &choice);
		if (choice == 1 || choice == 2 || choice == 3 || choice == 4) {
			//询问用户工作时间
			printf("请输入一周工作多少小时:");
			scanf("%f", &work_time);
		}
		//switch进行选择
		switch (choice) {
		case 1:
			revenue_tol = Revenue(work_time, BASE_REVENUE_1);//基本工资为选项1时的工资总额
			break;
		case 2:
			revenue_tol = Revenue(work_time, BASE_REVENUE_2);//基本工资为选项2时的工资总额
			break;
		case 3:
			revenue_tol = Revenue(work_time, BASE_REVENUE_3);//基本工资为选项3时的工资总额
			break;
		case 4:
			revenue_tol = Revenue(work_time, BASE_REVENUE_4);//基本工资为选项4时的工资总额
			break;
		case 5:
			flag = 0;
			break;
		default:
			printf("请输入正确的选项!\n");
			while ((choice = getchar()) != '\n' && choice != EOF) {
				;
			}
			break;
			//由于scanf接收数字,因此若输入字符,则读取失败,进入default
			//而scanf是从缓冲区拿取数据,原先的字符没有被读取,一直保存在缓存区,因此一直读取失败进入default,造成死循环
			//此处的while可以把字符吃掉(读取但什么也不干),使下次读取前,缓冲区为空
		}
		if (choice == 1 || choice == 2 || choice == 3 || choice == 4) {
			tax_tol = Tax(revenue_tol);//税金
			net_revenue = NI(revenue_tol, tax_tol);//净收入
			printf("您这周工作%.2f小时,工资总额为%.3lf,其中税金为%.3lf,最后净收入为%.3lf。\n", work_time, revenue_tol, tax_tol, net_revenue);
		}
	}
	printf("Done!");
	return 0;
}
double Revenue(float work_time, float base_revenue) {
	double revenue = 0;
	if (work_time <= 40) {//小于40小时,收入为时间*基本工资
		revenue = work_time * base_revenue;
	}
	else {//大于40小时,收入为40*基本工资+加班时间*1.5*基本工资
		revenue = 40 * base_revenue + (work_time - 40) * 1.5 * base_revenue;
	}
	return revenue;
}
double Tax(double revenue) {
	double tax_num = 0;
	if (revenue <= 300) {
		tax_num = revenue * TAX_RATE_300;
	}
	else if (revenue > 300 && revenue <= 450) {
		tax_num = 300 * TAX_RATE_300 + (revenue - 300) * TAX_RATE_450;
	}
	else {
		tax_num = 300 * TAX_RATE_300 + 150 * TAX_RATE_450 + (revenue - 450) * TAX_RATE_REST;
	}
	return tax_num;
}
double NI(double revenue, double tax_num) {
	double new_revenue = 0;
	new_revenue = revenue - tax_num;
	return new_revenue;
}

7-9 统计素数

#include <stdio.h>
int main(void) {
	int num;
	int flag = 0;
	printf("请输入正整数:");
	while ((scanf("%d", &num)) == 1) {//必须输入整数
		//若小于等于0
		if (num <= 0) {
			printf("输入有误!请输入正整数:");
		}
		//若为1,无素数
		if (num == 1) {
			printf("无素数。");
		}
		else {//大于2,有素数。判断有几个素数
			for (int i = 2; i <= num; i++) {
				for (int j = 2; j <= i; j++) {
					if (i % j == 0 && j != i) {
						flag = 1;
						break;
					}
				}
				if (flag == 0) {
					printf("%d ", i);
				}
				flag = 0;
			}
		}
		printf("\n请输入正整数(输入q退出程序):");
	}
	printf("\nDone!");
	return 0;
}

7-10 计算税金

#include <stdio.h>
#define BASE_1 17850
#define BASE_2 23900
#define BASE_3 29750
#define BASE_4 14875
#define BASE_RATE 0.15
#define OVER_RATE 0.28
double TAX(long revenue,long base);
int main(void) {
	int choice;
	long revenue_tol;
	double tax_tol = 0;
	int flag = 1;
	while (flag) {
		//显示菜单
		printf("*******************************************************\n");
		printf("类别\t\t\t税金\n");
		printf("(1)单身\t\t\t17850美元按15%计,超出部分按28%计\n");
		printf("(2)户主\t\t\t23900美元按15%计,超出部分按28%计\n");
		printf("(3)已婚,共有\t\t29750美元按15%计,超出部分按28%计\n");
		printf("(4)已婚,离异\t\t14875美元按15%计,超出部分按28%计\n");
		printf("(5)退出程序\n");
		printf("*******************************************************\n");
		printf("请输入符合的选项:");
		scanf("%d", &choice);
		if (choice == 1 || choice == 2 || choice == 3 || choice == 4) {
			printf("请输入应纳税收入:");
			scanf("%ld", &revenue_tol);
		}
		switch (choice) {
		case 1:
			tax_tol = TAX(revenue_tol, BASE_1);
			break;
		case 2:
			tax_tol = TAX(revenue_tol, BASE_2);
			break;
		case 3:
			tax_tol = TAX(revenue_tol, BASE_3);
			break;
		case 4:
			tax_tol = TAX(revenue_tol, BASE_4);
			break;
		case 5:
			flag = 0;
			break;
		default:
			printf("输入有误!请输入1-5的数字!\n");
			while ((choice = getchar()) != '\n' && choice != EOF) {
				;
			}
			break;
		}
		if (choice == 1 || choice == 2 || choice == 3 || choice == 4) {
			printf("您应缴税金为:%.3lf美元。\n", tax_tol);
		}
	}
	printf("Done!");
	return 0;
}
double TAX(long revenue,long base) {
	double tax_num = 0;
	if (revenue <= base) {
		tax_num = revenue * BASE_RATE;
	}
	else {
		tax_num = base * BASE_RATE + (revenue - base) * OVER_RATE;
	}
	return tax_num;
}

7-11 计算订单费用

#include <stdio.h>
#define Y_PRICE 2.05
#define T_PRICE 1.15
#define H_PRICE 1.09
#define DISCOUNT 0.05
#define WEI_P_1 6.5
#define WEI_P_2 14
#define WEI_P_OVER_3 0.5
double Price_tol(float price,double weight);
int main(void) {
	int flag = 1;
	int discount = 0;
	char choice;
	double weight_1  = 0;
	double weight_2 = 0;
	double weight_3 = 0;
	double total_weight = 0;
	double total_price = 0;
	double wei_price = 0;
	double total_money = 0;
	//显示菜单
	while (flag) {
		double temp_1 = 0;
		double temp_2 = 0;
		double temp_3 = 0;
		printf("*****************************\n");
		printf("类别\t\t售价(美元)\n");
		printf("a.洋蓟\t\t2.05\n");
		printf("b.甜菜\t\t1.15\n");
		printf("c.胡萝卜\t1.09\n");
		printf("q.退出订购\n");
		printf("*****************************\n");
		printf("请输入对应的选项:");
		scanf("%c", &choice);
		//选择
		switch (choice) {
		case 'a':
			temp_1 = weight_1;
			printf("请输入洋蓟的重量:");
			scanf("%lf", &weight_1);
			weight_1 = temp_1 + weight_1;
			break;
		case 'b':
			temp_2 = weight_2;
			printf("请输入甜菜的重量:");
			scanf("%lf", &weight_2);
			weight_2 = temp_2 + weight_2;
			break;
		case 'c':
			temp_3 = weight_3;
			printf("请输入胡萝卜的重量:");
			weight_3 = temp_3 + weight_3;
			break;
		case 'q':
			flag = 0;
			break;
		default:
			printf("输入有误!请重新输入正确的选项!\n");
			break;
		}
		while ((choice = getchar()) != '\n' && choice != EOF) {
			;
		}
	}
	while (flag == 0) {//flag == 0说明已经订购完毕
		//计算蔬菜价格
		double temp_price = 0;
		if (weight_1 > 0) {//如果有订购洋蓟,则计算
			temp_price = Price_tol(Y_PRICE, weight_1);//计算单项目蔬菜价格
			total_price = total_price + temp_price;//计算所有蔬菜价格
		}
		if (weight_2 > 0) {
			temp_price = Price_tol(T_PRICE, weight_2);
			total_price = total_price + temp_price;
		}
		if (weight_3 > 0) {
			temp_price = Price_tol(H_PRICE, weight_3);
			total_price = total_price + temp_price;
		}
		//计算运费及包装费
		total_weight = weight_1 + weight_2 + weight_3;
		if (total_weight <= 5 && total_weight > 0) {
			wei_price = WEI_P_1;
		}
		else if (total_weight > 5 && total_weight <= 20) {
			wei_price = WEI_P_2;
		}
		else if (total_weight > 20) {
			wei_price = WEI_P_2 + (total_weight - 20) * WEI_P_OVER_3;
		}
		//计算总价
		if (total_price >= 100) {
			wei_price = wei_price * (1 - DISCOUNT);
			discount = 1;
		}
		total_money = total_price + wei_price;
		printf("****************************************************************************\n");
		printf("订单的总费用\t折扣\t运费和包装\t费用总计\n");
		printf("%.3lf\t\t%d\t%.3lf\t\t%.3lf\n", total_price, discount, wei_price, total_money);
		printf("****************************************************************************\n");
		flag = 1;
        //对最后显示结果做了点更改,每种蔬菜单列有点麻烦不想弄了
	}
	return 0;
}
double Price_tol(float price,double weight) {
	double tol_price = 0;
	tol_price = price * weight;
	return tol_price;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值