Zählung von Vokalen in Texten.



  • moin,

    ich habe folgendes programm bekommen.

    es gibt die häufigkeit aller zweiervokale aus(ohne beachtung von groß und kleinschreibung).

    ich verstehe eigentlich auch alles bist auf das merke=-1 in der schleife im mittelteil.

    /**********************  Aufgabe TEXT1  ************************/
    /****************** Anzahl der DoppelVokale ********************/
    /**************Christina Alberts & Sven Hoffmann****************/
    
    // Datei für Anpassung der Umlaute(Vorschlag Bartning)
    #include "bstream.cpp"
    
    //Deklaration der Funktionen
    void ZaehleVokale(int anzahlVokale[8][8]);
    void Ausgabe(int anzahlVokale[8][8]);
    
    // Hauptprogramm
    int main()
    {
      int anzahlVokale[8][8], i, k;
    
      // Initialisierung der Variablen
      for (i = 0; i < 8; i++) 
    	  for (k = 0; k < 8; k++) anzahlVokale[i][k]=0;
    
      // die Funktion liest den Text ein und ruft dann die Funktion "Ausgabe" auf
      ZaehleVokale(anzahlVokale);
    
      return(0);
    }
    
    void ZaehleVokale(int anzahlVokale[8][8]) {
    
      char c;
      int merke;
      merke = -1; 
    
      // solange bis Eingabe von "$"
      while (c != '$') {
    
    	  // beliebig langer Text	
    	  while (bcin.get(c)) {
    
            // wenn Return oder "$" beende diese Schleife
    		if (c == '$' || c == '\n') break;
    
    		// war das letzte Zeichen ein Vokal
    		if (merke != -1) {
    			if (c == 'A' || c == 'a')  anzahlVokale[merke][0]++;                
    			else if (c == 'E' || c == 'e')  anzahlVokale[merke][1]++;                
    			else if (c == 'I' || c == 'i')  anzahlVokale[merke][2]++;                
    			else if (c == 'O' || c == 'o')  anzahlVokale[merke][3]++;                
    			else if (c == 'U' || c == 'u')  anzahlVokale[merke][4]++;
    			else if (c == 'Ä' || c == 'ä')  anzahlVokale[merke][5]++;                
    			else if (c == 'Ö' || c == 'ö')  anzahlVokale[merke][6]++;                
    			else if (c == 'Ü' || c == 'ü')  anzahlVokale[merke][7]++;
    		}
    
    		// ist das aktuelle Zeichen ein Vokal?
    		if		(c == 'A' || c == 'a')  merke=0;                
    		else if (c == 'E' || c == 'e')  merke=1;                
    		else if (c == 'I' || c == 'i')  merke=2;                
    		else if (c == 'O' || c == 'o')  merke=3;                
    		else if (c == 'U' || c == 'u')  merke=4;
    		else if (c == 'Ä' || c == 'ä')  merke=5;                
    		else if (c == 'Ö' || c == 'ö')  merke=6;                
    		else if (c == 'Ü' || c == 'ü')  merke=7;
    		else merke=-1;
    
    	  }
    
    	  // Nach jedem Return die Anzahl anzeigen
    	  Ausgabe(anzahlVokale);
    	  merke=-1;
    
      } 		
    
    }
    
    void Ausgabe(int anzahlVokale[8][8]) {
      // die möglichen Umlaute im Text	
      char vokal[] = {'a','e','i','o','u','ä','ö','ü'};
      int i, k;	
    
      // Ausgabe der kumulierten Doppelvokale	
      for (i = 0; i < 7; i++) 
    	  for (k = 0; k < 7; k++) 
    		if (anzahlVokale[i][k]>0)	
    		  bcout << anzahlVokale[i][k] << "x " << vokal[i] << vokal[k] <<"\n";
    
    }
    

    kann mir da wer helfen?

    danke schon mal im voraus

    gruss

    elwood



  • Was mir als allererstes ins Auge fällt:

    #include "bstream.cpp"
    

    Tippfehler oder ernst gemeint?



  • Hallo Elwood,
    es sieht zwar nicht ganz schick aus aber scheint sicher den Zweck zu erfüllen. Es gibt 9 Fälle die eintretten könne. 0 - 7 es handelt sich um ein Vokal und -1 es ist kein Vokal. Die Variable merke sichert also mit -1 den Zustand das der letzte Buchstabe kein Vokal war, in diesem Fall würde folgender Teil im Code übersprungen

    // war das letzte Zeichen ein Vokal
            if (merke != -1) {
                if (c == 'A' || c == 'a')  anzahlVokale[merke][0]++;                
                else if (c == 'E' || c == 'e')  anzahlVokale[merke][1]++;                
                else if (c == 'I' || c == 'i')  anzahlVokale[merke][2]++;                
                else if (c == 'O' || c == 'o')  anzahlVokale[merke][3]++;                
                else if (c == 'U' || c == 'u')  anzahlVokale[merke][4]++;
                else if (c == 'Ä' || c == 'ä')  anzahlVokale[merke][5]++;                
                else if (c == 'Ö' || c == 'ö')  anzahlVokale[merke][6]++;                
                else if (c == 'Ü' || c == 'ü')  anzahlVokale[merke][7]++;
            }
    

    Dieser ist für das Zählen verantortlich. Sollte merke aber 0 - 7 halten, dann wird der dazu gehörige Zählerwert erhöt. Was etwas komisch organisiert ist, dass das Erkennen um was es sich handelt (Vokal oder nicht) nach dem Zählerpart realisiert wurde?!

    Sprich, es wird ein Zeichen eingelesen -> dann wird erst geguckt, ob die letzte Eingabe ein Vokal war -> dann erst wird aktuelles Zeichen ausgewertet udn erst im nächsten Schleifendurchlauf wird dieses betrachtet. Dies ist ziemlich schlecht organisiert.

    Tipp:
    - arbeite mit switch-case Anweisungen
    - spar dir Indentifikationsflag

    Also:

    // Lese Zeichen ein und speichere es in c
    
    switch( c ) {
    
        case 'a':
        case 'A': //zähle a hoch
        ...
        case 'ä':
        case 'Ä': //...
    
        default: //ansonsten mache nichts
    }
    

    Hoffe das hilft dir etwas.

    Lg Tobi



  • ernst gemeint.

    header-datei, die auch deutsche umlaute wie ä,ö etc. erfassen kann



  • vielen dank für die schnelle hilfe tobi, hast mir echt geholfen.
    mache mich gleich ans werk;-)

    probiers gleich mal mit nem switch aus



  • also wenn es eine header-datei ist, sollte die nicht ".cpp" heißen 😉 Das ist aus meiner Sicht mehr als unüblich 😉



  • It0101 schrieb:

    Das ist aus meiner Sicht mehr als unüblich 😉

    Es ist so gar falsch, weil jede Entwicklungsumgebung *.cpp automatisch parst und dann dazulinkt - sollte also auf jeden Fall eine Verletzung der ODR zur Folge haben


Log in to reply