# wie oft kommt welcher Buchstabe in einer Zeichenkette vor?



## aroo (6. November 2004)

*gleiche Buchstaben zählen*

hi all

Muss bis Montag ein Programm abgeben, dass folgendes macht:
Eingabe=> eine Zeichenkette. (z.B intelligent)
Ausgabe=>
(a) Die Buchstaben aufsteigend sortieren. 
(b) welche Buchstabe wie oft vor kommt.
also:
-------------
e: 2
g: 1
i:  2
l:  2
n: 2
t: 2
--------------
ich habe die Buchstaben wie folgt sortiert:


```
for(i=0; i<wort_size-1; i++)    // Bubblesort Beginn
    {
        for(j=0; j<wort_size-i-1; j++)
        {
            if(wort.at(j)>wort.at(j+1))
            {
                temp = wort.at(j);         // SWAT
                wort.at(j) = wort.at(j+1); // SWAT
                wort.at(j+1) = temp;       // SWAT
            }
        }
    }
```

ich werde mich sehr freuen, wenn ihr mir helft!
Danke
Thomas


----------



## C Coder (6. November 2004)

Da würd ich eine switch auswertung machen:

```
for(int z=0;z<wort_size;z++)
{
  char x = wort[z];
  switch(x)
  {
    case 'a';
        Buchstabe_a++;
      break;
    case 'A':
        Buchstabe_A++;
      break;
    case 'b':
    ...
  }
}
```


----------



## Fabian H (6. November 2004)

Wenn es nur um Buchstaben geht, reicht doch ein 26 Felder grosses Array?
Dann nimmst du einfach den ASCII Wert des Zeichens, wendest die Funktion _toupper()_ an (ist in _ctype.h_ deklariert), ziehst 'A' ab und dann hast du den Index des Arrays, der zum entsprechenden Buchstaben gehoert.

```
int letters[26];
unsigned i;
char c; 

/* alle Felder auf 0 setzen (string.h) */
memset(letters, 0, sizeof(letters));

/* hier die Eingaberoutine */
while ((c = getchar()) != EOF) {
        /* Achtung: isalpha koennte je nach lokalen Einstellungen
           bei mehr als 26 verschiedenen Zeichen 1 zurueckgeben,
           also evtl. durch eigene Abfrage ersetzen */
        if (isalpha(c))
                letters[toupper(c) - 'A']++; 
}       

for (i=0; i<sizeof(letters) / sizeof(int); i++)
        printf("%c: %d\n", i + 'A', letters[i]);
```


----------



## MFC openGL (6. November 2004)

Würde dir vorschlagen ein 256er INT Array zu erstellen, und einfach jedes eingelesene Zeichen in den ASCII Wert mit (INT)char... zu konvertieren und dann in deinem Array den jeweiligen Arraywert um +1 zu erhöhen.

Wenn du dann nach dem Alphabet sortieren musst, lässt du das Array einfach von 0 - 255 ausgeben, fertig biste, wenn es nach meistbenutzten Zeichen sortiert werden soll, dann musst du dein Array einfach durch einen Sortieralgorithmus schieben, und gibts es dann aus.

Beispiel :

```
int buffer[256];
 
for(int i=0; i<= 255; i++)
    buffer[i] = 0;
 
und wenn du dann z.b. diese zeichenkette einließt : 05706   (buchstaben gehen natürlich auch genauso)
 
dann machste
 
char* help;
 
cin>>help;
buffer[(int)help]++;
 
jetzt stände in buffer
 
....
buffer[48] = 1
buffer[49] = 0 
buffer[50] = 0 
buffer[51] = 0 
buffer[52] = 0 //entspricht dem zeichen 4
buffer[53] = 1 //entspricht dem zeichen 5
buffer[54] = 1  //entspricht dem zeichen 6
buffer[55] = 1 //entspricht dem zeichen 7
.....
```
 
So kann dein Programm jede mögliche und unmögliche Zeichenfolge ohne Probleme verarbeiten.

Evtl hilfts dir ja, ist auch garnicht so schwer wie es aussieht, ist eigendlich ein sehr kurzer Code.

Gruss

MFC OpenGL


----------

