Not a Number - jak zrobić?

0

Cześć,
mam mały problem z programem w C++ - nie wiem jak sprawdzić czy podana z klawiatury wartość jest typu NaN.

szukając w google znalazłem przepis na ręczninie napisaną isnan(x):

bool my_nan(double x)
{
return x != x;
}

Niestety funkcja ta nie działa, gdy podaję z klawiatury x

cin >> x;

i wpiszę jakąś literę to funkcja my_nan zwraca 0, gdy wpiszę cyfrę tez zwraca 0. Zna ktoś jakieś inne sposoby na sprawdzenie NaN?

0

A co rozumiesz przez NaN? Rozumiesz przez to pewien specyficzny układ bitów w liczbie zmiennoprzecinkowej, czy też moze bardziej po ludzku "coś co nie jest liczbą"? Bo mam wrażenie że chodzi ci o to 2, ale to jest zupełnie inna bajka i nie żadne NaN.
Zabezpieczenie przed wpisywaniem liter

0

Zreinterpretuj (za pomocą wskaźników) to jako longa i sprawdź bity.

ATSD:
Z klawiatury nie da się podać wartości typu NaN. NaN dostajesz przy niedozwolonych działaniach.

0

Mam prosty program liczący miejsca zerowe wielomianu kwadratowego. Jak sprawdzić czy użytkownik nie podał z klawiatury np literki "a"?

0

Tak jak myślałem, chodzi ci o zupełnie coś innego. Przeczytaj zawartość linka który podałem wyżej.

0
if(cin>>x)
  {
   cout<<"wpisałeś liczbe: "<<x<<endl;
  }
else
  {
   cin.clear();
   cin.sync();
   cout<<"wpisałeś literki zamiast liczby"<<endl;
  }
0

Niestety nie działa. Kod całego programu wygląda tak:

#include <cstdlib>
#include <iostream>
#include <cmath>

// liczymy miejsca zerowe, autor

using namespace std;

double wsp[3], x1, x2, delta;
char d = 't';


int main(int argc, char *argv[])
{   

    
    cout << "Witaj, jestem programem komputerowym i jestem tak mily, ze policze dla ciebie miejsca zerowe wielomianu kwadratowego" << endl
    << "Bede cie prosil o podanie trzech liczb ktore beda wspolczynnikami wielomianu" << endl << endl;
    
    
    while(d == 't')
    {
            
    cout << "Podaj wspolczynniki wielomianu zaczynajac od najwyzszej potegi: " << endl;
    
    for(int i = 0; i < 3; i++)
    {
            onceagain:
            cout << "Podaj wspolczynnik nr " << i+1 << ": ";
            cin >> wsp[i];

            while(!(cin>>wsp[i])) //dopóki strumień jest w stanie błędu -> dopóki podawane są błędne dane
            {
            cout << "To nie jest kiczba." << endl;
            goto: onceagain;
            cin.clear(); //kasowanie flagi błędu strumienia
            cin.sync(); //kasowanie zbędnych znaków z bufora
            }
            
            if((wsp[i] == 0) & (i == 0))
            {
            cout << "To nie bedzie rownanie kwadratowe" << endl;
            goto onceagain;
            }
    }
    
    cout << endl << "Wielomian ma postac " << wsp[0] << "x^2 + " << wsp[1] << "x + " << wsp[2] << endl;
    
    delta = wsp[1] * wsp[1] - 4 * wsp[0] * wsp[2];
    
    if(delta < 0)
    {
             cout << endl << "Pierwiastki zespolone, dodamy je w wersji 1.1 :)" << endl;
             goto wybor;
    }

    x1 = (-wsp[1] - sqrt(delta)) / 2 * wsp[0];
    x2 = (-wsp[1] + sqrt(delta)) / 2 * wsp[0];
    
    if(x1 == x2) cout << "Pierwiastki twojego wielomianu to: " << "X1 = X2 = " << x1 << endl;
    else cout << "Pierwiastki twojego wielomianu to: " << "X1 = " << x1 << " X2 = " << x2 << endl;
    
    wybor:
    cout << "Jeszcze raz? (t/n)" << endl;
    
    cin >> d;
    }
       
    system("PAUSE");
    return EXIT_SUCCESS;
}
 

Jak widzicie program jest trywialny. Ktoś powie mi jak powinna wyglądać implementacja tej pętli? Chodzi o to, ze gdy ktoś podaje literkę z klawiatury to chcę, by program wyświetlił

0
for(i=0;i<3;cin.sync())
   {
            cout << "Podaj wspolczynnik nr " << i+1 << ": ";
            if(cin >> wsp[i])
              {
                if((!i)&&(!wsp[i]))
                  {
                   cout << "To nie bedzie rownanie kwadratowe" << endl;
                  }
               else ++i;
              }
            else
              {
               cout << "To nie jest kiczba." << endl;
               cin.clear(); //kasowanie flagi błędu strumienia
              }
  }
1

A mozesz mi powiedzieć PO CHOLERĘ wstawiłeś w mój, całkiem przyzwoity, kod jakieś goto? Oczywiście że to nie zadziała, bo tym swoim idiotycznym goto zepsułeś to rozwiązanie.
Lekcja na dziś: pętla do..while() i while()
Zapomnij o tym że istnieje jakieś goto.

0

Tak, wiem ze goto jest toporne i sam już wywalam skąd tylko mogę tą dyrektywę.

Kod napisany przez 13th Dragon działa znakomicie i bardzo za niego dziękuję. Mam tylko dwa pytania dotyczące tego kodu:

  1. Dlaczego do sprawdzania czy pierwszy element tablicy wsp[] jest różny od zera (aby równanie było kwadratowe) używamy warunku
if((!i)&&(!wsp[i]))

Jak to się czyta? Czy to jest niezbędne do sprawdzenia czy podana wartość nie jest liczbą?

  1. Jak czytać ten fragment:
if(cin >> wsp[i])

i do czego używamy funkcji

 cin.clear();

Jak działa operator tej kropki? Pytania są trywialne ale im szybciej zdobędę jakieś ogarnięcie tym mniej będę zadawał takich pytań.

0

strumienie mają w sobie różne cuda, między innymi flagi błędu. Jesli chcesz wpisać do zmiennej liczbowej literkę to strumień podniesie flagę błędu, bo jest to operacja niedozwolona. Dodatkowo dane pozostaną w buforze stdin. cin.clear() powoduje opuszczenie flagi błędu (tak jakby "naprawi" strumień), cin.sync() / cin.ignore() spowoduje skasowanie ze stdin tych błędnych danych.
Operator kropki to operator wywołania metody na obiekcie/referencji do obiektu.

0

To jakaś plaga ostatnio z tym goto

podobnie jak z DevC++, system("pause") i deklarowaniem tablic ze zmienną jako rozmiarem.
Wszystko to działa, ale.

0

Dzięki panowie za szybkie odpowiedzi. Mam jeszcze tylko jedno pytanie - jak czytać (w "ludzkim" języku) ten warunek:

if((!i)&&(!wsp[i]))

Chcę dokładnie rozumieć każdą linijkę. Pozdrawiam i dzięki z góry.

0

!i jest negacją tego co jest w i. W C++ zmienna przyjmuje wartość false jeżeli jest równa zero i true jeżeli równa się czemukolwiek innemu, jeżeli zmienna i jest równa zero, to !i jest równe true. Podobnie jest z !wsp[i]. Te dwa warunki są połączone &&, więc jeżeli obydwa są spełnione (czyli i==0 oraz wsp[0]==0) to program wyświetli odpowiedni komunikat.
Ten warunek można również zapisać jako:

if((i==0)&&(wsp[0]==0))
0

Dzięki wielkie. :)

Czy ktoś jeszcze umie mi podać jakiś prosty sposób na liczenie pierwiastków zespolonych? Wiem, że jest biblioteka complex ale nie wiem dokładnie jak opisać nią zmienne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1