请帮忙看看我的这个用map的程序哪里出错了?谢谢!

zwdnet 2007-02-03 10:39:37
我写了个统计文件(“english.txt")中英文字母出现频率的程序,结果输出到文件("result.txt")中,其中使用了map,但是最后的结果有点问题,程序如下:

/*编程从指定文件中读入英文字母,并统计每个英文字母出现的频率,最后将结果
输出到 指定文件中*/
#include <iostream>
#include <fstream>
#include <map>
#include <cctype>
#include <iterator>
using namespace std;

long mycount[26]; //记录每个字母出现次数;
long sum=0; //记录字母总数

//处理每个字母,进行统计
void Chuli(char chu)
{
switch(chu)
{
case 'a':
case 'A':
mycount[0]++;
sum++;
break;
case 'b':
case 'B':
mycount[1]++;
sum++;
break;
case 'c':
case 'C':
mycount[2]++;
sum++;
break;
case 'd':
case 'D':
mycount[3]++;
sum++;
break;
case 'e':
case 'E':
mycount[4]++;
sum++;
break;
case 'f':
case 'F':
mycount[5]++;
sum++;
break;
case 'g':
case 'G':
mycount[6]++;
sum++;
break;
case 'h':
case 'H':
mycount[7]++;
sum++;
break;
case 'i':
case 'I':
mycount[8]++;
sum++;
break;
case 'j':
case 'J':
mycount[9]++;
sum++;
break;
case 'k':
case 'K':
mycount[10]++;
sum++;
break;
case 'l':
case 'L':
mycount[11]++;
sum++;
break;
case 'm':
case 'M':
mycount[12]++;
sum++;
break;
case 'n':
case 'N':
mycount[13]++;
sum++;
break;
case 'o':
case 'O':
mycount[14]++;
sum++;
break;
case 'p':
case 'P':
mycount[15]++;
sum++;
break;
case 'q':
case 'Q':
mycount[16]++;
sum++;
break;
case 'r':
case 'R':
mycount[17]++;
sum++;
break;
case 's':
case 'S':
mycount[18]++;
sum++;
break;
case 't':
case 'T':
mycount[19]++;
sum++;
break;
case 'u':
case 'U':
mycount[20]++;
sum++;
break;
case 'v':
case 'V':
mycount[21]++;
sum++;
break;
case 'w':
case 'W':
mycount[22]++;
sum++;
break;
case 'x':
case 'X':
mycount[23]++;
sum++;
break;
case 'y':
case 'Y':
mycount[24]++;
sum++;
break;
case 'z':
case 'Z':
mycount[25]++;
sum++;
break;
default: //非英文字母,数字等不算
break;
}
}
int main()
{
//1.初始化数据
map<double,char> letter; //记录每个字母
/*本来用的是 map<char,double>, 程序运行结果正常,可惜是按字母顺序
排列,而我是想按出现的频率高低排列(不然就不用map了,所以改成这样,
结果就有问题*/
map<double,char>::iterator iletter; //迭代器
double result[26]; //处理结果
int i;
ifstream input("english.txt");
if(input.fail())
{
cout<<"读入文件发生错误!程序将退出"<<endl;
system("pause");
exit(1);
}
char teminput;//输入的每个字母
//2.读入文件
while(input.eof() != true)
{
input>>teminput;
//3.统计处理
Chuli(teminput);
}
char myletter = 'A'; //作为输入map的代号
for(i = 0;i<26;i++)
{
result[i] = 0.0; //初始化,后来加的,可是没有用
result[i] = (double)mycount[i]/(double)sum;
letter.insert(map<double,char>::value_type(result[i],myletter));
cout<<myletter<<endl; //显示处理到哪个字母,26个字母都有
myletter++;
}
//4.输出文件
ofstream output("result.txt");
if(output.fail())
{
cout<<"打开文件发生错误!程序将退出"<<endl;
system("pause");
exit(1);
}
output<<"统计english.txt文件内字母出现频率的结果为:"<<endl;
iletter = letter.begin();
for(i = 0;i<26;i++) //26个字母
{
output<<iletter->second<<":"<<iletter->first<<endl;
iletter++;
}
input.close();
output.close();
cout<<"处理结束!"<<endl;
cin.get();
return 0;
}

程序编译运行正常,可最后的结果是(result.txt文件的内容):
统计english.txt文件内字母出现频率的结果为:
J:0.00175994
K:0.00351989
Q:0.00422386
X:0.00985568
V:0.0102077
B:0.0109117
G:0.0119676
W:0.0123196
Y:0.0165435
P:0.0183034
M:0.0207673
L:0.0225273
F:0.0228793
U:0.0256952
H:0.0281591
D:0.0295671
C:0.0461105
S:0.0482225
N:0.0707497
I:0.0735656
O:0.0820134
R:0.0957409
A:0.102077
T:0.107709
E:0.122844
:1.62527e-307

前面都正常,最后出了个“”,而字母"Z"没有了,我在输入的文件(english.txt)里查过,有'Z'这个字母,即使没有也应当输出Z:0.0之类啊?请帮忙看看是哪里出错了?编译器devc++4.9.9.2 谢谢!
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwdnet 2007-02-03
  • 打赏
  • 举报
回复
谢谢您,解决了!
www_adintr_com 2007-02-03
  • 打赏
  • 举报
回复
map 中同一个 Key 只能出现一次。 也就是说,如果有两个字母的出现频率是一样的, 则其 Key 也一样, 因此后一次插入会覆盖以前的内容,不会插入。

把你的 map 换成 multimap 就可以了。
zwdnet 2007-02-03
  • 打赏
  • 举报
回复
另外,我重新换了一篇英文文章,结果又变了,这回是'F'没了,但最后一行还是那个样子,
统计english.txt文件内字母出现频率的结果为:
Z:0.00115163
Q:0.00153551
J:0.00230326
V:0.00729367
K:0.00806142
B:0.0119002
W:0.0180422
G:0.0191939
U:0.0199616
Y:0.0207294
M:0.0211132
P:0.021881
F:0.0234165
D:0.0318618
H:0.040691
L:0.0414587
C:0.052975
N:0.0690979
R:0.0752399
S:0.0756238
O:0.0771593
I:0.0802303
T:0.0809981
A:0.0836852
E:0.112092
:1.62527e-307
zwdnet 2007-02-03
  • 打赏
  • 举报
回复
最后的那个出错的结果没发上来,在记事本上是一个黑色的实心方块。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧