Buchstaben zählen
-
Hallo,
ich will ein Programm schreiben, dass aus einer Datei einen Text einliest und dann die Anzahl der Buchstaben von A bis F zählt. Folgendes habe ich versucht:#include<stdio.h> #include<stdlib.h> int main() { FILE *datei; int a,b,c,d,e,f; char zeichen; datei=fopen("D:\\text.txt.","r"); if(datei==NULL) printf("Datei konnte nicht geoeffnet werden!\n"); else {while((zeichen=fgetc(datei))!=EOF) {switch(zeichen) { case 'a':a++;break; case 'b':b++;break; case 'c':c++;break; case 'd':c++;break; case 'e':e++;break; case 'f':f++;break; }} printf("A\t%d\n",a); printf("B\t%d\n",b); printf("C\t%d\n",c); printf("D\t%d\n",d); printf("E\t%d\n",e); printf("F\t%d\n",f); } system("Pause"); return 0; }
Und das ist das Ergebnis:
A 2687087
B 58
C 485
D 4534408
E 1244
F 505
Das kann aber nicht stimmen.
Kann mir jemand helfen?
-
D hast den Variablen keinen Anfangswert gegeben. (außerdem zählst du nur die Kleinbuchstaben)
-
CStoll schrieb:
D hast den Variablen keinen Anfangswert gegeben. (außerdem zählst du nur die Kleinbuchstaben)
Mein Compiler mault da wenn ich die "warnings" anhabe
(Watcom C, warning-level, option "-w4"). Schalte das an
und er wird Dir das sagen (compilerabhängig).
-
Danke erstmal! Das funktioniert erstmal. Wie kann ich jetzt die Großbuchstaben noch dazu machen?
case 'a'||'A':a++;break
so wird nichts
-
ein case kann immer nur einen Wert aufnehmen, aber du kannst mehrere case-Marken hintereinander setzen:
case 'a': case 'A': ++a; break;
-
... case 'a': case 'A': machwas(); break; ...
-
Danke habs hinbekommen.
Aber jetzt hab ich das nächste Problem will jetzt noch errechnen wie viel Prozent die Buchstaben ausmachen. Code:#include<stdio.h> #include<stdlib.h> int main() { FILE *datei; int a=0,b=0,c=0,d=0,e=0,f=0,gesz; double A,B,C,D,E,F; char zeichen; datei=fopen("D:\\text.txt.","r"); if(datei==NULL) printf("Datei konnte nicht geoeffnet werden!\n"); else {while((zeichen=fgetc(datei))!=EOF) {switch(zeichen) { case 'a':case'A':a++;break; case 'b':case'B':b++;break; case 'c':case'C':c++;break; case 'd':case'D':c++;break; case 'e':case'E':e++;break; case 'f':case'F':f++;break; }} gesz=a+b+c+d+e+f; A=a/gesz; B=b/gesz; C=c/gesz; D=d/gesz; E=e/gesz; F=f/gesz; printf("A\t%d\t%f",a,A); printf("B\t%d\t%f",b,B); printf("C\t%d\t%f",c,C); printf("D\t%d\t%f",d,D); printf("E\t%d\t%f",e,E); printf("F\t%d\t%f",f,F); } system("Pause"); return 0; }
Bekomme dann aber immer nur 0.
-
Das ist ein typisches Problem der Ganzzahl-Arithmetik - wenn du zwei int-Werte dividierst, werden die Nachkommastellen abgeschnitten. Die Lösung dafür besteht darin, einen der Operanden in double umzuwandeln:
A = a/(double)gest;
-
Danke Danke Danke!
Problem gelöst