Программирование. Модуль GRAPH. Модульное и объектное программирование. Учебно-методическое пособие
.pdf
71
Создать абстрактный объект Body (тело) с виртуальными методами вычисления площади поверхности и объема. Создать производные объекты Parallelepiped (параллелепипед) и Ball (шар) со своим функциями площади поверхности и объема.
Вариант №4.
Создать абстрактный объект Currency (валюта)для работы с денежными суммами. Определить виртуальные методы перевода в рубли и вывода на экран. Реализовать производные объекты Dollar (доллар) и Euro (евро) со своими функциями перевода и вывода на экран.
Вариант №5.
Создать абстрактный базовый объект Triangle для представления треугольника с виртуальными функциями вычисления площади и периметра. Поля данных должны включать две стороны и угол между ними. Определить объекты наследники: прямоугольный треугольник, равнобедренный треугольник, равносторонний треугольник со своими функциями вычисления площади и периметра.
Вариант №6.
Создать абстрактный базовый объект Root (корень) с виртуальными методами вычисления корней и вывода результата на экран. Определить производные объекты Linear (линейное уравнение) и Square (квадратное уравнение) с собственными методами вычисления корней и вывода на экран.
Вариант №7.
Создать абстрактный объект Function (функция) с виртуальными методами вычисления функции y f (x) в заданной точке x и вывода
результата на экран. Определить производные объекты Ellipse (эллипс) и
Hyperbola (гипербола) с собственными функциями |
вычисления |
y |
в |
|||||||||
зависимости от входного параметра |
x . Уравнение эллипса: |
x2 |
|
|
y2 |
|
1; |
|||||
a2 |
|
|
b2 |
|||||||||
гиперболы: |
x2 |
|
y2 |
1. |
|
|
|
|
|
|
|
|
a2 |
|
b2 |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
||
Вариант №8. |
|
|
|
|
|
|
|
|
|
|||
Создать |
абстрактный объект |
Integer (целое) |
с виртуальными |
|||||||||
арифметическими операциями и функцией вывода на экран. Определить производные объекты Decimal (десятичное) и Binary (двоичное), реализующие собственные арифметические операции и функцию вывода на экран. Число представляется массивом, каждый элемент которого – цифра.
Вариант №9.
Создать абстрактный объект Series (прогрессия) с виртуальными функциями вычисления j элемента прогрессии и суммы прогрессии.
Определить производные объекты: Linear (арифметическая) и Exponential
|
|
72 |
|
|
|
(геометрическая). (Арифметическая прогрессия |
a j a0 |
jd , j |
0,1,2,... |
||
Сумма |
арифметической |
прогрессии: |
Sn |
(n 1)(a0 |
an ) / 2 . |
Геометрическая прогрессия: a j |
a0r j , j 0,1,2,... Сумма геометрической |
||||
прогрессии: Sn (a0 an r) /(1 r) ). |
|
|
|
||
Вариант №10.
Создать абстрактный объект Norm с виртуальной функцией вычисления нормы и модуля. Определить производные объекты Complex, Vector3D с собственными функциями вычисления нормы и модуля. (Модуль для комплексного числа вычисляется как корень из суммы квадратов действительной и мнимой частей; норма для комплексных чисел вычисляется как модуль в квадрате. Модуль вектора вычисляется как корень квадратный из суммы квадратов координат; норма вектора вычисляется как максимальное из абсолютных значений координат).
Вариант №11.
Создать абстрактный объект Pair с виртуальными арифметическим операциями. Реализовать производные объекты Complex (Задание 3 Вариант№6) и Rational (Задание 3 Вариант№5).
Вариант №12.
Создать абстрактный объект Pair с виртуальными арифметическим операциями. Реализовать производные объекты FazzyNumber (Задание 3 Вариант№7) и Fraction (Задание 3 Вариант№9).
Порядок выполнения расчетно-графического задания
Каждый отчет оформляется в виде пояснительной записки и должен содержать следующие элементы:
1)титульный лист;
2)текст пояснительной записки в машинописном или рукописном виде;
3)машинный листинг программы на языке PASCAL - в виде приложения.
4)реализация данной задачи в виде исходного файла на языке Турбо Паскаль (Borland Pascal).
Содержание пояснительной записки
1.Постановка задачи.
2.Краткие теоретические сведения об особенностях применяемых операторов и методов (теоретическое введение).
3.Описание программы:
3.1. Общие сведения (язык программирования, операционная система, тип процессора);
73
3.2.Описание логической структуры программы;
3.3.Описание алгоритма решения задачи (в виде блок-схемы);
3.4.Описание входных и выходных данных программы;
3.5.Описание подпрограмм;
3.6.Тестовые примеры.
Примеры выполнения расчетно-графическое задания
Пример 1. Разработать алгоритм и программу вывода на экран графика функции y(x) ex .
Программа построения графика функции.
Program Grafik; Uses
Graph, Crt; Var
Ga, Gm, Error: Integer; X, Y:Real;
A, Mx, Mx01, Mx03, Mx09, Msx: Integer; My, My09, My005, Msy, I: Integer;
St: String[4]; Begin
Ga:=Detect;
Gm:=Detect;
{Инициализация графического драйвера}
Initgraph(Ga, Gm, 'C:\Bp\Bgi'); Error:=GraphResult;
{Анализ успешности графического режима}
If Error<>Grok Then Begin
Writeln('Ошибка'); Halt;
End;
{Определение используемых значений}
Mx:=GetMaxX;
Mx01:=Round(0.1*Mx);
Mx03:=Round(0.3*Mx);
Mx09:=Round(0.9*Mx);
My:=GetMaxY;
My09:=Round(0.9*My);
My005:=Round(0.05*My);
SetColor(12); {розовый} {---------------Рисование осей----------------}
|
74 |
|
|
|
|
|
Line(5, My09, Mx-10, My09); {--X-- |
} |
|
|
|
|
|
Line(Mx03, My005, Mx03, My-9); {-- |
Y--} |
|
|
|
|
|
{ |
-------------Рисование стрелок-------------- |
|
} |
|
|
|
Line(Mx-20, My09-3, Mx-10, My09); {-- |
X-- |
\} |
|
|
||
Line(Mx-20, My09+3, Mx-10, My09); {-- |
X-- |
/} |
|
|||
Line(Mx03, My005, Mx03-3, My005+10); {/-- |
Y-- |
} |
||||
Line(Mx03, My005, Mx03+3, My005+10); {\-- |
Y-- |
} |
||||
{---------- |
Надписи по осям X и Y----------- |
} |
|
|
|
|
SetTextStyle(0, 0, 2); |
|
|
|
|
|
|
SetColor(14); {белый} |
|
|
|
|
|
|
OutTextXY(Mx03-40, My005, 'Y'); |
|
|
|
|
||
OutTextXY(Mx-40, My09-25, 'X'); |
|
|
|
|
|
|
SetTextStyle(0, 0, 1); |
|
|
|
|
|
|
SetColor(12); |
|
|
|
|
|
|
{--------------- |
Разметка оси Y---------------- |
|
|
} |
|
|
Msy:=Round(My09/5); {масштаб по оси Y} Y:=-0.5; {начальное значение Y}
While Y<=4.501 Do Begin
Str(Y: 4: 1, St); {строка для надписи по Y} A:=Round(My09-Msy*Y); {ордината в пикселях} Line(Mx03+3, A, Mx03-3, A); {четрочки по оси Y} OutTextXY(Mx03-40, A-3, St);
Y:=Y+0.5;
|
End; |
|
{ |
---------------Разметка оси X---------------- |
} |
Msx:=Round(Mx09/2); X:=-0.6; {масштаб по оси X} While X<=1.401 Do
Begin
Str(X: 4: 1, St); {строка для надписи по X} A:=Round(Mx03+Msx*X); {абцисса в пикселях} Line(A, My09+3, A, My09-3); {четрочки по оси X} OutTextXY(A, My09+15, St);
X:=X+0.2;
|
End; |
|
SetColor(2); {зеленый} |
|
|
{ |
----------начало рисование кривой |
-----------} |
X:=-0.6; {начальное значение X} |
|
|
While X<=1.4 Do |
|
|
|
Begin |
|
Y:=Exp(X); {Рисование точки}
75
PutPixel(Round(Mx03+Msx*X), Round(My09-Msy*Y), 2);
X:=X+0.001;
If Abs(X)<1E-8 Then
X:=0;
End;
SetColor(15);
While Not KeyPressed Do;
CloseGraph;
End.
Пример 2. Дана формула для вычисления значений функции:
arcsin x |
x |
1 3 5 (2n 1)x2n 1 |
x |
x3 |
|
|
1 3x5 |
|
1 3 5x |
7 |
... |
||||||||||
2 4 6 |
(2n)(2n |
1) |
2 3 |
2 |
4 5 |
2 4 6 |
7 |
||||||||||||||
|
|
|
n 0 |
|
|
||||||||||||||||
|
|
1. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Для |
x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
Начальное значение ряда a0 |
x . Рекуррентная формула для |
|
|
||||||||||||||||
вычисления очередного i - члена: |
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
(2 i |
1) x2 |
|
b |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
bi |
bi 1 |
|
|
|
|
, ai |
i |
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 i |
2 i |
1 |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
Программа ZAD_2.EXE предназначена для вычисления значения |
|||||||||||||||||||
функции arcsin x с заданной степенью точности |
. Аргумент функции x |
||||||||||||||||||||
изменяется от x0 |
0.9 до xn 0.9 с шагом h |
0.1. Точность вычислений |
|||||||||||||||||||
10 3 . Вывод результата вычислений производится в текстовый файл
REZ.TXT.
Программа.
Текст PAS - файла модуля с функциями.
Interface Uses
Crt;
{$F+} {Подключение дальнего вызова подпрограмм} {Определение процедурного типа параметра:}
Type
Func=Function(x:Real;n:Integer):Real;
Var
X,eps: Real; i: Integer;
Function Step(x:Real;n:Integer):Real; Function Pcht(n:Integer):Real; Function Pncht(n:Integer):Real; Function Masin(x:Real;n:Integer):Real; Function Asin_w(x,eps:real):real; Function Asin_r(x,eps:real):real;
|
76 |
|
|
Function SW(x,eps:Real;n:Integer;fn:Func):Real; |
|
|
|
Function SR(x,eps:Real;n:Integer;fn:Func):Real; |
|
|
|
Function SRek(x,eps:Real;n:Integer;fn:Func):Real; |
|
|
|
{----------------- |
Исполняемая часть модуля--------------------------- |
} |
|
Implementation |
|
|
|
{------------------ |
Вычисление x в степени n>0----------------------- |
} |
|
Function Step(x:Real;n:Integer):Real; |
|
|
|
Begin |
|
|
|
|
If n=0 Then |
|
|
|
step:=1 |
|
|
|
Else |
|
|
|
Step:=x*Step(x,n-1); {рекурсия} |
|
|
End; |
|
|
|
{------- |
Рекурсивная функция вычисления произведения четных чисел |
------} |
|
Function Pcht(n:Integer):Real; |
|
|
|
Begin |
|
|
|
|
If n=0 Then |
|
|
|
Pcht:=1 |
|
|
|
Else |
|
|
|
If n=1 Then |
|
|
|
Pcht:=2 |
|
|
|
Else |
|
|
|
Pcht:=2*n*Pcht(n-1); {рекурсия} |
|
|
End; |
|
|
|
{-----Рекурсивная функция вычисления произведения нечетных чисел-----}
Function Pncht(n:Integer):Real; |
|
|
Begin |
|
|
|
If n=0 Then |
|
|
Pncht:=1 |
|
|
Else |
|
|
If n=1 Then |
|
|
Pncht:=1 |
|
|
Else |
|
|
Pncht:=(2*n-1)*Pncht(n-1); {рекурсия} |
|
End; |
|
|
{------------- |
Вычисление очередного члена ряда------------------------ |
} |
Function Masin(x:Real;n:Integer):Real; |
|
|
Begin
{вызов рекурсивных функций}
Masin:=Step(x,2*n+1)*Pncht(n)/(Pcht(n)*(2*n+1));
End; |
|
|
{--------- |
Суммирование с While и рекуррентной формулой---------------- |
} |
Function Asin_w(x,eps:Real):Real; |
|
|
77
Var
S,A,B:Real;
i:Integer; {номер очередного члена ряда}
Begin
S:=0; B:=x; A:=x; {установка начальных значений} i:=1;
While (Abs(A)>=eps) Do Begin
S:=S+A; {определение значения суммы} B:=B*Sqr(x)*(2*i-1)/(2*i); {определение очередного}
A:=B/(2*i+1); {члена ряда} i:=i+1;
|
End; |
|
|
|
Asin_w:=s; {возврат результата} |
|
|
End; |
|
|
|
{--------- |
Суммирование с Repeat и рекуррентной формулой--------------- |
} |
|
Function Asin_r(x,eps:Real):Real; |
|
|
|
Var |
|
|
|
|
S,A,B:Real; |
|
|
|
i:INTEGER; {номер очередного члена ряда} |
|
|
Begin |
|
|
|
|
S:=0; B:=x; A:=x; {установка начальных значений} |
|
|
|
i:=1; |
|
|
|
Repeat |
|
|
|
S:=S+A; {определение значения суммы} |
|
|
|
B:=B*Sqr(x)*(2*i-1)/(2*i); {определение очередного} |
|
|
|
A:=B/(2*i+1); |
{члена ряда} |
|
|
i:=i+1; |
|
|
|
Until (Abs(A)<=eps); |
|
|
|
Asin_r:=s; {возврат результата} |
|
|
End; |
|
|
{--------- |
Суммирование While и процедурным параметром----------------- |
} |
Function SW(x,eps:Real;n:Integer;fn:Func):Real; |
|
|
Var |
|
|
|
S:Real; |
|
Begin |
|
|
|
S:=0; |
|
|
While (Abs(fn(x,n))>=eps) Do |
|
Begin |
{Определение:} |
|
|
S:=S+fn(x,n); |
{текущего значения суммы} |
|
n:=n+1; |
|
End;
SW:=S; {возврат результата}
|
78 |
|
End; |
|
|
{--------- |
Суммирование с Repeat и процедурным параметром-------------- |
} |
Function SR(x,eps:Real;n:Integer;fn:Func):Real; |
|
|
Var |
|
|
|
S:Real; |
|
Begin
S:=0;
Repeat S:=S+fn(x,n); n:=n+1;
Until (Abs(fn(x,n))<=eps); SR:=S;
End; |
|
|
|
|
|
|
|
|
{--------- |
Рекурсивное суммирование с процедурным параметром----------- |
} |
||||||
Function SRek(x,eps:Real;n:Integer;fn:Func):Real; |
|
|
|
|||||
Begin |
|
|
|
|
|
|
|
|
|
If (Abs(fn(x,n))<=eps) Then |
|
|
|
|
|
||
|
|
|
|
SRek:=fn(x,n) |
|
|
|
|
|
|
|
Else |
|
|
|
|
|
|
|
|
|
SRek:=fn(x,n)+Srek(x,eps,n+1,fn); |
|
|||
|
|
|
{Рекурсия} |
|
|
|
|
|
End; |
|
|
|
|
|
|
|
|
{----Программа тестирования модуля ASIN.TPU------------------------- |
|
} |
|
|||||
Program ZD_2; |
|
|
|
|
|
|
|
|
Uses |
|
|
|
|
|
|
|
|
|
ASIN; {Подключение модулей} |
|
|
|
|
|||
Begin |
|
|
|
|
|
|
|
|
|
Assign(Output,'c:\Bp\Bin\Zad1\Rez.txt'); |
|
|
|
||||
|
Rewrite(Output); |
|
|
|
|
|
|
|
|
x:=-0.9; {Начальное значение аргумента x} |
|
|
|
||||
|
eps:=0.0001; {Точность} |
|
|
|
|
|
||
|
Writeln('+------- |
+------- |
+------- |
+--------- |
+---------- |
+------- |
+'); |
|
|
Writeln('| x |
| while | repeat| while_p | repeat_p | Rekur |'); |
|
|||||
|
Writeln('+------- |
+------- |
+------- |
+--------- |
+---------- |
+------- |
+'); |
|
|
While (x<1) do |
|
|
|
|
|
|
|
|
Begin |
|
|
|
|
|
|
|
|
|
If x<0 Then l:=4 |
|
|
|
|
|
|
|
|
Else l:=7; |
|
|
|
|
|
|
|
|
Writeln('|',x:l:4,'|',Asin_w(x,eps):l:4,'|',Asin_r(x,eps):l:4,'|',S |
||||||
|
W(x,eps,0,Masin):l:4,' |
|
|
','|',SR(x,eps,0,Masin):l:4,' |
||||
|
','|',SRek(x,eps,0,Masin):l:4,'|'); |
|
|
|
|
|||
|
|
Writeln('+------- |
+------- |
+------- |
+--------- |
+---------- |
+------- |
+'); |
x:=x+0.1; {Шаг вычисления}
79
End;
Close(Output);
End.
Пример 3. Создать объект Vector (Вектор) для работы с n-мерными действительными векторами. В объекте должны быть представлены поля: количество элементов вектора, элементы действительного вектора. Реализовать методы: сложение двух векторов, умножение вектора на действительное число, скалярное произведение двух векторов.
|
Операции над векторами: |
|
|
|
|||
1. |
Сложение двух векторов: если a |
(a1, a2 ,..., an ) , b (b1 ,b2 ,..., bn ) , то a b |
|||||
будет вектор c |
(c1 ,c2 ,..., cn ) , где ci |
ai |
bi . |
|
|||
2. |
Умножение вектора на действительное число: если a |
(a1, a2 ,..., an ) , то |
|||||
|
a будет вектор b |
(b1 ,b2 ,..., bn ) , где bi |
ai . |
|
|||
3. |
Скалярное |
произведение двух |
векторов: если |
a (a1, a2 ,..., an ) , |
|||
|
|
|
|
n |
|
|
|
b |
(b1 ,b2 ,..., bn ) , то a |
b |
aibi . |
|
|
|
|
|
|
|
|
i 1 |
|
|
|
Поле – элементы действительного вектора определим с помощью указателя на одномерный динамический массив действительных значений.
Сформируем модуль, где будет храниться тип-объект Vector, и тестирующую программу.
Текст PAS- файла модуля:
{$R-} |
|
{- отключение контроля границ массива} |
|
Unit MVector; |
{- имя модуля} |
|
|
{---------------- |
Интерфейсная часть модуля-------------------------- |
} |
|
Interface |
|
|
|
Uses Crt; |
|
|
|
Type |
|
|
|
TArray=Array[1..1] of Real; {- тип массива} PArray=^TArray; {- тип указателя на массив} Vector=Object {Объект вектор:}
M:Integer; {- количество компонент вектора} Komp:PArray; - динамическая переменная,}
Procedure Init(A:Integer); {- метод инициализации}
Procedure Scanf; {- метод - ввод элементов вектора} Procedure Printf; {- метод - вывод элементов вектора} Procedure Delete; {- метод - обнуление указателя}
Procedure Sum(V1,V2:Vector); Procedure Mul(A:Integer);
Procedure Product(V1,V2:Vector;Var S:Real);
|
End; |
|
{ |
-----------------Исполняемая часть модуля--------------------------- |
} |
|
|
80 |
|
|
Implementation |
|
|
|
|
{-------------------- |
Метод инициализации----------------------------- |
} |
|
|
Procedure Vector.Init; |
|
|
|
|
Begin |
|
|
|
|
|
M:=A; {- количество элементов вектора} |
|
|
|
|
GetMem(Komp,M*SizeOf(Real)); {- выделение ОП для Komp^} |
|
||
End; |
|
|
|
|
{------------ |
Метод – ввод элементов вектора с клавиатуры------------ |
|
} |
|
Procedure Vector.Scanf; |
|
|
|
|
Var I:Integer; |
|
|
|
|
Begin |
|
|
|
|
|
For I:=1 To M Do |
|
|
|
|
Read(Komp^[I]); |
|
|
|
End; |
|
|
|
|
{---------------- |
Метод – вывод элементов вектора на экран------------ |
|
} |
|
Procedure Vector.Printf; |
|
|
|
|
Var I:Integer; |
|
|
|
|
Begin |
|
|
|
|
|
If Komp=Nil Then |
|
|
|
|
Begin |
|
|
|
|
Writeln(‘Не заданы элементы вектора’); |
|
|
|
|
Exit; |
|
|
|
|
End; |
|
|
|
|
For I:=1 To M Do |
|
|
|
|
Write(Komp^[I]:7:3); |
|
|
|
End; |
|
|
|
|
{---------- |
Метод – освобождение ОП для поля элементов вектора--------- |
} |
||
Procedure Vector.Delete; |
|
|
|
|
Begin |
|
|
|
|
|
FreeMem(Komp,M*SizeOf(Real));{- освобождение ОП Komp^} |
|||
|
Komp:=Nil; |
{- обнуление указателя} |
|
|
End; |
|
|
{------------------ |
Метод – сумма двух векторов------------------------ |
} |
Procedure Vector.Sum; |
|
|
Var I:Integer; |
|
|
Begin |
|
|
|
For I:=1 To M Do |
|
|
Komp^[I]:=V1.Komp^[I]+V2.Komp^[I]; |
|
End; |
|
|
{--------- |
Метод – умножение вектора на действительное число----------- |
} |
Procedure Vector.Mul; |
|
|
Var I:Integer; |
|
|
Begin |
|
|
