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

Rozdział 17 - Zadanie domowe cz.1

Ostatnio zmodyfikowano 2017-05-14 23:02
Autor Wiadomość
Dw00L
Temat założony przez niniejszego użytkownika
Rozdział 17 - Zadanie domowe cz.1
» 2017-05-14 19:20:08
Witam,

Mam pytanie odnosnie zadania domowego z 17 rozdzialu "Funkcje- pierwsze starcie". Zadanie brzmi nastepujaco:
"Napisz funkcję, która będzie wczytywała liczby ze standardowego wejścia i zwracała wczytaną wartość. Funkcja ma zagwarantować, że zwracana liczba zawsze jest poprawna. Oznacza to, że funkcja będzie musiała pytać użytkownika o wprowadzenie liczby dopóki nie poda poprawnej. "
------
Gdy uruchamiam kod (poniżej) komunikat "Podaj prawidlowa liczbe" powtarza sie w nieskonczonosc. Probuje ograniczyc loop do okreslonej liczby to nie dziala. Prosze o pomoc i objasnienie skad ten blad.

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wczytajLiczbe()
{
    int a, ile = 1;
    cin >> a;
    if( !cin >> a )
    {
       
        do {
            cout << "Podaj prawidlowa liczbe!" << endl;
            cin >> a;
            ile--;
        } while( !cin >> a );
       
    }
   
    return a;
}

int main()
{
   
    cout << "Podaj liczbe: " << endl;
    int liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
   
    return 0;
}

Z gory dziekuje za pomoc i przepraszam za brak Polskich znakow.
P-161093
karambaHZP
» 2017-05-14 19:43:20
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
oraz
if( !( cin >> a ) ) { }
P-161094
Dw00L
Temat założony przez niniejszego użytkownika
» 2017-05-14 20:03:25
Dodalem dwie zmienne typu bool, jedna to stan a druga stan_0. Nie mniej jednak blad sie powtarza i nie wiem co z tym zrobic.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wczytajLiczbe()
{
    bool stan, stan_0;
    int a, ile = 1;
    cin >> a;
    stan = cin.good();
    stan_0 = cin.fail();
   
    if( !( cin >> a ) )
    {
       
        do {
            cout << "Podaj prawidlowa liczbe!" << endl;
            cin >> a;
            ile--;
           
        } while( !( cin >> a ) );
       
    }
   
    return 0;
}

int main()
{
   
    cout << "Podaj liczbe: " << endl;
    int liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
   
    return 0;
}
P-161095
karambaHZP
» 2017-05-14 20:08:23
Czyszczenie strumienia wejściowego
std::cin.ignore

edit:
C/C++
int wczytajLiczbe()
{
    bool stan, stan_0; // niepotrzebne
    int a, ile = 1; // zmienna ile niepotrzebna
    cin >> a; // wczytanie poraz pierwszy, w zasadzie może nie być potrzebne
    stan = cin.good(); // niepotrzebne
    stan_0 = cin.fail(); // niepotrzebne
   
    if( !( cin >> a ) ) // tutaj ponowne wczytywanie, lub właściwe, wtedy powyższe niepotrzebne
    {
        do {
            // tutaj powinno odbyć się czyszczenie strumienia
            cout << "Podaj prawidlowa liczbe!" << endl;
            cin >> a; // ponowna próba wczytania
            ile--; // niepotrzebne
           
        } while( !( cin >> a ) ); // sprawdzenie czy udało się wczytać (!cin), bo teraz jest ponowne wczytywanie
        // ew. skorzystaj z pętli `while`
    }
   
    return 0;
}
https://4programmers.net/C/FAQ​/Zabezpieczenie_przed_wpisywaniem_liter
P-161096
Dw00L
Temat założony przez niniejszego użytkownika
» 2017-05-14 21:33:55
Dobra, niby smiga ale jak wpisze jakis nieprawidlowy typ wartosci (litera) to konsola pokazuje komunikat "Podaj prawidlowa liczbe". Niestety, po pojawieniu sie tej wartosci gdy wpisze wartosc prawidlowa (liczbe) i klikam enter konsola wyswietla puste pole.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <limits>

using namespace std;

int wczytajLiczbe()
{
    int a;
   
    if( !( cin >> a ) )
   
    do {
        cin.clear();
        cin.sync();
        cout << "podaj prawidlowy typ" << endl;
       
        cin.clear();
        cin.sync();
        cin >> a;
    } while( !( cin >> a ) );
   
    return a;
}

int main()
{
   
    cout << "Podaj liczbe: " << endl;
    int liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
   
    return 0;
}
P-161099
karambaHZP
» 2017-05-14 23:02:51
Wyświetla puste pole bo nadal oczekuje podania danych z klawiatury.
Innymi słowy, w pętli podwójnie chcesz pobrać dane od użytkownika.
P-161110
« 1 »
  Strona 1 z 1