2 Stimmen

Zählen, wie oft jedes einzelne Wort in der Eingabe vorkommt

Ich arbeite gerade an einer Übung aus Accelerated C++:

Schreibe ein Programm, das zählt, wie oft jedes einzelne Wort in seiner Eingabe vorkommt.

Hier ist mein Code:

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

int main()
{
    // Ask for 
    // and read the input words
    std::cout << "Please input your words: " << std::endl;
    std::vector<std::string> word_input;
    std::string word;
    int count = 0;
    while (std::cin >> word)
    {
        word_input.push_back(word);
        ++count;
    }

    // Compare the input words 
    // and output the times of every word compared only with all the words

    /***** I think this loop is causing the problem ******/
    for (int i = 0; i != count; ++i)
    {
        int time = 0;
        for (int j = 0; j != count; ++j)
        {
            if (word_input[i] == word_input[j])
                ++time;
            else
                break;
        }

        std::cout << "The time of "
                    << word_input[i]
                    << " is: "
                    << time
                    << std::endl;
    }

    return 0;   
}

Wenn Sie dieses Programm kompilieren und ausführen, werden Sie sehen:

Please input your words:

Und ich gebe wie folgt ein:

good good is good
EOF

Dann wird es angezeigt:

The time of good is: 2
The time of good is: 2
The time of is is: 0
The time of good is: 2

Mein erwartetes Ergebnis ist:

The time of good is: 3
The time of is is: 1

Ich möchte keine Karte benutzen, weil ich das noch nicht gelernt habe.

Was ist die Ursache für dieses unerwartete Verhalten, und wie kann ich es beheben?

3voto

Christian Severin Punkte 1671

Unter der Annahme, dass std::vector der einzige Container ist, den Sie zu diesem Zeitpunkt kennen, und dass Sie noch nicht zu std::pair gekommen sind, schlage ich Folgendes vor:

  • Sie fügen eine std::vector<int> word_count
  • in Ihrem std::cin while-Schleife prüfen Sie, ob das aktuelle Wort in word_input . Wenn dies nicht der Fall ist, müssen Sie push_back das Wort und push_back a 1 in word_count . Wenn es bereits einen Eintrag für das aktuelle Wort bei einem bestimmten Index gibt i en word_input erhöhen Sie word_count bei diesem Index i . So erscheint jedes einzelne Wort, das Sie eingeben, nur einmal en word_input und die Anzahl der Eingaben, die in word_count .
  • für die Ausgabe, Schritt durch word_input y word_count parallel und geben die Wortanzahl für jedes Wort aus.

Erledigt.

Aber all dies wird viel einfacher und eleganter mit einer std::map . Lesen Sie weiter! :-)

1voto

Klark Punkte 7862

Streichen Sie einfach die else-Anweisung.

int main()
{
    // Ask for 
    // and read the input words
    std::cout << "Please input your words: "
              << std::endl;
    std::vector<std::string> word_input;
    std::string word;
    int count = 0;
    while (std::cin >> word)
        {
            word_input.push_back(word);
            ++count;
        }

    // Compare the input words 
    // and output the times of every word compared only with all the words
    for (int i = 0; i != count; ++i)
        {
            int time = 0;
            for (int j = 0; j != count; ++j)
                {
                    if (word_input[i] == word_input[j])
                        ++time;
                    // else          <========== You don't need this!
                    //    break;
                }

            std::cout << "The time of "
                 << word_input[i]
                 << " is: "
                 << time
                 << std::endl;
        }

    return 0;   
}

Beachten Sie, dass Ihre Lösung bei größeren Eingaben sehr langsam ist. Die bessere Idee wäre, hashtable(std::map) für Ihr "Wörterbuch" zu verwenden oder diesen Vektor zu sortieren und dann die einzelnen Wörter zu zählen (läuft in O(logN*N), Ihre Lösung ist O(N^2)).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X