Перейти к основному содержимому

Полиномы

Алиас: Полиномы.

Задание

Написать программу ввода и оперирования полиномами, состоящими из термов. Для этого разработать классы Term и Polynomial, описание которых представлено ниже.

осторожно

В работе запрещено использование контейнеров STL (vector, list и др.).

В данной работе можно использовать самостоятельно разработанный вектор из предыдущей работы. Перед этим настоятельно рекомендуется изучить статью о линковке шаблонного класса и его специализации.

Ввод полинома

  • Термы полинома могут вводиться в любом порядке.
  • Во вводимом терме может присутствовать отрицательные коэффициенты, например, -1.
  • Терм (член полинома одного порядка) может складываться с другим термом. Например: 3x^2 – x^2, -3x^2 + x^2.
  • Пробелы при вводе могут появляться где угодно.
к сведению

Обратите внимание, что по заданию вы должны уметь работать со строками такого вида:

3x^2 - x^2 -    3x^2 + x ^2 + 5x^5   - 4x^3 +x^2 - 7

Пробелы расставлены в случайном порядке.

Результат разбора такой строки - полином. Этот разбор вы можете сделать в перегрузке ввода у полинома. В рамках данной перегрузки строку можно сначала разобрать на термы, потом термы сложить, и получить полином. При сложении вы можете вызывать перегрузку сложения полинома с термом.

Для разбора на термы можно использовать самостоятельно разработанный вектор из предыдущей работы или динамический массив.

осторожно

В работе запрещено осуществлять парсинг конкретного терма в рамках полинома. Парсинг конкретного терма необходимо делегировать классу Term. Иными словами, полином должен только детектировать термы в строке.

Класс Term

  • Целые члены-данные для коэффициента и показателя степени.
  • Три конструктора (можно обойтись одним):
    • Без параметров для представления 0x00x^0.
    • С одним параметром, например 3, для представления 3x03x^0.
    • С двумя параметрами, например 3 и 2, для представления 3x23x^2.
  • Перегруженный operator+, который получает 2 терма как параметры и возвращает терм-результат.
  • Перегруженную операцию istream>> для поддержки вводна полинома в виде, определенном выше в разделе "Ввод полинома".
  • Перегруженную операцию ostream<< для печати терма в виде:
    • 3x03x^{0} как 3,
    • 3x13x^{1} как 3x,
    • 1x31x^{3} как x^3,
    • 3x2-3x^{2} как -3x^2.
  • Дружественный класс Polynomial.
к сведению

Продемонстрируйте работу с классом Term в функции main() отдельно от Polynomial.

Класс Polynomial

  • Члены-данные poly (динамический массив или сортированный список), и целое degree (степень)
  • Три конструктора:
    • Без параметров для представления полинома 00.
    • С одним целым параметром, например 3, для представления полинома 33.
    • С одним параметром-термом, например Term(3, 2), для представления полинома 3x23x^2.
  • Конструктор копирования и операторы присваивания =, +=, *=.
  • Скрытый член order_ для указания способа хранения термов:
    • по возрастанию степени;
    • по убыванию степени.
  • Друзья класса: operator*, operator+ , каждый из которых получает 2 полинома как параметры и возвращает полином-результат.
  • Перегруженную операцию istream>> для ввода полинома в виде, определенном выше в разделе "Ввод полинома".
  • Друг класса ostream<< для печати полинома 5x54x3+1x2+0x17x05x^5 - 4x^3 + 1x^2 + 0x^1 - 7x^0 в виде: 5x^5 - 4x^3 +x^2 - 7.
к сведению

Продемонстрируйте работу с классом Polynomial в функции main().

предупреждение

Класс Term и Polynomial должны быть упакованы в отдельную статическую библиотеку.

Режимы выполнения программы

В демонстрационном режиме вы самостоятельно придумываете примеры для демонстрации выполнения методов работы с полиномами. В интерактивном режиме данные примеры вводятся вводятся с клавиатуры пользователем. В интерактивном режиме меню можно не делать. Достаточно повторить демо-режим, только вместо заранее заданных значений нужно использовать данные консольного ввода.

Методический материал

  1. Контрольные вопросы