C Primer Plus 第六版 第七章编程题(每题附带原书标准题目和测试结果:))

本人自己初学C语言,如果有错误,请帮忙指出,多多担待。谢谢!
运行环境为DevCpp
第七章共十一道题。

第一题:

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

int main(){
     
	char str=0;
	int space=0;
	int enter=0;
	int ch=0; 
	int i;
	
	printf("Please input what you want to write:\n");
	
	    //scanf("%c",&str);
		while((str=getchar())!='#'){
     
			if(str==' '){
     
				space++;
			}else if(str=='\n'){
     
				enter++;
			}else{
     
				ch++;
			}
		}
		printf("\n\n\n");
		printf("Input space %d times.\n",space);
		printf("Input enter %d times.\n",enter);
		printf("Input other words %d times.\n",ch);
		printf("END!\n");
	
	return 0;
} 

运行结果:

Please input what you want to write:
抗裂砂浆领放卡看到了考虑不车 klskk
sdjaklj 'ld'a  ,s;ada[]
a;sld;akd[acp,zx;cc
sd;la'lda'd
d;
s;c,;x'c.#,ds'dplf[pdl[s



Input space 9 times.
Input enter 5 times.
Input other words 94 times.
END!

--------------------------------
Process exited after 39.9 seconds with return value 0
请按任意键继续. . .

第二题:

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

int main(){
     
	char ch;
	int i=0;
	
	printf("请输入您想要转换的文本(输入'#'代表结束文本):\n");
	while((ch=getchar())!='#'){
     
		if(ch=='\n'){
     
			i=0;
			printf("换行符的ASCII码为%d\n",ch);
			continue;
		}
		i++;
		printf("%c的ASCII码为%d\n",ch,ch);
		if((i==Row)){
     
			i=0;
			printf("\n");
		}
	}
	printf("END!\n");
	return 0;
}

运行结果:

请输入您想要转换的文本(输入'#'代表结束文本):
zsjf, l;[]c'
z的ASCII码为122
s的ASCII码为115
j的ASCII码为106
f的ASCII码为102
,的ASCII码为44
 的ASCII码为32
l的ASCII码为108
;的ASCII码为59

[的ASCII码为91
]的ASCII码为93
c的ASCII码为99
'的ASCII码为39
换行符的ASCII码为10
#
END!

--------------------------------
Process exited after 23.37 seconds with return value 0
请按任意键继续. . .

//:’#'这个字符是在换行之后再次打印的,为了证明一下 运行结果

第三题:

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

int main(){
     
	int num;
	int i=0;
	int j=0;
	double sum1=0.0;
	double sum2=0.0;
	double average1=0.0;
	double average2=0.0;
	
	printf("请输入一个大于零的整数(如果输入数字 0 则输入结束!):\n");
	while((scanf("%d",&num))&&(num!=0)){
     
		if(num%2==0){
     
     		sum1+=num;
     		i++;
		}else{
     
			sum2+=num;
			j++;
		}
	}
	
	average1=sum1/i;
	average2=sum2/j;
	
	if(i>0){
     
	    printf("您输入的偶数个数为:%d 个,这些偶数的平均值为:%lf.\n",i,average1);
	}else{
     
		printf("您输入的数字没有偶数!\n");
	}
	
	if(j>0){
     
	    printf("您输入的奇数个数为:%d 个,这些奇数的平均值为:%lf.\n",j,average2);
	}else{
     
		printf("您输入的数字没有奇数!\n");
	}
	printf("END!\n");
	
	return 0;
}

运行结果:

请输入一个大于零的整数(如果输入数字 0 则输入结束!):
5
4
78
56
33
53
49
0
您输入的偶数个数为:3 个,这些偶数的平均值为:46.000000.
您输入的奇数个数为:4 个,这些奇数的平均值为:35.000000.
END!

--------------------------------
Process exited after 14.36 seconds with return value 0
请按任意键继续. . .

第四题:
注:请用英文字符进行测试,由于还没有学会中文字符串的应用,这是个bug!
请一定用英文字符进行测试!!!谢谢!!!

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

int main(){
     
	char str;;
	int i=0;
	int j=0;
	int k=0;
	
	printf("请输入您想测试的一段话('#'代表停止):\n"); 
	while((str=getchar())!='#'){
     
		if(str=='.'){
     
			putchar('!');
			i++;
		}else if(str=='!'){
     
			putchar('!');
			putchar('!');
			j++;
		}else{
     
			putchar(str);
		}
	}
	k=i+j;
	printf("\n");
	printf("'.'进行了%d次替换,'!'进行了%d次替换,一共进行了%d次替换。\n",i,j,i+j);
	printf("END!\n"); 
	
	return 0;
} 

运行结果:

请输入您想测试的一段话('#'代表停止):
jdios.jsioajdoa!jojdoasd.!!joisajdoa.jcidosjcs!!!..sw#
jdios!jsioajdoa!!jojdoasd!!!!!joisajdoa!jcidosjcs!!!!!!!!sw
'.'进行了5次替换,'!'进行了6次替换,一共进行了11次替换。
END!

--------------------------------
Process exited after 28.53 seconds with return value 0
请按任意键继续. . .

第五题:

/*
使用switch重写第四题 
*/
#include

int main(){
     
	char str;;
	int i=0;
	int j=0;
	int k=0;
	
	printf("请输入您想测试的一段话('#'代表停止):\n"); 
	while((str=getchar())!='#'){
     
		switch(str){
     
			case '.':
				putchar('!');
				i++;
				break;
			case '!':
				putchar('!');
				putchar('!');
				j++;
				break;
			default:
				putchar(str);
		}
	}
	k=i+j;
	printf("\n");
	printf("'.'进行了%d次替换,'!'进行了%d次替换,一共进行了%d次替换。\n",i,j,i+j);
	printf("END!\n"); 
	
	return 0;
} 

运行结果:

请输入您想测试的一段话('#'代表停止):
jdios.jsioajdoa!jojdoasd.!!joisajdoa.jcidosjcs!!!..sw#
jdios!jsioajdoa!!jojdoasd!!!!!joisajdoa!jcidosjcs!!!!!!!!sw
'.'进行了5次替换,'!'进行了6次替换,一共进行了11次替换。
END!

--------------------------------
Process exited after 3.763 seconds with return value 0
请按任意键继续. . .

第六题:

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

int main(){
     
	char ch;
	int e=0;
	int i=0;
	
	printf("用'Receive your eieio award''这样的输入来测试(程序读到'#'停止):\n");
	while((ch=getchar())!='#'){
     
		switch(ch){
     
			case 'e':
				e++;
				putchar(ch);
				break;
			case 'i':
				i++;
				putchar(ch);
				break;
			default:
				putchar(ch);
		}
	}
	printf("\n");
	printf("报告!\n字符'e'出现的次数为%d,字符'i'出现的次数为%d,字符'e'和'i'一共出现的次数为:%d\n报告完毕!\n"
	       ,e,i,(e+i));
    
	return 0; 
}

运行结果:

'Receive your eieio award''这样的输入来测试(程序读到'#'停止):
Receive your eieio award#
Receive your eieio award
报告!
字符'e'出现的次数为5,字符'i'出现的次数为3,字符'e''i'一共出现的次数为:8
报告完毕!

--------------------------------
Process exited after 4.474 seconds with return value 0
请按任意键继续. . .

第七题:

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

int main(){
     
	double hours;
	double hour;
	double sum;   //工资总额 
	double tax;   //税金 
	double profit; //净收入 
	
	printf("请输入您一周工作的小时数:\n");
	scanf("%lf",&hours);
	while(hours<0){
     
		printf("请重新输入有效的小时(大于0)的数!\n");
		scanf("%lf",&hours);
	}
	if(hours<=40){
     
		sum=Base*hours;
	}else {
     
		hour=(hours-40)*AddTimes+40;
		sum=Base*hour;
	} 
	if(sum<=300){
     
		tax=sum*RateA;
		profit=sum-tax;
	}else if(sum<=450){
     
		tax=(sum-300)*RateB+300*RateA;
		profit=sum-tax;
	}else{
     
		tax=(sum-300-150)*RateC+(450-300)*RateB+300*RateA;
		profit=sum-tax;
	}
	
	printf("您一周工作的时间为%lf小时.\n",hours);
    printf("您的工资总额为:%lf美元.\n",sum);
    printf("您需要交纳%lf美元的税金.\n",tax);
	printf("您的净收入为%lf美元.\n",profit);
	printf("谢谢您的使用!\n");
	
	return 0;
}

运行结果:

请输入您一周工作的小时数:
50.6
您一周工作的时间为50.600000小时.
您的工资总额为:55900.000000美元.
您需要交纳13937.500000美元的税金.
您的净收入为41962.500000美元.
谢谢您的使用!

--------------------------------
Process exited after 3.695 seconds with return value 0
请按任意键继续. . .

第八题:

/*
修改练习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
#define RateA 0.15
#define RateB 0.2
#define RateC 0.25
#define AddTimes 1.5

int main(){
     
	int i=2;
	float salary;
	float hours;
	float hour;
	float sum;
	float tax;
	float profit;
	
    do{
     
		printf("请选择您的工资等级(输入1-5):\n");
		printf("*******************************************************************************\n");
		printf("Enter the number corresponding to the desired pay rate of 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");
		scanf("%d",&i);
		
		while(i<1||i>5){
     
			printf("请输入正确的选项!(例如:1、2、3、4、5)\n");
			scanf("%d",&i);
		}
    }while(i<1||i>5);
    
    while(i != 5){
     
		switch(i){
     
			case 1 :
				salary = 8.75;
				break;
			case 2 :
				salary = 9.33;
				break;
			case 3 :
				salary = 10.00;
				break;
			case 4 :
				salary = 11.20;	
		}
		printf("请输入您的工作时间:\n");
		scanf("%f",&hours);
		while(hours<0){
     
			printf("请输入有效的工作时间(工作时间大于0)!\n");
			printf("请重新输入您的工作时间:");
			scanf("%f",&hours); 
		}
		if(hours>0&&hours<=40){
     
			sum=salary*hours;
		} else{
     
			hour=(hours-40)*AddTimes+40;
			sum=salary*hour;
		}
		
		if(sum<=300){
     
			tax=sum*RateA;
		}else if(sum<=450){
     
			tax=(sum-300)*RateB+300*RateA;
		}else{
     
			tax=(sum-450)*RateC+(450-300)*RateB+300*RateA;
		}
		profit=sum-tax;
		
		printf("您的工作时间为:%f小时\n",hours);
		printf("您的基本工资为:$%f/hr\n",salary);
		printf("您的工资总额为:$%f\n",sum);
		printf("您的工资税费为:$%f\n",tax);
		printf("您的净收入为:$%f\n",profit);
		
		printf("您可以重新选择您的工资等级!\n");
		scanf("%d",&i);
    }
    
	printf("感谢您的使用!欢迎下次再来!\n");
	return 0;
}

运行结果:

请选择您的工资等级(输入1-5):
*******************************************************************************
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
*******************************************************************************
6
请输入正确的选项!(例如:123452
请输入您的工作时间:
50
您的工作时间为:50.000000小时
您的基本工资为:$9.330000/hr
您的工资总额为:$513.150024
您的工资税费为:$90.787506
您的净收入为:$422.362518
您可以重新选择您的工资等级!
5
感谢您的使用!欢迎下次再来!

--------------------------------
Process exited after 19.46 seconds with return value 0
请按任意键继续. . .

第九题:

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

int main(){
     
    int num;
    int div;
    int i;
    bool judge=true;
    
    printf("请输入一个正整数:");
    while((scanf("%d",&num))==1){
     
        if(num<=1){
     
         	printf("%d这个数字没有素数!\n",num);
		}else{
     
			 for(i=2;i<=num;i++){
     
			 	judge=true;
			 	for(div=2;div*div<=i;div++){
     
			 		if(i%div==0){
     
			 		   judge=false;
				    }
				}
				if(judge){
     
					printf("%d是素数\n",i);
				}
			}
	    }
		 printf("请重新输入一个正整数:"); 
	} 
	printf("END!\n");
	return 0; 
}

运行结果:

请输入一个正整数:15
2是素数
3是素数
5是素数
7是素数
11是素数
13是素数
请重新输入一个正整数:0
0这个数字没有素数!
请重新输入一个正整数:-1
-1这个数字没有素数!
请重新输入一个正整数:1
1这个数字没有素数!
请重新输入一个正整数:2
2是素数
请重新输入一个正整数:a
END!

--------------------------------
Process exited after 38.08 seconds with return value 0
请按任意键继续. . .

第十题:

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

int main(){
     
	int i,Base;
	float sum,tax;
	
	do{
     
		printf("           如下是1988年的美国联邦税收计划中的税收方案\n");
		printf("*************************************************************************\n");
		printf("    类别				税金\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("请输入您对应的类别的序号:");
		scanf("%d",&i); 
	}while(i<1||i>5);
	
	while(i>0&&i<5){
     
		switch(i){
     
			case 1 :
				Base=17850;
				break;
		    case 2 :
		    	Base=23900;
		    	break;
		    case 3 :
		    	Base=29750;
		    	break;
		    case 4 :
		    	Base=14875;
		    	break;
		}
		printf("请输入您的工资:");
		scanf("%f",&sum);
		if(sum<Base){
     
			tax=sum*Rate;
		}else{
     
		    tax=Base*Rate+(sum-Base)*AddRate; 
		}			
		printf("\n您的类别为%d,您应缴纳的税金为%f美元\n",i,tax);
		printf("您可以再次输入对应的类别的序号:");
		scanf("%d",&i);
	}
	printf("您输入的序号不正确!欢迎下次再来!\n");
	
	return 0;
}

运行结果:

            如下是1988年的美国联邦税收计划中的税收方案
*************************************************************************
    类别                                税金
1)、单身                                17850美元按15计,超出部分按282)、户主                                23900美元按15计,超出部分按283)、已婚,共有                           29750美元按15计,超出部分按284)、已婚,离异                           14875美元按15计,超出部分按28*************************************************************************
请输入您对应的类别的序号:1
请输入您的工资:20000

您的类别为1,您应缴纳的税金为3279.500000美元
您可以再次输入对应的类别的序号:0
您输入的序号不正确!欢迎下次再来!

--------------------------------
Process exited after 8.266 seconds with return value 0
请按任意键继续. . .

第十一题:

/*
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磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。
随后,程序显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、
订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额。
*/
#include
#define Discount 0.05     
#define Add1 6.5
#define Add2 14
#define Add3 0.5
#define artichoke 2.05   //洋蓟
#define beet 1.15        //甜菜
#define carrot 1.09
#define Base 100

int main(){
     
	float vegetable=0.0;
	float order=0.0;
	float discounts=0.0;
	float packet=0.0;
	float sum=0.0;
	float artichokes=0.0;
	float beets=0.0;
	float carrots=0.0;
	char ch;
	float mount; 
	float mounts1=0.0;
	float mounts2=0.0;
	float mounts3=0.0;
	
	printf("     ABC邮购杂货店\n");
	printf("*********************************\n");
	printf("   类别        售价\n");
	printf("a、洋蓟        2.05美元/磅\n");
	printf("b、甜菜        1.15美元/磅\n");
	printf("c、胡萝卜      1.09美元/磅\n");
	printf("q、推出订购    敬请期待!\n");
	printf("*********************************\n");
	
	printf("请您输入您想要购买蔬菜类别的序号:");
	if((scanf("%c",&ch))==1){
     
			switch(ch){
     
				case 'a' :
					printf("\n请您输入购买洋蓟的数量(以磅为单位):"); 
	                scanf("%f",&mounts1);
				case 'b' :
					printf("\n请您输入购买甜菜的数量(以磅为单位):"); 
	                scanf("%f",&mounts2);
	            case 'c' :
	            	printf("\n请您输入购买胡萝卜的数量(以磅为单位):"); 
	                scanf("%f",&mounts3);
	            case 'q' :
				    printf("\n敬请期待!\n"); 
				    break;
		}
    }

		mount=mounts1+mounts2+mounts3;
		artichokes=artichoke*mounts1;
		beets=beet*mounts2;
		carrots=carrot*mounts3;
		vegetable=artichokes+beets+carrots;
		
		if(vegetable>Base){
     
			discounts=vegetable*Discount;
		}else{
     
			discounts=0;
		}
		
		order=vegetable-discounts; 
		
		if(mount<=5){
     
			packet=Add1;
		}else if(mount>5&&mount<=20){
     
			packet=Add2;
		}else{
     
			packet=Add2+(mount-20)*Add3;
		}
		
		sum=order+packet;
		
		printf("您在ABC邮购杂货店的购买信息如下:\n");
		printf("蔬菜类别   蔬菜单价  订购重量(磅)  价格\n");
		printf("  洋蓟    %10f %10f %10f\n",artichoke,mounts1,artichokes);
		printf("  甜菜    %10f %10f %10f\n",beet,mounts2,beets);
		printf("  胡萝卜  %10f %10f %10f\n",carrot,mounts3,carrots);
		printf("\n您的订单总折扣为:%f美元\n",discounts);
		printf("您订单蔬菜(出去折扣)的总费用为:%f美元\n",order);
		printf("您的运费和包装费一共为%f美元\n",packet);
		printf("您订单所有费用的总额为:%f美元\n",sum);
			
	printf("END!\n");
	printf("欢迎您下次光临!\n");
	return 0;
} 

运行结果:

     ABC邮购杂货店
*********************************
   类别        售价
a、洋蓟        2.05美元/磅
b、甜菜        1.15美元/磅
c、胡萝卜      1.09美元/磅
q、推出订购    敬请期待!
*********************************
请您输入您想要购买蔬菜类别的序号:a

请您输入购买洋蓟的数量(以磅为单位):50

请您输入购买甜菜的数量(以磅为单位):20

请您输入购买胡萝卜的数量(以磅为单位):10

敬请期待!
您在ABC邮购杂货店的购买信息如下:
蔬菜类别   蔬菜单价  订购重量()  价格
  洋蓟      2.050000  50.000000 102.500000
  甜菜      1.150000  20.000000  23.000000
  胡萝卜    1.090000  10.000000  10.900000

您的订单总折扣为:6.820000美元
您订单蔬菜(出去折扣)的总费用为:129.579987美元
您的运费和包装费一共为44.000000美元
您订单所有费用的总额为:173.579987美元
END!
欢迎您下次光临!

--------------------------------
Process exited after 11.51 seconds with return value 0
请按任意键继续. . .

本人技术不精,还望海涵。

上述内容均为本人学习自己所写

如若转载请标明出处,谢谢!

你可能感兴趣的:(C,Primer,Plus,c语言,编程语言)