[Turbo Pascal] Program obliczający pierwiastki równania kwadratowego.

0

Witam, napisałem następujący program Napisz program, który oblicza pierwiastkirównania kwadratowego, tak aby były one liczone w funkcji, która zwracała by ich wartość przez parametry. Jako wynik swojego działania funkcja powinna zwracać kod błędu. Uwaga, funkcja nie może bezpośrednio odwoływać się do zmiennych globalnych.

program funkcjakwadratowa;

uses crt;

var
a,b,c,x0,x1,x2,delta,pierw:real;
kod:integer;
nap:string;
odp:char;

label poczatek;

function pierw1(b,delta,a:real):real;

var
wynik:real;

begin
wynik:=-b+sqrt(delta)/2*a;
pierw1:=wynik;
end;

function pierw2(b,delta,a:real):real;

var
wynik:real;

begin
wynik:=-b-sqrt(delta)/2*a;
pierw2:=wynik;
end;

function pierw0(b,delta,a:real):real;

var
wynik:real;

begin
wynik:=-b/2*a;
pierw0:=wynik;
end;

begin
poczatek:
clrscr;

writeln('Program liczacy pierwiastki funkcji kwadratowej');
writeln;
writeln('Podaj wspolczynnik przy najwyzszej potedze');
repeat
readln(nap);
val(nap,a,kod);
if kod<>0 then writeln('Podaj liczbe!');
until kod=0;
writeln('Podaj wspolczynnik przy x');
repeat
readln(nap);
val(nap,b,kod);
if kod<>0 then writeln('Podaj liczbe!');
until kod=0;
writeln('Podaj wyraz wolny');
repeat
readln(nap);
val(nap,c,kod);
if kod<>0 then writeln('Podaj liczbe!');
until kod=0;

if a=0 then
begin
writeln('To nie jest funkcja kwadratowa, program zakonczy swoje dzialanie za 5 sekund');
delay(5000);
end

else

begin
writeln;
delta:=sqr(b)-4ac;
writeln('Delta wynosi ',delta2);
writeln;

if delta<0 then writeln('Funkcja nie posiada rozwiazan');
if delta = 0 then
begin
writeln('Funkcja posiada jeden pierwiatek rowny ',pierw0(b,delta,a)2);
end;
if delta>0 then
begin
writeln('Pierwszy pierwiastek jest rowny ',pierw1(b,delta,a)2);
writeln;
writeln('Drugi pierwiastek jest rowny ',pierw2(b,delta,a)2);
end;
end;
writeln;
writeln('Czy chcesz policzyc pierwiastki dla innych wartosci? T-TAK N-Nie');
odp:=readkey;
if ((odp='T') or (odp='t')) then goto poczatek;
if ((odp='N') or (odp='n')) then
begin
writeln;
writeln('Wybrales nie. Program zakonczy swoje dzialanie za 5 sekund');
delay(5000);
halt;
end;
end.

Program ogólnie działa ok, ale nie jestem pewien czy w dobry sposób użyłem funkcji i czy nie dało by się tego zapisać w jednej funkcji zamiast trzech. Tak samo z procedurą val, nie wiem czy nie dałoby się jej zapisać za pomocą jednej funkcji. Niezbyt też dobrze rozumiem o co chodzi z tym zwracaniem kodu błędu. Jeżeli ktoś byłby w stanie udzielić mi odpowiedzi na moje pytania, byłbym wdzięczny za pomoc.

0

Kod niesformatowany i nie wklejony w znaczniki delphi, ale
na oko chyba w porządku. Jak nie wiesz jak używac Val, bo
jest to procedura nie funkcja - to poczytaj jej opis dostępny
tutaj: Val a jak chcesz do
jednej funkcji wprowadzić liczenie pierwiastka, to sprawdzaj
w kodzie funkcji ile wynosi delta - o ile to Tobie odpowiada.

0

Dziękuję za odpowiedź. Raczej wiem jak używać procedury Val i do czego służy, chodziło mi bardziej o to czy nie dałoby się jej zapisać wcześniej jako procedury przed, głównym blokiem programu a potem w odpowiednim momencie ją wywoływać. Chodzi mi dokładnie o to żeby nie trzeba było tak jak tutaj dla trzech zmiennych pisać trzy razy prawie tego samego:

repeat
readln(nap);
val(nap,a,kod);
if kod<>0 then writeln('Podaj liczbe!');
until kod=0;

i tak samo dla a i b, tylko wywołać wcześniej zadeklarowaną procedurę. Nie wiem czy dobrze wyjaśniłem o co mi chodzi.

Jeszcze wracając do tego zwracania kodu błędu, czy ktoś wie o co dokładnie chodzi?

0

No piszesz że wiesz jak działa procedura Val, a pytasz pod koniec o kod błędu?
Tak to trzeba zrobić, w zmiennej będącym trzecim parametrem, dla procedury
Val - zwracana jest pozycja nieprawidlowego znaku, jeżeli Kod jest równy zero
to znaczy że wszystko jest ok. A co do tego jak zrobić aby nie trzeba było trzy
razy powatarzać pytania o liczby to jedyne rozwiązanie, jakie widzę w Pascalu,
to zapamiętywać liczby do trzy elementowej tablicy, a za każdym pytaniem po
prostu zwiększać jej indeks. Później zamiast na zmiennych a, b, c, operwać na
przykład na: Tablica[1], Tablica[2], Tablica[3]. Innych pomysłów ja nie mam.

0

Czy wzory na obliczanie pierwiastków (np wynik:=-b+sqrt(delta)/2*a;) są aby na pewno dobre?

0
olek1 napisał(a)

Witam, napisałem następujący program Napisz program, który oblicza pierwiastkirównania kwadratowego, tak aby były one liczone w funkcji, która zwracała by ich wartość przez parametry. Jako wynik swojego działania funkcja powinna zwracać kod błędu. Uwaga, funkcja nie może bezpośrednio odwoływać się do zmiennych globalnych.

Gdyby dokładnie trzymać się treści zadania, to ja to widzę tak:

function Kwadratowa(a, b, c: Real; var x1, x2: Real): Integer;
var Delta: Real;
begin
  { Sprawdzasz, czy a jest różne od 0 }
  if a = 0 then
  begin
    Kwadratowa:= -1;
    Exit;
  end;
  { Obliczasz Deltę }
  if Delta < 0 then
  begin
    Kwadratowa:= 0;
  end
  else if Delta = 0 then
  begin
    { Obliczasz x1 }
    Kwadratowa:= 1;
  end
  else
  begin
    { Obliczasz x1 i x2 }
    Kwadratowa:= 2;
  end;
end;

Wynikiem funkcji jest liczba pierwiastków równania kwadratowego (0, 1, 2), albo liczba -1 jeśli współczynnik a = 0. Można by więc powiedzieć, że to kod błędu, bo z kolei pierwiastki równania są zwracane przez zmienne x1 i x2. Zwróć uwagę na słowo var, które się przed nimi znajduje (mam nadzieję, że wiesz dlaczego się tam znalazło).

Wywołanie funkcji w programie głównym jest już dziecinnie proste

case Kwadratowa(a, b, c, x1, x2) of
  -1:
  0:
  1:
  2:
end;
olek1 napisał(a)

Program ogólnie działa ok.

Ano nie działa OK i **pelsta **już Ci napisał dlaczego
I na koniec jeszcze jedna uwaga: zamień goto poczatek na pętle repeat ... until

0
pelsta napisał(a)

Czy wzory na obliczanie pierwiastków (np wynik:=-b+sqrt(delta)/2*a;) są aby na pewno dobre?

Wzór jest dobry, ale faktycznie, źle liczyło. Wstawiłem nawiasy i jest ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1