Funkcja zwraca wartość 0 podczas gdy powinna zwrócić prawdę.
Ostatnio zmodyfikowano 2014-08-16 19:27
plsbx Temat założony przez niniejszego użytkownika |
Funkcja zwraca wartość 0 podczas gdy powinna zwrócić prawdę. » 2014-08-15 16:08:43 Witam próbuję się nauczyć c++ (z ciekawości i chęci). Doszedłem do lekcji http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Funkcje-pierwsze-starcie/291 i napotkałem problem. Próbując zrobić 1 z zadań mam problem z odpowiednim zwracaniem wartości która została wpisana. Gdy wpiszę poprawną wartość za pierwszym razem jest ok, ale gdy za pierwszym razem podam np.: literę to kod odsyła znowu do wpisania liczby co jest dobre. Po wpisaniu dobrej wartości po drugim razie dochodzi do sytuacji w której "return liczba1;" nie oddaje poprawnej wartości. Wg. tego co wyczytałem miałem tylko zmieniać to co jest w funkcji. I tak przeczytałem dokładnie kolejny raz tamtą lekcje i dalej nie mam pomysłu dlaczego to nie chce działać. Próbowałem również "return liczba1;" zrobić jako alternatywne działanie gdy x == 0, ale dalej ta sama sytuacja. Gdyby się nie chciało tego czytać to po prostu to skomplikujcie i sprawdźcie co się stanie po wpisaniu litery a po wyskoczeniu błędu liczby. #include <iostream>
int wczytajLiczbe() { int liczba1; bool x = 0; std::cin >> liczba1; x = std::cin.fail(); std::cin.clear(); std::cin.sync(); if( x == 1 ) { std::cout << "Blad! Podaj ponownie." << std::endl; wczytajLiczbe(); } return liczba1; }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; }
Edit: Już wiem co zrobiłem źle - powinienem użyć pętli, ale dlaczego z if się tak to buguje? |
|
1aam2am1 |
» 2014-08-15 16:57:42 Nie buguje poprostu wywołujesz funkcje a z funkcji a. To powoduje że wywołanie wewnątrz if( x == 1 ) { std::cout << "Blad! Podaj ponownie." << std::endl; wczytajLiczbe(); } return liczba1;
|
|
Jacob99 |
» 2014-08-15 17:29:26 int wczytajLiczbe() { int liczba1; std::cin >> liczba1; if( !std::cin.good() ) { std::cin.clear(); std::cin.sync(); std::cout << "Blad! Podaj ponownie." << std::endl; wczytajLiczbe(); } return liczba1; }
Jeśli używasz funkcji rekurencyjnych to musisz przede wszystkim postawić dobry warunek. Do wyrażenia wartości logicznych boolean (bool) używaj true i false , zamiast 1 i 0 (używając stałych literałów liczbowych możesz się łatwo pogubić. Btw. 0 może oznaczać i prawdę i fałsz w zależności od postawionego warunku. Normalnie 0 oznacza fałsz a 1 prawdę, ale jeśli postawimy warunek if( !true ) wtedy 0 == prawda, bo prawda jest wtedy, gdy warunek jest spełniony. A ponieważ zero oznacza normalnie fałsz, więc jest różne od prawdy i spełnia warunek(więc jest prawdą jeśli chodzi o spełnienie warunku) :) |
|
plsbx Temat założony przez niniejszego użytkownika |
» 2014-08-16 19:27:04 Dziękuję za odpowiedź. Pozdrawiam. |
|
« 1 » |