统计字母出现频率(C语言实现)

程序题目描述:

输入一段文字(以回车结束),统计其中每个字母出现的频率。

【输入格式】

一段文字(以回车结束)

【输出格式】

统计结果(包括次数和百分比,并显示条状图,参见输出样例)

【输入样例】

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;
}

运行结果: 

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值