Вывести график полученный из 2 функций методом прямоугольников - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Добырй день! Нужно написать программу, которая будет выводить график полученный из 2 функций методом прямоугольников. Функции оебе записал, но не могу сделать метод прямоугольников и вывести функции. Помогите пожалуйста.
function f1(var x1: real):real;
begin
   f1:= x1^2+0.4*x1+0.1;
end;
 
finction f2(var x2: real):real;
   f2:=-0.2*x2+0.8;
end;

Решение задачи: «Вывести график полученный из 2 функций методом прямоугольников»

textual
Листинг программы
uses graph,wincrt;
const n=20;{количество разбиений}
      a=-1.5;{интервал по х для графиков}
      b=1.5;
type func=function(x:real):real;
{функции по условию}
function F1(x:real):real;
begin
F1:=x*x+0.4*x+0.1;
end;
function F2(x:real):real;
begin
F2:=-0.2*x+0.8;
end;
{вычисление интеграла методом прямоугольников}
function Integral(f:func;xn,xk:real):real;
var h,x,s:real;
    i:integer;
begin
h:=(xk-xn)/n;
x:=xn+h/2;
s:=0;
for i:=1 to n do
 begin
  s:=s+f(x);
  x:=x+h
 end;
Integral:=s*h;
end;
var max,mx,my,dx:real;
    x,x1,x2,xz,yz,p1,p2,p:real;
    x0,y0,i,z,k:integer;
    s:string;
begin
initgraph(x0,y0,' ');
{найдем максимум для масштаба по У
а также абциссы точек пересечения графиков х1,х2}
x:=a;
max:=F1(a);
dx:=0.001;
k:=0;
while x<=b+dx do
 begin
  if F1(x)>max then max:=F1(x);
  if F2(x)>max then max:=F2(x);
  if (abs(F1(x)-F2(x))<2*dx) and(k=0) then
   begin
    k:=1;
    x1:=x;{первое пересечение}
   end
  else if (abs(F1(x)-F2(x))<2*dx) and(k=1)
  then x2:=x; {второе}
  x:=x+dx;
 end;
{определим площадь фигуры}
p1:=Integral(@F1,x1,x2);
p2:=Integral(@F2,x1,x2);
p:=abs(p1-p2);
x0:=getmaxX div 2;
mx:=(x0-30)/b;{масштаб по Х}
y0:=getmaxY-50;
my:=(y0-20)/max;{по У}
if 2*b>max then z:=trunc(2*b)+1{количество засечек по осям}
else z:=trunc(max)+1;
setfillstyle(1,15);{цвет фона белый};
bar(0,0,getmaxX,getmaxY);
setcolor(8);{цвет линий}
settextstyle(0,0,2);
line(0,y0,getmaxX,y0);{оси}
line(x0,0,X0,getmaxY);
for i:=1 to z do{максимальное количество засечек в одну сторону}
  begin
    line(x0-3,y0-round(i*my),x0+3,y0-round(i*my));{засечки на оси У}
    line(x0+round(i*mx),y0-3,x0+round(i*mx),y0+3); {засечки на оси Х}
    line(x0-round(i*mx/2),y0-3,x0-round(i*mx/2),y0+3);
    {подпись оси У}
    str(i,s);
    outtextXY(x0-35,y0-round(i*my),s);{соответственно засечкам}
    {подпись оси Х}
    str(i/2:0:1,s);
    outtextXY(x0+round(i*mx/2),y0+10,s);
    outtextXY(x0-round(i*mx/2),y0+10,'-'+s);
  end;
{центр}
outtextXY(x0+5,y0+10,'0');
{подписи концов осей}
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0+5,10, 'Y');
{графики}
x:=a;
while x<=b do
 begin
  putpixel(x0+round(x*mx),y0-round(F1(x)*my),9);
  putpixel(x0+round(x*mx),y0-round(F2(x)*my),12);
  x:=x+dx;
 end;
{название}
outtextXY(x0+20,20,'Grafiki functij');
setcolor(9);
outtextXY(x0+20,40,'y=x^2+0.4x+0.1');
setcolor(12);
outtextXY(x0+20,60,'y=-0.2x+0.8');
setcolor(8);
outtextXY(x0+20,80,'na intervale [-1.5;1.5]');
{область перекрытия}
setcolor(13);
x:=x1-10*dx;{рисуем линию по 1 графику}
moveto(x0+round(x*mx),y0-round(F1(x)*my));
while x<=x2+10*dx do
 begin
  lineto(x0+round(x*mx),y0-round(F1(x)*my));
  x:=x+dx;
 end;
{то же по 2}
x:=x1-10*dx;
moveto(x0+round(x*mx),y0-round(F1(x)*my));
while x<=x2+10*dx do
 begin
  lineto(x0+round(x*mx),y0-round(F2(x)*my));
  x:=x+dx;
 end;
{заливаем}
xz:=(x2+x1)/2;
yz:=F1(xz);
setfillstyle(1,14);
floodfill(x0+round(xz*mx),y0-round(yz*my)-10,13);
str(p:0:2,s);
settextstyle(0,0,2);
outtextXY(x0+round(xz*mx)-40,y0-round(yz*my)-100,'S='+s);
readkey
end.

Объяснение кода листинга программы

  1. Объединение двух функций в одну новую функцию с помощью оператора +
    • Нет
  2. Использование оператора If для определения, какая из двух функций должна быть вычислена
    • Нет
  3. Использование оператора While для цикла по точкам на интервале
    • Да
  4. Использование функции Integral для вычисления площади под графиком
    • Да
  5. Использование функции Abs для вычисления абсолютного значения разности функций
    • Да
  6. Использование функции Round для округления чисел до ближайшего целого числа
    • Да
  7. Использование функции Trunc для округления чисел до ближайшего целого числа в меньшую сторону
    • Да
  8. Использование функции Moveto для перемещения курсора в начало линии
    • Да
  9. Использование функции Lineto для рисования линии между двумя точками
    • Да
  10. Использование функции Floodfill для заливки прямоугольника цветом
    • Да
  11. Использование функции OuttextXY для вывода текста на экран
    • Да
  12. Использование функции Readkey для ожидания нажатия клавиши
    • Да

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.571 из 5
Похожие ответы