Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C - Sprawdzenie kodu programu

Matek33_33 10 Gru 2013 18:45 1452 10
  • #1 10 Gru 2013 18:45
    Matek33_33
    Poziom 12  

    Witam
    Przy kompilacji wyskakuje błąd z którym nie mogę sobie poradzić :/

    Kod: c
    Zaloguj się, aby zobaczyć kod


    C - Sprawdzenie kodu programu

    0 10
  • #3 10 Gru 2013 21:43
    Matek33_33
    Poziom 12  

    F=5.1*pow(x-1,2)+pow(exp,x+1);

    F=pow(exp,(x+3.2))+3.2*sqrt(fabs(x)+2);

    zmieniłem na

    F=5.1*pow(x-1,2)+pow(exp(x),x+1);

    F=pow(exp(x),(x+3.2))+3.2*sqrt(fabs(x)+2);

    ale teraz program się uruchamia ale co bym nie wpisał to wynik równa się -1.#IND00

    0
  • #4 10 Gru 2013 22:14
    ppc
    Poziom 14  

    Podobne błędy jak w temacie obok - nie rozumiesz zasięgu zmiennych. Traktujesz zmienne, tak jakby były globalne, ale deklarujesz je w ciele funkcji.

    Poprawiłem, tak, że podajesz A, B, C jako argumenty do funkcji. Jak chcesz, to możesz zadeklarować A, B, C globalnie(po za ciałem funkcji), ale tak jest bardziej elegancko.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 10 Gru 2013 22:20
    Matek33_33
    Poziom 12  

    No właśnie nie mogę trochę pojąć :/
    A wynik mi wyświetla jako -1.#IND00

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #6 10 Gru 2013 22:26
    ppc
    Poziom 14  

    -1.#IND00 oznacza nieskończoność(przekroczenie zakresu liczby float). Nie wiem jak ma działać program i co ma liczyć, być może gdzieś jest błąd w zapisie matematycznym.

    Dla wartości 0.1, 0.2. 0.3, 0.5, otrzymałem wynik 4.018673
    Dla 2, 3, 4, 5 otrzymałem wynik "inf"(u mnie po kompilacji gcc wyrzuca "inf" zamiast "-1.#IND00")

    0
  • #7 10 Gru 2013 22:42
    Matek33_33
    Poziom 12  

    ppc napisał:
    -1.#IND00 oznacza nieskończoność(przekroczenie zakresu liczby float). Nie wiem jak ma działać program i co ma liczyć, być może gdzieś jest błąd w zapisie matematycznym.

    Dla wartości 0.1, 0.2. 0.3, 0.5, otrzymałem wynik 4.018673
    Dla 2, 3, 4, 5 otrzymałem wynik "inf"(u mnie po kompilacji gcc wyrzuca "inf" zamiast "-1.#IND00")


    C - Sprawdzenie kodu programu

    0
  • Pomocny post
    #8 10 Gru 2013 22:56
    ppc
    Poziom 14  

    Generalnie był błąd, bo 2 razy podnosiłeś e do potegi(było (e^x)^(x+1)) zamiast e^(x+1))

    Dalsze wyliczanie nieskończoności wynika z próby obliczenia ln dla wartości <= 0 i wygląda na to, że program liczy poprawnie. Możesz dodać warunek, że jeżeli tam gdzie się liczy logarytm, argument jest <= 0, to program wypisuje "wynik to -∞"

    Code:
    [syntax=c]
    
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
     
    float F1 (float x, float C){
     
    float F;
     
    if (-1<=x<=1)
    F=5.1*pow(x-1,2)+ exp(x + 1); //tu poprawiłem
     
    else
    if (x<-1)
    F=exp(x+3.2)+3.2*sqrt(fabs(x)+2); //i tu
     
    else
    if (x>1)
    F=3*sqrt((3*x)+2)+log(1.5-x); //jeżeli x >= 1.5, to wynik =-inf
     
    else
    F=C;
     
    return F;
     
    }
     
    float F2 (float u, float A, float B, float C){
    float F2=A*F1(pow(u,3)+A*u+B, C)+B*F1(pow(u,3)-B*u-C, C)+C*F1(pow(u,2)-C*u-A, C);
     
    return F2;
    }
     
    int main (void) {
    float A,B,C;   
    float u;
     
    printf("Podaj A \n");
    scanf("%f",&A);
    printf("Podaj B \n");
    scanf("%f",&B);
    printf("Podaj C \n");
    scanf("%f",&C);
    printf("Podaj u \n");
    scanf("%f",&u);
     
    float wynik=F2(u, A, B, C);
    printf("Wynik to %f \n",wynik);
     
    return 0;
    }
    [/syntax]


    Proszę umieszczać kod (wyłacznie) w znacznikach syntax. Opcja Listing kodu. Proszę to poprawić. [adamas_nt]

    0
  • Pomocny post
    #9 10 Gru 2013 23:05
    2341115
    Użytkownik usunął konto  
  • Pomocny post
    #10 10 Gru 2013 23:11
    ppc
    Poziom 14  

    Doczytałem kartkę i zrozumiałem(o co chodziło prowadzącemu zajęcia). Prowadzący zajęcia chciał, żebyś sam dodatkowo sprawdził dziedzinę funkcji F i jeżeli nie da się jej obliczyć zwrócił C. A warunki trzeba poprawić i zamiast ostatniego przedziału x > 1, powinien byc przedział (1, 1.5), a następnie dla x >= 1.5, F = C. I wtedy C w powyższym wzorze się przyda.

    Jak wyżej wynika to z dziedziny funkcji ln.

    No i na sam koniec, w C nie można tak zapisywać warunków[!!!]:

    Code:
    -1<x<1


    Ostatecznie(wraz z formatowaniem kolegi powyżej)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 10 Gru 2013 23:14
    Matek33_33
    Poziom 12  

    PosepnyCzerep napisał:


    Jeśli się nie pomyliłem to masz takie wzory:
    $$\left\{\begin{matrix}
    -1 \le x \le 1 & F_{1}=5.1\cdot(x-1)^{2}+(e^{x})^{x+1} \\
    x < -1 & F_{1}=(e^{x})^{x+3.2}+3.2\cdot \sqrt{\left | x \right |+2} \\
    x > 1 & F_{1}=3\cdot \sqrt{3x+2}+log_{10}(1.5-x)
    \end{matrix}\right.$$

    $$F_{2}=A\cdot F_{1}(( u^{3}+A\cdot u+B),C)+B\cdot F_{1}(( u^{3}-B\cdot u-C),C)+C\cdot F_{1}(( u^{2}-C\cdot u-A),C)$$

    W związku z powyższym po co Ci F=C w pierwszym wzorze skoro masz warunki na cały obszar od minus nieskończoności do plus nieskończoności?


    Tak to są dokładnie te wzory. F=C; jest po to bo w poleceniu mam że jeżeli funkcja F(x) nie może być obliczona dla argumentu podanego z przedziału to funkcja ta zwraca wartość stałej C

    0