Wie zählt man einzelne Buchstaben in einen String?



  • Hi zusammen,

    Ich will ein Übungsprogramm zu Strings schreiben.
    Diese Programm soll können:
    Wenn ich jetzt in einen String eingebe: Ich besitze einen PC.
    Dann soll das Programm alle vorhandenen Buchstaben zaehlen z.B. i=2, s=1 etc.

    Meine Frage ist wie ich nun das Unterprogramm bzw. die "Funktion" schreiben.
    Vielleicht mit einer if-Anweisung?


    {
    x++;
    }
    Und das ganze jetzt mit 23 anderen Buchstaben?

    Bitte gebt mir ein paar Tipps.

    Danke.

    MfG C_Boy



  • Also spontan fallen mir drei Möglichkeiten ein:
    a) Du weißt im voraus, dass deine Zeichen in einem zusammenhängenden Alphabet liegen. Also bspw., dass ausschließlich a-z vorkommen. Dann kannst du dir ein Array von 26 Elementen erstellen, dass dann array[gelesenes_zeichen - 'a']++; für die Länge des Eingabestrings ist. Das funktioniert aber nur, weil du die gelesenen Zeichen so einfach auf den Bereich 0-Länge des Alphabets abbilden kannst.
    b) Du kannst eine dyn. Liste anlegen, bei der für jedes Zeichen eben dieses in der Liste gesucht wird. Wird es gefunden, erhöht man den zug. Zähler um 1. Ansonsten legt man ein neues Element mit diesem Zeichen und dem Zählwert 1 an. Besser wäre da allerdings
    c) Du legst dir einen bin. Baum an, der geordnet bzgl. deines Alphabets ist. In b) brauchst du pro Durchlauf so viele Schritte, wie deine Liste lang ist. Das ist nicht gut. Mit einem geord. Binärbaum brauchst du im Schnitt nur O(log_2 n) Schritte, was um ein Vielfaches besser ist.

    Vermutlich sind für dich aber a) und b) am besten umsetzbar. Im Falle von b) brauchst du natürlich eine zusätzliche Struktur

    struct Pair {
      char zeichen;
      int counter;
    };
    

    , aus welches deine Liste besteht.



  • Schau die mal ctype.h http://www.cplusplus.com/reference/clibrary/cctype/ an.
    Da gibt es Funktionen, die prüfen ob ein Zeichen ein Groß- oder Kleinbuchstabe ist und zum umwandeln von Groß<->Kleinbuchstaben.



  • Danke, ich hab jetzt von einem Freund das Programm bekommen. Ich verstehe es nicht ganz und es funktioniert auch nicht so wie es soll.

    Aufgeabenstellung(Sorry hab ich vergessen:D):
    Schreiben Sie eine Funktion zu Berechung der Buchstabenhaeufigkeit
    in einem String.
    Definieren Sie ein Int-Array mit 26 Feldern fuer jeden Buchstaben ein Feld.
    In diese Felder Speichern Sie die Anzahl der Buchstaben die im String vorgekommen sind.

    Hier das Programm

    #include <stdio.h>
    
    #define MAXLEN 26
    
    void haeufigkeit (char a[], int anzahl[]);
    
    void haeufigkeit (char a[], int anzahl[])
    {
    	int i=0;
    	int x=65;
    	int n=0;
    
    	while(a[i] != '\0')
    	{
    		for(n=0; n<=MAXLEN; n++)
    		{
    			if(a[n] == x)
    			{
    				anzahl[i]++;
    			}
    		}
    		i++;
    		x++;
    	}
    }
    
    int main (void)
    {
    	char a[MAXLEN];
    	int anzahl[100];
    	int i=0;
    	int b=65;
    
    	while (i != MAXLEN)
    	{
    		anzahl[i]=0;
    		i++;
    	}
    
    	i=0;
    
    	printf("Eingabe: ");
    	gets(a);
    	haeufigkeit(a,anzahl);
    
     	while(i != MAXLEN)
    	{
    		printf("%c:     %i\n",b,anzahl[i]);
    		i++;
    		b++;
    	}
    }
    


  • gibst mehr als 26 Zeichen und kabooom! nie gets verwenden.

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int main(void)
    {
        char buchstaben[26] = {0};
    
        const char *str = "das ist ein langer Strig mit Sonderzeichen %$%$§%";
    
        int i, len = strlen(str);
        for(i = 0; i < len; ++i)
            if(isalpha(str[i]))
                buchstaben[tolower(str[i]) - 'a']++;
    
        for(i = 0; i < 26; ++i)
          printf("%c kommt %d Mal vor\n", i+'a', buchstaben[i]);
    
        return 0;
    }
    


  • #include <stdio.h>
    #include <ctype.h>
    #define MAXLEN 26
    
    void haeufigkeit (char a[], int anzahl[]);
    
    void haeufigkeit (char a[], int anzahl[])
    {
        int i=0;
    
        while(a[i] != '\0')
        {
          int x=toupper(a[i])-'A';
          if( x>=0 && x<MAXLEN ) anzahl[i]++;
          i++;
        }
    }
    
    int main()
    {
        char a[100];
        int i,anzahl[MAXLEN]={0};
    
        printf("Eingabe: ");
        fgets( a,100,stdin );
        haeufigkeit(a,anzahl);
    
        for(i=0;i<MAXLEN;++i)
          printf("%c:     %i\n",'A'+i,anzahl[i]);
    
        return 0;
    }
    


  • Es muss in haeufigkeit anzahl[x]++; heissen und nicht anzahl[i]++;

    void haeufigkeit (char a[], int anzahl[])
    {
        int i=0;
    
        while(a[i] != '\0')
        {
          int x=toupper(a[i])-'A';
          if( x>=0 && x<MAXLEN ) anzahl[x]++; // geaendert, war anzahl[i]++
          i++;
        }
    }
    


  • - hier stand Unsinn -


Anmelden zum Antworten