Geld Wechsel Automat :)

  • C#

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    Die geschweifte Klammer am Schluss muss bleiben. Weglassen könnte man sie wenn die For-Schleife nur einen Befehl auszuführen hätte (wie der if-Einzeiler). Momentan sind's aber zwei..xD
    In Java könnte man alles in eine Zeile quetschen. Ob das in C# auch geht weiß ich nicht. Ist aber auch nicht Sinn der Sache. Vllt statt der Zeilen die Zeichen zählen? xD
    @FreakJNS
    Geht auch in eine Zeile, sieht dann so aus:

    C#-Quellcode

    1. int Betrag = 18378; foreach (int x in new int[] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 100, 50, 20, 10, 5, 2, 1 }) { if (Betrag >= x) { MessageBox.Show(Betrag / x + " x " + x / 100.0 + " EUR"); } Betrag %= x; }
    Beim if kann man die geschweiften Klammern einfach weglassen, ist ja nur eine Zeile.
    Außerdem kann man 100.0 zu 1E3 abkürzen. Dann noch die String.Format-Schreibweise in WriteLine benutzen und den Variablennamen kürzen:

    C#-Quellcode

    1. int b = 100000;
    2. foreach (int x in new int[] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 100, 50, 20, 10, 5, 2, 1 }) {
    3. if (b >= x) Console.WriteLine("{0} x {1} EUR", (b / x), (x / 1E2));
    4. b %= x;
    5. }


    Und in minified:

    C#-Quellcode

    1. int b=99999;foreach(int x in new int[]{50000,20000,10000,5000,2000,1000,500,100,50,20,10,5,2,1}){if(b>=x)Console.WriteLine("{0} x {1} EUR",(b/x),(x/1E2));b%=x;}


    EDIT: Man kann die Integer noch in Hexadezimalform aufschreiben. Ist nicht kürzer, wegen 0x.
    | Keine Fragen per PN oder Skype.
    Vorweg:
    Solche Optimierungen sind in 95% der Fälle sinnlos. Der Compiler optimiert meistens besser. Auch das Reduzieren von Whitespace bringt absolut nichts. Dass ein Code kürzer ist, heißt lange nicht, dass er schneller ist(!).

    Trotzdem kann man Spaß daran haben, Code so kurz wie möglich zu formulieren.


    Ich habe mich an einem anderen Ansatz (for statt foreach) versucht und bin hier gelandet:

    C#-Quellcode

    1. int b = 99999;
    2. var s = new int[]{50000, 20000, 10000, 5000, 2000, 1000, 500, 100, 50, 20, 10, 5, 2, 1};
    3. for(int i = 0;i < 14; b %= s[i++])
    4. if (b >= s[i])
    5. Console.Write("{0} x {1} €\n", b / s[i], s[i] / 1E2);


    Minified:

    C#-Quellcode

    1. int b=99999;int[] s=new[]{50000,20000,10000,5000,2000,1000,500,100,50,20,10,5,2,1};for(int i=0;i<14;b%=s[i++])if(b>=s[i])Console.Write("{0} x {1} €\n",b/s[i],s[i]/1E2);

    Kommt aber nicht an das von Serials ran.

    @SeriTools:
    Console.WriteLine -> Console.Write("...\n") :)
    (Oder Debug.Write, wenn man den Namespace hat)

    Wäre dann (mit unnötigen Klammern weggelassen + Benutzung von Typeinference beim Array):
    Spoiler anzeigen

    C#-Quellcode

    1. int b=99999;
    2. foreach(int x in new[]{50000,20000,10000,5000,2000,1000,500,100,50,20,10,5,2,1})
    3. {
    4. if(b>=x)
    5. Console.Write("{0} x {1} €\n", b/x, x/1E2);
    6. b%=x;
    7. }

    Minified:
    Spoiler anzeigen

    C#-Quellcode

    1. int b=99999;foreach(int x in new[]{50000,20000,10000,5000,2000,1000,500,100,50,20,10,5,2,1}){if(b>=x)Console.Write("{0} x {1} €\n",b/x,x/1E2);b%=x;}
    Kürzer bekomm ich es (glaube ich) nicht.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nikeee13“ ()

    Guten Morgen ihr Tüftler,

    schön was ihr da zusammengebaut habt!
    Allerdings habt ihr mittendrin beim Ausgangsbetrag den Datentyp gewechselt (Ursprung decimal, nun int).
    2793,53€ zu wechseln ist nun nicht mehr möglich ;) .

    LG,
    Bruno
    @diylab: Schau mal genau hin;)
    Der zu wechselnde Betrag muss jetzt in Cent angegeben werden!
    (also einfach die Dezimalzahl * 100 übergeben)
    EDIT:
    Ich finde nikeees Ansatz schön, aber trotzdem scheinen hier alle die 2€-Stücke unterzubewerten ;)
    also so ist es realistischer :

    C#-Quellcode

    1. int[] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „da-kid“ ()

    da-kid schrieb:

    @diylab: Schau mal genau hin;)
    Der zu wechselnde Betrag muss jetzt in Cent angegeben werden!
    (also einfach die Dezimalzahl * 100 übergeben)

    Huch!
    Man sollte erst den Kaffee trinken und dann das Forum anschmeißen - nicht anders herum :D.

    Also hier noch einmal zusammengefasst:

    C#-Quellcode

    1. using System;
    2. using System.Text.RegularExpressions;
    3. namespace wechselstube
    4. {
    5. class Program
    6. {
    7. static void Main()
    8. {
    9. // Eingabe
    10. Console.Write("Geldbetrag eingeben und Enter drücken: ");
    11. decimal Betrag;
    12. decimal.TryParse(Regex.Replace(Console.ReadLine(), "[^0-9.,]", "").Replace(".", ","), out Betrag);
    13. int b = (int)(Betrag * 100);
    14. // FOREACH Version
    15. //foreach (int x in new int[] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 })
    16. //{
    17. // if (b >= x) Console.WriteLine("{0}x {1} EUR", (b / x), (x / 1E2));
    18. // b %= x;
    19. //}
    20. // FOR Version
    21. var s = new int[] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    22. for (int i = 0; i < 15; b %= s[i++])
    23. if (b >= s[i])
    24. Console.Write("{0}x {1} EUR\n", b / s[i], s[i] / 1E2);
    25. }
    26. }
    27. }


    Man könnte jetzt also folgendes beim Input eingeben: "Susann möchte 1778,93 Euro gewechselt haben"

    Schönen Tag wünscht
    Bruno

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „diylab“ ()

    Wenns jemanden interessiert: der Ansatz mit Linq- und Lambda-Expressions.

    C#-Quellcode

    1. new int[] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 }.ToList().ForEach( cent => {
    2. if ( betrag >= cent )
    3. Console.WriteLine( "{0}x {1} EUR", betrag / cent, cent / 1E2 );
    4. betrag %= cent;
    5. } );

    da-kid schrieb:

    scheinen hier alle die 2€-Stücke unterzubewerten
    Das ist mir auch einen Tag danach aufgefallen. Aber nicht, weil das 2€-Stück gefehlt hat, sondern weil es fehlte, damit eine gewisse Regelmäßigkeit im Array ist.
    So hat man dies:
    Spoiler anzeigen

    Quellcode

    1. 50000
    2. 20000
    3. 10000
    4. 5000
    5. 2000
    6. 1000
    7. 500
    8. 200
    9. 100
    10. 50
    11. 20
    12. 10
    13. 5
    14. 2
    15. 1

    Es ist immer 5, 2 und 1 mit jeweils einer 0 mehr/weniger dran. Mit einer Funktion, die bei dies jeder Iteration macht (*10 bzw. /10) könnte man das Array auch noch rausschmeissen. Ohne das 2€-Stück wäre das nicht so ohne weiteres (einfach) möglich. Das wäre zwar bestimmt nicht schneller, aber könnte aber "kompakter" sein, falls Ihr noch auf der Suche nach der kürzesten Lösung seid. :P
    Von meinem iPhone gesendet