C打印直方图

时间:2013-09-21 09:11:28

标签: c histogram

这是来自K& R的问题: -

编写一个程序,在其输入中打印单词长度的直方图。可以很容易地绘制水平条形图的直方图;但垂直方向更具挑战性。

我不应该使用任何库函数,因为这只是一个教程介绍!

我已经编写了以下程序但它有一些错误: -

1)如果单词之间有多个空白字符,则程序无法正常工作。

2)我怎么知道'k'的最大值我的意思是如何知道输入中有多少个单词?

以下是代码: -

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#define MAX_WORDS 100

int main(void)
{
    int c, i=0, k=1, ch[MAX_WORDS] = {0};

    printf("enter the words:-\n");

    do
    {
        while((c=getchar())!=EOF)
        {
            if(c=='\n' || c==' ' || c=='\t')
                break;
            else
                ch[i]++;
        }
        i++;
    }
    while(i<MAX_WORDS);

    do
    {
        printf("%3d|",k);
        for(int j=1;j<=ch[k];j++)
            printf("%c",'*');
        printf("\n");
        k++;
    }
    while(k<10);
}

3 个答案:

答案 0 :(得分:2)

即使两个单词之间有多个换行符,这个程序也能正常工作,numWords会给你单词数。

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int ch, cha[100] = {0}, k = 1;
    int numWords = 0;
    int numLetters = 0;
    bool prevWasANewline = true;     //Newlines at beginning are ignored

    printf("Enter the words:-\n");
    while ((ch = getchar()) != EOF && ch != '\n')
    {
        if (ch == ' ' || ch == '\t')
            prevWasANewline = true;  //Newlines at the end are ignored
        else
        {
             if (prevWasANewline)     //Extra nelines between two words ignored
             {
                  numWords++;
                  numLetters = 0; 
             }
             prevWasANewline = false;
             cha[numWords] = ++numLetters; 
        }

    }

    do
    {
        printf("%3d|",k);
        for(int j=0;j<cha[k];j++)
            printf("%c",'*');
        printf("\n");
        k++;
    } while(k <= numWords);

    return 0;
}      

答案 1 :(得分:0)

它有点旧,但是我有同样的问题。上面的代码就像魅力一样工作,但是对于我们在前20页中对K&R所掌握的知识来说,这有点过头了。 我不知道它们对直方图打印的含义,并且该代码帮助了我。 无论如何,我都是利用从本书中学到的知识自己编写的代码,希望对您有所帮助。 原谅我,如果我有点混乱,我自己只是一个初学者:D

#include <stdio.h>
#define YES 1
#define NO 0

int main(void)
{
    int wnumb [100];
    int i, inword, c, n, k;
    n = (-1);
    for (i = 0; i <=100; ++i) {
        wnumb [i] = 0;
    }
    inword = NO;

    while ((c = getchar()) != EOF) {
        if ( c == ' ' || c == '\n' || c == '\t' ) {
            inword = NO;
        }           
        else if (inword == NO) {
            ++n;
            ++wnumb [n];
            inword = YES;
        }
        else {
            ++wnumb [n];
        }

    }
    for (i = 0; i <= 100; ++i) {
        if (wnumb [i] > 0) {
            printf ("\n%3d. | ", (i+1));
            for (k = 1; k <= wnumb[i]; ++k) {
                printf("*");
            }
        }

    }
    printf("\n");
}

答案 2 :(得分:0)

以下是简单直方图的示例(垂直)

#include <stdio.h>

int main()
{
    int c, i, j, max;
    int ndigit[10];

    for (i = 0; i < 10; i++)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];

    max = ndigit[0];
    for (i = 1; i < 10; ++i)        /* for Y-axis */
        if (max < ndigit[i])
            max = ndigit[i];

    printf("--------------------------------------------------\n");
    for (i = max; i > 0; --i) {
        printf("%.3d|", i);
        for (j = 0; j < 10; ++j)
            (ndigit[j] >= i) ? printf(" X ") : printf("   ");
        printf("\n");
    }
    printf("   ");
    for (i = 0; i < 10; ++i)        /* for X-axis */
        printf("%3d", i);
    printf("\n--------------------------------------------------\n");
    return 0;
}