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};