Entwickler-Ecke
C# - Die Sprache - Methoden in einer Methode aufrufen?
Muetze187 - Do 24.12.09 13:02
Titel: Methoden in einer Methode aufrufen?
Ein kräftiges und lautes "Hallo"!
Bin neu hier im Forum und hab eine Frage zu Methoden.
Ich möchte, wie der Titel vermuten lässt, mehrere Methoden in einer zusammenfassen.
Diese 4 Methoden sollen in einer 5. Methode auf einmal ausgegeben werden.
Die 4 Methoden:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| static double Addition(double x, double y) { return (x + y); } static double Subtraktion(double x, double y) { return (x - y); } static double Division(double x, double y) { return (x / y); } static double Multiplikation(double x, double y) { return (x * y); } |
In einer 5. Methode, die vom benutzer aufgerufen werden kann, möchte ich alle 4 Grundrechenarten auf einmal ausgeben lassen.
Ich weiß aber nicht wie ich die Methode schreiebn muss. :( Habe schon vieles Versucht aber leider kein Erfolg : /
Vielleicht könnt ihr mir helfen!?
Ich wünsche euch frohe Weihnachten!
Mfg
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
JüTho - Do 24.12.09 15:11
Hallo und :welcome:
mir ist nicht klar, was du mit "auf einmal" meinst. Eine Ausgabe und auch die Verarbeitung mehrerer getrennter Punkte kann eigentlich immer nur nacheinander geschehen. Meinst du vielleicht so etwas:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| static void BasicComputing(double x, double y) { Console.WriteLine("Addition liefert " + Addition(x, y).ToString() ); Console.WriteLine("Subtraktion liefert " + Subtraktion(x, y).ToString() ); Console.WriteLine("Multiplikation liefert " + Multiplikation(x, y).ToString() ); Console.WriteLine("Division liefert " + Division(x, y).ToString() ); } |
Was passiert eigentlich, wenn y gleich 0 ist?
Frohe Weihnachten! Jürgen
Christoph1972 - Do 24.12.09 17:11
Hi,
oder meinst du einen verschachtelten Aufruf? Wie etwa:
C#-Quelltext
1: 2: 3: 4: 5:
| private void Compute() { double value1 = 2, value2 = 2; double result = Subtraktion(Division(Multiplikation(value1, Addition(value1, value2)), value2), value2); } |
JasonDelife - Do 24.12.09 17:35
Wie man Methoden aufruft sind aber Grundlagen.
Deshalb ein Verweis auf das Openbook:
http://openbook.galileocomputing.de/visual_csharp/
Sollte dein Problem ein anderes sein, dann erkläre es bitte genauer.
Grüße und ein frohes Fest, JasonDelife.
Muetze187 - Do 24.12.09 17:52
Das die Methoden Grundlagen sind weiß ich auch. Ich mache den Lehrgang bei der ILS. Jeder fängt mal klein an ;)
Sorry das ich es nicht genauer beschrieben habe...
In Zukunft gebe ich mir mehr Mühe :)
Also. Erstmal der Code des gesamten Programms. Vielleicht wirds dann klarer.
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Einsendeaufgabe_4 { class Program { static double Addition(double x, double y) { return (x + y); } static double Subtraktion(double x, double y) { return (x - y); } static double Division(double x, double y) { return (x / y); } static double Multiplikation(double x, double y) { return (x * y); }
static void Main(string[] args) { double eingabe1, eingabe2, eingabe3;
Console.WriteLine("Geben sie die erste zahl ein."); eingabe1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("\nGeben sie die zweite Zahl ein."); eingabe2 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("\nWie möchten sie weiter vorgehen?\n"); Console.WriteLine("Bitte drücken sie die entsprechende Taste\n"); Console.WriteLine("1 - Addieren"); Console.WriteLine("2 - Subtrahieren"); Console.WriteLine("3 - Dividieren"); Console.WriteLine("4 - Multiplizieren\n\n"); eingabe3 = Convert.ToDouble(Console.ReadLine());
if (eingabe3 == 1) { Console.WriteLine("\n\nDie Summe der beiden Zahlen ist {0}", Addition(eingabe1, eingabe2)); } else if (eingabe3 == 2) { Console.WriteLine("\n\nDie Differenz der beiden Zahlen ist {0}", Subtraktion(eingabe1, eingabe2)); } else if (eingabe3 == 3) { Console.WriteLine("\n\nDer Quotient der beiden Zahlen ist {0}", Division(eingabe1, eingabe2)); } else if (eingabe3 == 4) { Console.WriteLine("\n\nDas Produkt der beiden Zahlen ist {0}", Multiplikation(eingabe1, eingabe2)); }
} } } |
Meine Aufgabe lautet nun, das oben geschriebene Programm (keine Vorgabe, von mir erstellt) zu erweitern und zwar so, dass man quasi noch eine 5. Möglichkeit zum auswählen hat, nämlich alle Rechenoperationen auf dem Bildschirm anzuzeigen und zwar gleichzeitig.
Ein User gibt z.B. die Zahlen 4 und 5 ein und wählt dann die Möglichkeit 5 (alle Rechenoperationen gleichzeitig) und es erscheint auf dem Bildschirm eben die Ergebnisse aus der Addition, Subtraktion usw.
Wäre mit Sicherheit auch nicht schwierig wenn ich diese Möglichkeit nicht in eine eigene Methode schreiben müsste.
Mein Gedankenansatz ist jetzt, die vorherigen Methoden (Addition usw.) in einer einzigen Methode (z.B. "Alle Ergebnisse") zu vereinen.
Ist das möglich und wenn ja, wie?
Danke und feiert schön!
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
JasonDelife - Do 24.12.09 17:56
1. Variablennamen wie eingabe1 sind nicht aussagekräftig. Wie wäre es mit zahl1, zahl2 und option? Desweiteren ist es unlogisch option als double zu deklarieren.
2. Statt der else-if-Ketten wäre ein switch besser.
3. Zu eigentlichen Frage: Ja, es ist möglich, indem du einfach alle Methoden aufrufst.
Grüße, JasonDelife.
Muetze187 - Do 24.12.09 18:49
zu 1. Wenn ich eingabe nicht als double deklariere, kann der user doch keine Kommazahl eingeben, oder?
zu 2. Ich soll if..else verwenden
zu 3. Nein, ich soll durch EINE NEUE Methode die 4 Rechenarten aus den anderen Methoden auslesen und will wissen wie das geht :)
Mfg
JüTho - Do 24.12.09 19:03
Muetze187 hat folgendes geschrieben : |
zu 1. Wenn ich eingabe nicht als double deklariere, kann der user doch keine Kommazahl eingeben, oder? |
Du sollst
option als integer deklarieren; bei den Werten ist double korrekt.
Muetze187 hat folgendes geschrieben : |
zu 2. Ich soll if..else verwenden |
Wenn das so ist, musst du es machen. Aber switch ist trotzdem erheblich besser, nämlich übersichtlicher und wird durch den Compiler auch optimiert, sodass es schneller ist.
Nachtrag: Du darfst "else if" hintereinander schreiben; du musst nicht zusätzlich einrücken. Das ist eine zulässige Konstruktion in C#.
Muetze187 hat folgendes geschrieben : |
zu 3. Nein, ich soll durch EINE NEUE Methode die 4 Rechenarten aus den anderen Methoden auslesen und will wissen wie das geht :) |
Wenn du meine erste Antwort nochmals liest, siehst du, wie es geht.
Übrigens hatte ich schon auf eine mögliche
Fehleingabe hingewiesen. Eine weitere ist, wenn der Anwender sofort <Return> drückt, ohne dass er etwas eingegeben hat, oder dass er versehentlich 'w' statt '2' schreibt. All das musst du abfangen, am besten indem du statt Convert.ToDouble so etwas schreibt:
C#-Quelltext
1:
| if( double.TryParse( Console.ReadLine(), out value2 ) { .. } |
TryParse ist fast immer besser als die Convert-Methoden.
Jürgen
PS. "Taschenrechner" sind ein beliebtes Anfänger-Projekt. Die Forumssuche liefert dir viele nützliche Hinweise.
Nachtrag (nach 15 Stunden): Wenn alle Maßnahmen in
einer Methode zusammengefasst werden sollen, entspricht vielleicht auch folgende Lösung der Aufgabenstellung:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| static void BasicComputing(double x, double y, int option) { if( option == 1 || option == 5 ) Console.WriteLine("Addition liefert " + Addition(x, y).ToString() ); if( option == 2 || option == 5 ) Console.WriteLine("Subtraktion liefert " + Subtraktion(x, y).ToString() ); if( option == 3 || option == 5 ) Console.WriteLine("Multiplikation liefert " + Multiplikation(x, y).ToString() ); if( option == 4 || option == 5 ) Console.WriteLine("Division liefert " + Division(x, y).ToString() ); } |
Muetze187 - Fr 25.12.09 14:39
Danke für deine Mühe.
Wenn ich option als int deklariere, motzr er rum das er int nicht in double konvertieren kann. Es muss aber double sein, sonst kann der Anwender keine Kommazahl eingeben.
TryParse kommt erst später dran. Ich kann also die Aufgabe nur mit den Mittel lösen, die ich erlernt habe.
Die letzte Methode schein ganz nett zu sein:)
Ich habe bis jetzt die if...else Abfragen in die main-Methoden geschrieben. Scheint aber so besser zu sein. Die Frage ist nur, wie ich eine solche Methode aufrufe!?
Übrigens, wenn der y-Wert 0 ist, ist der Taschenrechner überfordert. Steht z.B. bei Division +unendlich. Bei anderen ungültiger Wert oder so. Wie könnte ich das beheben? :)
P.S. Ich weiß auch, dass wenn ein User zB. "w" drückt statt "2", das Programm die Grätsche macht. Ist aber nicht weiter schlimm , da mir die Fehlerbehebung zu dem Zeitpunkt des Lehrgangs nicht bekannt ist. Der Fernlehrer weiß das also und wird nicht erwarten, dass ich das korrekt mache.
Danke!
Mfg
JüTho - Fr 25.12.09 15:00
Muetze187 hat folgendes geschrieben : |
Wenn ich option als int deklariere, motzr er rum das er int nicht in double konvertieren kann. |
Das ist falsch. Jede int-Zahl kann problemlos in eine double-Zahl konvertiert werden.
C#-Quelltext
1: 2: 3:
| int ganzeZahl = 3; double dezimalzahl = ganzeZahl; Console.WriteLine(dezimalzahl); |
Warum sollte das auch nicht gehen (umgekehrt, von double zu int, muss man nachdenken). Ich kann in deinem Projekt auch keinen Punkt sehen, wo eine solche Konvertierung vorgesehen ist.
Muetze187 hat folgendes geschrieben : |
Es muss aber double sein, sonst kann der Anwender keine Kommazahl eingeben. |
Wieso sollte er bei der Auswahl zwischen "1,2,3,4,5" eine Kommazahl eingeben müssen? Welche Aufgabe soll er denn bei 12,345 oder gar 278,69 ausführen? Die Aufgabenstellung lautet doch: "entweder 1 oder 2 oder 3 oder 4 oder 5". Also bitte nochmals: Wozu double für die Option? :oops:
Vielleicht musst du auch ganz einfach genauer lesen, wofür eine bestimmte Variable gedacht ist (deshalb hat sich auch Jason an deinen Bezeichnungen gestört).
Muetze187 hat folgendes geschrieben : |
TryParse kommt erst später dran. Ich kann also die Aufgabe nur mit den Mittel lösen, die ich erlernt habe. |
Dann musst du das Convert in
try-catch einbauen, um solche Fehleingaben abzufangen.
Bitte sage nicht, dass das auch erst später kommt. Das Abfangen von Fehlern gehört bei solchen Verfahren unbedingt dazu.
Muetze187 hat folgendes geschrieben : |
Die letzte Methode schein ganz nett zu sein:)
Ich habe bis jetzt die if...else Abfragen in die main-Methoden geschrieben. Scheint aber so besser zu sein. Die Frage ist nur, wie ich eine solche Methode aufrufe!? |
Der Aufruf von Methoden gehört von Anfang an dazu, und du rufst doch auch deine bisherigen Methoden
Addition usw. irgendwie auf. Entsprechend kann auch die Methode meines letzten Vorschlags aufgerufen werden: Parameter setzen, Rückgabewert passend definieren (nämlich
void, weil alles innerhalb der Methode stattfindet), Methode aufrufen - fertig.
Muetze187 hat folgendes geschrieben : |
Übrigens, wenn der y-Wert 0 ist, ist der Taschenrechner überfordert. Steht z.B. bei Division +unendlich. Bei anderen ungültiger Wert oder so :) |
Eben, deshalb ist die Fehlerprüfung so wichtig, siehe
TryParse oder
try-catch.
Gruß Jürgen
SirQuickly - Mo 04.01.10 20:18
Muetze187 hat folgendes geschrieben : |
Danke für deine Mühe.
Wenn ich option als int deklariere, motzr er rum das er int nicht in double konvertieren kann. Es muss aber double sein, sonst kann der Anwender keine Kommazahl eingeben.
TryParse kommt erst später dran. Ich kann also die Aufgabe nur mit den Mittel lösen, die ich erlernt habe.
Die letzte Methode schein ganz nett zu sein:)
Ich habe bis jetzt die if...else Abfragen in die main-Methoden geschrieben. Scheint aber so besser zu sein. Die Frage ist nur, wie ich eine solche Methode aufrufe!?
Übrigens, wenn der y-Wert 0 ist, ist der Taschenrechner überfordert. Steht z.B. bei Division +unendlich. Bei anderen ungültiger Wert oder so. Wie könnte ich das beheben? :)
P.S. Ich weiß auch, dass wenn ein User zB. "w" drückt statt "2", das Programm die Grätsche macht. Ist aber nicht weiter schlimm , da mir die Fehlerbehebung zu dem Zeitpunkt des Lehrgangs nicht bekannt ist. Der Fernlehrer weiß das also und wird nicht erwarten, dass ich das korrekt mache.
Danke!
Mfg |
Hallo Leidensgenosse:-))
ich hab Dir eine private Nachricht geschrieben
mfG
Christian S. - Mo 04.01.10 20:22
Das Forum lebt davon, dass Probleme öffentlich diskutiert werden. Sollte sich Deine PN also darauf beziehen, so möchte ich Dich bitten, Deine Hinweise hier im Thread zu posten.
Muetze187 - Di 05.01.10 12:58
Der Chefe hat natürlich Recht :)
Nach langem hin und her hab ich nun die Lösung!
Ja ich weiß, die Variablen könnte man kürzer und effektiver wählen :)
Im Prinzip habe ich nur die "void Methode" verdrängt.
Sie ist aber des Rätsels Lösung. Ein Freund der ein wenig Java kann kam mir zu Hilfe. Interessanterweise kam aber ich auf die Lösung :)
Der Methodenkopf sieht wie folgt aus (also vor der "main Methode")
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:
| static double Addition(double x, double y) { return (x + y); }
static double Subtraktion(double x, double y) { return (x - y); }
static double Division(double x, double y) { return (x / y); }
static double Multiplikation(double x, double y) { return (x * y); }
static void alle(double x, double y) { Console.WriteLine("Summe: {0}", Addition(x, y)); Console.WriteLine("Differenz: {0}", Subtraktion(x, y)); Console.WriteLine("Quotient: {0}", Division(x, y)); Console.WriteLine("Produkt: {0}", Multiplikation(x, y)); } |
Danke JüTho für deine Mühe :)
SirQuickly weiß ja wie er mich erreicht :)
Mfg
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Muetze187 - Do 14.01.10 12:43
Falls es jemanden interessiert. Hier der komplette Code der Aufgabe :)
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 {
class Program { static double Addition(double x, double y) { return (x + y); }
static double Subtraktion(double x, double y) { return (x - y); }
static double Division(double x, double y) { return (x / y); }
static double Multiplikation(double x, double y) { return (x * y); }
static void all(double x, double y) { Console.WriteLine("Addieren: {0}", Addition(x, y)); Console.WriteLine("Subtrahieren: {0}", Subtraktion(x, y)); Console.WriteLine("Dividieren: {0}", Division(x, y)); Console.WriteLine("Multiplizieren: {0}", Multiplikation(x, y)); return; }
static void Main(string[] args) { double eingabe1, eingabe2; int eingabe3;
Console.WriteLine("Geben sie die erste zahl ein."); eingabe1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("\nGeben sie die zweite Zahl ein."); eingabe2 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("\nWie mchten sie weiter vorgehen?\n"); Console.WriteLine("Bitte drücken sie die entsprechende Taste\n"); Console.WriteLine("1 - Addieren"); Console.WriteLine("2 - Subtrahieren"); Console.WriteLine("3 - Dividieren"); Console.WriteLine("4 - Multiplizieren"); Console.WriteLine("5 - Alle Rechenoptionen!\n\n"); eingabe3 = Convert.ToInt32(Console.ReadLine());
if (eingabe3 == 1) { Console.WriteLine("\n\nDie Summe der beiden Zahlen ist {0}", Addition(eingabe1, eingabe2)); } else if (eingabe3 == 2) { Console.WriteLine("\n\nDie Differenz der beiden Zahlen ist {0}", Subtraktion(eingabe1, eingabe2)); } else if (eingabe3 == 3) { Console.WriteLine("\n\nDer Quotient der beiden Zahlen ist {0}", Division(eingabe1, eingabe2)); }
else if (eingabe3 == 4) { Console.WriteLine("\n\nDas Produkt der beiden Zahlen ist {0}", Multiplikation(eingabe1, eingabe2)); } else if (eingabe3 == 5) { all (eingabe1, eingabe2); } else { Console.WriteLine("Falsche Eingabe!"); }
Console.ReadKey();
} } } |
Mir ist bewusst, dass switch...case übersichtlicher und einfacher wäre :)
Danke!
Mfg
JüTho - Do 14.01.10 13:01
... und
else if ist unter C# eine zulässige Konstruktion; dieser Abschnitt muss nicht in je zwei Zeilen aufgeteilt und weiter eingerückt werden:
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:
| if (eingabe3 == 1) { Console.WriteLine("\n\nDie Summe der beiden Zahlen ist {0}", Addition(eingabe1, eingabe2)); } else if (eingabe3 == 2) { Console.WriteLine("\n\nDie Differenz der beiden Zahlen ist {0}", Subtraktion(eingabe1, eingabe2)); } else if (eingabe3 == 3) { Console.WriteLine("\n\nDer Quotient der beiden Zahlen ist {0}", Division(eingabe1, eingabe2)); } else if (eingabe3 == 4) { Console.WriteLine("\n\nDas Produkt der beiden Zahlen ist {0}", Multiplikation(eingabe1, eingabe2)); } else if (eingabe3 == 5) { all (eingabe1, eingabe2); } else { Console.WriteLine("Falsche Eingabe!"); } |
So viele Leerzeilen wie bei dir sind auch überflüssig.
Gruß Jürgen
Christian S. - Do 14.01.10 13:16
So 'ne else-if-Kette finde ich gruselig, für sowas gibt's IMHO die switch-Anweisung.
JüTho - Do 14.01.10 13:32
Christian S. hat folgendes geschrieben : |
So 'ne else-if-Kette finde ich gruselig, für sowas gibt's IMHO die switch-Anweisung. |
Das hat der TE ja auch schon erkannt, nur nicht umgesetzt:
Muetze187 hat folgendes geschrieben : |
Mir ist bewusst, dass switch...case übersichtlicher und einfacher wäre :) |
Gruß Jürgen
Muetze187 - Do 14.01.10 15:46
JüTho hat folgendes geschrieben : |
... und else if ist unter C# eine zulässige Konstruktion; dieser Abschnitt muss nicht in je zwei Zeilen aufgeteilt und weiter eingerückt werden:
So viele Leerzeilen wie bei dir sind auch überflüssig.
Gruß Jürgen |
Ok, ich werde es mir merken! :)
Mfg
Kha - Do 14.01.10 21:46
JüTho hat folgendes geschrieben : |
... und else if ist unter C# eine zulässige Konstruktion; |
Naja, es ist auf jeden Fall keine syntaktische Einheit; anfangs habe ich bei Delphi genau wie
Muetze187 eingerückt - denn streng genommen ist es so von den Scopes richtig bzw. entspricht exakt dem AST des Compilers.
Mittlerweile bin ich aber auch zur "falschen" Einrückung übergegangen, da sich im Gegensatz zum PC doch wenigstens der Mensch sich mit einer Reihung statt Schachtelung beim Denken und Lesen leichter tut (und weil F#
elif kennt ;) ). Wie auch immer, Christian hat natürlich völlig Recht :mrgreen: .
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!