Autor Beitrag
OldCat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mi 24.11.21 15:54 
Liebe Gemeinschaft,

wieder einmal mehr wende ich mich an euch mit einer grundlegenden Frage, die mir das Internet nicht beantworten kann, wie mir scheint.

Gestern wurde mir klar, ich habe den Sinn von Rückgabewerten in Methoden nicht verstanden. Nach längerer Suche, von den Microsoft.Docs bis "überallhin", fand ich keine Antwort auf die Frage, wofür ich denn ein Rückgabewert nutzen sollte oder gar müsste. Und wann Methoden keinen brauchen.
Zwar lese ich mal mehr mal weniger umständlich formuliert, was Rückgabewerte sind, bzw. was sie tun, doch hat sich für mich nicht der tatsächliche Sinn offenbart.

Mit der Antwort auf die Frage 'wofür brauche ich sie' erhoffe ich mich einen inneren Zugang zu Rückgabewerten in Methoden. Ich habe nur euch, die ich fragen kann.

Mein Frage: 'Warum' und 'wann' sollte ich Rückgabewerte in Methoden nutzen? :?

Liebe Grüße
OldCat
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 24.11.21 16:03 
Was wäre die Alternative für dich? Bzw. was würdest du den anstatt Rückgabewerte machen? Welchen Anwendungsfall hattest du im Kopf wo das unsinnig erscheint.

Nehmen wir wieder mal was aus dem Framework als Beispiel.
Es gibt da z.b. die Math.Round-Methode. Da geht irgendein Zahlenwert rein kommt ein gerundeter Zahlenwert raus. Wie würdest du diese Methode schreiben wenn es keinen Rückgabewert gäbe?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mi 24.11.21 16:57 
Zitat:
user profile iconRalf Jansen
Was wäre die Alternative für dich? Bzw. was würdest du den anstatt Rückgabewerte machen? Welchen Anwendungsfall hattest du im Kopf wo das unsinnig erscheint.
Genau da fängt mein Problem schon an: Wenn es nach mir ginge, würde ich wohl immer nur void-Methoden schreiben :gruebel: Da ist in meinem Kopf nur das Zirpen einer einsamen Grille zu hören ... (ergo, Was das Thema angeht: komplette Kopfleere).

Zitat:
user profile iconRalf JansenEs gibt da z.b. die Math.Round-Methode. Da geht irgendein Zahlenwert rein kommt ein gerundeter Zahlenwert raus. Wie würdest du diese Methode schreiben wenn es keinen Rückgabewert gäbe?
Diese Methode war mir bis dato unbekannt. Auch hier ist mir der Sinn nicht klar. (Im Übrigen geht es mir mit Eingabeparametern recht ähnlich).

Und das ist meine Angst: Nie die Notwendigkeit sehen zu können, wann ich selbst einen Rückgabewert für eine Methode brauchen würde, und wann nicht. Daher habe ich jetzt entschieden, ich muss dringend verstehen, wann ich ihn brauche, und wann nicht.
Die Metapher der einsam zirpenden Grille in meinem Kopf muss dringend enden. Die Leere in meinem Kopf, was Rückgabewerte angeht, muss enden.

:nut:

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 24.11.21 17:51 
Zitat:
Genau da fängt mein Problem schon an: Wenn es nach mir ginge, würde ich wohl immer nur void-Methoden schreiben

Aber im genannten Beispiel von Math.Round wo wäre da der Sinn wenn die void zurückgibt? Irgendwoher brauchst du doch ein Ergebnis einer Methode.
Manchmal hat man den Fall das eine Methode nur den Zustand einer Klasse ändert dann braucht man keinen Return aber ansonsten ruft man Methoden auf die was verändern und das möchte man doch gern wissen also zurückbekommen. Oder man muß andere Wege haben um an das veränderte zu kommen.

Das mag jetzt wieder so ein blödes "so wie typischerweise Beispiele funktionieren" Problem sein. Weil da der Einfachheithalber direkt ein Ergebnis von irgendwas auf der Console ausgegeben wird und ich es darüber hinaus nirgendwo anders brauche. Das passiert aber so nur in Beispielen. Das passiert nur in den simpelsten Fällen von Code so (aka in Codebeispielen).

Wenn du ein Beispiel brauchst um das zu probieren. Schreibe einen simplen Taschenrechner für die Konsole.
Also Eingabe von zwei Zahlen und einem Operator. Und trenne dabei Aufgaben einigermassen von einander.
Aufgaben wären Eingabe, Berechnung, Ausgabe somit 3 verschiedene Dinge die an 3 verschiedenen Stellen passieren sollen (mindestens 3 verschiedenen Methoden oder sogar Klassen).

Wenn du dabei ohne Parameter, Rückgabewerte oder ähnliches auskommst hast du am Ende möglicherweise Recht und das alles ist unnötig ;)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mi 24.11.21 18:28 
Zitat:
user profile iconRalf Jansen
Wenn du ein Beispiel brauchst um das zu probieren. Schreibe einen simplen Taschenrechner für die Konsole.
Also Eingabe von zwei Zahlen und einem Operator. Und trenne dabei Aufgaben einingermassen von einander.
Aufgaben wären Eingabe, Berechnung, Ausgabe somit 3 verschiedene Dinge die an 3 verschiedenen Stellen passieren sollen (mindestens 3 verschiedenen Methoden oder sogar Klassen).
Die Aufgabe ist angenommen. Probiere ich umgehend mal aus :zustimm:

Nachtrag: Es fällt mir schwerer als gedacht. Es ist kein Problem die Aufgabe in "einem Wisch" in die Main() Methode zu schreiben ... doch eine andere, mehrere Methoden zu verwenden mit User-Eingabe.
Habe jetzt zwei Quellcodes geschrieben, einen besonders rudimentären und einen mit etwas mehr Code. Doch die Aufgabenstellung ist in beiden nicht gelöst.

Werde wohl länger für ne Antwort brauchen, als gedacht :mrgreen:
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Sa 27.11.21 17:37 
Hätte nie gedacht, dass es mir so große Probleme bereiten würde, einen Taschenrechner zu schreiben, in dem ich beispielsweise drei verschiedene Methoden nutze.
Wirklich zufrieden bin ich mit meinem Code nicht. Er funktioniert immerhin. Das ist mir so die Tage nicht gelungen. Meinen Taschenrechner, den ich zuvor geschrieben hatte, war in der Tat einfach komplett in der Main() Methode geschrieben.
Jetzt habe ich versucht, Eingabe, Verarbeitung und Ausgabe in drei verschieden Methoden zu trennen. Was mich aber jetzt noch stört ist, dass die 'Eingabe Methode' ("CalcInput") in der Main() Methode aufgerufen wird, 'Verarbeitung' und 'Ausgabe' aber innerhalb der 'Eingabe Methode' stehen, da es mir nicht gelungen ist, sie in der Main() Methode aufzurufen.

ausblenden volle Höhe 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:
namespace ReturnValues_Parameters
{
    internal class Program
    {
        static void Main(string[] args)
        {
            CalcInput();

            System.Console.ReadKey();
        }

        static void CalcInput()
        {
            System.Console.WriteLine("Please type in your first digit.");
            int userInput1 = int.Parse(System.Console.ReadLine());

            System.Console.WriteLine("Please type in your second digit.");
            int userInput2 = int.Parse(System.Console.ReadLine());

            Calculation(userInput1, userInput2);

            CalcOutput(userInput1, userInput2);

        }

        static int Calculation(int a, int b)
        {
            return a + b;
        }

        static void CalcOutput(int userInput1, int userInput2)
        {
            System.Console.WriteLine($"The sum of {userInput1} + {userInput2} = {(userInput1 + userInput2)}");
        }
    }
}


Immerhin habe ich jetzt Übergabeparameter angefangen zu schätzen. Mit den Rückgabewerten fremdel ich allerdings immer noch.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 27.11.21 20:49 
Mit der Rückgabe von Calculation() arbeitest du gar nicht sondern berechnest in CalcOutput() neu. Du solltest das was Calculation berechnet auch benutzen. Im Moment könntest du diese Methode auch einfach weglassen. Im Moment ruft Main CalcInput auf die wiederum CalcOutput aufruft. Damit hast du jetzt nur gelernt Parameter über Methoden weiterzureichen. Aber noch nicht die Rückgabe einer Methode zu verwenden.

In Pseudocode habe ich mir die 3-teilung da eher so vorgestellt.

ausblenden C#-Quelltext
1:
2:
3:
var userInput = CalcInput();
var result = Calculation(userInput);
CalcOutput(result);


Versuch das mal in dieser Richtung zu ändern. Die einzige Hürde jenseits vom benutzen von Methoden deren Parameter und Rückgabewerte ist was ich in Pseudcode userInput genannt habe. Du willst ja zumindest 2 Dinge eingeben (eigentlich 3 wenn du den Operator eingebbar machst und Calculation ein wenig mehr kann als jetzt). Darum ein Hinweis. Hier könnte jetzt eine Klasse helfen die aus den eingegebenen Daten besteht und von der Methode zurückgegeben wird.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: So 28.11.21 12:19 
Möglicherweise verwirrt das jetzt mehr als es hilft, aber ich dachte mir, es wäre einen Versuch wert :)

Zur Frage: "Rückgabewerte - wofür brauche ich sie?" ist die einfache Antwort: Rückgabewerte sind nützlich. Sehr nützlich. Erklärung:

Hier hast du ja schon Funktionen mit Rückgabewerten benutzt:
ausblenden C#-Quelltext
1:
int userInput2 = int.Parse(System.Console.ReadLine());					

Weitergedacht könnte man also fragen, wieso haben die Entwickler von .net diese Methode int.Parse() nicht einfach als void Funktion geschrieben= Sodass sie den Wert auf der Konsole ausgibt?
:arrow: Dann wäre die Methode viel weniger nützlich

Da sind es jetzt 2 verschiedene Leute, aber das gleiche passiert auch bei eigenen Methoden - sie sind nützlicher wenn sie Sachen erstmal "leise" machen und zurückgeben als wenn sie alles direkt zur Console ausgeben. Denn man kann den Rückgabewert immer noch später ausgeben, aber man kann schwer etwas, was ausgegeben wurde wieder verstecken.

:arrow: Rückgaben erlauben dir, den Rechencode von dem Ausgabecode zu trennen. Wenn du dann die Ausgabe ändern möchtest, baut man nicht so leicht einen Bug in die Rechnung ein.

Für diesen Beitrag haben gedankt: OldCat
Faramir
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 28.11.21 16:25 
Der Rückgabewert wird benötigt, wenn Sie etwas in Ihrem Code ersetzen wollen. Ein Beispiel: Ihre Anwendung interagiert mit externen Geräten und Sie erstellen einen Rahmen. In diesen Rahmen wird ein variabler Wert eingegeben und das externe Gerät reagiert auf diesen Wert, z.B. Änderung der Baudrate, 1 - bedeutet 1 MBit und z.B. 2 bedeutet 2 Mbit. Nach einer solchen Drehung wird das Bild an das externe Gerät gesendet.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mo 29.11.21 08:46 
Was, wenn Console.ReadLine() den Wert der Tastatureingabe nicht als Ergebniswert zurückliefern würde?
Wie kämst du dann an den ersten oder zweiten Wert, den der Benutzer eingegeben hat?
Würde ReadLine() die Eingabe des Users auf der Console ausgeben, wäre das bestimmt toll - aber deinen Taschenrechner kannst dann vergessen.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 29.11.21 10:22 
Vergleich es doch mal mit einer Firma:

Jeder Mitarbeiter hat seinen Arbeitsumfeld und einen konkreten Aufgabenbereich.
Wenn Du als Chef nun einem Mitarbeiter die Aufgabe gibst, er soll z.B. eine Monatsplanung anfertigen, möchtest Du das Ergebnis doch auch haben, oder?
Und Du möchtest auf keinen Fall, dass er sein Ergebnis einfach direkt ins Internet stellt, Du möchtest vorher drüber schauen und selber entscheiden, was Du veröffentlichst und was nicht.
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 12:17 
@user profile iconRalf Jansen

Um sicher zu gehen, dass ich Deinen Pseudocode auch richtig verstehe, schreibe ich meinen bisherigen/obigen Quellcode mal in Pseudocode um. Bitte sag mir, ob ich richtig liege, wenn ja, hilft mir das ungemein. Es ist das erste mal, dass ich von Pseudocode höre :les:
Wenn's erlaubt ist, zeige mir bitte mal, wie mein Quellcode als Pseudocode aussehen würde, falls ich meinen Pseudocode falsch interpretiert habe.

ausblenden C#-Quelltext
1:
2:
3:
var userInput = CalcInput()
var a, b = Calculation(int a, int b)
Calcoutput(userInput)


@user profile iconjfheinsuser profile iconRalf Jansen
Zitat:
Zur Frage: "Rückgabewerte - wofür brauche ich sie?" ist die einfache Antwort: Rückgabewerte sind nützlich. Sehr nützlich.

Ah okay, wenn ich es richtig verstehe, sind Rückgabewerte nicht zwingend erforderlich, sondern "nur" nützlich.

@ Ralf Jansen: Du hast mich gefragt gehabt, in welchem Code mir Rückgabewerte als überflüssig erscheinen. Dem bin ich noch gar nicht nachgekommen. Möchte das jetzt aber mal nachholen. Es handelt sich hierbei um eine Darstellung von Code, welcher eine Methode mit Rückgabewerte nutzt, um optional das eingeschränkte Volumen eines "Hauses" (Quader-) mit Giebeldach zu berechnen, sofern es kein Flachdach (Quader) besitzt.
Der Code wird vorgestellt in dem Buch "C# Programmieren für Einsteiger" von Michael Bonacina, im Kapitel 9.4: "Methoden mit Rückgabewerten".
Zitat:
Der dort vorgestellte Code ist in deutsch verfasst, ich habe ihn aber in englisch gehalten, da ich eigenen Code grundsätzlich in englisch schreibe. Wenn ich soweit bin, möchte ich dann lernen, meinen Code in verschiedene Sprachen zu portieren.


ausblenden volle Höhe 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:
// using System;

namespace ÜbungOOPMethode3
{
    class House
    {
        public int BaseArea;
        public int Height;
        public int WindowAmount;
        public string RoofType;
        public string Color;

        public void SetBaseArea(int baseArea)
        {
            BaseArea = baseArea;
        }

        public void SetHeight(int houseHeight)
        {
            // Das Schlüsselwort 'this' ist optional. Wird aber von Bonacina streng ans Herz gelegt.
            this.Height = houseHeight;
        }

        public void SetWindowAmount(int amountWindows)
        {
            this.WindowAmount = amountWindows;
        }

        public void SetRoofType(string myRoofType)
        {
            this.RoofType = myRoofType;
        }

        public void SetColor(string houseColor)
        {
            this.Color = houseColor;
        }

        public double CalculateVolume()
        {
             double houseVolume = Height * BaseArea;

            if (RoofType == "gabled roof") houseVolume *= 0.75;
            //// System.Console.WriteLine(houseVolume);
            return houseVolume;
            // System.Console.WriteLine(houseVolume);
        }

        public void DisplayHouseValues()
        {
            System.Console.WriteLine("The attributes of my house:\n");
            System.Console.WriteLine($"The base area of that building is: {BaseArea} square meters.");
            System.Console.WriteLine($"The height of that building is: {Height} meters.");
            System.Console.WriteLine($"The amount of windows of that building are: {WindowAmount} windows.");
            System.Console.WriteLine($"The color of that building is: {Color}.");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            House myHouse = new House();

            //myHouse.BaseArea = 1200;
            //myHouse.Height = 20;
            //myHouse.WindowAmount = 100;
            //myHouse.RoofType = "flat roof";
            //myHouse.Color = "greyish white";

            myHouse.SetBaseArea(1200);
            myHouse.SetHeight(20);
            myHouse.SetWindowAmount(100);
            myHouse.SetRoofType("gabled roof");
            myHouse.SetColor("greyish white");

            myHouse.DisplayHouseValues();

            myHouse.CalculateVolume();
            System.Console.WriteLine(myHouse.CalculateVolume());

            //System.Console.WriteLine("The attributes of my house:\n");
            //System.Console.WriteLine($"The base area of that building is: {myHouse.BaseArea} square meters.");
            //System.Console.WriteLine($"The height of that building is: {myHouse.Height} meters.");
            //System.Console.WriteLine($"The amount of windows of that building are: {myHouse.WindowAmount} windows.");
            //System.Console.WriteLine($"The color of that building is: {myHouse.Color}.");

            System.Console.WriteLine("\nPress any key to exit...");
            System.Console.ReadKey();
        }
    }
}


Anschließend habe ich die Methode mit Rückgabewert 'CalculateVolume()' als void Methode verfasst, und das Ergebnis war dasselbe. So kam ich erneut zu dem Schluss, Rückgabewerte in einer Methode sind nicht zwingend notwendig?

Moderiert von user profile iconTh69: Code-Tags durch Quote-Tags ersetzt.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.11.21 12:51 
In deinem Pseudocode ist Calculation immer noch unnötig. Das was du berechnest willst du auch ausgeben jetzt hast du nur die Ausgabe von CalcInput in CalcOutput geschoben und Calculation wird ignoriert. Du musst schon das was aus Calculation rauskommt im nächsten Schritt verwenden.

Das was du in dem ÜbungOOPMethode3 Beispiel zeigst ist die nächste Ebene der Abstraktion die zeigt wie man den Zustand von Klassen benutzen kann. Ich/wir waren erstmal bei Methoden und wie man die benutzt um Code zu strukturieren. Oder um Begriffe aus der üblichen Literatur zu verwenden wir wahren noch bei reiner strukturierter Programmierung dieses Beispiel ist aber schon objektorientiert.
Eine Methode kann natürlich auch nur den Zustand einer Klasse ändern. Dann ist die Veränderung der Klasse das was aus der Methode rauskommt und nicht der Rückgabeparameter der Methode. Ist aber logisch ähnlich. Methoden machen was und damit man mit dem was die machen irgendwie arbeiten können muss das da irgendwie raus ;)

Und ja letztlich brauch man das alles nicht. Es gibt Programmiersprachen die ohne das alles auskommen und um so näher du an die direkte Hardware rangehst löst sich das ganze eh auf. Es ist eine Erfindung um die Komplexität die im Code dargestellt wird beherrschbar zu machen. Objektorientierte Programmierung ist halt zur Zeit der Goldstandard.

Zitat:
Anschließend habe ich die Methode mit Rückgabewert 'CalculateVolume()' als void Methode verfasst, und das Ergebnis war dasselbe.


Nicht so wie im gezeihten Code. Das hier

ausblenden C#-Quelltext
1:
System.Console.WriteLine(myHouse.CalculateVolume());					


kann ohne Rückgabeparameter nicht funktionieren. Denn das was aus CalculateVolume rauskommt geht in WriteLine wieder rein. Void als Typ des Rückgabeparameters würde nicht mal kompilieren.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 29.11.21 12:58 
Dein Pseudocode ist so aber nicht mehr sinnvoll, denn damit wäre die Berechnungsfunktion überflüssig, da du mittels Calcoutput(userInput) einfach nur die Eingabe wieder ausgeben würdest und nicht die berechneten Werte (a und b).

Und zu deinem 2. Code: bei Änderung des Rückgabetyps der CalculateVolume()-Methode zu void würde aber Console.WriteLine(myHouse.CalculateVolume()) nicht mehr fehlerfrei kompilieren (denn ohne Rückgabe kann auch nichts ausgegeben werden)!

Vllt. verstehst du es anhand des Buches Visual C# 2012 besser, dort das Kapitel 3.5 Methoden eines Objekts.
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 13:45 
Huch, den von mir gezeigten Quellcode ist ein Hybrid Code aus dem Bonacina-Buch und meiner Version. Wie das Zustande kommt, verstehe ich nicht.

Daher werde ich die beiden Codebeispiele noch einmal posten und zwar in getrennten Postings:


Hier der Bonacina-Quellcode:

ausblenden volle Höhe 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:
// using System;

namespace ÜbungOOPMethode3
{
    class House
    {
        public int BaseArea;
        public int Height;
        public int WindowAmount;
        public string RoofType;
        public string Color;

        public void SetBaseArea(int baseArea)
        {
            BaseArea = baseArea;
        }

        public void SetHeight(int houseHeight)
        {
            // Das Schlüsselwort 'this' ist optional. Wird aber von Bonacina streng ans Herz gelegt.
            this.Height = houseHeight;
        }

        public void SetWindowAmount(int amountWindows)
        {
            this.WindowAmount = amountWindows;
        }

        public void SetRoofType(string myRoofType)
        {
            this.RoofType = myRoofType;
        }

        public void SetColor(string houseColor)
        {
            this.Color = houseColor;
        }

        public double CalculateVolume()
        {
             double houseVolume = Height * BaseArea;

            if (RoofType == "gabled roof") houseVolume *= 0.75;
            // System.Console.WriteLine(houseVolume);
            return houseVolume;
            // System.Console.WriteLine(houseVolume);
        }

        public void DisplayHouseValues()
        {
            System.Console.WriteLine("The attributes of my house:\n");
            System.Console.WriteLine($"The base area of that building is: {BaseArea} square meters.");
            System.Console.WriteLine($"The height of that building is: {Height} meters.");
            System.Console.WriteLine($"The amount of windows of that building are: {WindowAmount} windows.");
            System.Console.WriteLine($"The color of that building is: {Color}.");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            House myHouse = new House();

            //myHouse.BaseArea = 1200;
            //myHouse.Height = 20;
            //myHouse.WindowAmount = 100;
            //myHouse.RoofType = "flat roof";
            //myHouse.Color = "greyish white";

            myHouse.SetBaseArea(1200);
            myHouse.SetHeight(20);
            myHouse.SetWindowAmount(100);
            myHouse.SetRoofType("gabled roof");
            myHouse.SetColor("greyish white");

            myHouse.DisplayHouseValues();

            // yHouse.CalculateVolume();
            System.Console.WriteLine(myHouse.CalculateVolume());

            //System.Console.WriteLine("The attributes of my house:\n");
            //System.Console.WriteLine($"The base area of that building is: {myHouse.BaseArea} square meters.");
            //System.Console.WriteLine($"The height of that building is: {myHouse.Height} meters.");
            //System.Console.WriteLine($"The amount of windows of that building are: {myHouse.WindowAmount} windows.");
            //System.Console.WriteLine($"The color of that building is: {myHouse.Color}.");


            System.Console.WriteLine("\nPress any key to exit...");
            System.Console.ReadKey();

        }
    }
}
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 13:47 
Hier meine Version, in der ich das Volumen des Hauses mit Giebeldach ohne Rückgabewert nutze:

ausblenden volle Höhe 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:
// using System;

namespace ÜbungOOPMethode3
{
    class House
    {
        public int BaseArea;
        public int Height;
        public int WindowAmount;
        public string RoofType;
        public string Color;

        public void SetBaseArea(int baseArea)
        {
            BaseArea = baseArea;
        }

        public void SetHeight(int houseHeight)
        {
            // Das Schlüsselwort 'this' ist optional. Wird aber von Bonacina streng ans Herz gelegt.
            this.Height = houseHeight;
        }

        public void SetWindowAmount(int amountWindows)
        {
            this.WindowAmount = amountWindows;
        }

        public void SetRoofType(string myRoofType)
        {
            this.RoofType = myRoofType;
        }

        public void SetColor(string houseColor)
        {
            this.Color = houseColor;
        }

        public void CalculateVolume()
        {
             double houseVolume = Height * BaseArea;

            if (RoofType == "gabled roof") houseVolume *= 0.75;
            System.Console.WriteLine(houseVolume);
            // return houseVolume;
            // System.Console.WriteLine(houseVolume);
        }

        public void DisplayHouseValues()
        {
            System.Console.WriteLine("The attributes of my house:\n");
            System.Console.WriteLine($"The base area of that building is: {BaseArea} square meters.");
            System.Console.WriteLine($"The height of that building is: {Height} meters.");
            System.Console.WriteLine($"The amount of windows of that building are: {WindowAmount} windows.");
            System.Console.WriteLine($"The color of that building is: {Color}.");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            House myHouse = new House();

            //myHouse.BaseArea = 1200;
            //myHouse.Height = 20;
            //myHouse.WindowAmount = 100;
            //myHouse.RoofType = "flat roof";
            //myHouse.Color = "greyish white";

            myHouse.SetBaseArea(1200);
            myHouse.SetHeight(20);
            myHouse.SetWindowAmount(100);
            myHouse.SetRoofType("gabled roof");
            myHouse.SetColor("greyish white");

            myHouse.DisplayHouseValues();

            myHouse.CalculateVolume();
            // System.Console.WriteLine(myHouse.CalculateVolume());

            //System.Console.WriteLine("The attributes of my house:\n");
            //System.Console.WriteLine($"The base area of that building is: {myHouse.BaseArea} square meters.");
            //System.Console.WriteLine($"The height of that building is: {myHouse.Height} meters.");
            //System.Console.WriteLine($"The amount of windows of that building are: {myHouse.WindowAmount} windows.");
            //System.Console.WriteLine($"The color of that building is: {myHouse.Color}.");


            System.Console.WriteLine("\nPress any key to exit...");
            System.Console.ReadKey();

        }
    }
}
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 14:00 
Zitat:
user profile iconRalf JansenIn deinem Pseudocode ist Calculation immer noch unnötig. Das was du berechnest willst du auch ausgeben jetzt hast du nur die Ausgabe von CalcInput in CalcOutput geschoben und Calculation wird ignoriert. Du musst schon das was aus Calculation rauskommt im nächsten Schritt verwenden.


Oh, da gibt es ein Missverständnis :oops:

Ich mach mal ein repeat:

* Ich schrieb einen extrem rudimentären Code für einen "Taschenrechner".
* Du schriebst Pseudocode, um mir zu zeigen, in welche Richtung mein Code gehen sollte.
* Daraufhin schrieb ich auch Pseudocode, der exakt Deinen Pesudocode auf meinen Taschenrechner spiegeln sollte, um festzustellen, ob ich Deinen Pseudocode überhaupt verstanden habe.

Logischerweise stellt mein Pseudocode nicht eine Lösung, sondern meinen alten Code dar.
Daran knüpfte ich die Frage, ob ich meinen alten Code "der Taschenrechner mit der sinnlosen Rückgabewert-Methode" richtig in Pseudocode umgesetzt habe?
Wenn ja, habe ich Deinen Pseudocode verstanden. Wenn nein, habe ich Deinen Pesudocode nicht verstanden.
ausblenden C#-Quelltext
1:
2:
if (myPseudocode != yourPseudocode) WriteLine("Old Cat versteht den Pseudocode von Ralf nicht.");
else if (myPseudocode == yourPseudocode) WriteLine("Old Cat kann Ralfs Pseudocode richtig lesen und wird sich an die Umsetzung machen.");

EDIT: Ich möchte mich zwischendurch bei euch allen einmal bedanken, mit welcher Geduld ihr mir helft! Danke an euch alle!! :beer:
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.11.21 14:12 
Ah. Du wolltest den Ist Zustand deines Codes zeigen und nicht wo du hin solltest ;)
In dem Fall passt das ungefähr. Im eigentlichen Code hast du die Ausgabe von Calculation nicht mal irgendwelchen Variablen zugeordnet.
Aber ob du die Rückgabe einer Variablen zuweist und dann ignorierst oder gleich auch die Variable(n) weglässt macht keinen unterschied.
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Mo 29.11.21 14:18 
Zitat:
user profile iconRalf JansenIm eigentlichen Code [...]
Meintest Du damit den Bonacina-Code oder meinen bisherigen Taschenrechner-Code?

PS: Wenn Du den eigentlichen Bonacina-Code meinst:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public void CalculateVolume()
{
    double houseVolume = Height * BaseArea;

    if (RoofType == "gabled roof") houseVolume *= 0.75;
    System.Console.WriteLine(houseVolume);
    // return houseVolume;
    // System.Console.WriteLine(houseVolume);
}


Schätze ich, Du meinst Height * BaseArea?
Da nutze ich direkt die Felder aus der Klasse.

Meintest Du aber meinen (eigentlichen) Taschenrechner-Code und dort diese Stelle:

ausblenden C#-Quelltext
1:
2:
3:
4:
static int Calculation(int a, int b)
{
    return a + b;
}


Da dachte ich, dass ich 'a' und 'b' nicht mehr als int kennzeichnen müsste, da sie ja schon als Übergabeparameter "int" sind.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.11.21 14:37 
Ich meinte deinen Taschenrechner. Die Calculation Methode ist so schon richtig. Der Aufruf der Methode macht aber keinen Sinn wenn man den Return Wert nicht benutzt.
Du hast einfach Calculation(userInput1, userInput2); aufgerufen aber mit dem Ergebnis das aus der Methode fällt nichts gemacht. Du mußt es schon z.b. in einer Variablen ablegen um damit weiterzuarbeiten, so ist es einfach weg.