Taschenrechner funktioniert beim weiterrechnen nicht richtig
-
Das mit dem Debugger. Ich habe ihn schon öfters ausgetestet, aber im Überwachungsfenster zeigt er mir bei einem großen Programm nicht das an was ich brauche und Lokal kenne ich mich nicht so richtig aus.
Aber ich kann das Programm nicht in Einzelschritten durchführen, da ich ja die Buttons für die Zahlen drücken muss. Und er nicht weitermacht wenn ich nichts drücke. Alos kann ich die änderung nicht genau feststellen.
Das mit Double Zweite das ha er mir schon öfters angezeigt, aber es kam nie zu einer richtigen Lösung. Ich habe einfach immer Text2 mit label2.Text ersetzt und das hat es meistens getan.
Ich muss mich wohl nochmal mit dem Dubugger auseinander setzten.
-
Okay ich habe den Debugger jetzt begriffen und mein Problem gelöst.
Danke an alle
-
Ok jetzt habe ich nur ein kleines Problem.
Wie kann ich es machen, dass wenn eine if Bedingung erfüllt ist er automatisch zum Ende springt.
Das Problem ist nämlich, dass er Zahlen doppelt schreibt weil ich viele if Bedingungen habe.
Und eine heißt If (label4.Text.Equals("1))(das es nach dem = drücken ist)
Und eine andere if(label3.Text.Equals("+")Und dadurch wird die Zahl doppelt geschrieben.
Gibt es da irgendein Schlüsselwort?
-
Ja gibt es.
return;
Ohne Paramter übergabe.
Und schon bist Du am Ende der Funktion.
-
Danke das ist genau das was ich gesucht habe.
Jetzt gehts wieder^^
-
Wandernder Mongole schrieb:
Danke das ist genau das was ich gesucht habe.
Jetzt gehts wieder^^
Wenn du gezwungen wirst, mit return aus der If-Verzweigung herauszugehen, ist die If-Verzweigung falsch verschachtelt! Sowas darf niemals vorkommen, daß eine If-Verzweigung mehrere Bedingungen zuläßt!! Mit dem return deckst du nur die fehlerhafte Programmierung zu. Mit einer sauberen Verschachtelung brauchst du niemals ein return:
Verschachtelt:
if (Bedingung1)
{
if (Bedingung2)
{
if (Bedingung3)
{
} //<- endif Bed3
else // von Bed3
{
}
} //<- endif Bed2
else //von Bed2
{
}
} //<- endif Bed1
else // von Bed1
{
}Verschachtelungstiefen kann man auf verschiedene Weise reduzieren, möglicherweise solltest du eine switch Anweisung in die If-Verzweigung einfügen.
switch (wert)
{
case 1:
//Code
break;case 2:
//code
break;default:
//code
break;
}Bei Switch kannst du auch mehrere Bedingungen "durchrutschen" lassen, also sammeln:
...
case 3:
case 4:
case 5:
{
//Anweisungen für case 5, werden für die durchgerutschten 3 und 4 ebenso
// ausgeführt. Es darf dann aber bei 3 und 4 keine einzige Zeile Code stehen!}
Return ist eigentlich fast so schlimm wie goto.
Und beides ist eigentlich niemals erforderlich.
-
pascal2009 schrieb:
Wenn du gezwungen wirst, mit return aus der If-Verzweigung herauszugehen, ist die If-Verzweigung falsch verschachtelt! Sowas darf niemals vorkommen, daß eine If-Verzweigung mehrere Bedingungen zuläßt!! Mit dem return deckst du nur die fehlerhafte Programmierung zu. Mit einer sauberen Verschachtelung brauchst du niemals ein return:
Dummes Zeug was Du da redest...
http://newsgroups.derkeiler.com/Archive/De/de.comp.lang.java/2006-01/msg02785.html
Und benutze mal CodeTags, mein Gott nochmal...Du dum...Mensch...
-
omg schrieb:
pascal2009 schrieb:
Wenn du gezwungen wirst, mit return aus der If-Verzweigung herauszugehen, ist die If-Verzweigung falsch verschachtelt! Sowas darf niemals vorkommen, daß eine If-Verzweigung mehrere Bedingungen zuläßt!! Mit dem return deckst du nur die fehlerhafte Programmierung zu. Mit einer sauberen Verschachtelung brauchst du niemals ein return:
Dummes Zeug was Du da redest...
http://newsgroups.derkeiler.com/Archive/De/de.comp.lang.java/2006-01/msg02785.html
Und benutze mal CodeTags, mein Gott nochmal...Du dum...Mensch...
Hör mal, du Prolet!
Beschimpfen lasse ich mich hier nicht und auch nicht anpöbeln!
Code-Tags sind bei Programmen, wo außer Klammern gerade mal eine Zeile Code drinsteht, völlig verzichtbar.
Und Dummes Zeug laß ich mir auch nicht unterstellen, nur mit einem Link. Verlinken kann jeder, selbst schreiben wäre da angesagt gewesen.
Ist aber gelaufen: sowas wie du steht bei mir auf IGNORE.
-
Im übrigen mal zur Sache zurück:
Gerade in dem verlinkten Beitrag von IGNORE steht genau das, was ich gesagt habe:
Return Anweisungen innnerhalb von Verzweigungen sind schlechte Programmierung, braucht man nicht. Es gibt viele Methoden, die Schachtelungstiefe zu verringern, eine ist in diesem Beispiel von IGNORE aufgeführt, else Anweisungen an Methoden auszulagern. IGNORe hat sich mit dem verlinkten Beitrag also selbst widerlegt und genau dsa bestätigt, was ich zuvor gesagt habe.
ALso Mongole, prüf deinen Code nochmal, es ist immer möglich, ohne return innerhalb von Verzweigungen auszukommen. Wenn du Return benötigst, ist die Verschachtelung logisch falsch.
Pascal
PS Vielleicht sind Sonderfälle wie ein "early return" bei extrem zeitintensiven Anwendungen denkbar. Genau solche wird aber kein Mensch in C# schreiben, sondern in Assembler o.ä.
-
pascal2009 schrieb:
Wenn du gezwungen wirst, mit return aus der If-Verzweigung herauszugehen, ist die If-Verzweigung falsch verschachtelt!
Was Du mit gewzungen meinst weiß ich nicht, generell ist es aber keine Schlechte Idee nach einem If auszusteigen:
if(sender == null) return; sender.Bla(); sender.Blubb(); ToWas(sender);
oder eben
if (!Bedingung1) return; if (!Bedingung2) return; if (!Bedingung3) return; <code> if(!Bedingung1 || !Bedingung2 || !Bedingung3) return; <code> // oder was in der Situation gerade angemessen ist.
pascal2009 schrieb:
Return ist eigentlich fast so schlimm wie goto.
Und beides ist eigentlich niemals erforderlich.int foobar() { int result = 12*10; // und nun ? }
Und wie stufst Du eine Exception ein die man mitten drin wirfst ?
Code-Tags sind bei Programmen, wo außer Klammern gerade mal eine Zeile Code drinsteht, völlig verzichtbar.
Lass mal zählen.
1.... 1.... 1.... 1....
Bei einem Einzeiler ist es durchaus ok den mal ohne Codetags hin zu klatschen. Aber gerade wenn man Verschachtelung zeigen möchte sind CodeTags doch Sinnvoll.
if (Bedingung1) { if (Bedingung2) { if (Bedingung3) { } //<- endif Bed3 else // von Bed3 { } } //<- endif Bed2 else //von Bed2 { } } //<- endif Bed1 else // von Bed1 { }
Lässt sich doch viel einfacher lesen - noch einfacher wenn man auf Verschachtelung so weit wie möglich verzichtet.
-
Knuddlbaer schrieb:
Was Du mit gewzungen meinst weiß ich nicht, generell ist es aber keine Schlechte Idee nach einem If auszusteigen:
if(sender == null) return; sender.Bla(); sender.Blubb(); ToWas(sender);
oder eben
if (!Bedingung1) return; if (!Bedingung2) return; if (!Bedingung3) return;
<code>
Es gibt keine einfachen Antworten für alle Fälle. Es gibt aber Prinzipien für saubere Programmlogik. So darf man meine Aussage verstehen. Ich behaupte nicht, in 100 Prozent der fälle müsse das so sein und es ginge nicht auch anders. Es ist eine Stilfrage.
Und dazu gehört, daß man eine logisch falsch aufgebaute if-Verzweigung nicht durch hineingestreute returns retten sollte, sondern die If-Verzweigung von der Logik her besser überarbeitet. Ein Return als Notstopfen ist nicht dasselbe wie eine Programmierlogik, welche diese return von vornherein einplant.
Nun sind deine Beispiel so wie sie sind zwar völlig in Ordnung, aber ich muß einwenden, wenn man statt:
if (!Bedingung1) return; if (!Bedingung2) return; if (!Bedingung3) return; <code>
dessen schreibt:
if (!Bedingung1) else if (!Bedingung2) else if (!Bedingung3) else <code> // ist else 3 else //else 2 else // else 1
ich nicht sehen kann, daß die Performance schlechter wäre als mit den Returns, obwohl hier kein einziges return vorkommt.
Returns beinhalten auch, daß bei Programmänderungen, wo man vergißt, sie wieder hinzuzufügen, der Code möglicherweise durchrutscht.
Bei saubererer else-Verschachtelung rutscht da nie was durch.
Wird die Verschachtelungstiefe zu unübersichtlich, kann man mit vielen anderen Methoden abhelfen.
Z. B. Ersatz für eine if_Verschachtelung wäre:
int c=(a>=b)? a:b;
Die kann man so untereinander abarbeiten, nur z. B., ohne eine einzige IF-Schleife aufzumachen.
Kommt eben immer auf den Einzelfall an.
Der Einzelfall war hier, daß Mongole durch falsche If-Verschachtelung plötzlich Doppelwerte hatte, Fehler also falsche if-Verschachtelung.
Wäre seine If-Konstruktion richtig, und die return freiwillig, wäre das was anderes. So wird aber eine definitiv falsche If-Verschachtelung mit returns "notrepariert". Das halte ich nicht für guten Stil.
Pascal
-
Für mich hat es in der Hinsicht aber keinen anderen Ausweg gegeben.
Da:
WEnn ich zB Plus drücke im label3 + steht.
Dann auf = drücke steht in label4: 1
WEnn ich nun auf den Button 1 drücke geht er durch die if Abfragen ab: Ob in label3 ein Plus steht.
Ob label4 1 ist.
Ob label4 "" ist.Das benötige ich weil er sonst bei der ersten Rechnung nicht funktioniert.
Wer den Code sehen will. Kann ihn sehen
-
Wandernder Mongole schrieb:
Für mich hat es in der Hinsicht aber keinen anderen Ausweg gegeben.
Wer den Code sehen will. Kann ihn sehen
Es gibt immer einen Ausweg.
Ich bin einigermaßen fit in C-Code, mit C# sieht das im Augenblick noch nicht so toll aus. Und absolut fit in G-Code, aber den kennt hier keiner.
Aber laß mal sehen deinen Code!
Mich beschleicht der Verdacht, daß man den Taschenrechner vielleicht besser grundsätzlich ganz anders hätte programmieren sollen. So ein Verdacht kommt immer, wenn man am Ende nicht mehr weiß, wie man die Events sortieren soll. Ich will damit aber nichts gesagt haben und es gibt hier sicherlich kompetentere Leute in C# als mich.
Pascal
-
Wie du willst.
ICh weiß ich hätte statt dem label ne Textbox nehmen sollen.^^
Bitte nicht erschrecken.^^
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Taschenrechner { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(1); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(1); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(1); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(1); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(1); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(1); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(1); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(1); return; } } if (label3.Text.Equals("*")) {if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(1); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(1); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(1); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(1); return; } } } private void button2_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(2); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(2); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(2); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(2); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(2); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(2); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(2); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(2); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(2); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(2); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(2); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(2); return; } } } private void button3_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(3); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(3); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(3); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(3); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(3); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(3); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(3); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(3); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(3); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(3); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(3); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(3); return; } } } private void button4_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(4); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(4); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(4); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(4); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(4); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(4); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(4); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(4); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(4); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(4); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(4); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(4); return; } } } private void button5_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); label4.Text = "2"; return; } if (label4.Text.Equals("")) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(5); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(5); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(5); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(5); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(5); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(5); return; } } } private void button6_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(6); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(6); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(6); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(6); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(6); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(6); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(6); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(6); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(6); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(6); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(6); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(6); return; } } } private void button7_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(7); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(7); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(7); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(7); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(7); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(7); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(7); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(7); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(7); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(7); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(7); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(7); return; } } } private void button8_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(8); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(8); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(8); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(8); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(8); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(8); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(8); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(8); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(8); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(8); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(8); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(8); return; } } } private void button9_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(9); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(9); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(9); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(9); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(9); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(9); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(9); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(9); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(9); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(9); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(9); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(9); return; } } } private void button15_Click(object sender, EventArgs e) { if (label4.Text.Equals("1")) { label2.Text = ""; label1.Text = ""; string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(0); label4.Text = ""; return; } if (label4.Text.Equals("2")) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(0); return; } if (label3.Text.Equals("")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(0); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(0); return; } } if (label3.Text.Equals("+")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(0); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(0); return; } } if (label3.Text.Equals("-")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(0); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(0); return; } } if (label3.Text.Equals("*")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(0); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(0); return; } } if (label3.Text.Equals("/")) { if (label1.Visible == true) { string Text1 = label1.Text; label1.Text = Text1 + Convert.ToString(0); return; } if (label2.Visible == true) { string Text2 = label2.Text; label2.Text = Text2 + Convert.ToString(0); return; } } } private void button10_Click(object sender, EventArgs e) { if(label4.Text.Equals("1")) {label4.Text = "2"; label3.Text = "+"; label2.Text = ""; label1.Hide(); label2.Show(); } else label3.Text = "+"; label2.Text = ""; label1.Hide(); label2.Show(); } private void button11_Click(object sender, EventArgs e) { if(label4.Text.Equals("1")) {label4.Text = "2"; label3.Text = "-"; label2.Text = ""; label1.Hide(); label2.Show(); } else label3.Text = "-"; label2.Text = ""; label1.Hide(); label2.Show(); } private void button12_Click(object sender, EventArgs e) { string Text1; string Text2 = label2.Text; Text1 = label1.Text; string Ergebniss; if (label2.Text.Equals("")) MessageBox.Show("Keine Variable gegeben um den Rechenvorgang auszuführen"); if (label3.Text.Equals("-")) {double Ende; double Erste = Convert.ToDouble(Text1); double Zweite = Convert.ToDouble(Text2); Ende = (Erste - Zweite); Ergebniss = Convert.ToString(Ende); label1.Text = Ergebniss; label2.Hide(); label2.Text = ""; label1.Show(); label4.Text = "1"; } if (label3.Text.Equals("+")) { double Ende; double Erste = Convert.ToDouble(Text1); double Zweite = Convert.ToDouble(Text2); Ende = Erste + Zweite; Ergebniss = Convert.ToString(Ende); label1.Text = Ergebniss; label2.Hide(); label1.Show(); label4.Text = "1"; } if (label3.Text.Equals("*")) { double Ende; double Erste = Convert.ToDouble(Text1); double Zweite = Convert.ToDouble(Text2); Ende = Erste * Zweite; Ergebniss = Convert.ToString(Ende); label1.Text = Ergebniss; label2.Hide(); label1.Show(); label4.Text = "1"; } if (label3.Text.Equals("/")) { double Ende; double Erste = Convert.ToDouble(Text1); double Zweite = Convert.ToDouble(Text2); Ende = (Erste / Zweite); Ergebniss = Convert.ToString(Ende); label1.Text = Ergebniss; label2.Hide(); label1.Show(); label4.Text = "1"; } } private void button13_Click(object sender, EventArgs e) { if(label4.Text.Equals("1")) {label4.Text = "2"; label3.Text = "*"; label2.Text = ""; label1.Hide(); label2.Show(); } else label3.Text = "*"; label2.Text = ""; label1.Hide(); label2.Show(); } private void button14_Click(object sender, EventArgs e) { if(label4.Text.Equals("1")) {label4.Text = "2"; label3.Text = "/"; label2.Text = ""; label1.Hide(); label2.Show(); } else label3.Text = "/"; label1.Hide(); label2.Text = ""; label2.Show(); } private void Form1_Load(object sender, EventArgs e) { } private void button16_Click(object sender, EventArgs e) { label1.Text = ""; label2.Text = ""; label3.Text = ""; label4.Text = ""; } private void button17_Click(object sender, EventArgs e) { double Wurzel; double Zahl = Convert.ToDouble(label1.Text); Wurzel = Math.Sqrt(Zahl); string Ergebniss = Convert.ToString(Wurzel); label1.Text = Ergebniss; } private void button18_Click(object sender, EventArgs e) { if (label1.Visible) { string Text = label1.Text; double Eins = Convert.ToDouble(label1.Text); double Ergbniss = Math.Pow(Eins, 2); string Ende = Convert.ToString(Ergbniss); label1.Text = Ende; } if(label2.Visible) { string Text = label2.Text; double Eins = Convert.ToDouble(label2.Text); double Ergbniss = Math.Pow(Eins, 2); string Ende = Convert.ToString(Ergbniss); label2.Text = Ende; } } } }
Das ist er fürs erste. Mein Prototyp.
Es kommen noch hocch 3 und Textboxen dazu
-
pascal2009 schrieb:
Nun sind deine Beispiel so wie sie sind zwar völlig in Ordnung, aber ich muß einwenden, wenn man statt:
if (!Bedingung1) return; if (!Bedingung2) return; if (!Bedingung3) return; <code>
dessen schreibt:
if (!Bedingung1) else if (!Bedingung2) else if (!Bedingung3) else <code> // ist else 3 else //else 2 else // else 1
sollte man die Grundlagen noch mal angehen. Der Code macht nicht das gleiche!
ich nicht sehen kann, daß die Performance schlechter wäre als mit den Returns, obwohl hier kein einziges return vorkommt.
Returns beinhalten auch, daß bei Programmänderungen, wo man vergißt, sie wieder hinzuzufügen, der Code möglicherweise durchrutscht.
Bei saubererer else-Verschachtelung rutscht da nie was durch.
Dein Code entspricht nicht der flachen Vorgabe. Hier solltest Du erst einmal wirklich nachdenken bevor Du Deine Aussagen so stehen lässt.
Ob man Schachtelt oder nicht ist durchaus eine Stielfrage, allerdings kann man bei einer flachen Variante den Austiegspunkt sofort erkennen. Verschachtelungen müssen komplett gelesen werden.
Schau Dir die Beispiele. Ich denke bei der Flachen wird sofort klar was passiert. Bei der Verschachtelung hast du schon völlig falsch angesetzt. [stichel}(Doch nicht so einfach? ;o)[/stichel}
-
ALso bei dem Code kann ich nicht helfen, dafür reichen meine C# Kenntnisse nicht aus!
Einen Taschenrechner in C würde ich als ineinandergeschachtelte Schleifen programmieren, und die Auswertung auf Funktionen (in C# Methoden) auslagern, das wäre ein sehr kurzer Code, und nicht sequentiell, sondern geschachtelt. Das wäre nicht mal ein Drittel von dem Code, den ich bis jetzt von dir zu dem taschenrechner gesehen habe.
Tut mir leid, aber zu dem C# Konstrukt kann ich keinen Kommentar abgeben. Ich hab nur den Verdacht, daß man das viel, viel kürzer codieren könnte.
Ein Taschenrechner ist eine ganz banale Angelegenheit, der rechtfertigt doch nicht soviel Code, war mein erster Gedanke.Wie gesagt aber C# ist noch zu frisch. Vielleicht helfen dir andere weiter.
Pascal
-
Knuddlbaer schrieb:
Ob man Schachtelt oder nicht ist durchaus eine Stielfrage, allerdings kann man bei einer flachen Variante den Austiegspunkt sofort erkennen. Verschachtelungen müssen komplett gelesen werden.
Schau Dir die Beispiele. Ich denke bei der Flachen wird sofort klar was passiert. Bei der Verschachtelung hast du schon völlig falsch angesetzt. [stichel}(Doch nicht so einfach? ;o)[/stichel}
Wenn du mit if und return arbeitest, eine flache Struktur, wie du sagst, nur der Übersicht wegen, hast du eine Struktur, die eigentlich keine Verzweigung rechtfertigt. Das ist entweder eine solche Struktur:
int c=(a>=b)? a:b;
die du unnötigerweise in eine if_Abfrage bringst, oder es ist eine switch-artige struktur, wofür du als formale Hülse eine If-Abfrage bringst.
Das leuchtet mir alles nicht ein, daß sowas sauber sein soll. Deine Art von den flachen if-returns könnte man zuvor in einen int-Wert umformen und als switch laufen lassen, das sind keine Verzweigungen, sondern das ist IF-Pseudo-Code. Wenn er so gewollt ist ok, trotzdem SCHLECHTER STIL.
Die ganzen Verzweigungen stehen ja immer am Ende der Vorüberlegung. Man kann alle Verzweigungen bevor es soweit kommt auch immer anders überlegen.
Es gibt dutzende Möglichkeiten, tiefe if-Verschachtelungen (da sind wir uns einig, daß die n icht einfach zu lesen bzw. zu handeln sind) zu vermeiden,
tiefe if-Verschachtelungen sind eigentlich der Beweis, daß das Problem
IM VORFELD
schlecht überlegt wurde.
Und sich dann mit Pseudy-Ifs a la
if (bedingung) ...
returnrauszuretten, läßt sich meiner Meinung nach in jedem Einzelfall beweisen, daß man das ohne return besser lösen könnte, aber nicht am Ende, sondern ausgehend von der Anfangsüberlegung. Tiefe Verschachtelungen sind möglicherweise ein Zeichen von falscher Organisation der Programmlogik, da trifft es dann, was zuvor versäumt wurde (mehr Methoden und Funktionen), alles aufeinander.
Return ist <taktisch> für die schnelle Nummer, ein Ausräumer, Return ist <strategisch> kein guter Beweis für tiefsitzende Logik, sondern eher für versäumte Logik im Vorfeld. Strategisch gut positionierte Programmlogik benötigt keine tief verschachtelten IF-Schleifen.
Pascal
-
Soviel Code wollte ich eigentlich auch nicht machen.
Aber die ganzen if Bedingungen.
Jede Zahl ist bei mir ca 50 Zeilen lang.
Aber es wiederholt sich recht viel.
-
-
Wandernder Mongole schrieb:
Soviel Code wollte ich eigentlich auch nicht machen.
Aber die ganzen if Bedingungen.
Jede Zahl ist bei mir ca 50 Zeilen lang.
Aber es wiederholt sich recht viel.Ich hab keine zeit, mich damit wirklich zu beschäftigen.
Wenn ich aber vor meinem geistigen Auge einen Taschenrechner sehe, sehe ich 3-4 ineinander verschachtelte Schleifen. Die äußere läuft auf Abbruchbedingung = Taschenrechner aus, die zweite läuft auf die gewählte rechenoperation, die dritte liest die Zahlenwerte von der ersten Nummer ein, und anschließend die Zahlenwerte von der zweiten Nummer. Diese sind sequentiell innheralb einer Schleife unterzubringen! Da die auf einer Ebene laufen, dürfen die nicht verschachtelt werden! Nur für besondere Rechenoperationen wär vielleicht noch Schleife 4 nötig, wie wissenschaftlicher Taschenrechner. Egal wieviele Ziffern eingegeben werden, es gibt keine Programmzeile mehr bei 5 Ziffern oder 5000 Ziffern!
Bei einem ersten Blick auf deinen Code habe ich den Verdacht, du hängst die Eingabefelder sequentiell aneinander, ohne sie zu schachteln. Also mit 10 Nummern hast du mehr Code als mit 3 Nummern.
Wenn es so wäre, wäre das nicht nur kein guter, sondern ein saumäßiger Algorithmus, um einen so banalen Sachverhalt wie einen taschenrechner zu programmieren. Du solltest wohl eher, wenn es so wäre, deine Programmstruktur völlig umkrempeln anstatt dieses Problem mit der if-Verzweigung überhaupt noch weiter zu beachten. Wenn du das vernünftig programmierst, entfällt das als gegenstandslos.
Anders gesagt, wenn das so wäre, hättest du kein Problem mit dem if, sondern das if wäre ein Hinweis auf falschen Algorithmus. Insbesondere wenn es so wäre, wäre das Arbeiten mit Notstopfen return nicht nur schlimm, sondern verheerend.
Pascal