2011-06-23 21 views
2

私はC++を初めて使いました。今はAccelerated C++という本から学んでいます。私は第3章(ベクトル)を終えて、この練習に来ました:std :: coutはforループの中で動作しません

"それぞれの単語が入力に何回現れるかを数えるためのプログラムを書いてください。

いくつかの考えの後、私はそれに取り組み始めました。私はプログラムをテストしたかったのですが、std :: coutは動作しませんでした。私はcout << "test";を私のコードのいくつかの場所に貼り付けて問題の場所を見ています。結論として、最初のfor-loopの内部では動作しません。ベクタを扱っているので、問題を解決するためにマップを使用することをお勧めしません。変数は英語ではないので、何が起こっているのかを知るためにいくつか翻訳します:

recenica - 文章です。 rijec - 言葉。 vel_vektora - ベクトルのサイズ。 duz_recenice - センテンスの長さ。 br_ponavljanja - 文中に単語が現れる回数。

#include <vector> 
#include <iostream> 
#include <string> 

using std::string;  using std::vector; 
using std::cin;   using std::cout; 
using std::endl; 



int main() 
{ 
    string rijec; 
    vector<string> recenica; 

    while (cin >> rijec) recenica.push_back(rijec); 
    cout << endl; 

    typedef vector<string>::size_type vel_vektora; 
    vel_vektora duz_recenice = recenica.size(); 
    cout << "test0, "; 

    for (int i = 0; i < duz_recenice - 1; ++i)    
    { 
     cout << "test, !"; 
     int br_ponavljanja = 1; 

     for (int j = i + 1; j < duz_recenice; ++j) 
     { 
       cout << "test2, "; 
       if (recenica[i] == recenica[j]) 
       { 
           cout << "test3, "; 
           ++br_ponavljanja; 
           recenica.erase(recenica.begin() + j); 
       }  
       cout << "test4, "; 
     }   
     cout << recenica[i] << ": " << br_ponavljanja << endl;   
    } 
    cout << "test5, ";     
    getchar(); 
    return 0;   
} 

std::coutの問題点は何ですか?

+6

私はあなたのアプリケーションをデバッガでステップバイステップで実行し、問題の原因を突き止めるために変数の値を見ることをお勧めします。あなたがベクトル内に単語が1つしかない場合、外側のforループは実行されません –

+1

どうして "うまくいかない"のですか? – ybungalobill

+0

@マリアス:+1コーナーケースについて考えると、常に良いデバッグヒントです。 – fredoverflow

答えて

7

<< flushを追加して出力バッファをフラッシュします(各場所)。

または改行とフラッシュの両方を追加する<< endlを使用してください。

特に入力が空白の場合は問題がありますが、これは学習するためのものです。そのままにしておきます。 :-)

乾杯& HTH。、

1

私は言語は変数名の面で私を見逃さが、これは「™私の作品」怖いです。

は、ここに私の出力(第3ライン入力:)

ytreyert 
tyryteter 
gdhdfgdf 
^Z 

test0, test, !test2, test4, test2, test4, ytreyert: 1 
test, !test2, test4, tyryteter: 1 
test5, 

あなたは間違いなくアルフの答えあたりとして(印刷後coutのバッファをフラッシュしてみてください)です。

私はgdhdfgdfがカウントされない、これが原因で、この行であることに気づく:

for (int i = 0; i < duz_recenice - 1; ++i) 

あなただけの1つの入力ワードを与える場合は、ループの前にduz_recenice = recenica.size();がそうであるように、このループは、実行されません。

for (int i = 0; i < duz_recenice; ++i) 

に次の行を変更するには、この問題を解決します。

+0

それは何らかの理由で今でも私のために働いていて、私は洗い流しをしました。あなたはこれについてループについて何を言いたいのですか?私は単語の数を決定しなければなりません。あなたが書いたfor-loopはその下にあります。 –

+0

コード内の外側のループは、サイズ1のエントリを繰り返し処理するため、ベクトルの最後の単語が欠落します。私の出力には最初の2つの単語のカウントが表示されますが、最後のものはカウントされません。 – badgerr

+0

ああ、私はあなたの要点を見ますが、私はまだこのプログラムが自分の言葉を適切に数えることはできません。たとえば、「私はパンのパンが好きです」という文章では、最後に「私」を2回カウントし、2回目は2回、2回目は1を与えます。これはrecenica.eraseによって解決されるはずです。ライン。 –

関連する問題