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

Pętla do...while i kontrola błędów

Object Storage Arubacloud
+1 głos
318 wizyt
pytanie zadane 31 stycznia 2016 w C i C++ przez Seidhewedd Nowicjusz (130 p.)

Treść zadania brzmiała: napisz program, który wczyta liczbę, a następnie wypisze ją na ekranie. Zabezpiecz przed wczytaniem nieprawidłowej liczby. Sposób działania programu: 
1. Podaj liczbę 
2. Jeżeli błąd, wróć do kroku 1. 
3. Wypisz liczbę, która została podana. 

Początkowo założyłam, że zadanie dotyczy stworzenia programu, w którym pętla będzie powtarzała się do momentu wpisania właściwej liczby, np. z zadanego przedziału. Jednak zadanie dotyczyło zastosowania czyszczenia strumienia wejściowego. Ostatecznie połączyłam jedno i drugie w całość i wyszło mi to:

do
    {
    cout << "Podaj liczbe z przedzialu od 1 do 10: " << endl;
    cin >> liczba;
    cin.clear();
    cin.ignore(numeric_limits <streamsize>::max(), '\n');
    if (!(liczba >= 1 && liczba <= 10))
        cout << "Blad. Podana liczba nie miesci sie w przedziale!" << endl << endl;
        else cout << "Podana liczba: " << liczba << " jest poprawna." << endl;
    } while (!(liczba >=1 && liczba <=10) || cin.fail());

Program działa, jednak chciałabym upewnić się, co do poprawności zastosowanego przeze mnie rozwiązania. Czy są jakieś zastrzeżenia, czy można zrobić coś lepiej? :)

Możliwe, że szukam dziury w całym i takie problemy, to tylko zawracanie gitary :) Jeżeli zaśmiecam forum, a pytania typu "czy możecie sprawdzić" są niepożądane, to z góry przepraszam :) Po prostu zmyjcie mi głowę. 

3 odpowiedzi

0 głosów
odpowiedź 31 stycznia 2016 przez Pi0trek Początkujący (310 p.)
Ja mam zastrzeżenia :) Otóż w zadaniu piszesz "liczbę" a liczba to nie zakres od 1 do 10 ;) a zakres od minus nieskończoności do nieskończoności Tak więc ja dałbym Ci maksymalnie dwóje za oddanie powyższego programu
komentarz 31 stycznia 2016 przez jpacanowski VIP (101,940 p.)
Pytanie, czym jest ta nieprawidłowa liczba.
komentarz 31 stycznia 2016 przez jpacanowski VIP (101,940 p.)
edycja 31 stycznia 2016 przez jpacanowski
Myślę, że on sobie właśnie założył, że od 1 do 10 to poprawna.
komentarz 31 stycznia 2016 przez Seidhewedd Nowicjusz (130 p.)
Właśnie ta "nieprawidłowa liczba" w zadaniu zbiła mnie trochę z tropu :) Gdyby zadanie doprecyzowano i użyto innego słowa niż liczba, to by się żaróweczka zaświeciła jak u pomysłowego Dobromira :P Tym bardziej, że bezpośrednio przed zadaniem był przykład typu "Podaj liczbę 123" i warunkiem kończącym był while (liczba != 123), więc siłą rzeczy się zasugerowałam, ale postanowiłam utrudnić sobie nieco życie :)
0 głosów
odpowiedź 31 stycznia 2016 przez Pi0trek Początkujący (310 p.)
Ja to jestem... Dałoby się to jeszcze ulepszyć, ale jak na 20 minut pracy to mieści się w standardzie...
//
//  Created by Piotr Zieliński on 31.01.2016.
//  Copyright © 2016 Piotr Zieliński. All rights reserved.
//

#include <iostream>
#include <cstdlib>

char dopuszczalne_znaki[12] = {'-','+','0','1','2','3','4','5','6','7','8','9'};

using namespace std;

int main(int argc, const char * argv[]) {
    string liczba;
    bool sprawdz;
    do{
        cin >> liczba;
        unsigned short int dlugosc_wprowadzonej_liczby;
        sprawdz = true;
        dlugosc_wprowadzonej_liczby = liczba.length();
        for (unsigned short int i=0; i<dlugosc_wprowadzonej_liczby; i++) {
            for (unsigned short int j=0; j<12; j++) {
                if (liczba[i]==dopuszczalne_znaki[j]) {
                    sprawdz = false;
                    break;
                }
            }
            if (sprawdz == true) {
                break;
            }
        }
    }while (sprawdz == true);
    long long liczba_koncowa = atoi(liczba.c_str());
    cout << liczba_koncowa;
    return 0;
}

 

komentarz 31 stycznia 2016 przez draghan VIP (106,230 p.)
Nie jest to najlepszy kawałek kodu dla tego zadania. :P

Największy zarzut - przepuszcza dowolny łańcuch po poprawnej liczbie, np. "123qwerty".

Parsowanie wczytanego łańcucha jest niepotrzebne - parsowaniem zajmuje się przecież sam strumień - należy to wykorzystać. Jak autorka dojdzie do poprawnej odpowiedzi, podzielę się swoim rozwiązaniem. ;)

Jeszcze mała rada: do konwersji std::string => int powinieneś użyć funkcji std::stoi(), która została wprowadzona w standardzie C++11. Trzeba się rozwijać. :)
komentarz 31 stycznia 2016 przez Seidhewedd Nowicjusz (130 p.)
Hym.. Rozebranie tego kodu trochę mi zajmie, ale jak go w pełni zrozumiem, to zawsze będę krok do przodu :P
0 głosów
odpowiedź 31 stycznia 2016 przez draghan VIP (106,230 p.)

Twoje rozwiązanie jest w miarę poprawne, chociaż można znacznie zwiększyć czytelność, definiując chociażby funkcje pomocnicze.
No i poleceniu nie widzę mowy o liczbie ograniczonej przedziałem, więc nie wiem co o tym myśleć. ;)

Pomyśl jeszcze nad rozwiązaniem problemu wpisania dowolnego łańcucha po liczbie - w tym momencie program zaakceptuje, np. łańcuch "123qwerty" (jako 123), chociaż widać gołym okiem, że nie jest to poprawna liczba.

A za ładnie zadane pytanie masz ode mnie yes. ;)

komentarz 31 stycznia 2016 przez Seidhewedd Nowicjusz (130 p.)
Tak jak pisałam wyżej. Trochę mnie zmyliła ta "nieprawidłowa liczba" w zadaniu. A później poleciała nadinterpretacja, i jestem w miejscu, w którym jestem :P A problem z łańcuchem po liczbie zauważyłam na chwilę przed przeczytaniem komentarzy :) Wstawię poprawkę, jak uda mi się problem rozwiązać, by się dowiedzieć, że bardziej namieszałam :P
komentarz 31 stycznia 2016 przez draghan VIP (106,230 p.)
Daj znać, jak skończysz. :) A kod użytkownika Pi0trek to nic innego, tylko wczytanie łańcucha i przejrzenie go pod kątem występowania niedozwolonych znaków - jak pisałem wyżej, trochę nietrafione rozwiązanie, chociaż po małych poprawkach akceptowalne.

Podobne pytania

0 głosów
2 odpowiedzi 188 wizyt
pytanie zadane 24 listopada 2019 w C i C++ przez eweline Nowicjusz (120 p.)
0 głosów
4 odpowiedzi 666 wizyt
0 głosów
1 odpowiedź 451 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Ola_00 Nowicjusz (210 p.)

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

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

...