• 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

Object Storage Arubacloud
0 głosów
548 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ź 598 wizyt
pytanie zadane 25 listopada 2017 w C i C++ przez artur96 Początkujący (250 p.)
0 głosów
2 odpowiedzi 1,853 wizyt
pytanie zadane 27 lutego 2018 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
2 odpowiedzi 151 wizyt
pytanie zadane 28 września 2019 w C i C++ przez CandyyPL Nowicjusz (120 p.)

92,551 zapytań

141,399 odpowiedzi

319,529 komentarzy

61,937 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...