Problem z równaniem kwadratowym


(alabama1) #1

Witam was wszystkich. Jestem tu nowy i myślę, że otrzymam od was pomoc. W ramach krótkiego wprowadzenia powiem, że jestem w maturalnej klasie, zdaję informatykę na poziomie podstawowym. Kłopot w tym, że w drugiej klasie miałem nauczyciela, na lekcjach którego można było robić wszystko. I przez to mało kumam z programowania. Uczę się samodzielnie i jakoś mi wchodzi to do głowy. I teraz przechodzimy do problemu: chcę zrobić program w free pascalu, który otrzymuje współczynniki równania kwadratowego, z nich oblicza deltę i podaje rozwiązania. Chcę też, że gdy jako a wprowadzę 0, program wyświetlił treść, że to nie jest równanie kwadratowe. I tu jest problem, bo w jednym przypadku program działa dla a nierównego 0, nie działa dla a równego 0, a w drugim jest na odwrót.Pokażę swój kod:

program rownaniekwadratowe;

uses crt;

var

a,b,c,delta:integer;

x,x1,x2:real;

begin

clrscr;

…(tu ma miejsce wprowadzanie współczynników);

delta:=(sqr(b) - (4*a*c));

x:=(-b)/(2*a);

x1:=(-b-(sqrt(delta))/(2*a));

x2:=(-b+(sqrt(delta))/(2*a));

if (a<>0) and (delta<0) then

writeln(‘Brak miejsc zerowych’);

if (a<>0) and (delta=0) then

writeln('Jedno rozwiązanie= ',x:4:2);

if (a<>0) and (delta>0) then

writeln('Dwa miejsca zerowe: ',x1:4:2, ’ ', x2:4:2);

if a=0 then

writeln(‘To nie jest równanie kwadratowe’);

readln;

end.

W tych dwóch przypadkach, kiedy program nie działa, wyskakują dwa błędy- już nie pamiętam, który kiedy, ale 200 i 207.

Bardzo byłbym wdzięczny za jakieś rady, wskazówki. Naprawdę nie wiem, co tu jest błędnego.


([alex]) #2

po pierwsze a,b,c mają być typu real a nie integer

po drugie może sprawdzisz czy a=0 zanim wykonasz dzielenie przez zero tu: x:=(-b)/(2*a);


(Johny) #3

Problem jest taki,że ty liczysz pierwiastki nawet wtedy gdy delta wynosi zero,albo jest ujemna - brak rozwiązania

przy Delcie równej zero x1=x2 jest jeden pierwiastek i wynosi -b/2*a

Delta ujemna brak rozwiązania

musisz to na if,y rozbić i w zależności od delty wypisywać


(alabama1) #4

alex- więc przesunąłem linijkę, gdzie sprawdzam a, czy nierówne 0, na początek ifów i zmieniłem a,b,c na real. Teraz, gdy współczynnikami będą dwójki,a więc delta ujemna, pojawia się błąd 207. Gdy a dam 0, błąd 200. Jak tutaj wkleić kod po zmianach? Z Pascala nie da się skopiować, a nie chcę znów przepisywać wszystkiego.


(Rolek0) #5
  1. Używaj wcięć, bo twój kod wygląda obecnie okropnie.

  2. Do wstawiania kodu na forum uzywaj znacznika [code] (bez spacji).

  3. http://gynvael.coldwind.pl/?id=238 (pierwszy rozdział możesz pominąć).

  4. To co koledzy wyżej napisali, wykonujesz obliczenia przed sprawdzeniem warunków i stąd masz błędy.

Przykładowy kod:

var

        a, b, c, d, x1, x2 : real;

begin

        write('Podaj A: ');

        readln(a);

        if a=0 then

                writeln('To nie jest rownanie kwadratowe.')

        else begin

                write('Podaj B: ');

                readln(b);

                write('Podaj C: ');

                readln(c);

                d := b*b - 4*a*c;

                if d<0 then

                        writeln('Brak miejsc zerowych.')

                else if d>0 then begin

                        x1 := (-b-sqrt(d))/(2*a);

                        x2 := (-b+sqrt(d))/(2*a);

                        writeln('Dwa miejsca zerowe: ', x1:4:2, ' oraz ', x2:4:2)

                end else begin

                        x1 := -b/(2*a);

                        writeln('Jedno miejsce zerowe: ', x1:4:2);

                end;

        end;

end.

(alabama1) #6

O, dzięki Rolek0. Widzę, że trzeba było to tylko inaczej zapisać. Trzeba było mieć inny pomysł.

Dzięki za link, na pewno z niego skorzystam. W obecnej klasie mam już dobrego nauczyciela, tylko nie zawsze rozumiem, co mówi, a on się łapie za głowę, że tak wielu rzeczy nie było. Teraz próbujemy jakoś to nadrobić, tylko gdy tego nadrabiania jest dużo, nie takie łatwe jest masowe wykładanie wiedzy programistycznej. Na ferie dostałem zestaw ćwiczeń z programowania i właśnie ćwiczę. Jeszcze raz dzięki za pomoc.

A jeśli chodzi o wcięcia, to nie wiem, kiedy je używać.