0
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
vector<string> Letter;
float frequency1(string word)
{
   float count=0.0;
   for (int i=0;i<Letter.size();++i)
   {
      transform(word.begin(),word.end(),word.begin(),::tolower);
      transform(Letter[i].begin(),Letter[i].end(),Letter[i].begin(),::tolower);   

      if (strcmp(word.c_str(),Letter[i].c_str())==0)
      {
          count+=1;
      }   
  }
  count=(count/Letter.size())*100;
  if (count>=0.5)
  {
         return count;
  }
  else
  {
      return 0.0;
  }
}                                       

int main()
{
    ifstream fin;
    fin.open("frequent.txt");
    if (fin.fail())
    {
        cout<<"Error opening file!"<<endl;
    }

    while(!fin.eof()) 
    {
        string buffer;              
        getline(fin,buffer,' ');
        cout<<buffer<<endl;
        Letter.push_back(buffer);
    }
    cout<<endl;
    vector<string> frequent;
    vector<float> frequency;
    for (int i=0;i<Letter.size();++i)
    {
        string a=Letter[i];
        int k=0;
        for (int j=0;j<i;++j)
        {
            transform(a.begin(),a.end(),a.begin(),::tolower);
            transform(Letter[j].begin(),Letter[j].end(),Letter[j].begin(),::tolower);
            if (a==Letter[j])
            {
                 break;
            }
            k++;
        }
        int size=Letter.size();
        if (k!=size-1)
        {
            continue;
        }            
        float counter=frequency1(a);
        if(counter>0.0)
        {
            frequent.push_back(Letter[i]);
            frequency.push_back(counter);
        }
    }
    cout<<"Here are the repeated words"<<endl;
    for (int i=0;i<frequency.size();++i)
    {
        cout<<"       "<<frequent[i]<<", frequency: "<<frequency[i]<<endl;
    }
    system("PAUSE");
    return 0;
}         

ドキュメント(テキスト)で繰り返される単語の頻度を決定するプログラムを書いています。頻度が 0.5 以上の場合、単語は繰り返し単語として渡されます。しかし、実行すると、手動で計算しても文書内に単語が繰り返されていることがわかりますが、繰り返し単語は表示されません。問題がわかりません。

4

1 に答える 1

1

まず、入力ファイルを開くことができない場合はexit、残りをelseにラップする必要がありますmain

if (fin.fail())
{
    cout<<"Error opening file!"<<endl;
}

そうしないと、無効なストリームから読み込もうとすることになります。

区切り文字としてstd::getline空白を使用して単語を読みます。' 'これは、改行'\n'、タブ'\t'などを言葉に含めることを意味しますが、これは意図したものではない可能性があります。あなたの言葉を読むためのより良い、より安全なアプローチは、

std::string word;
while (fin >> word) {
    // process word
}

これにより、すべての空白がスキップされ、追加の利点として EOF が適切に検出されます。

さらに問題が発生する可能性もあります。

于 2012-12-16T16:04:13.563 に答える