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

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

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

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

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

textual
Листинг программы
  1. uses graph,wincrt;
  2. const n=20;{количество разбиений}
  3.       a=-1.5;{интервал по х для графиков}
  4.       b=1.5;
  5. type func=function(x:real):real;
  6. {функции по условию}
  7. function F1(x:real):real;
  8. begin
  9. F1:=x*x+0.4*x+0.1;
  10. end;
  11. function F2(x:real):real;
  12. begin
  13. F2:=-0.2*x+0.8;
  14. end;
  15. {вычисление интеграла методом прямоугольников}
  16. function Integral(f:func;xn,xk:real):real;
  17. var h,x,s:real;
  18.     i:integer;
  19. begin
  20. h:=(xk-xn)/n;
  21. x:=xn+h/2;
  22. s:=0;
  23. for i:=1 to n do
  24.  begin
  25.   s:=s+f(x);
  26.   x:=x+h
  27.  end;
  28. Integral:=s*h;
  29. end;
  30. var max,mx,my,dx:real;
  31.     x,x1,x2,xz,yz,p1,p2,p:real;
  32.     x0,y0,i,z,k:integer;
  33.     s:string;
  34. begin
  35. initgraph(x0,y0,' ');
  36. {найдем максимум для масштаба по У
  37. а также абциссы точек пересечения графиков х12}
  38. x:=a;
  39. max:=F1(a);
  40. dx:=0.001;
  41. k:=0;
  42. while x<=b+dx do
  43.  begin
  44.   if F1(x)>max then max:=F1(x);
  45.   if F2(x)>max then max:=F2(x);
  46.   if (abs(F1(x)-F2(x))<2*dx) and(k=0) then
  47.    begin
  48.     k:=1;
  49.     x1:=x;{первое пересечение}
  50.    end
  51.   else if (abs(F1(x)-F2(x))<2*dx) and(k=1)
  52.   then x2:=x; {второе}
  53.   x:=x+dx;
  54.  end;
  55. {определим площадь фигуры}
  56. p1:=Integral(@F1,x1,x2);
  57. p2:=Integral(@F2,x1,x2);
  58. p:=abs(p1-p2);
  59. x0:=getmaxX div 2;
  60. mx:=(x0-30)/b;{масштаб по Х}
  61. y0:=getmaxY-50;
  62. my:=(y0-20)/max;{по У}
  63. if 2*b>max then z:=trunc(2*b)+1{количество засечек по осям}
  64. else z:=trunc(max)+1;
  65. setfillstyle(1,15);{цвет фона белый};
  66. bar(0,0,getmaxX,getmaxY);
  67. setcolor(8);{цвет линий}
  68. settextstyle(0,0,2);
  69. line(0,y0,getmaxX,y0);{оси}
  70. line(x0,0,X0,getmaxY);
  71. for i:=1 to z do{максимальное количество засечек в одну сторону}
  72.   begin
  73.     line(x0-3,y0-round(i*my),x0+3,y0-round(i*my));{засечки на оси У}
  74.     line(x0+round(i*mx),y0-3,x0+round(i*mx),y0+3); {засечки на оси Х}
  75.     line(x0-round(i*mx/2),y0-3,x0-round(i*mx/2),y0+3);
  76.     {подпись оси У}
  77.     str(i,s);
  78.     outtextXY(x0-35,y0-round(i*my),s);{соответственно засечкам}
  79.     {подпись оси Х}
  80.     str(i/2:0:1,s);
  81.     outtextXY(x0+round(i*mx/2),y0+10,s);
  82.     outtextXY(x0-round(i*mx/2),y0+10,'-'+s);
  83.   end;
  84. {центр}
  85. outtextXY(x0+5,y0+10,'0');
  86. {подписи концов осей}
  87. outtextXY(getmaxX-10,y0-10,'X');
  88. outtextXY(x0+5,10, 'Y');
  89. {графики}
  90. x:=a;
  91. while x<=b do
  92.  begin
  93.   putpixel(x0+round(x*mx),y0-round(F1(x)*my),9);
  94.   putpixel(x0+round(x*mx),y0-round(F2(x)*my),12);
  95.   x:=x+dx;
  96.  end;
  97. {название}
  98. outtextXY(x0+20,20,'Grafiki functij');
  99. setcolor(9);
  100. outtextXY(x0+20,40,'y=x^2+0.4x+0.1');
  101. setcolor(12);
  102. outtextXY(x0+20,60,'y=-0.2x+0.8');
  103. setcolor(8);
  104. outtextXY(x0+20,80,'na intervale [-1.5;1.5]');
  105. {область перекрытия}
  106. setcolor(13);
  107. x:=x1-10*dx;{рисуем линию по 1 графику}
  108. moveto(x0+round(x*mx),y0-round(F1(x)*my));
  109. while x<=x2+10*dx do
  110.  begin
  111.   lineto(x0+round(x*mx),y0-round(F1(x)*my));
  112.   x:=x+dx;
  113.  end;
  114. {то же по 2}
  115. x:=x1-10*dx;
  116. moveto(x0+round(x*mx),y0-round(F1(x)*my));
  117. while x<=x2+10*dx do
  118.  begin
  119.   lineto(x0+round(x*mx),y0-round(F2(x)*my));
  120.   x:=x+dx;
  121.  end;
  122. {заливаем}
  123. xz:=(x2+x1)/2;
  124. yz:=F1(xz);
  125. setfillstyle(1,14);
  126. floodfill(x0+round(xz*mx),y0-round(yz*my)-10,13);
  127. str(p:0:2,s);
  128. settextstyle(0,0,2);
  129. outtextXY(x0+round(xz*mx)-40,y0-round(yz*my)-100,'S='+s);
  130. readkey
  131. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы