Autor Beitrag
MaxBegOfProg
Hält's aus hier
Beiträge: 5

WIN 10
C# (VS 2019), HTML (VS 2019), CSS (VS 2019), JS (VS 2019)
BeitragVerfasst: Di 03.11.20 18:06 
Guten Abend an alle,

ich bin neu hier und das wird mein erster Post, falls ich also etwas falsch mache gerne Rückmeldung dazu! (Ich lerne erst seit ein paar Wochen programmieren daher bitte etwas Nachsicht)
Ich habe bisher ein Programm fertig das den Namen moneyBox träg (Sparschwein), hierein habe ich die Möglichkeit Münzen (Euro und Cent) Einzuzahlen, mir den aktuellen Stand abfragen zu lassen und Auszahlungen vorzunehmen. Soweit gefällt mir auch alles bis auf ein paar kleine optische Feinheiten. Mein Problem habe ich allerdings mit der Auszahlungsmethode die ich euch hier online stelle. In dieser möchte ich einen vom Benutzer eingegebenen Betrag auszahlen lassen. Hierbei muss allerdings die Auszahlung mit so wenigen Münzen wie möglich realisiert werden, das heißt erst die größten Münzen bis nach unten zu den kleinsten (falls möglich natürlich)! Alle Zahlenwerte hierin sind int und die Eigenschaften "moneyBox[index].Münze" enthalten nur Stückzahlen der Wertigkeiten.
Ich weis auch vom Verständnis wie ich das mit abfragen hinbekommen könnte, allerdings tu ich mich Code-technisch noch ein wenig schwer dies zu realisieren. Vielleicht kann mir hier jemand helfen, vielen Dank euch vorab!

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:
public static void WithdrawMoney(int index)
        {
            Console.Clear();

            int withdrawTwoEuro, withdrawOneEuro, withdrawOneCent, withdrawTwoCent, withdrawFiveCent, withdrawTenCent, withdrawTwentyCent, withdrawFifftyCent;

            Console.WriteLine("Bitte geben Sie an wie viel Euro und wie viel Cent Sie abheben möchten.");
            Console.WriteLine("\n");
            Console.WriteLine("Abzuhebender Euro-Betrag:");
            int withdrawEuro = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Abzuhebender Cent-Betrag:");
            int withdrawCent = Convert.ToInt32(Console.ReadLine());
            int withdraw = withdrawCent + (withdrawEuro * 100);

            if (withdraw != 0)
            {
                if (moneyBoxes[index].TwoEuro >= (withdraw / 200))
                {
                    withdrawTwoEuro = withdraw / 200
                    withdraw = withdraw % 200;
                    moneyBoxes[index].TwoEuro -= withdrawTwoEuro;
                }

                if (moneyBoxes[index].OneEuro >= (withdraw / 100))
                {
                    withdrawOneEuro = withdraw / 100;
                    withdraw = withdraw % 100;
                    moneyBoxes[index].OneEuro -= withdrawOneEuro;
                }

                if (moneyBoxes[index].FifftyCent >= (withdraw / 50))
                {
                    withdrawFifftyCent = withdraw / 50;
                    withdraw = withdraw % 50;
                    moneyBoxes[index].FifftyCent -= withdrawFifftyCent;
                }

                if (moneyBoxes[index].TwentyCent >= (withdraw / 20))
                {
                    withdrawTwentyCent = withdraw / 20;
                    withdraw = withdraw % 20;
                    moneyBoxes[index].TwentyCent -= withdrawTwentyCent;
                }

                if (moneyBoxes[index].TenCent >= (withdraw / 10))
                {
                    withdrawTenCent = withdraw / 10;
                    withdraw = withdraw % 10;
                    moneyBoxes[index].TenCent -= withdrawTenCent;
                }

                if (moneyBoxes[index].FiveCent >= (withdraw / 5))
                {
                    withdrawFiveCent = withdraw / 5;
                    withdraw = withdraw % 5;
                    moneyBoxes[index].FiveCent -= withdrawFiveCent;
                }
                
                if (moneyBoxes[index].TwoCent >= (withdraw / 2))
                {
                    withdrawTwoCent = withdraw / 2;
                    withdraw = withdraw % 2;
                    moneyBoxes[index].TwoCent -= withdrawTwoCent;
                }

                if (moneyBoxes[index].OneCent >= (withdraw / 1))
                {
                    withdrawOneCent = withdraw / 1;
                    withdraw = withdraw % 1;
                    moneyBoxes[index].OneCent -= withdrawOneCent;
                }

                else
                {
                    Console.WriteLine("Die von Ihnen gewünschte Auszahlung ist nicht möglich, da Sie zu wenig Geld in Ihrem Sparschwein haben.");
                    Console.WriteLine("Bitte drücken Sie eine beliebige Taste um ins Hauptmenü zurück zu gelangen.");
                    Console.ReadKey();
                    return;
                }

                return;
            }

            else
            {
                Console.WriteLine("Sie haben keinen Auszahlungsbetrag angegeben.");
                Console.WriteLine("Bitte drücken Sie eine beliebige Taste um ins Hauptmenü zurück zu gelangen.");
                return;
            }
        }


Moderiert von user profile iconNarses: Beitragsformatierung überarbeitet, Code aus dem Anhang in den Beitrag übernommen und Anhang gelöscht.
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mi 04.11.2020 um 11:00
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: Di 03.11.20 19:13 
Kannst du näher Erläutern was an deinem jetzigen Code nicht funktioniert oder welche Probleme du damit hast?

So auf den schnellen Blick sieht es zumindest für mich aus als könntest du im Moment nicht Teile einzelner "Münzgruppen" rausgeben.
Beispiel Du möchtest 5 Euro abheben in deinem Sparschwein befindet sich aber nur eine 2-Euro Münze dann würde gar nicht benutzt werden weil eigentlich 5 Euro in zwei 2-Euro Stücke aufgeteilt werden könnte.

Für diesen Beitrag haben gedankt: MaxBegOfProg
MaxBegOfProg Threadstarter
Hält's aus hier
Beiträge: 5

WIN 10
C# (VS 2019), HTML (VS 2019), CSS (VS 2019), JS (VS 2019)
BeitragVerfasst: Mi 04.11.20 07:58 
Also mit dem jetzigen Code kann ich z.B. 5 Euro auszahlen lassen, wenn beispielsweise ein 2 Euro Stück, zwei 1 Euro Stücke und zwei 50ct Stücke in meiner moneyBox sind.

Was ich allerdings will ist wenn zwischendrin eine Münze, wie hier das ein Euro Stück nicht in der moneyBox ist, das Programm zu den nächsten Münzen springt (falls genug vorhanden) und dafür diese auszahlt um auf den Auszahlungsbetrag zu kommen.

Ich hoffe das ist einigermaßen verständlich
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 04.11.20 10:29 
Zitat:
Ich hoffe das ist einigermaßen verständlich

Nicht ganz :wink: Aber den Punkt den du möglicherweise ansprichst scheint der Punkt zu sein den auch ich meinte.

ausblenden C#-Quelltext
1:
if (moneyBoxes[index].TwoEuro >= (withdraw / 200))					


Den Bedarf an Münzen eines bestimmten Typs mit dem Inhalt des Sparschwein in einem direkten Vergleich zu benutzen ist so eher nicht richtig. Eigentlich sollten die Bedingungen sein
a.) Ich habe diese Münzsorte in meinem Sparschwein.
b.) Ich brauche Münzen von diesem Typ
Das Verhältnis zueinander(so wie in deiner aktuellen Bedingung) ist erstmal uninteressant. Beides muss nur vorhanden sein (> 0 sein).

Wenn du das dann richtig festgestellt hast und in einem if-Zweig bist musst du dort jetzt die tatsächliche Anzahl abziehen. Im Moment ziehst du immer den theoretischen Bedarf an einer Münze ab egal wieviel Münzen dieses Typs in deinem Sparschwein sind. Du musst also den Bedarf an einer Münze mit dem tatsächlichen vorhanden sein dieser Münze vergleichen und mit dem Minimum davon weiter rechnen. Also wenn du zwei 2-Euro Stücke rausgegeben könntest aber nur eins hast dann kannst du auch nur mit einem 2-Euro Stück weiterrechnen. Dabei hilft dir die Math.Min Methode.

Für diesen Beitrag haben gedankt: MaxBegOfProg
MaxBegOfProg Threadstarter
Hält's aus hier
Beiträge: 5

WIN 10
C# (VS 2019), HTML (VS 2019), CSS (VS 2019), JS (VS 2019)
BeitragVerfasst: Mi 04.11.20 20:57 
Vielen Dank für die Antwort!

Ich habe es mittlerweile gelöst und es läuft einwandfrei. Ich werde hier noch meine Lösung online stellen falls es noch Spezialisten wie mich gibt die nicht gleich drauf kommen :wink:

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:
public static void WithdrawMoney(int index)
        {
            Console.Clear();

            int sumMoneyBox = moneyBoxes[index].SumCent + (moneyBoxes[index].SumEuro * 100);
            int withdrawTwoEuro, withdrawOneEuro, withdrawOneCent, withdrawTwoCent, withdrawFiveCent, withdrawTenCent, withdrawTwentyCent, withdrawFifftyCent;
            withdrawTwoEuro = moneyBoxes[index].TwoEuro * 200;
            withdrawOneEuro = moneyBoxes[index].OneEuro * 100;
            withdrawFifftyCent = moneyBoxes[index].FifftyCent * 50;
            withdrawTwentyCent = moneyBoxes[index].TwentyCent * 20;
            withdrawTenCent = moneyBoxes[index].TenCent * 10;
            withdrawFiveCent = moneyBoxes[index].FiveCent * 5;
            withdrawTwoCent = moneyBoxes[index].TwoCent * 2;
            withdrawOneCent = moneyBoxes[index].OneCent;

            Console.WriteLine("Bitte geben Sie an wie viel Euro und wie viel Cent Sie abheben möchten.");
            Console.WriteLine("\n");
            Console.WriteLine("Abzuhebender Euro-Betrag:");
            int withdrawEuro = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Abzuhebender Cent-Betrag:");
            int withdrawCent = Convert.ToInt32(Console.ReadLine());
            int withdraw = withdrawCent + (withdrawEuro * 100);

            if(withdraw > sumMoneyBox)
            {
                Console.WriteLine("Sie haben nicht genug Geld in Ihrem Sparschwein um diesen Betrag auszuzahlen!");
            }
            else
            {
                for(; ((withdrawTwoEuro > 0) && (withdraw >= 200));)
                {
                    withdrawTwoEuro -= 200;
                    withdraw -= 200;
                }
                for(; ((withdrawOneEuro > 0) && (withdraw >= 100));)
                {
                    withdrawOneEuro -= 100;
                    withdraw -= 100;
                }
                for(; ((withdrawFifftyCent > 0) && (withdraw >= 50));)
                {
                    withdrawFifftyCent -= 50;
                    withdraw -= 50;
                }
                for(; ((withdrawTwentyCent > 0) && (withdraw >= 20));)
                {
                    withdrawTwentyCent -= 20;
                    withdraw -= 20;
                }
                for(; ((withdrawTenCent > 0) && (withdraw >= 10));)
                {
                    withdrawTenCent -= 10;
                    withdraw -= 10;
                }
                for(; ((withdrawFiveCent > 0) && (withdraw >= 5));)
                {
                    withdrawFiveCent -= 5;
                    withdraw -= 5;
                }
                for(; ((withdrawTwoCent > 0) && (withdraw >= 2));)
                {
                    withdrawTwoCent -= 2;
                    withdraw -= 2;
                }
                for(; ((withdrawOneCent > 0) && (withdraw >= 1));)
                {
                    withdrawOneCent--;
                    withdraw--;
                }
            }

            if(withdraw == 0)
            {
                moneyBoxes[index].TwoEuro = withdrawTwoEuro / 200;
                moneyBoxes[index].OneEuro = withdrawOneEuro / 100;
                moneyBoxes[index].FifftyCent = withdrawFifftyCent / 50;
                moneyBoxes[index].TwentyCent = withdrawTwentyCent / 20;
                moneyBoxes[index].TenCent = withdrawTenCent / 10;
                moneyBoxes[index].FiveCent = withdrawFiveCent / 5;
                moneyBoxes[index].TwoCent = withdrawTwoCent / 2;
                moneyBoxes[index].OneCent = withdrawOneCent;

                Console.WriteLine("Der Betrag wird ausbezahlt!");
                Console.ReadKey();
                return;
            }
            else
            {
                Console.WriteLine("Die Auszahlung ist mit der Stückelung/Anzahl der Münzen im Sparschwein nicht möglich!");
                Console.ReadKey();
                return;
            }
        }


Moderiert von user profile iconNarses: Code- durch C#-Tags ersetzt
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: Do 05.11.20 10:13 
Als nächstes könntest du dir überlegen, wie du die Zahlenliterale (200, 100, ..., 1) verallgemeinern und die Codewiederholungen (z.B. die for-Schleifen) eliminieren könntest?

Für diesen Beitrag haben gedankt: MaxBegOfProg