Печать вертикальной гистограммы - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь распечатать вертикальную гистограмму, которая подсчитывает частоту каждой цифры, вводимой пользователем.Сначала я сохраняю частоту следующим образом:

 int a[10];  //array
 int c;      //store input from getchar
 int i;      //loop variable

 for(i=0;i<10;i++)
 {

    a[i]=0;   //initialize to 0
 }
 while((c=getchar())!=EOF)  //read character
 {
    ++a[c-'0'];
 }

Затем я пытаюсь нарисовать вертикальную гистограмму.

for(i=10;i>0;i--)  //asssumed max limit of frequency is 10
{
  int j;          //iterate through the array
  for(j=0;j<10;j++)
{
 if(a[j]==i)     //if frequency of any element in array matches i 
 {
  printf("* \t");
  --a[j];       //decrement array element frequency value
 }
 else
 printf(" \t");  //no action
 }
 printf("\n");   //next line
}

Проблема в том, что когда я пытаюсь напечатать гистограмму, я получаюПустой экран.Я проверил его с горизонтальной гистограммой, и он работает.

1 Ответ

0 голосов
/ 25 мая 2018

Взяв именно ваш код, отформатировав его для удобочитаемости и добавив проверку, чтобы убедиться, что используются только цифры, чтобы избежать дальнейших ошибок, это сработало.Проверка не была необходима для функциональности, но это хорошая идея, чтобы избежать записи за пределы массива.

#include <stdio.h>
#include <ctype.h>

int main() {
    int a[10];  //array
    int c;      //store input from getchar
    int i;      //loop variable

    for(i=0;i<10;i++)
    {
        a[i]=0;   //initialize to 0
    }
    while((c=getchar())!=EOF)  //read character
    {
        if (isdigit(c))
            ++a[c - '0'];
    }

    for(i=10;i>0;i--)  //asssumed max limit of frequency is 10
    {
        int j;          //iterate through the array
        for(j=0;j<10;j++)
        {
            if(a[j]==i)     //if frequency of any element in array matches i 
            {
                printf("* \t");
                --a[j];       //decrement array element frequency value
            }
            else
                printf(" \t");  //no action
        }
        printf("\n");   //next line
    }
}

Результат:

$ ./a
0123456789666338592






                                                *
                        *                       *
                *       *               *       *               *       *
*       *       *       *       *       *       *       *       *       *

Для справки, это было скомпилированодля Cygwin.Я также изменил ваш исходный код несколькими способами, чтобы соответствовать некоторым из практик, которым я следую:

#include <stdio.h>
#include <ctype.h>

int main()
{
    int a[10] = {0}; // While use a for to initialize to 0 when you can do it easily?
    int i;
    char c;

    while((c = getchar()) != EOF)
    {
        if (isdigit(c))    // Never trust the user
            a[c - '0']++;  // Changed for readability, make it clear that we are incrementing the value, not the pointer.
    }

    for(i = 10; i > 0; --i)
    {
        int j;
        for(j = 0; j < 10; ++j)
        {
            // Made flow a little clearer
            if(a[j] >= i)
                putchar('*');
            else
                putchar(' ');
            putchar('\t');
        }
        putchar('\n');
    }
}

То, что вы делаете, конечно, зависит от вас, я лично считаю это более последовательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...