Logowanie do programu - na początku za każdym razem błędny PIN

0

Cześć,
stworzyłem kalkulator do którego wymagane jest podanie kodu PIN. Kiedy wpisuję poprawny PIN to i tak za każdym razem z początku wyskakuje komunikat, że jest niepoprawny. Dopiero za drugim razem wszystko śmiga.

Tak wygląda kod. Od razu dziękuje za wszelkie wskazówki.

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <cstdlib>

using namespace std;

int PIN;
char wybor;
float x, y;

int main()
{

    cout << "Podaj PIN: ";
    cin>>PIN;

 do
    {
    cout<<"\a";
    cout<<"PIN niepoprawny. Sprobuj ponownie!"<<endl;
    Sleep(2000);
    system("cls");
    cout<<"Podaj PIN: ";
    cin>>PIN;
    }
    while
    (PIN!=0000);


    if (PIN==0000)
    {
        cout <<"PIN prawidlowy!"<<endl;

            Sleep(1000);
        for(;;)
        {
        cout <<"MENU"<<endl;
        cout <<"_____________"<<endl;
        cout <<"1. Dodawanie"<<endl;
        cout <<"2. Odejmowanie"<<endl;
        cout <<"3. Dzielenie"<<endl;
        cout <<"4. Mnozenie"<<endl;
        cout <<"5. Koniec programu"<<endl;
        cout <<"Wybierz co chcesz zrobic: ";
        wybor = getch();
        cout<<endl;

        switch(wybor)
        {
        case '1':
            cout <<"|DODAWANIE|"<<endl;
            cout <<"Podaj 1 liczbe: ";
            cin>>x;
            cout<<"Podaj 2 liczbe: ";
            cin>>y;
            cout <<"Suma= "<<x+y<<endl;
            break;
        case '2':
            cout <<"|ODEJMOWANIE|"<<endl;
            cout <<"Podaj 1 liczbe: ";
            cin>>x;
            cout<<"Podaj 2 liczbe: ";
            cin>>y;
            cout <<"Roznica= "<<x-y<<endl;
            break;
        case '3':
            cout <<"|DZIELENIE|"<<endl;
            cout <<"Podaj 1 liczbe: ";
            cin>>x;
            cout<<"Podaj 2 liczbe: ";
            cin>>y;
        {
        if (y==0)
            cout <<"Nie dziel przez 0!"<<endl;
        else
            cout <<"Iloraz= "<<x/y<<endl;
        }
            break;
        case '4':
            cout <<"|MNOZENIE|"<<endl;
            cout <<"Podaj 1 liczbe: ";
            cin>>x;
            cout<<"Podaj 2 liczbe: ";
            cin>>y;
            cout <<"Iloczyn= "<<x*y<<endl;
            break;
        case '5':
            cout <<"KONIEC PROGRAMU"<<endl;
            exit(0);
            break;
        default:
            cout<< "\a";
            cout<<"Blad! Dostepne opcje: 1-5"<<endl;
            cout<<"Wcisnij dowolny klawisz i wybierz ponownie!"<<endl;
        }
        getch();
        system("cls");
        }
        }


    return 0;
}
2

Poczytaj jak działa pętla do-while. Wykonuje się ona zawsze co najmniej raz, a dopiero potem sprawdzany jest warunek.

0

Rozgryzłem to, podziękował @kq.


{

    cout << "Podaj PIN: ";
    cin>>PIN;

    if (PIN==0000)
    cout <<"PIN prawidlowy!"<<endl;
    else
    do
    {
    cout<<"\a";
    cout<<"PIN niepoprawny. Sprobuj ponownie!"<<endl;
    Sleep(2000);
    system("cls");
    cout<<"Podaj PIN: ";
    cin>>PIN;
    }
    while(PIN!=0000);
2

Nie lepiej byłoby

{
 
    cout << "Podaj PIN: ";
    cin>>PIN;

   while (PIN != 0000)
    {
    cout<<"\a";
    cout<<"PIN niepoprawny. Sprobuj ponownie!"<<endl;
    Sleep(2000);
    system("cls");
    cout<<"Podaj PIN: ";
    cin>>PIN;
    }

 cout <<"PIN prawidlowy!"<<endl;

?

0

Czytałem, że aby wrócić do początku można użyć goto albo pętli do-while. Fakt, zdecydowanie prościej @pavarotti, dzięki!

//edit

Musiałem jeszcze PIN zdefiniować jako string. Gdy PIN był jako int, był poprawny po wpisaniu dowolnych liter.

1
kazmirz napisał(a):

Czytałem, że aby wrócić do początku można użyć goto albo pętli do-while.

Dziś już raczej nie używa się goto, a według bardzo wielu, używanie go to antywzorzec programowania. Z drugiej strony, wiele razy spotkałem się z tą instrukcją w przykładowych kodach w dokumentacji na stronie MSDN.


Jeśli masz czas i chęci to możesz się swoim kodem pobawić i zamienić pętle oraz instrukcje wyboru na etykiety i skoki za pomocą goto. Bo nawet jeśli już nigdy z tego nie skorzystasz, to powinieneś wiedzieć jak ta instrukcja działa. Ot w ramach ćwiczenia – nic więcej. ;)

0

@furious programming

Gdzieś właśnie to wyczytałem, żeby unikać "goto". Chociaż spotkałem się też ze zdaniem, że jeżeli stosujemy wiele pętli, to aby się "nie zapętlić", czasem można skorzystać z tego skoku "goto". To prawda?

2
kazmirz napisał(a):

Gdzieś właśnie to wyczytałem, żeby unikać "goto".

Wszędzie można o tym poczytać i prawie każdy tak właśnie doradzi.

Ja też, choć dla mnie istnienie takich skoków w kodzie nie ma większego znaczenia. Jeśli się zna i rozumie dany język, to nieważne czy ktoś użyje którejś pętli czy goto, i tak wiadomo co się w kodzie dzieje. Trzeba by specjalnie gmatwać kod, aby trudniej było go analizować, jednak samo używanie goto według mnie taką obfuskacją nie jest.

Chociaż spotkałem się też ze zdaniem, że jeżeli stosujemy wiele pętli, to aby się "nie zapętlić", czasem można skorzystać z tego skoku "goto". To prawda?

Jeśli w danym bloku kodu (np. funkcji) używa się wielu pętli, to bardziej skłaniałbym się ku podziałowi takiego bloku na mniejsze fragmenty. Ale to fakt, użycie goto w celu opuszczenia wielokrotnie zagnieżdżonych pętli jest krótsze i bardziej intuicyjne w porównaniu do przekazywania stanu przerwania pętli poprzez flagę (czyli dodatkową zmienną logiczną).

To i tak nie zmienia faktu, że każdy tego typu problem można rozwiązać na kilka sposobów, bez konieczności używania etykiet i omawianych skoków. W tym temacie zdania mogą być silnie podzielone. Tym bardziej, że każdy język jest inny – w jednym można uniknąć goto ładniej (np. w C/C++), a w innym nieco gorzej (np. w Pascalu).

1 użytkowników online, w tym zalogowanych: 0, gości: 1