程序题目描述:
输入一段文字(以回车结束),统计其中每个字母出现的频率。
【输入格式】
一段文字(以回车结束)
【输出格式】
统计结果(包括次数和百分比,并显示条状图,参见输出样例)
【输入样例】
This is a pen. That is a pencil.
【输出样例】
A: 3 13.0% *************
C: 1 4.3% ****
E: 2 8.7% *********
H: 2 8.7% *********
I: 4 17.4% *****************
L: 1 4.3% ****
N: 2 8.7% *********
P: 2 8.7% *********
S: 3 13.0% *************
T: 3 13.0% *************
总体设计思想:依题意观察,百分比=单个字母数/总字母数,在百分比显示中先将数据四舍五入,再显示条状图,1%对应一个"*".要求输出次序与字母字典顺序相同,不出现则不输出.鉴于每一项数据重复度高,不妨设置结构体来实现.
代码:
#include<stdio.h>
int main()
{
//依题意观察,百分比=单个字母数/总字母数,在百分比显示中先将数据四舍五入,再显示条状图,1%对应一个"*".
//要求输出次序与字母字典顺序相同,不出现则不输出.
//鉴于每一项数据重复度高,不妨设置结构体来实现.
struct alpha
{
char name;//字母名称
int num;//字母计数
double rate;//字母比例
int star;//星星数
}a[26];//26个字母单元
int i;
for(i=0;i<26;i++)
{
a[i].name='A'+i;//顺序赋名
a[i].num=0;//赋值0
a[i].rate=0;//赋值0
a[i].star=0;//赋值0
}//初始化结构体数组
char ch;
int sum=0;//总字母数量
int x,y;//两个缓存单元
for(i=0;(ch=getchar())!='\n';i++)//顺序读取,是字母就对应计数
{
if(ch>='A'&&ch<='Z')
{
sum++;//总数++
x=ch-'A';//大写字母序号
a[x].num++;//字母出现频数
}
if(ch>='a'&&ch<='z')
{
sum++;//总数++
x=ch-'a';//小写字母序号
a[x].num++;//字母出现频数
}
}
for(i=0;i<26;i++)
{
a[i].rate=100*((1.0*a[i].num)/sum);//百分率
if(int(a[i].rate+0.5)>int(a[i].rate))
y=int(a[i].rate+0.5);//四舍五入
else
y=int(a[i].rate);//化整后的星星数给z
a[i].star=y;//星星数
}
//输出部分
for(i=0;i<26;i++)//顺序输出,出现数不为0则输出
{
if(a[i].num!=0)
{
printf("%c: %d %.1f%%",a[i].name,a[i].num,a[i].rate);
for(int j=a[i].star;j>0;j--)//补充输出星星
printf("*");
printf("\n");
}
}
return 0;
}
运行结果: