Здравствуйте! Вопрос такой, имеется решенная задача
"Написать процедуру DrawUserFunc (x1,x2,y1,y2:Real; Func: FuncToDraw), которая с помощью стандартной процедуры вывода Write выводит экран консоли размером MX=80 символов и MY=25 строк график функции Func на интервале [x1,x2] со значениями в диапазоне [y1,y2]. Для вычисления произвольной функции определить пользовательский тип FuncToDraw."
Код:
program laba3;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
const
MAX_X=80;
MAX_Y=25;
type
FuncToDraw = function (x:real):real;
Func=function (x:real):real;
Var
A,B: real;
N:integer;
per:array [1..100] of real; //f1=f2
k:integer;//количество совпадений
i:integer;
//функции
function func1(x:real):real;
begin
func1:=Tan(2*x)/x;
end;
function func2(x:real):real;
begin
func2:=Sqrt(abs(2*x*x-4*x-5));
end;
//функция интегрирования
Function Integral ( A,B:Real; N:integer; F:Func):real;
{ A,B - пределы интегрирования, N - количество интервалов, F - интегрируемая функция }
var
S,X,H:real;
Begin
H:= (B-A)/N;// Н - шаг интегрирования
S:=(F(A)+F(B))/2;
X:=A+H;
While x <= B do
Begin
S:= S + F(x);
x:=x+H;
End;
Result:=S*H;
End;
//процедура вывода графиков
procedure DrawUserFunc(x1,x2,y1,y2:real; Func1,func2: FuncToDraw);
var x,y:integer;
f1,f2,xcur :real;
begin
for y:=1 to MAX_Y do begin
for x:=1 to MAX_X do begin
//вычислить текущую координату
xcur:=x1+(x-1)*(x2-x1)/(MAX_X-1);
f1:= Func1(xcur); f2:= Func2(xcur); //вычислить значение функций в текущей позиции
//проверка
if (y = MAX_Y-round((MAX_Y-1)*(f1-y1)/(y2-y1))) and (y = MAX_Y-round((MAX_Y-1)*(f2-y1)/(y2-y1))) then begin
write ('*');
k:=k+1;
per[k]:=xcur;
end
else
if (y = MAX_Y-round((MAX_Y-1)*(f1-y1)/(y2-y1))) or (y = MAX_Y-round((MAX_Y-1)*(f2-y1)/(y2-y1))) then write ('*')
else
if x = 1 - round(x1 * (MAX_X-1) / (x2-x1)) then write ('|')
else
if y = MAX_Y + round(y1 * (MAX_Y-1)/(y2-y1)) then write ('-')
else write (' ');
end;
end;
end;
begin
Writeln('vvedite A,B,N');
Readln(A,B,N);
Writeln ('integral F1 = ', Integral(A,B,N, Func1):7:7);
Writeln ('integral F2 = ', Integral(A,B,N, Func2):7:7);
writeln;
writeln;
k:=0;
DrawUserFunc(-10,10,-10,30,func1,func2);
writeln;
if k=0 then writeln('tochek perese4eniya net')
else begin
writeln('f1=f2 esli x:');
for i:=1 to k do
writeln(per[i]:2:2);
end;
readln;
end.
не могу решить дополнительный вопрос к задаче :
1.Модифицировать процедуру DrawUserFunc так чтобы в первом столбце выводились значения по оси Oy, а в последней строке – значения по оси Ox.
Заранее благодарен!