Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 13.12.2011, 19:26   #1 (permalink)
skinner007
Member
 
Регистрация: 17.11.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Не пойму что не так

Проблемка такого плана, есть программа вот она
uses graph;
function F1(x:real):real;
begin
F1:=exp(x+1);
end;
function F2(x:real):real;
begin
F2:=exp(1-x);
end;
function F3(x:real):real;
begin
F3:=(sqr(x)/2)+6;
end;
var xn,xk,max,min,x,y,m,dx,h:real;
x0,y0,i,px,py,n:integer;
s:string;
begin
x0:=0;
initgraph(x0,y0,'');
x0:=getmaxX div 2;
y0:=getmaxY div 2;
xn:=-1.3;xk:=1.3;
m:=(y0-450)/F2(1);
setbkcolor(15);
setcolor(8);
line(0,y0,getmaxX,y0);
line(x0,0,X0,getmaxY);
for i:=1 to 4 do
begin
line(x0-3,y0+round(i*m),x0+3,y0+round(i*m));
line(x0-3,y0-round(i*m),x0+3,y0-round(i*m));
line(x0+round(i*m),y0-3,x0+round(i*m),Y0+3);
line(x0-round(i*m),y0-3,x0-round(i*m),Y0+3);
str(i,s);

outtextXY(x0-35,y0+round(i*m),'-'+s);
outtextXY(x0-35,y0-round(i*m),s);

outtextXY(x0+round(i*m),y0+10,s);
outtextXY(x0-round(i*m),y0+10,'-'+s);
end;

outtextXY(x0,y0,'0');

outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0-10,10, 'Y');
setcolor(8);

x:=xn;
dx:=0.001;
while x<=xk do
begin
x:=x+dx;
px:=x0+round(x*m);
y:=F1(x);
py:=y0-round(y*m);
putpixel(px,py,12);
if (x>-0.7)and(x<1) then
begin
y:=F2(x);
py:=y0-round(y*m);
putpixel(px,py,9);
end;
if x<-0.3 then
begin
y:=F3(x);
py:=y0-round(y*m);
putpixel(px,py,2);
end;
end;

h:=45/sin(pi/4)/m;
n:=round((xk-xn)/h);
for i:=n+1 downto -1 do
begin
x:=xn;
while x<=xk do
begin
x:=x+dx;
px:=x0+round(x*m);
y:=x+h*(n-i+1);
py:=y0-round(y*m);
if(y>F3(x))and(y>F2(x))and(y<F1(x))
then putpixel(px,py,13);
end;
end;
setcolor(12);
outtextXY(30,20,'Y1=exp(x+1)');
setcolor(9);
outtextXY(30,40,'Y2=exp(1-x)');
setcolor(2);
outtextXY(30,60,'Y3=(sqr(x)/2)+6');
readln
end.
она должна нарисовать 3 графика функции и заштриховать пространство между этими графиками, но графики получаются слишком короткими и не создают внутреннего пространства, я запускал эту программу при помощи free pascal помогите разобраться в чем проблема в программе или в самом паскале?
skinner007 вне форума   Ответить с цитированием

Старый 13.12.2011, 19:26
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Эти топики очень похожи на ваш и помогут вам разобраться

Не пойму в чем проблема - то ли HDD, то ли материнка
Чего то я натворил, а что не пойму
Не пойму, что с антивирусником?
Не пойму в чем дело - не грузится и виснет комп

Старый 13.12.2011, 19:59   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от skinner007 Посмотреть сообщение
в чем проблема в программе или в самом паскале?
Ни в том, ни в другом. В Вас. Потому что Вы взялись строить график, не проанализировав предварительно ход функций, пределы изменений аргумента, соответственно рациональное расположение осей и т.п. На самом деле это выглядит так:
grrr.jpg
Так что выводы делайте сами.
Vladimir_S вне форума   Ответить с цитированием
Старый 13.12.2011, 21:15   #3 (permalink)
skinner007
Member
 
Регистрация: 17.11.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

И как мне добиться такого результата?
skinner007 вне форума   Ответить с цитированием
Старый 14.12.2011, 09:54   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Если в общем, то:
1. Правильно провести оси, в частности, ось Х вблизи низа экрана, оставив лишь отступ в 10-20 пикселов для надписей. Ось Y - по горизонтальному центру, причем чтобы возрастание значений функций шло снизу вверх, а не сверху вниз, как у Вас. Не забываем, что "0" оси Y соответствует верхнему краю экрана.
2. Сделать разметку осей в пределах и с шагом, определяемым по приведенному рисунку.
3. Изобразить сами функции в указанных пределах.
Самое главное во всём этом - правильно задать функции масштабирования, т.е. переход от естественных единиц к экранным пикселам.

А вот если Вы хотите получить работающую программу, то - помогу, но не сразу. Возможно, не раньше выходных. Всё-таки возни очень много с этой графикой.
Vladimir_S вне форума   Ответить с цитированием
Старый 14.12.2011, 11:43   #5 (permalink)
skinner007
Member
 
Регистрация: 17.11.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Был бы вам очень благодарен за работающую программу!!!
skinner007 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 14.12.2011, 11:46   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от skinner007 Посмотреть сообщение
Был бы вам очень благодарен за работающую программу!!!
Ладно, попробую.
Vladimir_S вне форума   Ответить с цитированием
Старый 14.12.2011, 19:15   #7 (permalink)
skinner007
Member
 
Регистрация: 17.11.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Мне уже помогли вот рабочая программа
uses graph;
function F1(x:real):real;
begin
F1:=exp(x+1);
end;
function F2(x:real):real;
begin
F2:=exp(1-x);
end;
function F3(x:real):real;
begin
F3:=(sqr(x)/2)+6;
end;
var xn,xk,max,min,x,y,m,dx,h:real;
x0,y0,i,px,py,n:integer;
s:string;
begin
x0:=0;
initgraph(x0,y0,'');
x0:=getmaxX div 2;
y0:=getmaxY-50;
xn:=-2.4;xk:=1.2;
m:=(y0-80)/F3(xk);
setbkcolor(15);
setcolor(8);
line(0,y0,getmaxX,y0);
line(x0,0,X0,getmaxY);
for i:=1 to round(F3(xk))+1 do
begin
line(x0-3,y0+round(i*m),x0+3,y0+round(i*m));
line(x0-3,y0-round(i*m),x0+3,y0-round(i*m));
line(x0+round(i*m),y0-3,x0+round(i*m),Y0+3);
line(x0-round(i*m),y0-3,x0-round(i*m),Y0+3);
str(i,s);

outtextXY(x0-35,y0+round(i*m),'-'+s);
outtextXY(x0-35,y0-round(i*m),s);

outtextXY(x0+round(i*m),y0+10,s);
outtextXY(x0-round(i*m),y0+10,'-'+s);
end;

outtextXY(x0,y0,'0');

outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0-10,10, 'Y');
setcolor(8);

x:=xn;
dx:=0.001;
while x<=xk do
begin
x:=x+dx;
px:=x0+round(x*m);
if(x>-1) then
begin
y:=F1(x);
py:=y0-round(y*m);
putpixel(px,py,12);
end;
y:=F2(x);
py:=y0-round(y*m);
putpixel(px,py,9);
if x>-1.8 then
begin
y:=F3(x);
py:=y0-round(y*m);
putpixel(px,py,2);
end;
end;

h:=20/sin(pi/4)/m;
n:=round((xk-xn)/h);
for i:=n+1 downto -5 do
begin
x:=xn;
while x<=xk do
begin
x:=x+dx;
px:=x0+round(x*m);
y:=x+h*(n-i+1);
py:=y0-round(y*m);
if(y<F3(x))and(y>F2(x))and(y>F1(x))
then putpixel(px,py,13);
end;
end;
setcolor(12);
outtextXY(30,20,'Y1=exp(x+1)');
setcolor(9);
outtextXY(30,40,'Y2=exp(1-x)');
setcolor(2);
outtextXY(30,60,'Y3=(sqr(x)/2)+6');
readln
end.
Может кому то пригодится)))))
skinner007 вне форума   Ответить с цитированием
Старый 14.12.2011, 20:35   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Так, ну вот некий вариант.
Пояснения:
1. Параметры InitGraph формируйте самостоятельно - не проверял (у меня для запуска графики есть свой модуль).
2. Программа рассчитана на графический VGA экран 640Х480, и все масштабы сделаны исходя из этих значений.
3. Преобразования реальных чисел x и y=f(x) в графические координаты экрана X и Y заданы так:
X=320+80*x
Y=450-40*y
4. Поскольку в задании требуют штриховку с шагом 45, а у меня идёт шаг 8, я думаю, что следовало бы изменить масштабы осей так, чтобы заштрихованный "треугольник" занял почти весь экран. Если это необходимо, попробуйте самостоятельно поиграть с параметрами, не получится - обращайтесь.
Код:
Uses CRT,graph;

function F1(x:real):real;
begin
 F1:=exp(x+1);
end;

function F2(x:real):real;
begin
 F2:=exp(1-x);
end;

function F3(x:real):real;
begin
 F3:=(sqr(x)/2)+6;
end;

var
 x:real;
 x0,y0,i,px:integer;
 s:string;

BEGIN
 x0:=0; 
 initgraph(x0,y0,'');    
 SetLineStyle(SolidLn,0,ThickWidth);
 Line(0,450,640,450);
 Line(320,450,320,10);
 SetTextStyle(DefaultFont,HorizDir,0);
 SetTextJustify(CenterText,TopText);
 For i:=-7 to 7 do
  begin
   Line(320+40*i,450,320+40*i,460);
   STR(0.5*i:4:1,S);
   OutTextXY(320+40*i,464,S);
  end;
 SetTextJustify(RightText,CenterText);
 For i:=1 to 11 do
  begin
   Line(320,450-40*i,310,450-40*i);
   STR(i,S);
   OutTextXY(306,450-40*i,S);
  end;
 SetColor(Red);
 MoveTo(0,ROUND(450-F1(-4)*40));
 For i:=-39 to 14 do
  LineTo(320+8*i,ROUND(450-F1(0.1*i)*40));
 SetColor(LightBlue);
 MoveTo(640,ROUND(450-F2(4)*40));
 For i:=39 downto -14 do
  LineTo(320+8*i,ROUND(450-F2(0.1*i)*40));
 SetColor(LightGreen);
 MoveTo(0,ROUND(450-F3(-3.5)*40));
 For i:=-34 to 35 do
  LineTo(320+8*i,ROUND(450-F3(0.1*i)*40));

 SetColor(Yellow);
 SetLineStyle(SolidLn,0,NormWidth);
 x:=-3.0;
 Repeat
  x:=x+0.1;
 Until F2(x)<F3(x);
 px:=ROUND(320+80*x);
 While x<0 do
  begin
   Line(px,Round(450-F2(x)*40),px,Round(450-F3(x)*40));
   px:=px+8;
   x:=(px-320)/80;
  end;
 px:=px+8;
 x:=(px-320)/80;
 While F1(x)<F3(x) do
  begin
   Line(px,Round(450-F1(x)*40),px,Round(450-F3(x)*40));
   px:=px+8;
   x:=(px-320)/80;
  end;

 ReadKey;
 CloseGraph;
END.
Миниатюры
aaa01.jpg  
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 09:18.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.