Entwickler-Ecke
C# - Die Sprache - Mein erstes Prog der Taschenrechner
ilwaka - Mi 31.12.08 14:27
Titel: Mein erstes Prog der Taschenrechner
Ich habe gestern Abend aus Langeweile mit dem Guide to C# angefangen und dann habe ich heute morgen
einen kleinen Taschenrechner programmiert.
Ihr könnt euch den ja mal angucken und was dazu sagen.
Welche C# Tutorials könnt ihr mir noch empfehlen.
Und ich wollte einem Freund das schicken aber der konnte das nicht starten.Er hatte sich extra .net Framework geholt.Was kann schief gelaufen sein.
P.S. Quellcode liegt in der .rar datei
ilwaka - Mi 31.12.08 15:08
genau genommen abreite ich im moment mit SharpDevelop.
Das hab ich im Internet gefunden
ich werde im verlaufe des heutigen tages noch eine(ige) funktion(nen) einführen z.B. quadrat zahlen .
oder kannst du mir sogar sagen wo ich das Installer Programm herkriegen kann welches das macht
jaenicke - Mi 31.12.08 15:31
Welche Version bei SharpDevelop benötigt wird, weiß ich leider nicht, und ein dazu passendes Setupprogramm kenne ich auch nicht, denn ich habe das Programm noch nie benutzt.
Irgendwo kann man dort vermutlich das Zielframework einstellen, und dessen Runtime wird auch benötigt. Aber dazu kann sicher jemand anderes etwas sagen. ;-)
Was mir bei deinem Rechner aufgefallen ist: So wie du es jetzt machst gehst du davon aus, dass immer eine gültige Zahl eingegeben wird. Tut man das nicht, stürzt das Programm ab. Es gibt auch TryParse ;-).
ilwaka - Mi 31.12.08 15:38
ok.Wie mache ich das dann mit Tryparse. Und wie stell ich ein was er macht wenn es nicht klappt
thx
P.s. ok hab die option für das ziel framework gefunden...geht nur bis 2.0
hab mir jetzt mal Visual C# 2008 geholt. Mal gucken ob ich damit klarkomme :D
JüTho - Mi 31.12.08 15:51
Wie wäre es mit etwas mehr Eigeninitiative?
#D bietet den
Wix Installer an, siehe
Sharp Develop Community [
http://community.sharpdevelop.net/forums/] und die dortige Suchfunktion.
Das ist doch eine sehr grundlegende Frage "Wie mach ich das ..."
ilwaka hat folgendes geschrieben : |
ok.Wie mache ich das dann mit Tryparse. Und wie stell ich ein was er macht wenn es nicht klappt |
Entweder Du markierst im
Code-Editor das Wort und drückst
F1, oder Du schaust direkt in
SDK-Doku/MSDN im
Index nach. Zu jeder Klasse und allen Eigenschaften, Methoden, Ereignissen gibt es Erläuterungen und sehr viele Beispiele. Dort findest Du für solche Fragen schneller Antworten, als wenn Du in einem Forum eine Frage stellst und auf Antworten wartest.
ilwaka hat folgendes geschrieben : |
P.s. ok hab die option für das ziel framework gefunden...geht nur bis 2.0 |
#D Version 3 geht bis NET 3.5, ist aber noch in der Beta-Phase.
Für einen Taschenrechner brauchst Du "höher als 2.0" aber nur dann, wenn Du mit WPF arbeitest.
Gruß und Frohes Neues Jahr! Jürgen
ilwaka - Mi 31.12.08 16:16
JüTho hat folgendes geschrieben : |
Wie wäre es mit etwas mehr Eigeninitiative?
|
hast ja recht :D
ok ich guck mal wie ich damit klarkomme.
Also ich versuche es mit Tryparse umzuwandeln und kriege nen wert zurück?und denn checke ich dann darauf ob es eine gültige int32 zahl ist.Ist das so richtig verstanden?
JüTho - Mi 31.12.08 17:19
ilwaka hat folgendes geschrieben : |
ok ich guck mal wie ich damit klarkomme. |
Offensichtlich hast Du immer noch keine Lust, selbst in der
SDK-Doku/MSDN nachzuschauen. Sonst könntest Du nicht so etwas schreiben:
ilwaka hat folgendes geschrieben : |
Also ich versuche es mit Tryparse umzuwandeln und kriege nen wert zurück?und denn checke ich dann darauf ob es eine gültige int32 zahl ist.Ist das so richtig verstanden? |
Ich finde nämlich so eine Erläuterung:
MSDN hat folgendes geschrieben: |
Int32.TryParse-Methode
Konvertiert die Zeichenfolgendarstellung einer Zahl in die entsprechende 32-Bit-Ganzzahl mit Vorzeichen. Ein Rückgabewert gibt an, ob die Operation erfolgreich abgeschlossen wurde. |
Ich hoffe, Du erkennst die Unterschiede zwischen Deiner Beschreibung und der MSDN-Erläuterung.
Wehe, Du versuchst damit so etwas:
C#-Quelltext
1: 2: 3: 4:
| int result = int.TryParse(InputTextBox.Text); if (result is int) { } |
Dann fasse ich alles als Silvesterscherz auf.
Frohes Neues Jahr! Jürgen
ilwaka - Mi 31.12.08 17:29
also ich habs noch nicht ganz verstanden ..ich versuchs nochmal
JüTho - Mi 31.12.08 17:57
Meine Güte! (Dieser Spruch bezog sich auf Deinen Versuch, denn Du inzwischen wieder gelöscht hast.) Ich kopiere mal die relevanten Zeilen aus dem Beispiel in der
SDK-Doku:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| bool result; result = Int32.TryParse("3", out int32Val); Show(result, "Int32", int32Val.ToString());
protected static void Show(bool parseResult, string typeName, string parseValue) { ... }
Parse for Int32 = 3 |
Das übliche Vorgehen lautet:
C#-Quelltext
1: 2: 3: 4: 5:
| int result = 0; string input = "irgendwas"; if (int.TryParse(input, out result)) { } |
Eigentlich wollte ich Dir konkret helfen und habe mir Deinen Code heruntergeladen. Ich weiß nicht, ob es sinnvoll ist, auf dieser Grundlage Kommentare abzugeben. Andererseits: wenn Du sonst keine Kontakte hast, musst Du freilich auf diesem Weg fragen. Also hier einige Anmerkungen (ohne Anspruch auf Vollständigkeit, die Reihenfolge hat nichts mit der Bedeutung zu tun):
- Eine Quelldatei hat üblicherweise die Endung ".cs" und nicht ".txt.txt". Wie das bloß entstanden ist...
- Anstelle von Console.Write gibt es auch Console.WriteLine; damit ist ein Zeilenende automatisch enthalten.
- Wenn in einem String das Zeilenende eingegeben werden soll, ist Environment.NewLine besser, weil das immer dem System entspricht. Programme variieren immer wieder zwischen "\n" und "\n\r" und "\r\n", und das kann Prüfungen verwirren.
- Ich würde einen Taschenrechner lieber mit WinForms erstellen; da kann man mehr lernen und hat bessere Eingaben. Aber wenn schon Console, dann schöner: Im ersten Versuch würde ich eine Eingabe "Zahl1 - Rechenzeichen - Zahl2" erwarten.
- Für das Rechenzeichen wäre die Eingabe eines Zeichens durch ReadKey sinnvoller. Dieses Zeichen kannst Du in einer eigenen char-Variablen zwischenspeichern und hast es später (insbesondere zur Ausgabe) wieder zur Verfügung.
- Zu Deiner Variante mit Parse und dem "Ersatz" durch TryParse haben Sebastian und ich schon einiges gesagt.
- Die wichtigste Verbesserung des Programms wären Deine vier if-Abfragen: Worin unterscheiden sich diese Zweige denn? Doch lediglich in der Ausführung der Rechnung (ein kleiner Sonderfall ist die Division, aber auch das bekommt man hin). Das ist doch die ideale Situation für eine Fallunterscheidung, in C# mit switch-Anweisung bezeichnet.
- Diese Art einer double-Division empfinde ich als ziemlich abartig:
Quelltext
1:
| Console.WriteLine(dividend / divisor = ganzzahl + "," + Dezimalanteil) |
Du hast doch schon double-Variablen vorgesehen, dann benutze diese doch auch:
C#-Quelltext
1:
| double ergebnis = (double)zahl1 / (double)zahl2; |
Ich überlasse es Dir, diese Anmerkungen umzusetzen.
Gruß und Frohes Neues Jahr! Jürgen
PS 1. Bitte markiere Code als solchen, das liest sich besser: Unter "Bereiche" das C# auswählen und mit dem Plus-Button kennzeichnen.
PS 2. In der Regel habe ich keine Lust, Quelldateien herunterzuladen, zu extrahieren und in einem weiteren Fenster zu öffnen, wenn ich hier um eine Auskunft gebeten werde. Dazu kann man Code hier in die Fragen einbeziehen (und als solchen markieren). Das ist fast immer praktischer, erst recht, wenn es nur so wenige Zeilen sind.
PS 3. Dieses Programm hat in der Tat nichts mit einer speziellen NET-Version zu tun. Es muss also nur darauf geachtet werden, dass der Ziel-Rechner dasselbe NET hat wie der Programmierer. Vorschlag: #D Version 2.2 benutzen, Ziel 2.0 angeben und bei Deinem Freund auch 2.0 Runtime installieren (wie gesagt, es sei denn, Du willst mit WPF arbeiten; dann ist #D 3.x oder Visual Studio 2008 besser).
ilwaka - Mi 31.12.08 18:09
Ok vielen Dank
War ja nur mein erster Versuch.
Das mit Tryparse habe ich inzwischen rausbekommen und es klappt auch.
Ich habs nicht mit WinForms gemacht aus 2 Gründen.1.Bin ich im Tutorial noch nicht so weit :D 2. Wars ja nur ein Test für den Code.
Ich hab jetzt Visual Studio 2008.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| using System; public class Rechner { public static void Main() { Console.Write("Dies ist ilwakas Rechner v.0.2\n"); Console.Write("\n"); Console.Write("\n"); Console.Write("Wählen sie ihre Rechenart\n"); Console.Write("(1)+ Plus\n"); Console.Write("(2)- Minus\n"); Console.Write("(3)* Mal\n"); Console.Write("(4)/ Durch\n"); string rart; rart = (Console.ReadLine()); int art; bool result = Int32.TryParse(rart, out art); if (result) { Console.Write("Geben sie Zahl 1 ein: "); string zahl1; zahl1 = (Console.ReadLine()); int number1; bool result1 = Int32.TryParse(zahl1, out number1); if (result1) { Console.Write("\nGeben sie Zahl 2 ein: "); string zahl2; zahl2 = (Console.ReadLine()); int number2; bool result3 = Int32.TryParse(zahl2, out number2); if (result3) {
if (art == 1) { int Ergebnis; Ergebnis = number1 + number2; Console.Write("" + zahl1 + "+" + zahl2 + "=" + Ergebnis + "\n"); Console.Write("Danke für die Benutzung meines Rechners"); }
if (art == 2) { int Ergebnis; Ergebnis = number1 - number2; Console.Write("" + zahl1 + "-" + zahl2 + "=" + Ergebnis + "\n"); Console.Write("Danke für die Benutzung meines Rechners"); } if (art == 3) { int Ergebnis; Ergebnis = number1 * number2; Console.Write("" + zahl1 + "*" + zahl2 + "=" + Ergebnis + "\n"); Console.Write("Danke für die Benutzung meines Rechners"); } if (art == 4) { double Ergebnis; double ergebnis2; Ergebnis = number1 / number2; ergebnis2 = number1 % number2; Console.Write("" + zahl1 + "/" + zahl2 + "=" + Ergebnis + "," + ergebnis2 + "\n "); Console.Write("Danke für die Benutzung meines Rechners");
} } } } Console.Write("Falsche Eingabe. Neustarten \n"); Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");
Console.ReadKey(); } } |
Das ist jetzt der aktuelle Code.
Ja sag ich mal danke für die tipps.
ilwaka - Mi 31.12.08 18:40
:D
So schlimm war ja nicht ich hätte ja mal online suchen können aber der "trick" mit F1 ist echt gut.
Das Beispiel war so lang deswegen hab ich so lange gebraucht um das zu verstehen.
ilwaka - Mi 31.12.08 21:34
so. jetzt habe ich das programm überarbeitet.
man gibt erst zahl1 ein dann rechenzeichen und dann zahl 2 :D
ich hab die vier if durch switch ersetzt.
Und ich habe Tryparse integriet sodass sich das programm planmäßig beendet wenn man z.b a eingibt
ich nenne das ganze jetzt v1.0 :D
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91:
| using System; public class Rechner { public static void Main() { Console.Write("Dies ist ilwakas Rechner v.1.0\n"); Console.Write("\n"); Console.Write("\n"); Console.Write("Geben sie Zahl1 ein:");
string zahl1; zahl1 = (Console.ReadLine()); int number1; bool result = Int32.TryParse(zahl1, out number1); if (result) { Console.Write("Geben sie das Rechenzeichen ein \n"); Console.WriteLine("(1)+ Addieren"); Console.WriteLine("(2)-Subtrahieren"); Console.WriteLine("(3)+ Multiplizieren"); Console.WriteLine("(4)Dividieren");
string rart; rart = (Console.ReadLine()); int art; bool result1 = Int32.TryParse(rart, out art); if (result1) { Console.Write("\nGeben sie Zahl 2 ein: "); string zahl2; zahl2 = (Console.ReadLine()); int number2; bool result3 = Int32.TryParse(zahl2, out number2); if (result3) {
switch (art ) { case (1): int Ergebnis; Ergebnis = number1 + number2; Console.Write("" + zahl1 + "+" + zahl2 + "=" + Ergebnis + "\n"); Console.Write("Danke für die Benutzung meines Rechners"); break;
case (2): Ergebnis = number1 - number2; Console.Write("" + zahl1 + "-" + zahl2 + "=" + Ergebnis + "\n"); Console.Write("Danke für die Benutzung meines Rechners"); break; case (3): Ergebnis = number1 * number2; Console.Write("" + zahl1 + "*" + zahl2 + "=" + Ergebnis + "\n"); Console.Write("Danke für die Benutzung meines Rechners"); break; case (4):
double ergebnis = (double)number1 / (double)number2; Console.Write("" + zahl1 + "/" + zahl2 + "=" + ergebnis + "" + "\n "); Console.Write("Danke für die Benutzung meines Rechners"); break;
} } } } Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");
Console.ReadKey(); } } |
JüTho - Do 01.01.09 11:26
Hallo,
na, das sieht ja schon etwas besser aus. Noch ein paar weitere Vorschläge (als Konkretisierung meiner früheren Hinweise):
Zitat: |
Für das Rechenzeichen wäre die Eingabe eines Zeichens durch ReadKey sinnvoller. |
C#-Quelltext
1: 2:
| char art = Console.ReadKey().KeyChar; |
Zitat: |
ideale Situation für eine Fallunterscheidung: Worin unterscheiden sich diese Zweige denn? |
Das "Danke" wird viermal geschrieben, das Ergebnis sieht (abgesehen vom Rechenzeichen und dem double-Ergebnis der Division) ebenfalls fast identisch aus. Diese Zeilen gehören also nicht innerhalb der switch-Anweisung, sondern einheitlich dahinter. Aus diesem Grund deklariere ich das ergebnis einheitlich als double:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| double ergebnis = 0; bool possible = true; string message = String.Empty; switch(art) { case '+': ergebnis = number1 + number2; break; case '/': if (number2 == 0) { possible = false; message = "Division durch Null unzulässig"; } else { ergebnis = (double)number1 / double(number2); } break; default: possible = false; message = "Rechenzeichen ist nicht zulässig"; break; } if (possible) { Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, ergebnis); } else { Console.WriteLine(message); } Console.WriteLine("Danke schön"); |
Bitte beachte auch die Variante von
WriteLine und die Unterscheidung durch
possible: Dann kannst Du alle Fehlermeldungen zusammenfassen. Diese WriteLine-Variante entspricht
String.Format; in den geschweiften Klammern sind auch Format-Angaben (wie die Anzahl der Dezimalstellen) möglich. Die
Division durch Null fehlte bisher überhaupt. Unnötige Wiederholungen sind verschwunden.
Gruß und Frohes Neues Jahr! Jürgen
PS. An den WriteLine-Varianten siehst Du sehr schön, dass Du Dir das "Stöbern" in der
SDK-Doku/MSDN/Hilfe schnell angewöhnen solltest. Dadurch erhältst Du viele Hinweise, was alles noch möglich ist.
ilwaka - Do 01.01.09 15:54
ok ich habe deinen code jetzt überall eingebaut und getest..klappt alles.
Vielen Dank
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103:
| using System; public class Rechner { public static void Main() { Console.Write("Dies ist ilwakas Rechner v.1.0\n"); Console.Write("\n"); Console.Write("\n"); Console.Write("Geben sie Zahl1 ein:");
string zahl1; zahl1 = (Console.ReadLine()); int number1; bool result = Int32.TryParse(zahl1, out number1); if (result) { Console.Write("Geben sie das Rechenzeichen ein \n"); Console.WriteLine("+ Addieren"); Console.WriteLine("-Subtrahieren"); Console.WriteLine("* Multiplizieren"); Console.WriteLine("/ Dividieren"); char art = Console.ReadKey().KeyChar;
Console.Write("\nGeben sie Zahl 2 ein: "); string zahl2; zahl2 = (Console.ReadLine()); int number2; bool result3 = Int32.TryParse(zahl2, out number2); if (result3) { double Ergebnis = 0; bool possible = true; string message = String.Empty; switch (art) { case '+':
Ergebnis = number1 + number2;
break;
case '-':
Ergebnis = number1 - number2;
break;
case '*':
Ergebnis = number1 * number2;
break; case '/':
if (number2 == 0) { possible = false; message = "Division durch Null unzulässig"; } else { Ergebnis = (double)number1 / (double)(number2); } break; default: possible = false; message = "Rechenzeichen ist nicht zulässig"; break; } if (possible) { Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, Ergebnis); } else { Console.WriteLine(message); }
}
}
Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");
Console.ReadKey();
} } |
JüTho - Do 01.01.09 16:55
Ja, so geht es!
Die nächsten Schritte zur Verbesserung:
1. Die Variablen result und result3 werden ebenfalls durch possible ersetzt mit einem passenden message-String. (Die Deklarationen und die Reihenfolge der if-Abfragen müssen dann angepasst werden.)
2. Als Zahlen sind double statt int zugelassen.
3. Der Arbeitsablauf wird in eine Schleife eingebaut. Das Programm wird nicht automatisch nach jeder Rechnung beendet, sondern erst durch Eingabe von Ctrl-C (das zu prüfen ist in der Console etwas schwieriger).
Weiterhin viel Erfolg! Jürgen
ilwaka - Do 01.01.09 17:27
also
den 2. punkt hab ich erledgit
ich bin mir nicht ganz sicher aber ich glaub ich hab jetzt punkt 1 fertig.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| using System; public class Rechner { public static void Main() { Console.Write("Dies ist ilwakas Rechner v.1.0\n"); Console.Write("\n"); Console.Write("\n"); Console.Write("Geben sie Zahl1 ein:");
string zahl1; zahl1 = (Console.ReadLine()); double number1; bool possible = Double.TryParse(zahl1, out number1); if (possible) { Console.Write("Geben sie das Rechenzeichen ein \n"); Console.WriteLine("+ Addieren"); Console.WriteLine("-Subtrahieren"); Console.WriteLine("* Multiplizieren"); Console.WriteLine("/ Dividieren"); char art = Console.ReadKey().KeyChar;
Console.Write("\nGeben sie Zahl 2 ein: "); string zahl2; zahl2 = (Console.ReadLine()); double number2; possible = Double.TryParse(zahl2, out number2); if (possible) { double Ergebnis = 0;
string message = String.Empty; switch (art) { case '+':
Ergebnis = number1 + number2;
break;
case '-':
Ergebnis = number1 - number2;
break;
case '*':
Ergebnis = number1 * number2;
break; case '/':
if (number2 == 0) { possible = false; message = "Division durch Null unzulässig"; } else { Ergebnis = (double)number1 / (double)(number2); } break; default: possible = false; message = "Rechenzeichen ist nicht zulässig"; break; } if (possible) { Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, Ergebnis); } else { Console.WriteLine(message); }
} else { Console.Write("Zahl2 ungültig"); } } else { Console.Write("Zahl 1 nicht gültig"); } Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");
Console.ReadKey();
} } |
vll kann ich nach jeden rechendurchgang sagen:taste drücken um weiterzumachen,E(xit)drücken um zu beenden.
JüTho - Do 01.01.09 18:40
Hallo,
ilwaka hat folgendes geschrieben : |
den 2. punkt hab ich erledgit |
Es sieht so aus. Aber probier mal ein paar Varianten aus mit Komma und Dezimalpunkt; mal sehen, was dann passiert.
ilwaka hat folgendes geschrieben : |
ich bin mir nicht ganz sicher aber ich glaub ich hab jetzt punkt 1 fertig. |
Aber nicht sehr schön. Du hast noch viele einzelne Write-Befehle, die durch WriteLine(message) ersetzt werden können.
Diesen Code-Teil brauchst Du wirklich nicht jedesmal zu kopieren, die using-Befehle nur dann, wenn sie wichtig sind.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| using System; |
ilwaka hat folgendes geschrieben : |
vll kann ich nach jeden rechendurchgang sagen:taste drücken um weiterzumachen,E(xit)drücken um zu beenden. |
Die Taste ist natürlich ziemlich gleichgültig; aber wie wird es gemacht, dass die nächsten Abfragen folgen?
Viel Erfolg! Jürgen
ilwaka - Do 01.01.09 18:57
was soll den mit komma und dezimal punkt passieren.Klappt bei mir beides
ich würd sagen mit so einer while schleife...
die hab ich jetzt aus guide to C# kopiert aber so könnte es gehen oder?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113:
| public class Rechner { public static void Main() { Console.Write("Dies ist ilwakas Rechner v.1.0\n"); Console.Write("\n"); Console.Write("\n"); bool neuerechnung = true; while (neuerechnung) { Console.Clear(); Console.Write("Geben sie Zahl1 ein:");
string zahl1; zahl1 = (Console.ReadLine()); double number1; bool possible = Double.TryParse(zahl1, out number1); if (possible) { Console.Write("Geben sie das Rechenzeichen ein \n"); Console.WriteLine("+ Addieren"); Console.WriteLine("-Subtrahieren"); Console.WriteLine("* Multiplizieren"); Console.WriteLine("/ Dividieren"); char art = Console.ReadKey().KeyChar;
Console.Write("\nGeben sie Zahl 2 ein: "); string zahl2; zahl2 = (Console.ReadLine()); double number2;
possible = Double.TryParse(zahl2, out number2); if (possible) { double Ergebnis = 0;
string message = String.Empty; switch (art) { case '+':
Ergebnis = number1 + number2;
break;
case '-':
Ergebnis = number1 - number2;
break;
case '*':
Ergebnis = number1 * number2;
break; case '/':
if (number2 == 0) { possible = false; message = "Division durch Null unzulässig"; } else { Ergebnis = (double)number1 / (double)(number2); } break; default: possible = false; message = "Rechenzeichen ist nicht zulässig"; break; } if (possible) { Console.WriteLine("{0} {1} {2} = {3}", number1, art, number2, Ergebnis); } else { Console.WriteLine(message); }
} else { Console.Write("Zahl2 ungültig"); } } else { Console.Write("Zahl 1 nicht gültig"); } Console.Write("\n Neue Rechnung ausführen (J)a/(N)ein"); if (Console.ReadKey().KeyChar != 'j')
{ neuerechnung = false; } } Console.WriteLine("\n \n \n" + "Taste druecken um zu beenden");
Console.ReadKey();
} } |
so jetzt hab ich die while schleife eingefügt.
Hab sogar gemacht das der Bildschrim vorher gesäubert wird :D
jetzt muss ich mir nur noch was mit den messages überlegen
jaenicke - Do 01.01.09 19:09
Dies ist eine Möglichkeit, ja. ;-)
JüTho - Do 01.01.09 19:12
ilwaka hat folgendes geschrieben : |
was soll den mit komma und dezimal punkt passieren.Klappt bei mir beides |
Auf einem "deutschen" Rechner kann eine Eingabe wie "12.345" als 12345 (12 Tausend) interpretiert werden statt als 12 Komma 345.
ilwaka hat folgendes geschrieben : |
ich würd sagen mit so einer while schleife...
die hab ich jetzt aus guide to C# kopiert aber so könnte es gehen |
Das ist eine der vielen Möglichkeiten.
ilwaka hat folgendes geschrieben : |
oder? |
Bitte selbst ausprobieren!
Hast Du eigentlich schon den
Debugger benutzt?
Gruß Jürgen
ilwaka - Do 01.01.09 20:59
JüTho hat folgendes geschrieben : |
ilwaka hat folgendes geschrieben : | was soll den mit komma und dezimal punkt passieren.Klappt bei mir beides |
Auf einem "deutschen" Rechner kann eine Eingabe wie "12.345" als 12345 (12 Tausend) interpretiert werden statt als 12 Komma 345.
|
Ja bei mir geht das ..
Das mit der Schleife hab ich auch probiert und der Debugger läuft automatisch wenn ich das Programm kompiliere.
Kha - Do 01.01.09 21:18
JüTho hat folgendes geschrieben : |
Das Programm wird nicht automatisch nach jeder Rechnung beendet, sondern erst durch Eingabe von Ctrl-C (das zu prüfen ist in der Console etwas schwieriger). |
Ganz im Gegenteil, das sollte in der Konsole schon ohne eigenes Zutun funktionieren :zwinker: .
Ich bin mir gerade nicht sicher, ob ich ReadKey gut finde oder nicht, da die Eingabe damit sofort angenommen wird und der User sie nicht revidieren kann. Gut, es gibt Schlimmeres ;) .
Zitat: |
C#-Quelltext 1: 2: 3: 4: 5:
| string zahl2; zahl2 = (Console.ReadLine()); double number2;
possible = Double.TryParse(zahl2, out number2); | |
Wenn ein Variablenname schon belegt ist, würde ich nicht durch Zweisprachigkeit ausweichen ;) . Die erste Variable könnte man beispielsweise "input" nenne, oder - wenn dir das nicht zu verworren ist -
C#-Quelltext
1: 2:
| double number2; possible = double.TryParse(Console.ReadLine(), out number2); |
jaenicke - Do 01.01.09 21:20
ilwaka hat folgendes geschrieben : |
Das mit der Schleife hab ich auch probiert |
Erfolgreich?
ilwaka hat folgendes geschrieben : |
und der Debugger läuft automatisch wenn ich das Programm kompiliere. |
Nicht wenn du das Programm
kompilierst, sondern nachdem du es
startest läuft der Debugger.
Und dann kannst du schrittweise durch dein Programm gehen und das Programm hält an Stellen an, an denen du Haltepunkte gesetzt hast.
ilwaka - Do 01.01.09 21:23
Ja die Schleife funktioniert einwandfrei.
ICh meinte doch starten.Also der Debugger meldet nichts.
Wenn ich auf Debuggen starte klicke läuft das Programm und zwar einwandfrei
jaenicke - Do 01.01.09 21:51
ilwaka hat folgendes geschrieben : |
Also der Debugger meldet nichts.
Wenn ich auf Debuggen starte klicke läuft das Programm und zwar einwandfrei |
So sollte es ja auch sein, wenn alles richtig ist.
Die Frage sollte vermute ich mal ;-) darauf abzielen, ob du schon einmal z.B. einen Haltepunkt gesetzt und schrittweise geschaut hast, was ab da passiert. Denn so kannst du auch selbst Fehler finden und beheben. Und das ist neben dem Programmieren selbst eine der wichtigsten Fähigkeiten, die man sich aneignen muss. ;-)
ilwaka - Do 01.01.09 22:17
ja ich habs gerade mal ausprobiert wie das geht...
Ich glaub ich mach mich mal daran die Consolen Anwendung in eine Windows Forms Anwendung umzubauen.
Ich werde dazu alles benutzen was ich bisher in dem Thread hier gelernt hab. :D
ilwaka - Fr 02.01.09 01:20
so.. ich hab das ganze jetzt als grafische anwendung.
Hab noch wurzelziehen und Prozentrechnung dazugefügt.
klappt alles super.
Wenn man den Radiobutton wurzelziehen anklickt wechselt der status von Zahl2 auf enabled=false.
wenn man danach ein anders anklickt wirds wieder aktiviert.
hier mal ein screenshot
JüTho - Fr 02.01.09 12:00
Hallo,
das sieht in der Tat schon nach etwas aus (für Deinen Kenntnisstand); auch die Idee mit dem Abschalten von Zahl2 ist gut. Ich vermisse eine TextBox für die Anzeige des Ergebnisses.
Damit wir Dir weiterhelfen können (mit Ratschlägen), ist aber der Quellcode wichtiger als der ScreenShot.
jaenicke hat folgendes geschrieben : |
Die Frage (zumDebugger) sollte vermute ich mal ;-) darauf abzielen, ob du schon einmal z.B. einen Haltepunkt gesetzt und schrittweise geschaut hast, was ab da passiert. Denn so kannst du auch selbst Fehler finden und beheben. Und das ist neben dem Programmieren selbst eine der wichtigsten Fähigkeiten, die man sich aneignen muss. ;-) |
In der Tat, genau das meinte ich! :lol:
Kha hat folgendes geschrieben : |
Ganz im Gegenteil, das sollte in der Konsole schon ohne eigenes Zutun funktionieren :zwinker: |
Da wirst Du recht haben. Ich hatte Ctrl-C als gängige Tastenkombination vorgeschlagen; aber das Prüfen einer (beliebigen) Kombination in der Console ist schwieriger als die einfache Abfrage nach ReadKey (darauf hatte ich hinweisen wollen). Aber das sollten wir nicht vertiefen.
Kha hat folgendes geschrieben : |
Wenn ein Variablenname schon belegt ist, würde ich nicht durch Zweisprachigkeit ausweichen ;) |
Ich möchte die Gelegenheit nutzen und von deutschsprachigen Bezeichnern grundsätzlich abraten: Eigentlich bevorzuge ich die (korrekte) Verwendung von deutschen Begriffen. Aber NET und die IDE arbeiten mit englischen Begriffen; spätestens wenn zu einem Control (z.B. der TextBox EingabeZahl1) ein EventHandler erstellt wird, kommt es zu schlimmem Mischmasch wie EingabeZahl1_Validating; und dieses Denglisch finde ich noch viel schlimmer als konsequentes Englisch.
Gruß Jürgen
ilwaka - Fr 02.01.09 13:11
:D
Also bisher hab ich das Ergebnis in einer Messagebox ausgegeben.
Dann baue ich mal noch eine Textbox dazu.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148:
| 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 WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void label1_Click(object sender, EventArgs e) {
}
private void radioButton1_CheckedChanged(object sender, EventArgs e) { box2.Enabled = true; }
private void button1_Click(object sender, EventArgs e) {
string Zahl1 = box1.Text; string Zahl2 = box2.Text; double Number1; double Ergebnis = 0; box3.Enabled = false; bool possible = double.TryParse(Zahl1, out Number1); if (possible) if (radioButton5.Checked) { Ergebnis=Math.Sqrt(Number1); MessageBox.Show("" + Ergebnis + ""); } else { if (possible) { { double Number2; possible = double.TryParse(Zahl2, out Number2); if (possible) { if (radioButton1.Checked) { Ergebnis = Number1 + Number2;
} if (radioButton2.Checked) { Ergebnis = Number1 - Number2;
} if (radioButton3.Checked) { Ergebnis = Number1 * Number2; } if (radioButton4.Checked) { if (Number2 == 0) { possible = false; MessageBox.Show("Division durch Null unzulässig"); } else { Ergebnis = (double)Number1 / (double)(Number2); } } if (radioButton6.Checked) { double zwischensumme = Number1 / 100; Ergebnis = zwischensumme * Number2; } } }
if (possible) { box3.Visible = true; label3.Visible = true; box3.Text = ("" + Ergebnis + ""); }
} else { MessageBox.Show("Zahl2 ist kein gültiger Double Wert."); } } else { MessageBox.Show("Zahl1 ist kein gültiger Double Wert."); } }
private void radioButton5_CheckedChanged(object sender, EventArgs e) { box2.Enabled = false;
}
private void radioButton2_CheckedChanged(object sender, EventArgs e) { box2.Enabled = true; }
private void radioButton3_CheckedChanged(object sender, EventArgs e) { box2.Enabled = true; }
private void radioButton4_CheckedChanged(object sender, EventArgs e) { box2.Enabled = true; }
private void button2_Click(object sender, EventArgs e) { this.Close(); }
private void radioButton6_CheckedChanged(object sender, EventArgs e) { box2.Enabled = true; } } } |
so jetzt hab ich eine Textbox und in der wird das Ergebnis angezeigt.
Der Benutzer kann nicht reinschreiben weil die Box am anfag enabled=false kriegt.
Ich glaube das Projekt mit der Datenbank werde ich erstmal zurückstellen. :D
scheint doch noch sehr hoch zu sein.
jaenicke - Fr 02.01.09 13:55
Die ganzen Handler radioButton2_CheckedChanged usw., die alle das selbe tun, musst du auch nicht mehrfach schreiben. Es genügt, wenn du unter Ereignisse allen das selbe Ereignis zuweist. ;-)
Die anderen kannst du dann löschen.
JüTho - Fr 02.01.09 14:17
jaenicke hat folgendes geschrieben : |
Die ganzen Handler radioButton2_CheckedChanged usw., die alle das selbe tun, musst du auch nicht mehrfach schreiben. |
Und es geht noch schöner (
einheitlich für alle RadioButtons!):
C#-Quelltext
1:
| box2.Enabled = radioButton1.Checked; |
Die Fehlermeldungen könnten auch in einem Label ausgegeben werden. Ich finde es unpraktisch, wenn man eine Meldung immer wegklicken muss. (Aber das ist meine persönliche Meinung; die MessageBox ist leider Windows-Standard.)
Ich hatte Dir schon bei der Console-Version empfohlen,
alle Meldungen in eine string-Variable zu setzen und nur von einer Stelle aus eine Meldung auszugeben; dann ist es leichter, zusätzliche Prüfungen und Meldungen hinzuzufügen.
Außerdem sollten
Bezeichner wie box2 und radioButton5 verboten werden: Spätestens in zwei Wochen weißt auch Du nicht mehr, was wozu dient. Sprechende Namen sind dringend anzuraten!
Noch ein paar
Anmerkungen:
box3.Enabled gehört in die Designer-Festlegung (im Eigenschaften-Fenster); denn das wird sich nie ändern.
Statt mehrfache einzelne if-Abfragen ist eine
if-else if-else if-Konstruktion besser. Denn wenn die erste Abfrage positiv entschieden wird, müssen die anderen Abfragen nicht mehr durchlaufen werden. (Leider gibt es bei RadioButtons keine einfache Index-Abfrage; deshalb kann nicht einfach mit
switch gearbeitet werden - anders als bei Delphi mit der RadioButtonGroup. Es gibt ein Ersatzverfahren; aber das muss ich erst noch suchen.)
Wenn das Ergebnis an die box3 übergeben wird, solltest Du so schreiben:
C#-Quelltext
1: 2: 3:
| box3.Text = "(" + Ergebnis.ToString() + ")"; box3.Text = String.Format("({0})", Ergebnis); |
Ich habe zwar von Kha gelernt, dass ein Wert bei der String-Additon automatisch in einen String verwandelt wird; aber wenn man es selber schreibt, weiß man, was man tut.
String.Format ist gut für das, wofür der Name steht, nämlich einen String zu formatieren. In beiden Varianten kannst Du auch die Art der Formatierung steuern.
Gruß Jürgen
JüTho - Fr 02.01.09 14:43
Titel: RadioButton-GroupBox
Ich habe jetzt ein Verfahren für dieses Problem gesucht und gefunden:
JüTho hat folgendes geschrieben : |
Leider gibt es bei RadioButtons keine einfache Index-Abfrage; deshalb kann nicht einfach mit switch gearbeitet werden - anders als bei Delphi mit der RadioButtonGroup. |
Weil dies etwas grundsätzlicher ist, gebe ich es als eigenen Beitrag weiter.
1. Vorbedingung: Bei jedem RadioButton muss das
erste Zeichen eindeutig sein und möglichst dem Rechenverfahren entsprechen. Mit Ausnahme der Wurzel hast Du das schon so gelöst (aber es ist ja auch 'W' als Rechenzeichen für Wurzel denkbar).
2. Zusatzvariable im Formular einrichten:
C#-Quelltext
1:
| char currentOperation = #0; |
3. CheckedChanged-Event einheitlich für alle diese RadioButtons:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| private void OperationChanged(object sender, EventArgs e) { RadioButton rb = sender as RadioButton; if (rb != null && rb.Checked) currentOperation = rb.Text[0]; } |
4. switch benutzen bei der Ausführung der gewünschten Operation:
C#-Quelltext
1: 2: 3: 4:
| switch(currentOperation) { case '+': break; } |
Gruß Jürgen
ilwaka - Fr 02.01.09 14:49
Wenn ich versuche das in einem zentralen string zu packen die meldungen schaffs ich nicht.
Ich mach irgendwas falsch.
was ist denn jetzt der Unterschied ob ich jetzt über all
oder überall
C#-Quelltext
1:
| box2.Enabled = radioButton1.Checked; |
vll verstech ich auch nicht.
ICh komm gerade irgendwie nicht weiter.
JüTho - Fr 02.01.09 16:46
ilwaka hat folgendes geschrieben : |
Wenn ich versuche das in einem zentralen string zu packen die meldungen schaffs ich nicht.
Ich mach irgendwas falsch. |
Wie ich schon bei der Console-Version sagte, muss dann die Reihenfolge von Deklaration, Prüfungen und Ausgabe angepasst werden. Aber Genaueres kann ich nur zu Code sagen. (Bitte nicht alles kopieren, nur die relevanten Teile.)
ilwaka hat folgendes geschrieben : |
was ist denn jetzt der Unterschied ob ich jetzt über all
oder überall
C#-Quelltext 1:
| box2.Enabled = radioButton1.Checked; | |
Inhaltlich ist es überhaupt kein Unterschied, aber von der "Schönheit der Programmierung" her: Bei der ersten Variante musst Du 1x "true" und (n-1)x "false" zuordnen. Wenn Du einen weiteren RadioButton hinzufügen willst, muss wiederum "false" hinzugefügt werden. Andererseits wird "true" hier abgeleitet von "1 Checked" und "false" von "1 not checked"; also kann man das auch verbinden.
Noch deutlicher wird die "Schönheit" dann, wenn man
richtige Namen benutzt.
Gruß Jürgen
ilwaka - Fr 02.01.09 16:50
naja ich habe jetz den genauen code nicht mehr.
Aber kann ich das jetzt nicht einfach mal so lassen bei diesen Prog jetzt und mir dann beim nächsten Prog überlegen wie ich es von
anfang an einbaue.
jaenicke - Fr 02.01.09 17:17
Das musst du ja selbst wissen, nur wirst du vermutlich bei einem neuen Programm dann das genauso machen wie du es jetzt gemacht hattest, wenn du das gar nicht ausprobierst. ;-)
ilwaka - Fr 02.01.09 17:44
das ist gemein:D
naja ich glaube ich lasse diesen rechner jetzt erstmal vll komme ich späterem(höherem?)leistungsstand noch einmal darauf zurück.
jezt hab ich erstmal ein kleins projekt
ich will eine kleine windows anwendung machen die bin zahlen in dezimal zahlen umwandelt.
Vielen Dank für die Hilfe die ich hier bisher hatte...
Ich hab das Gefühl voll viel gelenrt zu haben
ilwaka - Sa 03.01.09 23:02
juhu;D
ich habe heute einen Zinsrechner programmiert.
ich habe diesmal alle fehlermeldungen als variable gemacht und an einer zentralen stelle ausgegeben.
also so wie ihr mir das vorgeschlagen habt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| 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 WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
public void button1_Click(object sender, EventArgs e) { string Message = (""); string input1 = textBox1.Text; string input2 = textBox2.Text; double number1 = 0; double number2 = 0; bool possible = Double.TryParse(input1, out number1); bool notpossible = false; if(possible) { possible = Double.TryParse(input2, out number2); if (possible) { double ergebnis = (number1 * number2) / 100; textBox3.Text = ("" + ergebnis + ""); } else { notpossible = true; possible = false; Message = ("Zahl 2 ist keine gültige Zahl");
} } else { notpossible = true; possible = false; Message=("Zahl1 ist keine gültige Zahl"); } if (notpossible) { MessageBox.Show(""+Message+""); }
}
private void button2_Click(object sender, EventArgs e) { this.Close(); } } } |
JüTho - So 04.01.09 13:21
Hallo,
einige kleine Anmerkungen:
Die
using-Anweisungen kannst Du (wie schon gesagt) fürs Forum weglassen; die sind fast immer unwichtig. (Du notierst auch zu viele, die Du gar nicht brauchst.)
Was sollen die
Klammern bei den String-Zuweisungen?
C#-Quelltext
1:
| textBox3.Text = ("" + ergebnis + ""); |
Diese sind überflüssig; nur bei der Gliederung komplizierter Berechnungen oder and/or-Abfragen sind sie hilfreich oder wichtig. Außerdem sollte für die Konvertierung immer
ToString() verwendet werden (das hatte ich schonmal erläutert):
C#-Quelltext
1:
| textBox3.Text = ergebnis.ToString(); |
Die zusätzliche Variable
notpossible verwirrt: "false" heißt "nicht unmöglich", also "möglich", also possible - naja. Sie ist auch gar nicht nötig:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| string message = String.Empty; if (! String.IsNullOrEmpty(message) ) { MessageBox.Show(message); } |
So wie Du die Prüfungen aufbaust, ist auch
possible überflüssig; denn es kann auch kürzer geschrieben werden:
C#-Quelltext
1:
| if( Double.TryParse(input1, out number1) ) { ... } |
Weiterhin viel Erfolg! Jürgen
ilwaka - So 04.01.09 17:41
ok glaube hab deine hinweise reingearbeitet.
das mit den using hinweisen:D ich wollte es weglassen aber hab anscheinend doch wieder strg+a
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
public void button1_Click(object sender, EventArgs e) { string Message = (""); string input1 = textBox1.Text; string input2 = textBox2.Text; double number1 = 0; double number2 = 0; bool notpossible = false;
if (Double.TryParse(input1, out number1)) { Double.TryParse(input2, out number2); if (Double.TryParse(input2, out number2)) { double ergebnis = (number1 * number2) / 100; textBox3.Text = ergebnis.ToString(); } else { notpossible = true; Message = ("Zahl 2 ist keine gültige Zahl");
} } else { notpossible = true; Message=("Zahl1 ist keine gültige Zahl"); } if (notpossible) { MessageBox.Show(""+Message+""); }
}
private void button2_Click(object sender, EventArgs e) { this.Close(); } } } |
JüTho - So 04.01.09 17:53
ilwaka hat folgendes geschrieben : |
ok glaube hab deine hinweise reingearbeitet. |
Aber nur zum Teil: Klammern bei string-Zuweisungen, Verwendung von notpossible.
Jürgen
jaenicke - So 04.01.09 18:19
Und das kannst du auch weglassen. ;-)
In beiden Zeilen wird die Umwandlung ggf. durchgeführt, nur dass du beim zweiten Mal erst den Rückgabewert tatsächlich verwendest.
ilwaka hat folgendes geschrieben : |
C#-Quelltext 1: 2:
| Double.TryParse(input2, out number2); if (Double.TryParse(input2, out number2)) | |
ilwaka - So 04.01.09 18:22
so habs jetzt die verwendung von possible vermieden.
wenn jetzt zahl1 oder 2 nicht gültigs ist wird kein neues fenster mehr geöffnet
sondern der fehler wird im ergebnis fenster angezeigt.
@ jaenicke :D
das sollte natürlich weg habs nur übersehen :D
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
public void button1_Click(object sender, EventArgs e) { string Message = ""; string input1 = textBox1.Text; string input2 = textBox2.Text; double number1 = 0; double number2 = 0; bool notpossible = false;
if (Double.TryParse(input1, out number1)) { if (Double.TryParse(input2, out number2)) { double ergebnis = (number1 * number2) / 100; Message = ergebnis.ToString(); } else { Message = "Zahl 2 ist keine gültige Zahl";
} } else { Message="Zahl1 ist keine gültige Zahl"; } textBox3.Text = Message;
}
private void button2_Click(object sender, EventArgs e) { this.Close(); } } } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!