C程序设计语言(第2版·新版)-The_C_Programming_Language
练习1-14 编写一个程序,打印输入中各个字符出现频率的直方图。
#include <stdio.h>
main()
{
int i, j;
int ch;
int last_char;
int askii[95];//askii[95]存储字符出现次数最大值
printf(",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\n");
printf(":Enter \" :q\" to confirm end of input;\n");
printf("`````````````````````````````````````\n");
for (i = 0; i <= 95; i++)
askii[i] = 0;
/*储存符号出现的次数与最大次数*/
while ((ch = getchar()) != EOF && !(ch == 'q' && last_char == ':')){//:q退出循环
if (ch >= ' ' && ch <= '~'){//统计字符数量
++askii[ch - 32];
if (askii[ch - 32] > askii[95])//求字符出现次数最大值
askii[95] = askii[ch - 32];
last_char = ch;//记上一个字符为 :
}
else
continue;
}
askii[':' - 32] -= 1;//去除符号 : 多加的次数
/*绘制直方图*/
printf("\n%*cxx直方图\n", 95/2-5, ' ');
printf("%*cA\n", 6, ' ');//6
printf("%*c|\n", 6, ' ');
for (j = askii[95]; j > 0; j--){
printf("%5d |", j);
for (i = 0; i < 95; i++){
if (askii[i] == j){
printf("#");
--askii[i];
}
else
printf(" ");
}
printf("\n");
}
printf("%*c+", 6, ' ');
for (i = 0; i < 96; i++)
printf("-");
printf(">\n%5d |", 0);
for (i = 0; i < 95; i++)
printf("%c", i+32);
}
(输入 :q 退出输入并打印计算结果)
运行后的结果: