Announcement

Collapse
No announcement yet.

Daten von Funktionen übergeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten von Funktionen übergeben

    Hallo, ich habe ein kleines Problem. Ich möchte einer Methode Daten übergeben die ich in einer anderen Methode eingelesen habe.
    Leider steh ich irgendwie auf dem Schlauch und mein schlaues Buch hilft mir auhc net weiter. Also wende ich mich an Euch.

    Hier mal mein Code bisher:
    Code:
    class Einzelberechnungen
        {
            private int N = 0;
            private double a = 0.0;
    
            //N und a einlesen
            public void Einlesen()
            {
                Console.WriteLine("Bitte geben Sie einen Wert für N ein: \n");
                N = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Bitte geben Sie einen Wert für a ein: \n");
                a = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("Sie haben für N: {0} und für a: {1} eingegeben:\n", N, a);
            }
    
            //Fakultät von N berechnen
            public int Fakultät(int x)
            {
                return x == 0 ? 1 : x * Fakultät(x - 1);    //Rekursion
            }
    
    
        class Program
        {
            static void Main(string[] args)
            {
                Einzelberechnungen test = new Einzelberechnungen();
                test.Einlesen();
                //test.Fakultät();
                
    
                Console.ReadLine();
            }
        }
    Ich lese in Einlesen 2 Werte ein und von dem einen (N) möchte ich dann gerne die Fakultät berechnen. Nun kapier ich aber leider nicht wie ich den eingelesen Wert von N an die Methode Fakultät übergeben kann.

    Ich hoffe Ihr könnt mir weiter helfen.

    Danke im Vorraus

  • #2
    Hallo,

    aus Deinem Text geht zwar nicht hervor, warum Du zwei Werte abfragst und nur einen davon verwenden willst. Aber bitte...

    In C# gibt es nur Methoden, aber keine Unterscheidung zwischen Funktionen und Prozeduren. Es ist immer ein Rückgabe-Typ anzugeben. Du hast bei der Methode Einlesen bisher den Typ void festgelegt. Wenn Du die eingelesene Zahl zurückgeben willst, musst Du die Methode entsprechend ändern:
    Code:
    private int Einlesen()
    {
        int result = 0;
        //  jetzt abfragen und Eingabeprüfungen
        return result;
    }
    return gibt den Wert dahinter als Rückgabewert zurück. (Es gibt viele andere Varianten, z.B. ein return "mittendrin".) Meine Konstruktion ist eine sichere Vorlage.

    Wenn Du mehrere Werte zurückgeben musst, dann informiere Dich über out- und ref-Parameter, z.B. in OpenBook C#.

    Du solltest Dich auch mit dem Gültigkeitsbereich von Variablen näher befassen. Jede Variable sollte so "eng" deklariert werden wie nötig. Was nur innerhalb einer Methode von Bedeutung ist (wie bei meinem o.g. Beispiel die Variable result), hat außerhalb nichts zu suchen.

    Übrigens: den Methoden der Convert-Klasse sind (soweit vorhanden) die Methoden Parse, TryParse, ParseExact, TryParseExact immer vorzuziehen, hier also Int32.TryParse().

    Jürgen

    Nachtrag: Ich habe ganz vergessen, auf Deine konkrete Situation einzugehen: Die Methode Einlesen() ist zwar blöd aufgebaut, weil die Variablen N und a "außerhalb" deklariert wurden, müsste für sich aber funktionieren. Die Methode Fakultät() ist richtig aufgebaut (Lob für diese Konstruktion!), wird aber nicht richtig verwendet:
    Code:
    int ergebnis = test.Fakultät(N);
    Console.WriteLine(ergebnis);
    Insgesamt kann es nicht funktionieren, weil N nur innerhalb von Einzelberechnungen bekannt ist. Es ist auch nicht klar, warum Deine Klasse nur mit zwei internen Variablen und zwei öffentlichen Methoden erstellt wurde; vielleicht solltest Du auch über die Bedeutung von Klassen nachdenken (Grundsatz: sie sollen Objekte der Wirklichkeit nachbilden). Zum Beispiel hat die Abfrage über die Console sachlich nichts mit Berechnungen zu tun, gehört also mit Sicherheit nicht in diese Klasse.
    Zuletzt editiert von Jürgen Thomas; 25.04.2008, 18:10. Reason: Nachtrag hinzugefügt

    Comment


    • #3
      Ich hoffe ich hab dich richtig verstanden, wenn dann ist der folgende abgeänderte Quellcode die Lösung deines Problems, oder zumindestens ein Ansatz davon.

      Ich verstehe allerdings auch nicht, warum du zwei Werte einließt!?

      Code:
      class Einzelberechnungen
          {
              private int N = 0;
              private double a = 0.0;
      
              //N und a einlesen
              public void Einlesen()
              {
                  Console.WriteLine("Bitte geben Sie einen Wert für N ein: \n");
                  N = Convert.ToInt32(Console.ReadLine());
                  Console.WriteLine("Bitte geben Sie einen Wert für a ein: \n");
                  a = Convert.ToDouble(Console.ReadLine());
                  Console.WriteLine("Sie haben für N: {0} und für a: {1} eingegeben:\n", N, a);
              }
      
              //Fakultät von N berechnen
              public int Fakultät(int x)
              {
                      return x == 0 ? 1 : x * Fakultät(x - 1);    //Rekursion
              }
      
      
              class Program
              {
                  static void Main(string[] args)
                  {
                      Einzelberechnungen test = new Einzelberechnungen();
                      test.Einlesen();
                      
                      //du kannst die Variable N über das Objekt test ansprechen
                      //diesen übergibst du einfach beim Funktionsaufruf
                      Console.WriteLine("Das Ergebnis ist: " + test.Fakultät(test.N));
      
      
                      Console.ReadLine();
                  }
              }
          }
      mfg
      csharper1984
      Zuletzt editiert von csharper1984; 29.04.2008, 16:35.

      Comment


      • #4
        Hallo,

        bei der Kontrolle von csharper1984's fällt mir ein grober Schnitzer auf, den auch Nightfly anscheinend gemacht hat: Die Klasse Program ist (wenn die Klammern wirklich so gesetzt sind) innerhalb der Klasse Einzelberechnungen definiert. Das ist zwar zulässig (und in manchen Situationen sinnvoll), aber was soll das hier?

        Eine Klasse Program enthält die Main-Methode und allenfalls die eine oder andere grundlegende Festlegung zum Programmablauf.

        Die Klasse Einzelberechnungen liegt separat und wird (wie es auch im Code steht) von Main aus erzeugt und genutzt.

        Die Änderung mit "test.Fakultät(test.N)" wäre theoretisch zwar eine denkbare Lösung, kann und darf aber nicht funktionieren, weil N als "private" innerhalb von Einzelberechnungen deklariert ist. Die Lösung muss etwas wie folgt enthalten:
        Code:
        static void Main(string[] args)
        {
            Einzelberechnungen test = new Einzelberechnungen();
            int input = test.Einlesen();
                        
            Console.WriteLine("Das Ergebnis ist: " + test.Fakultät(input));
        
            Console.ReadKey();
        }
        Dazu gehört natürlich die Änderung des Rückgabewertes, wie ich in meinem ersten Beitrag geschrieben hatte. Jürgen

        PS. Wozu habe ich eigentlich einen Rat gegeben, wenn es keine Reaktion gibt?

        Comment


        • #5
          Deinen rat habe ich schon bemerkt gehabt, allerdings dacht ich mir, einfach mal nen code anzubieten, der auf basis des gegebenen codes erstellt wurde und da wäre so die Lösung gewesen, wenn man nicht alles umstrukturieren will.

          Ich persönlich hätte es auch nicht so gemacht!!!!

          also @Jürgen: haben deinen richtigen Hinweis verstanden, habe ihn aber bewusst nicht umgesetzt

          Comment


          • #6
            Code:
            using System;
            
            namespace ConsoleApplication1 {
                class Einzelberechnung {
                    public int Einlesen() {
                        int N = 0;
                        Console.WriteLine("Bitte geben Sie einen Wert für N ein: \n");
                        N = Convert.ToInt32(Console.ReadLine());
                        return N;
                    }
                    public int Fakultät(int x) {
                        return x == 0 ? 1 : x * Fakultät(x-1);
                    }
                }
                class Program {
                    static void Main() {
                        Einzelberechnung Test = new Einzelberechnung();
                        int result = Test.Fakultät(Test.Einlesen());
                        Console.WriteLine("\nDas Ergebnis lautet : {0}", result);
                    }
                }
            }
            Hallo Nightfly,
            mit den Beispielen hier sollte Dein Problem jetzt aus der Welt sein.
            Wenn nicht, sag was.

            Comment

            Working...
            X