《C Primer Plus(第五版)中文版》第7章第1至11题

本博客涵盖了《C Primer Plus(第五版)》第7章的部分练习题,包括读取字符计数、整数输入统计、字符串替换、工资计算、素数显示、税务计算以及购物订单总价的计算。涉及if/else和switch语句的应用,以及循环和条件判断的实践。
摘要由CSDN通过智能技术生成

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

#include <stdio.h>
#include <string.h>
int main(void){
	int bs = 0; //统计空格符
	int es = 0; //统计换行符
	int th = 0; //统计其它字符
	char ch;
	printf("请输入字符,输入#号后结束:\n");
	fflush(stdout);
	while((ch = getchar()) != '#'){
		if(ch == ' '){
			bs++;
		}
		else if(ch == '\n'){
			es++;
		}else
			th++;
	}
	printf("空格数:%d,换行符数:%d,其它字符 :%d\n",bs,es,th);
	printf("\nend\n");
	return 0;
}

2、编写一个程序。该程序读取输入直到遇到#字符,使程序打印每个输入的字符以及它的十进制ASCII码,每行打印8个字符/编码对,建 议:利用字符计数和模运符(%)在每8个循环周期时打印一个换行符。

#include <stdio.h>
#include <string.h>
int main(void){
	const int LINE = 8; //每行打印8个字符
	char ch;
	int chsum = 0; //统计输入的字符数
	printf("请输入字符串,以#号键结束:\n");
	fflush(stdout);
	while((ch = getchar()) != '#'){
		printf("%c %d\t",ch,ch);
		chsum++;
		if(chsum % LINE == 0)
			printf("\n");
	}
	printf("\n输入了%d个字符",chsum);
	printf("\nend\n");
	return 0;
}


3、编写一个程序,该程序读取整数,直到输入零,输入终止。输入终止后,程序应该报告输入的偶数(不包括零)总个数,偶数的平均值,输入的奇数总个数以及平均值。

#include <stdio.h>
#include <string.h>
int main(void){
	int sum = 0;
	int sum2 = 0;
	int sum2a =0;
	int sum3 = 0;
	int sum3a = 0;
	int n;
	printf("请输入整数,结束请输入0\n");
	fflush(stdout);
	while(scanf("%d",&n) != 0 && n != 0){
		sum++;
		if((n != 0) && (n % 2 == 0)){
			sum2++;
			sum2a += n;
		}
		else{
			sum3++;
			sum3a += n;
		}
	}
	printf("共%d个整数,其中%d个偶数,平均值为%d,%d个奇数,平均值为%d\n",sum,sum2,sum2a/sum2,sum3,sum3a/sum3);
	printf("\nend\n");
	return 0;
}

4、利用if else语句编写程序读取输入,直到遇到#号结束,用一个感叹号替换每个句号,将原有每个感叹号用两个感叹号代替,最后报告进行了多少次替代。

#include <stdio.h>
#include <string.h>
int main(void){
	char ch;
	int dousum = 0;
	int hansum = 0;
	printf("请入字符串并以#后键结束:\n");
	fflush(stdout);
	while((ch = getchar()) != '#'){
		if(ch == '!'){
			putchar(ch);
			printf("!");
			hansum++;
		}else if(ch == '.'){
			dousum++;
			printf("!");
		}else{
			putchar(ch);
		}
	}
	printf("\n替换了%d句号,替换了%d感叹号,总计%d处\n",dousum,hansum,dousum+hansum);
	printf("\nend\n");
	return 0;
}

5、用swich重做练习3

#include <stdio.h>
#include <string.h>
int main(void){
	int sum = 0;
	int sum2 = 0;
	int sum2a =0;
	int sum3 = 0;
	int sum3a = 0;
	int n;
	int a;
	printf("请输入整数,结束请输入0\n");
	fflush(stdout);
	while(scanf("%d",&n) != 0 && n != 0){
		sum++;
		switch(n % 2){
		case 0:
			sum2++;
			sum2a+=n;
			break;
		default:
			sum3++;
			sum3a+=n;
			break;
		}
	}
	printf("共%d个整数,其中%d个偶数,平均值为%d,%d个奇数,平均值为%d\n",sum,sum2,sum2a/sum2,sum3,sum3a/sum3);
	printf("\nend\n");
	return 0;
}

6、编写一个程序读取输入,直到遇到#,并报告序列号ei出现的次数。

#include <stdio.h>
#include <string.h>
int main(void){
	char ch,ch2;
	int sum = 0;
	printf("请输入字符串,并以#号键结束\n");
	fflush(stdout);
	while((ch = getchar()) != '#'){
		if(ch  == 'e'){
			ch2 = 'e';
			continue;
		}
		if(ch == 'i' && ch2 == 'e'){
			sum++;
		}
		ch2 = ch;
	}
	printf("共输入%d个ei\n",sum);
	printf("\nend\n");
	return 0;
}

7、编写一个程序,要求输入一周中工作小时数,然后打印工资总额,税金以及净工资,作如下假设:

a. 基本工资等级=10.00美元/小时

b.加班(超过40小时)=1.5倍的时间

c.税率 前300美元为 15%,下一个150美元为20%,余下的为25%

用#difine 定义常量,不必关心本例是否符合当前的税法

#include <stdio.h>
#include <string.h>

#define SHUI15 0.15
#define SHUI20 0.20
#define SHUI25 0.25

int main(void){
	float wtime;
	float g; //工资总额
	float shui; //税金
	float jg; //净工资

	printf("请输入工作的时间数:\n");
	fflush(stdout);
	scanf("%f",&wtime);
	if(wtime <= 40){
		g = wtime * 10.0;
		shui = g * SHUI15;
	}else{
		g = 40.0 * 10.0 + (wtime - 40) * 10.0 * 1.5;
		if((g - 300.0) < 150.0){
			shui = 300.0 * SHUI15 + (g - 300.0) * SHUI20;
		}else{
			shui = 300.0 * SHUI15 +150.0 * SHUI20 + (g - 450.0) * SHUI25;
		}
	}
	jg = g - shui;
	printf("工资总额:%.2f,税金:%.2f,净工资:%.2f",g,shui,jg);
	printf("\nend\n");
	return 0;
}

8、修改练习7,假设a,使程序提供一个选择工资等级的菜单,用switch选择工资等级,程序运行的开头应该像下面这样:

**********************************************************************************************************

请先择一个工资等级:

1) $8.75/小时                                    2) $9.33/小时

3) $10.0/小时                                    4) $11.20/小时

5) quit

***********************************************************************************************************

#include <stdio.h>
#include <string.h>

#define SHUI15 0.15
#define SHUI20 0.20
#define SHUI25 0.25

void fpd(void);
int main(void){
	float wtime;
	float g; //工资总额
	float shui; //税金
	float jg; //净工资
	int sw;
	float gz;
	fpd();
	while(scanf("%d",&sw) != 0){
		switch(sw){
			case 1:
				gz = 8.75;
				break;
			case 2:
				gz = 9.33;
				break;
			case 3:
				gz = 10.00;
				break;
			case 4:
				gz = 11.20;
				break;
		}
		if(sw < 5){
			printf("请输入工作的时间数:\n");
						fflush(stdout);
						scanf("%f",&wtime);
						if(wtime <= 40){
							g = wtime * gz;
							shui = g * SHUI15;
						}else{
							g = 40.0 * gz + (wtime - 40) * gz * 1.5;
							if((g - 300.0) < 150.0){
								shui = 300.0 * SHUI15 + (g - 300.0) * SHUI20;
							}else{
								shui = 300.0 * SHUI15 +150.0 * SHUI20 + (g - 450.0) * SHUI25;
							}
						}
						jg = g - shui;
						printf("工资总额:%.2f,税金:%.2f,净工资:%.2f\n",g,shui,jg);
						fpd();
		}else if(sw == 5){
			break;
		}else{
			printf("输入有误,请得重新输入:\n");
			fpd();
		}
	}
	printf("\nend\n");
	return 0;
}
void fpd(void){
	printf("***************************************************\n");
	printf("1) $8.75/小时                      2) $9.33/小时\n");
	printf("3) $10.00/小时                    4) $11.20/小时\n");
	printf("5) quit\n");
	printf("***************************************************\n");
	printf("请选择一个工资等级:");
	fflush(stdout);
}

9、编写一个程序,接受一个整数输入,然后显示所有小于或等于这个整数的素数

#include <stdio.h>
#include <string.h>
#include <math.h>
int is_prime(int n);
int main(void){
	int a,i,j;
	printf("请输入一个整数:\n");
	fflush(stdout);
	while(scanf("%d",&a) != 0){
		for(int i = 2;i<=a;i++){
			if(is_prime(i) == 1){
				printf("%d ",i);
				fflush(stdout);
			}
		}
		printf("\n请输入下一数,退出输入q:\n");
		fflush(stdout);
	}
	printf("\nend\n");
	return 0;
}

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

10、1988r年United Stated Federal Tax Schedule 是近期最基本的,它分为四类,每类有两个等级,下面是其摘要,美元数为应征税的收入

种类                                          税金

单身                                          前17850美元按15%,超出部份按28%

户主                                          前23900美元按15%,超出部份按28%

已婚,共有                              前29750美元按15%,超出部份按28%

已婚,离异                              前14875美元按15%,超出部份按28%

例如,有20000美元应征税收收入的单身记雇佣劳动者应缴税0.15*17850美元+0.28*(20000-17850)。编写一个程序,让用户指定税金种类和应征税收入,然后计算税金,使用循环,可以多次输入。


#include <stdio.h>
#include <string.h>
void menu(void);
double shuijing(int i,double shouru);
int main(void){
	int t;
	double shouru;
	menu();
	while(scanf("%d",&t) != 0){
		if(t>=1 && t<=4)
		{
			printf("请输入计算种类的收入\n");
			fflush(stdout);
			scanf("%lf",&shouru);
			printf("计算类型:%d  收入:%.2f  税金:%.2f\n",t,shouru,shuijing(t,shouru));
		}
		else if(t == 5){
			break;
		}else{
			printf("输入有误,请重新输入\n");
		}
		menu();
	}
	printf("\nend\n");
	return 0;
}
void menu(void){
	printf("\n****************************************************\n");
	printf("1.单身                  前17850美元按15%,超出部份按28%\n");
	printf("2.户主                  前23900美元按15%,超出部份按28%\n");
	printf("3.已婚,共有        前29750美元按15%,超出部份按28%\n");
	printf("4.已婚,离异        前14875美元按15%,超出部份按28%\n");
	printf("****************************************************\n");
	printf("请选择一个计算种类,退出按5或是q\n");
	fflush(stdout);
}

double shuijing(int i,double shouru){
	//参数i表示要计算的税金种类,取值范围为1~4
	//参数shouru表示要计算的收入是多少
	double s;
	const double ds = 17850.0;
	const double hz = 23900.0;
	const double yg = 29750.0;
	const double yl = 14875.0;
	const double shui15 = 0.15;
	const double shui28 = 0.28;
	if(i < 1 || i > 4) return 0;
	//--------------种类1----------------------------
	if(i == 1){
		if(shouru <= ds){
			s = shouru * shui15;
			return s;
		}else{
			s = ds * shui15 + (shouru-ds)*shui28;
			return s;
		}
	}
	//--------------种类2---------------------------
	if(i == 2){
			if(shouru <= hz){
				s = shouru * shui15;
				return s;
			}else{
				s = hz * shui15 + (shouru-hz)*shui28;
				return s;
			}
	}
	//--------------种类3---------------------------
		if(i == 3){
				if(shouru <= yg){
					s = shouru * shui15;
					return s;
				}else{
					s = yg * shui15 + (shouru-yg)*shui28;
					return s;
				}
		}
	//--------------种类4---------------------------
			if(i == 4){
					if(shouru <= yl){
						s = shouru * shui15;
						return s;
					}else{
						s = yl * shui15 + (shouru-yl)*shui28;
						return s;
					}
			}
	return 0;
}

11、ABC Mail Order Groccery朝鲜蓟的售价是1.25美元/磅,甜菜的售价是0.65美元/磅,胡罗卜的售价是0.89美元/磅,在添加运输费之前,他们为100美元的订单提供5%的打折优惠。对5磅或以上的定单收取3.50美元的运输和装卸费用,超过5磅而不足20磅的定单收取10.0美元的运输和装卸费;20磅或以上的运输,在8美元基础上每磅加0.1美元。

编写程序:在循环中使用switch语句,以便对输入a的响应是让用户输入所需的朝鲜蓟磅数,b为甜菜的磅数,c为胡萝卜的磅数,而q允许用户退出订购过程,然后程序计算总费用,折扣和运输费用(如果有运输费用的话),以及总数。随后程序应该显示所有购买信息:每磅的费用,订购的磅数,该订单每种菜的费用,订单的总费用、折扣,如果有的话加上运输费用,以及所有费用的总数。

#include <stdio.h>
#include <string.h>
float yfei(float t);
float xfei(char ch,float t);
float tt(void);
void menu(void);
void pxf(char ch,float xf,float zk,float yf,float t);
float zhekou(float xf);
int main(void){
	char ch;
	float xf[3]; //存放消费的单项费用xf[0]朝鲜蓟,xf[1]甜菜,xf[2]胡萝卜
	float yf[3]; //存放运费的单项费用
	float t[3];  //存放货物重量
	float zk[3]; //存放折扣
	menu();
	while(scanf("%c",&ch) != 0){
		if(ch == 'q')
			break;
		else{
			switch(ch){
			case 'a':
				t[0] = tt();
				xf[0] = xfei('a',t[0]);
				yf[0] = yfei(t[0]);
				zk[0] = zhekou(xf[0]);
				pxf('a',xf[0],zk[0],yf[0],t[0]);
				break;
			case 'b':
				t[1] = tt();
				xf[1] = xfei('b',t[1]);
				yf[1] = yfei(t[1]);
				zk[1] = zhekou(xf[1]);
				pxf('b',xf[1],zk[1],yf[1],t[1]);
				break;
			case 'c':
				t[2] = tt();
				xf[2] = xfei('c',t[2]);
				yf[2] = yfei(t[2]);
				zk[2] = zhekou(xf[2]);
				pxf('c',xf[2],zk[2],yf[2],t[2]);
				break;
			default:
				continue;
			}
		}
		menu();
	}
	printf("**********************************************************************************\n");
	printf("名称                重量                单价               折扣             运费                金额               总计\n");
	printf("朝鲜蓟            %.2f        %.2f       %.2f      %.2f        %.2f      %.2f\n",t[0],1.25,zk[0],yf[0],xf[0],yf[0]+xf[0]);
	printf("甜菜               %.2f        %.2f       %.2f      %.2f        %.2f      %.2f\n",t[1],0.65,zk[1],yf[1],xf[1],yf[1]+xf[1]);
	printf("胡萝卜            %.2f        %.2f       %.2f      %.2f        %.2f      %.2f\n",t[2],0.89,zk[2],yf[2],xf[2],yf[2]+xf[2]);
	printf("总计:%.2f美元\n",yf[0]+xf[0]+yf[1]+xf[1]+yf[2]+xf[2]);
	printf("**********************************************************************************\n");
	fflush(stdout);
	printf("end\n");
	return 0;
}

float yfei(float t){
	//t为磅数
	if(t <= 5.0) return 3.50;
	if(t > 5.0 && t < 20.0) return 10.0;
	if(t >= 20.0) return 8 + t*0.1;
	return 0;
}

void menu(void){
	printf("***************************************************\n");
	printf("a)朝鲜蓟        b)甜菜         c)胡萝卜    q)退出\n");
	printf("***************************************************\n");
	printf("请选择要要订购的蔬菜:\n");
	fflush(stdout);
}

float xfei(char ch,float t){
	//根据选择菜名ch,重量t返回所需要的费用

	const float c = 1.25; //朝鲜蓟
	const float tc = 0.65; //甜菜
	const float h = 0.89; //胡萝卜

	switch(ch){
	case 'a':
		if(c*t < 100.0)
			return c*t;
		else
			return c*t - c*t*0.05;
		break;
	case 'b':
		if(tc*t < 100.0)
			return tc*t;
		else
			return tc*t - tc*t*0.05;
		break;
	case 'c':
		if(h*t < 100.0)
			return h*t;
		else
			return h*t - h*t*0.05;
		break;
	default:
		return 0;
	}
}
float tt(void){
	//返回货物的重量
	float t;
	printf("请输入货物重量\n");
	fflush(stdout);
	scanf("%f",&t);
	return t;
}
void pxf(char ch,float xf,float zk,float yf,float t){
	//打印显示本项输入货物的名细
	switch(ch){
	case 'a':
		printf("朝鲜蓟:%.2f磅\t单价:%.2f美元/磅\t 折扣:%.2f美元\t运费:%.2f美元\t 金额:%.2f美元\n",t,1.25,zk,yf,xf+yf);
		break;
	case 'b':
		printf("甜菜:%.2f磅\t单价:%.2f美元/磅\t 折扣:%.2f美元\t运费:%.2f美元\t 金额:%.2f美元\n",t,1.25,zk,yf,xf+yf);
		break;
	case 'c':
		printf("胡萝卜:%.2f磅\t单价:%.2f美元/磅\t 折扣:%.2f美元\t运费:%.2f美元\t 金额:%.2f美元\n",t,1.25,zk,yf,xf+yf);
		break;
	default:
		printf("发生错误\n");
	}
}

float zhekou(float xf){
	if(xf < 100.0) return 0;
	if(xf >= 100.0) return xf * 0.05;
	return 0;
}


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值