помогите найти ошибку! графики

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

помогите найти ошибку! графики

Сообщение itwork » 27.01.2007 22:36:18

Код: Выделить всё
Uses
        Graph, Crt;
Const
        f_root = 30;
        step = 0.05;
Var
        tmp,x: Real;
        first_step: boolean;
        value: Integer;
        driver,mode: Integer;

Function Root(indx,expon: Extended): Extended;
Begin
        If (expon = 0) Or (indx = 0)  Then Root:=0
        Else
             If (round(indx) mod 2 =0) Then
                 If (expon < 0) Then Root:=0
                 Else Root:= exp(Ln(expon)/indx)
             Else
                 If (round(indx) mod 2 =1) Then
                     If (expon < 0) Then Root:= -exp(Ln(-expon)/indx)
                     Else Root:= exp(Ln(expon)/indx)
        Else Root:= exp(Ln(expon)/indx);
End;
Begin
    DetectGraph(Driver, Mode);
    Mode := m800x600;
    InitGraph(Driver, Mode, '');
    first_step:= true;
    tmp:= 10;
    x:= -tmp;
    While (x <= tmp) do
    begin
        If (Round(x / step) = 0) then first_step:= true
        else
        begin
            Value:= Trunc(root(2,x) * f_root);
       If first_step then
            begin
                first_step:= false;
                MoveTo((300 + Trunc(x * f_root)), (300 - Value));
            end
            else LineTo((300 + Trunc(x * f_root)), (300 - Value));
        end;
        x:= x + step;
        delay(10);
    end;
    Readkey;
    CloseGraph;
End.


помогите с найти ошибку! Ошибка в том тош-то он рисует впереди квадратного корня простую линию .
!!!!!!!!! Tmp dolzno ostatsa 10
Последний раз редактировалось itwork 28.01.2007 13:24:28, всего редактировалось 1 раз.
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение SAK » 27.01.2007 23:55:01

Трудно найти ошибку, когда не знаешь что же надо получить в итоге.
Непонятно зачем используется строка:
Код: Выделить всё
        If (Round(x / step) = 0) then first_step:= true
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Сообщение itwork » 28.01.2007 13:07:16

SAK писал(а):Трудно найти ошибку, когда не знаешь что же надо получить в итоге.
Непонятно зачем используется строка:
Код: Выделить всё
        If (Round(x / step) = 0) then first_step:= true


"SAK" НЕт это должно остаться, иначе если вместо root(2,x) ставим другую формулу типо 1/X видает ошибку! Ж)
короче, вот в чем дело- я подставляю вместо ROOT(2,X) любую другую формулу (например, 1/X, X^2, COS(x), ROOT(3,X)) и всё работает, А ВОТ ТОКО ROOT(2, X)СКАДАЛИТ, ВООЩЕ В САМОМ НАЧАЛЕ ВЫДАВАЛ ОШЫБКУ - ТИПО У ВАС Х ПОЛУЧИЛСЯ ОТРИЦАТЕЛЬНЫЙ, ну я и указал чтоб при x<0 root:=0 ну теперь конечно же рисует впереди линию, а потом свой Квадратный корень! :( ЛЮди так что можно сделать чтоб все работало т.е нересавал впереди эту линию?
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение SAK » 28.01.2007 14:33:40

Написать универсальную функцию рисования графиков (на самом деле это совсем не сложно). Функция по которой рисуется график передаётся как параметр. В функции рисования при вызове вычисляемой функции проверяется наличие исключения и если таковое произошло, то ничего не рисуется. Но такое легко сделать на FreePascal, в Turbo Pascal нет try except и обработать исключительную ситуацию гораздо сложнее. Какой компилятор используется?
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Сообщение itwork » 28.01.2007 16:02:13

SAK писал(а):Написать универсальную функцию рисования графиков (на самом деле это совсем не сложно). Функция по которой рисуется график передаётся как параметр. В функции рисования при вызове вычисляемой функции проверяется наличие исключения и если таковое произошло, то ничего не рисуется. Но такое легко сделать на FreePascal, в Turbo Pascal нет try except и обработать исключительную ситуацию гораздо сложнее. Какой компилятор используется?

используется freepascal.
А можно чуть подробней
itwork
новенький
 
Сообщения: 41
Зарегистрирован: 28.12.2006 14:32:28

Сообщение SAK » 28.01.2007 16:37:20

Вот, например:
Код: Выделить всё
{$mode DELPHI}
uses graph;

type func = function(x: real): real;

var gd, gm: smallint;
    i1, j1, i2, j2: integer; {экранные координаты графика}
    x1, y1, x2, y2: real; {мировые координаты}
    ax, bx, ay, by: real; {коэффициенты для линейной интерполяции}

function root(x: real): real;
begin
   result:=sqrt(x)
end;

function sinus(x: real): real;
begin
   result:=sin(x)
end;

function xfi(i: integer): real;
begin
   result:=ax*i+bx
end;

function ifx(x: real): integer;
begin
   result:=round((x-bx)/ax)
end;

function jfy(y: real): integer;
begin
   result:=round((y-by)/ay)
end;

procedure DrawGraph(f: func);
var i, j: integer;
     defined: boolean;
begin
   defined:=false;
   for i:=i1 to i2 do
    begin
      try
        j:=jfy(f(xfi(i)));
      except
        defined:=false;
        continue
      end;
      if defined then LineTo(i, j) else MoveTo(i, j);
      defined:=true
    end;
end;

begin
  gd:=0;
  initgraph(gd, gm, '');

  x1:=-1; x2:=10; y1:=10; y2:=-10;
  i1:=0; j1:=0; i2:=GetMaxX; j2:=GetMaxY;

  ax:=(x2-x1)/(i2-i1);  bx:=x1-ax*i1;
  ay:=(y2-y1)/(j2-j1);  by:=y1-ay*j1;

  SetColor(Green); {рисуем оси координат}
  Line(i1, jfy(0), i2, jfy(0));
  Line(ifx(0), j1, ifx(0), j2);

  SetColor(Yellow);
  DrawGraph(@root);
  DrawGraph(@sinus);

  readln;
  closegraph
end.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru