Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование. Модуль GRAPH. Модульное и объектное программирование. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
841 Кб
Скачать

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

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]