Buchstaben zählen



  • Hallo,

    hab hier schonmal was vorgebastelt.
    Das Programm soll jetzt Buchstaben zählen und Leerzeichen und somit
    die Anzahl der Buchstaben und Wörter ausgeben.
    Allerdings fällt mir nichts dazu ein, wie ich jeweilige Chars(vermutlich dann in
    Asci code ) zähle um dann die Anzahl herauszufinden. Ich muss die Funktion
    komplett selber schreiben und darf keine vorgefertigte aus der Bibliothek benutzen.
    " überlege dir, in welcher Datenstruktur man die Häufigkeit der einzelnen Buchstaben am Besten speichern kann "
    soll ich vielleicht einen char string[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
    und ein int array[25]; in einer forschleife durchlaufen lassen, den Pointer-Inhalt jeweils ( muss pointerbenutzen ) mit dem string vergleichen und wenn
    == das Integer feld um 1 erhöhen? und dann eine Ausgabe mit forschleife
    und sowas in der art ( und wie Bau ich dann Leerzeichen ein?)
    printf("Vorkommen der Buchstaben\n");
    printf("%c: %d\n", string[i], array[i]);

    Ist das so überhaupt möglich? dass muss doch irgendwie einfacher auch gehen?

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    # define N 100
    
    char Umwandeln (char c){
    
    if(c>='a' && c<= 'z'){
      c = c - 32;
    }
    return c;
    
    }
    
    int main (){
    
    char array[N];
    printf("Ihre Eingabe:\n");
    fgets(array,N,stdin);
    int length = strlen(array);
    int i = 0;
    char *p;
    for(i=0;i<=length;i++){
        array[i] = Umwandeln(array[i]);
    }
    i =0;
    p = &array[0];
    while(i <= length){
    
    p++;
    i++;
    
    }
    
    system("Pause");
    return 0;
    }
    


  • achja, int array musss wahrscheinlich [26] sein wegen \0



  • char *testStr = "hello world";
    int count[0xFF+1] = {};
    while(*testStr)
      count[(unsigned char)*testStr++]++;
    

    in count[(unsigned char)' '] steht dann die anzahl der leerstellen aus der bekommst du die anzahl der wörter ist zwar nicht perfect aber schnell 😉



  • NuFail schrieb:

    soll ich vielleicht einen char string[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
    und ein int array[25]; in einer forschleife durchlaufen lassen, den Pointer-Inhalt jeweils ( muss pointerbenutzen ) mit dem string vergleichen und wenn
    == das Integer feld um 1 erhöhen?

    Das hört sich doch schon ganz gut an, die Details sind nur noch nicht so ganz klar. Erstmal gibt es 26 Buchstaben im Alphabet, macht array[26]. Wenn du Leerzeichen mitzählst 27. Unterscheidest du Groß- und Kleinbuchstaben? Dann kämen nochmal 26 drauf. Fragezeichen, Punkt, Komma, Bindestrich ... ?

    Du kannst auch einfach direkt den ASCII-Code nehmen und dir ein int array[256] machen für alle möglichen ASCII-Werte.

    unsigned int zeichen[256];
    for (int i = 0; i < sizeof zeichen / sizeof *zeichen; i++)
        zeichen[i] = 0; //array ausnullen
    ...
    for (int i = 0; i < length; i++)
        zeichen[array[i]]++; //Zeichen zählen
    
    for (int i = 0; i < sizeof zeichen / sizeof *zeichen; i++)
        if (zeichen[i]) //ergebnis ausgeben
            printf("Es wurde %d mal das Zeichen %c eingegeben\n", zeichen[i], i);
    

    Ach ja, und üblicherweise sind nur Strings '\0'-terminiert, keine int arrays.



  • unsigned int zeichen[256];
    for (int i = 0; i < sizeof zeichen / sizeof *zeichen; i++)
        zeichen[i] = 0;
    

    geht auch so

    unsigned int zeichen[256] = {};
    

    ist das verhalten evtl. compiler abhängig? habs bis jetzt immer nur mit gcc getestet 😕



  • So hab ich das bisher gemacht,
    ich weiß ist unübersichtlich und verstößt gegen jegliche Conv. aber mir heute erstmal wayne^^.
    Meine Frage:

    int array[26] zählt die Stellen mit an der sich ein Buchstabe befindet und
    erhöht diese um 1;
    nun soll ich aber in der Ausgabe Prozentwerte angeben: also z.B.:
    Buchstabe

    A: 3.4%
    B: 2.6%
    ...

    kann ich jetzt der Funktion Prozentbuchstaben den int array geben und
    einen float array zurückgeben? Und wo oder als was wird der dann gespeichert?
    Warum bugt das Programm wenn ich array[26] einfach auf float setze.

    lg

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    # define N 100
    
    float Prozentbuchstaben (int c[], int laenge){
    
    float zaehler = 0;
    int i = 0;
        for(i = 0; i <= laenge; i++){
        if(c[i]!= 0)
        zaehler = zaehler +1;
    
        }
    i = 0;
    
    }
    
    char Umwandeln (char c){
    
    if(c>='a' && c<= 'z'){
      c = c - 32;
    }
    return c;
    
    }
    
    int main (){
    
    char array[N];
    char string[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int  zahlen[26];
    
    printf("Ihre Eingabe:\n");
    fgets(array,N,stdin);
    
    int length = strlen(array);
    
    int i = 0;
    
    char *p;
    
    int x = sizeof(zahlen) / sizeof(int);
    
        for(i = 0; i<x;i++)
        { zahlen[i]= 0; 
        }
    
    i = 0;
    
        for(i=0;i<=length;i++){
        array[i] = Umwandeln(array[i]);
        }
    
    i =0;
    int j = 0;
    int Leerzeichen = 0;
    p = &array[0];
                   while(i <= length && array[i]!='\0'){
                           for(j=0;j<26;j++){
                                    if(*p==string[j])
                                       zahlen[j]=zahlen[j]+1; 
                                    else if(*p == 32);
                                    Leerzeichen = Leerzeichen + 1;
    
                            }
    p++;
    i++;
    
    }
    
    system("cls");
    
    Prozentbuchstaben(zahlen, x);
    
    printf("      Buchstabenanzahl       \n\n\n");
    i = 0;
                  for(i=0;i<x;i++){
                  if(zahlen[i]!= 0)
                  printf("%c: %d\n", string[i], zahlen[i]);
                  }
    
                  printf("\n Leerzeichenanzahl: %d", Leerzeichen);  
    
    system("Pause");
    return 0;
    }
    


  • NuFail schrieb:

    Warum bugt das Programm wenn ich array[26] einfach auf float setze.

    Wahrscheinlich weil du es an Prozentbuchstaben übergibst und vergessen hast den Typ in Prozentbuchstaben auch auf float umzustellen.

    Du könntest sowas als Prozent machen:

    printf("%c: %f%%\n", string[i], zahlen[i]*100./x);
    

    Der Punkt ist wichtig, 100. ist ein float, 100 ist ein int. Wenn ints und floats durcheinander gerechnet werden werden die ints zu floats konvertiert.

    NuFail schrieb:

    kann ich jetzt der Funktion Prozentbuchstaben den int array geben und
    einen float array zurückgeben?

    Kannst du machen.

    float *Prozentbuchstaben(int array[], int laenge){
        float *floatarray = malloc(laenge * sizeof *floatarray);
        //floatarray füllen
        return floatarray;
    }
    


  • Prozentbuchstaben braucht mindestens die string länge sonst rechnest dir da nen ast

    "helloworld"
    bsp für das l.
    (100 / 10) * 3 = 30
    bsp für das o.
    (100 / 10) * 2 = 20
    ....
    (100 / stringLänge) * zeichen

    und ich würde da aus dem code mal alles rausnehmen was da nicht rein gehört, dann ist er höchstens noch halb so lang 😉

    als bsp.

    float Prozentbuchstaben (int c[], int laenge){
    
    float zaehler = 0;
    int i = 0;
        for(i = 0; i <= laenge; i++){
        if(c[i]!= 0)
        zaehler = zaehler +1;
    
        }
    i = 0;
    
    }
    
    float prozentBuchstabe(int buchstabeAnzahl, int stringGesamtLaenge){
      return (100/stringGesamtLaenge)*buchstabeAnzahl;
    }
    void Prozentbuchstaben(int c[], int arrayLaenge, int stringGesamtLaenge){
      int i=0;
      for(;i<arrayLaenge;i++){
        printf("%f\n",prozentBuchstabe(c[i],stringGesamtLaenge));
      }
    }
    

    das i=0 ist doppelt also

    for(i=0;i<=length;i++){
      array[i] = Umwandeln(array[i]);
    }
    
    statt
    
    i = 0;
    for(i=0;i<=length;i++){
      array[i] = Umwandeln(array[i]);
    }
    
    p = &array[0];
    

    scheint so als brauchst alles besonders schwer 😉 und machst dir dadurch auch noch fehler rein wenn du ein leerzeichen findest solltest du schauen ob das nächste auch eins ist und es dann nicht mit zählen, dann stellt sich aber die frage zählt ein tabulator auch als trenner? und was ist mit komma punkt usw?
    ui das wird ne schöne if else konstruktion



  • noobLolo schrieb:

    ui das wird ne schöne if else konstruktion

    switch case FTW



  • @nwp2 kannst mir evtl. mal ein kleines beispiel geben? muß ja nur für 2 oder 3 zeichen sein?



  • int nummeriere(char zeichen){
        switch (zeichen){
            case '.': return 53;
            case '?': return 54;
            default:
                if (zeichen >= 'a' && zeichen <= 'z') return zeichen - 'a';
                if (zeichen >= 'A' && zeichen <= 'Z') return zeichen - 'A' + 26;
                printf("unbekanntes Zeichen %c\n", zeichen);
                return -1;
            case ' ': {
                int i; //variablendeklarationen sind in einem switch nur in Blöcken erlaubt
                if ((i = getNumberOfWords())>4){
                    printf("%d wörter gefunden, %d zuviele!\n", i, i-4);
                    return -1;
                }
            }
            case '(': //diese Fall fällt nach Fall ')' durch
            case ')':
                klammern++;
                return zeichen - '(' + 55;
            case 'ä':
            case 'ö':
            case 'ü':
            case 'Ä':
            case 'Ö':
            case 'Ü':
        }
        printf("Zeichen %c ist ein Umlaut\n", zeichen);
        return -1;
    }
    

    Mit switch case kann man das bösartigste mir bekannte C-Konstrukt überhaupt bauen, das Duff's Device (wie Homers Bier, genauso krank): http://en.wikipedia.org/wiki/Duffs_device.



  • und dann regst dich wieder über das *goto* auf...

    int main(void) {
    	char *test = "sdaf   asdf . , . \t\n\n sdfsjk";
    	int words=0;
    
    LABEL_NEXT:
    	switch(*test){
    		case '\t':
    		case '\n':
    		case '.':
    		case ',':
    		case ' ':
    	LABEL_NEXT_INNER:
    				test++;
    				switch(*test){
    					case '\t':
    					case '\n':
    					case '.':
    					case ',':
    					case ' ':
    					    goto LABEL_NEXT_INNER;
    					case '\0':
    						goto LABEL_END;
    					default:
    						words++;
    						goto LABEL_NEXT;
    				}
    			goto LABEL_NEXT;
    		case '\0':
    			goto LABEL_END;
    		default:
    			test++;
    			goto LABEL_NEXT;
    	}
    LABEL_END:
    	printf("%d",words+1);
    	return 0;
    }
    

    😃


Anmelden zum Antworten