以下程序来自“The C Answer Book”,练习1-13。这是为了理解&自学。
我为下面的问题设置了舞台:
#define MAXWORD 11
数组wl []的元素初始化为零。
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
如果字大小大于零且小于最大值,请将它们存储在数组中。
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc < MAXWORD) {
++wl[nc];
}
...
}
以下循环以i = 1开头。为什么wl [1]打印出似乎是wl [0]的内容?
/* PRINT COUNTER HEADER */
for (i = i; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
...
}
¡EXTRA CREDIT!
请教我如何自己找到答案。
i = 0
时的输出 0 - 0 :
1 - 111 : ************
2 - 129 : ***************
3 - 31 : ***
4 - 42 : ****
5 - 32 : ***
6 - 24 : **
7 - 24 : **
8 - 13 : *
9 - 17 : *
10 - 6 : *
There are 9 words >= 11
i = 1时的输出
1 - 111 : ************
2 - 129 : ***************
3 - 31 : ***
4 - 42 : ****
5 - 32 : ***
6 - 24 : **
7 - 24 : **
8 - 13 : *
9 - 17 : *
10 - 6 : *
There are 9 words >= 11
完整的源代码:
/* Write a program to print a histogram of the lengths of words in
* its input. It is easy to draw the histogram with the bars horizontal; a vertical
* orientation is more challenging.
*
* 1 | ***
* 2 | ****
* 3 | ******
* 4 | *********
* 5 | **
* X | **********
*
* There were 7 words greater than 11 character.
* --------------------------------------------- */
#include <stdio.h>
#define MAXHIST 15 /* max length of histogram */
#define MAXWORD 11 /* max length of a word */
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* print horizontal histogram */
int
main(void)
{
int c, i, nc, state;
int len; /* length of each bar */
int maxvalue; /* maximum value for wl[] */
int ovflow; /* number of overflow words */
int wl[MAXWORD]; /* word length counters */
state = OUT;
nc = 0; /* number of chars in a word */
ovflow = 0; /* number of overflow words */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
/* READ CHARACTERS UNTIL EOF */
while ( (c = getchar() ) != EOF) {
/* IF BLANK FOUND */
if (c == ' ' || c == '\n' || c == '\t') {
state = OUT;
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc < MAXWORD) {
++wl[nc];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
nc = 0;
}
/* NEW WORD FOUND */
else if (state == OUT) {
state = IN;
nc = 1; /* beginning of a new word */
}
/* SAME WORD FOUND */
else {
++nc; /* inside a word */
}
}
maxvalue = 0;
/* FIND LARGEST WORD */
for (i = 1; i < MAXWORD; ++i) {
if (wl[i] > maxvalue) {
maxvalue = wl[i];
}
}
/* PRINT COUNTER HEADER */
for (i = 1; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
/* FIND A COUNTER */
if (wl[i] > 0) {
/* SCALE ITS HISTOGRAM */
if ( (len = wl[i] * MAXHIST / maxvalue) <= 0) {
len = 1;
}
}
/* NO COUNTER FOUND */
else {
len = 0;
}
/* PRINT COUNTER LENGTH */
while (len > 0) {
putchar('*');
--len;
}
putchar('\n');
}
/* PRINT OVERFLOW COUNT */
if (ovflow > 0) {
printf("There are %d words >= %d\n", ovflow, MAXWORD);
}
return 0;
}
答案 0 :(得分:0)
因为没有单词的长度为0,并且wl[0]
中没有任何内容存储,所以请参阅if(nc > 0)
。
索引是单词的长度,该索引处的值是该长度的单词数。
一段文字中长度为0的单词数量更像是一个哲学问题,而不是计算机可以计算出来的东西。
答案 1 :(得分:0)
代码运作良好:wl
存储长度等于或小于10的字数(wl[1]
长度为1的字数,wl[2]
长度为2的单词,等等,所以wl[0]
总是0,因为不存在长度为0的单词。
有时当你使用数组时,你想要忘记数组的位置从0到n-1并简化代码的其他部分,这就是这里发生的事情。
这是如何使用索引0
#define MAXWORD 10 /* max length of a word */
...
int wl[MAXWORD]; /* word length counters */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
wl[i] = 0;
}
...
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc <= MAXWORD) {
++wl[nc - 1];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
...
for (i = 0; i < MAXWORD; ++i) {
printf("%5d - %5d : ", i+1, wl[i]);
...
}
++wl[nc - 1];
和printf("%5d - %5d : ", i+1, wl[i]);
很难理解这个例子。
代码还可以,但是,对于澄清我认为作者试图做的事情,我会建议这个
#define MAXWORD 10 /* max length of a word */
...
int wl[MAXWORD + 1]; /* word length counters */
/* INITIALIZE WORD LENGTH COUNTER */
for (i = 1; i < MAXWORD; ++i) {
wl[i] = 0;
}
...
/* IF WORD FOUND */
if (nc > 0) {
/* INCREMENT WORD LENGTH COUNTER */
if (nc <= MAXWORD) {
++wl[nc];
}
/* INCREMENT OVERFLOW COUNTER */
else {
++ovflow;
}
}
...
for (i = 1; i <= MAXWORD; ++i) {
printf("%5d - %5d : ", i, wl[i]);
...
}