Odwołanie jednej funkcji do drugiej - problem.

0

Witam,

chciałem Was zapytać czy w języku Pascal można napisać program, w którym jedna funkcja odwołuje się do drugiej? Mam na myśli taką sytuację, gdy w ciele programu głównego jest odwołuje się do funkcji f1, następnie we funkcji f1 występuje odwołanie do funkcji f2 i wynik jest zwracany do funkcji f1, a następnie końcowy wynik zwracany jest do programu głównego? Czy da się to zrobić? W C++ udało mi się to stworzyć, ale konieczne było zastosowanie wskaźników...

Napisałem na próbę prosty kod, który chciałbym aby zachował się tak, jak to powyżej opisałem ale podczas kompilacji wyskakuj błąd: /Identifier not found "funkcja"/

program test;

uses math;

function dodaj (a, b : single) : single;
begin
     dodaj = a + funkcja(b);
end;

function funkcja (x : single) : single;
begin
     funkcja = x*x;
end;

var
s, t, wynik : single;
begin

writeln('Podaj s: ');
readln(s);
writeln('Podaj t: ');
readln(t);
writeln('Wynik = ', dodaj(s,t) );

end. 

Jeśli ma ktoś jakieś pomysły to proszę o odpowiedź, pozdrawiam ;-)

0

Zmień kolejność funkcji. Te które odwołują się do czegoś muszą być za tymi do których się odwołują (no chyba że zastosujemy keyword forward).
Następnym razem pytaj w dziale newbie.

0
function funkcja (x : single) : single;
begin
     funkcja = x*x;
end;

function dodaj (a, b : single) : single;
begin
     dodaj = a + funkcja(b);
end;
0

Odnośnie keywordu forward, ogólny przykład użycia:

Procedure Foo; forward;

Procedure Bar;
Begin
 Foo;
End;

Procedure Foo;
Begin
 Bar;
End;
0

Działa! Dziękuje Wam bardzo za szybka odpowiedź! ;-)

0

Mam jeszcze jedno pytanie:

Moim zadaniem jest napisać program, który wyznacza miejsce zerowe zdeklarowanej funkcji z wykorzystaniem metody siecznych.
Przykładowy algorytm znajduje sie tutaj:
http://edu.i-lo.tarnow.pl/inf/alg/005_root/0012.php

Mój kod wygląda następująco:

program piotr;

uses math;

const
  eps0 = 0.00001;  // dokladnosc porownania z zerem.


function funkcja ( x : single ) : single;  // deklaracja funkcji
begin
     funkcja := 2*x*x + 4*x +5;
end;


function licz(x1, x2, eps : single) : single;

var
x0, f0, f1, f2 : single;
i              : integer;
begin


  f1 := funkcja(x1);
  f2 := funkcja(x2);
  i := 0;

  while  ( (i < 100) and (  abs(x1 - x2) > eps)  ) do
  begin

     if ( abs(f1-f2) < eps0 ) then
        begin
           writeln('Zle punkty startowe!');
           Break;
        end;

              x0 :=  x1 - f1 * (x1 - x2) / (f1 - f2);
              f0 := funkcja (x0);

              if ( abs(f0) < eps0 ) then
                 begin
                    writeln('udalo sie');
                    licz := x0;
                    Break;
                 end;


              x2 := x1;
              x1 := x0;
              f2 := f1;
              f1 := f0;

              i := i+1;

  end;

  if (i = 100) then
     begin
     writeln('Brak miejsc zerowych');
  end;


end;


var
a, b, d : single;

begin


writeln('Podaj poczatek przedzialu: ');
readln(a);
writeln('Podaj koniec przedzialu: ');
readln(b);
writeln('Podaj dokladnosc rozwiazania: ');
readln(d);

writeln('miejsce zerowe funkcji wynosi: ', licz(a,b,d) );

readln;

end. 

I niby wszystko jest O.K. ale jest jeden problem - jeśli jako funkcję podam taką, która nie ma miejsc zerowych ( a taka jest powyżej zadeklarowana), to program oprócz wyświetlenia: 'miejsce zerowe funkcji wynosi: Brak miejsc zerowych' wyświetli także jakieś x0 = 4.48E-44. Jak sie tego pozbyć?

Myślałem o tym, żeby w pętli

 if ( i = 100)

dodać polecenie Break;
Wówczas trzeba to przerzucić do pętli while - ale to nic nie pomaga - nadal wyświetla się to x0...

0

Funkcja licz musi zwrócić dwie wartości:

  • jedną lub obie przez var
  • zwrócić rekord

Funkcja licz ma tylko liczyć i nie mazać po ekranie. Funkcja która ją wywołuje analizuje co funkcja zwróciła i w zależności od tego coś wyświetla lub nie.

function licz(x1, x2, eps :Double;var x:Double):Integer;
begin
...
           //writeln('Zle punkty startowe!');
           licz:=1; // lepiej użyć enum
           Exit;
...
     //writeln('Brak miejsc zerowych');
     licz:=2; // lepiej użyć enum
     Exit;
...
  licz:=0; // lepiej użyć enum
end;

...
case licz(a,b,d,x) of
  0: writeln('miejsce zerowe funkcji wynosi: ', x);
  1: writeln('Zle punkty startowe!');
  2: writeln('Brak miejsc zerowych');
end;

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