Zadanie Domowe lekcja 17
Ostatnio zmodyfikowano 2016-10-31 14:18
ratillada Temat założony przez niniejszego użytkownika |
Zadanie Domowe lekcja 17 » 2016-10-25 16:21:54 Witam! Nie udaje mi się zabezpieczyć zmiennej przed wprowadzeniem niepoprawnej liczby (Mam na myśli znaku : a,b,c, . , / itd. ) Nie mam pojęcia co robię źle, że program nie chce działać poprawnie. Proszę o pomoc Z góry dziękuje! :)
Oto mój kod
#include <iostream> using namespace std; int wczytajLiczbe() { int liczba; bool prawda = cin.good(); do { cin >> liczba; cout << "Udalo sie? " << prawda << endl; if(prawda == 0) { cout << "Wprowadz poprawna liczbe" << endl; }
}while(prawda != 1); return liczba; }
int main() {
std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe();
std::cout << "Podales liczbe: " << liczba << std::endl; return 0; } |
|
karambaHZP |
» 2016-10-25 18:40:10 Nie udaje mi się zabezpieczyć zmiennej przed wprowadzeniem niepoprawnej liczby (Mam na myśli znaku : a,b,c, . , / itd. ) |
1. Ustawiasz zmienną prawda przed jakimkolwiek wczytywaniem. Zrób to po wczytaniu danych. 2. Do czyszczenia strumienia należy użyć std::cin.clear() oraz std::cin.ignore(). |
|
BluePotato |
» 2016-10-25 20:15:39 Też sobie ostatnio wróciłem do programowania i w sumie szło nieźle aż do funkcji. Podobny błąd u mnie. #include <iostream> int wczytajLiczbe() { int liczba; bool prawda; prawda = std::cin.good(); do { std::cin >> liczba; prawda; std::cin.clear(); std::cin.ignore(); if( prawda = !1 ) { std::cout << "Wprowadz poprawna liczbe "; } } while( prawda = !1 ); return liczba; }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; }
Nie za bardzo rozumiem co masz na myśli, @karambaHZP |
|
carlosmay |
» 2016-10-25 21:33:02 int wczytajLiczbe() { int liczba; bool prawda; prawda = std::cin.good(); do { std::cin >> liczba; prawda; std::cin.clear(); std::cin.ignore(); if( prawda = !1 ) { std::cout << "Wprowadz poprawna liczbe "; } } while( prawda = !1 ); return liczba; } |
Nie za bardzo rozumiem co masz na myśli |
Patrząc na kody, to raczej ma na myśli kolejność wykonywania operacji. edit: powinno być tak. 1. próba wczytania danych 2. sprawdzenie stanu strumienia i zapisanie go w zmiennej bool . 3. użycie zmiennej bool w warunku, lub bezpośrednie użycie metody cin.good() w warunku. 4. jeśli wczytanie się nie powiodło, oczyść strumień i ponów próbę wczytywania. |
|
BluePotato |
» 2016-10-26 00:37:32 Aaaa, no tak... spacja przypadkowa naciśnięta przed negacją. Dziwne, że tego nie zauważyłem. |
|
carlosmay |
» 2016-10-26 09:08:16 spacja przypadkowa naciśnięta przed negacją. |
Coś tu ściemniasz. W tym przypadku wyjdzie nieznajomość operatora != . |
|
BluePotato |
» 2016-10-26 19:13:27 Tak, bo to jednak nie spacja. Błąd [ cpp [ /cpp Wkleje kod na czysto
#include <iostream> int wczytajLiczbe() { int liczba; do { std::cin >> liczba; std::cin.good(); if(std::cin.good()!=1) { std::cout << "Wprowadz poprawna liczbe "; } }while (std::cin.good()!=1); return liczba; }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; }
Nie wiem co zrobić żeby pomimo nie spełnienia warunku while przestawało wykonywać czynność z if i zataczało pętle (powtarzało cały kod od początku) |
|
carlosmay |
» 2016-10-26 21:41:27 @BluePotato zerknij: #include <iostream> #include <numeric>
int getNum() { int num { }; do { if( std::cin.fail() ) { std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } if( !( std::cin >> num ) ) { std::cerr << "blad wprowadzania danych, sprobuj ponownie\n"; } } while( std::cin.fail() ); return num; }
int main() { std::cout << "Podaj liczbe calkowita\n"; int number = getNum(); std::cout << "Podales " << number << '\n'; } |
|
« 1 » 2 |