Программа
Program Trapezium;
{ Вывод трапеции,
ограниченной 2-я
ф-ями и границами
интервала, вычисление
площади по приближенной
формуле, сравнение с
точным значением,
вывод результатов в файл }
Uses
Graph,Crt;
Const
a=-1.5; { Левая граница интервала интегрирования }
b=1.5; { Правая граница интервала интегрирования }
N=100; { Разбиение }
ScaleX=166; { Масштабный коэффициент по оси X }
ScaleY=95; { Масштабный коэффициент по оси Y }
DifferenceX0=0; { Смещение оси X относительно центра экрана }
DifferenceY0=0; { Смещение оси Y относительно центра экрана }
DriverPath='C:\PROGRA~1\BP\BGI'; { Путь к графическому драйверу }
Var
i:integer; { Счетчик }
Otv,OtvP:real; { Точный ответ, приближенный ответ }
Step:real; { Шаг интегрирования }
GraphDriver,GraphMode:integer; { Графический драйвер и режим }
F:text; { Файловая переменная }
St:String; { Переменная для обработки выводимого в графике текста }
Function F1(x:real):real; { Первая функция }
Begin
F1:=1-Sqr(x)
End;
Function F1Proto(x:real):real; { Первообразная первой функции }
Begin
F1Proto:=x*(3-Sqr(x))/3
End;
Function F2(x:real):real; { Вторая функция }
Begin
F2:=Sqr(x)-1
End;
Function F2Proto(x:real):real; { Первообразная второй функции }
Begin
F2Proto:=x*(Sqr(x)-3)/3
End;
BEGIN
GraphDriver:=Detect; { Автоматическое определение драйвера }
InitGraph(GraphDriver,GraphMode,DriverPath);
{ Инициализация графического режима }
SetColor(White); { Установка белого цвета }
SetLineStyle(SolidLn,0,NormWidth);
{ Установка сплошной линии нормальной толщины }
Line(Round(a*ScaleX)+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F1(a)*ScaleY),
Round(a*ScaleX)+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F2(a)*ScaleY));
{ Левая граница трапеции }
for i:=Round(a*ScaleX) to Round(b*ScaleX) do { Построение трапеции }
Begin
if odd(i) then SetLineStyle(4,$AAAA,1)
else SetLineStyle(4,$5555,1);
(* Line(i+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F1(i/ScaleX)*ScaleY),
i+1+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F1((i+1)/ScaleX)*ScaleY));
{ График первой функции }
Line(i+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F2(i/ScaleX)*ScaleY),
i+1+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F2((i+1)/ScaleX)*ScaleY))
{ График второй функции } *)
Line(i+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F2((i+1)/ScaleX)*ScaleY),
i+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0);
Line(i+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F1((i+1)/ScaleX)*ScaleY),
i+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0)
End;
SetLineStyle(SolidLn,0,NormWidth);
{ Установка сплошной линии нормальной толщины }
Line(Round(b*ScaleX)+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F1(b)*ScaleY),
Round(b*ScaleX)+Round(GetMaxX/2)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(F2(b)*ScaleY));
{ Правая граница трапеции }
(* SetFillStyle(InterleaveFill,White);
{ Установка заполнения частой сеткой,белый цвет }
FloodFill(Round(GetMaxX/2)+DifferenceX0+Round((a+b)/2*ScaleX),
Round(GetMaxY/2)+DifferenceY0
-Round((F1((a+b)/2)+F2((a+b)/2))/2*ScaleY),
White); { Заполнение трапеции указанием ее средней точки } *)
OutTextXY(Round(0.47*GetMaxX)+DifferenceX0,3,'Y'); { Подпись оси Y }
Line(Round(GetMaxX/2)+DifferenceX0,0,Round(0.494*GetMaxX)+DifferenceX0,
Round(0.03*GetMaxY)); { Вывод стрелки на оси Y }
Line(Round(GetMaxX/2)+DifferenceX0,0,Round(0.506*GetMaxX)+DifferenceX0,
Round(0.03*GetMaxY));
Line(Round(GetMaxX/2)+DifferenceX0,0,Round(GetMaxX/2)+DifferenceX0,GetMaxY);
{ Ось Y }
Line(0,Round(GetMaxY/2)+DifferenceY0,GetMaxX,Round(GetMaxY/2)+DifferenceY0);
{ Ось X }
OutTextXY(GetMaxX-2-TextWidth('X'), { Подпись оси X }
Round(0.47*GetMaxY)-TextHeight('X')+DifferenceY0,'X');
SetFillStyle(SolidFill,Black); { Выбор заполнения черным цветом }
Bar(GetMaxX div 2+DifferenceX0-7-TextWidth('0'),
GetMaxY div 2+DifferenceY0+2,
GetMaxX div 2+DifferenceX0-2,
GetMaxY div 2+DifferenceY0+4+TextHeight('0'));
{ Закрашивание фона под "0" }
OutTextXY(GetMaxX div 2+DifferenceX0-3-TextWidth('0'),
GetMaxY div 2+DifferenceY0+4,'0'); { Выывод символа "0" }
Line(Round(0.98*GetMaxX),Round(0.491*GetMaxY)+DifferenceY0,
GetMaxX,Round(GetMaxY/2)+DifferenceY0); { Вывод стрелки на оси X }
Line(Round(0.98*GetMaxX),Round(0.509*GetMaxY)+DifferenceY0,
GetMaxX,Round(GetMaxY/2)+DifferenceY0);
for i:=-1 to 1 do { Разметка оси Y }
if i<>0 then { Исключение нуля }
begin
line(Round(0.49*GetMaxX)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(i*ScaleY),
Round(0.51*GetMaxX)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(i*ScaleY));
{ Прорисовка штрихов на оси Y }
Str(i,St); { Преобразование числа в строковую переменную }
Bar(Round(0.48*GetMaxX)+DifferenceX0-4-TextWidth(St),
Round(GetMaxY/2)+DifferenceY0-Round(i*ScaleY)
+TextHeight(St) div 2+2,
Round(0.48*GetMaxX)+DifferenceX0,
Round(GetMaxY/2)+DifferenceY0-Round(i*ScaleY)
-TextHeight(St) div 2-2);
{ Закрашивание фона под значением }
OutTextXY(Round(0.48*GetMaxX)+DifferenceX0-1-TextWidth(St),
Round(GetMaxY/2)+DifferenceY0-Round(i*ScaleY)
-TextHeight(St) div 2,St) { Вывод значения }
end;
for i:=-2 to 2 do { Разметка оси X }
if i<>0 then { Исключение нуля }
begin
line(Round(0.5*GetMaxX)+DifferenceX0+Round(i*ScaleX),
Round(0.49*GetMaxY)+DifferenceY0,
Round(0.5*GetMaxX)+DifferenceX0+Round(i*ScaleX),
Round(0.51*GetMaxY)+DifferenceY0);
{ Прорисовка штрихов на оси X }
Str(i,St); { Преобразование числа в строковую переменную }
OutTextXY(Round(0.5*GetMaxX)+DifferenceX0-TextWidth(St) div 2+
Round(i*ScaleX),
Round(0.53*GetMaxY)+DifferenceY0,St) { Вывод значения }
end;
OutTextXY(Round(0.52*GetMaxX)+DifferenceX0,
Round(0.2*GetMaxY)+DifferenceY0,'F=1-Sqr(x)'); { Подпись функций }
OutTextXY(Round(0.52*GetMaxX)+DifferenceX0,
Round(0.8*GetMaxY)+DifferenceY0,'F=Sqr(x)-1');
Assign(F,'otvet.txt');
{ Связывание файловой переменной с файлом result.pas }
Rewrite(F); { Открытие файла }
Otv:=(F1Proto(b)-F1Proto(a))-(F2Proto(b)-F2Proto(a));
{ Вычисление точного значения }
Writeln(F,'Точное значение ',Otv); { Вывод точного значения в файл }
Step:=(b-a)/N; { Вычисление шага разбиения }
OtvP:=0; { Обнуление интегральной суммы }
for i:=0 to N-1 do { Набор итегральной суммы по формуле прямоугольников }
OtvP:=OtvP+Step*(F1(a+Step*(i+0.5))-F2(a+Step*(i+0.5)));
Writeln(F,'Приближенное значение ',OtvP);
{ Вывод приближенного значения в файл }
Writeln(F,'Погрешность вычисления ',abs(Otv-OtvP));
{ Вычисление и вывод в файл погрешности вычисления }
Close(F); { Закрытие файла }
if ReadKey=' ' then; { Задержка до нажатия клавиши }
CloseGraph { Закрытие графического режима }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию