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

news2024/7/6 19:59:42

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

1.设计一个程序,统计在读到文件结尾之前读取的字符数。

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

    printf("请输入一些字符:");
    while ((ch = getchar()) != EOF)
    {
        count++;
    }
    printf("Characters: %d\n", count);

    return 0;
}

2.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。程序要 打印每个输入的字符及其相应的ASCII十进制值。注意,在ASCII序列中,空 格字符前面的字符都是非打印字符,要特殊处理这些字符。如果非打印字符 是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。例 如,ASCII的1是Ctrl+A,可显示为^A。注意,A的ASCII值是Ctrl+A的值加上 64。其他非打印字符也有类似的关系。除每次遇到换行符打印新的一行之 外,每行打印10对值。(注意:不同的操作系统其控制字符可能不同。)

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

    printf("请输入一些字符:");
    while ((ch = getchar()) != EOF)
    {
        if (i++ == 10)
        {
            printf("\n");
            i = 1;
        }
        if (ch >= 32) //空格的十进制ASCII码;
        {
            printf("%c-%d ", ch, ch);
        }
        else if (ch == '\n')
        {
            printf("\\n-\\n\n");
            i = 0;
        }
        else if (ch == '\t')
        {
            printf("\\t-\\t ");
        }
        else
        {
            printf("%c-%c ", ch, ch + 64);
        }
    }
    printf("Done.\n");
    
    return 0;
}

3.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序 要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续 的。或者使用ctype.h库中合适的分类函数更方便。

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int ch;
    int lowernum = 0;
    int uppernum = 0;

    printf("请输入一些字符:");
    while ((ch = getchar()) != EOF)
    {
        if(islower(ch))
        {
            lowernum++;
        }
        if (isupper(ch))
        {
            uppernum++;
        }
    }
    printf("大写字母为%d,小写字母个数为%d\n",uppernum,lowernum);

    return 0;
}

4.编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要 报告平均每个单词的字母数。不要把空白统计为单词的字母。实际上,标点 符号也不应该统计,但是现在暂时不同考虑这么多(如果你比较在意这点, 考虑使用ctype.h系列中的ispunct()函数)。

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
    bool inword = false;
    int ch, words = 0, letter = 0;
    float ave = 0.0;

    printf("请输入一些字符:");
    while ((ch = getchar()) != EOF)
    {
        if (ispunct(ch))
        {
            continue;
        }
        if (isalpha(ch))
        {
            letter++;
        }
        if (!isspace(ch) && !inword)
        {
            inword = true;
            words++;
        }
        if (isspace(ch) && inword)
        {
            inword = false;
        }
    }
    ave = 1.0 * letter / words;
    printf("总单词数: %d\n", words);
    printf("总字母数: %d\n", letter);
    printf("平均每个单词的字母数为:%f\n",ave);

    return 0;
}

5.修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序 最初猜50,询问用户是猜大了、猜小了还是猜对了。如果猜小了,那么下一 次猜测的值应是50和100中值,也就是75。如果这次猜大了,那么下一次猜 测的值应是50和75的中值,等等。使用二分查找(binary search)策略,如 果用户没有欺骗程序,那么程序很快就会猜到正确的答案。

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int high = 100;
    int low = 1;
    int guess = (high + low) / 2;
    int response;

    printf("Pick an integer from 1 to 100. I will try to guess ");
    printf("it.\nRespond with a y if my guess is right, with");
    printf("\na h if it is high, and with an l if it is low.\n");
    printf("Uh...is your number %d?\n", guess);
    while ((response = getchar()) != 'y')
    {
        if (response == '\n')
        {
            continue;
        }
        if (tolower(response) != 'h' && tolower(response) != 'l')
        {
            printf("I don't understand that response. Please enter h for\n");
            printf("high, l for low, or y for correct.\n");
            continue;
        }
        if (tolower(response) == 'h')
        {
            high = guess - 1;
        }
        else if (tolower(response) == 'l')
        {
            low = guess + 1;
        }
        guess = (high + low) / 2;
        printf("Well, then, is it %d?\n", guess);
    }
    printf("I knew I could do it!\n");

    return 0;
}

6.修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空 白字符,并在一个简单的程序中测试。

#include <stdio.h>
#include <ctype.h>
int get_first(void)
{
    int ch;
    do
    {
        ch = getchar();
    } while (isspace(ch));
    while (getchar() != '\n')
        continue;

    return ch;
}
int main(void)
{
    int ch;

    printf("Please enter some characters ('#' to quit):");
    while ((ch = get_first()) != '#')
    {
        printf("Result: %c\n", ch);
        printf("You can enter again ('#' to quit):\n");
    }
    printf("Done.\n");

    return 0;
}

7.修改第7章的编程练习8,用字符代替数字标记菜单的选项。用q代替5 作为结束输入的标记。

#include <stdio.h>
#include <stdlib.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("a)$8.75/hr					b)$9.33/hr\n");
	printf("c)$10.00/hr					d)$11.20/hr\n");
	printf("q)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;
	char input = 0;
	menu();

	while (1)
	{
		scanf("%c`", &input);

		switch (input)
		{
		case 'a':
			printf("请输入工作小时:");
			getchar();
			scanf("%d", &hours);
			cal(8.75, hours);
			break;
		case 'b':
			printf("请输入工作小时:");
			getchar();
			scanf("%d", &hours);
			cal(9.33, hours);
			break;
		case 'c':
			printf("请输入工作小时:");
			getchar();
			scanf("%d", &hours);
			cal(10.00, hours);
			break;
		case 'd':
			printf("请输入工作小时:");
			getchar();
			scanf("%d", &hours);
			cal(11.20, hours);
			break;
		case 'q':
			exit(0);
			break;
		}
	}

	return 0;
}

8.编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得 用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的 操作。该程序只接受菜单提供的选项。程序使用float类型的变量储存用户输 入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用 户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。该程序 的一个运行示例如下:

Enter the operation of your choice:

a. add s. subtract

m. multiply d. divide

q. quit

a

Enter first number: 22 .4

Enter second number: one

one is not an number.

Please enter a number, such as 2.5, -1.78E8, or 3: 1

22.4 + 1 = 23.4

Enter the operation of your choice:

a. add s. subtract

m. multiply d. divide

q. quit

d

Enter first number: 18.4

Enter second number: 0

Enter a number other than 0: 0.2

18.4 / 0.2 = 92

Enter the operation of your choice:

a. add s. subtract

m. multiply d. divide

q. quit q

Bye.

#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
int get_first(void)
{
    int ch;

    do
    {
        ch = getchar();
    } while (isspace(ch));
    while (getchar() != '\n')
        continue;

    return ch;
}
int get_choice(void)
{
    int ch;

    printf("Enter the operation of your choice:\n");
    printf("a. add           s. subtract\n");
    printf("m. multiply      d. divide\n");
    printf("q. quit\n");

    ch = get_first();
    while (ch != 'a' && ch != 's' && ch != 'm' && ch != 'd' && ch != 'q')
    {
        printf("Please enter with a,s,m,d or q :");
        ch = get_first();
    }
    return ch;
}
float get_float(void)
{
    int ch;
    float input;

    while (scanf("%f", &input) != 1)
    {
        while ((ch = getchar()) != '\n')
        {
            putchar(ch);
        }
        printf(" is not an number.\n");
        printf("Please enter a number such as 2.5, -1.78E8 or 3: ");
    }
    return input;
}
int main(void)
{
    int ct;
    float i, j;

    while ((ct = get_choice()) != 'q')
    {
        printf("Enter first number: ");
        i = get_float();
        printf("Enter second number: ");
        j = get_float();
        switch (ct)
        {
        case 'a':
        {
            printf("%g + %g = %g\n", i, j, i + j);
            break;
        }
        case 's':
        {
            printf("%g - %g = %g\n", i, j, i - j);
            break;
        }
        case 'm':
        {
            printf("%g * %g = %g\n", i, j, i * j);
            break;
        }
        case 'd':
        {
            while (fabs(j) <= 1e-6)
            {
                //↑判断float型浮点数是否为0;
                printf("Enter a number other than 0: ");
                j = get_float();
            }
            printf("%g / %g = %g\n", i, j, i / j);
            break;
        }
        }
    }
    printf("Bye.\n");

    return 0;
}

 

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

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

相关文章

Yum使用方法

1.什么是软件包 在Linux下安装软件&#xff0c;有三种方法&#xff1a; 通过对源代码进行封装&#xff0c;并进行编译&#xff0c;得到可执行程序。rpm安装&#xff0c;rpm安装软件需要各种指令&#xff0c;对于小白来说不友好&#xff0c;容易出错。yum安装&#xff0c;解决…

六、Docker仓库之Harbor搭建(三)

Harbor搭建 一、Harbor简介 1.Harbor介绍 Harbor是一个用于存储Docker镜像的企业级镜像服务器&#xff0c;通过添加一些企业必需的功能特性&#xff0c;如安全、标识和管理等&#xff0c;大大扩展其功能。作为一个企业级私有镜像服务器&#xff0c;Harbor提供了更好的性能和安…

Modern CSV:大型 CSV 文件编辑器/查看器 Crack

Modern CSV用于快速查看大型 CSV 文件 适用于 Windows、Mac 和 Linux 的复杂 CSV 编辑器/查看器 被使用 电子商务运营商。数据科学家。会计师。 IT 专业人员。学生。医学研究人员。数字营销人员。生物学家。工程师。 现代 CSV 是适用于 Windows、Mac 和 Linux 的功能强大的表格…

SSM 如何使用 TCC 机制实现分布式事务?

SSM 如何使用 TCC 机制实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 TCC 机制&#xff08;Try-Confirm-Cancel&#xff09;是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 TCC 机制来管理分布式事务。本…

RabbitMQ系列-概念及安装

1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收&#xff0c;使得进程间能相互通信&#xff0c;是点对点的通信 而消息代理是对消息队列的扩展&#xff0c;支持对消息的路由&#xff0c;是发布-订阅模式的通信&#xff0c;消息的发送者并不清楚消息的…

Spring源码解析

Idea导入Spring源码 下载 下载gradle 因为Spring源码里没有使用Maven依赖&#xff0c;而是使用gradle依赖&#xff0c;所以我们需要在本地下载安装并配置gradle环境。注意&#xff0c;这里下载安装的gradle版本应与Spring源码中的gradle版本对应。这里推荐下载我的&#xff…

Linux网络服务:部署YUM仓库与NFS服务

目录 一、理论 1.部署YUM仓库服务 2.NFS共享存储服务 二、实验 1.通过httpd服务建立yum仓库 2.通过vsftpd服务建立yum仓库 3.搭建NFS实现2台或3台服务器共享一个目录 一、理论 1.部署YUM仓库服务 (1) YUM简介 YUM的前身是YUP&#xff0c;借助于YUM软件仓库&#xff0c…

关于原型链

1-__proto__([[Prototype]])和prototype 每个对象都有一个隐式原型&#xff0c;这个隐式原型可以通过 obj.__proto__ Object.getPrototypeOf(obj)这两种方式获取&#xff1b; 我们都知道对象是通过构造函数构造的&#xff0c;new关键字构造的&#xff0c; 构造函数上有一个显…

如何在华为OD机试中获得满分?Java实现【最佳对手】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 游戏里面,队伍通过匹配…

native层函数没有导出时,如何获得相应函数地址?

前言 每次App重新运行后native函数加载的绝对地址是会变化的&#xff0c;唯一不变的是函数相对于基地址的偏移&#xff0c;因此我们可以在获取模块的基地址后加上固定的偏移地址获取相应函数的地址&#xff0c;Frida中也正好提供了这种方式&#xff1a;先通过Module.findBaseA…

SQL教程1

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中&#xff0c;您将学到如何使用 SQL 访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;MySQL、SQL Server、Access、Oracle、Sybase、DB2 等等。 SQL 简介 SQL (Structured Query Language:结构化…

OSPF协议

OSPF&#xff1a;开放式最短路径优先协议 无类别IGP协议&#xff1b;链路状态型&#xff1b;基于LSA收敛&#xff0c;故更新量较大&#xff0c;为在中大型网络正常工作&#xff0c;需要进行结构化的部署 --- 区域划分、ip地址规划 组播更新 --- 224.0.0.5 224.0.0.6 支持等开销…

shell变量的使用 rhce(25)

目录 1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; &#xff08;1&#xff0…

Redis的数据过期策略

数据淘汰策略-使用建议 1.优先使用allkeys-lru策略。充分利用LRU算法的优势&#xff0c;把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分&#xff0c;建议使用。 2.如果业务中数据访问频率差别不大&#xff0c;没有明显冷热数据区分&#xff0c;建议使用allkeys…

【AUTOSAR】 AUTOSAR整体开发流程(六)---- ISOLAR与Simuink

ISOLAR与Simuink交互 8.1 AutoSar的几种开发流程 8.2 Simulink 到ISOLAR Simulink生成SWC arxml SWC arxml放到ISOLAR文件夹 F5即可显示 8.3 ISOLAR到Simulink 1、Matlab的几个命令 1&#xff09;importer Call the constructor arxml.importer to create an importer obj…

Nomad 会替代 Kubernetes 吗?对比一下,两者如何选择?

概 述 根据市场状况&#xff0c;Kubernetes&#xff08;又称“K8s”&#xff09;已经成为容器编排之王&#xff0c;超越了Docker Swarm和Mesos等竞争对手。但是&#xff0c;在K8s&#xff08;2014&#xff09;出现的同时&#xff0c;还有另一个编排项目HashiCorp的Nomad&…

同城跑腿系统源码,点对点配送,帮你省时省力

随着互联网的发展&#xff0c;越来越多的人开始依赖网络来解决生活中的各种问题。而同城跑腿系统就是其中一个受欢迎的解决方案。 ​同城跑腿系统是指一种基于互联网的服务&#xff0c;通过在线平台将用户和服务提供者连接起来&#xff0c;以便用户可以轻松地安排他们的日常任务…

Selenium Grid- 让自动化分布式执行变得可能

什么是 Selenium Grid&#xff1f; Selenium Grid 是 Selenium 的三大组件之一&#xff0c;允许用户同时在不同的机器和系统上测试不同浏览器。 也就是说 Selenium Grid 支持分布式的测试执行。它可以让你的测试用例在一个分布式的执行环境中运行。 由上图可见&#xff0c;测试…

Python之并发编程二多进程理论

一、什么是进程 进程&#xff1a;正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二、进程与程序的区别 程序仅仅只是一堆代码而已&#xff0c;而进程指的是程序的运行过程。 三、并发与并行 无论是并行还是并发&#xff0c;在用户看来都是’同时’运行的&am…

从实际案例聊聊Java应用的GC优化

概 述 当Java程序的性能无法达到预期目标时&#xff0c;开发人员通常需要借助GC优化来进一步提高性能。然而&#xff0c;GC算法复杂&#xff0c;影响GC性能的参数众多&#xff0c;且参数调整又依赖于应用各自的特点&#xff0c;这些因素大大增加了GC优化的难度。不过&#xf…