C Kein Plan mehr

bloedbommel

Newbie
Registriert
Mai 2014
Beiträge
1
Moin,

ich hab das unten stehende Programm (in C) entworfen, welches einen Textdokument einliest, die Anzahl der Zeilen, Zeichen, Groß-und Kleinbuchstaben und sonstige Zeichen zählt und ausgibt.
Allerdings möchte ich auch die Anzahl einzelner Buchstaben herausfinden, ich dachte, dass das evtl. mit dem Programm laufen würde, das ich bereits habe, allerdings funktioniert wohl meine letzte For-Schleife nicht, mit der gezählt werden soll, und ich habe langsam echt keine Ideen mehr!
Könnt ihr mir helfen den Fehler zu finden?

#include <stdio.h>
#define MAX_LINE_LEN 256
#define ALPHABET_LEN 26

int main ()

{
char s[MAX_LINE_LEN];
unsigned int num_lines=0, num_upper_case=0, num_lower_case=0, num_non_letter=0, num_printable=0;
unsigned int histogram[ALPHABET_LEN]={0};
int i=0,k=0,a=0,c=0;

while(fgets(s,MAX_LINE_LEN,stdin)!= NULL){
num_lines++;
fputs(s,stdout);

for(i=0; s; i++){
if(s>=65){
if(s<=90){
num_upper_case++;
}}

if(s>=97){
if (s<=122){
num_lower_case++;
}}
if(s>=0){
if(s<=127){
num_printable++;
}}

for ( k='A'; k<='Z'; k++){
for(c='a'; c<='z'; c++){
if( s==k || s==c){
a++;
}}}
} }


num_non_letter= num_printable-(num_lower_case+num_upper_case);

printf("Die Anzahl der Zeilen im Text lautet: %d\n",num_lines);
printf("Die Anzahl der Grossbuchstaben lautet: %d\n",num_upper_case);
printf("Die Anzahl der Kleinbuchstaben lautet: %d\n",num_lower_case);
printf("Die Anzahl der sonstigen Zeichen lautet: %d\n",num_non_letter);
printf("Die Anzahl aller druckbaren Zeichen lautet: %d\n",num_printable);

for(k='A' ,c='a'; k<='Z' ,c<='z'; k++ , c++){
printf("Haeufigkeit von %c/ %c: %d\n",k,c,histogram[a]);
}
return 0;

}

Lg Bloedbommel
 
nutz doch bitte für das posten vom Quellcode die Formatierung
Code:
[CODE ]...<mein code>..[ /CODE]  (ohne freizeichen)

das liest doch sonnst keiner freiwillig.
 
Zuerst: Ich kann kein C, deshalb kanns sein das ich die Syntax falsch versteh.

Das Problem liegt hier:

for ( k='A'; k<='Z'; k++){
for(c='a'; c<='z'; c++){
if( s==k || s==c){
a++;

Du zählst hier doch nur mit der Variablen a. Das heisst alle Buchstaben werden a erhöhen. Du brauchst hier entweder nen 26er Array oder 26 Varaiblen (Array wäre besser.)
Das nächste Problem ist, das du mit 'A' in die erste for Schleife gehst, und dann dort 'a' bis 'z' durchgehst. Besser wäre da evtl. 1 for schleife die groß und kleinschreibvung prüft und das dann im Array speichert.

So in der Art (wie gesagt Syntax musst du selber gucken):

for (k=65; k <= 90; k++){ // A-Z in ascii soll durchlaufen werden
if( s==k || s==k+32){ //Abfrage ob der Buchstabe dem k entspricht oder den kleinbuchstaben das in der ascii Tabelle um 32 Zeichen weiter "oben" steht
Array[k-65]++ //Array an der stelle k-65 (0 für den ersten Wert = A) um einen erhöhen
}}

EDIT2: Falls man in C die schelife nicht bei 65 starten kann, dann einfach bei 0 losgehen und in der if abfrage 65 addieren (s==k+65 bzw. k==65+32).
 
Zuletzt bearbeitet:
Wenn du nur ascii Zeichen zählen willst, dann erstelle einfach einen Integer Array entsprechender Größe, dann kannst du einfach beim bei einem Zeichen.

charracter[s]++

ausführen. daraus kannst du dann später alle benötigten informationen zzziehen.
 
bloedbommel schrieb:
ich hab das unten stehende Programm (in C) entworfen, welches einen Textdokument einliest, die Anzahl der Zeilen, Zeichen, Groß-und Kleinbuchstaben und sonstige Zeichen zählt und ausgibt.
Allerdings möchte ich auch die Anzahl einzelner Buchstaben herausfinden, ich dachte, dass das evtl. mit dem Programm laufen würde, das ich bereits habe, allerdings funktioniert wohl meine letzte For-Schleife nicht, mit der gezählt werden soll, und ich habe langsam echt keine Ideen mehr!
Könnt ihr mir helfen den Fehler zu finden?

Ehrlich gesagt ist mir nicht klar, was die letzte Schleife überhaupt bewirken soll. Vielleicht kannst Du das erläutern. Ich hab das Programm mal so vereinfacht, wie ich es verstehen kann. Vielleicht kannst Du ergänzen, was in der letzten Schleife gemacht werden soll:
Code:
#include <stdio.h>
#include <string.h>
#include <ctype.h>

 int main()
{
 int i, num_lines=0;
 int num_upper_case=0, num_lower_case=0, num_non_letter=0, num_printable=0;
 char st[256], tb[256];     /* String, Zeichentabelle */
 memset(tb, 0, sizeof(tb)); /* Haeufigkeitstabelle initialisieren */

 while(fgets(st, sizeof(st), stdin) != NULL) {
    num_lines++;
    for(i=0; st[i]; i++) {
       tb[st[i]]++; /* Tabelle updaten */
       if(isupper(st[i]))      num_upper_case ++;
       else if(islower(st[i])) num_lower_case ++;
       else if(isprint(st[i])) num_printable  ++;
       else                    num_non_letter ++;

    }
 }
 printf("Die Anzahl der Zeilen im Text lautet: %d\n", num_lines);
 printf("Die Anzahl der Zeilen im Text lautet: %d\n", num_lines);
 printf("Die Anzahl der Grossbuchstaben lautet: %d\n", num_upper_case);
 printf("Die Anzahl der Kleinbuchstaben lautet: %d\n", num_lower_case);
 printf("Die Anzahl der sonstigen Zeichen lautet: %d\n", num_non_letter);
 printf("Die Anzahl aller druckbaren Zeichen lautet: %d\n", num_printable);
 for(i=0; i<sizeof(tb); i++) 
    if(tb[i] && isalnum(i)) printf("Haeufigkeit von %c: %d\n", i, tb[i]);

 return 0;
}
 
Zuletzt bearbeitet:
Zurück
Oben