问题描述
读取四行字母,并输出一个垂直柱状图用以显示在输入中的所有字母的出现次数。
输入:
1行到4行: 大写字母 , 每行不超过72个字符
输出:
第一行到第?行: 由星号和空格组成的若干行,最后一行由被分开的大写字母组成。
输入样例:
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM RROGRAM
HELLO!
分析:
按照自顶向下,自左向右的顺序绘制统计图
1.定义一个数组statistic 来统计每个字母出现的次数, 设置一个最大值max 表示字母出现的最大次数
2.从统计图中最高的柱子出发:即从最上层( 字母出现次数最多的那一层),自顶向下计算,找出当前行中是否有频率不小于当前行最大频率值的字母 即:判断 statistic[i] >=max-i
(1) 如果有,则输出 一个 * 和一个空格
(2)如果没有,则输出两个空格
3.输入最下层的A-Z字母
代码实现:
//Vertical Histogram柱状图
#include "stdafx.h"
#include <string>
#include <iostream>
#include <ctype.h>
#include <cstdio>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//数组中存放各个字母出现的次数
unsigned short statistic[26] = { 0 };
//出现的最大次数
unsigned short max = 0;
int i, j;
/**输入各行数据并统计每个字母出现的次数
*/
for (i = 0; i < 4; i++)
{
string s;
getline(cin, s);
for (j = 0; j < s.size(); j++){
if (toupper(s[j])&&isalpha(s[j]))
statistic[s[j] - 'A']++;
}
}
//找出字母出现的最大次数
for (i = 0; i < 26; i++){
if (statistic[i] >max)
max = statistic[i];
}
//从统计图中最高的柱子出发:即从最上层 字母出现次数最多的那一层,自顶向下计算
for (i = max; i > 0; i--)
{
for (j = 0; j < 26; j++)
{
//寻找当前行中字母出现次数不小于当前行的最大峰值时
if (statistic[j] >= i)
cout << "* "; //输出 一个 * 和一个空格
else
cout << " "; //否则输出两个连续的空格
}
cout << endl;
}
//输出最下面一行的A-Z字母
for (i = 0; i < 26; i++)
printf("%c ",'A'+i);
cout << endl;
return 0;
}