Histogramm
-
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]; i++){ if(s[i]>=65){ if(s[i]<=90){ num_upper_case++; }} if(s[i]>=97){ if (s[i]<=122){ num_lower_case++; }} if(s[i]>=0){ if(s[i]<=127){ num_printable++; }} for ( k='A'; k<='Z'; k++){ for(c='a'; c<='z'; c++){ if( s[i]==k || s[i]==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
~edit durch SeppJ: Codetags eingefügt.~
-
Hallo bloedbommel (du wirst angesprochen, wie du es wünscht),
willkommen im Forum.
Benutze bitte die Codetags korrekt, sonst liest sich niemand deinen Code durch. Benutze die Vorschau vorm Absenden, um zu prüfen, ob du alles richtig gemacht hast. Ausnahmsweise korrigiere ich die Tags mal für dich, weil dies dein erster Beitrag ist, in Zukunft solltest du selber drauf achten. Tags beginnen mit etwas wie [tag] und enden mit [/tag]. Die Buttons unter dem Editfenster funktionieren so:
a) Text markieren, Button drücken -> markierter Text wird in entsprechende Tags gesetzt
b) Button drücken -> Anfangstag wird an aktueller Cursorposition eingefügt. Button wird mit einem '*' markiert. Button erneut drücken -> Endtag wird eingefügt.Zu deinem Programm: Ich weiß nicht, was du dir dabei gedacht hast. Programmieren ist nicht einfach raten, was wohl richtig sein könnte, hoffen und beten. Code ist Logik pur. Du musst genau wissen, warum du wo welches Zeichen setzt.
Es besteht keinerlei Zusammenhang zwischen dem Inhalt der Datei und dem, was du mit dem Histogramm machst. Und das, was du machst, ist auch nur ein wilder Zeichensalat, den du sicher selber nicht verstehst (for(k='A' ,c='a'; k<='Z' ,c<='z'; k++ , c++)
?). Ein Computer ist keine magische Maschine, die dir in den Kopf guckt und tut, was du willst. Er macht genau das, was du ihm sagst. Wenn du nicht ausdrücken kannst, was du möchtest, dann macht er auch nicht das, was du möchtest. Dazu musst du lernen, zu programmieren.Kann es sein, dass der Code, der die Groß- und Kleinbuchstaben zählt von jemand anderem ist und der Teil mit dem Histogramm von dir?
-
SeppJ schrieb:
Benutze bitte die Codetags korrekt, sonst liest sich niemand deinen Code durch. Benutze die Vorschau vorm Absenden, um zu prüfen, ob du alles richtig gemacht hast. Ausnahmsweise korrigiere ich die Tags mal für dich, weil dies dein erster Beitrag ist, in Zukunft solltest du selber drauf achten. Tags beginnen mit etwas wie [tag] und enden mit [/tag]. Die Buttons unter dem Editfenster funktionieren so:
a) Text markieren, Button drücken -> markierter Text wird in entsprechende Tags gesetzt
b) Button drücken -> Anfangstag wird an aktueller Cursorposition eingefügt. Button wird mit einem '*' markiert. Button erneut drücken -> Endtag wird eingefügt.Sorry für OT, aber wie oft hast du diesen Text jetzt in den letzten Tagen geschrieben?
Haste den irgendwo in den Notizen drin oder was? :p
-
Nathan schrieb:
Sorry für OT, aber wie oft hast du diesen Text jetzt in den letzten Tagen geschrieben?
Geschrieben? 1x. Gepostet? Oft.
Haste den irgendwo in den Notizen drin oder was? :p
In diesem Fall habe ich die Suche nach eigenen Beiträgen benutzt.
Die meiste Zeit des Jahres lohnt sich so ein vorbereiteter Text nicht, aber in den letzten Wochen merkt man, dass das Sommersemester begonnen hat und die ersten schweren Übungsaufgaben gestellt wurden. Viele Neuanmeldungen. Und die Codetags sind zugegebenermaßen für Neulinge beim ersten Versuch praktisch unbenutzbar, außer sie haben schon von anderen Foren her Erfahrung mit BBCode.
-
Moin, danke erstmal für die Info mit dem Codetag.
Allerdings brauchst du mir nicht erklären wie ein Computer funktioniert!
Das Programm stammt vollständig aus eigener Hand, ich habe wie gesagt keine Lösung gefunden wie ich den Inhalt meines Arrays (Feld) hochzähle, und dann kann man ruhig mal mehrere Ansätze durchgehen, allerdings habe ich auch die Lösung dafür gefunden, mein Wundercomputer hat meine Gedanken gelesen und dann ging es
-
Ein paar Ansätze bzw. genauere Angaben, was du falsch gemacht hast:
-Welche Rolle hat dein a? Guck mal, was du damit alles machst.
-Welche Rolle hat dein histogram? Guck mal, was du damit alles nicht machst.
-Mach dich mal kundig, was ein Komma in C macht.
-Daraus folgt: Die Zeilen 32-27 und 48-50 schmeiß am besten komplett weg. Stattdessen:
-Buchstaben sind auch nur Zahlen. Du kannst auch damit rechnen. In fast allen gängigen Codierungen ist beispielsweise 'c' - 'a' == 2; 'D' - 'A' == 3; usw. Vorsicht: 'e' - 'A' != 5. Groß- und Kleinschreibung musst du schon noch beachten. Aber insgesamt bekommst du mit dieser Technik einen Index für den Zugriff auf dein Feld.
-Wichtig beim Histogramm ist, dass du auch die Bins in deinem Histogramm erhöhst. Siehe die ersten beiden Punkte.
-Bei der Auswertung des Histogramms wäre es vielleicht eine bessere Idee, alle Felder des histogram-Feldes durchzugehen (0-25). Die zugehörigen Buchstaben kannst du dir wieder ausrechnen.P.S.: Ich würde auch vermeiden, Buchstaben als Zahlen zu schreiben, wenn du eigentlich Buchstaben meinst. Also 'A' anstatt 65. Das ist sowohl lesbarer, als auch universeller.