Entwickler-Ecke
C# - Die Sprache - C# Main() extern aufrufen
storestore - Do 01.09.11 16:33
Titel: C# Main() extern aufrufen
Hallo ich habe mal eine Frage: Ich habe ein code in einer Consolenanwendung sagen wir mal so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string text= Console.ReadLine(); } string text2= Console.ReadLine(); if(text2=="test") { Main(); } |
Nur leider gibt es ein Problem beim Aufruf von Main(); Es gibt eine überladung und deswegen fehlen argummente. In meinem Lehrbuch wurde nicht beschrieben wie man eine Main Methode aufruft ;=)
mfg storestore
bakachan - Do 01.09.11 16:40
Mehrere Main-Funktionen sind nicht erlaubt.
Da dürftest du eine Fehlermeldung mit "has more than one entry point defined" bekommen.
Du brauchst doch eh nur eine Main (die Funktion die du da unten aufrufst kannst du doch anders nennen).
Ralf Jansen - Do 01.09.11 16:41
Deine Main Methode hat Parameter (args) wenn du die manuell aufrufst solltest du also auch Parameter mitgeben sonst hält er das für eine andere Methode die auch zufällig Main heißt die es aber nicht gibt.
Main selbst aufzurufen hört sich nach hausgemachten Problemen an, insofern finde ich es gut das das nirgendwo erklärt wird. Lass das. Wenn du die dadurch enstehende Rekursion brauchst packe den Code doch einfach komplett in eine andere Methode rufe dort diese Methode rekursiv auf und rufe diese Methode halt von Main aus auf.
Edit: Ignoriert mich. Ich habe den Hinweis auf die Überladung übersehen. Auf was für Ideen Leute kommen :shock:
storestore - Do 01.09.11 16:49
Ralf Jansen hat folgendes geschrieben : |
Deine Main Methode hat Parameter (args) wenn du die manuell aufrufst solltest du also auch Parameter mitgeben sonst hält er das für eine andere Methode die auch zufällig Main heißt die es aber nicht gibt.
Main selbst aufzurufen hört sich nach hausgemachten Problemen an, insofern finde ich es gut das das nirgendwo erklärt wird. Lass das. Wenn du die dadurch enstehende Rekursion brauchst packe den Code doch einfach komplett in eine andere Methode rufe dort diese Methode rekursiv auf und rufe diese Methode halt von Main aus auf.
Edit: Ignoriert mich. Ich habe den Hinweis auf die Überladung übersehen. Auf was für Ideen Leute kommen :shock: |
Gut dann rede ich jetzt mit mir selbst und ignoriere dich ;)
Ich werde es einfach in eine andere Methode packen, danke;)
storestore - Do 01.09.11 16:51
Der siegercode ^^
Sorry für den dopplepsot muss aber sein sonst wird es zuviel
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Methode(); } static void Methode() { Console.WriteLine("Hallo, geben sie bitte ihr aktuelles Guthaben ein!"); double geld = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?"); Console.WriteLine("D= draufzahlen, A=Abziehen!"); string text = Console.ReadLine(); if (text == "D" || text=="d") { Console.WriteLine("Wie viel wollen sie drauf zahlen?"); double draufzahlen = Convert.ToDouble(Console.ReadLine()); geld = geld + draufzahlen; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else if (text == "A"||text == "a") { Console.WriteLine("Wie viel wollen sie abheben?"); double abheben = Convert.ToDouble(Console.ReadLine()); geld = geld - abheben; Console.WriteLine("Ihr aktuelles Guthaben= " + geld+" Euro"); Console.ReadLine(); } else { Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen"); Console.ReadLine(); } Console.WriteLine("Nochmal? Dan drücker 'N' oder'n'"); string nochmal = Console.ReadLine(); if(nochmal=="N"|| nochmal=="n")
{ Console.Clear(); Methode(); } } } } |
Th69 - Do 01.09.11 16:56
Hallo storestore,
nimm doch anstatt der Rekursion besser eine do...while-Schleife.
Und im Inneren kannst du dann deine Geldberechnung als eigene Methode(n) aufrufen.
bakachan - Do 01.09.11 16:56
Ich würde vorschlagen das ganze iterativ und nicht rekursiv zu lösen.
Einfach eine do while-Schleife außen rum und schon kannst du dir die rekursion sparen
storestore - Do 01.09.11 17:22
Aber wie soll hier die rekursierung eintretten wenn ich ihn doch direkt auf die Methode hinweise?
huuuuuh - Do 01.09.11 18:57
aber du bist eben noch in "Methode", wenn du "Methode" aufrufst. C# weiss nicht, ob noch Anweisungen nach dem Aufruf von der Methode kommen. Das, was du da machst, funktioniert nicht wie "goto" (welches du aber auch nicht verwenden solltest) und geht einfach nur zum Anfang, sondern ist eine echte Rekursion. Nimm am besten eine Schleife, wie hier bereits vorgeschlagen.
storestore - Do 01.09.11 20:35
NEE, ich rufe die Methode in Main() auf und dann geht er automatische zu der Methode Methode()
Yogu - Do 01.09.11 21:02
storestore hat folgendes geschrieben : |
NEE, ich rufe die Methode in Main() auf und dann geht er automatische zu der Methode Methode() |
Ja, und wenn der Benutzer
N eingibt, wird
Methode nochmal aufgerufen, darin vielleicht nochmal, und nochmal... Erst, wenn die Methode verlassen wird, ohne dass sie sich selbst aufruft, geht der Programmzeiger zum letzten Aufruf zurück, und beendet diesen Aufruf, und dann den vorherigen. Das nennt man Rekursion und wird schnell unübersichtlich, weil die Wiederholung nicht direkt sichtbar ist. Außerdem unterliegt sie einer Beschränkung in der Anzahl der Aufrufe (maximale Call-Stack-Größe), also wird der Benutzer nach einer gewissen Zahl von Durchläufen einen Fehler ernten.
storestore - Do 01.09.11 21:15
Achso, ok jetzt habe ich es ausprobiert und entschieden. Ich mache es mal in eine Schleife. Ist es so wie ihr meint?
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) {
Methode(); } static void Abfrage() { if (Console.ReadLine() == "A") {
Console.WriteLine("Bitte nur zahlen eingeben!!!"); } }
static void Methode() { Console.WriteLine("Hallo, geben sie bitte ihr aktuelles Guthaben ein!");
double geld = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?"); Console.WriteLine("D= draufzahlen, A=Abziehen!"); string text = Console.ReadLine(); if (text == "D" || text == "d") { Console.WriteLine("Wie viel wollen sie drauf zahlen?"); double draufzahlen = Convert.ToDouble(Console.ReadLine()); geld = geld + draufzahlen; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else if (text == "A" || text == "a") { Console.WriteLine("Wie viel wollen sie abheben?"); double abheben = Convert.ToDouble(Console.ReadLine()); geld = geld - abheben; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else { Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen"); Console.ReadLine(); } Console.WriteLine("Nochmal? Dan drücker 'N' oder'n'"); Console.WriteLine("Oder lieber raus ins Freie? ;) Dann einfach exit eingeben"); for (string wiederholen = Console.ReadLine(); wiederholen == "N" || wiederholen == "n"; ) { Console.Clear(); Methode(); Console.ReadLine(); } } }
} |
Christian S. - Do 01.09.11 21:20
:autsch:
Nein, die Schleifen sind nicht alle gleich. Und Du hast Dir genau die Schleife ausgesucht, die am wenigsten zu Deinem Problem passt.
Mach Dir doch erstmal die Anforderungen an die Schleife klar:
(1) Sie muss eine Abbruchbedingung haben
(2) Sie muss mindestens einmal durchlaufen werden
Welche Schleife passt da jetzt zu? Ein Tipp: Sie wurde nicht umsonst schon von zwei Leuten hier zur Sprache gebracht :roll:
storestore - Do 01.09.11 21:22
Christian S. hat folgendes geschrieben : |
:autsch:
Nein, die Schleifen sind nicht alle gleich. Und Du hast Dir genau die Schleife ausgesucht, die am wenigsten zu Deinem Problem passt.
Mach Dir doch erstmal die Anforderungen an die Schleife klar:
(1) Sie muss eine Abbruchbedingung haben
(2) Sie muss mindestens einmal durchlaufen werden
Welche Schleife passt da jetzt zu? Ein Tipp: Sie wurde nicht umsonst schon von zwei Leuten hier zur Sprache gebracht :roll: |
Do-while? ;)
Habt ihr es euch so vorgestellt?? Oder soll ich das mit der Methode Methode() ganz weglassen?
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) {
Methode(); } static void Abfrage() { if (Console.ReadLine() == "A") {
Console.WriteLine("Bitte nur zahlen eingeben!!!"); } }
static void Methode() { Console.WriteLine("Hallo, geben sie bitte ihr aktuelles Guthaben ein!");
double geld = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?"); Console.WriteLine("D= draufzahlen, A=Abziehen!"); string text = Console.ReadLine(); if (text == "D" || text == "d") { Console.WriteLine("Wie viel wollen sie drauf zahlen?"); double draufzahlen = Convert.ToDouble(Console.ReadLine()); geld = geld + draufzahlen; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else if (text == "A" || text == "a") { Console.WriteLine("Wie viel wollen sie abheben?"); double abheben = Convert.ToDouble(Console.ReadLine()); geld = geld - abheben; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else { Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen"); Console.ReadLine(); } Console.WriteLine("Nochmal? Dan drücker 'N' oder'n'"); Console.WriteLine("Oder lieber raus ins Freie? ;) Dann einfach exit eingeben"); string wiederholen = Console.ReadLine(); do { Console.Clear(); Methode(); Console.ReadLine(); } while(wiederholen== "N"|| wiederholen=="n"); } }
} |
Christian S. - Do 01.09.11 21:24
Passt die denn zu den Anforderungen?
storestore - Do 01.09.11 21:27
Christian S. hat folgendes geschrieben : |
Passt die denn zu den Anforderungen? |
Ja sie Passt: Sie durchläuft das erstemal und dann checkt sie erst ob es stimmt oder nicht(abbruchbedingung) ;)
Ok,danke für die antworten leute ;)
Christian S. - Do 01.09.11 21:32
:zustimm:
//Edit: Du rufst immer noch Methode() auf, das macht keinen Sinn.
storestore - Do 01.09.11 21:36
Th69 hat folgendes geschrieben : |
Hallo storestore,
nimm doch anstatt der Rekursion besser eine do...while-Schleife.
Und im Inneren kannst du dann deine Geldberechnung als eigene Methode(n) aufrufen. |
Ich habe das so verstanden das ich eine Schleife machen soll und darin die Methode aufrufen soll?!
Christian S. - Do 01.09.11 21:40
Ich glaube, für Dich gilt echt die alte Informatiker-Regel: Nimm Dir mal ein Blatt Papier (keinen Editor, kein Tablet, ein wirkliches Blatt Papier!) und schreib Dir in einfachen Worten auf, was Deine Methode machen soll. Und dann (erst dann!) setzt Du es in Code um.
storestore - Do 01.09.11 21:53
Christian S. hat folgendes geschrieben : |
Ich glaube, für Dich gilt echt die alte Informatiker-Regel: Nimm Dir mal ein Blatt Papier (keinen Editor, kein Tablet, ein wirkliches Blatt Papier!) und schreib Dir in einfachen Worten auf, was Deine Methode machen soll. Und dann (erst dann!) setzt Du es in Code um. |
Ok, krass aber wieso?
Yogu - Do 01.09.11 21:56
storestore hat folgendes geschrieben : |
Christian S. hat folgendes geschrieben : | Ich glaube, für Dich gilt echt die alte Informatiker-Regel: Nimm Dir mal ein Blatt Papier (keinen Editor, kein Tablet, ein wirkliches Blatt Papier!) und schreib Dir in einfachen Worten auf, was Deine Methode machen soll. Und dann (erst dann!) setzt Du es in Code um. |
Ok, krass aber wieso? |
Weil du dir gerade offensichtlich nicht ganz im klaren willst, wie du deinen Gedankengang umsetzen sollst. Wenn du das aufschreibst (und wirklich alles mit reinnimmst, was wichtig ist), kannst du die Idee viel leichter in Code umsetzen.
So arg unterscheidet sich C# gar nicht von einer gesprochenen Sprache.
storestore - Do 01.09.11 22:01
Achso, ok bin echt gerade etwas zu verwirrd mit den Gedanken. Aber das mit der Schleife, also da soll ich das mit der Methode lassen und den code einfach so einfügen, oder? Wenn es so ist habe ich das so geregelt. Aber wieso doch nicht lieber Method? Das habe ich noch nicht verstanden
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) {
Methode(); }
static void Methode() {
Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!"); double geld = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?"); Console.WriteLine("D= draufzahlen, A=Abziehen!"); string text = Console.ReadLine(); if (text == "D" || text == "d") { Console.WriteLine("Wie viel wollen sie drauf zahlen?"); double draufzahlen = Convert.ToDouble(Console.ReadLine()); geld = geld + draufzahlen; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else if (text == "A" || text == "a") { Console.WriteLine("Wie viel wollen sie abheben?"); double abheben = Convert.ToDouble(Console.ReadLine()); geld = geld - abheben; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else { Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen"); Console.ReadLine(); } Console.WriteLine("Nochmal? Dan drücker 'N' oder'n'"); Console.WriteLine("Oder lieber raus ins Freie? ;) Dann einfach exit eingeben"); string wiederholen = Console.ReadLine(); do { Console.Clear();
Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!"); double monex = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?"); Console.WriteLine("D= draufzahlen, A=Abziehen!"); string tex = Console.ReadLine(); if (text == "D" || text == "d") { Console.WriteLine("Wie viel wollen sie drauf zahlen?"); double draufzahlen = Convert.ToDouble(Console.ReadLine()); geld = geld + draufzahlen; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else if (text == "A" || text == "a") { Console.WriteLine("Wie viel wollen sie abheben?"); double abheben = Convert.ToDouble(Console.ReadLine()); geld = geld - abheben; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else { Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen"); Console.ReadLine(); } Console.WriteLine("Nochmal? Dan drücker 'N' oder'n'"); Console.WriteLine("Oder lieber raus ins Freie? ;) Dann einfach exit eingeben"); string wiederhole = Console.ReadLine(); Console.ReadLine(); } while (wiederholen == "N" || wiederholen == "n"); } }
} |
Christian S. - Do 01.09.11 22:05
storestore hat folgendes geschrieben : |
Achso, ok bin echt gerade etwas zu verwirrd mit den Gedanken. |
Dann hilft die Sache mit dem Blatt Papier besonders. Das ist kein Witz, es ist erstaunlich, wie gut man sich konzentrieren kann, wenn man sich mal vor ein blankes Blatt Papier setzt und die eigenen Gedanken in Worte fasst.
storestore - Do 01.09.11 22:23
Ok, ich habe es versucht. Alles in einer variable zu machen wäre schlauer! Wieso? Weil er es dann automatisch weiderholen muss! Aber als erstes muss er die Anweisung ohne Bedingung ausführen also eine do- while Schleife: Hier ist mal der neue code: Ich hoffe mal jetzt ist alles ok!?!
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:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string wiederholen; do {
Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!"); double geld = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?"); Console.WriteLine("D= draufzahlen, A=Abziehen!"); string text = Console.ReadLine(); if (text == "D" || text == "d") { Console.WriteLine("Wie viel wollen sie drauf zahlen?"); double draufzahlen = Convert.ToDouble(Console.ReadLine()); geld = geld + draufzahlen; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else if (text == "A" || text == "a") { Console.WriteLine("Wie viel wollen sie abheben?"); double abheben = Convert.ToDouble(Console.ReadLine()); geld = geld - abheben; Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro"); Console.ReadLine(); } else { Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen"); Console.ReadLine(); } Console.WriteLine("Nochmal? Dan drücker 'N' oder'n'"); Console.WriteLine("Oder lieber raus ins Freie? ;) Dann einfach exit eingeben"); wiederholen = Console.ReadLine(); Console.Clear();
} while ( wiederholen == "N" || wiederholen == "n"); } }
} |
Yogu - Do 01.09.11 22:46
storestore hat folgendes geschrieben : |
Ich hoffe mal jetzt ist alles ok!?! |
Die Schleife sieht jetzt ganz gut aus.
Aber ist es beabsichtigt, dass man nach der Ausgabe des neuen Vermögens erst einmal die Eingabetaste drücken muss, bevor der weitere Text kommt? Wenn man das nicht weiß, kommt man an der Stelle vielleicht nicht weiter.
storestore - Do 01.09.11 23:11
Achso, ok das schreibe ich dann rein. Nur ich habe ein neues Problem aber das ist ein neues Thema das ich dann hoffentlicl bald posten werde
Danke ne ;)
Th69 - Fr 02.09.11 10:00
Hallo storestore,
ist es denn beabsichtigt, daß der Anwender nach jedem Schleifendurchgang immer wieder neu sein Vermögen eingeben soll?
Anstatt eine große Methode zu schreiben, solltest du versuchen, zuerst deine einzelnen Aufgaben heraus zu arbeiten (OK, das geht jetzt schon in Richtung Software Engeneering, aber früh übt sich ;-))
Ein gute Methodik ist die
Top-Down [
http://de.wikipedia.org/wiki/Top-Down-_und_Bottom-Up-Design] Arbeitsweise.
Du definierst deine einzelnen Methoden erst einmal nur über die Namen und Parameter, ohne die Methodenrümpfe auszuprogrammieren und schreibst dann deine Hauptmethode, welche dann die anderen Methoden in gewünschter Weise aufruft.
storestore - Fr 02.09.11 11:04
Hi, ja das mit dem Vermögen jedesmal eingeben kann nervig sein. Aber was wenn jemand sagt ich will mal vrsuchen was passiert wenn ich 300€ von 3000€ Abhebe. Aber man kan ja den User fragen. Wenn er will wird das vermögen eben wieder angezeigt. Jetzt mal eine Frage: Sollte man Methoden im algemeinen versuchen wegzulassen? Oder kan ich gelassen drauf los arbeiten mit Methoden?
mfg storestore
Ralf Jansen - Fr 02.09.11 11:21
Zitat: |
Sollte man Methoden im algemeinen versuchen wegzulassen? |
Nein eher im Gegenteil. Die Best Practises besagen eher das eine Methode nie länger sein soll als das was du auf dem Bildschirm mit einem Blick überschauen kannst und das eine Methode genau 1 Sache machen soll und nicht mehrere. Beides sollten man nicht völlig dogmatisch betrachten aber im Auge behalten. Eine gute Prüfregel für mich ist immer wenn ich Probleme habe der Methode einen sprechenden Namen zu geben der auch wirklich besagt was diese Methode tut. In diesem Fall macht sie wahrscheinlich zu viel und man sollte die Struktur überdenken. Wo wir übrigens wieder am Ausgangspunkt dieses Threads wären. Wenn jemand versucht seine Methode Main zu nennen ist irgendwas faul ;) Im gesagten kannst du das Wort Methode auch durch Klasse ersetzen. Gilt dort ähnlich.
Zitat: |
Oder kann ich gelassen drauf los arbeiten mit Methoden? |
Ist genauso schlimm. In diesem Thread wurde dir bereits empfohlen vielleicht mal erst ein Blatt zur Hand zu nehmen um deine Gedanken zu ordnen bevor du loslegst. Dem kann ich nur uneingeschränkt zustimmen und hier wiederholen.
storestore - Sa 03.09.11 12:51
Hi,
ok das mit dem Blatt werde ich dan in Zukunft weiter so machen (weiter so verwenden).
Naja nur das Problem mit ist das manche mir empfehlen es mit Methoden zu machen und manche meinen ich sollte es lieber ohne Methoden machen wegen der rekursierung. Abe rdie rekursierung tritt doch immer ein wenn ich eine Methode aufrufe, oder. Es gibt zwar sehr viele besipiele im "www" aber das Problem ist das ist etwas höheres Mathe. Das hatte man leider noch nicht in der 7.klasse(komm bald in dich 8. nur noch eine Woche :) ) Habe ich das so richtig verstanden
bakachan - Mo 05.09.11 08:30
Das siehst du falsch.
Du hast erst eine Rekursion wenn die Methode sich selbst aufruft. Im Idealfall hast du eine Methode die sich nicht selbst aufruft und die Wiederholung von außen kommt.
storestore - Mo 05.09.11 12:59
Achso, sprich sowas:
C#-Quelltext
1: 2: 3: 4:
| public void Methode() { Methode() } |
oder mfg storestore
Moderiert von
Th69: Beitragsformatierung überarbeitet.
bakachan - Mo 05.09.11 13:05
Genau das ist eine reine Rekursion.
storestore - Mo 05.09.11 19:31
Ahh, ok danke
pdelvo - Do 08.09.11 14:36
Rekursion als "böse" Abzustempeln ist aber auch falsch. Es gibt durchaus Einsatzgebiete in denen sie nützlich ist. Ein Beispiel wäre das rekursive durchsuchen eines Verzeichnisses. Das lässt sich zwar auch iterativ lösen(mir ist nichts bekannt was nur rekursiv funktioniert), aber das ist bei weitem aufwendiger und nicht so selbsterklärend wie die rekursive Variante. Bei Rekursion muss man aber aufpassen. Und zwar kann es dabei zu einem StackOverflow kommen. Das passiert wenn zuviiele verschachtelte Methodenaufrufe gemacht werden. Damit das Programm weiß, wo es wieder zurückspringen muss nach dem Ausführen einer Methode, wird die Rücksprungaddresse auf den Stack(Stapel9 gelegt. Dabei wird beim Aufrufen einer Methode ein Entrag hinzugefügt, und beim verlassen wird er wieder entfernt. bei der Rekursion kann es vorkommen, dass so oft wieder die Methode aufgerufen wird, dass der Stack überläuft(er ist begrenzt). Und dann fliegt einem das Programm um die Ohren (StackoverflowException). Das passiert bei der iteration nicht. Bei meinem Beispiel mit der Verzeichnissuche würde er für einen untergeordneten ordner diesen wieder rekursiv durchsuchen. Da aber die maximale Pfadlänge auf 255 zeichen begrenzt ist,und jeder Ordner mindestens einen namen von einem Zeichen haben kann kommt man auf eine maximale Ordneranzahl von 255 ineinander geschachtelten Ordnern(die Pfadseperatoren muss man da noch von abziehen). Auf jedenfall ist man mit 255 rekursionen noch lange nicht im bereich eines Stackoverflows. Daher sollte man sich immer überlegen, ob sowas überhaupt auftreten kann.
Bei deinem Programm ist die iterative version aber eindeutig die sinnvollerste. Es ist übersichtlicher. Aber auf Biegen und brechen versuchen rekursion zu vermeiden finde ich falsch. "premature optimization is the root of all evil"
storestore - Do 08.09.11 14:59
Naja, aber eine Rekursion muss am Anfang noch nicht sein finde ich. Man kann auch versuchen die Probleme in mehreren Methoden und klassen und nicht nur in einer Methode, die sich selbst wieder aufruft (Rekursiert) aufzuteilen ;)
Mfg storestore
Horschdware - Do 08.09.11 15:15
storestore hat folgendes geschrieben : |
Naja, aber eine Rekursion muss am Anfang noch nicht sein finde ich. |
Am Anfang von was?
Wenn du damit den Einstieg in die Programmierung meinst, gebe ich dir teilweise recht. Bevor man das erste "Hello World" geschrieben hat muss man nicht die Tiefen der Rekursion verstanden haben.
Ich für meinen Teil bin durch meinen Informatiklehrer in der zehnten(?) Klasse auf Rekursion gestoßen worden:
"Löse dieses Problem einmal mit und einmal ohne Rekursion. Buch zum Thema steht in der Bibliothek".
So oder so ähnlich ging das damals ab.
Wenn ich so schaue, wie lange du hier schon im Forum bist, dann denke ich, kannst du dich ruhig auch mal an Rekursion trauen. Bevor du aber irgendetwas mit Rekursion
programmierst, musst du erst einmal
verstehen, was das ist, wie man es anwendet, welche Spielregeln gelten, etc... sprich: lernen :les:
storestore - Do 08.09.11 16:58
Hi,
ja ich meinte am anfang vom c# Lernen.
Das mit der Rekursion verstehe habe ich noch vor. Aber erstmal möchte ich gerne mein "Anfänger Buch" zu ende bringen und vlt. dann mit der Rekursion weiter arbeiten.
War das das einzige was dein Lehrer gesagt hat? War ja echt krass! Welche Schule warst du den?, gab es auf die Aufgaben Noten? und wenn ja welche hast du bekommen? *Befragung ende* ;)
mfg storestore
C# - Do 08.09.11 18:30
Hallo.
Ich habe jetzt nicht alle Beiträge gelesen, aber nur mal so neben bei: wieso schreibst du immer
C#-Quelltext
1:
| else if (text == "A" || text == "a") |
Das geht doch auch leichter z.B.
C#-Quelltext
1:
| else if (text.ToLower() == "a") |
oder du benutzt
Console.ReadKey:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| ConsoleKeyInfo key = new ConsoleKeyInfo(); key = Console.ReadKey(); if (key.Key == ConsoleKey.A) |
Trashkid2000 - Do 08.09.11 20:18
storestore hat folgendes geschrieben : |
Naja, aber eine Rekursion muss am Anfang noch nicht sein finde ich. Man kann auch versuchen die Probleme in mehreren Methoden und klassen und nicht nur in einer Methode, die sich selbst wieder aufruft (Rekursiert) aufzuteilen ;) |
Das kannst Du natürlich gerne probieren, aber wirst dann auch schnell scheitern.
Wie möchtest Du denn z.B. die Abfrage von Verzeichnissen, Unterverzeichnissen und der darin enthaltenen Dateien ohne Rekursion machen?
Wenn Du nicht weisst, wie tief eine Hierarchie geht, kannst Du es nunmal nicht anders lösen.
Ich gebe zu, dass das Denken in Hierarchien schwierig sein kann. Aber es gibt halt Dinge, die man nicht anders lösen kann, als sich eine Technik anzueignen und zu implementieren.
pdelvo - Do 08.09.11 20:51
Trashkid2000 hat folgendes geschrieben : |
storestore hat folgendes geschrieben : | Naja, aber eine Rekursion muss am Anfang noch nicht sein finde ich. Man kann auch versuchen die Probleme in mehreren Methoden und klassen und nicht nur in einer Methode, die sich selbst wieder aufruft (Rekursiert) aufzuteilen ;) |
Das kannst Du natürlich gerne probieren, aber wirst dann auch schnell scheitern.
Wie möchtest Du denn z.B. die Abfrage von Verzeichnissen, Unterverzeichnissen und der darin enthaltenen Dateien ohne Rekursion machen?
Wenn Du nicht weisst, wie tief eine Hierarchie geht, kannst Du es nunmal nicht anders lösen.
Ich gebe zu, dass das Denken in Hierarchien schwierig sein kann. Aber es gibt halt Dinge, die man nicht anders lösen kann, als sich eine Technik anzueignen und zu implementieren. |
ein Stack<string>(hat nichts mit dem call stack zu tun) um das aktuelle Verzeichnis zu speichern, und dann durch iterieren. funktioniert dann ohne. Also mir ist nichts bekannt, wo ein Problem nur mit Rekursion zu lösen ist.
Ralf Jansen - Do 08.09.11 20:56
Zitat: |
Wie möchtest Du denn z.B. die Abfrage von Verzeichnissen, Unterverzeichnissen und der darin enthaltenen Dateien ohne Rekursion machen? |
Das scheitert hier ausschließlich an deiner Vorstellungskraft ;) Jeder Problem lässt sich auch rein iterativ lösen.
Ich spar mir mal die Files und das prüfen von Verzeichnisrechten im Beispiel. Zum zeigen das es auch ohne Rekursion geht sollte das ausreichen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public List<string> GetAllDirectoriesFromPath(string rootPath) { List<string> directories = new List<string>(Directory.GetDirectories(rootPath)); int current = 0; while (current < directories.Count) { directories.AddRange(Directory.GetDirectories(directories[current])); current++; } return directories; } |
storestore - Do 08.09.11 21:21
Ok, showtime ^^
*Finger knacken las*
@C#: Das mit "Readkey" ist echt eine gute Idee. Danke!
@Trashkid2000: Deine Sorgen sind berechtigt! Das ist eig. genau so, wei man sagt: "Ich lerne Autofahren. Aber das Autobahn fahren lasse ich weg, weil ich das noch nicht brauche" *Sich selbst ein "Fail" gib ^^*. Das mit der Rekursierung sollte ich mit in meinen "Lehrplan" bauen. Ich werde das hoffentlich machen, sobal ich das Thema "oop"(Objektorientierte Programmierung) zuende gebracht ha@@be.
@Ralf Jansen: Sehr gut! Der code stimmt (glaube ich) ^^
lg storestore
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!