需要一些关于如何更整齐地打印直方图的建议

时间:2015-03-28 19:27:25

标签: c io

我正在编写一个程序,它将读取输入,然后返回K&字符计数的直方图。 R - Ex。 1.13

有关如何改进代码的任何建议?是否我在状态或首先测试状态是否重要?我注意到在我的例子中,人们先测试c是否为空白或制表符。

我想我需要重温直方图。它并没有真正扩展结果。它只根据长度绘制一个连字符。

我认为修改后要更具可读性。

// Print a histogram of the length of words in it's input.

#include <stdio.h>
#define IN 1
#define OUT 2
#define MAX 99

int main(){

    int c;  // the character
    int countOfLetters = 0;
    int insideWord = OUT;
    int frequencyOfLengths[MAX];
    int longestWordCount = 0;
    int i, j; // Counters

    for (i = 0; i < MAX; i++){
        frequencyOfLengths[i] = 0;
    }

    while ((c = getchar()) != EOF){
        if (c == ' ' || c == '\n' || c == '\t'){
            if (insideWord == IN){
                if (countOfLetters > MAX){
                    return 1;
                }
                ++frequencyOfLengths[countOfLetters];
                if (countOfLetters >= longestWordCount) longestWordCount = countOfLetters;
            }
            countOfLetters = 0;
        }
        else {
            countOfLetters++;
            insideWord = IN;
        }
    }

    for (i = 1; i <= longestWordCount; i++){
        printf("%3i : %3i     ", i, frequencyOfLengths[i]);
        for (j = 0; j < frequencyOfLengths[i]; j++){
            printf("*");
        }
        printf("\n");
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

绝对缩放结果,查看我的Character Histogram进行水平缩放直方图。

此外,您可以从y轴标签中受益。很难说哪个条的长度是哪个条。我不知道哪个栏是什么字长。

我在显示直方图之前添加了这个代码,它基本上将每个值减半,这会丢掉你的条形码标签。你可以搞清楚!

// Iterates and tells us the most frequent word length
int mostFrequent = 0;
for (i = 1; i < MAXWORD; i++)
    if (charCount[i] > mostFrequent)
        mostFrequent = charCount[i];

// If the bar will be too big, cut every value in half
while (mostFrequent > 60) {
    for (i = 1; i < MAXWORD; i++)
        if (charCount[i] > 0) {
            charCount[i] /= 2;
            charCount[i] |= 1;
        }

    // Check again to find the most frequent word length category
    mostFrequent = 0;
    for (i = 1; i < MAXWORD; i++)
        if (charCount[i] > mostFrequent)
            mostFrequent = charCount[i];
}

老实说,这些酒吧难以阅读,也许只是使用一行如█!

到目前为止,很棒的书,我们实际上一起阅读并且在同一页上!

干杯