英文字符进行频率的统计,直方图输出

问题

对指定文件中的英文字符进行频率的统计,不区分大小写(都按照大写统计),忽略非字母。并使用频率直方图的形式显示出来。

来源

贴吧吧友提问

代码

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cassert>

using namespace std;

class LetterCount
{
    private:
        enum{LETTERS_SUM=26};    //常量:个英文字母有26个 

        string file_path;                        //文件路径
        int    total_letters;                    //统计到的字母的总个数
        int    letter_count[LETTERS_SUM];        //保存每个单词的出现次数
        double letter_frequence[LETTERS_SUM];    //保存每个单词的出现频率

        //不允许使用
        LetterCount(const LetterCount& le);             //复制函数
        LetterCount& operator=(const LetterCount& le);  //赋值函数 

    public:

    void setFilePath(const char *path){file_path = path;}  //设置文件的路径 inline function
    void analyse();                                        //统计函数
    void showGraph() const;                                //打印统计图 

    LetterCount();
    LetterCount(const char *path);
    ~LetterCount();

}; 

LetterCount::LetterCount():file_path(),total_letters(0)
{

    for(int i=0;i<LETTERS_SUM;++i)
    {
        letter_count[i] = 0;
        letter_frequence[i] = 0.0;
    }    

}

LetterCount::LetterCount(const char*path):file_path(path),total_letters(0)
{
    for(int i=0;i<LETTERS_SUM;++i)
    {
        letter_count[i] = 0;
        letter_frequence[i] = 0.0;
    }
}

LetterCount::~LetterCount()
{
    // do nothing
}

void LetterCount::analyse()
{
    FILE*fp = fopen(file_path.c_str(),"r");    //打开文件
    assert(fp!=NULL);

    char ch;
    while((ch=fgetc(fp))!=EOF)
    {
        if(isalpha(ch))   //如果不是英文字母,则忽略
        {                 //忽略大小写,全部安大写统计
            letter_count[ toupper(ch) -‘A‘]++;
            total_letters++;
        }
    }

    fclose(fp); //关闭文件 

    //计算单词的频率
    for(int i=0;i<LETTERS_SUM;++i)
    {
        letter_frequence[i] = (letter_count[i]*1.0)/total_letters ;
    } 

} 

void LetterCount::showGraph() const
{
        /* ***************样图 

            100|   *
               | * *
               | * * *
            0  |-----------
                 A B C ...

        *********************/

    for(int r=100;r!=0;--r)    //统计图有100行,代表百分百比
    {

        if(r%10==0)           //打印表的整数百分比,便于观察.
            printf("%-3d",r);
        else
            printf("   ");

        printf("|");

        for(char ch=‘A‘;ch<=‘Z‘;++ch)
        {
            if(int(((letter_frequence[ch-‘A‘]*100) +0.5)) >=r )
            {
                printf(" *");
            }
            else
            {
                printf("  ");
            }
            printf(" ");
        }
        printf("\n");
    }

    printf("%-3d",0);

    for(char ch=‘A‘;ch<=‘Z‘;++ch)
    {
        printf("----");
    }
    printf("\n");printf("%-3c",‘ ‘);
    for(char ch=‘A‘;ch<=‘Z‘;++ch)
    {
        printf("  %c",ch);
    }

    printf("\n");
}

int main()
{
    LetterCount lc("G:\\data.txt");

    lc.analyse();

    lc.showGraph();

    return 0;
}

效果

时间: 2024-10-27 07:20:43

英文字符进行频率的统计,直方图输出的相关文章

java 统计英文字符

import java.util.Arrays; /* * The Associated Press won an award for its series on the profiling of Muslims by the New York Police Department. But for the first time since 1977 there was no prize for fiction.The Pulitzer panel praised the Patriot-News

java面试题:如果一串字符如&quot;aaaabbc中国1512&quot;要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量, * 假设字符中没有中文字符.英文字符.数字字符之外的其他特殊字符. */ String str="aaaabbc中国1512"; int engishCount =

使用Python2.x,在Pycharm工具下,如果存在中文等非英文字符输出或注释时,运行代码,会出现提示:SyntaxError: Non-ASCII character &#39;\xe7&#39;

在Python文件开头,第一行代码,有两种写法: 1.使用#coding=UTF-8(等号也可以换为“:”)  2.或者  #-- coding:UTF-8 -- 备注:python的默认编码文件是用的ASCII码,在Python 3.X中没有这种错误. 使用Python2.x,在Pycharm工具下,如果存在中文等非英文字符输出或注释时,运行代码,会出现提示:SyntaxError: Non-ASCII character '\xe7' 原文地址:https://www.cnblogs.com

输入一串只含有中文、英文和数字的字符串,统计其中中文字符、英文字符和数字字符各有多少个?

public class StatisticZEN { public static void main(String[] args) { String str = "中国aadf的111萨bbb菲的zz萨菲"; statisticsChar(str); } private static HashMap<String, Integer> statisticsChar(String str) { int chineseCount = 0; int englishCount =

【华为练习题】字符出现频率

[华为练习题]字符出现频率 题目 描述:写出一个程序,输出基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 举例: 输入:wo shi, yi zhi.xiao xiao niao ' '(空格) 输出:0.17 接口说明: /* 功能: 输入的基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 输入: String pString 输入的基准字符串

按字符出现频率对字符进行排序

#include<iostream> #include<string> #include<algorithm> using namespace std; void tongji() { string input; string output; getline(cin,input);//读入带空格的字符串 int n; n=input.size();//求字符串的大小 int a[255]={0}; int b[255]={0}; bool c[255]={false};

代码题(61)— 根据字符出现频率排序

1.451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次. 因此'e'必须出现在'r'和't'之前.此外,"eetr"也是一个有效的答案. 示例 2: 输入: "cccaaa" 输出: "cccaaa" 解释: 'c'和'a'都出现三次.此外,"aaac

Leetcode 451.根据字符出现频率排序

根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次. 因此'e'必须出现在'r'和't'之前.此外,"eetr"也是一个有效的答案. 示例 2: 输入: "cccaaa" 输出: "cccaaa" 解释: 'c'和'a'都出现三次.此外,"aaaccc"

css一长串连续英文字符的换行

在标签内,中文的换行是没有什么问题的,但英文的换行就有问题.当出现一长串连续的英文字符时,换行就失效了,内容会溢出.解决这个问题只需要一行css就够了: p{ word-wrap: break-word; } 那么问题来了,英文的换行是实现了,但是你会发现,一连串英文全部另起一行了,这就和预计的效果不一致. 原因是连续的一连串英文字符,浏览器会把它识别为一个单词,那么换行当然是一个单词一起换了,解决这个问题只要在原本的基础上再加一句: p{ word-wrap: break-word; word