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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2009, 04:29   #1
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию Графика Pascal

Изображение должно занимать большую часть экрана, сопровождаться заголовком, содержать наименования и градации осей и масштабироваться в зависимости от исходных данных изображение должно полностью помещаться на экране. Программа не должна опираться на конкретные значения разрешения экрана.

Вывести на экран в графическом режиме графики двух функций на интервале от x(нач) до x(кон) с шагом dx. Первая функциязадана с помощью ряда Тейлора, её вычисление должно выполняться с точностью e(эпсилон). Значение параметра b для второй функции вводится с клавиатуры. Графики должны различаться цветами.

1) y(x)=2(1/x+1/(3∙x^3 )+1/(5∙x^5 )+⋯) |x|>1
2) z(x)=ln((x+1)/(x-1))+b

Ребята всё что могу изложил в коде ниже, помогите человеку никогда не работающему (до сегодняшнего дня) с графикой.

Код:
uses graph,crt;
function phi(x:real):real;
begin
 phi:=sqr(x)+1;
end;
var
 graphdriver,
 graphmode :integer;
 ix2:real;
 ix,iy,ix1,iy2,i:integer;
 ErrorCode:integer;

procedure MyGraphInit;
begin
 GraphDriver := Detect;
 InitGraph(GraphDriver, GraphMode, '');
 ErrorCode := GraphResult;
 if ErrorCode <> grOk then
 begin
  writeln('InitGraph Error: ',GraphErrorMsg(ErrorCode));
  Writeln('Program is aborted!');
  Halt (1);
 end;
end;

begin
 clrscr;
 MyGraphInit;
{--------Вывод координатных осей----------}
 setlinestyle (solidln, 0, normwidth);
 line(100,450,100,50);
 line(50,400,600,400);
 line(100,50,95,65);
 line(100,50,105,65);
 line(600,400,580,395);
 line(600,400,580,405);

 outtextxy(90,410,'0');
 outtextxy(87,375,'1');
 outtextxy(87,275,'5');
 outtextxy(80,150,'10');
 outtextxy(80,60,'Y');

 line(95,375,105,375);
 line(95,350,105,350);
 line(95,325,105,325);
 line(95,300,105,300);
 line(95,275,105,275);
 line(95,250,105,250);
 line(95,225,105,225);
 line(95,200,105,200);
 line(95,175,105,175);
 line(95,150,105,150);

 outtextxy(150,405,'1');
 line(150,395,150,405);
 outtextxy(200,405,'2');
 line(200,395,200,405);
 outtextxy(250,405,'3');
 line(250,395,250,405);
 outtextxy(300,405,'4');
 line(300,395,300,405);
 outtextxy(350,405,'5');
 line(350,395,350,405);
 outtextxy(400,405,'6');
 line(400,395,400,405);
 outtextxy(450,405,'7');
 line(450,395,450,405);
 outtextxy(500,405,'8');
 line(500,395,500,405);
 outtextxy(550,405,'9');
 line(550,395,550,405);
 outtextxy(590,415,'X');

 ix :=0;
 iy :=0;
 ix1:=0;
 iy2:=0;
 ix2:=0;

 setcolor(10);

{-------Вывод графика фи------------}
 for i:=0 to 640 do begin
  ix2:=i/20-2;
  if ix2=0 then ix2:=0.01;
  iy:=round(400 - 25*phi(ix2));
  ix:=trunc(100 + 50*ix2);
  if i>0 then
   line(ix1,iy2,ix,iy);
  ix1:=ix;
  iy2:=iy;
end;
readln;
closegraph;
end.
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 08.05.2009, 11:27   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Функция для y будет выглядеть как-то так:
Код:
function y(x : real) : real;
var rez,a : real;
k : integer;
begin
a := 1/x;
k := 1;
rez := 0;
while a>=eps do
 begin
 rez := rez + a;
 inc(k,2);
 a := a/(k*x*x);
 end;
y := rez;
end;
В принципе, вроде, делаете все правильно.

А выводил бы я попиксельно. Как-то так:
Код:
for i:=0 to 640 do
  begin
  ix2:=i/20-2;
  if abs(ix2)>1 then
   begin
   iy := round(400 - 25*y(ix2));
   putpixel(round(100 + 50*ix2),iy,10);
   end;
  end;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 11:34   #3
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

можете поподробнее описать функцию?
а для чем лучше вывод попиксельно?
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 08.05.2009, 11:40   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
можете поподробнее описать функцию?
Так ведь в задании все сказано:
Цитата:
Первая функциязадана с помощью ряда Тейлора, её вычисление должно выполняться с точностью e(эпсилон)
1) y(x)=2(1/x+1/(3∙x^3 )+1/(5∙x^5 )+⋯) |x|>1
Собственно, вот она и есть.

Цитата:
а для чем лучше вывод попиксельно?
Ну, можете выводить и через lineto, но тогда вам нужно отбрасывать часть графика y на [-1; 1] (по условию).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 11:46   #5
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

с функцией понятно, вопрос тогда следующий, как тогда задать епсилон,dx,x(нач) u x(кон)? ведь он строит на всем промежутке?
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 08.05.2009, 11:53   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
как тогда задать епсилон,dx,x(нач) u x(кон)?
Не очень понял вопроса. Их можно запрашивать у пользователя.

Вообще, за область вывода у вас отвечает i.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 12:37   #7
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Сначала определить разрешение экрана и коэффициент масштабирования. Исходя из этого коэффициента можно определить ε (с точностью до пиксела по вертикали) и dx (с шагом 1 пиксел по горизонтали).
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 08.05.2009, 19:26   #8
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

Именно, их нужно запрашивать с клавиатуры, но вот только в каком месте, и как сделать через dx построение графика?
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 08.05.2009, 19:35   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Именно, их нужно запрашивать с клавиатуры, но вот только в каком месте
В каком хотите. Логично запрашивать их перед инициализацией граф. режима.
Цитата:
и как сделать через dx построение графика?
Вы изначально неверно строите координатную сетку.
Вам нужно запросить границы и dx. И уже на основе этих данных построить оси, отметить на них координаты и строить график.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 13.05.2009, 01:38   #10
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

вставил вторую функцию.
1)Не могу всё таки вставить никуда чтобы программа у меня спрашивала x(нач),x(кон),dx,eps(епсилон). куда не вставляю выдаёт ошибку.
2)подскажите как поменять цвер второй функции.

Буду благодарен за помощь.$$$

Код:
uses graph,crt;
function y(x : real) : real;
var rez,a,eps : real;
k : integer;
begin
a := 1/x;
k := 1;
rez := 0;
while a>=eps do
 begin
 rez := rez + a;
 inc(k,2);
 a := a/(k*sqr(x));
 end;
y := rez;
end;

function z( x:real ):real;
begin
 z:=ln((x+1)/(x-1))
end;

var
 graphdriver,
 graphmode:integer;
 ix2:real;
 ix,iy,ix1,iy2,i:integer;
 ErrorCode:integer;

procedure MyGraphInit;
begin
 GraphDriver := Detect;
 InitGraph(GraphDriver, GraphMode, '');
 ErrorCode := GraphResult;
 if ErrorCode <> grOk then
 begin
  writeln('InitGraph Error: ',GraphErrorMsg(ErrorCode));
  Writeln('Program is aborted!');
  Halt (1);
 end;
end;

begin
 clrscr;
 MyGraphInit;
{--------Вывод координатных осей----------}
 setlinestyle (solidln, 0, normwidth);
 line(100,450,100,50);
 line(50,400,600,400);
 line(100,50,95,65);
 line(100,50,105,65);
 line(600,400,580,395);
 line(600,400,580,405);

 outtextxy(90,410,'0');
 outtextxy(87,375,'1');
 outtextxy(87,275,'5');
 outtextxy(80,150,'10');
 outtextxy(80,60,'Y');

 line(95,375,105,375);
 line(95,350,105,350);
 line(95,325,105,325);
 line(95,300,105,300);
 line(95,275,105,275);
 line(95,250,105,250);
 line(95,225,105,225);
 line(95,200,105,200);
 line(95,175,105,175);
 line(95,150,105,150);

 outtextxy(150,405,'1');
 line(150,395,150,405);
 outtextxy(200,405,'2');
 line(200,395,200,405);
 outtextxy(250,405,'3');
 line(250,395,250,405);
 outtextxy(300,405,'4');
 line(300,395,300,405);
 outtextxy(350,405,'5');
 line(350,395,350,405);
 outtextxy(400,405,'6');
 line(400,395,400,405);
 outtextxy(450,405,'7');
 line(450,395,450,405);
 outtextxy(500,405,'8');
 line(500,395,500,405);
 outtextxy(550,405,'9');
 line(550,395,550,405);
 outtextxy(590,415,'X');

 ix :=0;
 iy :=0;
 ix1:=0;
 iy2:=0;
 ix2:=0;

 setcolor(10);

{-------Вывод графика фи------------}
 for i:=0 to 640 do
  begin
  ix2:=i/20-2;
  if abs(ix2)>1 then
   begin
   iy := round(400 - 25*y(ix2));
   putpixel(round(100 + 50*ix2),iy,10);
   end;
  end;
 for i:=0 to 640 do
  begin
  ix2:=i/20-2;
  if abs(ix2)>1 then
   begin
   iy := round(400 - 25*z(ix2));
   putpixel(round(100 + 50*ix2),iy,10);
   end;
  end;
readln;
closegraph;
end.
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
pascal графика world12_tk Помощь студентам 1 25.04.2009 18:56
[Pascal] Графика Рамик Помощь студентам 5 15.04.2009 03:06
Перевод кода из Pascal в Object Pascal zemskov77 Общие вопросы Delphi 1 03.01.2009 09:37
Графика V1rusPro Общие вопросы .NET 0 22.04.2008 08:25