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

Warunek If, w którym jest pętla z użyciem bool - który jest przed warunkiem if,

Object Storage Arubacloud
0 głosów
1,085 wizyt
pytanie zadane 30 września 2019 w C i C++ przez Shadi25 Nowicjusz (190 p.)

Witam ! Uczę się programowania i utknąłem na zadaniu z pętlą do..while.
Najpierw wkleję kod, a potem powiem o co chodzi.

 

int main()
{
    int liczba;
    int liczba1;


    cout << "Podaj liczbe wieksza od 0 " << endl;
    cin >> liczba;



    bool bCzyBlad =
    cin.fail();
    cin.clear();
    cin.ignore( numeric_limits < streamsize >::max(), '\n' );

    if ( bCzyBlad = true)
        do
        {

            cout<< "Prosze wprowadz cyfe, nie litere - wieksza od 0 :" << endl;
            cin >> liczba;

           bool bCzyBlad2 =
            cin.fail();
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );

        }   while ( bCzyBlad = true  );


Chciałem zrobić początek programu taki, że trzeba wczytać liczbę większą od zera i wtedy idziemy dalej. Chciałem też się przygotować w razie, gdyby użytkownik wprowadził literę itp, więc użyłem boola. 
Następnie chciałem zrobić tak, że jeśli bool zwraca 1 to żeby powstała pętla, która będzie tak długo pytała o liczbę, aż ją użytkownik poda (zamiast litery itp ).
Wstawiłem też drugiego boola, żeby kasował błędy, ale tutaj mam problem taki, że warunkiem końca pętli, jest zwrócenie false w boolu nr 1, niestety z tego co rozumiem on już zawsze będzie miał 1.
Nie mam pojęcia, czy mogę zrobić tak, żeby ten bool się zresetował, dlatego postawiłem drugi.
Kiedy stawiam warunek, żeby zakończyć pętle, gdy drugi bool zwróci false, wyskakuje "was not declarated in this scope" przez co rozumiem, że nie mogę sobie zmiennej stworzyć w tej pętli.

Kod pokazuje moment, gdzie warunkiem jest ten 1 bool.

Pytanie jest następujące - czy da się to jakoś zrobić?

Bardzo będę wdzięczny za pomoc. :)

3 odpowiedzi

0 głosów
odpowiedź 30 września 2019 przez Bondrusiek Maniak (61,370 p.)

Witaj

popełniłeś tutaj bardzo częsty błąd. Zamiast operatora porównania użyłeś operatora przypisania. Jeśli chcesz porównać dwie wartości użyj ==, przy przypisaniu wartości do zmiennej użyj =

    if ( bCzyBlad == true)
        do
        {
 
            cout<< "Prosze wprowadz cyfe, nie litere - wieksza od 0 :" << endl;
            cin >> liczba;
 
           bool bCzyBlad2 =
            cin.fail();
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );
 
        }   while ( bCzyBlad == true  );

 

0 głosów
odpowiedź 30 września 2019 przez gagyn Stary wyjadacz (11,050 p.)

Po pierwsze, uwaga do jakości kodu:

bool bCzyBlad =
cin.fail();

Nigdy nie pisz w taki sposób, bo patrząc na kod, wydaje się jakby to były dwie niezależne od siebie linijki kodu. Zapisuj to lepiej w jednej lini.

bool bCzyBlad = cin.fail();

 

Robiąc warunek taki sam to w nagłówku pętli do while, zrobiłeś rzeczywiście pętlę while.

W takim przypadku wystarczy, że zrobisz to tak:

        while ( bCzyBlad )
        {
 
            cout<< "Prosze wprowadz cyfe, nie litere - wieksza od 0 :" << endl;
            cin >> liczba;
 
            bCzyBlad = cin.fail();
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        }

Jak porównujesz wartości w warunku lub nagłówku pętli to ==, a nie =.

Poza tym, zauważ, że powyżej usunąłem zmienną bCzyBlad2, bo można użyć tej samej co wcześniej. Pętla będzie się wykonywać dopóki użytkownik nie wprowadzi poprawnej wartości.

komentarz 2 października 2019 przez Shadi25 Nowicjusz (190 p.)
Dziękuję bardzo za odpowiedź!

 

Czyli zamiast pętli do... While, zrobiłem sama pętle while? Dobrze rozumiem?

A czy można zrobić to, ale właśnie Pętla do while? Mam wrażenie, że tego oczekuje się ode mnie w zadaniu.

Gdy robię tak jak kolega napisał wyżej, to nawet, gdy wpisuje cyfrę, Pętla ciągle powraca do pytania. Wydaje mi się, że właśnie dlatego, że ten bool jest ciągle jako true.

Pozdrawiam!

Damian
0 głosów
odpowiedź 30 września 2019 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <limits>

int main()
{
    int liczba;

    for(;;) {
        std::cout << "Podaj liczbe wieksza od 0: ";
        while(!(std::cin >> liczba)) {
            std::cerr << "Proszę wprowadź liczby! Spróbuj jeszcze raz.\n";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << "Podaj liczbe wieksza od 0: ";
        }
        if(liczba > 0) {
            break;
        }
        std::cerr << "Liczba ma być większa od zera! Spróbuj jeszcze raz.\n";
    }

 

Podobne pytania

0 głosów
3 odpowiedzi 240 wizyt
pytanie zadane 16 października 2019 w C i C++ przez Olgierd47 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 323 wizyt
0 głosów
2 odpowiedzi 560 wizyt
pytanie zadane 3 czerwca 2018 w C i C++ przez MAJ0R Obywatel (1,130 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...