C++ Ausgabe in Konsole mit Zeilenumbruch



  • Texteinlesen durch fstream aus der Datei Analyse.txt!
    Alle anderen Information sind als Komentare im Sourcecode zu finden. Ich hoffe das mir jemand helfen kann! Meine Versuche sind beide gescheitert und ich finde einfach keine Algorithmen mehr!

    Ich habe eine Textdatei die ich in ein dynamisches Feld vom Typ "char" einlesen! Nun ist es meine Aufgabe diese Zeichen in der Konsole auszugeben. Ich soll es jedoch so machen das er Maximal 80 Zeichen ausgibt und das letzten Wort das nicht mehr in die Zeile passt in die nächste nimmt!
    Die Komplette Aufgabenstellung ist folgende:
    Aufgabenstellung:
    Ihnen wir eine Textdatei mit dem Namen "Analyse.txt" zur Verfügung gestellt.
    Die Zeichenzahl dieses Textes ist unbekannt. Sie haben die Aufgabe, diesen Text
    einzulesen, ihn in einem Dynamischen Feld zu speichern und zu analysieren. Dabei
    sind folgende Teilaufgaben zu lösen:
    -Ersetzen Sie die Umlaute durch druckbare Zeichen (z. B. ö=oe, ß=ss usw.)
    -Ermitteln Sie, wieviele unterschiedliche Buchstaben im Text verwendetwerden.
    Dabei werden Gross- und Kleinschreibung gleich behandelt.
    -Ermitteln Sie für jeden Buchstaben die Häufigkeit in diesem Text.
    -Geben Sie eine Liste der Buchstaben mit ihrer Häufigkeit auf dem Bildschirm
    aus.
    -Brechnen Sie für jeden Buchstaben die prozentualen Häufigkeit und geben Sie
    diese ebenfalls auf dem Bildschirm aus.
    Stellen Sie Ihr Ergebnis am Beamer vor.

    Zusatzaufgabe:
    Schreiben Sie eine Funktion, die den Text mit max. 80 Zeichen pro Zeile ausgibt.
    Ein Zeilenumbruch erfolgt dabei immer am Ende eines ganzen Wortes.*/

    Mein Prgramm bischer ist folgendes:

    //Einbindung der benötigten Bibliotheken.
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <iomanip>
    
    //Definieren des Namespace
    using namespace std;
    
    //Deklaration des Datenkanals zum einlesen der Daten
    fstream Datenkanal;
    
    //Variablendeklaration [Global]
    char dummy;
    int counter=0;
    double buchstaben[26],prozent[26];
    
    int main(int argc, char *argv[])
    {
      //Öffnen des Datenkanals zum abzählen der Daten
      Datenkanal.open("Analyse.txt", ios::in);
      //Zählen der Buchstaben
      do
      {
        Datenkanal.get(dummy);//Einlesen eines einzelnen Zeichens
        counter++;//Zähler um eins erhöhen
        //Erhöhun des Zählers für den Fall, dass das Zeichen Sonderzeichen ist
        if(dummy=='ä'||dummy=='ö'||dummy=='ü'||dummy=='ß'||dummy=='Ä'||dummy=='Ö'||dummy=='Ü')
        {counter++;}
      }while(!Datenkanal.eof());
      Datenkanal.close();//Schliesen des Datenkanals
      Datenkanal.clear();//Zurücksetzen alles Parameter und Fehlermeldungen
    
      //Deklaration des dynamschen Feldes zum speichern der Daten
      char *dummys = new char[counter];
    
      //Öffnen des Datenkanal zum einlesen der Daten
      Datenkanal.open("Analyse.txt", ios::in);
      //Einlesen der Daten in das Dynamische Feld
      for(int i=0; i<counter; i++)
      {
        Datenkanal.get(dummys[i]);//Einlesen eines einzelnen Zeichens
        //Änderung der Sonderszeichen in druckbare Buchstaben
        if(dummys[i]=='ä'||dummys[i]=='ö'||dummys[i]=='ü')
        {
          if(dummys[i]=='ä'){dummys[i]='a';dummys[i+1]='e';i++;}
          if(dummys[i]=='ö'){dummys[i]='o';dummys[i+1]='e';i++;}
          if(dummys[i]=='ü'){dummys[i]='u';dummys[i+1]='e';i++;}
        }
        if(dummys[i]=='ß'||dummys[i]=='Ä'||dummys[i]=='Ö'||dummys[i]=='Ü')
        {
          if(dummys[i]=='ß'){dummys[i]='s';dummys[i+1]='s';i++;}
          if(dummys[i]=='Ä'){dummys[i]='A';dummys[i+1]='e';i++;}
          if(dummys[i]=='Ö'){dummys[i]='O';dummys[i+1]='e';i++;}
          if(dummys[i]=='Ü'){dummys[i]='U';dummys[i+1]='e';i++;}
        }
        if(dummys[i]=='„'||dummys[i]=='“'){dummys[i]=(char)34;}
        if(dummys[i]=='§'){dummys[i]=(char)21;}
        if(dummys[i]=='\n'){dummys[i]=' ';}
      }
      Datenkanal.close();//Schliesen des Datenkanals
      Datenkanal.clear();//Zurücksetzen alles Parameter und Fehlermeldungen
    
      //Ausgabe der eingelesen Zeichen
      for(int i=0; i<counter; i++)
      {
        cout << dummys[i];
      }
    
      //Löschen des Inhalts für die Initialisierung
      for(int i=0; i<26; i++)
      {
        buchstaben[i]=0;
        prozent[i]=0;
      }
      //Ermitteln der Anzahl der einzelnen Buchstaben im Text
      for(int i=0; i<counter; i++)
      {
        switch((tolower)(dummys[i]))
        {
          case 'a':  buchstaben[0]++;
                     break;
          case 'b':  buchstaben[1]++;
                     break;
          case 'c':  buchstaben[2]++;
                     break;
          case 'd':  buchstaben[3]++;
                     break;
          case 'e':  buchstaben[4]++;
                     break;
          case 'f':  buchstaben[5]++;
                     break;
          case 'g':  buchstaben[6]++;
                     break;
          case 'h':  buchstaben[7]++;
                     break;
          case 'i':  buchstaben[8]++;
                     break;
          case 'j':  buchstaben[9]++;
                     break;
          case 'k':  buchstaben[10]++;
                     break;
          case 'l':  buchstaben[11]++;
                     break;
          case 'm':  buchstaben[12]++;
                     break;
          case 'n':  buchstaben[13]++;
                     break;
          case 'o':  buchstaben[14]++;
                     break;
          case 'p':  buchstaben[15]++;
                     break;
          case 'q':  buchstaben[16]++;
                     break;
          case 'r':  buchstaben[17]++;
                     break;
          case 's':  buchstaben[18]++;
                     break;
          case 't':  buchstaben[19]++;
                     break;
          case 'u':  buchstaben[20]++;
                     break;
          case 'v':  buchstaben[21]++;
                     break;
          case 'w':  buchstaben[22]++;
                     break;
          case 'x':  buchstaben[23]++;
                     break;
          case 'y':  buchstaben[24]++;
                     break;
          case 'z':  buchstaben[25]++;
                     break;
        }
      }
    
      //Brechnung des Prozentualen Anteils für jeden einzelnen Buchstaben
      for(int i=0; i<26; i++)
      {     
        prozent[i]=buchstaben[i]*100/counter;
      }
    
      //Ausgabe der Anzahl sowie des prozentualen Anteil der einzelnen Buchstaben
      cout << endl << "Anzahl der As: " << setw(5) <<buchstaben[0] << "   Prozentualer Anteil betraegt: " << prozent[0] << "%" << endl;
      cout << "Anzahl der Bs: " << setw(5) <<buchstaben[1] << "   Prozentualer Anteil betraegt: " << prozent[1] << "%" << endl;
      cout << "Anzahl der Cs: " << setw(5) <<buchstaben[2] << "   Prozentualer Anteil betraegt: " << prozent[2] << "%" << endl;
      cout << "Anzahl der Ds: " << setw(5) <<buchstaben[3] << "   Prozentualer Anteil betraegt: " << prozent[3] << "%" << endl;
      cout << "Anzahl der Es: " << setw(5) <<buchstaben[4] << "   Prozentualer Anteil betraegt: " << prozent[4] << "%" << endl;
      cout << "Anzahl der Fs: " << setw(5) <<buchstaben[5] << "   Prozentualer Anteil betraegt: " << prozent[5] << "%" << endl;
      cout << "Anzahl der Gs: " << setw(5) <<buchstaben[6] << "   Prozentualer Anteil betraegt: " << prozent[6] << "%" << endl;
      cout << "Anzahl der Hs: " << setw(5) <<buchstaben[7] << "   Prozentualer Anteil betraegt: " << prozent[7] << "%" << endl;
      cout << "Anzahl der Is: " << setw(5) <<buchstaben[8] << "   Prozentualer Anteil betraegt: " << prozent[8] << "%" << endl;
      cout << "Anzahl der Js: " << setw(5) <<buchstaben[9] << "   Prozentualer Anteil betraegt: " << prozent[9] << "%" << endl;
      cout << "Anzahl der Ks: " << setw(5) <<buchstaben[10] << "   Prozentualer Anteil betraegt: " << prozent[10] << "%" << endl;
      cout << "Anzahl der Ls: " << setw(5) <<buchstaben[11] << "   Prozentualer Anteil betraegt: " << prozent[11] << "%" << endl;
      cout << "Anzahl der Ms: " << setw(5) <<buchstaben[12] << "   Prozentualer Anteil betraegt: " << prozent[12] << "%" << endl;
      cout << "Anzahl der Ns: " << setw(5) <<buchstaben[13] << "   Prozentualer Anteil betraegt: " << prozent[13] << "%" << endl;
      cout << "Anzahl der Os: " << setw(5) <<buchstaben[14] << "   Prozentualer Anteil betraegt: " << prozent[14] << "%" << endl;
      cout << "Anzahl der Ps: " << setw(5) <<buchstaben[15] << "   Prozentualer Anteil betraegt: " << prozent[15] << "%" << endl;
      cout << "Anzahl der Qs: " << setw(5) <<buchstaben[16] << "   Prozentualer Anteil betraegt: " << prozent[16] << "%" << endl;
      cout << "Anzahl der Rs: " << setw(5) <<buchstaben[17] << "   Prozentualer Anteil betraegt: " << prozent[17] << "%" << endl;
      cout << "Anzahl der Ss: " << setw(5) <<buchstaben[18] << "   Prozentualer Anteil betraegt: " << prozent[18] << "%" << endl;
      cout << "Anzahl der Ts: " << setw(5) <<buchstaben[19] << "   Prozentualer Anteil betraegt: " << prozent[19] << "%" << endl;
      cout << "Anzahl der Us: " << setw(5) <<buchstaben[20] << "   Prozentualer Anteil betraegt: " << prozent[20] << "%" << endl;
      cout << "Anzahl der Vs: " << setw(5) <<buchstaben[21] << "   Prozentualer Anteil betraegt: " << prozent[21] << "%" << endl;
      cout << "Anzahl der Ws: " << setw(5) <<buchstaben[22] << "   Prozentualer Anteil betraegt: " << prozent[22] << "%" << endl;
      cout << "Anzahl der Xs: " << setw(5) <<buchstaben[23] << "   Prozentualer Anteil betraegt: " << prozent[23] << "%" << endl;
      cout << "Anzahl der Ys: " << setw(5) <<buchstaben[24] << "   Prozentualer Anteil betraegt: " << prozent[24] << "%" << endl;
      cout << "Anzahl der Zs: " << setw(5) <<buchstaben[25] << "   Prozentualer Anteil betraegt: " << prozent[25] << "%" << endl;
    
      system("PAUSE");
      return EXIT_SUCCESS;
    }
    

    Meine Bischerigen Lösungansätze waren diese hier:

    //Option 1 (funktioniert noch nicht)
    /*
      int i=0;
      int vergleich=80;
      bool flag;
      for(int i=0; i<counter; i++)
      {
        do
        {
          cout << dummys[i];
          i++;
        }while(dummys[i]!=' ');
        flag = true;
        for(int index=i; index<vergleich&&index<counter; index++)
        {
          if(dummys[index]==' ')
          {
            flag = false;
          }
        }
        if(flag==true)
        {
          vergleich=i+80+1;
          i++;
        }
      }
    */
    
    //Option 2 (funktioniert genausowenig)
    /*
      int zaehler=80, index;
      bool ausgabebool;
      for(int i=0; i<counter; i++)
      {
        index=i;
        ausgabebool=true;
        do
        {
          if(dummys[index]==' '){ausgabebool=false;}
          index++;
        }while(index<zaehler&&ausgabebool==true);
        if(ausgabebool==false)
        {
          cout << dummys[i];
        }
        else
        {
          if(dummys[i]==' '){i++;}
          cout << endl << dummys[i];
    
          zaehler=zaehler+i+1;
          if(zaehler>=counter)
          {
            zaehler=counter;
          }
        }
      }
    */
    


  • Die einzelnen Wörter könntest du mittels

    string word;
    vector<string> words;
    
    while(file >> word)
      words.push_back(word);
    

    einlesen und dann in einer Schleife die Wörter ausgeben (und dabei dann die Zeilenlänge zählen) - und wenn die aktuelle Zeilenlänge + Länge des nächsten Wortes > 80 ist, dann einfach "cout >> '\n'" ausführen.

    P.S. Auch Zeichen können in einer Schleife (bzw. als Zahlen) verarbeitet werden:

    char c = tolower(dummys[i]);
    if(c >= 'a' && c <= 'z')
      buchstaben[c-'a']++;
    
    // sowie
    for(char c='A'; c<='Z'; c++)
      cout << "Anzahl der " << c << "s: " << setw(5) <<buchstaben[c-'A'] << "   Prozentualer Anteil betraegt: " << prozent[c-'A'] << "%" << endl;
    

    Und jetzt komm' mir nicht mit EBCDIC 🙂



  • Hi vielen dank für deine Antwort! Vor allem so schnell!
    Ich danke dir auch für deinen Tipp mit der ausgabe der Prozentzahlen aber könntest du mir deinen Lösungsansatz evtl. genauer beschreiben? Ich verstehe nciht ganz was die einzelnen sachen darstellen sollen!



  • Habbokiller schrieb:

    //Ermitteln der Anzahl der einzelnen Buchstaben im Text
      for(int i=0; i<counter; i++)
      {
        switch((tolower)(dummys[i]))
        {
          case 'a':  buchstaben[0]++;
                     break;
          case 'b':  buchstaben[1]++;
                     break;
          case 'c':  buchstaben[2]++;
                     break;
          case 'd':  buchstaben[3]++;
                     break;
          case 'e':  buchstaben[4]++;
                     break;
          case 'f':  buchstaben[5]++;
                     break;
          case 'g':  buchstaben[6]++;
                     break;
          case 'h':  buchstaben[7]++;
                     break;
          case 'i':  buchstaben[8]++;
                     break;
          case 'j':  buchstaben[9]++;
                     break;
          case 'k':  buchstaben[10]++;
                     break;
          case 'l':  buchstaben[11]++;
                     break;
          case 'm':  buchstaben[12]++;
                     break;
          case 'n':  buchstaben[13]++;
                     break;
          case 'o':  buchstaben[14]++;
                     break;
          case 'p':  buchstaben[15]++;
                     break;
          case 'q':  buchstaben[16]++;
                     break;
          case 'r':  buchstaben[17]++;
                     break;
          case 's':  buchstaben[18]++;
                     break;
          case 't':  buchstaben[19]++;
                     break;
          case 'u':  buchstaben[20]++;
                     break;
          case 'v':  buchstaben[21]++;
                     break;
          case 'w':  buchstaben[22]++;
                     break;
          case 'x':  buchstaben[23]++;
                     break;
          case 'y':  buchstaben[24]++;
                     break;
          case 'z':  buchstaben[25]++;
                     break;
        }
      }
      
      //Brechnung des Prozentualen Anteils für jeden einzelnen Buchstaben
      for(int i=0; i<26; i++)
      {     
        prozent[i]=buchstaben[i]*100/counter;
      }
    
      //Ausgabe der Anzahl sowie des prozentualen Anteil der einzelnen Buchstaben
      cout << endl << "Anzahl der As: " << setw(5) <<buchstaben[0] << "   Prozentualer Anteil betraegt: " << prozent[0] << "%" << endl;
      cout << "Anzahl der Bs: " << setw(5) <<buchstaben[1] << "   Prozentualer Anteil betraegt: " << prozent[1] << "%" << endl;
      cout << "Anzahl der Cs: " << setw(5) <<buchstaben[2] << "   Prozentualer Anteil betraegt: " << prozent[2] << "%" << endl;
      cout << "Anzahl der Ds: " << setw(5) <<buchstaben[3] << "   Prozentualer Anteil betraegt: " << prozent[3] << "%" << endl;
      cout << "Anzahl der Es: " << setw(5) <<buchstaben[4] << "   Prozentualer Anteil betraegt: " << prozent[4] << "%" << endl;
      cout << "Anzahl der Fs: " << setw(5) <<buchstaben[5] << "   Prozentualer Anteil betraegt: " << prozent[5] << "%" << endl;
      cout << "Anzahl der Gs: " << setw(5) <<buchstaben[6] << "   Prozentualer Anteil betraegt: " << prozent[6] << "%" << endl;
      cout << "Anzahl der Hs: " << setw(5) <<buchstaben[7] << "   Prozentualer Anteil betraegt: " << prozent[7] << "%" << endl;
      cout << "Anzahl der Is: " << setw(5) <<buchstaben[8] << "   Prozentualer Anteil betraegt: " << prozent[8] << "%" << endl;
      cout << "Anzahl der Js: " << setw(5) <<buchstaben[9] << "   Prozentualer Anteil betraegt: " << prozent[9] << "%" << endl;
      cout << "Anzahl der Ks: " << setw(5) <<buchstaben[10] << "   Prozentualer Anteil betraegt: " << prozent[10] << "%" << endl;
      cout << "Anzahl der Ls: " << setw(5) <<buchstaben[11] << "   Prozentualer Anteil betraegt: " << prozent[11] << "%" << endl;
      cout << "Anzahl der Ms: " << setw(5) <<buchstaben[12] << "   Prozentualer Anteil betraegt: " << prozent[12] << "%" << endl;
      cout << "Anzahl der Ns: " << setw(5) <<buchstaben[13] << "   Prozentualer Anteil betraegt: " << prozent[13] << "%" << endl;
      cout << "Anzahl der Os: " << setw(5) <<buchstaben[14] << "   Prozentualer Anteil betraegt: " << prozent[14] << "%" << endl;
      cout << "Anzahl der Ps: " << setw(5) <<buchstaben[15] << "   Prozentualer Anteil betraegt: " << prozent[15] << "%" << endl;
      cout << "Anzahl der Qs: " << setw(5) <<buchstaben[16] << "   Prozentualer Anteil betraegt: " << prozent[16] << "%" << endl;
      cout << "Anzahl der Rs: " << setw(5) <<buchstaben[17] << "   Prozentualer Anteil betraegt: " << prozent[17] << "%" << endl;
      cout << "Anzahl der Ss: " << setw(5) <<buchstaben[18] << "   Prozentualer Anteil betraegt: " << prozent[18] << "%" << endl;
      cout << "Anzahl der Ts: " << setw(5) <<buchstaben[19] << "   Prozentualer Anteil betraegt: " << prozent[19] << "%" << endl;
      cout << "Anzahl der Us: " << setw(5) <<buchstaben[20] << "   Prozentualer Anteil betraegt: " << prozent[20] << "%" << endl;
      cout << "Anzahl der Vs: " << setw(5) <<buchstaben[21] << "   Prozentualer Anteil betraegt: " << prozent[21] << "%" << endl;
      cout << "Anzahl der Ws: " << setw(5) <<buchstaben[22] << "   Prozentualer Anteil betraegt: " << prozent[22] << "%" << endl;
      cout << "Anzahl der Xs: " << setw(5) <<buchstaben[23] << "   Prozentualer Anteil betraegt: " << prozent[23] << "%" << endl;
      cout << "Anzahl der Ys: " << setw(5) <<buchstaben[24] << "   Prozentualer Anteil betraegt: " << prozent[24] << "%" << endl;
      cout << "Anzahl der Zs: " << setw(5) <<buchstaben[25] << "   Prozentualer Anteil betraegt: " << prozent[25] << "%" << endl;
    

    Bemerkung: Bei normalen Codierungen kannst du davon ausgehen, dass 'a' bis 'z' nacheinander abfolgend sind.
    Es gilt: 'a'-'a'=0, 'b'-'a'=1, 'c'-'a'=2, 'd'-'a'=3, ... 'z'-'a'=25
    Analog dazu für Grossbuchstaben.
    Dein Code reduziert sich also wiefolgt:

    for (int i=0; i<counter; i++)
      buchstaben[tolower(dummys[i])-'a']++;
    cout << endl;
    for (int i=0; i<26; i++) {
      prozent[i]=buchstaben[i]*100/counter;
      cout << "Anzahl der " << ('A'+i) << "s: " << setw(5) <<buchstaben[i] << "   Prozentualer Anteil betraegt: " << prozent[i] << "%" << endl;
    }
    


  • Achso, das hat Th69 schon gesagt. Bei mir ist aber eine (kurze) Erklärung dabei


  • Mod

    Selbst wenn dem nicht so wäre, würde eine map<char, unsigned> das Problem absolut portabel und switch -frei lösen. Und hinterher könnte man allerlei accumulate s oder for_each s drüber jagen (das geht beim Array natürlich auch) um die geforderten Werte auszurechnen.



  • Zum Ansatz:

    int index=0;
      while (index<counter) {
        int letzes_moegliches_zeichen = index + 20;
        int letzes_leerzeichen = letzes_moegliches_zeichen;
        if (letzes_leerzeichen >= counter)
          letzes_moegliches_zeichen = counter;
        else
          while (letzes_leerzeichen > index) {
    	if (dummys[letzes_leerzeichen] == ' ') // letzes leerzeichen gefunden
    	  break;
    	letzes_leerzeichen--; // schau zeichen vorher an
          }
        while (index<letzes_leerzeichen) {
          cout << dummys[index];
          index++;
        }
        index++; // ausgelassenes leerzeichen auslassen
        cout << endl;
      }
    


  • Ich Danke Euch allen vielmals und auch dafür das mir mal endlich jemand gesagt hat das ne For-Schleife auch mit Buchstaben läuft!
    Ich bin jetzt (da Abend) leider nicht mehr in der Lage mich mit der Musterlösung für die Ausgabe zu befassen aber ich werde versuchen sie nach Möglichkeit in einen Algorithmus umzuvormulieren um sie dann selbst zu programieren. Es sollte mir helfen es besser zu verstehen!
    Ich danke allen nocheinmal von ganzem Herzen für Eure Hilfe! Ihr habt mir und meinem Klassenkamerade den Hintern gerettet! Ich werde mein bestes tun um es hier im Forum wieder zurückzugeben!



  • Habbokiller schrieb:

    das ne For-Schleife auch mit Buchstaben läuft...

    ... ,das dir bestimmt auch gleich ganz logisch erscheint, wenn ich dir sage, dass ein char eigentlich ein Integer ist.

    Wenn du z.B. eine Variable auf 65 setzen willst, könntest du auch folgendes machen:

    int var = 'A'; // 'A' entspricht 65 (ASCII-Wert)
    

    Sowas machst du natürlich normal net, außer du hast Lust, den ASCII-Wert eines Zeichens zu ermitteln 😉

    lg dweb



  • Vielen dank Euch allen! Ich habe hierraus viel gelernt! Ich weiß nun das ich ne for-Schleife auch mit Buchstaben machen kann und werde das in Zukunft öfter nutzen können!
    Die Switch-Anweisung konnte ich leider nicht ersetzen da nicht nur Buchstaben sondern auch Sonderzeichen im Text waren. Trotzdem Danke.
    Und ein Mega Dankeschön an switch4ever! Deine Lösung hat mich durch nervenaufreibende Arbeit geschleust! Vielen Vielen Dank euch allen!
    Ich werde versuchen das irgendwann wenn ich mal Plan habe, zurück zu geben.


Anmelden zum Antworten