0

このプログラムに問題があります。このプログラムは、特定の入力に含まれる行、単語、文字、一意の行、および一意の単語の数をユーザーに通知することになっています。今のところ、言葉と文字は大丈夫です。しかし、ユーザーが複数の行を入力したい場合、どうすればよいでしょうか? 関数は、両方の行の結果を一緒に追加するのではなく、一度に1 つの行の結果のみを出力します。また、Unique Lines と Unique Words が正しく機能しません。私はC++を始めたばかりなので、あまり経験がありません。誰か助けてくれませんか?

問題:

  1. プログラムは一度に 1 行ずつ読み取るため、ユーザーが複数回入力すると、プログラムは結果を 1 つのエンティティとして追加するのではなく、個別に生成します。
  2. Unique Lines と Unique Words が機能していません。プログラムで使用されているライブラリを使用して実装する方法についてのアイデア。

    #include <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    #include <string>
    using std::string;
    #include <set>
    using std::set;
    
    
    // write this function to help you out with the computation.
    
    
    unsigned long countLines()
    {
        return 1;
    }
    
    
    
    unsigned long countWords(const string& s)
    {
        int nw =1;
        for (size_t i = 0; i < s.size(); i++)
        {
            if (s[i] == ' ')  //everytime the function encounters a whitespace, count     increases by 1)//
            {
                nw++;
            }
        }
     return nw;
    }
    
    unsigned long countChars(const string& s)
    {
        int nc = 0;
        for (size_t i = 0; i < s.size(); i++)
        {
            if ( s[i] != ' ') //everytime the function encounters a character other than a whitespace, count increases//
            {
                nc++;
            }
        }
    
        return nc;
    }
    
    
    unsigned long countUnLines(const string& s, set<string>& wl)
    {
       wl.insert(s);
       return wl.size();
    }
    
    
    
    unsigned long countUnWords(const string& s, set<string>& wl)
    {
        int m1 = 0;
        int m2 = 0;
        string substring;
    
        for(m2 = 0; m2 <= s.size(); m2++){
            if (m2 != ' ' )
    
            substring = s.substr(m1,m2);
            wl.insert(substring);
    
            m1 = m2 + 2;}
        }
    
        return wl.size();
    
        int unw = 0;
        wl.insert(s);
        unw++;
        return unw;
    }
    
    int main()
    {
        //stores string
        string s;
    
        //stores stats
        unsigned long Lines = 0;
        unsigned long Words = 0;
        unsigned long Chars = 0;
        unsigned long ULines = 0;
        unsigned long UWords = 0;
    
        //delcare sets
        set<string> wl;
    
        while(getline(cin,s))
        {
    
            Lines += countLines();
            Words += countWords(s);
            Chars += countChars(s);
            ULines += countUnLines(s,wl);
            UWords += countUnWords(s);
    
            cout << Lines << endl;
            cout << Words<< endl;
            cout << Chars << endl;
            cout << ULines << endl;
            cout << UWords << endl;
    
    
            Words = 0;
            Chars = 0;
            ULines = 0;
            UWords = 0;
    
        }
    
        return 0;
    }
    
4

4 に答える 4

0

答えを大々的に教えたくはありませんが、始めるためのアイデアをいくつか紹介します。

  1. 関数 getline() は、入力行全体を読み取ることができます。入力がなくなるまでこれを行います。
  2. std::set (またはより良い std::unordered_set) のようなコンテナーを使用して、読み込まれた行を保存できます。最も効率的ではありませんが、すべての行を追跡し、一意の行のみを保存します。
  3. 次に、各行を単語に分解できます。これには std::stringstream のようなものを使用することを検討してください。
  4. 単語を別の std::unordered_set に格納します。
  5. 一意の行 (単語) の数は、単にコンテナーに格納されている行 (単語) の数です。これを取得するには、.size() メソッドを使用します。

行数、単語数、および文字数の合計は、データを読み取るときに計算できるため、ここでは詳しく説明しません。

各項目はググることができ、さまざまな部分を異なる方法で実装することを選択できます (stringstream を使用したくない場合は、たとえば、読み取った行をいつでも反復処理できます)。これにより、正しい軌道に乗ることができます。

于 2013-09-27T17:53:02.030 に答える
0

getline while ループの最後でカウント変数をゼロにリセットしています。これが、1 行の結果しか得られない理由です。現在、カウントをリセットしているだけなので、ユーザーはプログラムに複数の行を入力できます。

于 2013-09-27T17:31:29.300 に答える
0

あなたは正しい方向に向かっていると思います。一意の行と単語を数えるには、すべての行と単語を何らかのデータ構造に格納する必要があります。unordered_map をお勧めします。マップ内の各要素には、各行/単語の出現回数のカウンターがあります。

于 2013-09-27T17:34:04.343 に答える