Strona 1 z 1

[pascal] błąd w kodzie programu

: 17 lis 2010, 18:37
autor: Wojtol
Witam :)
Jestem nowy w świecie programowania. Chcę napisać program na wyliczenie pierwiastków równania kwadratowego. Niestety wyskakuje błąd. Proszę o wskazanie mi błędu.. ;)
Oto kod programu:

Kod: Zaznacz cały

Program jeden;

Uses
                Crt;
var
                x1,x2,D,a,b,c:Real;

Begin
                clrscr;
                writeln ('wprowad« a:');
                readln (a);
                writeln ('wprowad« b:');
                readln (b);
                writeln ('wprowad« c');
                readln (c);
                D:=(b*b)-4*a*c;
                readln;
                x1:=(-b-sqrt(D))/(2*a);
                x2:=(-b+D)/2*a;

If (D<0) then
Begin
                writeln ('brak rozwiĄzania');
Else (D>0)
                writeln ('rozwiĄzania to:');
                writeln (a,b);


end;
                readln;
end.

Odp: [pascal] błąd w kodzie programu

: 17 lis 2010, 19:03
autor: Hauleth
Hmmm... o ile wiem to crt nie dość, że jest przestarzałe to jeszcze stricte windowsowe, taki odpowiednik conio.h. Czyli "użyj a cię zabiję".

Odp: [pascal] błąd w kodzie programu

: 17 lis 2010, 19:20
autor: Wojtol
Muszę używać tego programu w szkole ;) Może ktoś wie jak rozwiązać problem?

Odp: [pascal] błąd w kodzie programu

: 17 lis 2010, 19:49
autor: karmelek

Kod: Zaznacz cały

                x1:=(-b-sqrt(D))/(2*a);
                x2:=(-b+D)/2*a;
To powinno się liczyć tylko, jeżeli D>=0

Kod: Zaznacz cały

Else (D>0)
                writeln ('rozwiĄzania to:');
                writeln (a,b);
A nie powinno zwracać x1 i x2?

Odp: [pascal] błąd w kodzie programu

: 17 lis 2010, 20:21
autor: lesiu1111
Jest:

Kod: Zaznacz cały

x1:=(-b-sqrt(D))/(2*a);
x2:=(-b+D)/2*a;
Powinno być:

Kod: Zaznacz cały

x1:=(-b-sqrt(D))/(2*a);
x2:=(-b+sqrt(D))/2*a;
No i oczywiście powinno być zwracane x1, x2 zamiast a i b.

Odp: [pascal] błąd w kodzie programu

: 17 lis 2010, 20:27
autor: mutopompka

Kod: Zaznacz cały

x2 = (-b-SQRT(D))/(2*a)
Jak już oczywiście :)

Do tego warunek, aby przy D=0 liczył tylko x1 (bo ma tylko 1 rozwiązanie (podwójne) = wierzchołek paraboli znajduje się na osi X): x1=x2=p = -b/2a

A jaki błąd wyskakuje?

Odp: [pascal] błąd w kodzie programu

: 17 lis 2010, 21:51
autor: karmelek

Kod: Zaznacz cały

If (D<0) then
Begin
                writeln ('brak rozwiĄzania');
Else (D>0)
Zapewne błąd kompilacji spowodowany brakiem enda, jakby ta instrukcja grupująca tu miała jakikolwiek sens.

Odp: [pascal] błąd w kodzie programu

: 18 lis 2010, 15:27
autor: lesiu1111
mutopompka pisze:

Kod: Zaznacz cały

x2 = (-b-SQRT(D))/(2*a)
Jak już oczywiście :)
Przecież przypisanie wartości do zmiennej to w Pascalu :=, więc nie wiem czemu miałoby być =.

A zresztą jeden pierwiastek jest z + przy pierwiastku z delty, a drugi z - przy pierwiastku z delty, a Ty sugerujesz, że zarówno X1, jak i X2 ma być z - przy pierwiastku z delty?
Nie ma też znaczenia, czy zapisze się SQRT, czy też sqrt. W Pascalu to jedno i to samo.

Odp: [pascal] błąd w kodzie programu

: 18 lis 2010, 18:12
autor: mutopompka
Po 1: Moja pomyłka, oczywiście, że ma być x2:=
Po 2. A gdzie u Ciebie jest x2 z pierwiastkiem ???? Moja pomyłka jest taka, że zamiast + dałem -, więc poprawnie powinno być:

Kod: Zaznacz cały

x2:=(-b+sqrt(D))/(2*a)
Napisałem SQRT z dużej, abyś umieścił pierwiastek w wyliczeniu zmiennej x2 (patrz Twój 1 post).

I ponawiam pytanie: jaki błąd występuje u Ciebie?

Odp: [pascal] błąd w kodzie programu

: 18 lis 2010, 21:53
autor: warlock24
Bład to najpewniej Runtime Error 200 - dzielenie przez zero. Najwyraźniej autor ma większy problem z matematyką niż z programowaniem więc zalecałbym uporządkowanie wiedzy z zakresu funkcji kwadratowej.

Kod: Zaznacz cały

Mamy wartości a, b, c

delta = b^2 - 4*a*c
jeżeli delta > 0 to
    x1 = -b - sqrt(delta) / 2*a
    x2 = -b + sqrt(delta) / 2*a
    wyświetl wynik
    zakończ program
jeżeli delta = 0 to
    x1 = -b/2*a
    wyświetl wynik
    zakończ program
jeżeli delta < 0 to
    Wyświetl komunikat o braku rozwiązań
koniec programu
teraz kodowanie powinno pójść o wiele sprawniej
:boat:

PS
"zakończ programu" to wywołanie funkcji exit;

Odp: [pascal] błąd w kodzie programu

: 18 lis 2010, 22:41
autor: karmelek

Kod: Zaznacz cały

"zakończ programu" to wywołanie funkcji exit;
a to niby w Pascalu jaki to ma sens?

Odp: [pascal] błąd w kodzie programu

: 19 lis 2010, 01:31
autor: warlock24
karmelek pisze:

Kod: Zaznacz cały

"zakończ programu" to wywołanie funkcji exit;
a to niby w Pascalu jaki to ma sens?
Znaczy o co się dokładnie pytasz? Co nie miałoby sensu w pascalu? Wykorzystanie exit zamiast else if?

Odp: [pascal] błąd w kodzie programu

: 19 lis 2010, 19:37
autor: Szmitas
W przypadku delty < 0 nie ma rozwiązań rzeczywistych, ale są zespolone. Opracuj to również jeśli chcesz być dokładny, bo stwierdzenie:
If (D<0) then
Begin
writeln ('brak rozwiĄzania');
to bzdura :)

Odp: [pascal] błąd w kodzie programu

: 19 lis 2010, 20:21
autor: tristan
karmelek pisze:

Kod: Zaznacz cały

"zakończ programu" to wywołanie funkcji exit;
a to niby w Pascalu jaki to ma sens?
Taki sam, jak w innych językach -- zrobienie dupiatego algorytmu z wieloma wyjściami.

Odp: [pascal] błąd w kodzie programu

: 19 lis 2010, 21:17
autor: mutopompka
@szmitas: a czy w liceum/technikum są liczby zespolone? Raczej nie. Jak już to na studiach.

Odp: [pascal] błąd w kodzie programu

: 19 lis 2010, 21:23
autor: warlock24
tristan pisze:Taki sam, jak w innych językach -- zrobienie dupiatego algorytmu z wieloma wyjściami.
Nie powiedziałbym że kod z wieloma wyjściami jest dupny.
Istnieją 2 rodzaje kodu: kod przyjazny programiście i kod przyjazny komputerow.

Tak samo są programiści piszący na szybko i tacy co zawsze chcą wszystko optymalizować aby zaoszczędzić choćby 1 cykl procesora czy 1 kb pamięci.

Odp: [pascal] błąd w kodzie programu

: 20 lis 2010, 01:30
autor: tristan
warlock24 pisze:Nie powiedziałbym że kod z wieloma wyjściami jest dupny.
Istnieją 2 rodzaje kodu: kod przyjazny programiście i kod przyjazny komputerow.

Tak samo są programiści piszący na szybko i tacy co zawsze chcą wszystko optymalizować aby zaoszczędzić choćby 1 cykl procesora czy 1 kb pamięci.
No ale co zaoszczędzisz takim kodem? Sądzisz, że będzie optymalny przez te wyjścia? Że optymalizator kompilatora sobie nie poradzi? Ja tam wolę jednak kod przyjazny programiście, zwłaszcza, że w tak prostym przypadku nie ma co optymalizować i cudować. Kod ma być czytelny i jasny.

Odp: [pascal] błąd w kodzie programu

: 20 lis 2010, 23:34
autor: Hauleth
mutopompka pisze:@szmitas: a czy w liceum/technikum są liczby zespolone? Raczej nie. Jak już to na studiach.
Zależy od klasy, czasami nauczyciel zrobi jako ciekawostkę. A z resztą to nie jest wielki problem je przerobić samemu. Tylko jedna zasada więcej, że i^2 = -1 i nie trzeba więcej.

Odp: [pascal] błąd w kodzie programu

: 22 lis 2010, 21:44
autor: Wojtol
Dzięki za odpowiedzi ;)
Już mam ten program napisany, wygląda on następująco:

Kod: Zaznacz cały

program deelta;
Uses
                Crt;
var
                x1,x2,d,a,b,c:Real;
Begin
                clrscr;
                writeln ('wprowad« a');
                readln (a);
                writeln ('wprowad« b');
                readln (b);
                writeln ('wprowad« c');
                readln (c);
                d:=(b*b)-4*a*c;
                writeln ('delta to ',d:0:2);
                readln;

                If (d<0) then
begin
                writeln ('brak rozwiĄzaä');
end

Else            If (d=0) then
Begin
                x1:=((-b)/(2*a));
                writeln ('Pierwiastek to ',x1:0:2)
end
Else            If (d>0) then
Begin           x1:=(-b-d)/(2*a);
                x2:=(-b+d)/(2*a);
                writeln ('pierwiastkami rownania sĄ x1 = ',x1:0:2 ,' oraz x2 = ',x2:0:2);
end;
                readln;
end.
.