Parkautomat läuft nicht richtig



  • Also ich habe folgendes Problem.

    Ich habe versucht einen Parkautomaten zu programmieren was mir auch teilweise gelang. Nun ist das Problem dass wenn ich den Parkschein ausdrucken lasse. Alle werte wieder auf null gesetzt werden sollen. Wegen neuer Benutzer der kommt... Wo liegt mein Fehler??

    Und wie kann ich das Programm mit einem Buchstaben beenden lassen. Meinetwegen e für Ende.

    Vielen Dank für eure Hilfe.

    # include <iostream.h>
    # include <conio.h>
    
    int main()
    {
        int zaehler, Parkdauer, Einheit, Betrag, Zeittakt, zugang, Taste;
        int Var1 = 1;
        int Var2 = 0;
        char ende;
    
        ende = 'j';
        zaehler = 0;
        zugang = 0;
        Zeittakt = 15;
        Parkdauer = 0;
        Betrag = 0;
        Einheit = 50;
        do
        {
          cout <<"Bitte geben Sie die Zeittakte ein : ";
          cin >> Taste;
          cout <<"\n";
    
          if (Taste == Var1)
          {
           zugang = 0;
           cout <<"Guten Tag \n";
           Parkdauer = Parkdauer + Zeittakt;
           cout <<"Parkdauer: "<<Parkdauer<<" min\n";
          }
          else
          {
           if (Taste == Var2)
          {
           zugang = 0;
           cout <<"Beleg wird gedruckt\n";
           Betrag = Parkdauer * Einheit / Zeittakt;
           cout <<"Zu zahlender Betrag : "<<Betrag<<" Cent\n";
          }
          else
              cout<<"FEHLER!!\n\n";
        }}
        while (zaehler<3);
    
        getchar();
        return 0;
        }
    

    Hoffe ihr könnt mir helfen

    Edit:
    Bitte die Code-Tags benutzen. Danke!



  • Erstmal Code optimieren...

    #include <iostream.h>
    #include<stdlib.h>
    using namespace std;
    int main(int argc, char* argv[])
    {
       int Parkdauer, Einheit, Zeittakt, Taste, zaehler;
       char ende;
       do
       {
          Zeittakt = 15;
          Parkdauer = 0;
          Einheit = 50;
          zaehler = 0;
          do
          {
             cout <<"Bitte geben Sie die Zeittakte ein : ";
             cin >> Taste;
             switch(Taste)
             {
                case 1:
                cout <<"Guten Tag \n";
                Parkdauer += Zeittakt;
                cout <<"Parkdauer: "<<Parkdauer<<" min\n";
                break;
    
                case 0:
                cout <<"Beleg wird gedruckt\n";
                cout <<"Zu zahlender Betrag : "<<(Parkdauer * Einheit / Zeittakt)<<" Cent\n";
                break;
                default:
                cout<<"Fehlerhafte Eingabe!\n\n";
             }
             getchar();
             system("cls");
          }while(Taste!=1 && Taste!=0);
          zaehler++;
       } while (zaehler<3);
       return 0;
    }
    

    Dann dein "Beenden" einbauen...

    #include <iostream.h>
    #include<stdlib.h>
    using namespace std;
    int main(int argc, char* argv[])
    {
       int zaehler, Parkdauer, Einheit, Zeittakt, Taste;
       char ende;
       do
       {
          Zeittakt = 15;
          Parkdauer = 0;
          Einheit = 50;
          zaehler = 0;
          do
          {
             do
             {
                cout <<"Bitte geben Sie die Zeittakte ein : ";
                cin >> Taste;
                switch(Taste)
                {
                   case 1:
                   cout <<"Guten Tag \n";
                   Parkdauer += Zeittakt;
                   cout <<"Parkdauer: "<<Parkdauer<<" min\n";
                   break;
    
                   case 0:
                   cout <<"Beleg wird gedruckt\n";
                   cout <<"Zu zahlender Betrag : "<<(Parkdauer * Einheit / Zeittakt)<<" Cent\n";
                   break;
    
                   default:
                   cout<<"Fehlerhafte Eingabe!\n\n";
                }
                getchar();
                system("cls");
             }while(Taste!=1 && Taste!=0);
             zaehler++;
          }while(zaehler<3);
          do
          {
             system("cls");
             cout<<"Moechten Sie das Programm wiederholen? [J/N]";
             cin>>ende;
          }while(ende!='j' && ende!='J' && ende!='n' && ende!='N');
       }while(ende=='j' || ende=='J');
       return 0;
    }
    

    Fertig



  • Also erstmal vielen Dank für die schnelle Hilfe.

    Als ich das Programm getestet habe ist mir allerdings ein Fehler aufgefallen. Man kann nicht länger als 60 Minuten parken da das Programm dann fragt ob es beendet werden soll. Und weiterhin kann man dann keinen Beleg mehr drucken.

    Kann man das auch ohne case und break befehlen machen. Evtl nur mit if und else. Und nur einer do-while schleife.

    Trotzdem vielen dank schonmal



  • Kein BCB-Problem, und auch nicht wirklich ein spezielles C- oder C++-Problem.
    Verschoben nach "Rund um".



  • Kann mir das mal jemand erklären. So wie ich das sehe werden doch in dem Forum Probleme mit Programmabläufen besprochen oder?? Was ist denn dann mein Problem?? Ist das etwa kein Programmablauffehler??

    Bitte erklären!! DANKE!!

    Gruß

    falke_21



  • Im BCB-Forum geht es prinzipiell um Fragen zu Besonderheiten des BCB-Compilers und/oder der VCL-Bibliothek oder zur IDE. Dein Problem berührt nichts davon.

    In der Tat geht es bei dir um den Programmablauf. Der ist aber wie gesagt auch nicht wirklich C- oder C++-spezifisch sondern kann eher mit einem ordentlichen PAP gelöst werden. Und für solche Erörterungen ist "Rund um" perfekt geeignet.



  • Falke_21 schrieb:

    [...]Und weiterhin kann man dann keinen Beleg mehr drucken.

    Konnte man vorher aber auch nicht.

    Falke_21 schrieb:

    (1.) Kann man das auch ohne case und break befehlen machen. Evtl nur mit if und else. (2.) Und nur einer do-while schleife.

    1. Ja, ist aber vom Quellcode her länger.
    2. Nein.

    Der Grund, weshalb man nicht länger als 60 Minuten parken kann ist der, weil er die Schleife nur 3-mal durchläuft, man müsste sowas wie eine Enter-Abfrage machen, dass er die Zeit misst, und dann aufhört, sobald ENTER gedrückt wird. Das kann ich dir im BCB machen, aber in der Konsolenprogrammierung weiß ich nicht, wie das geht.



  • Also ich habe das Programm mal umgeschrieben und damit folgende Fehler behoben.

    - Nicht länger als 60Minuten parken
    - Belegausdruck nicht möglich
    - Eine do-while schleife nicht möglich

    So das Programm läuft bis auf einen kleinen Schönheitsfehler optimal

    # include <iostream.h>
    # include <conio.h>
    
    int main()
    {
        int Parkdauer, Zeittakt;
        float Einheit, Betrag;
        char Taste;
        char ende = 'j';
        char GK;
    
        Zeittakt = 15;
        Parkdauer = 0;
        Betrag = 0;
        Einheit = 0.50;
        cout <<"Guten Tag \n";
        do
        {
    
          cout <<"Bitte geben Sie die Parkdauer ein :";
          cin >> Taste;
          cout <<"\n";
    
          if (Taste == 'p' || Taste == 'P')
          {
    
           Parkdauer = Parkdauer + Zeittakt;
           cout <<"Parkdauer: "<<Parkdauer<<" min\n\n";
          }
          else
          {
          if (Taste == 'o' || Taste == 'O')
          {
           cout <<"Geldkarte wird gelesen\n";
           cout <<"Betrag auf der Geldkarte ausreichend?? ";
           cin >> GK;
    
           if (GK == 'j' || GK == 'J')
           {
            cout <<"Betrag ausreichend\n";
            Betrag = Einheit * Parkdauer / Zeittakt;
            cout <<"Beleg wird gedruckt\n";
            cout <<"Zu zahlender Betrag : "<<Betrag<<" Euro\n\n\n";
            Betrag = 0;
            Parkdauer = 0;
            cout<<"Moechten Sie das Programm wiederholen? [J/N]";
            cin>>ende;
            clrscr();
           }
    
           if (GK == 'n' || GK == 'N')
           {
            cout <<"Betrag nicht ausreichend\n";
            clrscr();
           }
    
          }
          else
          {
              cout<<"!!!FEHLER!!!\n";
              cout<<"Falsche Eingabe!!\n";
              cout<<"Vorgang abgebrochen\n";
              Betrag = 0;
              Parkdauer = 0;
          }
        }
    }
    
    while(ende =='j' || ende =='J');
    
    return 0;
    }
    

    Sobald das Programm wiederholt wird soll der "neue" Benutzer begrüsst werden. Wie schaffe ich das??
    Ich denke das wird nur mit einer zweiten Schleife möglich sein, finde aber irgendwie nicht die richtige Stelle.



  • ..



  • Hatte grad nix zu tun...
    Schauts euch mal an:

    #include <iostream.h>
    #include <conio.h> 
    
    void nochmal (char * ende, int* Parkdauer, float* Betrag, int* Besucher);
    
    int main() 
    { 
        int Parkdauer, Zeittakt, Besucher=1; 
        float Einheit, Betrag; 
        char Taste; 
        char ende='j'; 
        char GK;
        Zeittakt = 15; 
        Parkdauer = 0; 
        Betrag = 0;
        Einheit = 0.50; 
        cout <<"Guten Tag \n"; 
        cout <<"Tasten: p = Parkdauer erhöhen\n        b = Bar zahlen\n        o = Mit Geldkarte zahlen\n        q = Quit\n"; 
        do 
        { 
          cout <<"Sie sind der: "<<Besucher <<". Besucher\n"; 
          cout <<"Bitte geben Sie die Parkdauer ein :"; 
          cin >> Taste; 
          cout <<"\n"; 
          if (Taste == 'p' || Taste == 'P') 
          {
           Parkdauer = Parkdauer + Zeittakt; 
           cout <<"Parkdauer: "<<Parkdauer<<" min\n\n"; 
          } 
          else 
          { 
                    if (Taste == 'b' || Taste == 'B') 
                    { 
                            cout<<"****Betrag Bar Zahlen****\n"; 
                            Betrag=Parkdauer*Einheit/Zeittakt;
                            cout<<"\nNoch zu Zahlen: "<<Betrag<<" €\n";
                            nochmal(&ende, &Parkdauer, &Betrag, &Besucher);
                    } 
                    if (Taste == 'q' || Taste == 'Q') 
                    { 
                            break; 
                    } 
                    if (Taste == 'o' || Taste == 'O') 
                    { 
                            cout <<"Geldkarte wird gelesen\n"; 
                            cout <<"Betrag auf der Geldkarte ausreichend?? "; 
                            cin >> GK; 
                            if (GK == 'j' || GK == 'J') 
                            { 
                                    cout <<"Betrag ausreichend\n"; 
                                    Betrag = Einheit * Parkdauer / Zeittakt; 
                                    cout <<"Beleg wird gedruckt\n";
                                    cout <<"Zu zahlender Betrag : "<<Betrag<<" Euro\n\n\n";
                                    nochmal(&ende, &Parkdauer, &Betrag, &Besucher);
                            }
                            if (GK == 'n' || GK == 'N')
                            {
                                    cout <<"Betrag nicht ausreichend\n";
                                    getch();
                                    nochmal(&ende, &Parkdauer, &Betrag, &Besucher);
                            }
                    }
                    if (Taste != 'b' && Taste != 'B' && GK != 'j' && GK != 'J' && GK != 'n' && GK != 'N' && Taste != 'o' && Taste != 'O')
                    {
                            cout<<"!!!FEHLER!!!\n";
                            cout<<"Falsche Eingabe!!\n";
                            cout<<"Vorgang abgebrochen\n";
                            nochmal(&ende, &Parkdauer, &Betrag, &Besucher);
                    } 
           } 
        } 
        while(ende =='j' || ende =='J'); 
        return 0; 
    }
    
    void nochmal (char * ende, int * Parkdauer, float * Betrag, int * Besucher)
    {
            getch();
            clrscr();
            cout<<"Moechten Sie das Programm wiederholen? [J/N]";
            cin>>*ende;
            clrscr();
            *Parkdauer=0; 
            *Betrag=0; 
            *Besucher=*Besucher+1;
    }
    

    😃

    Funktioniert soweit alles, "Bar" zahlen is neu 😃 😃 😃
    Auch das mit dem "neuen" Besucher funkt ...ohne Schleife! Dafür mit Funktion 😃



  • Bitte unterteil das riesen Ding mal in mehrere kleine Funktionen. Das ist ja schrecklich. 😮



  • Wiso? ich finds ok so..
    Nur, dass wenn ich es selbst programmiert hätte ein "switch" anstatt die tausend if´s da stände...



  • Hi,

    also dein Programm ist schon nicht schlecht.

    Leider bekommt der 2. Besucher die Auflistung der mögl. Befehle nicht mehr mit und müsste somit ausprobieren wofür welche Taste steht *g*

    Aber ansonsten sehr gut.

    Ich persönlich würde es auch mit anderen Befehlen schreiben als nur if und else. Leider scheint mein Lehrer nur keine Ahnung vom Programmieren haben so dass ich nicht alle Befehle benutzen darf 😞

    Die Begrüssung jedes Kunden fehlt aber noch *g*



  • Gut, dann würde ich ne Variable vorschlagen die geprüft wird, und wenn sie auf einem bestimmten Wert ist, den sie am anfang nicht hat und erst beim zweiten Kunde bekommt soll noch eine Begrüßung kommen und die Auflistung der Befehle (die du selbst ja noch gar nicht aufgelistet hattest :p )... Außerdem steht ja schon "Sie sind der x. Besucher..." dran...
    🙂

    Bezüglich deines Lehrers hat er entweder wirklich keine Ahnung oder will sicher stellen, dass ihr die Befehle die ihr gerade lernt auch wirklich kapiert 😉
    Also nich verzagen...


Anmelden zum Antworten