| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2869 人关注过本帖
标题:[答案]统计字母的使用频率.简易版
只看楼主 加入收藏
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
结帖率:100%
收藏
 问题点数:0 回复次数:12 
[答案]统计字母的使用频率.简易版

我写了一个简单的, 对付考试,作业应该够了.. 各位就不要再发帖问这题了..好好消化一下..

/////////////////////////////////////////
// 字母频率统计及显示 简易版
// By Nobi 2007-6-30
/////////////////////////////////////////
#include <iostream>
using namespace std;

int getratio(int * ratio, char * str); //统计
void display(int * ratio, char * str, int len); //显示, 可设置升序/降序

void displayratio(int * ratio, int len){
cout<<"字符串长度:"<<len<<endl;
cout<<"使用频率表:"<<endl;
for(int i=0;i<26;++i)
cout<<char('A'+i)<<":"<<ratio[i]<<endl;
}

void main(){
cout<<"输入:";
char str[201];
cin>>str;
int ratio[26]; //统计26个字母出现频率 & initiate
int len=getratio(ratio,str); //串长度(不含\0)
cout<<"已排序字符串: ";
display(ratio,str,len);
displayratio(ratio,len);
}

int getratio(int * ratio, char * str){
int len=0;
for(int i=0;i<26;++i)
ratio[i]=0; for(i=0;str[i]!=0;++i){
//判断是否字母
//大写
if(str[i]>='A'&&str[i]<='Z')
//yes
++ratio[(str[i]-'A')]; //指定字母频率表(出现次数)+1
//小写
if(str[i]>='a'&&str[i]<='z')
++ratio[(str[i]-'a')]; //同上
//后续操作
++len; //统计长度
}
return len;
}
void display(int * ratio,char * str, int len){
int tmp[26]; //临时, 存放已排序字母频率
for(int i=0;i<26;++i)
tmp[i]=0;
int si; //操作寄存器
for(i=26;i>0;--i){
si=0;
for(int j=0;j<i;++j){
//获取目前最大的频率
if(ratio[si]<ratio[j])
si=j;
}
if(ratio[si]!=0){
//得到当前最大频率ratio[si]
//显示该字母
for(j=0;j<len;++j){
if(str[j]>='A'&&str[j]<='Z'){
if(str[j]=='A'+si)
cout<<str[j];
}
if(str[j]>='a'&&str[j]<='z'){
if(str[j]=='a'+si)
cout<<str[j];
}
}
}
ratio[si]=0;
}
cout<<endl;
}

搜索更多相关主题的帖子: int 频率 字母 ratio void 
2007-06-30 21:02
天空の城
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-7-1
收藏
得分:0 
if(str[i]>='A'&&str[i]<='Z')
//yes
++ratio[(str[i]-'A')]; //指定字母频率表(出现次数)+1
//小写
if(str[i]>='a'&&str[i]<='z')
++ratio[(str[i]-'a')];

还不如一行代替:
++ratio[(toupper(str[i])-'A')];

2007-07-01 13:17
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
你运行了吗? 在CFREE上 错误很多

羊肉串 葡萄干 哈密瓜!!
2007-07-01 16:58
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 

To 天空の城

只用了iostream库...用那么多库没意思..


女侠,约吗?
2007-07-01 21:09
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 

To mp3aaa

不用怀疑我, Visual C++ 6.0 sp6 + Windows Server 2003 运行通过


女侠,约吗?
2007-07-01 21:11
天空の城
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-7-1
收藏
得分:0 

代码化简的同时没有影响效率,那么我们就应该尽量用库函数。。。


2007-07-02 13:49
weishj
Rank: 1
等 级:新手上路
威 望:2
帖 子:141
专家分:0
注 册:2007-4-22
收藏
得分:0 
#pragma warning(disable:4786)
#include <iostream>
#include <map>
#include <fstream>
#include <cctype>
#include <iomanip>
using namespace std;
int main()
{
map<char,int> ch;
map<char,int>::iterator iter;
char c1;
int sum=0;
ifstream ifs("source.txt");
ofstream ofs("sum.txt");
if (ifs.fail() || ofs.fail())
{
cout << "文件打开出错!" << endl;
return 1;
}
while(ifs.get(c1))
if(isalpha(c1))
{
c1=tolower(c1);
ch[c1] +=1;
}
for(iter=ch.begin();iter!=ch.end();++iter)
sum+=iter->second;
for(iter=ch.begin();iter!=ch.end();++iter)
{
cout<<setw(5)<<iter->first<<" "<<setw(6)<<iter->second<<" "<<setw(15)<<float(iter->second)/sum<<endl;
ofs<<setw(5)<<iter->first<<" "<<setw(6)<<iter->second<<" "<<setw(15)<<(float(iter->second)/sum)*100<<"%"<<endl;
}
cout<<"字母总数: "<<sum<<endl;
ofs<<"字母总数: "<<sum<<endl;
ofs.close();
ifs.close();
return 0;
}

[此贴子已经被作者于2007-7-2 17:40:56编辑过]


If you shed tears when you miss the sun, you also miss the stars.
2007-07-02 17:26
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
weishj,很不错。
其实一看这题目,最直观的反映就是map,不过对那些求作业的人来说,应该看不明白。

Fight  to win  or  die...
2007-07-02 18:07
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
整那么多有的没的..
代码都简化没了人家学啥?.. 拿啥练手?..

女侠,约吗?
2007-07-02 20:23
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

的确 用map很方便的 ....偶没用map之前就笨了

int sum[26]={0};
char alpha[]={'a','b','c','d','e',...,'y','z','\0'};
//相当于typedef map<char,int> 了 ^^

fstream file("*.txt",ios::in);
...
while(file.get(ch))
{
for(int i=0; i<26; ++i)
if(tolower(ch)==alpha[i])
{
sum[i]++;
break;
}
}
...

[此贴子已经被作者于2007-7-2 22:20:28编辑过]


unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-07-02 22:14
快速回复:[答案]统计字母的使用频率.简易版
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.090589 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved