C Primer Plus 第6版 编程练习 chapter 7

1. 第1题

1.1 题目描述

编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、换行符数和所有其他字符的数量。

1.2 编程源码

# include<stdio.h>

int main(){
	int sp_n = 0;
	int line_n = 0;
	int alp_n = 0;
	
	char c;
	
	while((c=getchar()) && c != EOF){
		if(' ' == c) ++sp_n;
		else if('\n' == c) ++line_n;
		else ++alp_n;
	}
	printf("空格数:%d\n换行数:%d\n其他字符:%d\n", sp_n,line_n,alp_n);
	return 0;
}

1.3 结果显示

结果显示


2. 第2题

2.1 题目描述

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

2.2 编程源码

# include<stdio.h>

int main(){
	int num = 0;
	
	char c;
	
	while((c=getchar()) && c != '#'){
		putchar(c);
		if(++num%8 == 0) putchar('\n');
		
	}
	
	return 0;
}

2.3 结果显示

结果显示


3. 第3题

3.1 题目描述

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

3.2 编程源码

# include<stdio.h>

int main(){
	int e_num = 0;
	int o_num = 0;
	float e_sum = 0;
	float o_sum = 0;
	int num = 0;

	printf("\n");
	while(1 == scanf("%d", &num) && num){
		if(num%2){
			++o_num;
			o_sum += num;
		}else{
			++e_num;
			e_sum += num;
		}
	}
	
	printf("偶数的个数:%d\n", e_num);
	printf("偶数的平均值:%f\n", e_num == 0?0:e_sum/e_num);
	printf("奇数的个数:%d\n", o_num);
	printf("奇数的平局值:%f\n", o_num == 0?0:o_sum/o_num);
	return 0;
}

3.3 结果显示

结果显示


4. 第4题

4.1 题目描述

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

4.2 编程源码

# include<stdio.h>

int main(){
	int num = 0;
	char c;

	printf("\n");
	while((c=getchar()) && c != '#'){
		if('.' == c){
			++num;
			putchar('!');
		}else if('!' == c){
			++num;
			putchar('!');putchar('!');
		}else putchar(c);
	}
	
	printf("\n共计替换:%d\n", num);

	return 0;
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

使用 switch 重写练习4。

5.2 编程源码

# include<stdio.h>

int main(){
	int num = 0;
	char c;

	printf("\n");
	while((c=getchar()) && c != '#'){
		switch(c){
			case '.':++num;	putchar('!'); break;
			case '!':++num;	putchar('!');putchar('!');break;
			default: putchar(c);break;
		}
	}
	
	printf("\n共计替换:%d\n", num);

	return 0;
}

5.3 结果显示

结果显示


6. 第6题

6.1 题目描述

编写程序读取输入,读到#停止,报告 ei 出现的次数。
注意:该程序要记录前一个字符和当前字符。用"Receive your eieio award" 这样的输入来测试。

6.2 编程源码

# include<stdio.h>

int main(){
	int num = 0;
	char c_pre;
	char c;

	printf("\n");
	while((c=getchar()) && c != '#'){
		if(c_pre == 'e'){
			if(c == 'i'){
				++num;
				c_pre = ' ';
			}
		}else{
			if(c == 'e')
				c_pre = 'e';
		}
	}
	
	printf("\n共计替换:%d\n", num);

	return 0;
}

6.3 结果显示

结果显示


7. 第7题

7.1 题目描述

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

7.2 编程源码

# include<stdio.h>

# define BASE			1000
# define BASE_HOURS		40
# define RATE_OVERTIEM	1.5
# define LINE_PRE		300
# define RATE_PRE		0.15
# define LINE_XU		150
# define RATE_XU		0.2
# define RATE_LAST		0.25

int main(){
	float num = 0;
	float salary_sum = 0;
	float salary_rate = 0;
	float salary = 0;
	float work_hours = 0;

	printf("\n请输入您一周的工作小时数:");
	scanf("%f", &num);
	work_hours = num>BASE_HOURS?BASE_HOURS+(num-BASE_HOURS)*RATE_OVERTIEM:num;
	
	salary_sum = work_hours * BASE;
	
	if(salary_sum <= LINE_PRE){
		salary_rate = salary_sum * RATE_PRE;
		salary = salary_sum - salary_rate;
	}else if(salary_sum <= LINE_PRE + LINE_XU){
		salary_rate = LINE_PRE * RATE_PRE + (salary_sum - LINE_PRE) * RATE_XU;
		salary = salary_sum - salary_rate;
	}else{
		salary_rate = LINE_PRE * RATE_PRE + LINE_XU * RATE_XU + (salary_sum - LINE_XU) * RATE_LAST;
		salary = salary_sum - salary_rate;
	}	
	
	printf("工资总计:%f\n", salary_sum);
	printf("工资税金:%f\n", salary_rate);
	printf("工资到手:%f\n", salary);

	return 0;
}

7.3 结果显示

结果展示
在这里插入图片描述
在这里插入图片描述


8. 第8题

8.1 题目描述

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


Enter the number corresponding to the desired pay rate or action:

  1. $8.75/hr 2) $9.33/hr
  2. $10.00/hr 4) $11.20/hr
    5)quit

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

8.2 编程源码

# include<stdio.h>

# define BASE_HOURS		40
# define RATE_OVERTIEM	1.5
# define LINE_PRE		300
# define RATE_PRE		0.15
# define LINE_XU		150
# define RATE_XU		0.2
# define RATE_LAST		0.25

void display(void){
	printf("\n**************************************************************************\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");
	printf("请输出您的选项(1~5):");
}

float get_a(void){
	int id ;
	float num = 0;
	
	display();
	while(scanf("%d", &id) == 1){
		if(id>5) {
			printf("\n2请根据菜单提示输入。");
			display();
			continue;
		}
		switch(id){
			case 1:num = 8.75;return(num);
			case 2:num = 9.33;return(num);
			case 3:num = 10;return(num);
			case 4:num = 11.2;return(num);
			case 5:return -1;
			default:break;
		}
	}
	return -1;
}

int main(){
	float num = 0;
	float base = 0;
	float salary_sum = 0;
	float salary_rate = 0;
	float salary = 0;
	float work_hours = 0;
	
	while( base = get_a()){
		if(base < 0)break;
		printf("\n请输入您一周的工作小时数:");
		scanf("%f", &num);
		work_hours = num>BASE_HOURS?BASE_HOURS+(num-BASE_HOURS)*RATE_OVERTIEM:num;
		
		salary_sum = work_hours * base;
		
		if(salary_sum <= LINE_PRE){
			salary_rate = salary_sum * RATE_PRE;
			salary = salary_sum - salary_rate;
		}else if(salary_sum <= LINE_PRE + LINE_XU){
			salary_rate = LINE_PRE * RATE_PRE + (salary_sum - LINE_PRE) * RATE_XU;
			salary = salary_sum - salary_rate;
		}else{
			salary_rate = LINE_PRE * RATE_PRE + LINE_XU * RATE_XU + (salary_sum - LINE_XU) * RATE_LAST;
			salary = salary_sum - salary_rate;
		}	
		
		printf("工资总计:%f\n", salary_sum);
		printf("工资税金:%f\n", salary_rate);
		printf("工资到手:%f\n\n", salary);
	}	

	return 0;
}

8.3 结果显示

结果显示
结果显示
结果显示


9. 第9题

9.1 题目描述

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

9.2 编程源码

# include<stdio.h>

int is_prime(int num){
	if(2 == num) return 1;
	for(int i=2;i<num;++i){
		if(num%i == 0) return 0;
	}
	return 1;
}

int main(){
	int num;
	printf("\n请输入一个正整数:");
	scanf("%d", &num);
	
	for(int i=2;i<=num;++i){
		if(is_prime(i))printf("%d\t",i);
	}
	printf("\n");
	
	return 0;
}

9.3 结果显示

结果显示
结果显示


10. 第10题

10.1 题目描述

1988牟的美国联邦税收计划是近代最简单的税收方案。它分为4个类别,每个类别有两个等级。
下面是该税收计划的摘要 (美元数为应征税的收入 ):

类别税金
单身17850美元按15%计,超出部分按28%计
户主23900美元按15%计,超出部分按28%计
已婚,共有29750美元按15%计,超出部分按28%计
已婚,离异14875美元按15%计,超出部分按28%计

例如,一位工资为 20000 美元的单身纳税人,应缴纳税费0.15X17850+0.28*(20000-17850)美
元。编写一个程序,让用户指定缴纳税金的种类和应纳税收入, 然后计算税金。程序应通过循环
让用户可以多次输入。

10.2 编程源码

# include<stdio.h>

# define RATE_BASE		0.15
# define RATE_LAST		0.28

void display(void){
	printf("\n**************************************************************************\n");
	printf("您当前的状态是: \n");
	printf("1) 单身	2) 户主\n");
	printf("3) 已婚,共有/hr 4) 已婚,离异\n");
	printf("5)quit\n");
	printf("**************************************************************************\n");
	printf("请输出您的选项(1~5):");
}

float get_a(void){
	int id ;
	float num = 0;
	
	display();
	while(scanf("%d", &id) == 1){
		if(id>5) {
			printf("\n2请根据菜单提示输入。");
			display();
			continue;
		}
		switch(id){
			case 1:num = 17850;return(num);
			case 2:num = 23900;return(num);
			case 3:num = 29750;return(num);
			case 4:num = 14875;return(num);
			case 5:return -1;
			default:break;
		}
	}
	return -1;
}

int main(){
	float num = 0;
	float base = 0;
	float salary_rate = 0;
	float salary = 0;
	
	while( base = get_a()){
		if(base < 0)break;
		printf("\n请输入您的应税金额:");
		scanf("%f", &num);
		
		salary_rate = num > base? base*RATE_BASE+(num-base)*RATE_LAST:num*RATE_BASE;
		salary = num - salary_rate;
		
		printf("工资总计:%f\n", num);
		printf("工资税金:%f\n", salary_rate);
		printf("工资到手:%f\n\n", salary);
	}	

	return 0;
}

10.3 结果显示

结果显示


11. 第11题

11.1 题目描述

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 是退出订购。程序要记录累计的重量。即如果用户输入 4 磅的甜菜。然后输入 5 磅的甜莱。程序应报告9磅的甜莱。然后,该程序要计算货物总价、折扣 (如果有的话)运费和包装费。随后,程序应显示所有的购买信息: 物品售价、订购的重量 (单位:磅)、订购的蔬莱费用、订单的总费用、折扣 (如果有的话)、运费和包装费、以及所有的费用总额。

11.2 编程源码

# include<stdio.h>

# define PRICE_O	2.05
# define PRICE_S	1.15
# define PRICE_P	1.09

# define LINE_DR	100
# define RATE_D		0.05

# define LINE_TR_F	5
# define LINE_TR_S	20
# define BASE_TR_F	6.5
# define BASE_TR_S	14
# define BASE_TR_T	0.5	

void display(void){
	printf("\n**************************************************************************\n");
	printf("蔬菜种类为: \n");
	printf("a) 洋蓟	b) 甜菜\n");
	printf("c) 胡萝卜 q) 退出\n");
	printf("**************************************************************************\n");
	printf("请输出您的选项(字母):");
}

int main(){
	float num = 0;
	float num_o = 0;
	float num_s = 0;
	float num_p = 0;
	float num_t = 0;
	
	float mon_o = 0;
	float mon_s = 0;
	float mon_p = 0;
	float mon_t = 0;
	
	float rate = 0;
	float tr = 0;
	float mon = 0;
	
	char c;
	display();
	while((c=getchar()) && c != 'q'){
		int flag = 0;
		char t;
		while((t=getchar()) && t!= '\n');
		
		printf("请输入蔬菜的磅数:");
		scanf("%f", &num);
		
		while((t=getchar()) && t!= '\n');
		
		switch(c){
			case 'a':num_o += num;break;
			case 'b':num_s += num;break;
			case 'c':num_p += num;break;
			default:flag = 1;break;
		}
		if(flag) {
			printf("\n2请根据菜单提示输入。");
			display();
			continue;
		}
		mon_o = num_o * PRICE_O;
		mon_s = num_s * PRICE_S;
		mon_p = num_p * PRICE_P;
		
		num_t = num_o + num_p + num_s;
		mon_t = mon_o + mon_p + num_s;
		
		rate = mon_t > LINE_DR?mon_t*(1-RATE_D):0;
		if(num_t<=LINE_TR_F){
			tr = BASE_TR_F;
		}else if(num_t < LINE_TR_S){
			tr = BASE_TR_S;
		}else{
			tr = BASE_TR_S + (num_t - LINE_TR_S)*BASE_TR_T;
		}
		
		mon = tr + mon_t;
		printf("\n-------------------------------------------------------------------------\n");		
		printf("|\t蔬菜\t|\t购买磅数\t|\t价格\t|\t总价\t|\n");
		printf("-------------------------------------------------------------------------\n");
		printf("|\t洋蓟\t|\t%.2f\t\t|\t%.2f\t|\t%.2f\t|\n", num_o, PRICE_O, mon_o);
		printf("|\t甜菜\t|\t%.2f\t\t|\t%.2f\t|\t%.2f\t|\n", num_s, PRICE_S, mon_s);
		printf("|\t胡萝卜\t|\t%.2f\t\t|\t%.2f\t|\t%.2f\t|\n", num_p, PRICE_P, mon_p);
		printf("-------------------------------------------------------------------------\n");
		printf("|\t总计\t|\t%.2f\t\t|\t--\t|\t%.2f\t|\n", num_t, mon_t);
		printf("-------------------------------------------------------------------------\n");
		printf("|\t优惠\t|\t%.2f\t\t|\t运费\t|\t%.2f\t|\n", rate, tr);
		printf("|\t总金额\t|\t%.2f\t\t\t\t\t\t|\n", mon);
		printf("-------------------------------------------------------------------------\n\n");
		
		display();
	}

	return 0;
}

11.3 结果显示

结果显示


  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值