首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-02-24 
请帮忙看看我的这个用map的程序哪里出错了?谢谢!我写了个统计文件(“english.txt )中英文字母出现频率的程

请帮忙看看我的这个用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 就可以了。

热点排行