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 🙂


Anmelden zum Antworten