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

Uzycie prostej petli w C++

Mały hosting, OGROMNE możliwości
0 głosów
1,094 wizyt
pytanie zadane 21 maja 2019 w C i C++ przez kkajet007 Nowicjusz (180 p.)

Witam jestem poczatkujacy i nie moge rozstrzygnac zapewne banalnego problemu. Otoz stworzylem prosty symulator banku i chodzi mi o to, aby po podaniu zlego PINU i zaimplementowanej funkcji else program cofnal sie do momentu kiedy uzytkownik musi wprowadzic PIN jeszcze raz. Najlepiej gdyby taka czynnosc powtorzyla sie 3 razy o ile PIN nie zostal wprowadzony prawidlowo, a nastepnie program wypisal cos w stylu "PIN nieprawidlowy. Karta zablokowana "

#include <iostream>
#include <windows.h>
using namespace std;

string PIN, y;
int x;

int main()
{
    cout<<"Witamy w banku BGZ BNP Parobek"<<endl;
    cout<<"Wprowadz PIN: "<<endl;
    cin>>PIN;
    cout<<"Wprowadz kwote do wyplaty: ";
    cin>>x;



if(PIN=="1729")
    {
    cout<<"Prosze czekac trwa uwierzytelnianie."<<endl;
    Sleep(3000);
     cout<<"PIN prawidlowy."<<endl;
    cout<<endl<<"Wyplacono "<<x<<endl;
    }

else
    {
        cout<<"PIN nieprawidlowy. Czy chcesz sprobowac jeszcze raz ? (y/n)";
        cin>>y;
    }



return 0;
}

Przyznaje ze nie zadaje tego pytania pierwszy raz, ale za poprzednimi razami nie spotkalem sie nawet z informacja zwrotna ze tresc nie pasuje do tematu, nie mowiac juz o pojawieniu sie tematu w dziale Nowe czy odpowiedzi. Niemniej jednak pozdrawiam caly team i mam nadzieje ze bedzie git! :)

1 odpowiedź

0 głosów
odpowiedź 21 maja 2019 przez radek024 Szeryf (77,160 p.)

Osobście widzę takie rozwiązanie.

Będziesz potrzebował dodatkowej zmiennej, którą możesz nazwać np.: ileprob. Będzie typu całkowitego. Jej zadaniem będzie zliczanie ilości wpisanych błędnie kodów PIN:

int ileprob=0; // zmienna zerujemy, to wazne - nie wiemy co bylo na miejscu obecnie zajetej pamieci

do{
    cout<<"Witamy w banku BGZ BNP Parobek"<<endl;
    cout<<"Wprowadz PIN: "<<endl;
    cin>>PIN;

   if(PIN=="1729") break; //konczymy petle poniewaz zostal podany prawidlowy pin
   else cout<<"PIN nieprawidłowy. Wpisz kod ponownie."<<endl;
   ileprob++; // kod analogiczny do ileprob=ileprob+1;
}whille(ileprob<3);

Później, w zależności od zmiennej ileprob możesz zapytać użytkownika o dalsze czynności, lub wyświetlić komunikat o błędzie:

if(ileprob==3){
    cout<<"Karta zablokowana."<<endl;
    return -1;
}

 
Zapoznaj się dobrze z pętlami. Z pewnością można do tego przykładu użyć innych pętli, ale dowhile wydaje mi się tutaj najbardziej odpowiednią :D
 

komentarz 21 maja 2019 przez kkajet007 Nowicjusz (180 p.)
Bardzo, ale to bardzo Ci dziękuję ! Z pewnością pamiętasz jaką radość daje tworzenie programu i wykonanie go w taki sposób jaki tego chcesz i dzięki Tobie poczułem tę radość :)

Moim problemem było to, że nie wiedziałem o funkcji "break" i wykorzystaniu nowej zmiennej "ileprob". Musze jednak to sobie jeszcze parę razy przeanalizować, żeby dojść do wprawy.

Jeszcze jedno pytanie: czy z pętlą for udałoby się uzyskać podobny efekt, czy ona zarezerwowana jest bardziej do prostszych rozwiązań? Oczywiście, jeśli będziesz miał czas i ochotę wykorzystać pętlę for do tego zadania byłbym wdzięczny. W kursie C++ na kanale YT:pasja-informatyki jest ona zaprezentowana na przykładzie odliczania itp. więc nie bardzo widzę jak ją można byłoby tu wcisnąć.

Dzięki jeszcze raz! Miłego pisania :)
komentarz 22 maja 2019 przez radek024 Szeryf (77,160 p.)

Miło mi  że mogłem Ci pomóc :) Zauważ jeszcze, że popełniłem mały błąd w pierwszej wstawce kodu, linia 11 - wkradło się nadmiarowe "l". 

Czy z pętlą for udałoby się uzyskać podobny efekt, czy ona zarezerwowana jest bardziej do prostszych rozwiązań?

Pewnie że tak. Tutaj dowhile wydał mi się bardziej intuicyjny.  Pętla for jest z pewnością bardziej uniwersalna - przekonasz się o tym chociażby podczas pracy z tablicami. Tylko jak ją wykorzystać w tym przykładzie?

Na szybko jeszcze napiszmy ogólny szkielet tej pętli:

for(int i=0; i<warunek; i++){
 //treść pętli
}

Tutaj ilość prób będziemy zliczali za pomocą wykorzystanej już zmiennej i. Należy jednak pamiętać, że zmienna i zaczyna się od zera. Jednorazowe wpisanie kodu będzie oznaczało jedną próbę - i tak było w pętli, którą podałem wcześniej. Tutaj będzie zgoła inaczej, ponieważ będzie to i+1. Dla i = 0 będzie jedna próba, stąd to dodawanie.

Pamiętajmy także, że zmienna i istnieje tylko dla pętli. Poza nią nie ma do niej dostępu. Musimy zatem wybrać jedną z opcji:

  • utworzyć nową zmienną, która przechowa ilość prób, dzięki czemu kod będzie analogiczny do poprzedniego przykładu,
  • zmodyfikować program tak, aby nie tworzyć kolejnych zmiennych.

 

Pierwsza jest dość nudna - zachowanie kodu nie za bardzo się zmieni. Inaczej się ma sprawa w pomyśle drugim. Jeżeli zależy nam na operowaniu na i, warunek musi być w obrębie istnienia zmiennej, czyli całość kodu musi być przeniesiona do pętli for.

for(int i=0 i<3; i++){
    cout<<"Witamy w banku BGZ BNP Parobek"<<endl;
    cout<<"Wprowadz PIN: "<<endl;
    cin>>PIN;
 
   if(PIN=="1729") break;
   else cout<<"PIN nieprawidłowy. Wpisz kod ponownie."<<endl;
   if(i+1==3){
     cout<<"Karta zablokowana."<<endl;
     return -1;
    } 
}

Tutaj mamy następującą sytuację: pętla działa maksymalnie 3 razy(0>3, 1>3, 2>3 - trzy razy zgadza się warunek). Jeżeli za którymś z razów wpiszemy prawidłową odpowiedź, pętla się przerwie i będzie można kontynuować program. Za każdym obrotem pętli sprawdzamy, czy przypadkiem już nie było trzech prób(czyli i = 2). Jeżeli jest taka sytuacja - wypisujemy odpowiedź o zablokowanej karcie na ekran i kończymy program.

Która pętla jest wygodniejsza? Mi bardziej odpowiada rozwiązanie pierwsze. 

Swoją drogą, czy PIN zawiera jakieś znaki poza liczbami? Czy musi być typu string? Warto się nad tym zastanowić :D

Podobne pytania

0 głosów
1 odpowiedź 473 wizyt
pytanie zadane 24 czerwca 2019 w C i C++ przez Aneta_30 Nowicjusz (180 p.)
+1 głos
2 odpowiedzi 1,511 wizyt
pytanie zadane 21 listopada 2021 w C i C++ przez Raven2221 Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 893 wizyt
pytanie zadane 11 listopada 2017 w C i C++ przez KeJJeJ Nowicjusz (150 p.)

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

63,266 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...