• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program banku - Trzy proby i amator..

0 głosów
2,711 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)

Hej. Raczkuję w C++, wiem, że ten kod pewnie nie ma sensu, ale o to co miałem w zamyśle:

Program symulujący bank.. Przebieg programu:

Przywitanie > Ekran logowania > Próba logowania > Jeżeli złe hasło = nabija się licznik prób (aż do trzech i wtedy następuje break) LUB jeżeli hasło się zgadza > przejście do lini poleceń i z niej dostępne polecenia takie jak przelew, wypłata, itd.

Kod wygląda tak: 

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

using namespace std;

string login,haslo,przelew,wyplata,wplata,kredyt,wyloguj;
bool zalogowano=false;
int proby = 0;

int main()
{
    while( !zalogowano && proby < 3 )
    {
    cout << "Witaj w banku. \n \n";
    cout << "Wymagana autoryzacja.. \n";
    cout << "Login:"; cin >> login;
    cout << "Haslo:"; cin >> haslo;

    if((login=="test")&&(haslo=="test"))
    {
    zalogowano=true;
    cout << "DZIALA *****";
    }
    system("cls");
    ++proby;

if( !zalogowano )
{
    std::cout << "Wprowadzono trzykrotnie zle haslo. Nastepuje wyjscie.";
    return - 1;
}
    }
 }

 

 

Proszę o pomoc co zrobiłem nie tak i jeżeli mógłbym to o pokazanie mi jak to powinno wyglądać, a ja w tym czasie sam spróbuję naprawić, choć strasznie ciężko mi się analizuje kod i wolałbym napisać od nowa..

A najbardziej to bym chyba prosił o wytłumaczenie tej pętli, bo nie za bardzo rozumiem jej logiki, gdyby ktoś rozłożył na czynniki pierwsze :)  (pożyczyłem ją z forum i jakoś wkomponowałem w swój kod, bo nie wiedziałem jak to ugryźć)

3 odpowiedzi

0 głosów
odpowiedź 7 listopada 2015 przez niezalogowany

Przede wszystkim po co ci tyle zmiennych globalnych (nie słyszałeś, że w części sytuacji zmienne globalne to "zło"?).

Nie wiem czy w swoim edytorze też masz takie paskudne wcięcia (lub ich brak) jak w kodzie co wstawiłeś tutaj, przy dobrych wcięciach widać gdzie leży błąd.

Twój kod działa następująco:

  1. Czy zalogowano? Nie: uruchamiam panel logowania (wejście w pętle while). Próby logowania: 3, zalogowano: FALSE.
  2. Czy wpisano dobry login i hasło (pierwszy if)?
    1. Tak (tutaj wszystko działa ok), zalogowano: TRUE
    2. Nie, zalogowano: FALSE, pozostałych prób: 2.
  3. Czy nie zalogowano? Jeżeli prawda zwróć informację o 3 niepoprawnych logowaniach i zakończ program (ten warunek jest zły, to on przerywa pętlę).

Zamień warunek w ostatnim if'ie na sprawdzenie czy ilość prób jest równa maximum nieudanych prób to wszystko będzie ok.

komentarz 7 listopada 2015 przez niezalogowany
Jeśli chodzi o to, że zmienne globalne to zło, to póki co chyba nie musi o tym wiedzieć, to tylko mały program konsolkowy ;)
komentarz 7 listopada 2015 przez niezalogowany
Ja się spotkałem z tym stwierdzeniem jeszcze przy wprowadzeniu zmiennych, więc chyba warto jest zniszczyć złe nawyki jeszcze na samym początku nauki, kiedy jest łatwiej o zmiany.
komentarz 7 listopada 2015 przez aki3130pl Nowicjusz (140 p.)
Hej, dziękuję za rady, a o zmiennych niestety jeszcze nie słyszałem, mogę poprosić o linka? Chętnię się od teraz zacznę przyzwyczajać, im prędzej tym lepiej :)
komentarz 7 listopada 2015 przez niezalogowany
Linka? Hm, chyba żadnego linka w pogotowiu nie mamy, ale ci wytłumaczę o co chodzi ;) Zmienne globalne są niepotrzebne, bo lepiej je zrobić w jakimś lokalnym zakresie, żeby nie było bałaganu i żeby było hermetycznie. Wiesz już co to funkcje? W funkcjach zwykle nie używa się zmiennych globalnych, tylko albo lokalnych, albo przesyłanych jako argument. Jeśli nie wiesz czym są funkcje, to póki co ci wytłumaczę tak, że w późniejszych etapach programowania (obiektowego) zauważysz, że tych zmiennych globalnych już prawie wcale nie będzie. Ja jak robię jakiś mały, konsolkowy programik to używam zmiennych globalnych, bo tak mi wygodniej i już się tak przyzwyczaiłem, jakoś to lepiej wygląda. Jak robię większy projekt (zwykle obiektowo, ale nawet konsolkowy, ale to już taki duży duży), to tych zmiennych globalnych praktycznie nie ma ;)
komentarz 7 listopada 2015 przez niezalogowany

O samych zmiennych słyszałeś bo z nich korzystasz (bool, int, string), raczej nie widziałeś dobrego rozróżnienia na zmienne lokalne i globalne ( http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Pojecie-zmiennej-i-podstawowe-typy-danych/11 ).

W wielkim w skrócie:

  1. zasięg zmiennych lokalnych ogranicza się jedynie do bloku, w którym zostały utworzone,
  2. zasięg zmiennych globalnych to cały program

Oczywiście to wielkie uogólnienie tych definicji, bo dochodzą jeszcze małe kruczki, które pozwalają naginać te zasady.

Przykład

// wnętrze funkcji main
a = 3; // <- błąd: tutaj zmienna a jeszcze nie istnieje

int a; // <- od tego miejsca można używać zmiennej a
{
  int b; // <- od tego miejsca zaczyna istnieć zmienna b
 // w tym bloku można używać zmiennej a i b
} // <- śmierć zmiennej b

b = 3; // <- błąd, zmienna b tutaj nie istnieje

return 0; // <- pozbycie się z pamięci zmiennej a,  zwrócenie 0

 

komentarz 7 listopada 2015 przez aki3130pl Nowicjusz (140 p.)
Okej, załapałem, mam ograniczyć zmienne globalne (te które działają na obszarze całego programu) i tworzyć je w zakresie lokalnym, czyli w blokach kodu które wymagają tych zmiennych.

 

Dziękuję, idę się szkolić :)
komentarz 7 listopada 2015 przez niezalogowany
Wow, jestem pod wrażeniem. Bardzo dobre podsumowanie, chyba nie zrobiłbym tego lepiej.
0 głosów
odpowiedź 7 listopada 2015 przez niezalogowany
edycja 7 listopada 2015
Kod powinien wyglądać tak:
#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <stdio.h>
 
using namespace std;
 
string login,haslo,przelew,wyplata,wplata,kredyt,wyloguj;
bool zalogowano=false;
int proby=0;
 
int main()
{
    while(!zalogowano&&proby<3)
    {
        cout << "Witaj w banku." << endl;
        cout << "Wymagana autoryzacja." << endl;
        getchar();
        cout << "Login: ";
        cin >> login;
        cout << endl << "Haslo: ";
        cin >> haslo;
        proby++;
        
        if(login=="test"&&haslo=="test")
        {
            zalogowano=true;
            cout << "Zalogowano sie do konta.";
            getchar();
            system("cls");
        }
        else if(!zalogowano&&proby>=3)
        {
            cout << "Wprowadzono trzykrotnie zle haslo. Nastepuje wyjscie.";
            getchar();
            return 0;
        }
        else
        {
            cout << "Wprowadzono niepoprawne haslo.";
            getchar();
            system("cls");
        }
    }
    //dalsze instrukcje np. przelew
    return 0;
}
Sprawdź czy kod działa, bo ja nie sprawdzałem (piszę z komórki), ale wszystko powinno być git ;) Skoro mówisz, że niezbyt ogarniasz te pętle, to jak nie będziesz czegoś rozumiał, to powiedz, wytłumaczę ci ;)
0 głosów
odpowiedź 7 listopada 2015 przez Michał628496 Pasjonat (17,340 p.)
Wywal tego ifa(całego) w linijce 27 , bo pętla i tak będzie się wykonywać dopóki ilość prób jest mniejsza niż 3 i  nie zalogowano.Jeżeli ktoś 3 razy wpisze złe hasło lub się zaloguje pętla się zakończy.

Poza pętlą  możesz dodać warunek "if(zalogowano)" w którym sprawdzisz czy użytkownik się zalogował czy wpisał złe hasło

Podobne pytania

0 głosów
5 odpowiedzi 886 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)
0 głosów
3 odpowiedzi 1,235 wizyt
0 głosów
1 odpowiedź 385 wizyt
pytanie zadane 19 maja 2021 w C i C++ przez ViniVici Początkujący (330 p.)

93,599 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,082 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...