• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Pascal ABC. Построение графика функции и секторной диаграммы

  • Автор темы Автор темы samoha
  • Дата начала Дата начала

samoha

Ученик
Регистрация
29 Май 2015
Сообщения
6
Реакции
0
Баллы
0
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.
Но я не знаю, как можно вывести ошибки. График строится, но координатные линии куда-то "уезжают".
Есть вторая задача:
Построить секторную диаграмму - это круг, площади секторов которого пропорциональны соответствующим числовым величинам, взятым из некоторой совокупности. Для большей наглядности секторы диаграмм закрасить в разные цвета.
Насчёт этой ничего дельного в голову не пришло.
Поможете разобраться? Буду премного благодарен
 
Поможете разобраться? Буду премного благодарен
Уж и не знаю, поможет ли это Вам. Видите ли, я этой дряни (АВС) у себя не держу и поэтому тамошней графики не знаю, работаю с Borland-пакетом. Но в принципе функции аналогичные, так что адаптировать можно. Вот что у меня вышло:
Код:
Uses Crt, Graph, GrfStart; [COLOR=Red][B]{GrfStart - это самописный модуль для запуска графики}[/B][/COLOR]
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; [COLOR=Red][B]{Это моя запускающая функция в модуле GrfStart}[/B][/COLOR]
 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.webp
    AA01.webp
    9.9 KB · Просмотры: 125
  • AA02.webp
    AA02.webp
    10.8 KB · Просмотры: 91
  • AA03.webp
    AA03.webp
    10.3 KB · Просмотры: 74
  • AA04.webp
    AA04.webp
    10.1 KB · Просмотры: 78
Спасибо, с первой задачкой я разобрался, а касательно второй есть такой набросок
Код:
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, но тут постройка диаграммы на линиях, а как переделать, не знаю
 
Но как закрасить сектора? Это можно было бы сделать через Pie, но тут постройка диаграммы на линиях, а как переделать, не знаю
И я не знаю. В Borland есть стандартная процедура PieSlice, каковая и решает именно поставленную задачу. А как в этом...
 
Удалось решить это с помощью функций Pie и SetBrushColor
 
Назад
Сверху