K&R Упражнение 1.14. Оцените код - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Решил, но по-моему слишком неоптимально.

Упражнение 1.14.

Напишите программу для вывода гистограммы частот, с которыми встречаются во входном потоке различные символы. Мой код:
#include <stdio.h>
 
#define NUM         int     /* integer type                     */
#define MAX         30.0    /* maximum symbols in histogram     */
#define SYMBOL      '#'     /* histogram symbol                 */
#define ORIENTATION 'v'     /* h(orizontal) or v(ertical)       */
#define HORIZONTAL  'h'     /* any symbol                       */
#define VERTICAL    'v'     /* any symbol                       */
 
int main(void)
{
    int character,
        i,
        j,
        symbols = 0,
        output_started = 0,
        l[256];
 
    float denominator,
          storage,
          percent_denominator,
          percent_storage,
          i2;
    for(i = 0; i <= 255; ++i)
    {
        l[i] = 0;
    };
 
    while((character = getchar()) != EOF)
    {
        ++l[character];
        ++symbols;
    };
 
    if(ORIENTATION == HORIZONTAL)
    {
        denominator = symbols / MAX;
        percent_denominator = symbols / 100.0;
        for(i = 0; i <= 255; ++i)
        {
            storage = l[i] / denominator;
            percent_storage = l[i] / percent_denominator;
            if(l[i] > 0)
            {
                if(i == '\n')
                {
                    printf("\"%s\"(%d;%.2f%%): ", "\\n", l[i], percent_storage);
                }
                else if(i == '\t')
                {
                    printf("\"%s\"(%d;%.2f%%): ", "\\t", l[i], percent_storage);
                }
                else if(i == '\b')
                {
                    printf("\"%s\"(%d;%.2f%%): ", "\\b", l[i], percent_storage);
                }
                else
                {
                    printf("\"%c\"(%d;%.2f%%): ", i, l[i], percent_storage);
                };
                for(i2 = 0; i2 <= storage; ++i2)
                {
                    putchar(SYMBOL);
                };
                putchar('\n');
            };
        };
    }
    else if(ORIENTATION == VERTICAL)
    {
        denominator = symbols / MAX;
        percent_denominator = symbols / 100.0;
 
        for(j = MAX; j >= 0; --j)
        {
            for(i = 0; i <= 255; ++i)
            {
                if(l[i] > 0)
                {
                    storage = l[i] / denominator;
                    percent_storage = l[i] / percent_denominator;
 
                    if((storage + 1) > j)
                    {
                        output_started = 1;
                    };
 
                    if(storage > j)
                    {
                        printf("%c  ", SYMBOL);
                    }
                    else if(output_started == 1)
                    {
                        printf("   ");
                    };
                };
            };
            if(output_started == 1)
            {
                putchar('\n');
            }
 
        };
        for(i=0; i <= 255; ++i)
        {
            if(l[i] > 0)
            {
                if(i == '\n')
                {
                    printf("%s", "\\n ");
                }
                else if(i == '\t')
                {
                    printf("%s", "\\t ");
                }
                else if(i == '\b')
                {
                    printf("%s", "\\b ");
                }
                else
                {
                    printf("%c  ", i);
                };
            };
        };
    };
 
    return 0;
}

Решение задачи: «K&R Упражнение 1.14. Оцените код»

textual
Листинг программы
enum {A,B,C};

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5