29.05.2015, 22:39 | #1 (permalink) |
Новичок
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Pascal ABC. Построение графика функции и секторной диаграммы
У меня имеется две задачи. Условия такие: Построить график функции y=cos(x-1)+abs(x) При написании программы учесть изменение начального и конечного значения x, а также шага, с которым x изменяется. Предусмотреть вывод информации об ошибках. Смог написать нечто такое Код:
uses graphABC; function F(x:real):real; begin F:=cos(x-1)+abs(x); end; var mx,my,max,min,x,x1,x2,dx:real; x0,y0,i,n:integer; s:string; begin writeln('Введите начальное значение x:'); readln(x1); writeln('Введите конечное значение x:'); readln(x2); writeln('Введите шаг x:'); readln(dx); x0:=round(-(windowwidth-40)*x1/(x2-x1)); max:=F(x1); min:=F(x1); x:=x1; while x<=x2 do begin if F(x)>max then max:=F(x) else if F(x)<min then min:=F(x); x:=x+dx; end; x0:=round(windowwidth*(-x1)/(x2-x1)); y0:=round(windowheight*max/(max-min)); mx:=(windowwidth-60)/(x2-x1); my:=(y0-50)/max; n:=8; line(20,y0,windowwidth-20,y0); line(x0,20,x0,windowheight-20); for i:=1 to n do begin line(x0-3,y0-round(i*my*100),x0+3,y0-round(i*my*100)); line(x0-3,y0+round(i*my*100),x0+3,y0+round(i*my*100)); line(x0+round(i*mx),y0+3,x0+round(i*mx),y0-3); line(x0-round(i*mx),y0+3,x0-round(i*mx),y0-3); str(i*100,s); textout(x0-30,y0-round(i*my*100),s); textout(x0-35,y0+round(i*my*100),'-'+s); str(i,s); textout(x0+round(i*mx),y0+10,s); textout(x0-round(i*mx),y0+10,'-'+s); end; textout(x0+5,y0+10,'0'); textout(windowwidth-30,y0-20,'X'); textout(x0+10,30, 'Y'); x:=x1; dx:=0.001; while x<=x2 do begin setpixel(x0+round(x*mx),y0-round(F(x)*my),clRed); x:=x+dx; end; setfontsize(11); textout(x0+30,0,'График функции cos(x-1)+abs(x)'); end. Есть вторая задача: Построить секторную диаграмму - это круг, площади секторов которого пропорциональны соответствующим числовым величинам, взятым из некоторой совокупности. Для большей наглядности секторы диаграмм закрасить в разные цвета. Насчёт этой ничего дельного в голову не пришло. Поможете разобраться? Буду премного благодарен |
29.05.2015, 22:39 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
По этим ссылкам вы можете найти решение проблемы Построение графика в LabView Графика на Pascal Построение графика JavaScript |
30.05.2015, 22:07 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Уж и не знаю, поможет ли это Вам. Видите ли, я этой дряни (АВС) у себя не держу и поэтому тамошней графики не знаю, работаю с Borland-пакетом. Но в принципе функции аналогичные, так что адаптировать можно. Вот что у меня вышло:
Код:
Uses Crt, Graph, GrfStart; {GrfStart - это самописный модуль для запуска графики} Var mx,my,max,min,x,x1,x2,dx:real; x0,y0,i,n:integer; s:string; function F(z:real):real; begin F:=cos(z-1)+abs(z); end; Begin write('Initial x: '); readln(x1); write('Final x: '); readln(x2); dx:=(x2-x1)/100; max:=F(x1); min:=F(x1); x:=x1; while x<=x2 do begin if F(x)>max then max:=F(x); if F(x)<min then min:=F(x); x:=x+dx; end; INITIALIZE; {Это моя запускающая функция в модуле GrfStart} mx:=(GetMaxX-60)/(x2-x1); my:=(GetMaxY-40)/(max-min); x0:=50; y0:=GetMaxY-30; n:=10; SetLineStyle(SolidLn,0,ThickWidth); Line(x0,y0,Round(x0+(x2-x1)*mx),y0); Line(x0,y0,x0,Round(y0-(max-min)*my)); SetTextJustify(RightText,CenterText); for i:=0 to n do begin if i>0 then line(x0-3,Round(y0-(max-min)/n*my*i),x0+3,Round(y0-(max-min)/n*my*i)); if i<n then begin Str(min+(max-min)/n*i:0:1,s); OutTextXY(x0-10,Round(y0-(max-min)/n*my*i),s); end else OutTextXY(x0-10,Round(y0-(max-min)*my),'Y'); end; SetTextJustify(CenterText,TopText); for i:=0 to n do begin if i>0 then line(Round(x0+(x2-x1)/n*i*mx),y0-3,Round(x0+(x2-x1)/n*i*mx),y0+3); if i<n then begin Str(x1+(x2-x1)/n*i:0:1,s); OutTextXY(Round(x0+(x2-x1)/n*i*mx),y0+10,s); end else OutTextXY(Round(x0+(x2-x1)*mx),y0+10,'X'); end; SetColor(Yellow); SetLineStyle(SolidLn,0,NormWidth); MoveTo(x0,Round(y0-(F(x1)-min)*my)); for i:=1 to 100 do LineTo(Round(x0+dx*i*mx),Round(y0-(F(x1+dx*i)-min)*my)); SetColor(LightRed); OutTextXY(((x0+GetMaxX) div 2),3,'Graph of cos(x-1)+abs(x) function'); ReadKey; CloseGraph; End. |
30.05.2015, 23:08 | #3 (permalink) |
Новичок
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо, с первой задачкой я разобрался, а касательно второй есть такой набросок
Код:
uses graphabc; var a: array[1..100] of integer; i, j, n, sum,h: integer; q: real; begin writeln('Введите количество элементов: '); read(n); for i := 1 to n do begin a[i] := random(50) + 1; inc(sum, a[i]); end; Circle(250, 250, 100); for i := 1 to n do begin write(i, ': ', a[i]:2); q := a[i] / sum * 360; a[i] := trunc(q); writeln; end; for i := 1 to 360 do for j := 1 to n do if a[j] = i then begin inc(h,a[j]); line(250, 250, trunc(100*(sin(h*pi/180)))+250, trunc(100*(cos(h*pi/180)))+250); end; end. |
31.05.2015, 23:13 | #5 (permalink) |
Новичок
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Удалось решить это с помощью функций Pie и SetBrushColor
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|