C Primer Plus第七章编程练习答案

news2024/11/30 5:01:29

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出!

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

#include <stdio.h>
int main(void)
{
	char ch = '0';
	int blank = 0;
	int endline = 0;
	int other = 0;

	printf("请输入一行字符:");
	while ((ch = getchar()) != '#')
	{
		switch(ch)
		{
			case ' ':
				blank++;
				break;
			case '\n':
				endline++;
				break;
			default:
				other++;
				break;
		}
	}
	printf("%d个空白字符,%d个换行符,%d个其他字符\n", blank, endline, other);

	return 0;
}

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

#include <stdio.h>
int main(void)
{
	char ch = '0';
	int count = 0;

	printf("请输入一行字符:");
	while ((ch = getchar()) != '#')
	{
		if (count++ % 8 == 0)
			printf("\n");

		if (ch == '\n')
			printf("\\n-%03d. ", ch);
		else if (ch == '\t')
			printf("\\nt-%03d. ", ch);
		else
			printf("%c-%03d. ", ch, ch);
	}

	return 0;
}

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

#include <stdio.h>
int main(void)
{
	int input = 0;
	int even = 0;
	int odd = 0;
	float even_sum = 0, odd_sum = 0;
	float even_ave, odd_ave;

	while (scanf("%d", &input))
	{
		if (input == 0)
			break;
		if (input != 0 && input % 2 == 0)
		{
			even++;
			even_sum += input;
			even_ave = even_sum / even;
		}
		else
		{
			odd++;
			odd_sum += input;
			odd_ave = odd_sum / odd;
		}
	}
	printf("偶数个数为%d,偶数的平均值为%.2f,奇数个数为%d,奇数的平均值为%.2f\n", even, even_ave, odd, odd_ave);

	return 0;
}

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

#include <stdio.h>
int main(void)
{
	char ch = '0';
	int count = 0;

	printf("请输入一行字符:");
	while ((ch = getchar()) != '#')
	{
		if (ch == '.')
		{
			printf("!");
			count++;
		}
		else if (ch == '!')
		{
			printf("!!");
			count++;
		}
		else
			printf("%c", ch);
	}
	printf("\n进行了%d次替换\n",count);

	return 0;
}

5.使用switch重写练习4。

#include <stdio.h>
int main(void)
{
	char ch = '0';
	int count = 0;

	printf("请输入一行字符:");
	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
			case '.':
				printf("!");
				count++;
				break;
			case '!':
				printf("!!");
				count++;
				break;
			default:
				printf("%c", ch);
		}
	}
	printf("\n进行了%d次替换\n", count);

	return 0;
}

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

#include <stdio.h>
int main(void)
{
	char ch = '0';
	int count = 0;
	int flag = 0;

	printf("Receive your eieio award:");
	while ((ch = getchar()) != '#')
	{
		switch (ch)
		{
			case 'e':
				flag = 1;
				break;
			case 'i':
				if (flag == 1)
				{
					count++;
				}
				break;
			default:
				flag = 0;
				break;
		}
	}
	printf("ei出现的次数为%d\n", count);

	return 0;
}

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

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

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

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

余下的为25%

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

#include <stdio.h>
#define BASE_SALARY 10.00
#define EXTRA_HOUR 1.5
#define BASE_TAX 0.15
#define EXTRA_TAX 0.2
#define EXCEED_TAX 0.25
int main(void)
{
	int hours = 0;
	float salary = 0.0, tax = 0.0, taxed_salary = 0.0;

	while (1)
	{
		printf("请输入一周工作的小时数:");
		scanf("%d", &hours);
		if (hours <= 30)
		{
			salary = hours * BASE_SALARY;
			tax = salary * BASE_TAX;
			taxed_salary = salary - tax;
		}
		else if (hours <= 40)
		{
			salary = hours * BASE_SALARY;
			tax = 300 * BASE_TAX + (salary - 300) * EXTRA_TAX;
			taxed_salary = salary - tax;
		}
		else
		{
			salary = (40 + (hours - 40) * EXTRA_HOUR) * BASE_SALARY;
			tax = 300 * BASE_TAX + (salary - 300) * EXTRA_TAX + (salary - 450) * EXCEED_TAX;
			taxed_salary = salary - tax;
		}
		printf("salary:%.2lf,tax:%.2lf,taxed_salary:%.2lf\n", salary, tax, taxed_salary);
	}

	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 创建符号常量表示各工资等级和税率。

#include <stdio.h>
#define EXTRA_HOUR 1.5
#define BASE_TAX 0.15
#define EXTRA_TAX 0.2
#define EXCEED_TAX 0.25
void menu(void)
{
	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");
	printf("3)$10.00/hr					4)$11.20/hr\n");
	printf("5)quit\n");
	printf("*****************************************************************\n");
}
void cal(float base_salary,int hours)
{
	float salary = 0.0, tax = 0.0, taxed_salary = 0.0;
	if (hours <= 30)
	{
		salary = hours * base_salary;
		tax = salary * BASE_TAX;
		taxed_salary = salary - tax;
	}
	else if (hours <= 40)
	{
		salary = hours * base_salary;
		tax = 300 * BASE_TAX + (salary - 300) * EXTRA_TAX;
		taxed_salary = salary - tax;
	}
	else
	{
		salary = (40 + (hours - 40) * EXTRA_HOUR) * base_salary;
		tax = 300 * BASE_TAX + (salary - 300) * EXTRA_TAX + (salary - 450) * EXCEED_TAX;
		taxed_salary = salary - tax;
	}
	printf("salary:%.2lf,tax:%.2lf,taxed_salary:%.2lf\n", salary, tax, taxed_salary);
}

int main(void)
{
	int hours = 0;
	int input = 0;

	while (1)
	{
		menu();
		scanf("%d", &input);
		
		switch (input)
		{
			case 1:
				printf("请输入工作小时:");
				scanf("%d", &hours);
				cal(8.75,hours);
				break;
			case 2:
				printf("请输入工作小时:");
				scanf("%d", &hours);
				cal(9.33, hours);
				break;
			case 3:
				printf("请输入工作小时:");
				scanf("%d", &hours);
				cal(10.00, hours);
				break;
			case 4:
				printf("请输入工作小时:");
				scanf("%d", &hours);
				cal(11.20, hours);
				break;
			case 5:
				break;
		}
	}

	return 0;
}

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

#include <stdio.h>
int main(void)
{
	int input = 0;
	int flag = 1;

	printf("请输入一个正整数:");
	scanf("%d", &input);

	for (int i = 2; i < input; i++)
	{
		flag = 1;
		for (int j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	printf("\n");

	return 0;
}

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

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

#include <stdio.h>
#define PLAN1 17850
#define PLAN2 23900
#define PLAN3 29750
#define PLAN4 14875
#define RATE1 0.15
#define RATE2 0.28
void eatline()
{
    while (getchar() != '\n')
        continue;
}
int main(void)
{
    int n = 0;
    double wage, tax;

    while (1)
    {
        printf("********************************\n");
        printf("1) single\n");
        printf("2) householder\n");
        printf("3) married\n");
        printf("4) married but divorced\n");
        printf("5) quit\n");
        printf("********************************\n");
        printf("Please you choose: ");
        while (scanf("%d", &n) != 1 || (n > 5 || n < 1))
        {
            eatline();
            printf("Please enter 1, 2, 3, 4 or 5: ");
        }
        if (n == 5)
        {
            break;
        }
        printf("Please enter your wage: ");
        while (scanf("%lf", &wage) != 1 || (wage < 0))
        {
            eatline();
            printf("Please enter a number(>= 0): ");
        }
        eatline();
        switch (n)
        {
        case 1:
        {
            tax = (wage <= PLAN1 ? wage * RATE1 : PLAN1 * RATE1 + (wage - PLAN1) * RATE2);
            break;
        }
        case 2:
        {
            tax = (wage <= PLAN2 ? wage * RATE1 : PLAN2 * RATE1 + (wage - PLAN2) * RATE2);
            break;
        }
        case 3:
        {
            tax = (wage <= PLAN3 ? wage * RATE1 : PLAN3 * RATE1 + (wage - PLAN3) * RATE2);
            break;
        }
        case 4:
        {
            tax = (wage <= PLAN4 ? wage * RATE1 : PLAN4 * RATE1 + (wage - PLAN4) * RATE2);
            break;
        }
        }
        printf("Your tax: %g\n\n", tax);
    }
    printf("Done.\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磅 的甜菜。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装 费。随后,程序应显示所有的购买信息:物品售价、订购的重量(单位: 磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装 费,以及所有的费用总额。

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    const double price_artichokes = 2.05;
    const double price_beets = 1.15;
    const double price_carrots = 1.09;
    const double DISCOUNT_RATE = 0.05;
    const double under5 = 6.50;
    const double under20 = 14.00;
    const double base20 = 14.00;
    const double extralb = 0.50;

    int ch;
    double lb_artichokes = 0;
    double lb_beets = 0;
    double lb_carrots = 0;
    double lb_temp;
    double lb_total;

    double cost_artichokes;
    double cost_beets;
    double cost_carrots;
    double cost_total;
    double final_total;
    double discount;
    double shipping;

    printf("Enter a to buy artichokes, b for beets, ");
    printf("c for carrots, q to quit: ");
    while ((ch = tolower(getchar())) != 'q')
    {
        if (isspace(ch))
        {
            continue;
        }
        while (getchar() != '\n')
            continue;
        switch (ch)
        {
        case 'a':
        {
            printf("Enter pounds of artichokes: ");
            scanf("%lf", &lb_temp);
            lb_artichokes += lb_temp;
            break;
        }
        case 'b':
        {
            printf("Enter pounds of beets: ");
            scanf("%lf", &lb_temp);
            lb_beets += lb_temp;
            break;
        }
        case 'c':
        {
            printf("Enter pounds of carrots: ");
            scanf("%lf", &lb_temp);
            lb_carrots += lb_temp;
            break;
        }
        default:
        {
            printf("%c is not a valid choice.\n", ch);
        }
        }
        printf("Enter a to buy artichokes, b for beets, ");
        printf("c for carrots, q to quit: ");
    }

    cost_artichokes = price_artichokes * lb_artichokes;
    cost_beets = price_beets * lb_beets;
    cost_carrots = price_carrots * lb_carrots;
    cost_total = cost_artichokes + cost_beets + cost_carrots;
    lb_total = lb_artichokes + lb_beets + lb_carrots;

    if (lb_total <= 0)
    {
        shipping = 0.0;
    }
    else if (lb_total < 5.0)
    {
        shipping = under5;
    }
    else if (lb_total < 20.0)
    {
        shipping = under20;
    }
    else
    {
        shipping = base20 + extralb * (lb_total - base20);
    }
    if (cost_total > 100.0)
    {
        discount = DISCOUNT_RATE * cost_total;
    }
    else
    {
        discount = 0.0;
    }
    final_total = cost_total + shipping - discount;

    printf("Your order:\n");
    printf("%.2f lbs of artichokes at $%.2f per pound:$ %.2f\n",
        lb_artichokes, price_artichokes, cost_artichokes);
    printf("%.2f lbs of beets at $%.2f per pound: $%.2f\n",
        lb_beets, price_beets, cost_beets);
    printf("%.2f lbs of carrots at $%.2f per pound: $%.2f\n",
        lb_carrots, price_carrots, cost_carrots);
    printf("Total cost of vegetables: $%.2f\n", cost_total);
    if (cost_total > 100)
    {
        printf("Volume discount: $%.2f\n", discount);
    }
    printf("Shipping: $%.2f\n", shipping);
    printf("Total charges: $%.2f\n", final_total);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PID算法在流量控制中的应用

目录 增量式或位置式 目录 增量式或位置式 PID控制周期 T1 时间 T2 约4ms PID C代码 最近有小伙伴向我提问关于PID的问题&#xff1a;通过比例阀控制水流速度&#xff08;流量&#xff09;&#xff0c; 使用增量式还是位置式 PID&#xff1f;他的比例法驱动频率是500Hz…

Windows http https的搭建

目录 搭建http站点 ​编辑 报错 网站端口更改 可能存在的报错 绑定主机名 端口为80的情况下 绑定的端口不为80的情况下 https站点搭建 CA机构证书可以给其他服务器使用&#xff0c;不过要用导出导入的行书&#xff0c;不能直接使用cer文件 搭建http站点 ①勾选IIS ②一…

windows下nginx+tomcat配置负载均衡的方法

在负载均衡方面&#xff0c;Nginx和Tomcat的实现方式略有不同。Nginx作为反向代理服务器&#xff0c;可以直接处理并分发请求到后端服务器&#xff0c;包括Tomcat。它可以使用不同的负载均衡算法来分发请求&#xff0c;将负载均衡的任务集中在Nginx上。而Tomcat通常通过与Apach…

RL Note 1, Basic Concepts in Reinforcement Learning

Basic Concepts in Reinforcement Learning A grid-world example 在该图中&#xff1a; 格子被分为三类&#xff1a;可访问的格子、禁止访问的格子、目标格子角色被称为 agentagent 的任务就是从 start 开始找到一条“正确”的路径到达 targetagent 无法越过边界&#xff0c…

创建多线程常用的三种方式

三种常用多线程实现方式 1. 继承Thread类 继承Thread线程类并且重写run方法无线程任务返回值 2. 实现Runnable接口 实现Runnable接口并且重写run方法无线程任务返回值 3. 实现Callable接口和通过Futrue接口实现类(FutrueTask) 实现Callable接口(泛型数据类型对应call方法的返回…

(2020,DA)用于数据高效 GAN 训练的可鉴别数据增强(Differentiable Augmentation)

Differentiable augmentation for data-efficient gan training 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 重温数据增强 3.2 GAN 的可鉴别增强 4. 实验 4.1 ImageNet 4.2 FFHQ 和 LSUN-Cat 4.3 CIFAR-10 和 CIFAR-100 4.4 low-sho…

GPU服务器傻瓜式安装Anaconda,pytorch,tensorflow

1.下载Anaconda安装包&#xff0c;官网地址&#xff0c;清华源地址。 在官网下载到本地之后&#xff0c;可以通过文件传输上传安装包到服务器&#xff0c;使用清华源地址可以直接使用wget下载所需版本&#xff0c;例如&#xff1a; wget https://mirrors.tuna.tsinghua.edu.c…

Java之旅(三)

Java 输出&#xff1a;println()、print() 使用 println() 方法在 Java 中输出值或打印文本。 System.out.println("Hello World!"); println() 可以根据需要添加任意数量的方法。请注意&#xff0c;它将为每个方法添加一个新行&#xff1a; System.out.println(&…

静电测试仪:如何简单高效地测量静电电荷?

静电电荷是在两种不同材料之间接触或分离时&#xff0c;由电子或离子转移所产生的电荷。静电电荷的存在&#xff0c;可能导致许多不良的影响&#xff0c;比如产品损坏、设备失灵甚至是人员受伤。因此&#xff0c;测量静电电荷量成为提升产品质量、工作环境的必要步骤之一。而静…

【PCIE体系结构十二】链路训练的相关基础前菜

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 目录 物理…

linuxOPS基础_Linux系统的文件目录结构及用途

linux系统文件目录结构 Linux 系统不同于 Windows&#xff0c;没有 C 盘、D 盘、E 盘那么多的盘符&#xff0c;只有一个根目录&#xff08;/&#xff09;&#xff0c;所有的文件&#xff08;资源&#xff09;都存储在以根目录&#xff08;/&#xff09;为树根的树形目录结构中…

如何使用高扩展组件制作APP原型的标签栏?

原型项目中的组件&#xff08;亦称元件、控件&#xff09;&#xff0c;是指通过基础图层拼装而成&#xff0c;可供用户进行交互或用于展示复杂内容的元素。 在原型设计工作中&#xff0c;组件的使用是非常重要的部分&#xff0c;其不仅关乎项目内容的呈现&#xff0c;更会影响…

网络货运平台源码 管理平台端+司机端APP+货主端APP源码

网络货运平台系统源码&#xff0c;网络货运平台源码 管理平台端司机端APP货主端APP 遵循政策要求的八项基本功能&#xff0c;结合货主、实际承运人、监管方等多方业务场景&#xff0c;构建人、车、货、企一体的标准化网络货运平台系统。具有信息发布、线上交易、全程监控、金融…

网络安全工程师能拿高薪的秘密!

网络安全是一门具有很强实践性的学科&#xff0c;但是网络安全传统过程对实践能力培养环节比较薄弱&#xff0c;缺少适应新需求的实践与创新平台。所以&#xff0c;很多网络安全专业的学生学习的基本都是理论知识&#xff0c;而最重要的实战能力薄弱。仅仅只会一点基础的专业知…

景区虚拟人智能互动导览提升客户服务体验

数字化浪潮下&#xff0c;文旅产正积极拥业数字化转型。虚拟数字人作为元宇宙的交互入口&#xff0c;其在文旅产业中的应用&#xff0c;对文旅产业的发展具有非常重要的意义。将超写实虚拟人化身为景点讲解员有哪些好处呢? 视觉冲击力更强&#xff0c;吸引眼球 超写实虚拟人的…

jvm之JMX

写在前面 本文来看先jmx相关内容。 1&#xff1a;jmx介绍 jvm在运行的过程中有很多的信息&#xff0c;比如堆内存&#xff0c;线程数&#xff0c;加载的类信息&#xff0c;CPU的使用量等&#xff0c;如果我们想要将这些信息暴漏让外界获取&#xff0c;该怎么做呢?此时就需要…

springAop原理分析-动态代理对象创建过程分析

概念 AspectJ Aspect 切面&#xff08;由多个切点组成&#xff0c;多个点组成面&#xff09; 启用AspectJ支持后&#xff0c;Spring 会自动检测出在应用程序上下文中定义的任何 Bean&#xff0c;如下使用Aspect 定义的一个切面示例。 package org.xyz; import org.aspectj.…

STM8、STM8S003F3P6 实现PWM控制电机HAS10227

背景 有个项目需要控制一台风机的转速&#xff0c;使用STM8S003F3P6 输出PWM控制&#xff0c;这里就详细记录一下调试记录 原理图 原理图比较简单&#xff0c;电机接口CN3 电机接口原理图 与MCU管脚连接位置如下图 首先我们要明白电机的原理 电机 简单来说就是 实现电能与…

闲置手机建站 - 安卓Termux+Hexo搭建属于你自己博客网站【cpolar实现公网访问】

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…

助力工业物联网,工业大数据之一站制造业务主题划分【十三】

文章目录 01&#xff1a;一站制造业务主题划分02&#xff1a;一站制造业务维度设计03&#xff1a;一站制造业务主题维度矩阵 01&#xff1a;一站制造业务主题划分 目标&#xff1a;掌握一站制造的主题域及主题的划分实施 来源 主题域划分&#xff1a;业务或者部门划分 业务&am…