Jeszcze o pętli do...while do pyt. darnok9 do zadania 2.15.1
Ostatnio zmodyfikowano 2019-01-15 06:51
Apurimac Temat założony przez niniejszego użytkownika |
Jeszcze o pętli do...while do pyt. darnok9 do zadania 2.15.1 » 2019-01-14 09:59:55 Cześć! Jestem zielony w programowaniu i nowy na forum. Pozdrawiam wszystkich! Zainteresowało mnie pytanie darnok9 dot. pętli do...while. Szkoda, że kolega zamknął wątek i nie mogę go skomentować, ale wydaje mi się, że znalazłem alternatywne rozwiązanie. Proszę o komentarze. #include <iostream>
using std::cout; using std::cin;
int liczba;
int main() { do { cout << "Podaj liczbe: "; while( !( cin >> liczba ) ) { while( cin.get() != '\n' ) cin.clear(); break; } } while( liczba == '\0' ); cout << "Liczba to: " << liczba << "\n"; return 0; }
|
|
pekfos |
» 2019-01-14 10:36:23 Rozwiązanie jest błędne. Temat dotyczył pętli do..while. Jeśli dozwolić użycie zwykłego while, to tak, kod można zapisać krócej. O ile tylko jesteś w stanie zachować poprawność działania. (Link do tematu, o który chodzi: Poziom 2, rozdział 15, zadanie 1. Pętla do ... while) |
|
Apurimac Temat założony przez niniejszego użytkownika |
» 2019-01-14 13:20:11 Bardzo dziękuję za cenne wskazówki! Zmodyfikowałem nieco powyższy program, wydaje mi się, że działa prawidłowo: Ad. 1 Można już wprowadzić 0 Ad. 2. Trochę nie rozumiem tej uwagi. Czyszczenie wiersza powinno, chyba, załatwić sprawę. 3. Program wykorzystuje tylko pętle do...while Ogólnie rzecz biorąc rozwiązanie pojawiło się z chwilą wprowadzenia pomocniczej zmiennej bool wskazującej, czy już raz były czytane znaki. Proszę o wskazówki i uwagi. Z góry dziękuję! #include <iostream>
using std::cout; using std::cin;
int liczba; bool wsk = false;
int main() { do { do cin.clear(); while(( wsk ) && cin.get() != '\n' ); cout << "Podaj liczbę: "; wsk = true; } while( !( cin >> liczba ) ); cout << "Liczba to: " << liczba << "\n"; return 0; }
|
|
Apurimac Temat założony przez niniejszego użytkownika |
» 2019-01-14 19:13:54 Proponuję jeszcze inne rozwiązanie (moim zdaniem dużo elegantsze i chyba poprawniejsze konstrukcyjnie od tego z samymi pętlami do...while). Krócej i lepiej już się (chyba) nie da? #include <iostream>
using std::cout; using std::cin;
int liczba; bool wsk = false;
int main() { do { while(( wsk ) && cin.get() != '\n' ) cin.clear(); cout << "Podaj liczbę: "; wsk = true; } while( !( cin >> liczba ) ); cout << "Liczba to: " << liczba << "\n"; return 0;
|
|
pekfos |
» 2019-01-14 21:19:51 #include <iostream> #include <limits>
int main() { int liczba; while( std::cout << "Podaj liczbe: ", !( std::cin >> liczba ) ) { if( std::cin.eof() ) return 1; std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } std::cout << "Liczba to: " << liczba << "\n"; return 0; } Warunek na std::cin.eof() jest konieczny żeby nie zawiesić programu w przypadku strumienia o skończonej długości (np przekierowanego z pliku). Przy czym w takim wypadku zwykle czyszczenie strumienia nie ma sensu, więc w sumie można ten przypadek pominąć. |
|
Apurimac Temat założony przez niniejszego użytkownika |
» 2019-01-15 06:51:55 Bardzo dziekuje! Podoba mi sie zwłaszcza to wrzucenie cout w warunek while. Kolejna linijka kodu mniej. Nie wiedziałem, ze tak mozna. Pozdrawiam. |
|
« 1 » |