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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2014, 21:00   #1
Fisgard
 
Регистрация: 14.05.2014
Сообщений: 8
По умолчанию Снова графический режим.

Прошу снова помощи. В графическом режиме я ничего не понимаю. Задание надо сделать до завтра. =(

Вот задание:
Построить график функции в графическом режиме.
Вот это мое задание: f(x)=sqrt(1-0.4*x*x)-arcsin(x).
Не буду врать, что делал сам и что то не получилось. Однокурсники поделились кодом, думал вставлю своё - прокатит, не прокатило. Жалуется на недопустимо малое/большое значение.
Вот собственно и сам код и мои попытки...

Код:
Program Zadanie2;
uses
 Crt,GraphABC;	                   {подключаем стандартные библиотеки}
type
 TFunction=function(x:real):real; {тип "Функция вида f(x)"}
var
 f:TFunction; 	                   {объявляем переменную-функцию}
procedure DrawGrid(a,b:real);	   {процедура прорисовки осей графика}
 var
  s:string[4];
  max:real;
 begin
  Line(0,250,500,250);
  Line(250,0,250,500);
  if a>b then
   max:=a
  else
   max:=b;
  Line(485,245,500,250);//стрелочки на графике
  Line(485,255,500,250);
  Line(245,15,250,0);
  Line(255,15,250,0);
 end;
procedure DrawFunction(var f:TFunction;a,b:real;n:integer);{процедура построения графика функции;а, b – границы отрезка, n – количество промежутков}
 var
  i:integer;                     {счетчик циклов}
  x,y:real;                      {x – аргумент, y – значение функции}
  dx:real;                       {dx – приращение аргумента}
  sDx,sDy:real;                  {приращение x и y на пиксель}
  y0,x0:integer;                 {экранные координаты: (x0,y0) – старые}
  yi,xi:integer;                 {(xi,yi) – новые}
  fmin,fmax:real;                {макс./мин. значения f(x) на отрезке}
  maxy,maxx:real;                {макс. абсолютные значения на X и Y }
 begin
  SetPenWidth(3);
  DrawGrid(a,b); 	          {рисование осей системы координат}
  dx:=(b-a)/n;{считаем, что dx<>0, т.е. отрезок не вырожден (или а<>b)}
  {нахождение макс./мин. значений f(x) на отрезке}
  x:=a; 			{начальное значение х}
  fmin:=f(x);  		{начальное значение fmin}
  fmax:=f(x);			{начальное значение fmax}
  for i:=0 to n do             {поиск действительных значений fmin/fmax}
   begin
    x:=x+dx;
    if f(x)>fmax then
     fmax:=f(x);
    if f(x)<fmin then
     fmin:=f(x);
   end;
  if abs(fmax)>abs(fmin) then  {если функция – константа}
   maxy:=abs(fmax)
  else
   maxy:=abs(fmin);
  if abs(a)>abs(b) then
   maxx:=abs(a)
  else
   maxx:=abs(b);
  {вывод графика на экране}
  x:=a; 			{начальные значения}
  y:=f(a);
                               {расчет относительного приращения координат}
  sDy:=2*maxy/(500);
  sDx:=2*maxx/(500);
  x0:=(250)+Trunc(a/sDx);
                              {расчет "старой" точки}
  y0:=(250)-Trunc(y/sDy);
  for i:=1 to n do	        {цикл рисования графика}
   begin
    x:=x+dx;      		{увеличить х}
    y:=f(x); 	        	{новое значение y }
    xi:=(250)+Trunc(x/sDx); {расчет "новой" точки}
    yi:=(250)-Trunc(y/sDy);
    Line(x0,y0,xi,yi); 		{рисуем линию }
    x0:=xi;                    {"новые" значения стали "старыми"}
    y0:=yi;
   end;
end;
 {$F+}
function MyFunc(t:real):real;
 begin
  MyFunc:=sqrt(1-0.4*t*t)-arcsin(t);; {сама функция}
 end;
begin
 f:=MyFunc;		
 DrawFunction(f,0,1,100); 	{рисуем функцию}
 Repeat
 until KeyPressed;		{ждем нажатия клавиши}
 ReadKey;
end.
Если кто то напряжется - огромное человеческое спасибо.
Fisgard вне форума Ответить с цитированием
Старый 18.05.2014, 11:52   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

При таких значениях отработало.
Код:
 DrawFunction(f,-1,1,30); 	{рисуем функцию}
Изображения
Тип файла: jpg 2014-05-18 11-51-01 GraphABC.NET.jpg (17.0 Кб, 150 просмотров)
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 18.05.2014, 13:07   #3
Fisgard
 
Регистрация: 14.05.2014
Сообщений: 8
По умолчанию

Оказалось у меня стоял не ABC, а ABC.net, переустановил, перестало читать arcsin(t). Ну не беда, поменял на
Код:
MyFunc:=sqrt(1-0.4*t*t)-arctan(t/sqrt(1-sqr(t)));;
, по смыслу то же, но читается. Плюс вставил Ваши значения и тут вылазит "ошибка, вещественное деление на 0", если без Ваших значений, то "неверная вещественная операция".
В ABC.net построилось то же, что и у Вас. Не понимаю я в чем разница. Но ладно, результат есть и то хорошо...

Последний раз редактировалось Fisgard; 18.05.2014 в 13:29.
Fisgard вне форума Ответить с цитированием
Старый 18.05.2014, 13:25   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Я проверял как раз в pabc.net. Правда убрал crt. Он здесь вовсе не нужен.
Трассировка в pabc.net сделана через ... Одно место. Так и не понял, где вылезает переполнение.
Я бы убрал процедурную переменную и функцию считал напрямую, чтобы можно было отследить.
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
графический режим [alex120] Помощь студентам 1 29.05.2013 08:04
Графический режим Dead Romantic Помощь студентам 0 14.12.2010 22:17
Графический режим в FP fire_on Паскаль, Turbo Pascal, PascalABC.NET 1 17.01.2010 13:16
Графический режим galaid Паскаль, Turbo Pascal, PascalABC.NET 2 05.05.2009 17:51
Графический режим в С Raz0r Помощь студентам 4 03.03.2008 16:49