newbi frage :(



  • 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!
    


  • ja danke für die hilfe, aber so weit hat ich es ja im prinzip schon, also jedenfalls hab ich das so versucht(4 zahlen absteigend auflisten):

    int zahl[4];
    int max;
    
    zahl[1]=7;
    zahl[2]=9;
    zahl[3]=2;
    zahl[4]=6;
    
    for (int i=1; i<4; i++)
      {
    
          if( max < arr[i] )
       {
          max = arr[i];
          printf("%d", max);
      }
    

    aber da listet er nur die zur zeit höchste zahl aus.. also "7999" steht denn da.. aber wie mach ich dass, das dann halt "9762" da steht?
    ich hab versucht da noch ne for schleife rumzulegen - aba dann hat garnix mehr funktioniert 😕



  • Naja also wenn du richtig gelesen hättest meinen langen Beitrag, dann hättest du gewusst das du

    Einmal eine Schleife brauchst um max zu bestimmen. Da steht EXTRA das da noch nichts ausgegeben wird.

    du kannst es dir einfach machen ( um mal dein bsp zu nehmen )

    int zahl[4];
    int max;
    
    zahl[1]=7;
    zahl[2]=9;
    zahl[3]=2;
    zahl[4]=6;
    
    for (int i=1; i<4; i++)
      {
    
          if( max < zahl[i] )
          max = zahl[i];
          // printf("%d", max);   <--- ich sagte in der schleife nichts ausgeben
      }
    
    // so jetzt ist max = 9, und das ist gut so
    
    int flag = 0
    
    do
    {
        flag = 0;            // für abruchbedingung  ( gut bei grossen arrays )
    
        for( int i = 0; i < 4  && flag == 0; i++)
        {
            if( zahl[i] == max )
            {
                cout << zahl[i] << endl;    
                flag = 1;
            }        
        }
    
        max--;              // der nächst kleinere möglichere wert
    
    }while( max > 0)
    

    Wenn es jetzt eine zahl nicht geben sollte, wie z.b. die 8 in deinem Bsp. macht das nichts.

    Ist jetzt mal auf die schnelle ein Algoritmus der tut. Maybe nicht der intelligenteste, aber bei heutigen PC kein grosser Akt.

    Natürlich würde ich das nicht per Hand programmieren sondern entsprechende klassen benutzen, wo man dann die int's reinspeichert und dann gleich absteigend sorieren kann. die vector klasse müsste das können. Aber das ist ein anderes Kapitel. Kannst ja mal hier im Forum nach "vector" suchen.

    falls der fehlerteufel drinnen sein sollte, bitte bescheid sagen.



  • achso falls du z.b. auch ne 0 hast im array dann muss es heissen

    .....
    while ( max > -1)
    

    wenn du jetzt auch negative zahlen hast, oder sonst was. dann musst die kleinste bestimmen in einer schleife. z.b. kommt dann -344 raus

    dann heisst es dann

    while( max > -345)



  • achso, falls es auch doppelte zahlen geben kann. z.b. 4mal die 9 oder so und du möchtest dann auch nciht einmal sondern 4mal die 9 ausgeben, dann lösche das mit dem flag bitte.



  • jo danke, das hab ich gesucht 🙂

    aba hab jetzt mal versucht die beiden dinger zu verbinden (also das auslesen der anzahl von den eigegebenen zeichen, und das "sortieren" nach der anzahl) :

    also das hier

    int main() 
    { 
      int buch[128] = {0}; 
      char *wort = "hallo"; 
    
      for (int i=0;i<wort;i++) 
        buch[wort[i]]++; 
    
      for (int i=0;i<128;i++) 
        if (buch[i]) printf("%c : %d\n", i, buch[i]); 
    }
    

    mit dem hier:

    int zahl[4];
    int max;
    
    zahl[1]=7;
    zahl[2]=9;
    zahl[3]=2;
    zahl[4]=6;
    
    for (int i=1; i<4; i++)
      {
    
          if( max < zahl[i] )
          max = zahl[i];
      }
    
    do
    {
    
        for( int i = 0; i < 4 ; i++)
        {
            if( zahl[i] == max )
            {
                cout << zahl[i] << endl;    
    
            }        
        }
    
        max--;             
    
    }while( max > 0)
    

    also dass dann da steht (2:l, 1:a, 1:h, 1🤡

    aba ich habs wiedermal (-.-) nich hinbekommen ... ja.. ich weiss - ich muss das selber machen um es zu lernen .. aba ich bekomms halt nich hin - und was kann ich'n sonst machn ausser nach hilfe zu fragen wenn ich es par tout nich hinbekomm... - ich hab mir die vorherigen kapitel noch n parr mal durchgelesen, aba ich hab tortzdem kein durchblick für die aufgabe... könnta das vielleicht "verbinden" und kurz sagen wie ihr das gemacht habt? würde mir ja schon weiterhelfen wenn ich die lösung sehe und es dann nochmal selber versuche... pls 😕

    thx im voraus


Anmelden zum Antworten