C Programm das Buchstaben zählt

xButzex

Cadet 2nd Year
Registriert
Mai 2012
Beiträge
26
Nabend zusammen,

Also ich muss für ne Aufgabe in der Uni ein C Programm programmieren das Buchstaben aus einer Textdatei liest und hinterher eine Liste ausgibt mit der Häufigkeit der jeweiligen Buchstaben, dabei ist es egal ob groß oder klein und es werden auch keine Sonderzeichen oder Leerzeichen gezählt. Soweit hab ich schon ein Programm zustande bekommen das mir die Buchstaben zählt, welches wie folgt lautet:

Code:
#include <stdio.h>

int main(void)
{
int c;
int count;

while((c = getchar()) != EOF)
  if ( (c >= 'A') && (c <= 'Z') ||
       (c >= 'a') && (c <= 'z')) 
    count ++;

printf("%d letters\n", count);
}

soweit so gut...wir sollen uns für das eigentliche Programm an einem Programm entlanghangeln das Zahlen zählt und deren Häufigkeit ausgibt. hier einmal das programm:

Code:
#include <stdio.h>

int main(void) {
	int ndigit[10];
	int i = 0;
		while (i < 10) {
			ndigit[i] = 0;
			i++;
}
	while ((i = getchar()) != EOF) {
		if (i >= '0' && i <= '9') {
		ndigit[i-'0']++;
} }
i = 0;
while (i < 10) {
printf("%d: %4d times\n",
i, ndigit[i]);
i++;
}
return 0;
}

mein problem ist einfach das ich einfach nicht dadrauf komme wie das vernünftig in das programm bekomme. ich hoffe jemand kann mir den schups in die richtige Richtung geben...und NEIN, ich möchte nicht das hier meine "hausaufgaben" gelöst werden, deswegen fragte ich auch nach einem schups in die richtige Richtung...mir fehlt einfach der denkansatz.

Gruß,
Butze
 
Einzelne Buchstaben sind auch nur Chars. Und Chars kann man auch als Zahlvariablen behandeln.
Hier hilft dann eine ASCII-Tabelle und dann weiß man, dass Großbuchstaben den ASCII-Codes 65 bis 90 und Kleinbuchstaben den ASCII-Codes 97 bis 122 entspricht.

Und mit dem Wissen brauchst du nur noch dein Zahlenprogramm entsprechend umbauen. ;)
 
Ich würde einfach die Gesamtheit aller Zeichen erst einmal Sammeln, egal ob Ziffer, Sonderzeichen etc. Man benötigt dafür nur ein (unsigned) int array der größe 255, anschließend Array[ASCII-CODE]++ ... So ähnlich, nur mit Eingrenzung und Offset, hast du es ja in deinem Zahlenbeispiel schon gemacht.

Anschließend liegt es dann an der Auswertung welche Array-Positionen ausgegeben/ausgewertet werden. Im Prinzip klingt das alles wie die Vorstufe zur Huffmann-Codierung.
 
ich danke euch wirklich für die schnelle hilfe...aber ich bin einfach nicht mehr fähig das jetzt umzusetzen, werds auf morgen verschieben und mir lieber ne mütze schlaf holen :P...danke trotzdem =)...denke das wird morgen schon klappen^^
 
Ja das dürfte auch von der Laufzeit her besser sein, wird sich aber wohl erst bei großen Texten bemerkbar machen.
 
So...habs geschissen bekommen...nur jetzt steh ich vor dem problem das er mir immer crasht wenn in der jeweiligen text datei umlaute wie ü,ö und ä sind -.-"...
falls jemand ne idee hat bitte vortreten ;)...
nicht wundern warum da html mit drin ist, aber es soll halt später als tabelle in einer html datei ausgegeben werden und auch die relativen häufigkeiten beinhalten. hier der code:

Code:
#include <stdio.h>


int main(void) {
int ndigit[26];
int i = 0;
int j = 0;
while (i < 26) {
ndigit[i] = 0;
i++;
}
while ((i = getchar()) != EOF) {
	if( i >= 'a' && i <= 'z' ) i -= 'a' - 'A'; {
		j++;
		ndigit[i-'A']++;
} }

printf( "<html>\n<head>\n<title>Statistik</title>\n</head>\n");
printf("<body>\n<table border=\"1\" cellpadding=\"4\">\n  <tr><th>Buchstabe</th><th>H&auml;ufigkeit</th> <th>relative H&auml;ufigkeit</th></tr>\n ");

i = 0;
while(i<26) {
printf("<tr><td align=\"center\"> %c </td>", i+'a');
printf("<td align=\"center\"> %d </td>", ndigit[i]);
printf("<td align=\"center\"> %f %% </td></tr>\n,", 100.0f*ndigit[i]/j);
i++;
}
printf("</table>\n</body>\n</html>\n");
return 0;
}

Gruß,
Butze
 
Ja, das Problem ist recht einfach und auch zu lösen.
Das beliebte Thema Kodierung, immer beliebt und immer ein Stolperstein.
 
Kodierung ist hier glaub ich weniger das Problem.(ü, ä usw befinden sich innerhalb der 256 Zeichen ) Der Code sieht für mich schon recht seltsam aus, da hier nun wohl einfach zu "kompliziert" gedacht wurde. ^^

Versuch es mal mit der Lösung die DaZpoon und ich meinen. Also Array mit der Größe 256. Dann durchlaufen bis EOF und einfach

array++

Wobei i für dEntlastung Dezimalwert des aktuellen Zeichen steht. Die Abfragen nach verlangten Zeichen innerhalb der Schleife brauchen mehr CPU-Zeit, weshalb man die paar kb für den etwas größeren Array ruhig "opfrrn" sollte.

Am Ende gibst du dann die Bereiche des Arrays aus welche verlangt sind.
 
Zuletzt bearbeitet:
Dein Code scheint mir viel zu kompliziert zu sein. Lese deine Textdatei doch einfach in einen Array ein, und gehe ihn Buchstabe für Buchstabe durch. Dann hast du einen Zweiten Array in dem du Die Häufigkeit der Buchstaben Notierst. Der Index entspricht dem BYTE wert des chars. Dann wird zwar Groß/Kleinschreibung berücksichtigt, aber dass ist erstmal egal.

So wie Fonce eben meint :)
 
Zuletzt bearbeitet:
Tigerass 2.0 schrieb:
Dein Code scheint mir viel zu kompliziert zu sein. Lese deine Textdatei doch einfach in einen Array ein,
bitte so etwas erst gar nicht anfangen zu "lernen"!

das ist so überflüssig hier, wie ineffizient.
 
also ich bin ja dankbar für die hilfe...aber iwie scheiterts an der umsetzung bei mir :(...ich weiß nicht wirklich wie ich das auf eure beschriebene weise angehen soll...bin wohl zu doof^^...auf meinem macbook(vorher hat ichs nur aufm windoof rechner, weil ich noch keine command line für mac geladen hatte) crasht es nicht, nur fehlen dann bei der relativen häufigkeit ~30%, da er anscheinend die ü,ö,ä mitzählt aber diese ja nicht ausgegeben werden...gibt es eine möglichkeit irgendwie das in mein geschriebenes programm mit einzubringen das er halt für ü ein u und ein e zählt?
 
Du speicherst doch nach meiner Methode auch die Anzahl von ü.
Wie kannst du nun wohl das von das gewünschte Verhalten erzeugen?
Stichwort: Addition ;)
 
Zurück
Oben