我写了一个简单的, 对付考试,作业应该够了.. 各位就不要再发帖问这题了..好好消化一下..
/////////////////////////////////////////
// 字母频率统计及显示 简易版
// 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;
}