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]=02. Schleife
h an der stelle s[0] ist ein k
h an der stelle s[1] ist ein omacht 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] == 1h[s[3]]++;'m' ^= 109
h[109]++; // h[109] == 2ausg.: "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.