newbi frage :(



  • hallöchen,

    ich bin grad am c++ lernen und hab ne aufgabe bekommen (aus nem buch) und ich komm da nich wirklich weiter 😞

    also die aufgabe besagt dass ich ein prog schreiben soll das ein satz/wort einliest und dann ausgibt wieoft der buchstabe a, b, c (usw.) ... vorkommt.
    bis dahin hab ich es ja auch schon geschaft, aber die aufgabe verlangt noch dass das prog die buchstaben nach der reihenfolge sortier, also wenn ich zum beispiel "hallo" eingebe, soll da dann stehn "2 mal 'l', 1 mal 'a','h','o'" .. und da sitzt ich schon seit n parr tagen dran und komm nich weiter 😞
    würd mich freun wenn mir jemand helfen könnte...

    mfg elvis



  • In welcher Weise hast du denn die Anzahl der vorkommenden Buchstaben gespeichert?



  • das is glaube grad das problem... ich hab nen array für jeden einzelnen buchstaben (also: char buchstabe[26]) aba die anzahl hab ich nur mit na variablen belegt die in na schleife vorkommt und sich somit immer verändert... und ich weiss halt nich wie ich die sonst speichern soll ... bin n newb 😞



  • Das ist doch eine gute Idee mit dem Array.
    Nur ist es ziemlich umständlich, nur die Buchtaben aus dem Alphabet zu nehmen.
    Grund: Der Computer kann besser mit der Reihenfolge hier umgehen:
    http://www.asciitable.com/

    Ich würde also vorschlagen, du erstellst dir ein Array aus 128 Integern.
    Also entspricht dann das 66. Feld der Anzahl der großen A´s.

    Dann ermittelst du in einem weiterem Durchlauf, welches die höchste vorkommendene Zahl in diesem Array ist. ->> max.

    Diese max-Variable jeweils verringernd, gehst du dann immer das ganze Feld durch und vergleichst, welcher Buchstabe max-Anzahl vorkommt. Diesen Druckst du dann.

    Das sollte es gewesen sein.



  • also du kannst folgendes machen

    ein struct definieren

    struct buchstabe z.b. mit 2 elementen

    1. char c;
    2. int anzahlt;

    dann hast du ein array. in diesem speicherst du nicht int, char ab sondern eben die ganze structur.

    wie arrays funktionieren weisst du ja inzwischen
    jetzt musst im buch das kapitel(oder abschnitt) lesen mit struct
    ist eigentlich ganz einfach

    dann fängst du an mit deinem satz/wort

    zb. um beim thema "hallo" zu bleiben

    die schleife geht von 0 bis anzahl des wortes/satzes - 1

    am anfang also 0 das ist das h

    jetzt hast du eine 2te schleife in dieser 1sten schleife drinnen die das array nach dem buchstaben durchsucht

    wenn z.b. es kein h findet dann wird am schluss des arrays ( in diesem fall am 0-ten element ) ein neues struct-array element angehängt mit dem wert

    c = h;
    anz = 1;

    das gleiche geschiet beim "a" denn a ist ja nicht enthalten

    beim "l" das gleiche

    jetzt beim 2ten "l" wird ja in der 2ten schleife das l gefunden

    jetzt

    NICHT ein weiteres einfügen ( also sozusagen der else block )
    sondern
    einfach
    anz++; // gemacht

    am schluss wenn die erste schleife durchlaufen ist und das wort/satz eingelesen wurde dann erfolgt die ausgabe

    du hast ja jetzt 5 array elemente stehen

    arr[0] --> c = "h" und anz = 1
    ...
    arr[2] --> c = "l" und anz = 2

    jetzt machst du ne weitere schleife indem alles ausgegeben wird.
    was ich nicht verstanden habe war

    ......
    geschaft, aber die aufgabe verlangt noch dass das prog die buchstaben nach der reihenfolge sortier
    ......

    aber im bstp hast du ja die anz sortiert. hmmm ist ein unterschied

    ich denke mal du musst nach anz "sortieren"

    das kannst du so machen

    eine schleife machen indem du int max; festlegst ( noch nichts ausgeben )

    sprich du schaust in dem array in welchem element das groesste zu finden ist.

    dann macht du eine weitere schleife in dem du jetzt alle ausgibtst

    das machst du so
    max ist ja 2 ( wegen "l" in "hallo" )

    jetzt geht deine schleife also 2 mal durch ( bis zum schluss )

    jetzt gibts du ( beim ersten mal ) alle array char aus die anz = 2 haben.
    beim 2ten male gbits du alle aus die anz = 1 haben.

    fertig !
    _____________________

    es kann z.b. sein du hast einmal

    anz = 5, dann anz = 4, anz = 1. (sprich 3 und 2 mal kommt ein buchstabe nie vor )
    macht ja nichts. bei der ausgabe-schleife ist dann max = 3. findet kein element im array mit anz=3 und gibt auch nichts aus.

    das wars eigentlich

    sag bitte ob es geklappt hat und wie du es gemacht hast



  • Dann ist SeppSchrot's Vorschlag aber IMHO die bessere Art und Weise, das Problem
    zu loesen. Ein Array mit 128-Byte. Dann kann man die Anzahl eines Buchstaben
    ganz einfach zaehlen:

    char array[128] = {0};
    //wort/satz einlesen und in einer schleife durchlaufen
    //wort_oder_satz ist ein std::string, mit dem []-op bekommt man das zeichen an idx
    for(size_t i = 0; i < wort_oder_satz.size(); ++i)
        array[wort_oder_satz[i]]++;
    

    mfg
    v R



  • Wie wäre es mit ner map<char, int>

    Also einfach

    map<char, int> foo;

    char ch = 'e';

    ++foo[ch];

    Und das für jedes Zeichen, vorher könnte man noch mit isAlpha prüfen ob es sich
    auch tatsächlich um Zeichen handelt, soll zwischen Groß- und Kleinschreibung nicht
    unterschieden werden, einfach alle Zeichen vorher mit toLower in kleine Zeichen umwandeln.

    Kleines Beispiel:

    map<char, int> foo;
    
    	for (int i = 0; i < 26; ++i)
    	{
    		char ch = i+65;
    		++foo[ch];
    	}
    
    	map<char, int>::const_iterator it = foo.begin ();
    	map<char, int>::const_iterator it_end = foo.end ();
    
    	for (; it != it_end; ++it)
    		cout << "Zeichen " << it->first << " wurde " << it->second << " mal gefunden." << endl;
    

    /Edit
    Unglaublich wieviele Rechtschreibfehler ich heute in ein Posting bekomme 😞



  • cool vieln dank für die tolln antworten 🙂
    also ich habs alles mal so'n bisschen versucht aba ich habs nich wirklich hinbekomm (schon einige sachen bei von dennen ich noch garnix versteh - ausser die variante von newkid - aber um das umzusetztn bin ich glaube zu blöd :/)

    was ich halt hab ist das hier :

    main()
      {
       char buf[100];
       int count[26];
       int i;
    
       for( i = 0; i < 26; i++)
          count[i] = 0;
       printf( "buf:");
       gets( buf);
    
          for( i = 0;buf[i] != 0; i++)
             count[buf[i]-'a']++;
    
       printf( "\nAuswertung:\n");
       for( i = 0; i <= 'z'-'a'; i++)
          printf( "%c: %d\n", 'a'+i, count[i]);
    
      }
    

    das gibt halt die anzahl der buchstaben aus... hab aber nich wirklich n'plan wie ich das weiter machen soll 😞 😕



  • Hi,

    ja sind ziemlich weit auseinandergehende Vorschläge.
    Das Problem bei deinem Ansatz ist, dass eben nach ASCII nicht die Großbuchstaben direkt hinter den kleinen liegen. Umlaute gibt es ja auch noch.

    Ich mache einfach mal folgenden Gegenvorschlag.
    Ich denke, er ist recht einfach zu verstehen.

    int main()
    { 
      int buch[128] = {0}; //gute Möglichkeit das ganze Array mit 0 zu füllen 
      char *wort = "hallo";
    
      for (int i=0;i<strlen(wort);i++)
        buch[wort[i]]++; //Arrayfeld des entsprechenden Zeichens um 1 erhöhen
    
      for (int i=0;i<128;i++)
        if (buch[i]) printf("%c : %d\n", i, buch[i]);
    }
    

    Nun hast du direkt die Anzahl aller ASCII Zeichen von 0 bis 127 im Array.
    Von hier ist es recht einfach, weiterzumachen.

    Dein nächster Schritt sollte sein, zu ermitteln, wie hoch die am meisten vorkommende Buchstabenzahl ist.

    PS: Man verzeihe mir bitte die C Elemente und denke sich das printf als geeignetes cout 😉



  • danke, so gehts perfekt, nur bin ich noch nich dahinter gestiegen wie ich das mit der sortierung hinbekommen ... hab halt kaum erfahrung mit arrays... könnt ihr mir da weiterhelfen? und vll den quelltext dazu erklären? also das SeppSchrot versteh ich ja alles ... nur die arrays sortieren ... 😕

    thx, elvis



  • es gibt nur ein array..... dieses array beinhaltet mehrere einträge(128)... diese musst du nun in einer for-schleife durchlaufen und ermitteln, welcher array-eintrag die höchste zahl hat....



  • ja, des is schon klar, aba wie ermittel ich des?



  • Ja, eben.

    Sortieren bringt dir hier gar nichts, damit bringst du alles durcheinander.
    Denn für welche Buchtaben die Zahlen in den Feldern stehen, das erkennt man ja an der Position des Feldes.



  • Na du nimmst dir eine neue Variable max mit dem Anfangswert 0.
    Dann läufst du das ganze Array durch und wenn der Wert eines Feldes größer ist als max, dann setzt du max auf diesen Wert.



  • wenns dann keinen größeren wert als max gibt, dann kannste ja den eintrag anzeigen... musst aber die zahl des buch-arrays dann ins char casten... nun musst du nur überlegen, wie du verhinderst, dass nicht 2 mal dasselbe ausgegeben wird(tipp: veränder den wert des arrays dieser stelle)



  • SeppSchrot schrieb:

    Na du nimmst dir eine neue Variable max mit dem Anfangswert 0.
    Dann läufst du das ganze Array durch und wenn der Wert eines Feldes größer ist als max, dann setzt du max auf diesen Wert.

    na soll ich dann "i" überprüfen oder "buch[i]" ... ô.0
    n quelltextbeispiel wäre hilfreich 😕



  • da_ElViS schrieb:

    SeppSchrot schrieb:

    Na du nimmst dir eine neue Variable max mit dem Anfangswert 0.
    Dann läufst du das ganze Array durch und wenn der Wert eines Feldes größer ist als max, dann setzt du max auf diesen Wert.

    na soll ich dann "i" überprüfen oder "buch[i]" ... ô.0
    n quelltextbeispiel wäre hilfreich 😕

    wenn du aber immer nur alles vorgesetzt bekommst, dann hilft dir das nicht wirklich weiter... überleg doch erst mal ne zeit... nicht nur eben mal ne min. wenn man selber drauf kommt, dann ist's einfach besser, auch wenn's länger dauert...



  • Hier ist der Quellcode für deine Lösung:

    #include <iostream>
    #include <iomanip.h>
    #include <string.h>
    #include <ctype.h>

    using namespace std;

    void main()
    {

    char line[81];
    char let[4] = "aA ";
    int flet[26] = {0};
    unsigned len;
    int i;

    cout << "\n"
    "------- BUCHSTABENHŽUFIGKEITEN FESTSTELLEN ------"
    "\n\nGeben Sie Zeichen ein "
    "(max. 80, Ende mit <ENTER>):\n\n";

    cin.getline(line,81);
    len = strlen(line);

    for (i = 0; i < len; i++)
    {
    if(islower(line[i]))
    flet[line[i]-'a']++;
    else if (isupper(line[i]))
    flet[line[i]-'A']++;
    }

    cout << "\n\n";
    for (i = 0; i < 26; i++)
    {
    cout << let;
    let[0]++;
    let[1]++;
    }

    cout << "\n";
    for (i = 0; i < 26; i++)
    cout << setw(2) << flet[i] << " ";
    }



  • also nochmal allgemein
    wegen den max wert

    int max = 0;
    
    for( int i = 0; i < len; i++)    // len = laenge vom array; bsp arr[]
    {
       if( max < arr[i] )
       {
          max++;              // ja ich klammere auch bei einer anweisung ;)
       }    
    
    }
    //am schluss jetzt ist max halt die groesste haeufigkeit
    

    du solltest wirlich lernen wie man pseudocode in c++/c code umsetzen kann.
    denn wie du siehst ist dieses beispiel wirklich trivial



  • upsala die müdigkeit hat mich!!!!!

    ....
    
    // max++; <-------------- falsch!
    max = arr[i];   // <----- richtig!
    

Anmelden zum Antworten