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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2009, 18:20   #1
TripleX
Пользователь
 
Регистрация: 30.03.2009
Сообщений: 16
Печаль Диалог с пользователем

В общем, есть код программы(рисует график функции):
Код:
unit Graf;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation

{$R *.dfm}
 Function f(x:real):real;
begin
f:=2*Sin(x)*exp(x/5);
end;
// строит график функции
procedure GrOfFunc;
var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
x:real; // аргумент функции
y:real; // значение функции в точке х
dx:real; // приращение аргумента


l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y 
x0,y0:integer; // точка - начало координат
begin                                           // область вывода графика
l:=10;                                          // X - координата левого верхнего угла
b:=Form1.ClientHeight-20;               //У - координата левого верхнего угла
h:=Form1.ClientHeight-40; // высота
w:=Form1.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
x2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента

// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]

y1:=f(x1); // минимум
y2:=f(x1); //максимум
x:=x1;
repeat
y := f (x);
if y < y1 then y1:=y;
if y > y2 then y2:=y;
x:=x+dx; until (x >= x2);
// вычислим масштаб
my:=h/abs(y2-y1); // масштаб по оси Y
mx:=w/abs(x2-x1); // масштаб по оси X
x0:=1;
y0:=b-Abs(Round(y1*my)) ;
with form1.Canvas do
begin              // оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// построение графика
x:=x1; repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x >= x2);
end;
end;


procedure TForm1.FormPaint(Sender: TObject); 
begin
GrOfFunc; end;
// изменился размер окна программы

procedure TForm1.FormResize(Sender: TObject); 
begin
// очистить форму
form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
end.
Но в ней, график строится по заранее заданной программистом функции, а мне необходимо, чтобы эту функцию вводил пользователь.
Пробовал вводить через компонент TEdit, а обработчик помещать на кнопку. Но тогда (скорее всего из-за преобразования "f:=StrToFloat(Edit1.Text);" при построении графика
возникает ошибка на строке "y1:=f(x1);" и приложение закрывается. Ума не приложу что тут можно сделать.

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

Это не так просто в паскале...
Тут нужно эвалюатор писать...

p.s. Впрочем есть один хитрый выход написать прогу, которая бы формировала файл с этим кодом, но с введенной функцией, и запускала компилятор паскаля, после чего запускала откомпилиную прогу...
ЩА уж нет времени если кто-нить тут не ответит завтра покажу (напомни только если нужно будет)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2009, 12:37   #3
TripleX
Пользователь
 
Регистрация: 30.03.2009
Сообщений: 16
По умолчанию

Весьма изощренный способ , но будет интересно посмотреть. С помощью компилятора это самый сложный вариант. Мне бы парсер, реализующий эту задачу. Вот пока тружусь над его написанием.
TripleX вне форума Ответить с цитированием
Старый 10.04.2009, 13:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Мне бы парсер, реализующий эту задачу. Вот пока тружусь над его написанием.
TCalc подойдет?
Цитата:
С помощью компилятора это самый сложный вариант.
Ну в принципе да, но там придется с собой несколько библиотек и компилер таскать, но не так уж и плохо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2009, 16:07   #5
TripleX
Пользователь
 
Регистрация: 30.03.2009
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
TCalc подойдет?
Что это за оно? Я нашел пару компиляторов, готовых парсеков, но я что-то совсем не врубаюсь как их присобачить. Расскажите по-подробнее про TCalc.
TripleX вне форума Ответить с цитированием
Старый 10.04.2009, 16:53   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я сам о нем только слышал, но говорят неплохой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.04.2009, 13:36   #7
TripleX
Пользователь
 
Регистрация: 30.03.2009
Сообщений: 16
По умолчанию

Спасибо за совет. Нашел компонент TMathParser. Пока пытаюсь в нем разобраться.
TripleX вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимодействие с пользователем Alone_Wolf Общие вопросы Delphi 19 23.12.2008 09:34
Запуск процесса под другим пользователем Андреy Win Api 3 03.12.2008 17:57
Вход под одним пользователем Mihael Безопасность, Шифрование 3 21.11.2007 12:14
перехват посещавших пользователем Url! rpy3uH Win Api 0 30.10.2006 20:31