Anfängerhilfe bei Schleifen



  • 005 int main() {
    006   int z, i;
    007   char s[81];
    008   int h[255];
    009 
    010 
    011     cout << "Bitte Satz eingeben: ";
    012     cin >> s;
    013 
    014     for(i = 0; i < 255; i++)
    015       h[i] = 0;
    016 
    017     for(i = 0; s[i] != '\0'; i++)
    018       h[s[i]]++;
    019 
    020     for(i = 0; i < 255; i++)
    021       if(h[i] > 0)
    022   
    023   cout << (char)i << "(" << h[i] << ") ";
    024     cout << endl;
    

    Ich habe hier 3 for Schleifen. Bei der 2.Schleife habe ich hier ein Verständnis Problem. Zuerst was bedeutet h[s[i]]++?
    Ist es das selbe wie h[i]++ und s[i]++ ?

    Geht das Programm die Schleife so lange durch bis es fertig ist und dann zur nächsten Schleife?

    Bitte um Hilfe.



  • Es geht so lange durch, bis dein bei s eingegebener Satz zu ende ist 😛 ('\0' ist das Nullterminierungszeichen)

    h[s[i]]++;
    

    das heißt. h an der Stelle Wert von s an Stelle i um 1 erhöhen ...



  • ok, danke

    also versteh ich das programm jetzt richtig:
    zum beispiel hab ich bei s "komm" eingegeben
    ausgabe: k(1) m(3) o(1)

    1. Schleife
    h[0] = 0
    h[1] = 0
    .
    .
    .
    h[255]=0

    2. Schleife

    h an der stelle s[0] ist ein k
    h an der stelle s[1] ist ein o

    macht die das die schleife?



  • for (std::size_t i(0); s[i]; ++i)
        h[s[i]]++;
    
    for(i = 0; i < 255; i++)
        if(h[i] > 0)
            std::cout << static_cast<char>(i) << "(" << h[i] << ") ";
    

    ... so

    geg.: s = { 'k', 'o', 'm', 'm', '\0' };
          h = { 0, 0, 0, ..., 0 };
    
    h[s[0]]++;
    

    'k' ^= 107

    h[107]++; // h[107] == 1
    

    .

    h[s[1]]++;
    

    'o' ^= 111

    h[111]++; // h[111] == 1
    

    .

    h[s[2]]++;
    

    'm' ^= 109

    h[109]++; // h[109] == 1
    
    h[s[3]]++;
    

    'm' ^= 109

    h[109]++; // h[109] == 2
    
    ausg.: "k(1) o(1) m(2) "
    

    ...



  • danke vielmals, noch eine frage:

    aber wie ist z.B o = 109 ??

    das bsp. bringt mich noch um:)



  • Ein char ist ein Ganzzahl-Wert zwischen 0 und 255 (bzw. -128 und 127), der je nach Anforderungen als Zeichen dargestellt werden kann - welchen Wert ein Zeichen hat, kannst du in der ASCII-Tabelle nachlesen.



  • aha das funktioniert mit dieser Tabelle..

    das heißt das programm wandelt quasi das "m" in 109 um, weil das so ist?



  • So ungefähr 😉 Das Programm stellt das Zeichen 'm' intern als 109 dar, weil das so in der ASCII-Tabelle steht.

    Btw, für dich kann es letztlich unerheblich sein, welcher Wert hinter einem bestimmten Zeichen steht - das Programm verwendet konsistent immer die selbe Umrechung. Wichtig ist nur, daß jedes darstellbare Zeichen einen eindeutigen Wert zwischen 0 und 255 hat.

    PS: Zumindest ANSI-Zeichen - UNICODE hat einen etwas größeren Wertebereich.

    PPS: Ein Problem könntest du aber bekommen, wenn du das Programm auf einem System mit vorzeichenbehaftetem 'char' übersetzt - Sonderzeichen (z.B. Umlaute) haben dann plötzlich einen negativen Wert -> SegFault.


Log in to reply