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

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
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()
        {
            // Abfrage
          Console.WriteLine("Hallo, geben sie bitte ihr aktuelles Guthaben ein!");
           
            // Die Variable
            double geld = Convert.ToDouble(Console.ReadLine());
           // Abfrage2
            Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
            Console.WriteLine("D= draufzahlen, A=Abziehen!");
            string text = Console.ReadLine();
            if (text == "D" || text=="d")
            {   // Was soll er machen
                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();
            }
                // Was wenn es nicht stimmt
            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
                // Else again .,.
            {
                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();
            // Nochmal mit Main();???
            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

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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()
        {
            // Abfrage
            Console.WriteLine("Hallo, geben sie bitte ihr aktuelles Guthaben ein!");





            // Die Variable
            double geld = Convert.ToDouble(Console.ReadLine());
            // Abfrage2
            Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
            Console.WriteLine("D= draufzahlen, A=Abziehen!");
            string text = Console.ReadLine();
            if (text == "D" || text == "d")
            {   // Was soll er machen
                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();
            }
            // Was wenn es nicht stimmt
            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
            // Else again .,.
            {
                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

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
: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()
        {
            // Abfrage
            Console.WriteLine("Hallo, geben sie bitte ihr aktuelles Guthaben ein!");





            // Die Variable
            double geld = Convert.ToDouble(Console.ReadLine());
            // Abfrage2
            Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
            Console.WriteLine("D= draufzahlen, A=Abziehen!");
            string text = Console.ReadLine();
            if (text == "D" || text == "d")
            {   // Was soll er machen
                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();
            }
            // Was wenn es nicht stimmt
            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
            // Else again .,.
            {
                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

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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)
        {

            // Gehe zu Methode();

            Methode();
        }

        static void Methode()
        {

            // Abfrage
            Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!");
            // Die Variable
            double geld = Convert.ToDouble(Console.ReadLine());
            
                // Abfrage2
                Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
                Console.WriteLine("D= draufzahlen, A=Abziehen!");
                string text = Console.ReadLine();
                if (text == "D" || text == "d")
                {   // Was soll er machen
                    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();
                }
                // Was wenn es nicht stimmt
                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
                // Else again .,.
                {
                    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();

                    // Abfrage
                    Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!");
                    // Die Variable
                    double monex = Convert.ToDouble(Console.ReadLine());

                    // Abfrage2
                    Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
                    Console.WriteLine("D= draufzahlen, A=Abziehen!");
                    string tex = Console.ReadLine();
                    if (text == "D" || text == "d")
                    {   // Was soll er machen
                        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();
                    }
                    // Was wenn es nicht stimmt
                    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
                    // Else again .,.
                    {
                        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

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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:06

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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.

Ok, ich werde es jetzt mal versuchen! Danke.


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
            {




                // Abfrage
                Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!");
                // Die Variable
                double geld = Convert.ToDouble(Console.ReadLine());

                // Abfrage2
                Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
                Console.WriteLine("D= draufzahlen, A=Abziehen!");
                string text = Console.ReadLine();
                if (text == "D" || text == "d")
                {   // Was soll er machen
                    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();
                }
                // Was wenn es nicht stimmt
                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
                // Else again .,.
                {
                    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

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconTh69: 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

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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();
//Dein Code
//und jetzt machst du statt Console.ReadLine
key = Console.ReadKey();
//Und dann die Spezifische abfrage
if (key.Key == ConsoleKey.A) //...


Trashkid2000 - Do 08.09.11 20:18

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
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