1. 要求: 编写一个程序, 打印输入中各个字符出现频度的直方图.

2. 分析.

一.输入部分:

1. 统计什么样的字符? 这里就统计ASCII表中可显示字符, 查询ASCII表可显示字符知, 字符 32~126是可见的, 共95个.

2. 使用一维数组来计数.

3. 不在32~126中的字符, 单独统计到sum中.

4. 超出最大个数则用H打印出.

二.输出部分:

1. 水平直方图, 每行进行判断, 字符统计个数<=HIST, 打印字符和字符统计个数的*, 字符统计个数>HIST, 打印H.

2. 垂直直方图, 每行进行判断.

  1. 字符统计个数<=HIST(能统计的最大数), HIST-字符统计个数>当前行row, 打印空格, HIST-字符统计个数<=当前行row, 打印*号.
  2. 字符统计个数>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;
}