Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2010, 22:25   #1
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию Нахождение экстремумов функции в delphi

Условие:найти экстремумы: максимумы обозначить красными эллипсами,а минимумы-синими.

Сделана задача,не могу отладить,а ошибку не показывает,только выделяет синим строчку "t[imax].y1:=g[i+1].Y;".

Используются:Button1
Image1
Button2

График строиться,так что прошу обратить внимание на процедуры lokT1 и lokT2,а они практически идентичны.

Код:
unit unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Tpoint_r=record
    x,y:real;
end;
Tpoint_i=record
   x1,y1:integer;
end;
   Tmas_TPoint_r=array of TPoint_r;
   Tfunc=function(z:real):real;
   Tmas_TPoint=array of Tpoint;
   Tmas_Tpoint_i=array of  Tpoint_i;
 var
  Form1: TForm1;
 a:Tmas_Tpoint_r;
 at:Tmas_tPoint;
 max: Tmas_Tpoint_i;
 min: Tmas_Tpoint_i ;
implementation
  {$R *.dfm}
  function     f1(x:real):real;
  begin
     f1:=sin(x)*x;
  end;
  procedure Tab(xn,xk:real; N:integer; f:Tfunc;
   Var z:Tmas_TPoint_r);
  var h:real;i:integer;
  begin
   h:=(xk-xn)/n;
   Setlength(z,n);
    For i:=0 to n-1 do
     begin
       z[i].x:= xn+ i*h;
       z[i].y := f(z[i].x);
     end;
  end;
 procedure   Grafic(z:Tmas_TPoint_r;Var g:Tmas_TPoint);
  Var hxk,hyk:real;hxn,hyn,i,n:integer;
  var max,min,mhx,mhy,xn,xk:real;
  begin
    n:=length(z);
    Setlength(g,n);
    xn:=z[0].x;
    xk:=z[n-1].x;
    max:=z[0].Y;  min:=z[0].Y;
   for i:=0 to n-1 do
  begin
  if z[i].y>max then
  max:=z[i].Y;
  if z[i].Y<min then
  min:=z[i].y ;
    end;

  hxn:=0; hyn:=0;
  hxk:=form1.Image1.Width;
  hyk:=form1.Image1.Height;

  mhx:=(hxk-hxn)/abs(xk-xn);
  mhy:=(hyk-hyn)/abs(max-min);

  for i := 0 to n - 1 do
   begin
    g[i].X:=round((z[i].x-xn)*mhx)+hxn;
   g[i].Y:=round((max-z[i].y)*mhy)+hyn;
  end;
     for i := 0 to n - 1 do
  form1.Image1.Canvas.Pixels [g[i].x, g[i].Y]:=clred;
  with form1.image1.Canvas do
  begin
    moveto(g[0].x,g[0].y);
    for i := 0 to n - 1 do
      lineto(g[i].X,g[i].y);
  end;
  end;
 procedure lokT1(g:Tmas_TPoint;t:Tmas_Tpoint_i);
 var i,n,k:integer;imax:Cardinal ;
begin
 n:=length(g);
    imax:=0;
    k:=0;
    for i := 0 to n - 1 do
      if (g[i+1].Y>g[i].Y) and (g[i+1].Y>g[i+2].Y) then begin
    t[imax].y1:=g[i+1].Y;
   t[imax].x1:=g[i+1].X;
     imax:=imax+1;
    k:=k+1;
      end;
      Setlength(t,k);
     for imax:=0 to k-1 do
     begin
form1.Image1.Canvas.brush.Color:=clred;
Form1.Image1.Canvas.Ellipse(t[imax].X1-12,t[imax].Y1+12,t[imax].X1+12,t[imax].Y1-12);
Form1.Image1.Canvas.MoveTo(t[imax].X1-12,t[imax].Y1-12);
Form1.Image1.Canvas.Lineto(t[imax].X1+12,t[imax].Y1+12);
Form1.Image1.Canvas.MoveTo(t[imax].X1+12,t[imax].Y1-12);
Form1.Image1.Canvas.Lineto(t[imax].X1-12,t[imax].Y1+12);
        end;
      end;
  procedure lokT2(g:Tmas_TPoint;o:Tmas_Tpoint_i);
 var i,n,k,imin:integer;
begin
 n:=length(g);
     imin:=0;
    k:=0;
     for i := 0 to n - 1 do
     if (g[i].Y>g[i+1].Y) and (g[i+1].Y<g[i+2].Y) then
  begin
    o[imin].y1:=g[i+1].Y;
   o[imin].x1:=g[i+1].X;
   imin:=imin+1;
    k:=k+1;
     end;
      Setlength(o,k);
      for Imin:=0 to  k-1 do
  begin
Form1.Image1.Canvas.brush.Color:=clblue;
Form1.Image1.Canvas.Ellipse(o[imin].X1-12,o[imin].Y1-12,o[imin].X1+12,o[imin].Y1+12);
Form1.Image1.Canvas.MoveTo(o[imin].X1-12,o[imin].Y1-12);
Form1.Image1.Canvas.Lineto(o[imin].X1+12,o[imin].Y1+12);
Form1.Image1.Canvas.MoveTo(o[imin].X1+12,o[imin].Y1-12);
Form1.Image1.Canvas.Lineto(o[imin].X1-12,o[imin].Y1+12);
  end;
    end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Tab(-9,9,200,f1,a);
Grafic(a,at) ;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  lokT1(at,max);
  lokT2(at,min);
end;

end.

Заранее спасибо!

Последний раз редактировалось Tatusya; 18.06.2010 в 12:53.
Tatusya вне форума Ответить с цитированием
Старый 18.06.2010, 09:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это какая-то лажа...
Тут нужно все полностью править... У тебя массивы max и min никак не наполняются.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2010, 12:33   #3
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию

А можете посмотреть эту,в ней рисует, только в начале графика.
что можно сделать с массивом max_gr и min_gr?

Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Tpoint_r = record
x,y:real;
end;
Tmas_Tpoint_r = array of Tpoint_r;
Tmas_Tpoint = array of Tpoint;
Tfunc = function (z:real):real;
var
Form1: TForm1;

a:Tmas_Tpoint_r;
b,c: Tmas_Tpoint_r;
an:Tmas_Tpoint;
bn,cn:Tmas_Tpoint;
min_gr,max_gr: array [1..1000] of integer;

implementation

{$R *.dfm}
function f1(x:real):real;
begin
Result:=x*sin(x);
end;

function f2(x:real):real;
begin
Result:=x*sin(x);
end;

procedure Tab(xn,xh:real; N:integer; t:Tfunc;
Var max,min:real; Var g:Tmas_Tpoint_r);
Var h,x: real; i,imax:integer;
begin
h:=(xh-xn)/n;
Setlength(g,n);
max:=g[0].y;
For i:=0 to n-1 do
begin
g[i].x:= xn + i*h;
g[i].y := t(g[i].x);
if g[i].y>max then max:=g[imax].y;
end;
end;

procedure grafik(g,k:Tmas_Tpoint_r; Var z,s: Tmas_Tpoint);
Var xn,xh,kyh,kxh, max1,min1,max2,min2,max,min,mhx,mhy: real;
kxn,kyn,i,n,imax,imin:integer;
begin
kxn:=0; kyn:=0;
n:=length(g);
xn:=g[0].x;
xh:=g[n-1].x;
kxh:=form1.Image1.width ;
kyh:=form1.Image1.Height;

max1:=g[0].y; min1:=g[0].y;
max2:=k[0].y; min2:=k[0].y;
For i:=0 to n-1 do
begin
if g[i].y > max1 then
max1:= g[i].y;
if g[i].y < min1 then
min1:= g[i].y;
if k[i].y > max2 then
max2:=k[i].y;
if k[i].y < min2 then
min2:= k[i].y;
end;
imax:=0;
if max1 >max2 then
begin
max:=max1;
imax:=imax+1;
end
else
 begin
max:=max2 ;
imax:=imax+1;
end;
if min1<min2 then
min:=min1
else
min:=min2;
mhx:=(kxh - kxn)/abs(xh-xn);
mhy:= (kyh - kyn)/ abs(max-min);
Setlength(z,n); Setlength(s,n);

For i:=0 to n-1 do
begin
Form1.Image1.Canvas.pen.Color:=clblue;

z[i].x := round((g[i].X - xn)* mhx) + kxn;
z[i].y := round ((max - g[i].y)* mhy) + kyn;
s[i].x := round((k[i].X - xn)* mhx) + kxn;
s[i].y := round ((max - k[i].y)* mhy) + kyn;
end;
Form1.Image1.Canvas.Polyline(z);
Form1.Image1.Canvas.Polyline(s);

for imax:=1 to Length(max_gr) do begin
Form1.Image1.Canvas.brush.Color:=clred;
//Form1.Image1.Canvas.pen.Color:= clblue;
Form1.Image1.Canvas.Ellipse(z[max_gr[imax]].X-12,z[max_gr[imax]].Y-12, z[max_gr[imax]].X+12,z[max_gr[imax]].Y+12);
Form1.Image1.Canvas.MoveTo(z[max_gr[imax]].X-12,z[max_gr[imax]].Y-12);
Form1.Image1.Canvas.Lineto(z[max_gr[imax]].X+12,z[max_gr[imax]].Y+12);
Form1.Image1.Canvas.MoveTo(z[max_gr[imax]].X+12,z[max_gr[imax]].Y-12);
Form1.Image1.Canvas.Lineto(z[max_gr[imax]].X-12,z[max_gr[imax]].Y+12);
end;
 for imin:=1 to Length(min_gr) do begin
Form1.Image1.Canvas.brush.Color:=clblue;
//Form1.Image1.Canvas.pen.Color:= clblue;
Form1.Image1.Canvas.Ellipse(z[min_gr[imin]].X-12,z[min_gr[imin]].Y-12, z[min_gr[imin]].X+12,z[min_gr[imin]].Y+12);
Form1.Image1.Canvas.MoveTo(z[min_gr[imin]].X-12,z[min_gr[imin]].Y-12);
Form1.Image1.Canvas.Lineto(z[min_gr[imin]].X+12,z[min_gr[imin]].Y+12);
Form1.Image1.Canvas.MoveTo(z[min_gr[imin]].X+12,z[min_gr[imin]].Y-12);
Form1.Image1.Canvas.Lineto(z[min_gr[imin]].X-12,z[min_gr[imin]].Y+12);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var max,min :real;
begin

Tab(-5*pi/2,5*pi/2, 50,f1,max,min,a);
Tab (-5*pi/2,5*pi/2,50,f2,max,min,b);
grafik(a,b,an,bn);

end;

end.

Последний раз редактировалось Tatusya; 18.06.2010 в 12:55.
Tatusya вне форума Ответить с цитированием
Старый 18.06.2010, 13:37   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не обижайся смотреть не стану.
Причина проста: Вместо изобретания велосипеда (уж коли на Делфи пишем) можно было воспользоваться уже готовым компонентом для построения графиков - TChart. Другое дело если это бзикнутый каприз преподавателя, но в таком случае ты лучше подробно опиши задание, вместо совершенно непонятного (и я уверен усложненного многократно) кода
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2010, 17:55   #5
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию

да дело в преподавателе.
Задача: построить график,вывести его в Image,на графике эллипсами отметить экстремумы,минимумы-синими,максимумы-красными.
Tatusya вне форума Ответить с цитированием
Старый 18.06.2010, 17:55   #6
Tatusya
Пользователь
 
Аватар для Tatusya
 
Регистрация: 17.06.2010
Сообщений: 11
По умолчанию

да дело в преподавателе.
Задача: построить график,вывести его в Image,на графике эллипсами отметить экстремумы,минимумы-синими,максимумы-красными.
Tatusya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение экстремума функции от двух переменных dekameron Помощь студентам 3 26.05.2010 08:16
Поиск экстремумов функций DJEDY Общие вопросы C/C++ 2 07.04.2009 14:21
Нахождение функции F(a) Forro Помощь студентам 2 25.05.2008 12:24