Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jeszcze o pętli do...while do pyt. darnok9 do zadania 2.15.1

Ostatnio zmodyfikowano 2019-01-15 06:51
Autor Wiadomość
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.

C/C++
#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;
}
P-173546
pekfos
» 2019-01-14 10:36:23
Rozwiązanie jest błędne.
  • Nie da się podać wartości 0,
  • Jeśli strumień zostanie wyczerpany na błędnym znaku, program się zawiesza.
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)
P-173549
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ę!

C/C++
#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;
}
P-173560
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?


C/C++
#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;
P-173572
pekfos
» 2019-01-14 21:19:51
C/C++
#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ąć.
P-173575
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.
P-173591
« 1 »
  Strona 1 z 1