[C]równanie kwadratowe

madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[C]równanie kwadratowe

Post autor: madaf007 »

Witam. Mam napisać prosty program do wyliczania pierwiastków równania kwadratowego. Ze względu na to, że wciąż się uczę nie potrafię wyłapać błędów w kodzie które zrobiłem. Mój kod wygląda tak:

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
int rkwad(double a, double b, double c,double *x1, double *x2)
{
    double Delta;
    if(a==0){
    return(-1);
    }
    Delta=b*b-4.0*a*c;
    if(Delta<0)
    return(0);
    else
    if(Delta==0)
    {
    *x1=((-b)/2.0*a);
    *x2=*x1;
    return(1);
    }
    else
    if(Delta>0){
    *x1=((-b)-sqrt(Delta))/(2.0*a);
    *x2=((-b)+sqrt(Delta))/(2.0*a);
    return(2);
    }
}
int main()
{
  double a,b,c;
  double *d,*e;
  printf("Podaj a, b, c: 
");
  scanf("%lf %lf %lf",&a,&b,&c);
  printf("
");
  if(rkwad(a,b,c,d,e)==-1){
                             printf("a nie moze sie rownac 0!
");
                             }
  else
  if(rkwad(a,b,c,d,e)==0){
                            printf("Delta jest mniejsza od zera. Rownanie nie ma rozwiazan.
");
                            }
  else
  if(rkwad(a,b,c,d,e)==1){
                            printf("Delta rowna 0. Rownanie ma takie rozwiazanie: x1=%lf i x2=%lf
",d,e);
                            }
                            else
                            if(rkwad(a,b,c,d,e)==2){
                                                      printf("Delta wieksza od zera. Rownanie ma takie rozwiazania: x1=%lf i x2=%lf",d,e);
                                                      }
                                                      system("PAUSE");
                                                      return 0;
                                                      }
Program się kompiluje, ale kiedy delta wychodzi większa lub równa zero to program się zawiesza. Gdzie popełniłem błąd? Pierwsza część raczej na pewno jest dobra bo sugerowałem się skryptem, ale w drugiej coś pewnie namieszałem.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C]równanie kwadratowe

Post autor: soku11 »

Jakości kodu nie oceniam. Nie działa z prostego względu - nie powinno działać. W funkcji przyjmujesz jako dwa ostatnie argumentu wskaźniki - OK. Teraz co się dzieje, jak prześlesz tam wskaźniki d i e? Jakie one mają początkowe wartości? Nie wiadomo. Mogą mieć 0, mogą mieć 123124234. Co się więc stanie, jeśli wpiszesz coś pod komórkę o adresie 0 lub 123124234? Segfault, bo mażesz po najprawdopodobniej nie swojej pamięci.

Pozdrawiam.
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[C]równanie kwadratowe

Post autor: madaf007 »

Poczytałem o wskaźnikach trochę i dodałem przy zmiennych d i e funkcji rkwad "&" i program działa bez zarzutu:) Dziękuje
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C]równanie kwadratowe

Post autor: soku11 »

Jeśli dobrze myślę, to nadal nie działa dobrze Pokaż jak naprawiłeś, a konkretnie deklaracje zmiennych i wywołanie funkcji.

Pozdrawiam.
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[C]równanie kwadratowe

Post autor: madaf007 »

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
int rkwad(double a, double b, double c,double *x1, double *x2)
{
    double Delta;
    if(a==0){
    return(-1);
    }
    Delta=b*b-4.0*a*c;
    if(Delta<0)
    return(0);
    else
    if(Delta==0)
    {
    *x1=((-b)/2.0*a);
    *x2=*x1;
    return(1);
    }
    else
    if(Delta>0){
    *x1=((-b)-sqrt(Delta))/(2.0*a);
    *x2=((-b)+sqrt(Delta))/(2.0*a);
    return(2);
    }
}
int main()
{
  double a,b,c;
  double d,e;
  printf("Podaj a, b, c: 
");
  scanf("%lf %lf %lf",&a,&b,&c);
  printf("
");
  if(rkwad(a,b,c,&d,&e)==-1){
                             printf("a nie moze sie rownac 0!
");
                             }
  else
  if(rkwad(a,b,c,&d,&e)==0){
                            printf("Delta jest mniejsza od zera. Rownanie nie ma rozwiazan.
");
                            }
  else
  if(rkwad(a,b,c,&d,&e)==1){
                            printf("Delta rowna 0. Rownanie ma takie rozwiazanie: x1=%lf i x2=%lf
",d,e);
                            }
                            else
                            if(rkwad(a,b,c,&d,&e)==2){
                                                      printf("Delta wieksza od zera. Rownanie ma takie rozwiazania: x1=%lf i x2=%lf
",d,e);
                                                      }
                                                      system("PAUSE");
                                                      return 0;
                                                      }
No nie wiem. Jak patrze to wszystko działa jak powinno.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C]równanie kwadratowe

Post autor: soku11 »

Rzeczywiście poprawiłeś wszystko, co trzeba było, żeby ten kod działał.

Pozdrawiam.
robin5hood
Użytkownik
Użytkownik
Posty: 1676
Rejestracja: 2 kwie 2007, o 14:43
Płeć: Mężczyzna
Lokalizacja: warszawa
Podziękował: 178 razy
Pomógł: 17 razy

[C]równanie kwadratowe

Post autor: robin5hood »

brakuje, jesli pod windowsem

Kod: Zaznacz cały

#include <math.h>
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[C]równanie kwadratowe

Post autor: madaf007 »

robin5hood pisze:brakuje, jesli pod windowsem

Kod: Zaznacz cały

#include <math.h>
Faktycznie, ale o dziwo pierwiastkuje:)
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C]równanie kwadratowe

Post autor: soku11 »

Pierwiastkuje, bo jakaś inna biblioteka pewnie niechcący podłącza ten nagłówek. Pierwiastkować by nie pierwiastkowało gdybyś nie miał takiej funkcji. A gdyby jej nie było, to linker by się przypluł

Pozdrawiam.
ODPOWIEDZ