C Primer Plus 第七章习题

目前无聊学习下C语言,顺便谢谢这些题,不一定是最好方案,但基本能符合题意。有问题欢迎多多交流哈~

编程七步骤:

1.定义程序的目标

2.设计程序

3.编写代码

4.编译

5.运行程序

6.测试和调试程序

7.维护和修改程序

目前改觉自己每次写代码都没有先进行程序设计直接就编写代码了,这是一个不好的习惯,这一章的练习我会每个练习题都先写程序设计思路再进行编码。

/*
1.编写一个程序读取输入,读到#字符停止,然后报告读取的空格
数、换行符数和所有其他字符的数量。
程序设计:
1.定义一个char字符变量,定义要统计字符3个变量 
2.使用getchar方法读取输入,当读取返回#停止读取 
3.使用循环打印字符, 判断空格(int值 32或' ')换行符号(\n)和其他字符 
 
*/ 
#include <stdio.h>
int main(void)
{
	char input;
	int blank = 0;
	int enter = 0;
	int other = 0; 
	printf("请输入字符串,以#为统计停止符号\n");

	while((input=getchar())!='#'){
		if(input == '#'){
			break;
		}
		if(input==' '){
			blank++;
		}else if(input == '\n'){
			enter++;
		}else{
			other++;
		}
		
	}
		printf("空格数量为%d,换行字符数量为:%d,其他字符数量为:%d",blank,enter,other);
}
/*
2.编写一个程序读取输入,读到#字符停止。程序要打印每个输入
的字符以及对应的ASCII码(十进制)。一行打印8个字符。建议:使用
字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
程序设计:
1.定义一个char字符接收输入的字符
2.使用getchar方法读取输入,使用while循序读取输入字符,当读取返回#停止读取 
3.使用一个计数变量统计读取到的输入字数,当%8等于零时则进行换行打印 
 
*/ 
#include <stdio.h>
int main(void)
{
	char input;
	int count = 0;
	
	printf("请输入字符串,以#为统计停止符号\n");

	while((input=getchar())!='#'){
		count++; 
		
		if(input == '#'){
			break;
		}
		printf("%c%d ",input,input);
		
		if(count%8==0){
		printf("\n");
		}
		
	}
	return 0;
		
}
/*
3.编写一个程序,读取整数直到用户输入 0。输入结束后,程序应
报告用户输入的偶数(不包括 0)个数、这些偶数的平均值、输入的奇
数个数及其奇数的平均值。

分析:
1.需要定义一个int类型变量接收用户输入
2. 定义一个偶数和变量,一个奇数和变量,还有奇数和偶数的计数器变量 
3.写一个死循环,当用户输入0后跳出循环,计数平均值
想要获取小数的结果被除数需要乘以1.0变成小数后进行计算。 
  
*/ 
#include <stdio.h>
int main(void)
{
	int input;
	//偶数 
	int count_even = 0;
	long add_even = 0;
	//奇数 
	int count_odd = 0;
	long add_odd = 0; 
	while(1){
		printf("请输入整数,输入0退出程序\n");
		scanf("%d",&input);
		if(input == 0){
			if(count_even>0){
			printf("输入的偶数个数为%d,平均值为%.2f\n",count_even,add_even*1.0/count_even);
			}
			if(count_odd>0){
			printf("输入的奇数个数为%d,平均值为%.2f\n",count_odd,add_odd*1.0/count_odd);
			}
			
			break;
		}
		if(input%2 == 0){
			count_even++;
			add_even += input; 
		}else{
			count_odd++;
			add_odd += input;
		}
		
	} 

	return 0;
		
}
/*
4.使用if else语句编写一个程序读取输入,读到#停止。用感叹号替
换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替
换。
程序设计:
1.定义一个字符变量接收getchar()输入,使用while循环判断
2. 定义一个int类型的替换计数器,通过if语句判断输入的句号和感叹号并计数
3.当用户输入#退出循环后打印替换次数 
这里只能统计英文输入 
 
*/ 
#include <stdio.h>
int main(void)
{
	char input;
	int count = 0;
	
	printf("请输入字符串,以#为统计停止符号\n");

	while((input=getchar())!='#'){
			printf("%c \n",input);
		if(input == '.'){
			input = '!';
			count++; 
		} else if(input == '!'){
			input = '!!';
			count++; 
		}
	}
	printf("替换次数为%d",count);
	return 0;
		
}

/*
5.使用switch编写一个程序读取输入,读到#停止。用感叹号替
换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替
换。
程序设计:
1.定义一个字符变量接收getchar()输入,使用while循环判断
2. 定义一个int类型的替换计数器,通过if语句判断输入的句号和感叹号并计数
3.当用户输入#退出循环后打印替换次数 
这里只能统计英文输入 
 
*/ 
#include <stdio.h>
int main(void)
{
	char input;
	int count = 0;
	
	printf("请输入字符串,以#为统计停止符号\n");

	while((input=getchar())!='#'){
			printf("%c \n",input);
			
			switch(input){
			case '.':
				input = '!';
				count++; 
				break;	
			case '!':
			    input = '!!';
				count++;
				break;
			default:
				break;
			}
	}
	printf("替换次数为%d",count);
	return 0;
		
}

/*
6.编写程序读取输入,读到#停止,报告ei出现的次数。
注意
该程序要记录前一个字符和当前字符。用“Receive your eieio
award”这样的输入来测试。
程序设计:
1.使用getchar()来获取字符输入,并当输入为#号时退出程序
2.使用两个char变量记录字符,它们合并一起为ei时定义的int计数器加1
3.打印计数器 
 
*/ 
#include <stdio.h>
int main(void)
{
	char input;
	char before; 
	int count = 0;
	
	printf("请输入字符串,以#为统计停止符号\n");

	while((input=getchar())!='#'){	
		if(before == 'e' && input == 'i')
		{
			count++;
		} 
		before = input; 
	}
	printf("ei的次数为%d\n",count);
	return 0;
		
}
/*
6.编写程序读取输入,读到#停止,报告ei出现的次数。
注意
该程序要记录前一个字符和当前字符。用“Receive your eieio
award”这样的输入来测试。
程序设计:
1.使用getchar()来获取字符输入,并当输入为#号时退出程序
2.使用两个char变量记录字符,它们合并一起为ei时定义的int计数器加1
3.打印计数器 
 
*/ 
#include <stdio.h>
int main(void)
{
	char input;
	char before; 
	int count = 0;
	
	printf("请输入字符串,以#为统计停止符号\n");

	while((input=getchar())!='#'){	
		if(before == 'e' && input == 'i')
		{
			count++;
		} 
		before = input; 
	}
	printf("ei的次数为%d\n",count);
	return 0;
		
}
/*
7.编写一个程序,提示用户输入一周工作的小时数,然后打印工资
总额、税金和净收入。做如下假设:
a.基本工资 = 1000美元/小时
b.加班(超过40小时) = 1.5倍的时间
c.税率: 前300美元为15%
续150美元为20%
余下的为25%
用#define定义符号常量。不用在意是否符合当前的税法。
分析:
1.定义基本工资、税率常量
2.定义一个float类型变量接收用户输入
3.工资总额 = 时间*基本工资 +加班时间*1.5倍基本工资
  税金根据总工资额分:三种,前300,300-450,450之后
  净收入 = 工资总额 - 税金 
*/ 
#include <stdio.h>
#define BASE 1000
#define TAX_RATE_1 0.15
#define TAX_RATE_2 0.20
#define TAX_RATE_3 0.25
int main(void)
{
	float workTime;
	float salary;
	float tax;
	float income;
	
	
	printf("请输入一周的工作时间\n");
 
 	scanf("%f",&workTime);
	if(workTime > 40){
		salary = 40*BASE+(workTime - 40)*BASE*1.5;
		tax =  300*TAX_RATE_1 + 150*TAX_RATE_2 + (salary - 300 - 150)*TAX_RATE_3;
		income = salary - tax;
	}else if(workTime > 0) {
		salary =  workTime*BASE;
		if(salary <= 300){
			tax = salary*TAX_RATE_1; 
		}else if(salary <= 450){
			tax = 300*TAX_RATE_1+ (salary-300)*TAX_RATE_2;
		}else {//大于450 
			tax = 300*TAX_RATE_1+ 150*TAX_RATE_2+(salary - 300 - 150)*TAX_RATE_3;
		}
		income = salary - tax;
	}else {
		printf("输入的时间有误\n");
		return 0;
	}
	
	printf("工资总额为%.2f,税金为%.2f,净收入为%.2f.\n",salary,tax,income);
	return 0;
		
}
/*
8.修改练习7的假设a,让程序可以给出一个供选择的工资等级菜
单。使用switch完成工资等级选择。运行程序后,显示的菜单应该类似
这样:
*********************************************************
********
Enter the number corresponding to the desired pay rate or 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创建符号常量表示各工资等级和税率。
分析:
1.定义基本工资、税率常量
2.定义一个float类型变量接收用户输入
3.工资总额 = 时间*基本工资 +加班时间*1.5倍基本工资
  税金根据总工资额分:三种,前300,300-450,450之后
  净收入 = 工资总额 - 税金 
*/ 
#include <stdio.h>
#define TAX_RATE_1 0.15
#define TAX_RATE_2 0.20
#define TAX_RATE_3 0.25
void worksalary(int inputNum);
void tips();
int main(void)
{	
	float base; 
	int inputNum;
	tips();
	scanf("%d",&inputNum);
	while(inputNum != 5){
	
	if(inputNum >0&&inputNum<5){
		worksalary(inputNum);
	}else{
		printf("输入的值有误,请重新输入\n");
	}		
	tips();
	scanf("%d",&inputNum);
	}
	
	return 0;
		
}
void tips(){
	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 3) $10.00/hr  4) $11.20/hr \n 5) quit\n");
	printf("*********************************************************\n");
}
void worksalary(int inputNum){
	float workTime;
	float salary;
	float tax;
	float income;
	float base;
	
	switch(inputNum){
		case 1:
		base = 8.75;
		break;
		case 2:
		base = 9.33;
		break; 
		case 3:
		base = 10.00;
		break; 
		case 4:
		base = 11.20;
		break; 
		default:
		base = 0.00;
		break;  
	}
	
	printf("请输入一周的工作时间\n");
 
 	scanf("%f",&workTime);
	if(workTime > 40){
		salary = 40*base+(workTime - 40)*base*1.5;
		tax =  300*TAX_RATE_1 + 150*TAX_RATE_2 + (salary - 300 - 150)*TAX_RATE_3;
		income = salary - tax;
	}else if(workTime > 0) {
		salary =  workTime*base;
		if(salary <= 300){
			tax = salary*TAX_RATE_1; 
		}else if(salary <= 450){
			tax = 300*TAX_RATE_1+ (salary-300)*TAX_RATE_2;
		}else {//大于450 
			tax = 300*TAX_RATE_1+ 150*TAX_RATE_2+(salary - 300 - 150)*TAX_RATE_3;
		}
		income = salary - tax;
	}else {
		printf("输入的时间有误\n");
	
	}
	if(workTime > 0){
		printf("工资总额为%.2f,税金为%.2f,净收入为%.2f.\n",salary,tax,income);
	}
	
}
/*
9.编写一个程序,只接受正整数输入,然后显示所有小于或等于该
数的素数。
分析:
1.只接受正整数,可以根据输入的数进行判断,输入0或负数则退出 
2.接收到整数后需要对它进行循环遍历,打印等于或者小于它的素数
3.定义一个变量接收输入,通过递减对每个数遍历取模,当存在可以被整除的数,则非素数 
*/ 
#include <stdio.h>
int main(void)
{	
	int input;
	int count;
	printf("请输入一个正整数:\n");
 	scanf("%d",&input);
 	
 	if(input<= 0){
	 printf("输入有误,请重新输入一个正整数\n"); 
	 scanf("%d",&input);
	 }
	 	for(int i = input;i > 1; i--){
			count = 0;
	 		for(int j = 2; j< i ; j++){
			 
		 		if(i%j== 0){//如果这个数能被一个小于它的数整除,则不是素数 
		 			count++;
		 			break;
				 }
			 }
			 if (count == 0){
			 printf("%d ",i);
			 }
	 
	 }
	 
	
	return 0;
		
}

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

分析:
1.提供四种身份给用户选择
2.需要循环输入,当输入非预期退出程序
3.定义一个变量接收用户身份选择,定义另一个变量接收用户输入的工作收入 
4.定义一个变量接收税金,最后打印税金 
*/ 
#include <stdio.h>
void tips(); 
int main(void)
{	
	int select;
	float income;
	int selectCount;
	int incomeCount;
	int base;
	float tax;
	while(1){
		
		tips();
		int selectCount = scanf("%d",&select);
		if(selectCount!=1||select>4||select<=0){
			printf("输入有误,程序退出");
			break; 
		}
		printf("请输入你的收入\n");
		int incomeCount = scanf("%f",&income);
		
		if(incomeCount!=1||income<=0){
			printf("输入有误,程序退出");
			break; 
		}
		
		if(select==1){
				base = 17850;
			
		}else if(select==2){
			
				base = 23900;
		
		}else if(select==3){
			
				base = 29750;
		
		}else if(select==4){
				base = 14875;
		
		}
		if(income>base){
				tax = base*0.15+(income - base)*0.28;
			}else{
				tax = base*0.15;
			}
		printf("税金为:%.2f\n",tax);
	
	}
	
	return 0;
		
}
void tips(){
	printf("*********************************************************\n");
	printf("请选择你的身份\n");
	printf("1.单身	2.户主	3.已婚、共有	4.已婚、离异\n 输入其他退出程序\n");
	printf("*********************************************************\n");
}

 这个程序觉得写的不是很好~等后续有时间再优化了

/*
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 是
退出订购。程序要记录累计的重量。即,如果用户输入 4 磅的甜菜,
然后输入 5磅的甜菜,程序应报告9磅的甜菜。然后,该程序要计算货
物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所
有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费
用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有
的费用总额。
分析:
1.先定义常量不同的货品价格 
2.货品价格超100有5%优惠
3.不同重量运费不同
4、使用循环让用户选择货品
5、根据选择的货品最终输出总费用、折扣、运费和包装费、所有总费用
*/ 
#include <stdio.h>
void tips();
void price(float price,float weight,char select); 
int main(void)
{	
	const float a = 2.05;
	float a_cost= 0.0;
	const float b = 1.15;
	float b_cost= 0.0;
	const float c = 1.09;
	float c_cost= 0.0;
	char select = '0';
	float weight = 0;
	float a_weight= 0.0;
	float b_weight= 0.0;
	float c_weight= 0.0;
	float all_weight = 0.0; 
	float allCost= 0.0; 
	float discount = 0.0;
	//运费 
	float freight;
	int isok;//输入是否有效判断 
	
	while(1){
	if(select != '\n'){//避免提示两次 
		tips();
	}
 	scanf("%c",&select);
 	if(select == '\n'){
	 //去掉输入行末尾结束符号 
	 continue;
	 }	
	
 	printf("%c品种品种\n\n",select);
	if(select == 'q'){
		printf("退出订购\n");
		break;
	}
	printf("请输入购买的重量\n");
	scanf("%f",&weight);
	switch(select){
	case 'a':
	a_cost += a*weight;
	a_weight+=weight;
	break;
	case 'b':
	b_cost += b*weight;
	b_weight+=weight;
	break;
	case 'c':
	c_cost += c*weight;
	c_weight+=weight;
	break;
	}

	all_weight = a_weight+b_weight+c_weight;//总重量
	allCost =  a_cost+ b_cost+c_cost; //订单总费用 
	if(all_weight <= 5&& all_weight > 0){
		 	freight = 6.5;
		 }else if(all_weight > 5 && all_weight <= 20){
 			freight = 14;
		 }else if(all_weight > 20){
		 	freight = 14+ (all_weight - 20)*0.5;
		 }
 	if(allCost >= 100){
	 discount = allCost*0.05;
	 }
/*物品售价、订购的重量(单位:磅)、订购的蔬菜费
用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有
的费用总额。*/
	if(a_cost>0){
	printf("洋蓟售价为 2.05美元/磅,订购重量为%.2f,订购的蔬菜费用为%.2f,\n",a_weight,a_cost);
	}
	 if(b_cost>0){
	printf("甜菜售价为1.15 美元/磅,订购重量为%.2f,订购的蔬菜费用为%.2f,\n",b_weight,b_cost);
	}
	 if(c_cost>0){
	printf("胡萝卜售价为 1.09美元/磅,订购重量为%.2f,订购的蔬菜费用为%.2f,\n",c_weight,c_cost);
		}
	printf("订单的总费用为%.2f,",allCost);
	if(discount > 0){
	printf("折扣为%.2f,",discount);
	}
	printf("运费和包装费为%.2f,",freight);
	printf("所有总费用为%.2f.\n\n\n",(allCost+freight-discount));
	}
	return 0;		
}

void tips(){
	printf("*********************************************************\n");
	printf("请选择你要购买的货品\n");
	printf("a.洋蓟	b.甜菜	c.胡萝卜	q.退出订购\n ");
	printf("*********************************************************\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值