Zum Inhalt springen

C# Übungsprogramm, verstehe if Anweisung nicht


MidnightRun

Empfohlene Beiträge

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 :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 !

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von unbenannt
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen


        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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...