2

这是来自 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);
}
4

3 回答 3

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;
}      
于 2013-09-21T09:34:47.560 回答
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");
}
于 2018-07-30T10:30:59.290 回答
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;
}
于 2018-12-07T08:42:18.993 回答