logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Błędy w algorytmie obliczania pierwiastków równania kwadratowego w C

guru1989 23 Paź 2011 21:54 2003 6
  • #1 10058887
    guru1989
    Poziom 9  
    Posty: 15
    Witam wszystkich. Jestem studentem i dopiero się uczę programowania w C, dlatego nie mogę sobie poradzić z takim oto zadaniem:

    /*
    kompilacja: Sun C: cc -Xc trojmian.c -lm
    GNU C: gcc -pedantic -Wall trojmian.c -lm*/
    #include <stdio.h>
    #include <math.h>

    int main() {
    float a,b,c,delta;

    printf("Program oblicza pierwiastki rownania w postaci\n");
    printf(" 2\n");
    printf(" a x + b x +c =0\n");
    print("Podaj wartosc a:");
    scanf("%f",&a);
    printf("Podaj wartosc b:");
    scanf("%f",&b);
    printf("Podaj wartosc c:");
    scanf("%f",&c);

    if (a=0.0) /*przypadek rownania liniowego */
    if (b!=0.0)
    printf("Jest to równanie liniowe o rozwiazaniu x=%f\n",-c/b)
    else if (c==0.0) /* oraz a==b==0.0 */
    printf("Rozwiazaniem jest dowolne x\n");
    else /* a==b==0.0 != c */
    printf("Brak rozwiazan\n");
    else { /*przypadek rownania kwadratowego */
    delta=pow(b,2)-4.0*a*c;
    if (delta<0)
    printf("Brak rozwiazan rzeczywistych\n");
    else /* delta>=0 */
    if (delta>0)
    printf("Rozwiazaniem sa x1=%f i x2=%f\n",(-b-sqrt(delta))/(2*a),(-b+sqrt(delta))/(2*a));
    else
    printf("Rozwiazaniem sa x1=x2=%f\n",-b/(2*a));
    }

    }


    Ponoć w tym algorytmie są 3 błędy. Znalazłem póki co 2: w linii 13 brakuje 'f' przy funkcji, w linii 22 nie ma średnika. Po tym zmianach program kompiluje się z błędem, którego nie rozumiem:

    Undefined first referenced
    symbol in file
    pow trojmian.o
    sqrt trojmian.o
    ld: fatal: Symbol referencing errors. No output written to a.out

    Proszę o pomoc w zrozumieniu tego zadania, aby pewnego dnia też móc pomóc jakiemuś studentowi :D

    Proszę pamiętać o używaniu znaczników syntax. Opcja Listing kodu. Proszę poprawić post i wszystkie kolejne. - arnoldziq
  • #2 10058950
    marcin2500
    Poziom 12  
    Posty: 40
    Pomógł: 6
    nie mam aktualnie na tym komputerze kompilatora aby sprawdzić kod, ale co udało mi się wyłapać to

    f (a=0.0) // powinno być a==0.0. Częsty błąd początkujących. Przypisujesz do zmiennej wartość 0. C traktuje zero jako fałsz a każdą inną wartość jako true

    Ponadto brakuje wartości zwracanej z main skoro zadeklarowałeś że zwraca inta.
    Dopisz np return 0;

    Co do błędu opisanego na końcu przez Ciebie wynika z braku biblioteki math.h. Wydaje mi się że używając gcc przełącznik -lm powinien być wcześniej przed nazwą pliku kompilowanego, ale nie jestem pewien
  • #3 10059063
    guru1989
    Poziom 9  
    Posty: 15
    Poprawiłem a==0.0, dopisałem return0;.

    Co do biblioteki to masz na myśli to?

    /*
    kompilacja: Sun C: cc -Xc trojmian.c -lm
    GNU C: gcc -pedantic -Wall trojmian.c -lm*/

    To jest komentarz, więc powinien być pomijany przy kompilacji, czy nie mam racji?
  • #4 10059087
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    Linkerowi brakuje funkcji pow i sqrt. Podaj polecenie jakim kompilujesz kod. Dajesz -lm?
    Listingi programów dawaj jednak w odpowiednie tagi, będą czytelniejsze.

    edit:

    Ten komentarz to instrukcja, jak należy kompilować ten kod.
  • #5 10059093
    guru1989
    Poziom 9  
    Posty: 15
    cc trojmian.c

    Edit:

    krru napisał:
    Ten komentarz to instrukcja, jak należy kompilować ten kod.


    Czyli, że muszę zmienić kolejność z -lm, tak jak to napisał marcin2500, tak?

    Dodano po 29 [minuty]:

    Znajomy znalazł 3 błędy i podobno miał dobrze:
    1. Linia 13 - brakowało 'f'.
    2.Linia 23 - nie ma średnika.
    3.a==0.0.

    A mi dalej wywala błąd...
  • #6 10059374
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    guru1989 napisał:
    cc trojmian.c

    Czyli, że muszę zmienić kolejność z -lm, tak jak to napisał marcin2500, tak?



    Raczej nie, ale nie powinno to mieć znaczenia. Po prostu podaje się listę plików, niektóre
    z flagami oznaczającymi odpowiednie traktowanie. Resztę kompilator poznaje po rozszerzeniu. Flaga -l oznacza, że plik jest biblioteką.

    guru1989 napisał:
    cc trojmian.c
    Znajomy znalazł 3 błędy i podobno miał dobrze:
    1. Linia 13 - brakowało 'f'.
    2.Linia 23 - nie ma średnika.
    3.a==0.0.

    A mi dalej wywala błąd...


    Ale jaki? Dalej ten o funkcjach pow i sqrt? To właśnie brak biblioteki matematycznej, włączanej opcją -lm (włącza do kompilacji/linkowania plik libm.a).
  • #7 10059459
    guru1989
    Poziom 9  
    Posty: 15
    Rozumiem to tak: wywala mi błąd, bo przy kompilowaniu potrzebna jest biblioteka matematyczna, czyli takie oznaczenie symboli matematycznych, żeby procesor je zrozumiał. W takim razie ostatnie pytanie dziś - co oznacza ta instrukcja początkowa (include <math.h>), że przy kompilacji muszę dodawać -lm (library math?) i dodatkowo zapytam o polecenie kompilacji gcc - czym się różni od cc?

    Dziękuję Wam Panowie bardzo serdecznie za pomoc, jestem przekonany, że jeszcze nie raz będę jej potrzebował... Dobrej nocy!
    Moderowany przez arnoldziq:

    A ja udzielam koledze ostrzeżenia #1, za nie stosowanie się do uwag moderatorskich. Dobrej nocy.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono błędy w algorytmie obliczania pierwiastków równania kwadratowego w języku C. Użytkownik zidentyfikował problemy w kodzie, takie jak użycie operatora przypisania zamiast porównania w warunku (a=0.0 zamiast a==0.0), brak średnika oraz brak wartości zwracanej z funkcji main. Uczestnicy dyskusji zasugerowali poprawki, w tym dodanie flagi -lm przy kompilacji, aby uwzględnić bibliotekę matematyczną math.h, co jest niezbędne do użycia funkcji pow i sqrt. Użytkownik zadał pytania dotyczące różnic między kompilatorami gcc i cc oraz znaczenia flagi -lm.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA