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

Zadanie domowe pętla do... while

Ostatnio zmodyfikowano 2015-06-24 12:14
Autor Wiadomość
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ć?

C/C++
#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;
}
P-133981
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() );
P-133983
pekfos
» 2015-06-23 20:16:56
C/C++
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.
P-133984
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?
P-134022
darko202
» 2015-06-24 07:44:09
są funkcje sprawdzające, czy znak jest literą/cyfrą isdigit,  isalnum  (ctype.h)
P-134024
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.

C/C++
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;
}
P-134027
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ć.
P-134028
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.
P-134030
« 1 »
  Strona 1 z 1