tabupl Temat założony przez niniejszego użytkownika |
Zadanie domowe pętla do... while » 2015-06-23 19:30:07 Mam problem z pracą domową z tego działu. Chodzi o to, że gdy wpisuję do programu liczbę rzeczywistą, zamiast całkowitej, to on czyta i tak do przecinka i zapisuje to jako całkowitą, więc wynik std::cin.fail() jest negatywny i pętla się nie powtarza. Za to kiedy wpiszę literkę, to program poprawnie odczytuje, że nie jest to liczba całkowita. Co innego, gdy wpiszę cyfrę, a następnie literę. Wtedy znów program stwierdza, że jest to tylko i wyłącznie cyfra przed literą. Co mogę poprawić? #include <iostream>
int main() { bool z; int a; do { std::cin.clear(); std::cin.sync(); std::cout << "Podaj liczbe calkowita: "; std::cin >> a; std::cout << "Podales: " << a << std::endl; z = std::cin.fail(); } while( z == 1 ); return 0; }
|
|
notabigthreat |
» 2015-06-23 20:06:35 Jak chodzi o to, to widzę dwa rozwiązania: użyć typu zdolnego do przechowywania liczb rzeczywistych lub komplikować. BTW możesz pozbyć się niepotrzebnej zmiennej z. while( std::cin.fail() ); |
|
pekfos |
» 2015-06-23 20:16:56 do { std::cin >> a; if( std::cin.get() == '.' ) std::cin.setstate( std::ios::failbit ); } while( std::cin.fail() ); Ale ten sposób nie wykryje już sytuacji, gdy podasz liczbę całkowitą i cokolwiek po spacji. (Nawet się zrymowało) Jeśli i to ci przeszkadza, wczytuj liczbę jako linię tekstu i ręcznie konwertuj, np przez std::strtol(). Jeśli cały tekst został sparsowany, to była tam poprawna liczba całkowita i tylko ta liczba. |
|
tabupl Temat założony przez niniejszego użytkownika |
» 2015-06-23 23:50:18 A korzystając z wiedzy zawartej we wcześniejszej wersji kursu? Zmieniłem typ zmiennej na float, ale tak czy siak pozostaje problem z wpisaniem np. "450ghs". Wtedy oczywiście do zmiennej zapisze się "450", ale "ghs" zostanie pominięte, jakby wcale tego nie było. Oczywiście jakiekolwiek liczby po tych znakach też nie będą liczone. Nie da się jakoś w prosty sposób zabezpieczyć przed takimi danymi programu? |
|
darko202 |
» 2015-06-24 07:44:09 są funkcje sprawdzające, czy znak jest literą/cyfrą isdigit, isalnum (ctype.h)
|
|
tabupl Temat założony przez niniejszego użytkownika |
» 2015-06-24 09:44:09 Co prawda to nie należy do wcześniejszych części kursu, ale wykorzystam. Dzięki za pomoc. EDIT Użyłem tej funkcji, ale dalej mam problem (użyłem jej jednak już w jednym z późniejszych zadań). Mianowicie program sprawdza teraz, czy jest to litera, ale za KAŻDYM RAZEM twierdzi, że właśnie nie jest co liczba. Co tu można poprawić? btw. Funkcja ma za zadanie wprowadzić wartość liczbową i ją zwrócić. Oczywiście chcę, żeby była zabezpieczona przed literkami, stąd pytanie. int wczytajLiczbe() { int a; std::cin >> a; std::cin.clear(); std::cin.sync(); if( !isdigit( a ) ) do { std::cin.clear(); std::cin.sync(); std::cout << "To jest litera. Podaj liczbe: " << std::endl; std::cin >> a; } while( !isdigit( a ) ); return a; }
|
|
pekfos |
» 2015-06-24 11:28:58 Wywal te bezsensowne użycie isdigit(). W tym kodzie nawet logiki nie ma. int jest typem liczbowym, więc zawsze przechowuje liczbę, sprawdzanie, czy wartość jest liczbą to dopiero bzdura. Jeśli chcesz zabezpieczyć się przed wszystkimi przypadkami, podałem już rozwiązanie. Z wiedzą wyłącznie ze wcześniejszych części kursu nie da się tego 'problemu' rozwiązać. |
|
tabupl Temat założony przez niniejszego użytkownika |
» 2015-06-24 12:14:48 Ok, dzięki. Jakoś sobie poradzę z tym co porzuciłeś. A jak sobie nie poradzę, to poczekam na dalszą część kursu, może się wyjaśni. Zamykam temat. |
|
« 1 » |