Problem z funkcją IF w funkcji IF

Odpowiedz Nowy wątek
2020-03-19 17:10

Rejestracja: 2 tygodnie temu

Ostatnio: 1 tydzień temu

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

edytowany 1x, ostatnio: kq, 2020-03-19 17:13
https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/ szczególnie podpunkt o obrazkach zamiast tekstu. - kq 2020-03-19 17:11

Pozostało 580 znaków

kq
2020-03-19 17:13
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

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


Pozostało 580 znaków

2020-03-19 17:14

Rejestracja: 2 tygodnie temu

Ostatnio: 1 tydzień temu

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ę !

edytowany 2x, ostatnio: cerrato, 2020-03-19 17:15
Powiedział Ci @kq żeby nie porównywać doubli "dokładnie" - AnyKtokolwiek 2020-03-19 18:31

Pozostało 580 znaków

2020-03-19 17:19

Rejestracja: 2 tygodnie temu

Ostatnio: 1 tydzień temu

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ę.

edytowany 4x, ostatnio: Jagielon, 2020-03-19 17:27

Pozostało 580 znaków

2020-03-19 19:03

Rejestracja: 2 tygodnie temu

Ostatnio: 1 tydzień temu

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?

edytowany 1x, ostatnio: Jagielon, 2020-03-19 19:04

Pozostało 580 znaków

kq
2020-03-19 19:16
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

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 :​)


Pozostało 580 znaków

2020-03-19 19:35

Rejestracja: 1 rok temu

Ostatnio: 49 sekund temu

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

edytowany 2x, ostatnio: AnyKtokolwiek, 2020-03-19 19:45

Pozostało 580 znaków

Odpowiedz

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