Buchstaben zählen
-
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.:
BuchstabeA: 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) * zeichenund 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; }