Laden...

Mein erstes (funktionierendes) Programm

Erstellt von Myrdrox vor 2 Jahren Letzter Beitrag vor 2 Jahren 1.115 Views
M
Myrdrox Themenstarter:in
1 Beiträge seit 2021
vor 2 Jahren
Mein erstes (funktionierendes) Programm

Hallöchen,

ich habe gerade angefangen mich mit Programmieren vertraut zu machen.
Als erste Programmiersprache habe ich mich für C# entschieden. Nachdem ich nun Unterrichte/Lehrvideos zu den Grundlagen der Grundlagen durchgearbeitet habe, möchte ich das Gelernte ein par mal Anwenden bevor ich weiter mache.

Dazu habe ich als erstes Projekt einen Währungsrechner ( Faktoren waren zur Zeit des Erstellens aktuell) geschrieben.
Gerade zu der Methode "Exchange" würde mich interessieren, welche elegantere Lösung es für das Problem gegeben hätte.
Im Speziellen, ob es eine Schleife gibt, mit welcher man das Problem hätte angehen können. Ich selber bin auf keine passende Schleife gekommen.
Gelernt habe ich bis dato: while, dowhile, for und foreach.


namespace Währungsrechner
{
    class Program
    {
        static void Main()
        {

            MainMenu();
        }
        static void MainMenu()
        {
            Console.WriteLine("Gebe einen Geldbetrag ein: ");
            decimal amount =Convert.ToDecimal(Console.ReadLine());
            Console.WriteLine();

            Console.WriteLine("Wähle die Währung");
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("[1] Euro");
            Console.WriteLine("[2] US-Dollar");
            Console.WriteLine("[3] Britische Pfund");
            Console.ResetColor();
            Console.Write("Auswahl: ");
            int input  = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();

            Console.WriteLine("Wähle die gewünschte Währung:");
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("[1] Euro");
            Console.WriteLine("[2] US-Dollar");
            Console.WriteLine("[3] Britische Pfund");
            Console.ResetColor();
            Console.Write("Auswahl: ");
            int output = Convert.ToInt32(Console.ReadLine());

            Console.Clear();

            Exchange(amount, input, output);
            
        }
        static void Exchange(decimal amount, int input, int output)
        {
            decimal eurUsd = 1.12M;
            decimal eurGbp = 85.05M;
            decimal usdEur = 0.89M;
            decimal usdGbp = 75.69M;
            decimal gbpEur = 1.18M;
            decimal gbpUsd = 1.32M;

            if (input == output )
            {
                Console.WriteLine("Du hast die selben Währungen ausgewählt!");
            }
            else if (input == 1 && output == 2)
            {
                Console.WriteLine("{0} Euro entsprechen {1} Dollar", amount,  amount * eurUsd);
            }
            else if (input == 1 && output == 3)
            {
                Console.WriteLine("{0} Euro entsprechen {1} Britischen Pfund", amount,  amount * eurGbp);
            }
            else if (input == 2 && output == 1)
            {
                Console.WriteLine("{0} US-Dollar entsprechen {1} Euro", amount, amount * usdEur);
            }
            else if (input == 2 && output == 3)
            {
                Console.WriteLine("{0} US-Dollar entsprechen {1} Britischen Pfund", amount, amount * usdGbp);
            }
            else if (input == 3 && output == 1)
            {
                Console.WriteLine("{0} Britische Pfund entsprechen {1} Euro", amount, amount * gbpEur);
            }
            else if (input == 3 && output == 2)
            {
                Console.WriteLine("{0} Britische Pfund entsprechen {1} US-Dollar", amount, input * gbpUsd);
            }
            Console.ReadKey();
            Console.Clear();
        }
        
    }
}


J
61 Beiträge seit 2020
vor 2 Jahren

Was mir zuerst auffällt, ist, dass dein Währungsrechner anscheinend Geld vermehrt.

So wie ich das lese, bekomme ich für 1 EUR 85 GBP dafür bekomme ich etwas über 100 EUR. 😁

Und bei GBP zu USD ist es ähnlich, nur sollte man dort nur kleine Beträge zwecks Geldvermehrung wechseln.

Eigentlich sieht man daran bereits schön, dass testen, testen, testen anscheinend ausgelassen wurde. Das sollte man zügig ändern.

Auch der Fall bei input / output größer 3 oder kleiner 1 wird nicht abgehandelt.

Der Code selbst dürfte zügig praktisch unwartbar werden, wenn du weitere Währungen hinzufügst.

Du hast eine lange if / else if Kette, dass lässt sich deutlich eleganter lösen. Als ersten Schritt könnte man z.B. die Wechselkurse in einem Array vorhalten.

P
441 Beiträge seit 2014
vor 2 Jahren

Hi,

wenn du Daten von einem Benutzer einliest, musst du immer sicherstellen dass valide Daten vorliegen - vor allem dann, wenn du den eingegebenen string Datentyp in einen anderen Datentyp umwandelst.
Dieses umwandeln nennt sich parsen.

Stell dir vor, ich als Anwender gebe an dieser Stelle keine Ganze Zahl oder sogar einen Buchstaben ein:


 int output = Convert.ToInt32(Console.ReadLine());

Das würde ein Programm zum Absturz bringen.

Als Eingabe in deine Methode Exchange gibst du verschiedene Zahlenwerte, diese sind innerhalb der Methode selber nicht sprechend - betrachtet man die Methode unabhängig, dann kann der Entwickler dort nicht wissen, was die Bedeutung von input = 1 ist.
Eine Möglichkeit hier wäre ein enum zu verwenden.

Anstelle der if/else Kombination würde sich ein switch oder eine switch expression anbieten.

Das ist etwas zu kompliziert als Lösung für dein Problem, man könnte hier aber mit einem Factory Pattern herangehen und für jede Konvertierung eine eigene Implementierung eines ICurrencyExchange Interfaces implementieren.

Wie du siehst führen immer ganz viele Wege ans Ziel. Welcher dabei der richtige ist, hängt immer an den Anforderungen die du selber oder jemand anders an deine Applikation stellt.

4.931 Beiträge seit 2008
vor 2 Jahren

Du brauchst auch jeweils nur einen Umrechnungsfaktor zwischen zwei Währungen, da man ja einmal multiplizieren und in die andere Richtung dividieren kann (so entstehen dann auch keine Fehler im Code, da man bei Änderung nur einen Wert und nicht zwei anpassen muß).

Wofür du jetzt allerdings eine Schleife in der Exchange-Methode haben möchtest, kann ich nicht nachvollziehen.

Wenn du weitere Grundlagen von C# (und .NET) gelernt hast, z.B. Strukturen, Klassen, Enumerationen, Array, List<T>, Dicitonary<K, V>, dann könntest du dich noch mal an dieses Programm machen und die Währungen und Umrechnungswerte in passende Containerklassen ablegen.

A
764 Beiträge seit 2007
vor 2 Jahren

Hallo Myrdrox

Es gibt in den anderen Posts schon gute Vorschläge, versuche die umzusetzen.
Du könntest noch versuchen bei dem Projekt UI und Logik von einander zu trennen.

@Th69

Wofür du jetzt allerdings eine Schleife in der Exchange-Methode haben möchtest, kann ich nicht nachvollziehen.

Um mehrmals nacheinander Umrechnen zu können.

Wenn du weitere Grundlagen von C# (und .NET) gelernt hast, z.B. Strukturen, Klassen, Enumerationen, Array, List<T>, Dicitonary<K, V>, dann könntest du dich noch mal an dieses Programm machen und die Währungen und Umrechnungswerte in passende Containerklassen ablegen.

Das Projekt ist doch wunderbar dafür geeignet, um diese Sachen zu lernen.

Gruß
Alf

4.931 Beiträge seit 2008
vor 2 Jahren

Ich habe das so verstanden, daß er die if...else if ...-Kaskade durch eine Schleife ersetzen möchte. Die Schleife zum mehrfachen Berechnen von Umrechnungen käme ja in die Hauptmethode Main() bzw. MainMenu().