1. 要求: 编写一个程序, 打印输入中各个字符出现频度的直方图.
2. 分析.
一.输入部分:
1. 统计什么样的字符? 这里就统计ASCII表中可显示字符, 查询ASCII表可显示字符知, 字符 32~126是可见的, 共95个.
2. 使用一维数组来计数.
3. 不在32~126中的字符, 单独统计到sum中.
4. 超出最大个数则用H打印出.
二.输出部分:
1. 水平直方图, 每行进行判断, 字符统计个数<=HIST, 打印字符和字符统计个数的*, 字符统计个数>HIST, 打印H.
2. 垂直直方图, 每行进行判断.
- 字符统计个数<=HIST(能统计的最大数), HIST-字符统计个数>当前行row, 打印空格, HIST-字符统计个数<=当前行row, 打印*号.
- 字符统计个数>HIST(能统计的最大数), 最后一行MAX-1(因为数组0开始数, 最后一行MAX-1)打印H, 其余打印空格.
3. 代码.
#include<stdio.h>
#define MAX 95
#define HIST 20
int main(){
int input;
int a[MAX];
int sum, row, col;
sum = 0;
for(row=0;row<MAX;row++){
a[row] = 0;
}
while( (input=getchar()) != EOF ){
if(input>=32 && input <=126){
a[(input-32)]++;
}else{
sum++;
}
}
printf( "H MEANS OVER HIST%d\n", HIST );
for(row=0;row<MAX;row++){
printf("%c", (row+32));
if(a[row]<=HIST){
for(col=0;col<a[row];col++){
printf("*");
}
}else{
printf("H");
}
printf("\n");
}
for(row=0;row<HIST;row++){
for(col=0;col<MAX;col++){
if(a[col] <= HIST){
if(HIST-a[col]> row ){
printf(" ");
}else{
printf(" *");
}
}else if(a[col]>HIST && row != (HIST-1)){
printf(" ");
}else if(a[col] > HIST && row == (HIST -1)){
printf(" H");
}
}
printf("\n");
}
for(row=0;row<MAX;row++){
printf("%2c", (row+32));
}
printf("\n%d个不属于可见字符\n", sum);
return 0;
}