[PASCAL] miejsce zerowe funkcji kwadratowej


(Marcin Naciuk) #1

Witam,

dostałem takie zadanko do zrobienia:

"Proszę napisać program liczący miejsca zerowe funkcji kwadratowej i jej deltę. Program ma zawierać funkcje (nie procedurę) pobierąjacą argumenty A,B,C ( ze wzoru Ax^2 + BX + C = 0; czyli np. 3x^2 + 5x + 6 (argumenty to 3,5,6) i zwracającą deltę."

Żeby lepiej zrozumieć temat najpierw napisałem ten program bez zabawy w funkcje:

program cw7;

uses crt;

var

a,b,c:real;

delta:real;

x1,x2:real;

begin

writeln ('Program liczacy miejsce zerowe funkcji kwadratowej i jej delte');

{delay(5000);}

writeln;

writeln ('Ze wzoru: Ax^2 + BX + C = 0');

writeln('Podaj wspolczynnik a: ');

read(a);

writeln('Podaj wspolczynnik b: ');

read(b);

writeln('Podaj wspolczynnik c: ');

read©;

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

if delta < 0 then

writeln('co ty mi tu pociskasz?');

if delta = 0 then

begin

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

writeln('Delta rowna zero. Pierwiastek ',x1);

end

else

begin

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

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

writeln('delta rowna ', delta);

writeln('pierwistki:');

writeln('x1=', x1);

writeln('x2=', x2);

end;

readln;

end.

Ale kompletnie nie wiem jak mam to zrobić z użyciem funkcji. Proszę o sugestie jak napisać taki program z użyciem funkcji i wyjaśnienie, bo nie do końca wiem jak ma to wyglądać...


(klemensior15) #2

Umieść następnym razem kod w code.

Dla delty > 0 zrób osobno if'a ,a nie przez else ew. else if ,bo pomyli mu się z delta < 0 ,bo spełnia także ten warunek.

function deltaw0 (b1:real;a1:real;delta1:real):real;

Begin

     x1:= (-b1+ sqrt(delta1))/(2*a1);

     x2:= (-b1 -sqrt(delta1))/(2*a1);

end;

w programie np. wynik := deltaw0 (b,a,delta);

wynik także w realu.

Reszta analogicznie.


([alex]) #3
function LiczDelta(a,b,c:real):real;

begin

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

end;

wywołanie:

delta:=LiczDelta(a,b,c);

Tak a propos jeżeli delta wychodzi ujemna to nadal to jest normalna funkcja kwadratowa z tym że nie ma miejsc zerowych.

Zaś komunikat: "Co ty mi tu pociskasz?" może był by na miejscu przy A=0 (ba nie sprawdzasz tego więc program jest narażony na dzielenie przez zero) wtedy to nie jest równanie kwadratowe , zaś liniowe które też może mieć miejsce zerowe (no chyba że B=0 wtedy wychodzi że x=C, a wtedy jeżeli C=0 to każde x jest miejscem zerowym, jeżeli nie to brak miejsc zerowych).


(Radek) #4
program Project1;


{$APPTYPE CONSOLE}


uses

  SysUtils;


function fDelta(a, b, c: real): real;

begin

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

end;


var

  a, b, c: real;

  rDelta: real;

  x1, x2, p: real;

begin

  Write('Podaj wspolczynnik a: ');

  Readln(a);


  if a = 0.0 then

  begin

    WriteLn('To nie jest rownanie kwadratowe');

    Readln;

    Exit;

  end;


  Write('Podaj wspolczynnik b: ');

  Readln(b);


  Write('Podaj wspolczynnik c: ');

  Readln(c);


  WriteLn;


  rDelta := fDelta(a, b, c);


  Writeln('Delta wynosi: ' + FloatToStr(rDelta));


  if rDelta > 0 then

  begin

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

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


    Write('delta > 0, x1 = ' + FormatFloat('###.##', x1) + ', x2 = ' + FormatFloat('###.##', x2));

  end else if rDelta = 0 then begin

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


    Write('delta = 0, p = ' + FormatFloat('###.##', p));

  end else begin

    Writeln('delta < 0');

    Write('funkcja kwadratowa nie ma miejsc zerowych w dziedzinie liczb rzeczywistych');

  end;


  Readln;

end.