• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

pierwiastki równania kwadratowego - funkcja źle działa

VPS Starter Arubacloud
0 głosów
697 wizyt
pytanie zadane 3 lutego 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)

Witam

Jestem studentem pierwszego roku informatyki. W związku z tym ,że nadchodzi dużymi krokami egzamin z podstaw programowania postanowiłem  sobie ,że w ramach nauki do egzaminu zrobię raz jeszcze zadania , które robiliśmy 

przez cały semestr na laboratoriach jednak postanowiłem je troszeczkę przerobić. Postanowiłem każde zadanie robić na funkcjach  mimo tego że zadanie tego nie wymaga , żeby jak najlepiej nauczyć się funkcji ale do rzeczy.

Mam takie oto zadanie:Napisz program, ktory oblicza pierwiastki rownania kwadratowego
A*X*X + B*X + C = 0. Wspolczynniki nalezy odczytac z klawiatury.
Nalezy wykluczyc probe pierwiastkowania liczby ujemnej. W takim przypadku
na ekranie powinien sie pojawic odpowiedni komunikat. Napisałem taki oto kod programu:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void pierwiastki_rownania_kwadratowego(int a,int b,int c , int *delta, float *pier,float *x0,float *x1,float *x2)
{
    int w=2;
     *delta=pow(b,w) - (4*a*c);
     *pier=sqrt(*delta);
    *x1=(-b-*pier)/(2*a);
     *x2=(-b+*pier)/(2*a);
     *x0=(-b)/(2*a);
}
int main(void)
{
    int a,b,c,delta;
    float pier,x0,x1,x2;
    pierwiastki_rownania_kwadratowego(a,b,c,&delta,&pier,&x0,&x1,&x2);
     printf("podaj wspolczynniki rownania kwadratowego Ax*x+bx+c: \n");
    printf("Podaj wspolczynnik a: ");
    scanf("%d",&a);
    printf("podaj wspolczynnik b: ");
    scanf("%d",&b);
    printf("podaj wspolczynnik c: ");
    scanf("%d",&c);
    printf("Wspolczynniki rownania to: \n a=%d ,b=%d , c=%d \n",a,b,c );
    if(delta>0)
    {
        printf("delta wynosi:%d \n",delta);
        printf("pierwiastek z delty wynosi: %.2f \n",pier);
        printf("pierwiastki rownania wynosza:\n x1=%.2f, x2=%.2f \n\n",x1,x2);
    }
    else if(delta==0)
    {
         printf("delta wynosi: %d \n",delta);
         printf("pierwiastek rownania wynosi: x0=%.2f \n\n",x0);
    }
    else
    {
        printf("delta wynosi: %d \n",delta);
        printf("brak rozwiazania w zbiorze liczb rzeczywistych poniewarz delta jest ujemna \n\n");
    }
    system("pause");
    return (0);
}

Problem polega na tym , że delta nie jest poprawnie zwracano wychodzą jakieś śmieci próbowałem ją wyzerować ale nic nie pomogło.Czy ktoś może misprawdzić ten kod i powiedzieć co mam źle i co muszępoprawić?. Z góry dziękuję.

2 odpowiedzi

+1 głos
odpowiedź 3 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Najpierw liczysz pierwiastki, a potem dopiero pobierasz współczynniki ? ;)

A to tylko jeden z wielu mankamentów w kodzie.
komentarz 3 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
No właśnie, dopiero teraz to zauważyłem. Nic dziwnego, że wychodzą śmieci
komentarz 3 lutego 2018 przez mn130496 Gaduła (3,530 p.)

A jakie są jeszcze mankamenty w tym kodzie?

komentarz 3 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
Moja opinia:

1.Brak zabezpieczenia gdy a = 0

2.Niepotrzebna zmienna "w". Jeżeli już to stała a i tak lepiej byłoby po prostu wpisać 2  w funkcji pow

3.Najpierw sprawdź wartość delty a potem w zależności od wartości wykonuj odpowiednie obliczenia. Nie ma sensu za każdym razem jednocześnie obliczać x1, x2 i x0
komentarz 3 lutego 2018 przez Bosswell Nałogowiec (36,470 p.)
Mógłbyś zrobić więcej funkcji np. do liczenia delty, pierwiastków. Zamiast referencji, mógłbyś zwracać np tablice z pierwiastkami. Co i tak jest referencją :D Więc jak uważasz.

Ta linijka pojawia się w każdym ifie printf("delta wynosi:%d \n",delta);

Więc lepiej ją przed ifa wyrzucić. DRY
0 głosów
odpowiedź 3 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
Wprawdzie już jakiś czas nie programuję w c++ ale wydaje mi się, że lepiej byłoby najpierw policzyć tylko deltę a potem w zależności od tego jaką wartość przyjmuje albo wyświetlić: brak rozwiązań w zbiorze liczb rzeczywistych albo policzyć x1 i x2 albo dla delty = 0 policzyć jeden pierwiastek.

Poza tym wydaje mi się, że chyba nigdy tak porządnie nie debugowałeś. Odpal debugger ustaw punkty kontrolne i obczajaj co się dzieje w podejrzanych linijkach.

Podejrzewam, że śmieci wychodzą Ci dla ujemnej delty.

Podobne pytania

0 głosów
1 odpowiedź 739 wizyt
pytanie zadane 25 listopada 2017 w C i C++ przez artur96 Początkujący (250 p.)
0 głosów
2 odpowiedzi 1,984 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
2 odpowiedzi 193 wizyt
pytanie zadane 28 września 2019 w C i C++ przez CandyyPL Nowicjusz (120 p.)

93,032 zapytań

141,996 odpowiedzi

321,300 komentarzy

62,379 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...