MidnightRun Geschrieben 7. Februar 2009 Geschrieben 7. Februar 2009 Hallo, ich bin grad dabei mich in C# einzuarbeiten und habe ein Übungsprogramm gemacht. Die Aufgabe war einen Partyrechner zu Programmieren. Mein Problem ist, dass man in seiner Form ein Textfeld hat und dort einen Text eingeben darf, der dann auf der Torte steht Da es 2 verschiedene Sorten von Torten gibt muss getestet werden ob der Text überhaupt auf die Torte passt. Sprich es gibt eine bestimme Anzahl von Buchstaben die man auf die Torte kriegt und hier der Code der es Testet und bei überschreitung wird der überschüssige Text abgeschnitten per SubString(). if (value.Length > maxLänge) { MessageBox.Show("Der Text ist zu lang für ein " + KuchenGröße + " cm-Kuchen"); if (maxLänge > kuchenText.Length) maxLänge = kuchenText.Length; this.kuchenText = kuchenText.Substring(0, maxLänge); } else kuchenText = value; } value ist eben der neue Text der eingegeben worden ist, maxLänge ist die Maximale Länge der Torte. Das bedeutet das erst in die Schleife gesprungen wird, wenn der neue Text zu gross für die Torte ist und es kommt ja dann die entsprechende Meldung =D Mein Problem ist die zweite if Abfrage : if (maxLänge > kuchenText.Length) Sie fragt ab ob die maximale Länge > als der aktuelle Text ist und setzt dann die max Länge auf die Länge des aktuellen Textes, wahrscheinlich wegen dem SubString(begin, end) damit nich zuviel Überschrieben wird, oder ? Die Sache ist die, dass es aus der Logik des Programms niemals zu dieser Anweisung kommen kann. Der Text wird bei jeder Veränderung der TextBox aktualisiert. Das bedeutet, dass max Länge niemals größer als der aktuelle Text seien kann, denn die zweite Abfrage wird ja erst ausgeführt, wenn die aktuelle Eingabe erst größer als die Maximal Länge ist. Ist das unnötiger Code, der Lösung ? Oder verstehe ich was falsch ? Mfg Zitieren
HJST1979 Geschrieben 9. Februar 2009 Geschrieben 9. Februar 2009 Versuchs mal so, ich bin mir aber nicht sicher ob mid(value, 1, maxLänge); so richtig ist da ich meißt nur VB.NET programmiere. if (value.Length > maxLänge) { MessageBox.Show("Der Text ist zu lang für ein " + KuchenGröße + "cm-Kuchen"); this.kuchenText = mid(value, 1, maxLänge); } else { this.kuchenText = value; } Zitieren
MidnightRun Geschrieben 9. Februar 2009 Autor Geschrieben 9. Februar 2009 Hey, danke erstmal für die Antwort, aber meine Frage war, dass ich die Musterlösung nicht ganz verstanden habe. Nämlich die Zweite IF Abfrage =D Mfg Zitieren
HJST1979 Geschrieben 9. Februar 2009 Geschrieben 9. Februar 2009 Ich finde die Musterlösung einfach nur schwachsinn, da ja der Text somit IMMER auf die Torte passt bzw. die Torte immer größer wird. Beispiel: AnfangsMaxLänge = 10 MaxLänge WortLänge MaxLänge MsgBox Wortpasst ? 10 9 10 Nein Ja 10 12 12 Ja Ja 12 15 15 Ja Ja 15 9 15 Nein Ja Wenn du die Beispielzahlen von mir mal durchsiehst und deinen Code dazu anschaust, wirste sehen, dass dies stimmt, denn nach der MsgBox wird die "Torte" immer größer ! Zitieren
unbenannt Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 (bearbeitet) Ich bin mal so dreist und wage zu behaupten, dass der Kuchen potentiell eher kleiner als größer wird. WENN Länge des neuen Texts <= Maximallänge des Kuchens DANN Kuchentext = neuer Text SONST zeige MessageBox WENN Maximallänge des Kuchens > Länge des vorhandenen Texts DANN Maximallänge = Länge des aktuellen Texts Kuchentext = Substring von Kuchentext Solange der neue Text kleiner oder gleich der Maximallänge ist alles in Butter. Ist die Länge des neuen Texts aber größer, dann wird die Maximallänge auf den Wert der Länge des aktuellen Texts gesetzt und anschließend wird der Kuchentext gleich sich selbst gesetzt (denn was anderes macht das "Substring" über die komplette Länge ja nicht). Beispiel: Maximallänge = 5; aktuelles Wort = "foo"; neues Wort = "foo bar"; Länge von "foo bar" = 7 , damit größer als Maximallänge. Nun wird geprüft, on "maxLänge" (5) größer als die Länge des vorhandenen Wortes (3). Das ist so, also wird "maxLänge" auf die Länge des vorhandenen Wortes gesetzt: maxLänge = 3. Anschließend this.kuchenText = kuchenText.Substring(0, maxLänge); mit maxLänge = 3 und kuchenText = "foo". Heraus kommt also "foo" (das ohnehin vorhandene Wort), dem Kuchen werden aber 2 mögliche Zeichen genommen. Nachher ist es also nicht mehr möglich, ein Wort mit 5 Zeichen auf den Kuchen zu schreiben. EDIT: Da es 2 verschiedene Sorten von Torten gibt muss getestet werden ob der Text überhaupt auf die Torte passt. Könnte es sein, dass ein entscheidendes Stückchen Code fehlt? Rein von der Logik her, macht das Codefragment ja auf den ersten Blick wirklich wenig Sinn. Für sich allein genommen, erscheint mir die einmalige Verwendung von "this" bezüglich "kuchenText" nämlich auch recht überflüssig. Zeig am Besten mal her, was da sonst noch zugehört. Bearbeitet 10. Februar 2009 von unbenannt Zitieren
U-- °LoneWolf° Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 Naja der prog. stil ist nicht so toll deshalb kommt denke ich zur verwirung if (value.Length > maxLänge) { MessageBox.Show("Der Text ist zu lang für ein " + KuchenGröße + " cm-Kuchen"); if (maxLänge > kuchenText.Length) maxLänge = kuchenText.Length; this.kuchenText = kuchenText.Substring(0, maxLänge); } else kuchenText = value; } ist das gleiche wie if (value.Length > maxLänge) { [INDENT][/INDENT]MessageBox.Show("Der Text ist zu lang für ein " + KuchenGröße + " cm-Kuchen"); [INDENT][/INDENT] if (maxLänge > kuchenText.Length) [INDENT][/INDENT]{ [INDENT][/INDENT] [INDENT][/INDENT]maxLänge = kuchenText.Length; [INDENT][/INDENT] } [INDENT][/INDENT]this.kuchenText = kuchenText.Substring(0, maxLänge); } else kuchenText = value; } Die Maximale Länge wird also in abhängigkeit von kuchenText.Length verändert bzw. zurückgesetzt. die frage ist was steht da sonst noch woher kommt der wert für value und für kuchenText? Den vom Codeausschnitt her kann man nciht favon ausgehen das die beiden identisch sind. Zitieren
unbenannt Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 (bearbeitet) Naja der prog. stil ist nicht so toll [...] Bitte nicht virtuell schlagen, aber Dein zweites Codefragment ist dank Zeilenumbruchsminimierung ein stilistisches Desaster Bearbeitet 10. Februar 2009 von unbenannt Zitieren
U-- °LoneWolf° Geschrieben 10. Februar 2009 Geschrieben 10. Februar 2009 oh fu wiso sind die zeilenumbrüche da raus? @unbenannt thx so ein mist was ich einfach zeigen wollte ist das durch die fehleneden {} der 2. If abfrage bei einem neuling der einmdruck entstehen könnte das alls nachstehende ausgeführt wird wenn die abfrage wahr ist Zitieren
MidnightRun Geschrieben 11. Februar 2009 Autor Geschrieben 11. Februar 2009 oh fu wiso sind die zeilenumbrüche da raus? @unbenannt thx so ein mist was ich einfach zeigen wollte ist das durch die fehleneden {} der 2. If abfrage bei einem neuling der einmdruck entstehen könnte das alls nachstehende ausgeführt wird wenn die abfrage wahr ist Mhh, das man eine Anweisung nicht einklammern muss, weiss ich schon Naja hier die komplette Eigenschaft : private string kuchenText = ""; public string KuchenText { get { return this.kuchenText; } set { int maxLänge; if (Kuchengröße == 8) maxLänge = 16; else maxLänge = 40; if (value.Length > maxLänge) { MessageBox.Show("Text zu lang für einen " + Kuchengröße + "cm-Kuchen"); if (maxLänge > this.kuchenText.Length) maxLänge = this.kuchenText.Length; this.kuchenText = kuchenText.Substring(0, maxLänge); } else this.kuchenText = value; } } Mein Verständnis Problem leigt ja nur an der Zweiten If Abfrage. Der Benutzer gibt einen Text ein, der Kuchen darf maximal 16 Zeichen haben. Bei "jeder" Änderung von der Textbox, durchläuft das Preogramm diese Eigenschaft. Happy Birthday sind 14 Zeichen, gibt der Benutzer Happy Birthdayy ein sind es 15 und die Eigenschaft läuft super durch, gibt er nun Happy BirthdayyY ein sind es 16. Jetzt gibt er aber Happy BirthdayyYy, sind es 17! Die erste If Abfrage gibt die mbox aus, jetzt nimmt sich aber die zweite If Abfrage mit this das private string feld der Klasse, was immer noch Happy BirthdayyY ist, also 16 Zeichen hat. Es kann ja gar nicht zu dem Sprung in die zweite If Abfrage kommen, da immer der alte Textwert genommen wird und bei jeder Zeichenänderung geprüft wird. Würde aber erst nach eine Button gestätigung getestet werden, wäre das was anderes. Richtig oder doch falsch verstanden ? Fehler in der Lösung ? Zitieren
Klotzkopp Geschrieben 11. Februar 2009 Geschrieben 11. Februar 2009 Die Bedingung des zweiten if kann wahr werden, wenn sich inzwischen die Kuchengröße geändert hat. Der neue Text wird komplett verworfen, und der alte auf die maximale Länge beschnitten, wenn der neue Text zu lang ist. Zitieren
MidnightRun Geschrieben 11. Februar 2009 Autor Geschrieben 11. Februar 2009 Die Bedingung des zweiten if kann wahr werden, wenn sich inzwischen die Kuchengröße geändert hat. Der neue Text wird komplett verworfen, und der alte auf die maximale Länge beschnitten, wenn der neue Text zu lang ist. Versteh ich nicht, meiner Denkweise nach, kommt es nie zu dieser Abfrage, da in die Zweite If nur gesprungen wird, wenn die aktuelle Eingabe zu lang ist. Hier mal die komplette Lösung, startet einfach die Form und dann bei dem Tab Control auf Geburstagfeier, dass ist die Oberfläche.PartyPlaner mit Vererbung.zip Zitieren
Klotzkopp Geschrieben 11. Februar 2009 Geschrieben 11. Februar 2009 Versteh ich nicht, meiner Denkweise nach, kommt es nie zu dieser Abfrage, da in die Zweite If nur gesprungen wird, wenn die aktuelle Eingabe zu lang ist.Wenn die Kuchengröße kleiner wird, kann sowohl der "neue" Text länger als 16, als auch der "alte" kürzer als 16 sein. Testcode: Geburtstagsfeier f = new Geburtstagsfeier( 20, false, "Text" ); f.Personenanzahl = 2; f.KuchenText = "laaaaaaaaaaaaaaaaaaanger Text"; [/code] Damit wird die zweite if-Bedingung wahr. Dann kannst du die Prüfung und die Änderung von maxLänge mal rausnehmen, und dich über die Exception freuen Zitieren
MidnightRun Geschrieben 11. Februar 2009 Autor Geschrieben 11. Februar 2009 Wenn die Kuchengröße kleiner wird, kann sowohl der "neue" Text länger als 16, als auch der "alte" kürzer als 16 sein. Testcode: Geburtstagsfeier f = new Geburtstagsfeier( 20, false, "Text" ); f.Personenanzahl = 2; f.KuchenText = "laaaaaaaaaaaaaaaaaaanger Text"; Damit wird die zweite if-Bedingung wahr. Dann kannst du die Prüfung und die Änderung von maxLänge mal rausnehmen, und dich über die Exception freuen Aber was du hier postet sind doch Hardgecodete Werte. Es kann aber doch nie zu der zweiten If Abfrage kommen, da die Eingabe nach jedem Change überprüft wird. Wertbeispiele : Personen > 5 = 40 Zeichen Text = 12345678901234567890 Nun änder ich Personen auf 4, das bedeutet das ein Kuchen nur einen Text von 18 bewältigen kann. value.length > maxLength (ja!) dann kommt erstmal die Fehlermeldung. Nun kommt die Abfrage maxLength(18) > this.kuchenText(ist 20), also wird die zweite Anweisung übersprungen und direkt mit this.kuchenText = kuchenText.Substring(0, maxLänge);. Wenn ich die Personen nun wieder auf 5 stelle passiert nichts, da die erste IF Abfrage nicht true ist, den value.length < kuchenText. Also so verstehe ich das, habe auch einmal komplett die zweite If Abfrage rausgenommen, aber von Exceptions, keine Spur. Mfg Zitieren
Klotzkopp Geschrieben 11. Februar 2009 Geschrieben 11. Februar 2009 Aber was du hier postet sind doch Hardgecodete Werte.Na und? Es geht mir hier nur um die Klasse Geburtstagsfeier. Über die öffentliche Schnittstelle dieser Klasse sind die Operationen, die ich gezeigt habe, möglich. Dass das in dieser Art und Weise, wie die Klasse in die grafische Oberfläche eingebunden ist, nicht passieren kann, ist zweitrangig. Du kannst natürlich deinen Code so schreiben, dass die Klassen nur dann richtig funktioneren, wenn sie auf eine ganz bestimmte Art und Weise benutzt werden. Stabiler Code kommt dabei aber nicht heraus. Und wenn du mal irgendeine deiner Klassen wiederverwenden willst, wünsche ich dir jetzt schon viel Spaß. Zitieren
MidnightRun Geschrieben 11. Februar 2009 Autor Geschrieben 11. Februar 2009 Na und? Es geht mir hier nur um die Klasse Geburtstagsfeier. Über die öffentliche Schnittstelle dieser Klasse sind die Operationen, die ich gezeigt habe, möglich. Dass das in dieser Art und Weise, wie die Klasse in die grafische Oberfläche eingebunden ist, nicht passieren kann, ist zweitrangig. Du kannst natürlich deinen Code so schreiben, dass die Klassen nur dann richtig funktioneren, wenn sie auf eine ganz bestimmte Art und Weise benutzt werden. Stabiler Code kommt dabei aber nicht heraus. Und wenn du mal irgendeine deiner Klassen wiederverwenden willst, wünsche ich dir jetzt schon viel Spaß. War ja auch nicht böse gemeint, ich wollte eben nur die Logik dahinter verstehen im Bezug auf das Formular. Nun hab ich wieder was dazu gelernt Zitieren
Klotzkopp Geschrieben 11. Februar 2009 Geschrieben 11. Februar 2009 Ich wollte auch nicht so bissig rüberkommen, wie es sich jetzt liest :e@sy Die Schnittstelle einer Klasse sollte nur aus ihren public-Methoden bestehen. Und die sollte man aufrufen können, wie man will, ohne dass etwas Unvorhergesehenes passiert. Dass dabei in bestimmten Anwendungsfällen Code ungenutzt bleibt oder nichts tut, kommt vor. Wenn das der Fall ist, kann man immer noch nachoptimieren, falls es ein Problem darstellt. Zitieren
U-- °LoneWolf° Geschrieben 12. Februar 2009 Geschrieben 12. Februar 2009 private string kuchenText = ""; public string KuchenText { get { return this.kuchenText; } set { int maxLänge; if (Kuchengröße == 8) maxLänge = 16; else maxLänge = 40; if (value.Length > maxLänge) { MessageBox.Show("Text zu lang für einen " + Kuchengröße + "cm-Kuchen"); if (maxLänge > this.kuchenText.Length) maxLänge = this.kuchenText.Length; this.kuchenText = kuchenText.Substring(0, maxLänge); } else this.kuchenText = value; } } Hi zusammen auch wenn es jetzt blöd klingt aber die 2 If ist immer dann false wenn bereits ein kuchentext eingegeben wurde und z.B. die kuchen größe verändert wurde ok so weit steig ich noch durch aber würde es nciht mehr sinn machen die den substring auf die value antad auf den kuchentext zu setzen? damit der möglichtext für den kuchen abgelegt wird Zitieren
Guybrush Threepwood Geschrieben 12. Februar 2009 Geschrieben 12. Februar 2009 Eigentlich macht die zweite if Abfrage vorne und hinten keinen Sinn, denn laut Aufgabenbeschreibung soll der Text einfach gekürzt werden wenn er zu lang ist. Hier wird der neue Wert aber einfach verworfen und mit dem alten Kuchentext weitergearbeitet wenn dieser Fall eintritt. Im Prinzip reicht einfach folgendes: int maxLänge; if (Kuchengröße == 8) maxLänge = 16; else maxLänge = 40; if (value.Length > maxLänge) { this.kuchenText = value.Substring(0, maxLänge); } else this.kuchenText = value; [/PHP] 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.