Problem z funkcją IF w funkcji IF

0

Witajcie!

Jestem nowy na forum, więc nie bijcie, tylko powiedzcie gdzie i czego szukać jak robię coś źle (chociażby w sposobie pokazywanie Wam mojego kodu).
W załączniku kod program w jpg.

Załóżmy, że chcę osiągnąć wartość r2 = 0 - wpisuję w programie odpowiednią zmienną, np.: a = 2.1 i powyższy kod poprawnie wyświetla mi, że r2 wynosi 0. Natomiast jeżeli zmienię warunki w drugim if: if(r2 == 0) i wpiszę tę samą wartość początkową a = 2.1 program traktuje ten warunek jako błędny i przechodzi do else wyświetlając mi: "nie??"

Czy ktoś mógłby mi pomóc i wyjaśnić dlaczego tak jest, albo chociaż wskazać kierunek, w którym powinienem szukać?
dzięki za odpowiedzi,
pozdrawiam

problem1.jpg

2

if to nie funkcja, tylko instrukcja warunkowa. Na przyszłość zamiast wklejać screenshota kodu wklej kod, wtf.

Co do porównywania liczb zmiennoprzecinkowych - nie rób tego: http://kaczus.ppa.pl/art/Skrzynia_porad,18.html#double

0

Taka forma będzie bardziej czytelna?:

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void)
{
    double a = get_double("Podaj kwotę:\n$");
    double qu = 0.25;
    double di = 0.1;
    double r1 = fmod(a, qu);
    double c = (a - r1) / qu;   // liczba ćwierćdolarówek
    double r2 = fmod(r1, di);
    double d = r1 / di;  // liczba dimesów
    if(r1 == 0)
    { 
        printf("ok, wyszło %.0f ćwierćdolarówek\n", c);   
         }
    else
    {
         if(r2 == 0)
        {
            printf("W takim razie potrzebujesz %.0f ćwierćdolarówek, a także %.2f dimesów \n", c, r2);
        }
        else 
        {
            printf("nie??\n");  
        }
    
    }
}

Kopiuj wklej z sandboxa. W sumie racja, myślałem, że więcej miejsca zajmie.

Ok, dziękuję za wskazówkę !

0
[kq napisał(a)]

Co do porównywania liczb zmiennoprzecinkowych - nie rób tego: http://kaczus.ppa.pl/art/Skrzynia_porad,18.html#double

Jestem po jednym (1!) wykładzie o C i to wszystko, jeżeli chodzi o moją znajomość jakichkolwiek języków. Na początku googlowałem jak napisać program sprawdzający, czy wynik jest liczbą całkowitą czy nie, ale odpowiedzi, które znalazłem chyba trochę mnie jeszcze przerastają. Małymi kroczkami do przodu, raz jeszcze, dzięki za linka! Zaraz zabiorą się za jego analizę.

0

@AnyKtokolwiek: @kq:
Dziękuję raz jeszcze za przydatne linki - dla mnie, nowicjusza - są prawdziwą kopalnią wiedzy.

Pozwólcie proszę, że zadam kolejne pytanie:

Dlatego zamiast sprawdzać czy wynik naszych operacji jest jet równy 0, powinniśmy sprawdzać, czy nasz wynik jest w przedziale
 -epsilon<nasz wynik<epsilon 
gdzie epsilon jest wartością dokładności. Gdy chcemy sprawdzić czy 2 liczby są równe, to:
if (fabs(liczba1-liczba2) < epsilon)
   puts("Z dużym prawdopodobieństwem są to wartości równe");

Chodzi o epislon = czy ja mam go zdefiniować w sposób:
double epsilon = 0.1 (lub inna wartość dokładności którą chcę?)
czy o coś innego tutaj chodzi?

2

Dokładnie o to chodzi. Bardziej to powinno być 0.00001 ale zasada dokładnie taka jak opisałeś. Na liczbach zmiennoprzecinkowych czasem da się przeprowadzać w pełni dokładne obliczenia, ale trzeba rozumieć zasadę ich działania i to jak wygląda ich reprezentacja. Dla nowicjusza proste podejście "nie używaj == do liczb zmiennoprzecinkowych" jest podejściem właściwym :​)

2
Jagielon napisał(a):

Taka forma będzie bardziej czytelna?:

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int main(void)
{
    double a = get_double("Podaj kwotę:\n$");

...

}

Dopiero teraz *) dostrzegłem, że to zagadnienie finansowe.

Inną receptą (niż epsylon), i tu dobrze pasującą, jest prowadzenie obliczeń (tutaj) w centach na przykład na typie long int . Oczywiście na wejściu / wyjściu trzeba sobie przeskalować przez 100, włożyć wysiłek w wypisywanie itd.
Szkoda, że C nie posiada w standardzie specyficznego typu do obliczeń finansowych, nowsze języki mają, i to jest super.

*) dlatego też kod dajemy jako sformatowany teksty, a nie obrazki

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