[s] Erklärung zu Source | Thema Array
-
Ich hab hier ein Beispiel, in dem es darum geht, Buchstaben von mehreren Wörtern zu zählen.
Ausgegeben sieht das ganze so aus:Anzahl: 5
1. Wort: mein
2. Wort: name
3. Wort: ist
4. Wort: peter
5. Wort: muellerAuswertung:
a: 1
b: 0
c: 0
d: 0
e: 6
f: 0
g: 0
h: 0
i: 2
j: 0
k: 0
l: 2
m: 3
n: 2
o: 0
p: 1
q: 0
r: 2
s: 1
t: 2
u: 1
v: 0
w: 0
x: 0
y: 0
z: 0Der Code:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { unsigned char buf[80]; int count[26]; int i, k, anz; for(i = 0; i < 26; i++) count[i] = 0; printf("Anzahl: "); scanf("%d", &anz); for(k = 1; k <= anz; k++) { printf("%d. Wort: ", k); scanf("%s", 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]); // ??? system("PAUSE"); return EXIT_SUCCESS; }
Ich hoffe mir jemand kann mir die mit dem "???" versehenen Zeilen erklären.
-
Deine Verständnisschwierigkeiten beziehen sich vermutlich darauf, dass hier "mit Buchstaben gerechnet" wird. Dazu musst du einfach nur wissen, dass der Datentyp char zwar für ein Zeichen steht, eigentlich aber ein numerischer Typ ist. 'a' ist gleichbedeutend mit 97 (Stichwort ASCII-Code), ein 'A' wäre z.B. 65, und ein Leerzeichen (' ') 32. Mit einem char kann man also genauso gut rechnen wie z.B. mit einem int oder short int. Der einzige Unterschied (neben der Länge) ist die andere Interpretation an manchen Stellen.
-
_matze schrieb:
Deine Verständnisschwierigkeiten beziehen sich vermutlich darauf, dass hier "mit Buchstaben gerechnet" wird. Dazu musst du einfach nur wissen, dass der Datentyp char zwar für ein Zeichen steht, eigentlich aber ein numerischer Typ ist. 'a' ist gleichbedeutend mit 97 (Stichwort ASCII-Code), ein 'A' wäre z.B. 65, und ein Leerzeichen (' ') 32. Mit einem char kann man also genauso gut rechnen wie z.B. mit einem int oder short int. Der einzige Unterschied (neben der Länge) ist die andere Interpretation an manchen Stellen.
Sehr schön habs verstanden.
Heftig und doch elegant der Code
-
Anonym schrieb:
elegant der Code
Ansichtssache. Ich finde sowas
'z' - 'a'
überhaupt nicht elegant. Das kann ich mit einer 26 besser lesen. Ich meine, die Anzahl der Buchstaben wird sich so schnell nicht ändern.
system("PAUSE") ist aus bekannten Gründen auch verschriehen (steht irgendwo in der FAQ), das sollte man einfach vermeiden.
Und das Nullen von count in einer Schleife ist totaler Quatsch. Das kannst du auch ganz bequem so machen:
int count[26]={0};
.
.
.
-
Da gehört nicht 26 sondern 25 hin.
Aber du hast das richtige gemeint.Die haben das bestimmt nur so gemacht, damit man den Umgang ein wenig besser kennen lernt.
int count[26]={0}
Wird da nicht nur count[0] mit 0 belegt?
-
Anonym schrieb:
Da gehört nicht 26 sondern 25 hin.
Ja, hast Recht. Üblicherweise macht man in for-Schleifen ja eher einen <-Vergleich, nicht <=. Hab ich nicht gesehen...
Anonym schrieb:
int count[26]={0}
Wird da nicht nur count[0] mit 0 belegt?
Nein, damit nullst du das ganze Array. Probier's einfach aus (oder glaub mir ).
-
_matze schrieb:
Anonym schrieb:
Da gehört nicht 26 sondern 25 hin.
Ja, hast Recht. Üblicherweise macht man in for-Schleifen ja eher einen <-Vergleich, nicht <=. Hab ich nicht gesehen...
Anonym schrieb:
int count[26]={0}
Wird da nicht nur count[0] mit 0 belegt?
Nein, damit nullst du das ganze Array. Probier's einfach aus (oder glaub mir ).
Ok habs mal ausprobiert:
int main(int argc, char *argv[]) { // int count[26] = {0}; int count[26] = {0, 1, 2, 3, 4, 5}; for(int i = 0; i < 26; i++) printf("%d\n", count[i]); system("PAUSE"); return EXIT_SUCCESS; }
Aber wieso werden hier alle nach den 5 genullt?
-
EDIT: war Quatsch...
-
Anonym schrieb:
Aber wieso werden hier alle nach den 5 genullt?
Alle folgenden Werte, die du nicht angibst, werden mit dem Default-Wert belegt (bei "int" ist das 0).
-
Badestrand schrieb:
Anonym schrieb:
Aber wieso werden hier alle nach den 5 genullt?
Alle folgenden Werte, die du nicht angibst, werden mit dem Default-Wert belegt (bei "int" ist das 0).
Alles klar danke!