【发布时间】:2014-09-10 06:40:00
【问题描述】:
好的,所以我正在使用 Kernighan 和 Ritchie 的“C 编程语言”,我正在练习 1.13,但我似乎无法正确理解这一点。我的程序似乎打印得不多。问题如下:
练习 1-13。编写一个程序来打印其输入中单词长度的直方图。绘制直方图很容易 横条;垂直方向更具挑战性。
除了创建变量,这是我的伪代码,用于读取输入并存储我想要存储在数组中的内容。
- 创建一个数组——在这种情况下,我的数组大小为 21(21 个元素,从 0 到 20),最初都赋值为 0。它有 21 个元素,因为我不会使用超过 20 个字符的单词。我意识到这很奇怪,因为没有单词有零个字符。
- 开始计算输入中的字符数。
- 如果我遇到空格、制表符或换行符(即,这意味着第一个单词结束),请停止。
- 根据单词的字符数,递增数组中的特定位置(即,如果单词有两个字符,则在数组中位置 2 的元素上加 1)。
- 增加 wordCounter 变量——这个变量正如它的名字所表明的那样,会跟踪输入中已“读取”的单词数。
- 继续对每个单词执行此操作,直到达到 EOF。
这是我打印直方图(水平)的伪代码。
- 对于第一个位置,使用刻度线打印存储在数组第一个位置(即 0)的值 |
- 对数组中的每个元素执行此操作。
这是我的代码:
#include <stdio.h>
#define SIZEOFWORDSOFLENGTH 21
int main() {
int wordsOfLength[SIZEOFWORDSOFLENGTH];
int c, i, j;
int lengthCounter = 0;
/*Initializing all array elements to 0.*/
for (i = 0; i < SIZEOFWORDSOFLENGTH; i++)
wordsOfLength[i] = 0;
/*Going through the input and counting.*/
while ((c = getchar()) != EOF) {
++lengthCounter;
if (c == ' ' || c == '\t' || c == '\n') {
++wordsOfLength[lengthCounter - 1];
lengthCounter = 0;
}
}
for (i = 0; i < SIZZEOFWORDSOFLENGTH; i++) {
printf("Words of Length %d: ", i);
/*The third argument of the following for loop was previously j = j*/
for (j = 0; j < SIZEOFWORDSOFLENGTH; j++) {
while (j < wordsOfLength[i]) {
printf("|");
/*Was previously j++ instead of break*/
break;
}
}
printf("\n");
}
}
我手动调试了它,但我似乎找不到问题。也许一些非常简单的事情正在我脑海中浮现。另外,我知道以前有人问过这个问题,但我并不想为实际问题找到解决方案,我认为我的伪代码是正确的,如果不是有点正确,我只是想知道我的代码有什么问题,也许可以学到一些东西.提前谢谢你。
【问题讨论】:
-
请注意,您应该在
wordsOfLength的声明中使用宏SIZEOFWORDSOFLENGTH。如果文件中的第一个字符是空白、制表符或换行符,您应该查看会发生什么。 -
@JonathanLeffler 谢谢乔纳森,我忘了提到我假设我没有前导空格、制表符或换行符。我还在 wordsOfLength 的声明中包含了宏 SIZEOFWORDSOFLENGTH。
标签: c arrays for-loop histogram kernighan-and-ritchie