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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2012, 21:42   #1
Nasty1
Новичок
Джуниор
 
Регистрация: 02.04.2012
Сообщений: 1
По умолчанию Delhhi. Графики ф-ий. Поиск нулей

Программа строит график функции, при значениях , например, xmin=-12 xmax=6 пропадают координаты. И еще нужно посчитать и вывести нули функции. Как это сделать? Надо использовать Batton2? Добавить процедуру? Спасибо. Пишу 1-й раз, если нарушила какие-то правила исправлю
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Image1: TImage;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation
Function Fu(x:real):real;
begin
Fu:=X*X-3*X+2;
end;
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
  var
    x1,x2: real;
    y1,y2: real;
    k,b: real;
    x,y: real;
    d1,d2: real;
  Begin
  x1:=StrToFloat(Edit1.Text);
  y1:=Fu(x1);
      repeat
    x2:=x1+1/10;
    y2:=Fu(x2);
        if y1*y2<0 Then
          Begin
            repeat
              y1:=Fu(x1);
              y2:=Fu(x2);
              k:=(y1-y2)/(x1-x2);
              b:=y1-k*x1;
              x:=-b/k;
              y:=k*x+b;
              d1:=sqr(x1-x)+sqr(y1-y);
              d2:=sqr(x2-x)+sqr(y2-y);
                  If d1>d2 Then
                    Begin
                      d1:=d2;
                      x1:=x;
                    End
                  Else x2 := x;
            until d1<1E-2;
  End;
  x1:=x2;
  y1:=y2;
      until x2>StrToFloat(Edit2.Text);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
        minY, maxY : real;
    x : real;
  mastabY, mastabX : real;
   i, j, m : integer;
    p : array of Tpoint;
  begin
    Image1.Picture:=nil;
    x:=StrToFloat(edit1.Text);
    minY:=Fu(x);
    maxY:=Fu(x);
    repeat
   if Fu(x)>maxY then
            maxY:=Fu(x);
    x:=x+1/100;
      until x>StrToFloat(Edit2.Text);
    x:=StrToFloat(edit1.Text);
    repeat
      if Fu(x)<minY then
        minY:=Fu(x);
        x:=x+1/100;
 until x>StrToFloat(Edit2.Text);
        mastabY:=(Image1.height-40)/(maxY-minY);
        mastabX:=(Image1.Width-40)/(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text));
        m:=20;
        x:=StrToFloat(edit1.Text);
      for i:=0 to Image1.Width-40 do
          begin
            SetLength(p,i+1);
            p[i].x:=i+20;
            p[i].y:=round(mastabY*(-Fu(x)+minY)+Image1.Width-20);
          // строим ось х
              if round(-Fu(x)*mastabY*(maxY-minY))=0 then
                begin
                  Image1.canvas.MoveTo(0,round(mastabY*(-Fu(x)+minY)+Image1.Width-20));
                  Image1.canvas.LineTo(Image1.height,round(mastabY*(-Fu(x)+minY)+Image1.Width-20));
 for j:=1 to  round(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))+1 do
                begin
                  Image1.Canvas.TextOut(round((j-1)*(mastabX))+20+2,round(mastabY*(-Fu(x)+minY)+Image1.Width-20)+2,IntToStr(StrToInt(Edit1.Text)+j-1));
                  Image1.Canvas.Pixels[(j-1)*round(mastabX)+20,round(mastabY*(-Fu(x)+minY)+Image1.Width-20)]:=clblack;
           end;
              end;
            //строим ось у
              if round(x*mastabX*2)=0 then
                begin
                  Image1.canvas.MoveTo(p[i].x,0);
                  Image1.canvas.LineTo(p[i].x,Image1.Width);
            // подписи по оси у
              for j:=1 to  round((maxY-minY))+1 do begin
    if m>=20 then
                  begin
                    If Image1.height-20-round((j)*(mastabY))+3<round(mastabY*(-Fu(x)+minY)+Image1.Width-20)-10 then
                      begin
                        Image1.Canvas.TextOut(p[i].x+3,Image1.height-20-round((j)*(mastabY))+3,floatToStr(round((minY+j)*100)/100));
                        m:=0;
                      End
  else begin
                       If Image1.height-20-round((j)*(mastabY))+3>round(mastabY*(-Fu(x)+minY)+Image1.Width-20)+20 then
                        begin
                          Image1.Canvas.TextOut(p[i].x+3,Image1.height-20-round((j)*(mastabY))+3,floatToStr(round((minY+j)*100)/100));
                          m:=0;
                        end;
          end
                  end
                      else begin
                          m:=m+(Image1.height-round((j)*(mastabY)))-(Image1.height-round((j+1)*(mastabY))) ;
    end;
                  end;
                  end;
                    x:=x+(StrToFloat(Edit2.Text)-StrToFloat(Edit1.Text))/(Image1.Width-40);
                        end;
                    Image1.Canvas.Polyline(p);
                        end;

procedure TForm1.Button3Click(Sender: TObject);
 begin
clouse;
end;
 end.

Последний раз редактировалось ACE Valery; 03.04.2012 в 01:41.
Nasty1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица n*n и поиск нулей. Avus Общие вопросы Delphi 2 20.12.2010 15:46
Pascal. Поиск линейно зависимых строк матрицы. Error 200: Division by zero, хотя нулей в матрице нет Paul-SFL Помощь студентам 8 27.11.2010 21:52
Найти максимальный элемент матрицы и вставить правее него столбец из нулей и ниже него строку из нулей. Romer9999 Паскаль, Turbo Pascal, PascalABC.NET 3 28.11.2008 11:28
Поиск нулей в файле.Хелп CESHNIK Общие вопросы C/C++ 1 22.02.2008 14:50
Избавиться от ведущих нулей. Progs Паскаль, Turbo Pascal, PascalABC.NET 4 24.10.2007 12:50