2017-01-24 5 views
0

Ich versuche, etwas Codierung zu lernen, um meinen Wissensbereich zu erweitern, und ich schien in ein kleines Rätsel zu geraten.Anzahl der Wörter - Ignorieren/Subtrahieren von doppelten Leerzeichen

Ich versuche, ein Programm zu erstellen, um die Anzahl der Zeichen, Ziffern, Interpunktion, Leerzeichen, Wörter und Zeilen auszugeben, die aus einer Datei eingelesen werden. Hier

ist die Textdatei, in der ich das Lesen

See Jack run. Jack can run fast. Jack runs after the cat. The cat's fur is black. See Jack catch the cat. 
    Jack says, "I caught the cat." 
    The cat says, "Meow!" 
    Jack has caught 1 meowing cat. Jack wants 5 cats, but can't find any more. 

Hier ist mein Code

#include <iostream> 
    #include <fstream> 

    using namespace std; 

    int main() 
    { 
    ifstream lab3; 
    string word; 
    lab3.open("lab3.txt"); 
    int countletters=0,countnum=0,countpunc=0,countspace=0,words=0,line=0; 
    char character; 
    if(!lab3) 
    { 
    cout << "Could not open file" << endl; 
    return 1; 
    } 
    while(lab3.get(character) && !lab3.eof()) 
    { 
    if(isalpha(character)) 
    { 
    countletters++; 
    } 
    if (isdigit(character)) 
    { 
    countnum++; 
    } 
    if (ispunct(character)) 
    { 
    countpunc++; 
    } 
    if (isspace(character)) 
    { 
    countspace++; 
    } 
    if (isalpha(character) && (isspace(character++) || ispunct(character++))) 
    { 
    words++; 
    } 
    if(character=='\n') 
    { 
    line++; 
    } 
    } 
    cout << "There are " << countletters << " letters." << endl; 
    cout << "There are " << countnum << " numbers." << endl; 
    cout << "There are " << countpunc << " punctuations." << endl; 
    cout << "There are " << countspace << " spaces." << endl; 
    cout << "There are " << words << " words." << endl; 
    cout << "There are " << line << " sentences." << endl; 
    lab3.close(); 
    return 0; 
    } 

Ausgang:.

There are 167 letters. 
There are 2 numbers. 
There are 18 punctuations. 
There are 52 spaces. 
There are 0 words. 
There are 4 sentences. 

Einige Dinge, die ich gehofft, bin zu lernen:

  1. Eine Erklärung dafür, warum die Wortzahl nicht funktioniert, und Ersetzung durch Arbeitscode unter Berücksichtigung der doppelten Leerzeichen.
  2. Hinweis für Verbesserungen an meinem Code für Lernzwecke/Effizienz.
  3. Erläuterung zum Lesen von Informationen aus einer Textdatei. ob seine Buchstaben, Zahlen, Interpunktion, was auch immer Sie über diese Art der Codierung laufen können.

Einige Dinge, die ich bin mir bewusst:

  1. using namespace std; ist keine gute Praxis - was die beste Praxis für reale Anwendungen ist.
  2. Ich bin ein Anfänger und dies kann nicht definitiv ist nicht die Creme de la Creme Codierung

`Vielen Dank im Voraus für Sie unterstützen und Anregungen :)

+0

Nicht sicher über die anderen Dinge, aber das Hinzufügen des Namespace vor den Wörtern wie: std :: string ist besser, weil andere Namespaces die gleichen Wörter verwenden können./Hinweise zur Verbesserung meines Codes für Lernzwecke/Effizienz./Sollte bei codereview (http://codereview.stackexchange.com/) gefragt werden –

+0

Warum wird 'character' inkrementiert, geschweige denn in der Mitte eines 'if' versteckt? '? – chris

+0

Was ist Ihre Ausgabe, und was erwarten Sie zu erhalten? –

Antwort

0

Weil Ihre Methode das nächste Zeichen des Erhaltens von lab3.get(character) ist, wird das Zeichen in Ihrem Wortanzahl Check Inkrementieren nicht das nächste Zeichen in Gang zu bringen, verändern nur den Wert des Zeichens Sie haben.

Anstatt zu versuchen, nach vorne zu schauen, erwägen Sie, das letzte gelesene Zeichen zu behalten und zu prüfen, um das Ende des Wortes in der folgenden Iteration zu erkennen.

if (ispunct(character)) { countpunc++; if (isaalpha(prevchar)) { words++; }
} if (isspace(character)) { countspace++; if (isaalpha(prevchar)) { words++; }
}

mit prevchar auf Null initialisiert, bevor die Schleife beginnt, und dann gleich auf character innerhalb der Schleife, nachdem alle Ihre Schecks.

Beachten Sie auch, dass bei der Überprüfung Ihrer Zahlen tatsächlich Ziffern erfasst werden, sodass ein Wert von 10 in Ihren Daten als 2 Zahlen in Ihrer Ausgabe und nicht als eine Zahl zählt.

+0

Vielen Dank, dass der Code die Ergebnisse behoben hat. Ich werde die Nummer überprüfen, um mehr als eine einstellige Zahl zu berücksichtigen. Sehr geschätzt. – XmalevolentX

+0

Möglicherweise können Sie alle diese Probleme lösen, indem Sie die Variablen "in_word", "in_numb", "in_punct", "in_space" erstellen. Beginnen Sie mit allen ihren Werten FALSE. Wenn das erste gefundene Zeichen ein Alpha ist, ändern Sie in_word auf TRUE.Überprüfen Sie, bis das nächste Zeichen kein Alpha mehr ist, und ändern Sie dann in_word auf FALSE, erhöhen Sie die Anzahl der Wörter und schalten Sie die entsprechende andere Variable ein, je nachdem, welches Zeichen Sie gefunden haben. Erhöhen Sie nur die Anzahl der Wörter, Anzahl usw., wenn diese Variablen den Status ändern. –

0

Ich kann noch nicht kommentieren, so bin ich Ich schreibe eine Antwort, aber ich weiß, dass es keine richtige Antwort ist, weil ich dich auf einen anderen Thread verweise.

die Matches für Leerraum Zählen, wie sie hier tun Sie Zählung ein Wort würde ...

Count number of matches

Sie könnten in der Lage sein, diese Lösung zu modifizieren, andere Elemente als auch zu zählen.

Ohne Regex ... Da Sie die Zeichen durchlaufen, können Sie ein Flag einrichten, das die Leerzeichen verfolgt, und die Wortanzahl erhöhen, wenn es ein anderes Nicht-Leerzeichen erreicht.

Ich glaube, dies in Ihrem Code zu ersetzen, Ihre Wordcount und Ihre Spacecount-Teile sollten funktionieren. Sie müssen ein int an der Spitze namens spaceflag hinzufügen. Möglicherweise müssen Sie der Wortzahl eine hinzufügen, um eine genaue Summe zu erhalten.

if (isspace(character)) 
 
    { 
 
    countspace++; 
 
    spaceflag = 1; 
 
    } 
 
    else //else says it's not a space. 
 
    { 
 
    if(spaceflag == 1) //if the spaceflag has been set and we run into a different type of character then we've made it to a new word. 
 
    words++; 
 
    spaceflag = 0; //reset the spaceflag until next one is found. 
 
    } 
 
    if(character=='\n')

+0

Ich bin nicht vertraut mit "Regex "Im Moment würde ich es vorziehen, mich an die grundlegende Programmierung zu halten, bevor ich mit dem Programm anfange integrierte Funktionen eingebaut. – XmalevolentX

Verwandte Themen