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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2008, 23:28   #1
_ares_
Пользователь
 
Регистрация: 12.11.2007
Сообщений: 31
По умолчанию график функции с малой величиной

Господа! У меня возникает ошибка с константой в формуле. Впринципе прога должна быть универсальной и строить любой график.. И в формуле зн-ие x должно менять от 2 до бесконечности. У меня вылетает ошибка что он делит типа на 0 .

unit grfunc_;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
e0=8.85e-12;
e=1;
q=5;

var
Form1: TForm1;

implementation

{$R *.DFM}

// график который строим
Function f(x:real):Extended;
var zn:Integer;
begin
//f:=Sin(x) //если брать аргрумент синуса то он строит гр
// с синусом все просто есть функция и аргумент, а у меня в фомуле не знаю что взять за аргумент
for x:=2 to 1000 do
f:=2*q/(4*pi*e0*e*sqr(x));
end;

// строим график
procedure GrOfFunc;
var
x1,x2:Extended; // границы изменения аргумента функции
y1,y2:Extended; //границы изменения значения функции
x:Extended; //аргумент функции
y:Extended; // знач ф-ии в точке
dx:Extended; // приращение аргумента
l,b:integer; //область вывода графика
w,h:integer; //ширина и высота области вывода
mx,my:Extended; //масштаб по осям
x0,y0:integer; // начло координат

begin
//область выода графика
l:=10; // X -координата лев верхнего угла
b:=Form1.ClientHeight-20; // Y -
h:=Form1.ClientHeight-40; //высота
w:=Form1.Width-40; // ширина

x1:=0; // нижняя граница аргумента
x2:=25; // верхняя граница аргумента
dx:=0.01; // шаг

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);{тут дает вторую ошибку}
mx:=w/abs(x2-x1);

// оси
x0:=l;
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,ffGene ral,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,Clie ntWidth,ClientHeight));
//вывод графика
GrOfFunc;
end;

end.

//Ну что ж думаю что все подробно описано)
_ares_ вне форума Ответить с цитированием
Старый 23.04.2008, 00:23   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А что призван делать загадочный цикл по вещественной (!) переменной в функции f? Вообще говоря, вещественные числа на 0 делить можно, это у Дельфи бзык на эту тему, может быть кто-то, кто силён в дельфи, подскажет, как это выключается, правда толку в данном случае от этого мало. Проще развернуть деление при пересчёте координат наоборот - делить на размеры формы, а в функции предусмотреть эту неприятность с помощью IsInfinite или IsZero, или даже через try и возвращать какое-нибудь откалиброваное большое значение.
B_N вне форума Ответить с цитированием
Старый 23.04.2008, 07:52   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что за проблема поставить проверки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2008, 12:29   #4
_ares_
Пользователь
 
Регистрация: 12.11.2007
Сообщений: 31
По умолчанию

так чего понять то надо?
_ares_ вне форума Ответить с цитированием
Старый 23.04.2008, 12:30   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну везде где есть потенциальная опасность деления на 0 If или Try ставь
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.04.2008, 22:59   #6
_ares_
Пользователь
 
Регистрация: 12.11.2007
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну везде где есть потенциальная опасность деления на 0 If или Try ставь
вы имеете ввиду эту процедуру? все то же самое идет
for x:=2 to 1000 do
try
f:=2*q/(4*pi*e0*e*sqr(x));
except
on EZeroDivide do
ShowMessage('деление на 0');
end;
_ares_ вне форума Ответить с цитированием
Старый 24.04.2008, 19:31   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от _ares_ Посмотреть сообщение
вы имеете ввиду эту процедуру? все то же самое идет
for x:=2 to 1000 do
try
f:=2*q/(4*pi*e0*e*sqr(x));
except
on EZeroDivide do
ShowMessage('деление на 0');
end;
компильни прогу, и запусти экзешик без Delphi.
и сделай лучше так:
Код:
for x:=2 to 1000 do
 try
  f:=2*q/(4*pi*e0*e*sqr(x));
 except
  f:=0;  
 end;
rpy3uH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построить график функции, используя компонент TChart. vitalik007 Компоненты Delphi 3 09.06.2014 11:20
Графика в паскале (построить график функции) matic Помощь студентам 4 26.11.2012 17:02
График функции в C++ Builder.. ПОМОГИТЕ! Cyberbest Помощь студентам 2 25.06.2009 21:06
График функции Леха Общие вопросы Delphi 18 16.04.2007 20:50