Простой пример объектно-ориентированного программирования
Разработаем модуль решения линейных, квадратных и биквадратных уравнений в области вещественных чисел для любых вещественных коэффициентов (в том числе и нулей).
Разработка структурной организации объектов
В ООП линейное уравнение вида a1x+a0=0 и его решение можно определить как совокупность полей, представляющих собой
- коэффициент при неизвестном a1,
- свободный член a0,
- значение единственного корня x1,
- количество корней k (значение минус 1 – множество корней, 0 – корней нет, 1 – один корень),
и методов, осуществляющих
- задание полей a1 и a0 (метод INIT),
- решение линейного уравнения – формирование полей x1 и k (метод LINUR),
- вывод решения на экран (метод PRINT).
Объектный тип для решения линейного уравнения назовем именем TLINUR.
Объектный тип для решения квадратного уравнения вида a2x2+a1x+a0=0 (дадим имя TKVUR) построим на базе типа TLINUR. При определении типа TKVUR добавим следующие поля:
- коэффициент a2 при квадрате неизвестного,
- значение второго корня x2,
переопределим метод INIT, так как необходимо задавать значения трех исходных данных
и добавим методы:
- решение квадратного уравнения KVUR,
- вывод решения на экран, использующий ранее определенный метод PRINT (метод PRINT2).
Объектный тип TBIKVUR для решения биквадратного уравнения вида a2x4+a1x2+a0=0 построим на базе типа TBIKVUR. При этом добавим поля для возможных третьего и четвертого корней х3 и х4 и методы BIKVUR – решение биквадратного уравнения и PRINT4 – вывод решений биквадратного уравнения на экран, использующий ранее определенный метод PRINT2.
Исходя из вышесказанного, определим объектные типы следующим образом
type {линейное уравнение}
tlinur=object
a0,a1:real;{свободный член и коэффициент при х}
k:integer; {количество корней – минус 1, 0, 1}
x1:real; {значение корня}
procedure init (a,b:real); {инициализация}
procedure linur; {решение линейного уравнения}
procedure print; {вывод решения на экран}
end;
{квадратное уравнение}
tkvur=object(tlinur)
a2,x2:real; {коэффициент при квадрате неизвестного и второй корень}
procedure init(a,b,c:real); {инициализация}
procedure kvur; {решение квадратного уравнения}
procedure print2; {вывод решения на экран}
end;
{биквадратное уравнение}
tbikvur=object(tkvur)
x3,x4:real; {третий и четвертый корни}
procedure bikvur; {решение биквадратного уравнения}
procedure print4; {вывод решения на экран}
end;
Структура данных для объекта типа линейное уравнение (TLINUR):
a0 | ? | 6Б |
a1 | ? | 6Б |
k | ? | 2Б |
x1 | ? | 6Б |
Адреса методов для объектов типа TLINUR:
@TLINUR.INIT | 4Б | |
@TLINUR.LINUR | 4Б | |
@TLINUR.PRINT | 4Б |
Объектный тип TKVUR наследует все поля типа TLINUR, после этого добавляются собственные поля а2 и х2. Поэтому структура данных для объекта нового типа:
a0 | ? | 6Б |
a1 | ? | 6Б |
k | ? | 2Б |
x1 | ? | 6Б |
а2 | ? | 6Б |
х2 | ? | 6Б |
При наследовании методов собственный метод INIT заменяет одноименный родительский метод и добавляются методы KVUR и PRINT2.
@TKVUR.INIT | 4Б | |
@TLINUR.LINUR | 4Б | |
@TLINUR.PRINT | 4Б | |
@TKVUR.KVUR | 4Б | |
@TKVUR.PRINT2 | 4Б |
Структура данных для объекта типа TBIKVUR – биквадратного уравнения выглядит так:
a0 | ? | 6Б |
a1 | ? | 6Б |
k | ? | 2Б |
x1 | ? | 6Б |
а2 | ? | 6Б |
х2 | ? | 6Б |
x3 | ? | 6Б |
x4 | ? | 6Б |
Таблица методов для типа TBIKVUR:
@TKVUR.INIT | 4Б | |
@TLINUR.LINUR | 4Б | |
@TLINUR.PRINT | 4Б | |
@TKVUR.KVUR | 4Б | |
@TKVUR.PRINT2 | 4Б | |
@TBIKVUR.BIKVUR | 4Б | |
@TBIKVUR.PRINT4 | 4Б |
Разработка методов
Метод инициализации линейного уравнения
I. Спецификация
1. Назначение: заполнение полей а1 (коэффициент при неизвестном х) и а0 (свободный член) исходными данными.
2. Имя: INIT
3. Вид: процедура
4. Перечень параметров (все параметры входные):
Назначение | Имя | Тип | Вид |
Значение коэффициента при неизвестном х | a | real | параметр-значение |
Значение свободного члена | b | real | параметр-значение |
5. Заголовок: PROCEDURE INIT(a,b:REAL);
II. Метод решения
1) a1:=a
2) a0:=b
V. Программная модель
procedure tlinur.init(a,b:real);
begin
a1:=a;
a0:=b
end;
Метод решения линейного уравнения
I. Спецификация
1. Назначение: решение линейного уравнения вида a1x+a0=0 для любых вещественных a1 и a0
- Имя: LINUR
- Вид: процедура
- Перечень параметров: без параметров
- Заголовок: PROCEDURE LINUR;
II. Метод решения
V. Программная модель
procedure tlinur.linur;
begin
if a1<>0 then
begin
k:=1;
x1:=-a0/a1
end
else
if a0=0 then k:=-1
else k:=0
end;
Метод вывода решения линейного уравнения
I. Спецификация
1. Назначение: вывод на экран результатов решения линейного уравнения
- Имя: PRINT
- Вид: процедура
- Перечень параметров: без параметров
- Заголовок: PROCEDURE PRINT;
II. Метод решения
выбор по значению k из вариантов
V. Программная модель
procedure tlinur.print;
begin
case k of
-1:writeln('любое значение');
0:writeln('решений нет');
1: writeln('один корень=',x1)
end
end;
Метод инициализации квадратного уравнения
I. Спецификация
1. Назначение: заполнение полей а2 (коэффициент при квадрате х), а1 (коэффициент при неизвестном х) и а0 (свободный член) исходными данными.
2. Имя: INIT
3. Вид: процедура
4. Перечень параметров (все параметры входные):
Назначение | Имя | Тип | Вид |
Значение коэффициента при квадрате неизвестного x | a | real | параметр-значение |
Значение коэффициента при неизвестном х | b | real | параметр-значение |
Значение свободного члена | с | real | параметр-значение |
5. Заголовок: PROCEDURE INIT(a,b,c:REAL);
II. Метод решения
1) a2:=a
2) a1:=b
3) a0:=c
V. Программная модель
procedure tkvur.init(a,b,c:real);
begin
a2:=a;
a1:=b;
a0:=c
end;