seto Geschrieben 23. November 2007 Geschrieben 23. November 2007 Ich hab leider ein Problem bei dieser Programmierung :-( einen Text von der Tastatur einliest und ein Histogramm der Längen der in diesem Text vorkommenden Wörter ausgibt. Ein Wort sei eine Zeichenkette, die kein Leerzeichen enthält. Wortlängen, die in dem Text nicht vorkommen, sollen im Histogramm nicht dargestellt werden. Wörter mit mehr als 20 Buchstaben sollen der Wortlänge 20 zugeordnet werden. Hinweise: - Ein Histogramm ist ein Balkendiagramm, das die Häufigkeitsverteilung einer Variablen darstellt. Dazu muss diese zunächst klassifiziert werden. Das Histogramm besteht aus mehreren waagerechten Balken, die die Klassen repräsentieren. Die Länge der einzelnen Balken ist proportional zu der Häufigkeit der jeweiligen Klasse. Benutzen Sie das ASCII-Zeichen ’#’, um ein Balkensegment darzustellen. - Es sollen nur Balken angezeigt werden, deren Wert größer als 0 ist, d. h. Wortlängen, die im Text nicht vorkommen, werden auch nicht dargestellt. Vor dem Balken ist als Klassenbezeichnung die zugehörige Wortlänge auszugeben. - Das Einlesen einer Zeichenkette (mit Leerzeichen) in eine Stringvariable text über die Tastatur ist möglich mit: getline(cin, text); - Definieren Sie ein eindimensionales Feld b vom Typ integer mit 20 Elementen und initialisieren Sie alle Elemente mit 0: int b[20]={0}; -Denken Sie daran, dass nach dem letzten Wort normalerweise kein Leerzeichen mehr steht, der letzte Buchstabe des letzten Wortes aber mitgezählt werden muss! Testlauf (Eingaben unterstrichen): Text = ? Dies ist ein Beispieltext 3 ## 4 # 12 # Drücken Sie eine beliebige Taste . . . Es wurden also 2 Wörter mit einer Länge von 3 Buchstaben, 1 Wort mit 4 und 1 Wort mit 12 Buchstaben gefunden. Wie soll ich diesen aufgabe am besten anfangen , brauche hilfe :-( :eek Zitieren
Guybrush Threepwood Geschrieben 23. November 2007 Geschrieben 23. November 2007 jaja immer die blöden Hausaufgaben Zitieren
Kael_Uka Geschrieben 23. November 2007 Geschrieben 23. November 2007 Wie wär es denn wenn du einen Lösungsansatz bietest oder zumindest mal deine Gedanken die du dir dazu bistimmt schon gemacht hast niederschreibst und dann deine Probleme mit dieser Aufgabe konkret benennst. Dann kann dir bestimmt weitergeholfen werden. Zitieren
Jan Jansen Geschrieben 23. November 2007 Geschrieben 23. November 2007 Lösungsansatz: 1. Aufgabenstellung lesen 2. Aufgabenstellung verstehen (Ist das Ergebnis des Testlauf wirklich richtig? Zerlege zur Überprüfung den Teststring per Hand) 3. Zerlege die Aufgabe in kleine Teile (Z.B. Eingabe, Ausgabe, Zählen, Wortfinden ...) 4. Programmiere die Teile (Zum Test werden benötigte Daten durch Initialisierung im Quelltext generiert) 5. Setze die Programmteile zusammen 6. Teste das komplette Programm 7. (später) Optimiere/Verbessere das Programm Zitieren
trebstyle Geschrieben 23. November 2007 Geschrieben 23. November 2007 mach eine große schleife, die den ganze langen string durchrödelt. mit einem zähler zählst du die buchstaben, die kommen, bis wieder ein leerzeichen kommt. im zähler steht also jetzt die anzahl der buchstaben. pack jetzt dein array mit dem index "anzahl der buchstaben" und erhöhe den wert des arrays um eins. falls du über 20 kommst, musst du eine kleine abfrage einbauen, die dir im array[20] den wert um eins erhöht. wenn du durch bist, beginne eine neue schleife, die von 1 - 20 zählt, damit du die werte des arrays ausgeben kannst. um gatter (#) zu erzeugen könntest du entweder wieder eine schleife mit verwenden, die bis zum wert des arrayeintrages zählt (array[15) sei zb. 10) und somit dann ########## erzeugt. oder du hast eine funktion, die meinetwegen auf anweisung zehn bestimmte zeichen erzeugt. falls ein arrayeintrag 0 ist, fang es mit einer abfrage ab. bist du schüler? oder bist du in der ausbildung? Zitieren
Zakum Geschrieben 23. November 2007 Geschrieben 23. November 2007 Ein ähnliches Problem musste ich letztens für meine Jahresarbeit lösen, das Trennen von Zeichenketten nach Leerzeichen ist vor allem eigentlich nur unübersichtlich. Es wird dir hier auf jeden Fall helfen, vor dem Programmieren ein Strucktogramm oder ein Flussschema zu zeichnen, damit sparst du dir viel Zeit beim Debuggen Ansonsten ist aber trebstyles Beschreibung ziemlich gut! Versuch einfach mal, sie umzusetzen und wenn es ein konkretes Problem gibt, dann hau uns an Zitieren
trebstyle Geschrieben 23. November 2007 Geschrieben 23. November 2007 ich habs mal schnell mit perl hingeschludert: print "\nBitte Text ohne Satzzeichen eingeben: "; chomp($text = <STDIN>); my $satzlaenge = length($text); my $wortlaenge = 0; my $array = 0; for (my $i=0; $i<=$satzlaenge; $i++) { if(substr($text, $i, 1) eq " ") { if ($wortlaenge > 20) { $array[20] ++; } else { $array[$wortlaenge] ++; } $wortlaenge = 0; } else { $wortlaenge ++; } } if (($wortlaenge - 1) > 20) { $array[20] ++; } else { $array[($wortlaenge - 1)] ++; } print "\n-------------------------------------\n"; for (my $i=1; $i<=20; $i++) { if($array[$i] != 0) { print ("$i "); for (my $k=1; $k<=($array[$i]); $k++) { print ("#"); } print ("\n"); } } print "-------------------------------------\n"; Zitieren
seto Geschrieben 25. November 2007 Autor Geschrieben 25. November 2007 mach eine große schleife, die den ganze langen string durchrödelt. mit einem zähler zählst du die buchstaben, die kommen, bis wieder ein leerzeichen kommt. im zähler steht also jetzt die anzahl der buchstaben. pack jetzt dein array mit dem index "anzahl der buchstaben" und erhöhe den wert des arrays um eins. falls du über 20 kommst, musst du eine kleine abfrage einbauen, die dir im array[20] den wert um eins erhöht. wenn du durch bist, beginne eine neue schleife, die von 1 - 20 zählt, damit du die werte des arrays ausgeben kannst. um gatter (#) zu erzeugen könntest du entweder wieder eine schleife mit verwenden, die bis zum wert des arrayeintrages zählt (array[15) sei zb. 10) und somit dann ########## erzeugt. oder du hast eine funktion, die meinetwegen auf anweisung zehn bestimmte zeichen erzeugt. falls ein arrayeintrag 0 ist, fang es mit einer abfrage ab. bist du schüler? oder bist du in der ausbildung? Ich bin in der Ausbildung..... dieser Aufgabenstellung weiß ich nicht weil ich leider nicht weil ich die Übung nicht mitgemacht habe, da war ich krank :-( da musste ich diesen Testat machen deswegen brauchte ich Eure erste Hilfe *rotwerd*, ich weiß es ist peinlich das ich euch frage *rotwerd* Zitieren
seto Geschrieben 25. November 2007 Autor Geschrieben 25. November 2007 ich habs mal schnell mit perl hingeschludert: print "\nBitte Text ohne Satzzeichen eingeben: "; chomp($text = <STDIN>); my $satzlaenge = length($text); my $wortlaenge = 0; my $array = 0; for (my $i=0; $i<=$satzlaenge; $i++) { if(substr($text, $i, 1) eq " ") { if ($wortlaenge > 20) { $array[20] ++; } else { $array[$wortlaenge] ++; } $wortlaenge = 0; } else { $wortlaenge ++; } } if (($wortlaenge - 1) > 20) { $array[20] ++; } else { $array[($wortlaenge - 1)] ++; } print "\n-------------------------------------\n"; for (my $i=1; $i<=20; $i++) { if($array[$i] != 0) { print ("$i "); for (my $k=1; $k<=($array[$i]); $k++) { print ("#"); } print ("\n"); } } print "-------------------------------------\n"; Ich hatte ne blöde frage...ist es nicht besser wenn man unter Programme mache ich meine durch "call by value". Zitieren
Klotzkopp Geschrieben 26. November 2007 Geschrieben 26. November 2007 Ich hatte ne blöde frage...ist es nicht besser wenn man unter Programme mache ich meine durch "call by value". Bei so einem kurzen Programm ist das IMHO nicht notwendig. Wenn du übrigens mal die Suchfunktion bemühst, solltest du einen fertigen Code in C finden. Zitieren
seto Geschrieben 26. November 2007 Autor Geschrieben 26. November 2007 Bei so einem kurzen Programm ist das IMHO nicht notwendig. Wenn du übrigens mal die Suchfunktion bemühst, solltest du einen fertigen Code in C finden. mein Programm ist fertig, ich weiß ob das so gut ist.... Ich musst das in C++ Programmieren :-( leider int main() { string text; cout<< "Text = ? " ; getline(cin,text); int b[20]={0} , satzlaenge, wortlaenge=0; satzlaenge = (int)text.size(); for (int i=0;i<=satzlaenge;i++) { if (text[i]!= ' '&& text [i] !='\0') { wortlaenge++; } else { if (wortlaenge>=20) { b[19]++; } else { b[wortlaenge-1]++; } wortlaenge=0; } } for(int k=0;k<=19;k++) { if(b[k]!=0) { cout<<k+1<<" "; for(int l=1;l<=b[k];l++) { cout<<"#"; } cout<<endl; } } return 0; } [/PHP] Zitieren
Klotzkopp Geschrieben 27. November 2007 Geschrieben 27. November 2007 mein Programm ist fertig, ich weiß ob das so gut ist.... Sieht ganz gut aus. Die Prüfung auf '\0' ist überflüssig, weil das nicht passieren kann, wenn du aus cin einliest. Und die Begrenzung auf maximal 20 Zeichen ist natürlich willkürlich, die könntest du umgehen, wenn du statt eines Arrays einen Vector benutzen würdest. Wenn du Maps und Stringstreams benutzen darfst, und den String-Konstruktor für eine bestimmte Anzahl gleicher Zeichen benutzt, geht das sogar noch etwas kürzer: #include <string> #include <map> #include <sstream> #include <iostream> using namespace std; int main() { cout<< "Text = ? " ; string text; getline(cin,text); map<string::size_type, int> len_map; istringstream iss(text); string word; while(iss >> word) ++len_map[word.length()]; for(string::size_type k=1; k<=len_map.rbegin()->first; ++k) cout << k << ' ' << string(len_map[k], '#') << '\n'; }[/code] Zitieren
Kael_Uka Geschrieben 27. November 2007 Geschrieben 27. November 2007 Ich glaube, dass die Begrenzung auf 20 Zeichen ein Teil der Aufgabenstellung war. Zitieren
Klotzkopp Geschrieben 27. November 2007 Geschrieben 27. November 2007 Du hast Recht. Das hatte ich wohl schon wieder verdrängt. Dann so: while(iss >> word) ++len_map[min(word.length(),string::size_type(20))]; [/code] Dazu braucht man dann noch <algorithm>. Zitieren
seto Geschrieben 30. November 2007 Autor Geschrieben 30. November 2007 Ich hab ein Struktorgramm gemacht kann jemand das überprüfen ob das richtig ist? danke...... Zitieren
Klotzkopp Geschrieben 30. November 2007 Geschrieben 30. November 2007 Ich sehe da folgende Fehler: Wortlängen über 20 werden gar nicht gezählt.Wortlänge wird nach dem Erhöhen des Feldes in b nicht zurückgesetzt.Die Ausgabeschleife für die # steht an der falschen Stelle.Die Variable z in der i-Schleife ist nirgendwo sonst erwähnt. Du meinst vermutlich Wortlänge. Zitieren
Jan Jansen Geschrieben 30. November 2007 Geschrieben 30. November 2007 Deine Logik hat Probleme mit einigen Fällen: Eingabe beginnt mit einem Leerzeichen Eingabe endet mit einem Buchstaben (das letzte Wort wird nicht gezählt) Eingabe enthält mehr als ein Leerzeichem am Stück Zitieren
seto Geschrieben 30. November 2007 Autor Geschrieben 30. November 2007 Stimmt :upps ich danke Euch , Ihr alle hab mir sehr geholfen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.