Getränkeautomat in C



  • Hallo ich habe einen Getränkeautomat in C programmiert ( bin kompletter Neuling) und wollte fragen ob man das Programm so stehen lassen kann oder ob es nicht der "Programmier-Norm" entspricht. Über Verbesserungen würde ich mich natürlich auch freuen. Danke schon einmal im Voraus 🙂

    #include<stdio.h>
    #include<conio.h>
    #include<windows.h>
    int main()
    {
        //Programmstart
        printf("----Getraenkeautomat-----\n\n");
        _sleep(300);
        int Auswahl;
            printf("Waehlen sie ihr Getraenk aus:\n");
            printf("1) Wasser (0,50 Euro)\n");
            printf("2) Limonade (1,00 Euro)\n");
            printf("3) Bier (2,00 Euro) ! Ab 16 !\n\n");
            printf("Geben sie 1, 2 oder 3 ein:\n");
    
        //Produktauswahl mit Schleifenfunktion bei falscher Auswahl und Alterskontrolle
        float preis; int Alter;
            do {
                scanf("%d", &Auswahl);
                switch (Auswahl) {
                    case 1:preis=0.50;Alter=19;break;
                    case 2:preis=1;Alter=19;break;
                    case 3:preis=2;
                        printf("\n\n----Altersabfrage----\n");
                        printf("\nBitte geben Sie ihr Alter an.\n");
                        scanf("%i", &Alter);
                        if (Alter>15){
                            break;
                        }
                        else{Alter=1;
                            printf("\nSie sind leider zu jung.\nWaehlen sie ein anderes Produkt.\n");
                            break;
                        }
                    default:printf("\nDiese Auswahl gibt es leider nicht.\nWaehlen sie eines der Produkte 1 bis 3.\n");
                    }
                }
            while(Auswahl>3 || Auswahl<1 || Alter<16);
    
    
        //Abfrage nach der Menge
        _sleep(100);
        int Menge;
            printf("\nGeben sie die gewuenchte Menge ein:\n");
            scanf("%d", &Menge);
    
        printf("\n----Bezahlvorgang----\n");
    
        //Schleife für fehlende Geld
        float endpreis= Menge*preis;
        float geld;
            do {
                printf("\nEs fehlen noch %.2f Euro.", endpreis);
                printf("\nBitte werfen sie ein Geldstueck ein:\n");
                scanf("%f", &geld);
                endpreis -= geld;
                }
            while (endpreis > 0.0);
    
        printf("\n----Warenausgabe----\n");
    
        //Ausgabe Rückgeld
        _sleep(1000);
        if (endpreis < 0.0){
            float rueckgeld=(0-endpreis);
            printf("\nSie haben %.2f Euro Rueckgeld bekommen.", rueckgeld);
            }
    
        //Ausgabe der Flaschen
        int Ausgabe;
            for(Ausgabe=0; Ausgabe < Menge; Ausgabe++)  {
                _sleep(1000);
                printf("\nFlasche %d von %d wurde ausgegeben.", Ausgabe+1, Menge);
                }
    
        //Programmende
        _sleep(1000);
        printf("\n\nVielen Dank! Bitte entnehmen sie ihre Getraenke.\n");
            return(0);
    
    }
    

  • Mod

    Irgendwelchen gängigen Praktiken entspricht das selbstverständlich nicht. Geht auch nicht. denn dafür weißt du halt einfach noch nicht genug. Du wirst niemals Code schreiben, der auch nur so ähnlich aufgebaut ist. Aber zum Lernen mag das ganz ok sein.

    Dinge die auffallen:

    • Deine Einrückung ist teilweise merkwürdig und inkonsequent. Einrückung sollte die syntaktischen Codeblöcke hervorheben, nicht logische. Für die Trennung logischer Abschnitte sind Leerzeilen da. Die du dafür auch korrekt benutzt. Negativbeispiel für Einrückung: Zeilen 6-14
    • float als Datentyp für Geldbeträge ist gewagt bis falsch. Du hast zufällig deine Preise günstig gewählt, so dass es in Tests nicht auffällt. Nimm als Preise mal €0.10, €0.20, und €0.30 und teste damit. Gründlich! Mit mehren Stück gekauft, und mit nicht exakt passenden Münzen bezahlt. Du dürftest ein paar unerwartete Ergebnisse bekommen. PS: Ich sollte vielleicht auch noch sagen, was besser ist. Eine anfängerfreundliche Möglichkeit wäre, in int mit Cents zu rechnen.


  • @SeppJ Alles klar, vielen Dank für deine Antwort. Bringe es mir selbst bei und wusste das mit den Einrückungen nicht. Das mit den Preisen funktioniert allerdings einwandfrei auch wenn ich sie auf 0.10€ oder so setze.


  • Mod

    @lxcas_7 sagte in Getränkeautomat in C:

    @SeppJ Alles klar, vielen Dank für deine Antwort. Bringe es mir selbst bei und wusste das mit den Einrückungen nicht. Das mit den Preisen funktioniert allerdings einwandfrei auch wenn ich sie auf 0.10€ oder so setze.

    Sicher? Hier kaufe ich 2 Wasser für €0.10 und bezahle mit 4x €0.05. Zeile 32 sagt er mir, ich schulde noch 0.00 Euro. Das kommt davon, weil da intern noch ein Restbetrag wie 0.000000001 Euro fehlt.

    ----Getraenkeautomat-----
    
    Waehlen sie ihr Getraenk aus:
    1) Wasser (0,10 Euro)
    2) Limonade (0,20 Euro)
    3) Bier (0,30 Euro) ! Ab 16 !
    
    Geben sie 1, 2 oder 3 ein:
    1
    
    Geben sie die gewuenchte Menge ein:
    2
    
    ----Bezahlvorgang----
    
    Es fehlen noch 0.20 Euro.
    Bitte werfen sie ein Geldstueck ein:
    0.05
    
    Es fehlen noch 0.15 Euro.
    Bitte werfen sie ein Geldstueck ein:
    0.05
    
    Es fehlen noch 0.10 Euro.
    Bitte werfen sie ein Geldstueck ein:
    0.05
    
    Es fehlen noch 0.05 Euro.
    Bitte werfen sie ein Geldstueck ein:
    0.05
    
    Es fehlen noch 0.00 Euro.
    Bitte werfen sie ein Geldstueck ein:
    0.1
    
    ----Warenausgabe----
    
    Sie haben 0.10 Euro Rueckgeld bekommen.
    Flasche 1 von 2 wurde ausgegeben.
    Flasche 2 von 2 wurde ausgegeben.
    
    Vielen Dank! Bitte entnehmen sie ihre Getraenke.
    

    Wenn ich länger suchen würde, würde ich gewiss auch Fälle konstruieren können, wo er nach vermeintlich passender Münzeingabe am Ende sagt, dass ich noch ein Restgeld von €0.00 erhalten würde, weil er intern auf -0.000000001 Euro kommt.

    PS: Da sind an manchen Fällen Rechtschreibfehler in den Texten deines Programmes



  • @SeppJ Okey danke 🙂



  • @lxcas_7 sagte in Getränkeautomat in C:

    Bringe es mir selbst bei und wusste das mit den Einrückungen nicht.

    Da kannst du bei https://de.wikipedia.org/wiki/Einrückungsstil einen Eindruck bekommen.



  • Informier dich mal darüber, was ein Zustandsautomat (Getränkeautomat, Zustandsautomat..... 🙃 ) ist und wie sowas funktioniert.

    Programmieren tust du das dann nachher ungefähr so:

    int main()
    {
         int currentstate = DEFAULTSTATE;
         int endloop = 0;
    
         while(!endloop)
         {
              switch(currentstate)
              {
                   case STATE1:
                        //Anweisungen die in STATE1 ausgeführt werden sollen
                        //Bedingungen die erfüllt sein müssen, um nach STATE2 zu wechseln
                        break;
    
                   case STATE2:
                        //Anweisungen die in STATE2 ausgeführt werden sollen
                        //Bedingungen die erfüllt sein müssen, um nach STATE1 zu wechseln
                        break;
    
                   default:
                        //Dieser Fall sollte niemals auftreten
                        //Anweisungen die im Fehlerfall ausfegührt werden sollen
                        //Wechsel zu DEFAULTSTATE oder endloop = 1;
                        break;
             }
    
              //evtl. Aufruf von Sleep, meistens reicht es aus, die Schleife nur alle bspw. 250ms zu durchlaufen
         }
    
         return 0;
    }
    

Anmelden zum Antworten