13.12.2011, 19:26 | #1 (permalink) |
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 помогите разобраться в чем проблема в программе или в самом паскале? |
13.12.2011, 19:26 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Эти топики очень похожи на ваш и помогут вам разобраться Не пойму в чем проблема - то ли HDD, то ли материнка Чего то я натворил, а что не пойму Не пойму, что с антивирусником? Не пойму в чем дело - не грузится и виснет комп |
13.12.2011, 19:59 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ни в том, ни в другом. В Вас. Потому что Вы взялись строить график, не проанализировав предварительно ход функций, пределы изменений аргумента, соответственно рациональное расположение осей и т.п. На самом деле это выглядит так:
Так что выводы делайте сами. |
14.12.2011, 09:54 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Если в общем, то:
1. Правильно провести оси, в частности, ось Х вблизи низа экрана, оставив лишь отступ в 10-20 пикселов для надписей. Ось Y - по горизонтальному центру, причем чтобы возрастание значений функций шло снизу вверх, а не сверху вниз, как у Вас. Не забываем, что "0" оси Y соответствует верхнему краю экрана. 2. Сделать разметку осей в пределах и с шагом, определяемым по приведенному рисунку. 3. Изобразить сами функции в указанных пределах. Самое главное во всём этом - правильно задать функции масштабирования, т.е. переход от естественных единиц к экранным пикселам. А вот если Вы хотите получить работающую программу, то - помогу, но не сразу. Возможно, не раньше выходных. Всё-таки возни очень много с этой графикой. |
14.12.2011, 11:43 | #5 (permalink) |
Member
Регистрация: 17.11.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Был бы вам очень благодарен за работающую программу!!!
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
14.12.2011, 19:15 | #7 (permalink) |
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. Может кому то пригодится))))) |
14.12.2011, 20:35 | #8 (permalink) |
Специалист
Регистрация: 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. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|