致敬经典 << KR C >> 之打印输入单词水平直方图和以每行一个单词打印输入 (练习1-12和练习1-13)

1. 前言

不知道有多少同学正在自学C/C++, 无论你是一个在校学生, 还是已经是上班族. 如果你想从事或即将从事软件开发这个行业, C/C++都是一个几乎必须要接触的系统级程序开发语言. 虽然现在有Rust更安全的系统级编程语言作为C/C++的替代, 但作为入门, C应该还是要好好学的. C最早由B语言改进而来. 不出意外你应该已经想到了C/UNIX都是贝尔实验室的里奇和汤普逊所开发. 一个C影响了后来一系列开发语言, 一个UNIX影响了后来一系列操作系统. K&R C就是经典C, 那时C还没有标准化, 还没有ANSI标准, 所以K&R就是早期的C标准.

确切的说 K&R C 指的是由 C 语言创始人 Dennis Ritchie 和 Brian Kernighan 在其经典著作《The C Programming Language》(1978年第一版)中描述的早期 C 语言标准。也被称为 "经典 C" 或 "传统 C". Brian Kernighan 就是 K&R C中的K, Hello World程序就是他首先使用的. 当然这本书有第2版, 引入了一些ANSI的C标准. 这本书的练习题除部分少量的过时外, 大部分编程题还是很值得自己实践练习的.我这有两道练习题, 自己写了一下, 虽然不难, 但如果是初学者, 还是可以自己写完, 再看看别人的, 多参考学习.

写这些编程题有个感觉, 就像造车, 发动机要自己造, 变速箱要自己造, 底盘也要自己造, 外观要自己设计, 一切细节都要详细了解, 没有封装, 除了少量标准库函数可用, 一切要自己动手写. 就算是标准库中的函数, 你也完全根据它的功能, 自己去实现, 自己来封装. 那些大师早期哪有现成的库, 都是他们自己写的. 所以要多动手去写, 去实现自己的版本.

第 1 章内容不多, 尽量用本章介绍的内容来完成作业.

2. 练习 1 - 12 习题及代码

下面是两个练习题:

练习1-12  编写一个程序, 以每行一个单词的形式打印其输入.

下面是代码, 因为很短, 所以没有加注释, 另外输入中如果有多个空白符 (制表, 空格), 会忽略:

#include <stdio.h>int main(void)
{int ch;while ((ch = getchar()) != EOF) {if (ch != ' ' && ch != '\t' && ch != '\n') {putchar(ch);} else {if (ch == '\n') { putchar(ch);} else {while ((ch = getchar()) == ' ' || ch == '\t') {continue;}putchar('\n');putchar(ch);}}}return 0;

运行结果:

3. 练习 1 - 13 习题及代码

下面这道题在我的另几篇文章已实现垂直方向的直方图, 有兴趣的同学可以看另几篇文章.

练习1-13  编写一个程序, 打印输入中单词的直方图. 水平方向的直方图比较容易绘制, 垂直方向的直方图则要困难些.

下面是代码 (代码有一些问题,有兴趣的同学可以改进):

#include <stdio.h>
#define MAX 20      /*统计最长为20个字符的单词*/
#define MAXNUM 26   /*某个长度最多统计25个*/void initwords(int *pw, int len);
void countwords(int *pw, int len);
void printhtgm(int *pw, int len);
void putpatterns(char ch, int n, int width);
void putspaces(int n);
void putline(int n);
void printXnum(int n);
int main(void)
{int words[MAX + 1];          /*统计最长20个字符的单词*/initwords(words, MAX + 1);   /*初始化单词数量数组*/countwords(words, MAX + 1);  /*统计输入各长度㼿司数量*/printhtgm(words, MAX + 1);   /*打印水平直方图*/return 0;
}/*初始化单词数量数组*/
void initwords(int *pw, int len)
{int i;for (i = 1; i < len; i++) { pw[i] = 0; }
}/*统计各长度单词数量*/
void countwords(int *pw, int len)
{int ch, wordlen, wordin;wordlen = wordin = 0;while ((ch = getchar()) != '#') {if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {if (wordin == 0) { wordin = 1; }if (wordlen < len - 1) { wordlen++; }} else if (ch == ' ' || ch == '\t' || ch == '\n') {if (wordin == 1) {wordin = 0;if (pw[wordlen] < MAXNUM - 1) { pw[wordlen]++; }wordlen = 0;}}}if (pw[wordlen] < MAXNUM - 1) { pw[wordlen]++; }
}/*打印水平直方图*/
void printhtgm(int *pw, int len)
{int i;putline(2);putspaces(5);putchar('Y');putline(1);for (i = len - 1; i > 0; i--) {putspaces(3);printf("%2d", i);putchar('|');putpatterns('*', pw[i], 2);putline(1);}putspaces(5);putchar('+');putpatterns('-', MAXNUM * 2, 1);putchar('>');putspaces(1);putchar('X');    putline(1);printXnum(20);putline(2);   
}/*打印X轴数字*/
void printXnum(int n)
{if (n < 1 || n > MAXNUM) { return; }int i;putspaces(6);for (i = 1; i <= n; i++) { if (i >= 10) { putchar(' '); }printf("%2d", i); }
}/*打印直方图案*/
void putpatterns(char ch, int n, int width)
{if (n < 1 || n > MAXNUM * 2) { return; }int i;for (i = 0; i < n; i++) {putspaces(width - 1); putchar(ch); }
}/*打印Y轴缩进*/
void putspaces(int n)
{int i;for (i = 0; i < n; i++) {putchar(' ');}
}/*空格打印*/
void putline(int n)
{int i;for (i = 0; i < n; i++) { putchar('\n'); }
}

运行结果:

下面是输入一些测试单词

下面是输入歌曲 << The day you went away  >> 的歌词结果:

4. 结语

喜欢就点赞收藏, 您的支持是我创作的动力.

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

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

相关文章

【Leetcode 每日一题】3355. 零数组变换 I

问题背景 给定一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li​,ri​]。 对于每个查询 q u e r i e s [ i ] queries[i] quer…

[java八股文][Java虚拟机面试篇]垃圾回收

什么是Java里的垃圾回收&#xff1f;如何触发垃圾回收&#xff1f; 垃圾回收&#xff08;Garbage Collection, GC&#xff09;是自动管理内存的一种机制&#xff0c;它负责自动释放不再被程序引用的对象所占用的内存&#xff0c;这种机制减少了内存泄漏和内存管理错误的可能性…

ubuntu服务器版启动卡在start job is running for wait for...to be Configured

目录 前言 一、原因分析 二、解决方法 总结 前言 当 Ubuntu 服务器启动时&#xff0c;系统会显示类似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息&#xff0c;并且…

Android 手写签名功能详解:从原理到实践

Android 手写签名功能详解 1. 引言2. 手写签名核心实现&#xff1a;SignatureView 类3. 交互层实现&#xff1a;MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中&#xff0c;手写签名功能已成为提升用户体验与业务合规性的关…

【nRF9160 常用prj.conf配置与AT指令介绍】

参考资料&#xff1a; 技术讨论&#xff1a;Q群&#xff1a;542294007 nRF91 NCS SDK安装工具与SDK安装包等常用软件下载地址 云盘下载&#xff1a;pan.olib.cn 一、nRF9160 常用prj.conf配置介绍 nRF9160通过prj.conf配置网络模式为&#xff1a;CAT-M模式 CONFIG_LTE_NETWOR…

小型化边缘计算设备

以下是关于小型化边缘计算设备的核心技术与应用特点的综合分析&#xff1a; 一、核心硬件平台与算力表现‌ NVIDIA Jetson Orin系列‌ Jetson Orin Nano‌&#xff1a;配备1024个CUDA核心和32个Tensor核心&#xff0c;支持高达100 TOPS的AI算力&#xff0c;适用于机器人、无…

css使用clip-path属性切割显示可见内容

1. 需求 想要实现一个渐变的箭头Dom&#xff0c;不想使用svg、canvas去画&#xff0c;可以考虑使用css的clip-path属性切割显示内容。 2. 实现 <div class"arrow">箭头 </div>.arrow{width: 200px;height: 60px;background-image: linear-gradient(45…

Kotlin与物联网(IoT):Android Things开发探索

在物联网&#xff08;IoT&#xff09;领域&#xff0c;Kotlin 凭借其简洁性、安全性和与 Java 生态的无缝兼容性&#xff0c;逐渐成为 Android Things 开发的有力工具。尽管 Google 已于 2022 年宣布停止对 Android Things 的官方支持&#xff0c;但其技术思想仍值得探索&#…

2025年AI搜索引擎发展洞察:技术革新与市场变革

引言&#xff1a;AI搜索的崛起与市场格局重塑 2024-2025年&#xff0c;AI搜索市场迎来了前所未有的变革期。随着DeepSeek-R1等先进大语言模型的推出&#xff0c;传统搜索引擎、AI原生搜索平台以及各类内容平台纷纷加速智能化转型&#xff0c;推动搜索技术从基础信息检索向深度…

基于 ESP32 与 AWS 全托管服务的 IoT 架构:MQTT + WebSocket 实现设备-云-APP 高效互联

目录 一、总体架构图 二、设备端(ESP32)低功耗设计(适配 AWS IoT) 1.MQTT 设置(ESP32 连接 AWS IoT Core) 2.低功耗策略总结(ESP32) 三、云端架构(基于 AWS Serverless + IoT Core) 1.AWS IoT Core 接入 2.云端 → APP:WebSocket 推送方案 流程: 3.数据存…

【LeetCode 热题 100】有效的括号 / 最小栈 / 字符串解码 / 柱状图中最大的矩形

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 栈有效的括号最小栈字符串解码每日温度柱状图中最大的矩形 堆数组中的第K个最大元素 栈 有效的括号 有效的括号 cl…

Petalinux

Petalinux 命令 参考《UG 1157 PetaLinux Command Line Reference Guide》 //创建petalinux工程 petalinux-create -t project --template zynq -n <name> //配置工程 cd 上一步的工程 petalinux-config --get-hw-description ../xsa_folder///配置Linux内核 petalinux-…

【Qt】在OrinNX上,使用命令安装qtmultimedia5-dev时报错

1、问题描述 在OrinNX+Ubuntu20.04上,使用命令安装qtmultimedia5-dev时报错 sudo apt install qtmultimedia5-devThe following packages have unmet dependencies: qtmultimedia5-dev : Depends: libpulse-dev but it is not going to be installed E: Unable to correct p…

上肢康复机器人设计与临床应用研究

引言 脑卒中、脊髓损伤等神经系统疾病导致的上肢运动功能障碍&#xff0c;严重影响了患者的生活质量。传统康复治疗依赖治疗师手动辅助训练&#xff0c;存在效率低、量化难、人力成本高等问题。上肢康复机器人通过精准的运动控制与生物反馈机制&#xff0c;为实现高效、标准化…

mysql不能聚合之数据清洗逗号

有时候因为数据库不严谨导致了出现有些数字很奇怪例如这样是varchar类型的字符串&#xff0c; 这种数据不能用来运算聚合&#xff0c;那么要怎么办呢&#xff1f; 这样就搞定 REPLACE(your_column, ,, )​​&#xff1a;将字段中的逗号移除&#xff0c;例如将3,553,850.28转换…

chrome 浏览器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打开网页&#xff0c;就能直接输入文字&#xff0c;然后 grok 就不行&#xff0c;必须用鼠标点一下&#xff0c;才能输入文字。 对我而言&#xff0c;是个痛点&#xff01;写个插件&#xff0c;自动点…

outbox架构解说

Outbox 模式是一种用于实现数据一致性的架构模式&#xff0c;特别是在微服务架构中。 它确保在处理事务时&#xff0c;数据的原子性和最终一致性。 Outbox 模式的详细解说&#xff1a; 1. 概念与背景 背景&#xff1a;在微服务架构中&#xff0c;一个操作可能涉及多个服务&…

喷涂喷漆机器人详解

1. 定义 喷涂喷漆机器人是专为表面涂装设计的自动化工业设备&#xff0c;通过精准控制实现高效、均匀的涂料喷涂。其核心价值在于提升生产效率、保障质量一致性&#xff0c;同时减少材料浪费及环境污染&#xff0c;广泛应用于汽车、航空航天等领域。 2. 结构组成 机械臂&…

DataX:一个开源的离线数据同步工具

DataX 是一个异构数据源离线同步&#xff08;ETL&#xff09;工具&#xff0c;实现了包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。它也是阿里云 DataWorks 数据集成功能的开源版本。 为了解决异构数据源同…

微软家各种copilot的AI产品:Github copilot、Microsoft copilot

背景 大家可能听到很多copilot&#xff0c;比如 Github Copilot&#xff0c;Microsoft Copilot、Microsoft 365 Copilot&#xff0c;有什么区别 Github Copilot&#xff1a;有网页版、有插件&#xff08;idea、vscode等的插件&#xff09;&#xff0c;都是面向于程序员的。Mi…