读书人

请帮忙看看小弟我的这个用map的程序哪

发布时间: 2012-02-24 16:30:39 作者: rapoo

请帮忙看看我的这个用map的程序哪里出错了?谢谢!
我写了个统计文件(“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 谢谢!

[解决办法]
map 中同一个 Key 只能出现一次。 也就是说,如果有两个字母的出现频率是一样的, 则其 Key 也一样, 因此后一次插入会覆盖以前的内容,不会插入。

把你的 map 换成 multimap 就可以了。

读书人网 >C++

热点推荐