Описание программы
Программа использует класс Spisok
class Spisok
{
private:
node *phead; //указатель на начало списка .
node *pend;
node *cursosr;
node *Res; //указатель на найденное звено .
int N_monom;
public:
Spisok() {phead = new (node); (*phead).next=NULL;} //конструктор
~Spisok() { delete phead; } //деструктор.
void Initial(node **first, node **last);
int Empty(node *first);
void Add(node **last,int elem, unsigned int pol);
void Show(node *first);
int Poisk_Eqv (node *first,unsigned int pol,node **last);
int Poisk_Less (node *first,int el,node **last);
void Izm (node *Res, int el,unsigned int pol);
void DelAll(node *first, node **last);
void AddLess (node **Res, int el,unsigned int pol);
int Next (node *first,int el,node **last);
void Del1 ();
};
Описание алгоритма
Работа программы начинается с вывода основного меню. Для начала работы выбирается пункт
"1.Операции"
При этом осуществляется запрос имени файла, где хранится описание полинома.
Ввод полинома. Ввод полинома реализуется как текстовая строка с формульным выражением, описывающим вводимый полином. Форма задания полинома производится образом, аналогичным примеру:
P='x7y2z1+3x2z1-6y2-3z9 '
Q='-7x2z1+6y2+5'
Коэффициенты мономов имеют целочисленный тип. При вводе полинома производится синтаксический разбор строки и приведение монома к стандартному виду – коэффициент со знаком и свертка.
Вывод полинома. Вывод полинома осуществляется обходом списка и печатью коэффициента и степеней переменных каждого монома. Следует отметить, что голова полинома играет роль барьера при обходе списка: цикл завершается, когда текущим звеном окажется головное звено.
Рекомендуемая форма печати полинома состоит в представлении полинома в виде текстовой строки с формульным выражением, описывающим полином. Например, полином P(x,y,z) из контрольного примера может быть представлен как строка:
P(x,y,z)='x7y2z1-4x2z1-3x9+5'
Реализация алгоритмов обработки полиномов организуется путем следующих шагов
Производится считывание исходной строки полинома с stdin ()
Выполняется анализ исходной строки на наличие запрещенных символов
Организуется однонаправленный список мономов многочлена каждый элемент которого содержит коэффициент монома, свертку степеней переменных и ссылку на следующий элемент. При создании списка производится нормализация полинома по совпадающим сверткам и его реорганизация в соответствии с убыванием модуля сверток
Если свернутые степени мономов совпадают, то осуществляется приведение подобных членов: к коэффициенту монома полинома P прибавляется коэффициент монома полинома Q. Если при этом сумма коэффициентов оказывается равной нулю, то соответствующий моном полинома P исключается из списка.
Для полиномов реализованы следующие функции:
Сложение и вычитание
Умножение
Взятие производной. Для сложения полиномов P и Q производится одновременный обход обоих списков, начиная с головных звеньев, по правилу слияния упорядоченных массивов. Сумма формируется на месте первого слагаемого (P). При этом, если свернутая степень текущего монома полинома Q больше свернутой степени текущего монома полинома P, то копия монома полинома Q вставляется в полином P; в полиноме Q осуществляется переход на следующее звено. Если свернутая степень текущего монома полинома P больше свернутой степени текущего монома полинома Q, то в полиноме P осуществляется переход на следующее звено. Если свернутые степени текущих мономов полиномов P и Q совпадают, то осуществляется приведение подобных членов: к коэффициенту монома полинома P прибавляется коэффициент монома полинома Q. Если при этом сумма коэффициентов оказывается равной нулю, то соответствующий моном полинома P исключается из списка. В обоих списках осуществляется переход к следующему звену. Для реализации операций вставки и удаления звеньев в односвязных списках необходимы указатели как текущего, так и предыдущего звеньев.
Удаление полинома. При удалении полинома предлагается немедленно возвращать освободившуюся память в кучу. В этом случае не образуется мусор из освободившихся звеньев. При удалении полинома осуществляется обход списка аналогично предыдущей операции, и каждое звено возвращается в кучу процедурой Dispose(q).