Показать сообщение отдельно
  #1  
Старый 06.06.2010, 22:10
zk91 zk91 вне форума
Прохожий
 
Регистрация: 06.06.2010
Сообщения: 2
Репутация: 10
По умолчанию Вопрос по задаче с графиком функции

Здравствуйте! Вопрос такой, имеется решенная задача
"Написать процедуру 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.
Заранее благодарен!
Ответить с цитированием