Autor Beitrag
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 02.12.21 08:47 
Niemand hat behauptet, das du "dumm" seist - und wenn mein Post dem Vorschub geleistet hat, bitte ich um Entschuldigung.

Sich beleidigt dann vom Acker zu machen ist auch nicht sehr zielführend, denn man lernt daraus nichts (außer vielleicht, einer schwierigen Sache aus dem Weg zu gehen). Das Thema mit den Rückgabewerten ist derart essentiell und grundlegend, das du ohne ein solches Verständnis eigentlich gar nicht weiter in Sachen Programmierung weitermachen brauchst. Ähnlich wie in der Grundschule: Wenn du Addition nicht verstanden hast, wirst du Multiplikation erst recht nicht verstehen und somit die ganze Mathematik ein komplettes Rätsel bleiben ;)

Zitat:
Entschuldigt bitte. Das hätte ich natürlich erwähnen müssen: Ich habe bisher absichtlich nur die Addition implementiert, bis ich das Thema mit den Rückgabewerten richtig vertanden habe und diese auch richtig einsetze. Daher sind die anderen Grundrechenarten erstmal nur //TODO:

Dann implementiere die anderen Grundrechenarten auch. Ich bin sehr gespannt zu sehen, wie du das löst.

Zitat:
Und fragte mehrmals die Frage: Wofür sind Rückgabewerte notwendig, bzw. zwingend notwendig? Wofür brauche ich sie? Wann kann ich sie weg lassen?

Das sind mehrere Fragen, aber der Reihe nach:

Rückgabewerte diesen dazu, Ergebnisse, die in einer Programmfunktion errechnet wurden, an die aufrufende Funktion zurückzugeben, so das diese Funktion wiederum mit den Ergebnissen weiter arbeiten kann. Wie grundlegend das ist, mag folgendes Beispiel, aus deinem Code entnommen, aufzeigen:
ausblenden C#-Quelltext
1:
int userChoice = int.Parse(System.Console.ReadLine());					


Nehmen wir das Console.ReadLine(). Dieses liefert die Benutzereingabe zurück (!) die gemacht wurde, bis der Benutzer die Entertaste gedrückt hat. Was wäre, wenn Console.ReadLine() nun keine Rückgabewerte hätte - du also die Methode aufrufst, der User "1[Enter]" eintippt und du trotzdem nicht weisst, was der User da eingegeben hat ? Das Console.Readline() liefert ja jetzt nichts mehr zurück, hat ja keinen Rückgabewert mehr.

Du würdest also, ohne den Rückgabewert von Console.Readline() genau gar nichts wissen - außer, das der User ENTER gedrückt hat, denn dein Programm wartet nicht mehr am Aufruf von Console.Readline() :D

Dafür sind Rückgabewerte wichtig.

Nächstes Beispiel ist int.Parse(Console.Readline()), in diesem Fall das Parse. Was könntest du denn int.Parse mitgeben, das es in einen integer umwandeln soll, wenn du von ReadLine() gar nichts zurückbekommst ? Genau: Nix.

Ohne Rückgabewerte ist dein Programm spätestens hier unmöglich zu einer korrekten Funktion zu bringen, denn du weisst ja nicht mal, was der User eingegeben hat. Keine Operatorenauswahl, keine Werte, nichts. Nur, das er Enter gedrückt hat.

Zwingend notwendig sind Rückgabewerte nicht. Es gibt tatsächlich Methoden, die nur eine Operation ausführen, ohne irgendetwas zurückgeben zu können (weil es z.B. sinnlos ist). Console.WriteLine() ist so eine Funktion, denn sie bringt den übergebenen Text zur Anzeige auf die Konsole. Dafür braucht sie nichts zurückgeben, nicht mal ein "war erfolgreich" - denn man geht einfach davon aus, das das mit der Konsole schon klappen wird ;) Womit dann auch die letzte deiner Fragen beantwortet ist.

Was nun deinen Taschenrechner angeht: Es ist schon wichtig zu wissen, was der Benutzer da eingegeben hat. Darum ist Console.ReadLine() eine Funktion mit Rückgabewert. Die Umwandlung in einen integer mit int.Parse ebenfalls, denn es ist die eigentliche Information, die wir haben wollen: Die Usereingabe, aber als integer-Wert.

Auch die Werte deiner Methoden Addition, Subtraktion etcpp. sind wichtige Informationen, liefern sie doch das Ergebnis der vom User gewünschten Operation.


Hilft das vielleicht weiter ?

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.

Für diesen Beitrag haben gedankt: OldCat
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: Do 02.12.21 11:07 
Zitat:
Niemand hat behauptet, das du "dumm" seist - und wenn mein Post dem Vorschub geleistet hat, bitte ich um Entschuldigung.
Zitat:
Sich beleidigt dann vom Acker zu machen ist auch nicht sehr zielführend, denn man lernt daraus nichts (außer vielleicht, einer schwierigen Sache aus dem Weg zu gehen).
Das Gefühl "ich komme mir dumm vor", kommt natürlich in erster Linie aus mir selbst. Vorschub geleistet hat hier im Forum nur der Post vom Moderator user profile iconTh69
Zitat:
So langsam wird dies ein Endlos-Thema. Es kann doch nicht sein, daß du immer noch nicht die gezeigten Code-Beispiele verstehst?
Der Grund, warum ich dann aber zu dem Schluss kam, den Thread zu beenden, war sein erster Satz "so langsam wird das hier ein Endlosthema". Daraufhin habe ich mal den Begriff "Endlosthema" nachgeschlagen. Es scheint also in zumindest einigen Foren die Regel zu geben, dass Threads so kurz wie möglich sein müssen.
Offensichtlich ist user profile iconTh69 also dieses Thema hier langsam zu lang. Im Grunde habe ich seinen Post so verstanden, dass es jetzt für ihn hier langsam an der Zeit ist, "zum Punkt zu kommen". Da ich mich persönlich aber noch nicht so fühle, als wenn ich diesen Punkt erreicht habe, und die Supervision meines Quellcodes für den Taschenrechner nicht komplett ist, habe ich entschlossen auf Th69 zu hören, und den Thread dann eben zu beenden. Natürlich schwang da in meinem Post eine gehörige Portion Enttäuschung mit...

Also lieber Th69, wenn es auch für Dich okay ist, dass wir das Ding hier zu Ende bringen, wäre ich Dir sehr verbunden! Wenn Du aber sagst, Du möchtest, dass der Thread jetzt sein Ende findet, dann würde ich OlafSt, Ralf Jansen oder Palladin007 fragen, ob es vielleicht per PN oder über einen anderen "Kanal" möglich ist, das Problem zu ende zu bringen. Dort, wo Endlosthreads keine Rolle spielen.
Sollte beides nicht der Fall sein (keine PN oder alternative Kommunikationskanäle, oder Fortführung dieses Threads), bleibt mir ja gar nichts anderes übrig, als "goodbye" zu sagen, aber nur, was diess Thema hier angeht, versteht sich.
Allerdings hätte ich dann wohl in Zukunft immer die Angst, ein zukünftiges Problem nicht schnell genug zu verstehen, wenn ich hier ein neues Thema aufmachen würde... Ist ein persönliches Problem...

@user profile iconOlafSt Okay, ich werde die anderen Grundrechenarten implementieren. Bin selber gespannt, wie ich das wohl lösen werde :lupe:

Je nachdem, wie Th69 über diesen Thread nun entscheidet, und folglich dann Du Dich entscheidest, oder Palladin007 oder Ralf Jansen, wie mit meinem Thema weiter verfahren wird, werde ich Dir/euch gerne das Resultat zeigen. Beziehungsweise mein Verständnis Problem weiter erörtern...

Ich mache mich dann erstmal an den Quellcode... (es ist übrigens mein allerserstes, vollkommen eigenes Programm, das ich schreibe).
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: Do 02.12.21 12:22 
Ne, keine PN.
Endlos-Themen (:P) sind das Eine, wenn es aber auch nur Einen gibt, der darauf reagieren kann, wird so ein Endlos-Thema schnell anstrengend ;)
Das macht ja den Reiz von so einem Forum aus - abgesehen davon, dass Andere vielleicht ähnliche Schwierigkeiten haben, wie Du.

user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
Dann implementiere die anderen Grundrechenarten auch. Ich bin sehr gespannt zu sehen, wie du das löst.

Das solltest Du in der Tat tun.

Wenn Du in deinem Code herausfinden willst, warum Du Rückgabewerte verwenden solltest, dabei aber alles weg lässt, was sie notwendig machst ... naja, Du merkst, das klingt nicht sehr sinnvoll ;)
Also führ das weiter und teste es so, dass Du ohne Code-Änderung (!) immer andere Rechenarten auswählen kannst.

Und noch eine Vorgabe: Nur eine Ausgabe.
Also ein Stück Code, was das Ergebnis ausgibt, egal welche Rechenart ausgewählt wurde.
Also so, wie Du es aktuell hast (am Ende das Console.WriteLine), nur dass es bei jeder Auswahl das richtige Ergebnis ausgibt und nicht nur Addition.
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: Do 02.12.21 14:45 
Zitat:
Also führ das weiter und teste es so, dass Du ohne Code-Änderung (!) immer andere Rechenarten auswählen kannst.
Lieber Palladin007, diesen Satz habe ich nicht ganz verstanden. :gruebel: Um die anderen Grundrechenarten zu implementieren, muss ich doch den Code ändern? Meinst Du bestimmten, schon bestehenden Code, den ich nicht ändern soll(te)?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.12.21 15:01 
user profile iconOldCat hat folgendes geschrieben Zum zitierten Posting springen:
Um die anderen Grundrechenarten zu implementieren, muss ich doch den Code ändern?
Damit ist nicht die Implementierung selbst gemeint, sondern die Verwendung danach.

Sprich: Die Rechenart soll durch Eingabe im Programm ausgewählt werden, nicht indem du den Code immer entsprechend änderst. Also so wie bei einem normalen Taschenrechner auch.
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Do 02.12.21 15:25 
@OldCat: Was das Problem mit dem Verstehen angeht: Das wird dir noch unglaublich oft passieren, gewöhne dich daran ;) Ich programmiere seit 40 Jahren und auch ich stehe hin und wieder da und denke: "Hä ?!?"

Wsa @Palladin007 meinte, ist folgendes: Wenn du dein Programm fortsetzt, wird dir auffallen, das du nur addieren kannst. Willst du also eine Subtraktion oder Division machen, musst du den Code ändern, um das gewünschte Ergebnis zu bekommen.

Und genau diese Code-Herumänderei soll (und darf !) nicht passieren. Du installierst ja auch kein neues Windows, wenn du mal was doppelt anklicken willst :D

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
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: Do 02.12.21 15:36 
Meinen Plan zur "Implementierung" des Codes verrate ich schon mal:

In meinen Augen ist die Implementierung der vier Grundrechenarten in dem von mir gezeigten Code genau genommen ja schon abgeschlossen:
Der Anwender kann ja bereits über die switch case Anweisung eine der vier Grundrechenarten auswählen. Mein Code führt dann ja auch die jeweils gewählte Berechnung bereits aus, und gibt ein Ergebnis zurück. In der Konsole wird aber nur die Addition ausgegeben.
Jetzt suche ich gerade einen Weg, wie in der Variablen double result für alle vier Grundrechenarten das Ergebnis auf der Konsole ausgegeben werden kann. :lupe: Ohne den schon bestehenden Code zu verändern.

Mir ist klar, dass mein Taschenrechner dann nur dazu taugen wird, dass zwei Numerale miteinander verrechnet werden können. Und mein Bauchgefühl sagt mir, dass ich den Code von Anfang an wohl ganz anders hätte aufbauen müssen, um das zu erreichen. :les:
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: Do 02.12.21 15:49 
user profile iconOldCat hat folgendes geschrieben Zum zitierten Posting springen:
Mein Code führt dann ja auch die jeweils gewählte Berechnung bereits aus, und gibt ein Ergebnis zurück. In der Konsole wird aber nur die Addition ausgegeben.

Weil Du in der Zeile, die in die Konsole schreibst, nochmal die Methode zum Addieren aufrufst.

Dein Code:
ausblenden C#-Quelltext
1:
System.Console.WriteLine($"The result of your addition is: {Calculation.Addition(digit1, digit2)}");					

Da rufst Du die Methode nochmal auf, aber immer nur "Addition", egal was vorher ausgewählt wurde.

Die Lösung habe ich vor einer Weile schon geschrieben:

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Warum nutzt Du nicht wie vorher den Rückgabewert und gibst den aus?
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst im Switch auch Variablen zuweisen.
Vorher definieren, im switch zuweisen, danach ausgeben.
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: Do 02.12.21 18:43 
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:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
namespace Taschenrechner2
{
    internal class CalcInput
    {
        // private static char userDecision;

        // NumeralsChoice() und OperatorChoice() zusammelegen, als ChooseInputs()?
        public static void ChooseInputs()
        {
            double result = 0;
            char userDecision = default;

            do
            {
                System.Console.WriteLine("Please enter your first digit: ");
                double digit1 = double.Parse(System.Console.ReadLine());
                System.Console.WriteLine($"You chose: {digit1}");

                System.Console.WriteLine("Please enter your second digit: ");
                double digit2 = double.Parse(System.Console.ReadLine());
                System.Console.WriteLine($"You chose: {digit2}");

                System.Console.WriteLine(@"Choose your operator by number and hit enter:

> 1.) Addition
> 2.) Subtraction
> 3.) Multiplication
> 4.) Division"
);

                int userChoice = int.Parse(System.Console.ReadLine());

                // double result = 0;
                // char userDecision;

                switch (userChoice)
                {
                    case 1:
                        result = Calculation.Addition(digit1, digit2);
                        // Calculation.Addition(digit1, digit2);
                        break;
                    case 2:
                        result = Calculation.Subtraction(digit1, digit2);
                        break;
                    case 3:
                        result = Calculation.Multiplication(digit1, digit2);
                        break;
                    case 4:
                        result = Calculation.Division(digit1, digit2);
                        break;
                    default:
                        System.Console.WriteLine("Your input is invalid. Try again, with numerals 1 - 4.");
                        ChooseInputs();
                        break;
                }
                System.Console.WriteLine(result);

                System.Console.WriteLine("Do you like to solve another arithmetical problem? (y/n)");
                userDecision = char.Parse(System.Console.ReadLine());
            } while (userDecision == 'y');
            //System.Console.WriteLine("Please enter your first digit: ");
            //double digit1 = double.Parse(System.Console.ReadLine());
            //System.Console.WriteLine($"You chose: {digit1}");

            //System.Console.WriteLine("Please enter your second digit: ");
            //double digit2 = double.Parse(System.Console.ReadLine());
            //System.Console.WriteLine($"You chose: {digit2}");

            //System.Console.WriteLine(@"Choose your operator by number and hit enter:

//> 1.) Addition
//> 2.) Subtraction
//> 3.) Multiplication
//> 4.) Division");

//            int userChoice = int.Parse(System.Console.ReadLine());

//            double result = 0;

//            switch (userChoice)
//            {
//                case 1:
//                    result = Calculation.Addition(digit1, digit2);
//                    // Calculation.Addition(digit1, digit2);
//                    break;
//                case 2:
//                    result = Calculation.Subtraction(digit1, digit2);
//                    break;
//                case 3:
//                    result = Calculation.Multiplication(digit1, digit2);
//                    break;
//                case 4:
//                    result = Calculation.Division(digit1, digit2);
//                    break;
//                default:
//                    System.Console.WriteLine("Your input is invalid. Try again, with numerals 1 - 4.");
//                    ChooseInputs();
//                    break;
//            }

            //double result = 0;
            //if (userChoice == Calculation.Addition(digit1, digit2)) System.Console.WriteLine(result);
            //// if (Calculation.Addition(digit1, digit2) == 
            //else if (userChoice == Calculation.Subtraction(digit1, digit2)) System.Console.WriteLine(result);
            //else if (userChoice == Calculation.Multiplication(digit1, digit2)) System.Console.WriteLine(result);
            //else if (userChoice == Calculation.Division(digit1, digit2)) System.Console.WriteLine(result);

            // System.Console.WriteLine(Calculation.Addition(digit1, digit2));
            // double result = Calculation.Subtraction(digit1, digit2);
            // System.Console.WriteLine(result);

            // CalcOutput.Results();
        }
    }
}
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: Do 02.12.21 19:20 
Hab sogar ne do while Schleife hin bekommen, damit der Anwender anschließend eine neue Eingabe machen kann. :dance2:
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: Do 02.12.21 19:25 
Teste es doch mal:
Kannst Du einmal starten und dann mehrere unterschiedlichen Berechnungen durchführen?
Und ich sehe auf Anhieb keinen groben Fehler.

Allerdings würde ich es aufsplitten.

Z.B. könntest Du den Inhalt der while-Schleife als eigene Methode herauslösen, die dann alles für genau eine Berechnung (Eingaben, Rechnen, Ausgabe) enthält.
Die zweite Methode enthält die while-Schleife, die Abfrage, ob man weiter machen möchte und den Aufruf der Methode mit der eigentlichen Arbeit.
Du erreichst dann zwei kleinere Methoden, die dadurch übersichtlicher sind.
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: Do 02.12.21 19:44 
Grundsätzlich teste ich jeden Code, den ich hier poste. Es wäre mir nichts peinlicher, als hier stolz Code zu zeigen, der dann offenbar dysfunktional wäre :tongue: PS: Und definitiv ist nichts geiler, als Code, der funktioniert :D

Also ja, ich habe den Code auf alle 4 Grundrechenarten angewandt. Sowie den Ausstieg aus dem Code, durch wählen von "n". Der Code funktioniert einwandfrei, und die IDE meckert auch nicht. Alles im Grünen Bereich...

Das bedeutet auch: Ich sehe keinen groben Fehler, egal wie oft ich den Code durchgehe :oops:

Nachtrag: Deine Tipps werde ich mal versuchen umzusetzen. Habe selber auch noch Ideen für den Taschenrechner ... mit nem echten Taschenrechner für 4 Grundrechenarten kann meiner ja noch lange nicht mithalten...
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: Do 02.12.21 21:07 
Ach ...(K)einen groben Fehler :rofl: Oh man... wer lesen kann, ist klar im Vorteil :P
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Fr 03.12.21 08:36 
Was deinen Code angeht: Das ist wie mit dem Korrekturlesen von eigenen Briefen oder Texten. Diese soll man nicht selbst Korrekturlesen, weil man die gemachten Rechtschreib- und Grammatikfehler schlicht nicht sieht. Sowas gibt man immer jemand anderem zum korrigieren.

Ähnlich ist es mit Code: Fehler darin findest du selbst so gut wie nie durch einfaches "immer wieder draufstarren" ;) Der Compiler findet die ganz bösen Dinger wie Tippfehler, Klammerfehler etc., der Debugger dann die logischen Fehler. Wir haben hier im Unternehmen ein 6-Augen-Prinzip eingeführt: Es müssen immer erst zwei weitere Kollegen den Code begutachtet und abgenommen haben, bevor das Zeug in die nächste Version gelangt. Hat sich extrem bewährt ;)

Und ja, es ist ein ausgesprochen cooles Gefühl, sein eigenes Werk nach all der harten Arbeit, dem Fluchen, Lachen und Weinen funktionieren zu sehen - was denkst du, wieso ich das schon 4 Dekaden lang mache ? :D :D :D

Aber nun zur wichtigsten Frage, bevor wir weiter deinen Code perfektionieren :D

Verstehst du nun den Sinn von Rückgabewerten, wofür sie gut sind und wann man sie einsetzt ?

Wenn uns die Antwort gefällt, können wir den Thread hier als abgeschlossen markieren und du kannst einen neuen aufmachen, in dem wir deinen Code weiter aufhübschen :D In Forenthreads gilt dasselbe Prinzip wie in der Programmierung: Nur ein Thema je Aufgabe ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.

Für diesen Beitrag haben gedankt: OldCat
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: Fr 03.12.21 09:57 
Du hast es also jetzt endlich geschafft, die Rückgabewerte zu benutzen - ich hoffe, du verstehst jetzt deren Bedeutung und Sinn (auf deinen auskommentierten Code, Zeile 101-105, gehe ich jetzt mal diesbzgl. nicht näher ein - ich hoffe aber, du verstehst, war daran syntaktisch und logisch [semantisch] falsch ist?).

Es gibt trotzdem noch einen logischen Fehler - und zwar der rekursive Aufruf von ChooseInputs(): gib mal zuerst eine falsche Operatorauswahl ein (z.B. 5) und danach eine richtige, dann beende die Schleife (mit z.B. n) und beobachte die Ausgabe danach.
Um das zu beheben ist es eben sinnvoll, die einzelnen Codeteile in eigene Methoden zu gliedern (und nur das aufzurufen, was man auch haben will - hier also die Eingabe) - aber hier würde es besser sein, die Schleife zu wiederholen, anstatt der Rekursion.

PS: Der char.Parse-Aufruf ergibt eine FormatException, falls der Benutzer mehrere Zeichen (z.B. "yes" oder "no") eingibt und das sollte es wohl nicht - frag einfach das erste Zeichen ab (falls die Eingabe nicht leer ist) - aber wenigstens hast du ja auch hier den Rückgabewert in einer Variablen gespeichert ;-).

Und so wie OlafSt schon geschrieben, erzeuge für weitere Codeverbesserungen ein neues Thema (kannst aber auf dieses dort verlinken).
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: Fr 03.12.21 15:58 
OlafSt hat folgendes geschrieben:
Verstehst du nun den Sinn von Rückgabewerten, wofür sie gut sind und wann man sie einsetzt ?

Wenn uns die Antwort gefällt, können wir den Thread hier als abgeschlossen markieren und du kannst einen neuen aufmachen, in dem wir deinen Code weiter aufhübschen :D In Forenthreads gilt dasselbe Prinzip wie in der Programmierung: Nur ein Thema je Aufgabe


Ja, selbst gehe ich davon aus, dass ich den Sinn von Rückgabewerten verstanden habe. Ich versuche es mal mit meinen eigenen Worten zu beschreiben, statt Gelesenes einfach abzuspulen:

Zu Beginn fragte ich mich, ob Rückgabewerte denn zwingend notwendig seien, da ich selbst keine zwingende Notwendigkeit sah. Diese Beobachtung hat sich auch als richtig herausgestellt.
Rückgabewerte sind zwar nicht zwingend notwendig, und doch besitzen sie eine gewisse "Essenzialität". Ich kann mit Rückgabewerten den Code übersichtlicher/kompakter und modularer/wiederverwendbarer gestalten. Rückgabewerte helfen mir bei der "Kommunikation zwischen Klassen". Es wurde mir auch gesagt, dass Rückgabewerte Teil des Paradigmas des objektorientierten Programmierens ist. Selbst habe ich nie eine Programmiersprache gesehen oder gelernt, die nicht dem Paradigma des ooP folgt. Daher kann ich das nicht beurteilen. Aber ich merke es schon, da ich ja mit Rückgabewerten, Methoden aus verschiedenen Klassen miteinander kommunizieren lassen kann. (Methode() xy aus Klasse zz tut etwas und gibt einen Wert zurück. Es gibt einen Wert an eine Methode oder Anweisung zurück, welche eben diese Methode() xy aus Klasse zz aufruft).

Das ist dies, was ich jetzt als Start im Thema Rückgabewerte meine verstanden zu haben. Zu Beginn dieses Threads hätte ich immer nur void Methoden geschrieben. Doch jetzt würde ich immer wo ich kann, mit Rückgabewerten an bestimmte "Aufrufer" verwenden, da es den Code eine gewisse "Flexibilität" gibt...

:hair:

Moderiert von user profile iconTh69: Beiträge zusammengefasst

PS: Alles Weitere, wenn ich die Prüfung "Rückgabewerte" bestanden habe, dann in einem neuen Thread :flehan:

Moderiert von user profile iconTh69: C# durch Quote-Tags ersetzt.
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 04.12.21 10:53 
Hmmm ... gehe ich richtig der Annahme, dass meine Worte zum Thema "Rückgabewerte" missfallen erregt haben? Oder bin ich jetzt einfach zu ungeduldig, eure Antwort abzuwarten?

Wenn ich "versagt" haben sollte, und ihr darin keinen Sinn mehr seht, an mir Zeit zu verschwenden, dann wäre es mir lieb, wenn ihr mir das sagt.
Dann weiß ich, woran ich bin.
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: Sa 04.12.21 12:53 
Es liest sich jetzt halbwegs schlüssig, aber ob du das wirklich verstanden hast, zeigt eigentlich nur die weitere Praxis.
Daher verbessere deinen Code entsprechend des Vorschlags von Ralf Jansen:
ausblenden C#-Quelltext
1:
2:
3:
var userInput = CalcInput();
var result = Calculation(userInput);
CalcOutput(result);


Eine der wichtigsten Regeln beim (professionellen) Programmieren lautet nämlich: Trennung von IO (Eingabe, Ausgabe) und Logik.
Die Logik-Klassen (bzw. Methoden) sollten so erstellt werden, daß sie unabhängig von deren Benutzung sind (also z.B. in welchem Projekttyp sie verwendet werden).

Für die Übergabe mehrerer Rückgabewerte kannst du entweder eine eigene Klasse (oder Struktur)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
class UserInputs
{
  public double number1, number2;
  // ...
}

oder aber die Tuple-Klasse benutzen:
ausblenden C#-Quelltext
1:
Tuple<doubledouble>					

(diese haben aber den Nachteil, daß man die Eigenschaftsnamen ItemX nicht selber benennen kann)
Alternativ gingen auch noch sog. Ouput-Parameter (nur der Vollständigkeit halber).

Für diesen Beitrag haben gedankt: OldCat
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 04.12.21 13:43 
Th69 hat folgendes geschrieben:
Es liest sich jetzt halbwegs schlüssig, aber ob du das wirklich verstanden hast, zeigt eigentlich nur die weitere Praxis.


Okay, dann ist damit dieser Thread im Grunde abgehakt. Das "Taschenrechner" Projekt werde ich mit Verweis auf diesen Thread, wie gemeinsam besprochen, in einem neuen Thema behandeln.
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: Sa 04.12.21 15:12 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:

oder aber die Tuple-Klasse benutzen:
ausblenden C#-Quelltext
1:
Tuple<doubledouble>					

(diese haben aber den Nachteil, daß man die Eigenschaftsnamen ItemX nicht selber benennen kann)
Alternativ gingen auch noch sog. Ouput-Parameter (nur der Vollständigkeit halber).

Bitte kein Tuple :/
Die Dinger sind sehr oft ein Zeichen für schlechten Code - selbst wenn man deinen schon genannten Nachteil ignoriert.

Wenn unbedingt Tuple sein muss, dann lieber ValueTuples.
Die können immer noch ein Zeichen für schlechten Code sein, aber man hat nicht mehr den Nachteil der fehlenden Namen.
Ich nutze sie ganz gerne innerhalb einer Klasse für private-Methoden oder innerhalb einer Methode selber für fortgeschrittene Themen wie z.B. LINQ. Nimm das aber überhand, schreibe ich auch dafür eine Klasse.

Am besten wäre aber, Du überlegst dir, ob das nicht generell ein Zeichen dafür ist, dass die Methode zu viel macht.
Es gibt ein paar Ausnahmen, die brauchen zwingend mehrere Rückgabewerte, aber die sind eben nur das: Ausnahmen.
Oder, wenn es wirklich nicht anders geht, dann wäre eine eigene Klasse angebracht.

Die gleiche Frage muss man sich bei out-Parametern natürlich auch stellen, es ist nur anderer Weg, das gleiche Problem (mehrere Rückgabewerte) zu lösen.
Aber gerade bei den eben erwähnten Ausnahmen (z.B. die ganzen TryParse-Methoden) sind out-Parameter eine nützliche Sache, da sie z.B. im if ein paar Vorteile bringen.

Bei allen diesen Wegen sollte man sich sicher sein, wenn man sie nutzt, ansonsten riskiert man langfristig sehr chaotischen Code.

Für diesen Beitrag haben gedankt: OldCat