Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 29.05.2015, 22:39   #1 (permalink)
samoha
Новичок
 
Регистрация: 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.
Но я не знаю, как можно вывести ошибки. График строится, но координатные линии куда-то "уезжают".
Есть вторая задача:
Построить секторную диаграмму - это круг, площади секторов которого пропорциональны соответствующим числовым величинам, взятым из некоторой совокупности. Для большей наглядности секторы диаграмм закрасить в разные цвета.
Насчёт этой ничего дельного в голову не пришло.
Поможете разобраться? Буду премного благодарен
samoha вне форума   Ответить с цитированием

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

По этим ссылкам вы можете найти решение проблемы

Построение графика в LabView
Графика на Pascal
Построение графика JavaScript

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

Цитата:
Сообщение от samoha Посмотреть сообщение
Поможете разобраться? Буду премного благодарен
Уж и не знаю, поможет ли это Вам. Видите ли, я этой дряни (АВС) у себя не держу и поэтому тамошней графики не знаю, работаю с 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.
Миниатюры
aa01.jpg   aa02.jpg   aa03.jpg   aa04.jpg  
Vladimir_S вне форума   Ответить с цитированием
Старый 30.05.2015, 23:08   #3 (permalink)
samoha
Новичок
 
Регистрация: 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.
Но как закрасить сектора? Это можно было бы сделать через Pie, но тут постройка диаграммы на линиях, а как переделать, не знаю
samoha вне форума   Ответить с цитированием
Старый 31.05.2015, 08:45   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от samoha Посмотреть сообщение
Но как закрасить сектора? Это можно было бы сделать через Pie, но тут постройка диаграммы на линиях, а как переделать, не знаю
И я не знаю. В Borland есть стандартная процедура PieSlice, каковая и решает именно поставленную задачу. А как в этом...
Vladimir_S вне форума   Ответить с цитированием
Старый 31.05.2015, 23:13   #5 (permalink)
samoha
Новичок
 
Регистрация: 29.05.2015
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Удалось решить это с помощью функций Pie и SetBrushColor
samoha вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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