C Primer Plus (第六版)第七章(7.12.1~7.12.11)编程练习答案(仅供参考)

最近在复习C语言,目前学到了第七章,现将编程练习题及个人答案向各位分享,若在参考过程中发现有何问题或者有其他思路请评论或私信我,感谢各位!

1.编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、换行符数和所有其他字符的数量。(我理解的是:输入一个字符,按下enter开始计数,直到输入#号并按下enter结束程序)

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	int num_s = 0, num_e = 0, num_o = 0;
	char ch = 0;
		
	printf("请输入任意字符,我将为您反馈读取到的空格数、换行符数以及所有其他字符的数量(输入#时程序结束):");
	

	while ((ch = getchar()) != '#')
	{
		if (ch == ' ')
		{
			num_s++;
		}	
		else if (ch == '\n')
		{
			num_e++;
		}		
		else
			num_o++;
		while (getchar() != '\n')//这一段程序就是解决输入行的剩余部分,它所做的工作就是读取并丢弃字符,防止其值被赋给ch
			continue;
			
		printf("请继续输入(输入#时程序结束):");
	}

	printf("您好,我所读取到的空格数为:%d,换行符数为%d,其他字符数为:%d\n", num_s, num_e, num_o);
	return 0;
}

参考结果如下:

 注意:程序中有一段关键的代码

while (getchar() != '\n')
    continue;

这一段程序就是解决输入行的剩余部分,它所做的工作就是读取并丢弃字符,防止其值被赋给ch,即你在输入第一个值后按下Enter,你按下的这个Enter不会被计算进去。

2.编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。每行打印8个“字符-ASCII码”组合。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。(我理解的是:输入一个字符,按下enter开始计数,直到输入#号并按下enter开始按要求打印之前输入的字符,然后结束程序)

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SIZE 255

int main(void)
{
	int i = 0, max = 0;
	char ch[SIZE] = { 0 };

	printf("请输入任意字符,我将为您打印每个输入的字符及其对应的ASCII码(输入#时程序结束):");
	
	for (i = 0; (ch[i] = getchar()) != '#'; i++)//读取并储存字符
	{
		max = i;
		while (getchar() != '\n')
			continue;
		printf("请继续输入:");
	}

	for (i = 1; i <= max + 1; i++)//i从1开始计数,避免0 % 8 = 0,导致在第一个字符处换行
	{
		printf("%c-%d ", ch[i - 1], ch[i - 1]);
		if (i % 8 == 0)
		{
			printf("\n");
		}
	}

	
	return 0;
 }

参考结果如下:

 注意:根据个人对题目的理解不同,得到的答案也不尽相同,我的程序仅供参考。

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

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	int num_imput = 0, e_num = 0, o_num = 0;
	float a_e_num = 0, a_o_num = 0;
	do {
		printf("请输入整数,我将为您统计奇数和偶数的数量及其各自的平均值(输入0结束程序):");
		scanf("%d", &num_imput);
		if (num_imput == 0)
		{
			break;
		}
		if (num_imput % 2 == 0)
		{
			a_e_num += num_imput;
			e_num++;
		}
		if (num_imput % 2 == 1)
		{
			a_o_num += num_imput;
			o_num++;
		}
	} while (1);

	printf("您所输入的偶数个数为:%d,平均数约为:%.2f\n您所输入的奇数个数为:%d,平均数约为:%.2f\n", e_num, a_e_num / e_num, o_num, a_o_num / o_num);

	return 0;
}

参考结果如下:

注意:由于此题输入的数据类型只有整数,所以相比于1题和2题而言,处理要简单许多。

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

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	int i = 0;
	char ch = 0;

	printf("请输入,我将用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换(输入#号结束程序):");

	while ((ch = getchar()) != '#')
	{
		if (ch == '.')
		{
			putchar('!');
			i++;
			continue;
		}
		else if (ch == '!')
		{
			printf("!!");
			i++;
			continue;
		}
		else
			putchar(ch);
	}

	printf("\n根据我的计算,总共进行了%d次替换。\n", i);

	return 0;
}

参考结果如下:

5.使用switch重写练习4。

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	int i = 0;
	char ch = 0;

	printf("请输入,我将用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换(输入#号结束程序):");

	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
			case '.':
			putchar('!');
			i++;
			break;
		case '!':
			printf("!!");
			i++;
			break;
		default:
			putchar(ch);
		}
	}

	printf("\n根据我的计算,总共进行了%d次替换。\n", i);

	return 0;
}

参考结果如下:

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

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	int i = 0, sum = 0;
	char ch = 0;

	printf("请输入,我将为您统计输入的内容中ei出现的次数(输入#号结束程序):");

	while ((ch = getchar()) != '#')
	{
		if (ch == 'e')
		{
			i = 1;
		}
		else if (ch == 'i' && i == 1)
		{
			i = 2;
			sum++;
		}
		else
			i = 0;
	}

	printf("\nei出现的次数为:%d\n", sum);


	return 0;
}

参考结果如下:

7.编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。做如下假设:

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

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

c.税率:  前300 美元为15%

                  续150 美元为20%

                  余下的为25%

用#define 定义符号常量。不用在意是否符合当前的税法。

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define BASE_SALARY 10.00
#define BASETIME 40
#define OVERTIME_SALARY 15

int main(void)
{
	const float F_TAX = 0.15;
	const float S_TAX = 0.20;
	const float T_TAX = 0.25;
	float hour = 0.0, salary = 0.0, tax = 0.0, income = 0.0;

	printf("请输入您一周工作的小时数:");
	scanf("%f", &hour);

	if (hour <= BASETIME)
	{
		salary = BASE_SALARY * hour;
		if (salary <= 300)
		{
			tax = salary * F_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
		else
		{
			tax = 300 * F_TAX + (salary - 300) * S_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
	}

	if (hour > BASETIME)
	{
		salary = BASE_SALARY * BASETIME + OVERTIME_SALARY * (hour - BASETIME);
		if (salary <= 450)
		{
			tax = 300 * F_TAX + (salary - 300) * S_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
		else
		{
			tax = 300 * F_TAX + 150 * S_TAX + (salary - 450) * T_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", 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创建符号常量表示各工资等级和税率。

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define BASETIME 40
#define OVERTIME_SALARY 15
#define SALARY_LEVEL_1 8.75
#define SALARY_LEVEL_2 9.33
#define SALARY_LEVEL_3 10.00
#define SALARY_LEVEL_4 11.20

int main(void)
{
	const float F_TAX = 0.15;
	const float S_TAX = 0.20;
	const float T_TAX = 0.25;
	int level = 0;
	float hour = 0.0, salary = 0.0, tax = 0.0, income = 0.0, base_salary = 0.0;
	
	printf("***************************************************\n");
	printf("现有以下几个工资等级供您选择(选择数字5结束程序):\n");
	printf("1) $8.75/hr         2) $9.33/hr\n3) $10.00/hr        4) $11.20/hr\n5) quit\n");
	printf("***************************************************\n");
	printf("请输入输入数字以选择您的工资等级:");

	while(scanf("%d", &level) == 1)
	{ 
		switch (level)
		{
		case 1:
			base_salary = SALARY_LEVEL_1;
			break;
		case 2:
			base_salary = SALARY_LEVEL_2;
			break;
		case 3:
			base_salary = SALARY_LEVEL_3;
			break;
		case 4:
			base_salary = SALARY_LEVEL_4;
			break;
		case 5:
			break;
		default:
			printf("错误,请重新输入:");
			continue;
		}
		break;
	}
	


	if (level != 5)
	{
		printf("请输入您一周工作的小时数:");
		scanf("%f", &hour);
	}
	

	if (hour <= BASETIME && level != 5)
	{
		salary = base_salary * hour;
		if (salary <= 300)
		{
			tax = salary * F_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
		else
		{
			tax = 300 * F_TAX + (salary - 300) * S_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
	}

	if (hour > BASETIME && level != 5)
	{
		salary = base_salary * BASETIME + OVERTIME_SALARY * (hour - BASETIME);
		if (salary <= 450)
		{
			tax = 300 * F_TAX + (salary - 300) * S_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
		else
		{
			tax = 300 * F_TAX + 150 * S_TAX + (salary - 450) * T_TAX;
			income = salary - tax;
			printf("您的工资总额为:%.2f,税金为:%.2f,净收入为:%.2f", salary, tax, income);
		}
	}

	printf("\n程序结束,感谢您的使用!\n");

	return 0;
}

参考结果如下:

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

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
	int num_1 = 0, num_2 = 0, i = 0, j = 0, mark_1 = 0, mark_2 = 0;

	printf("请输入一个正整数,我将为您显示所有小于和等于该数的素数(输入非数字结束程序):");

	while (scanf("%d", &num_1) == 1)
	{
		if (num_1 > 0)
			break;
		else
		{
			printf("错误,请重新输入:");
			continue;
		}
		break;
	}

	for (i = 2; i <= num_1; mark_1 = 0, i++)//第一个循环的作用为遍历所有小于或等于输入数字的数字
	{
		for (j = 1; j <= i; j++)//此循环的作用为判断第一个循环里的数字是否是质数
		{
			if (i % j == 0)
			{
				mark_1++;
			}
		}	
		if (mark_1 == 2)
		{
			printf("%5d ", i);
			mark_2++;
			if (mark_2 % 8 == 0)//每8个数字换行,便于查看对比
			{
				printf("\n");
			}
		}
	}

	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)美元。编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。程序应通过循环让用户可以多次输入。

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SALARY_TYPE_1 17850
#define SALARY_TYPE_2 23900
#define SALARY_TYPE_3 29750
#define SALARY_TYPE_4 14875

int main(void)
{
    int type = 0;
    float salary = 0.0, tax = 0.0;
    
    printf("*******************************\n");
    printf("1)单身             2)户主\n3)已婚,共有       4)已婚,离异\n5)退出\n");
    printf("*******************************\n");
    printf("请选择您的类别:");

    while (scanf("%d", &type) == 1)
    {
        switch (type)
        {
        case 1:
            printf("您需要缴纳税金的种类为:单身 17850美元按15%%计,超出部分按28%%计\n");
            printf("请输入您的薪水,我将为您计算应缴纳的税金:");
            scanf("%f", &salary);
            if (salary <= SALARY_TYPE_1)
            {
                tax = salary * 0.15;
            }
            else
            {
                tax = SALARY_TYPE_1 * 0.15 + (salary - SALARY_TYPE_1) * 0.28;
            }
            printf("您需要缴纳的税金为:%.2f\n", tax);
            break;
        case 2:
            printf("您需要缴纳税金的种类为:户主 23900美元按15%%计,超出部分按28%%计\n");
            printf("请输入您的薪水,我将为您计算应缴纳的税金:");
            scanf("%f", &salary);
            if (salary <= SALARY_TYPE_2)
            {
                tax = salary * 0.15;
            }
            else
            {
                tax = SALARY_TYPE_2 * 0.15 + (salary - SALARY_TYPE_2) * 0.28;
            }
            printf("您需要缴纳的税金为:%.2f\n", tax);
            break;
        case 3:
            printf("您需要缴纳税金的种类为:已婚,共有 29750美元按15%%计,超出部分按28%%计\n");
            printf("请输入您的薪水,我将为您计算应缴纳的税金:");
            scanf("%f", &salary);
            if (salary <= SALARY_TYPE_3)
            {
                tax = salary * 0.15;
            }
            else
            {
                tax = SALARY_TYPE_3 * 0.15 + (salary - SALARY_TYPE_3) * 0.28;
            }
            printf("您需要缴纳的税金为:%.2f\n", tax);
                break;
        case 4:
            printf("您需要缴纳税金的种类为:已婚,离异 14875美元按15%%计,超出部分按28%%计\n");
            printf("请输入您的薪水,我将为您计算应缴纳的税金:");
            scanf("%f", &salary);
            if (salary <= SALARY_TYPE_4)
            {
                tax = salary * 0.15;
            }
            else
            {
                tax = SALARY_TYPE_4 * 0.15 + (salary - SALARY_TYPE_4) * 0.28;
            }
            printf("您需要缴纳的税金为:%.2f\n", tax);
            break;
        case 5:
            break;
        default:
            printf("错误,请重新输入:");
            continue;
        }
        if (type == 5)
        {
            break;
        }
        printf("请选择您的类别:");
    }

    printf("\n程序结束!感谢您的使用!\n");

    return 0;
}

参考结果如下:

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磅的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有的费用总额。

参考代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define ARTICHOKE_PRICE 2.05
#define BEET_PRICE 1.15
#define CARROT_PRICE 1.09
#define F_LEVEL 5
#define S_LEVEL 20

int main(void)
{
    char type = 0;
    float a_num = 0.0, b_num = 0.0, c_num = 0.0;
    float t_a_num = 0.0, t_b_num = 0.0, t_c_num = 0.0;
    float a_price = 0.0, b_price = 0.0, c_price = 0.0; 
    float t_weight = 0.0, price = 0.0, dc_price = 0.0, t_e = 0.0, g_price = 0.0;

    printf("*******************\n");
    printf("a)洋蓟 2.05美元/磅\nb)甜菜 1.15美元/磅\nc)胡萝卜 1.09美元/磅\n输入q退出订购,并且我将为您计算并显示所有的购买信息\n");
    printf("*******************\n");
    printf("请选择您要订购的货物:");

    while (scanf("%c", &type) == 1)
    {
        switch (type)
        {
        case 'a':
            printf("请输入您所需要的洋蓟磅数:");
            scanf("%f", &a_num);
            t_a_num += a_num;
            break;
        case 'b':
            printf("请输入您所需要的甜菜磅数:");
            scanf("%f", &b_num);
            t_b_num += b_num;
            break;
        case 'c':
            printf("请输入您所需要的胡萝卜磅数:");
            scanf("%f", &c_num);
            t_c_num += c_num;
            break;
        case 'q':
            break;
        default:
            printf("错误,请重新输入:");
            while (getchar() != '\n')
                continue;
            continue;
        }
        if (type == 'q')
        {
            printf("订购结束,接下来我将为您计算并显示所有信息:\n");
            break;
        }
        while (getchar() != '\n')
            continue;
        printf("请选择您要订购的货物:");
    }

    t_weight = t_a_num + t_b_num + t_c_num;
    a_price = t_a_num * ARTICHOKE_PRICE;
    b_price = t_b_num * BEET_PRICE;
    c_price = t_c_num * CARROT_PRICE;
    price = a_price + b_price + c_price;

    if (t_weight >= 100)
        dc_price = (t_a_num * ARTICHOKE_PRICE + t_b_num * BEET_PRICE + t_c_num * CARROT_PRICE) * 0.05;


    if (t_weight <= F_LEVEL)
        t_e = 6.5;
    else if (t_weight > F_LEVEL && t_weight <= S_LEVEL)
        t_e = 14;
    else
        t_e = 14 + (t_weight - 20) * 0.5;

    g_price = price - dc_price + t_e;

    printf("洋蓟的售价为:%.2f美元/磅,甜菜的售价为:%.2f美元/磅,胡萝卜的售价为:%.2f美元/磅\n", ARTICHOKE_PRICE, BEET_PRICE, CARROT_PRICE);
    printf("您订购的洋蓟的重量为:%.2f磅,甜菜的重量为%.2f磅,胡萝卜的重量为:%.2f磅\n", t_a_num, t_b_num, t_c_num);
    printf("您订购的洋蓟的费用为: %.2f美元,甜菜的费用为:%.2f美元,胡萝卜的费用为:%.2f美元\n", a_price, b_price, c_price);
    printf("订购蔬菜的费用为:%.2f美元,折扣为:%.2f美元,运费和包装费为:%.2f美元,总费用为:%.2f美元\n", price, dc_price, t_e, g_price);
    
    return 0;
}

参考结果如下:

 总结:程序不难,关键是理解题目中的需求来编写程序,如果各位在参考过程中发现有问题欢迎评论和私信,谢谢各位!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值