• 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..

Object Storage Arubacloud
0 głosów
2,185 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 356 wizyt
pytanie zadane 7 listopada 2015 w C i C++ przez aki3130pl Nowicjusz (140 p.)
0 głosów
3 odpowiedzi 859 wizyt
0 głosów
1 odpowiedź 253 wizyt
pytanie zadane 19 maja 2021 w C i C++ przez ViniVici Początkujący (300 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...