Современные технологии программирования |
Лабораторная работа №8 |
Лабораторная работа. Абстрактный тип данных (ADT) “полином”
Тема: Классы Object Pascal, стандартный класс Tlist.
Цель: Сформировать практические навыки: реализации абстрактных типов данных с помощью классов Object Pascal.
Спецификация абстрактного типа данных Полином.
ADT TPoly
Данные
Полиномы Tpoly - это неизменяемые полиномы с целыми коэффициентами.
Операции
Операции могут вызываться только объектом “полином” (тип TPoly), указатель на который передаётся в них по умолчанию. При описании операций этот объект в разделе “Вход” не указывается.
Таблица 1. Описание операций на ADT TPoly.
Наименование Операции |
Описание |
Конструктор |
|
Начальные значения: |
Коэффициент (с) и степень (n) одночленного полинома |
Процесс: |
Создаёт одночленный полином с коэффициентом (с) и степенью (n), или ноль-полином, если коэффициент (с) равен 0 и возвращает указатель на него. Например: Конструктор(6,3) = 6x^3 Конструктор(3,0) = 3 Конструктор() = 0 |
Выход: |
Указатель на созданный полином. |
Постусловия: |
Нет. |
Степень |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Отыскивает степень n полинома, т.е. наибольшую степень при ненулевом коэффициенте (c). Степень нулевого полинома равна 0. Например: a = (x^2+1), a.Степень = 2 |
Выход: |
n - целое число - степень полинома. |
Постусловия: |
Нет. |
Коэффициент |
|
Вход: |
n - целое число - степень полинома. |
Предусловия: |
Полином – не нулевой. |
Процесс: |
Отыскивает коэффициент (c) при члене полинома со степенью n (c*x^n). Возвращает коэффициент (c) найденного члена или 0, если n больше степени полинома. Например: p = (x^3+2x+1), p.Coeff (4) = 0 p = (x^3+2x+1), p.Coeff (1) = 2 |
Выход: |
Целое число. |
Постусловия: |
Нет. |
Сложить |
|
Вход: |
q - полином. |
Предусловия: |
Нет |
Процесс: |
Создаёт полином, являющийся результатом сложения полинома с полиномом q и возвращает его. |
Выход: |
Полином. |
Постусловия: |
Нет. |
Умножить |
|
Вход: |
q - полином. |
Предусловия: |
Нет. |
Процесс: |
Создаёт полином, являющийся результатом умножения полинома на полином q и возвращает его. |
Выход: |
Полином. |
Постусловия: |
Нет. |
Вычесть |
|
Вход: |
q - полином. |
Предусловия: |
Нет. |
Процесс: |
Создаёт полином, являющийся результатом вычитания из полинома полинома q и возвращает его. |
Выход: |
Полином. |
Постусловия: |
Нет. |
Минус |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Создаёт полином, являющийся разностью ноль-полинома и полинома и возвращает его. |
Выход: |
Полином. |
Постусловия: |
Нет. |
Равно |
|
Вход: |
q - полином. |
Предусловия: |
Нет. |
Процесс: |
Сравнивает полином с полиномом q на равенство. Возвращает значение True, если полиномы равны, т.е. имеют одинаковые коэффициенты при соответствующих членах, и значение False - в противном случае. |
Выход: |
Булевское значение. |
Постусловия: |
Нет. |
Дифференцировать |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Создаёт полином, являющийся производной полинома и возвращает его. Например: a = (x3+7x+5), a.Дифференцировать = 3x2+7 |
Выход: |
Полином. |
Постусловия: |
Нет. |
Вычислить |
|
Вход: |
x – действительное число. |
Предусловия: |
Нет. |
Процесс: |
Вычисляет значение полинома в точке x и возвращает его. Например: a = (x2+3x), а.Вычислить(2) = 10 |
Выход: |
Действительное число. |
Постусловия: |
Нет. |
Элемент |
|
Вход: |
i - целое число - номер члена полинома. |
Предусловия: |
Нет. |
Процесс: |
Обеспечивает доступ к члену полинома с индексом i для чтения его коэффициента (c) и степени (n) так, что если изменять i от 0 до количества членов в полиноме минус один, то можно просмотреть все члены полинома. |
Выход: |
Коэффициент – целое число, степень – целое число. |
Постусловия: |
Полином не модифицируется |
end Tpoly
Спецификация абстрактного типа данных Одночлен.
ADT TMember
Данные
Одночлен TMember - это изменяемые одночленные полиномы с целыми коэффициентами. Коэффициент и степень хранятся в полях целого типа FCoeff и FDegree соответственно.
Операции
Операции могут вызываться только объектом “одночлен” (тип TMember), указатель на который передаётся в них по умолчанию. При описании операций этот объект в разделе “Вход” не указывается.
Таблица 2. Описание операций на ADT TMember.
Наименование Операции |
Описание |
Конструктор |
|
Начальные значения: |
Коэффициент (с) и степень (n) одночленного полинома |
Процесс: |
Создаёт одночленный полином с коэффициентом (с) и степенью (n), или ноль-полином, если коэффициент (с) равен 0 и возвращает указатель на него. Например: Конструктор(6,3 = 6x^3 Конструктор(3,0) = 3 Конструктор() = 0 |
Выход: |
Указатель на созданный одночленный полином. |
Постусловия: |
Нет. |
ЧитатьСтепень |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Возвращает степень n одночленного полинома (содержимое поля FDegree). Степень нулевого полинома равна 0. Например: a = (1x^2), a.Степень = 2 |
Выход: |
n - целое число - степень полинома. |
Постусловия: |
Нет. |
ПисатьСтепень |
|
Вход: |
n - целое число - степень полинома. |
Предусловия: |
Нет. |
Процесс: |
Записывает степень n одночленного полинома в поле FDegree. |
Выход: |
Нет. |
Постусловия: |
Поле FDegree = n. |
ПисатьКоэффициент |
|
Вход: |
c - целое число - коэффициент полинома. |
Предусловия: |
Нет. |
Процесс: |
Записывает коэффициент c одночленного полинома в поле FCoeff. |
Выход: |
Нет. |
Постусловия: |
Поле FCoeff = c. |
Равно |
|
Вход: |
q - одночлен. |
Предусловия: |
Нет. |
Процесс: |
Сравнивает одночлен с одночленом q на равенство. Возвращает значение True, если одночлены равны, т.е. имеют одинаковые коэффициенты и степени, и значение False - в противном случае. |
Выход: |
Булевское значение. |
Постусловия: |
Нет. |
Дифференцировать |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Создаёт одночлен, являющийся производной одночлена и возвращает его. Например: a = (x3), a.Дифференцировать = 3x2 |
Выход: |
Одночлен. |
Постусловия: |
Нет. |
Вычислить |
|
Вход: |
x – действительное число. |
Предусловия: |
Нет. |
Процесс: |
Вычисляет значение одночлена в точке x и возвращает его. Например: a = (1x2), а.Вычислить(2) = 4 |
Выход: |
Действительное число. |
Постусловия: |
Нет. |
ОдночленВСтроку |
|
Вход: |
Нет. |
Предусловия: |
Нет. |
Процесс: |
Формирует строковое представление одночлена. |
Выход: |
Строка. |
Постусловия: |
Нет. |
end TMember
TPoly = class(TList)
private
function Get: String;virtual;
function GetMember(index: Cardinal): TMember;virtual;
procedure SetMember(index: Cardinal; E: TMember);virtual;
public
constructor Create(nc: Integer = 0; nd: Integer = 0);
destructor Destroy;override;
function Degree: cardinal;
function Coeff(n: Integer): Integer;
property Poly: String read Get;
function _Add(b: TPoly): TPoly;//Операция Сложить.
function Sub(b: TPoly): TPoly;// Операция Вычесть.
function Minus: TPoly;// Операция Минус.
function Mul(b: TPoly): TPoly;// Операция Умножить.
function Diff: TPoly;// Операция Дифференцировать.
function Eval(v: Real): Real;// Операция Вычислить.
function Eqval(b: TPoly): Boolean;// Операция Равно.
property Member[index: Cardinal]: TMember read GetMember;
//Операция Элемент.
private
procedure RemoveZero;//Удаляет члены с нулевыми //коэффициентами.
procedure Likeness;//Приведение подобных.
procedure Invar;//Преобразует полином к стандартному виду:
//упорядочен, приведены подобные, удалены нулевые //члены.
procedure AddCopies(b: TPoly; k: Integer);//добавляем копии //элементов b в хвост.
function MulNum(Num: TMember): TPoly;//Умножение //полинома на одночлен.
end;
TMember = class
// Реализует одночлен вида FCoeff * X^ FDegree.
private
FDegree: Integer;//Степень одночлена.
FCoeff: Integer;//Коэффициент одночлена.
function Get: String;
//Операция ОдночленВСтроку.
function GetCoeff: Integer;
//Операция ЧитатьКоэффициент (поля FCoeff).
function GetDegree: Integer;
//Операция ЧитатьСтепень (поля FDegree).
procedure SetDegree(nd: Integer);
//Операция ПисатьСтепень (поля FDegree).
procedure SetCoeff(nc: Integer);
//Операция ПисатьКоэффициент (поля FCoeff).
public
function Diff: TMember;
//Операция Дифференцировать.Дифференцирование одночлена.
function Value(v: Real): Real;
//Операция Вычислить. Вычисляет значение одночлена.
property Coeff: Integer read GetCoeff write SetCoeff;
//Операция для чтения и записи коэффициента (поля FCoeff).
property Degree: Integer read GetDegree write SetDegree;
//Операция для чтения и записи степени (поля FDegree).
property Member: String read Get;
//Операция ОдночленВСтроку. Свойство для чтения одночлена в
//строковом формате.
function Eq(b: TMember): Boolean;
//Операция Равно. Сравнение одночлена с одночленом b.
constructor Create(nd: Integer = 0;nc: Integer = 0);
end;
В режиме консольного приложения
Тестовые наборы поместите в таблицу следующего вида:
Таблица 3. Тестовый набор для тестирования операции Умножить на типе полином.
Тестовый набор для тестирования операции Умножить полиномы |
||||
Номер теста |
Исходные данные |
Ожидаемый результат |
||
Вход |
Полином |
Возвращаемое значение |
Полином |
|
1 |
0*X^0 |
0*X^0 |
0*X^0 |
0*X^0 |
2 |
0*X^0 |
1*X^0 |
0*X^0 |
1*X^0 |
3 |
1*X^0 |
1*X^0 |
1*X^0 |
1*X^0 |
4 |
1*X^0 |
2*X^1 |
2*X^1 |
2*X^1 |
5 |
1*X^0 |
2*X^1+3*X^2 |
2*X^1+3*X^2 |
2*X^1+3*X^2 |
6 |
1*X^0+1*X^1 |
1*X^0-1*X^1 |
1*X^0-1*X^2 |
1*X^0-1*X^1 |