Laboratory work, students(Please, people, don't get here if you are not from the team)
Классы: BigInt + Complex шаблонный + Rational + Dictionary + Polynom + Calc + Number - Test class + Функционал: Перегрузка операторов +,,- для объектов одного класса + Перегрузка операторов +,,- для объектов разных классов/взаимодействие — Воспринимание калькулятором правильного выражения, состоящего из целых, и вещественных, с учетом скобок + Воспринимание других классов и их дифференциация как объекты разных классов - Запоминание переменных на основе дерева + Вывод ошибок при неправильном выражении + Подсчет многочлена + Интеграция многочлена с калькулятором - СВЯЗЬ МЕЖДУ КЛАССАМИ НАЛАЖЕНА — Взаимодействие с командной строкой на два параметра(файл ввода и вывода) - Взаимодействие с командной строкой на запуск тестов + Важные минусы выше делают бессмысленным дальгейшую спецификацию. Ясно, что многое минус из-за того, что выше. Дополнительные файлы: bat файл для более удобного запуска тестов + инпут и аутпут файлы тестов - 3 (Нужно НАМНОГО больше) Архитектура классов(потенциальная): У класса калькулятора есть стек многочленов. В свою очередь коэффициенты при степенях х у многочлена воспринимаются как комплексные. Класс комплексных из-за шаблона различает себя на подклассы типов: дроби, целые большие,вещественные Все подклассы наследуются от базового класса number. Архитектура программы: Получаем строку. Разбиваем по операторам. Части - многочлены. Разделяем по х. Определяем коэффициенты. Считаем многочлен. Возвращаем ответ. Потенциальные проблемы: калькулятор использует функцию возведения в степень, которая не перегружена для наших классов. Калькулятор использует встроенный стек, функции которого также не определены для наших классов. С взаимодействием объектов разных классов хрень какая-то. С шаблонами тоже.
- Цель: разработать консольное приложение, представляющее собой сильно упрощенную версию системы компьютерной математики, работающей с многочленами.
- Внешний интерфейс: пользователь последовательно вводит выражения в консоль, после нажатия Enter, выражения вычисляются, и печатаются в следующей строке. Пример: In[1]:=3+4 Out[1]=7 In[2]:=[1]*2 Out[2]=14 In[3]:=%+2 Out[3]=16 In[4]:=zz=5;y=11 Out[4]=5 Out[5]=11 In[6]:=zz+y Out[6]=16 In[7]:=2/3+4/5 Out[7]=22/15 In[8]:=1+2i-4i Out[8]=1-2i In[9]:=x^2 Out[9]=x^2 In[10]:=y x Out[10]=11x In[11]:=[10]+[9] Out[11]=x^2+11x In[12]:=2/3x+4/5x Out[12]=22/15x In[13]:=1/2x+0.6x Out[13]=1.1x In[14]:=(1-2i)x+1/12y Out[14]=(1-2i)x+11/12 In[15]:=(1-r)^2 Error: r is undefined In[16]:=(1-i)^2 Out[16]=-2i In[16]:=11 Out[16]=12 In[16]:=4(3) Out[16]=4 Если введенное выражение содержит ошибку, вместо Out[х] вывести сообщение об ошибке.
- Поддерживаемые операции: обычная запись выражений (постфиксную не надо), +,-,*, деление не надо, круглые скобки, степень ^. Кроме этого, должна быть поддержка переменных. Любой строке их латинских символов (кроме x и i), можно присвоить значение, которое потом будет подставляться вместо этой строки в выражении. In[1]:= и Out[1]= выводятся автоматически перед каждым вводом\выводом. В дальнейшем на вывод можно ссылаться, то есть написать [4] и это означает, что вместо этих скобок будет подставлено значение, которое было получено в 4-м выражении. Символ % хранит результат последнего вычисленного выражения.
- Формат чисел: должна быть поддержка 4 множества чисел: целые (включая длинные), рациональные, действительные, комплексные (последние при этом могут содержать в качестве действительной и мнимой части числа из каждого из трех предыдущих классов). Целые и вещественные числа записываются естественным образом, рациональные числа в виде a/b, где a и b - целые числа. При выводе рациональных чисел минус ставить только в числителе, саму дробь сокращать до несократимой, целую часть выделять не надо. Комплексные числа содержат мнимую 1, которая обозначается как i, при выводе этих чисел, сначала выводится действительная часть, потом + или - и мнимая часть, после которой следует i. Если мнимая часть равна 0, то выводить число как целое\рациональное\действительное. При необходимости использовать скобки.
- Операции: +-* должны работать для всего, включая многочлены. ^ - левый операнд любой, правый - обязательно натуральное число, либо 0. Круглые скобки являются группирующими, если же они используются сразу после многочлена, то должны вычислять значение многочлена при x = тому, что передали в скобках (многочлен можно передавать тоже). = используется для задания значения переменным, слева имя переменной, справа число или многочлен. Оператор ; используется для разделения ввода. Части, разделенные ; следует понимать как независимые входные данные, для каждого из которых генерировать свой вывод.
- Многочлены: для задания многочлена используется зарезервированная переменная х. Выводить многочлен стоит по убыванию степеней, для вывода x в квадрате использовать такую запись: x^2. Знак умножения может опускаться там, где это не приводит к двусмысленности. Пробелы при вводе должны игнорироваться, однако иногда они необходимы, например y x означает многочлен первой степени с коэффициентом при x равным y.
- Параметры командной строки: без параметров - ввод - вывод в консоль, два параметра - имена файлов для ввода вывода, один параметр -test - запустить тесты.
- Тесты: Написать тесты к программе, то есть примеры ввода и правильно вывода, и протестировать на них по возможности каждый класс. То есть, программа должна брать входные данные для теста (например, из файла), создавать нужный класс, вызвать метод с этим данными, сравнить результат с эталоном, и удалить класс. Результат тестирования по каждому тесту вывести в консоль.
Вы должны использовать следующие классы, которые вы сделали в 9 задании: многочлен, BigInteger, словарь, калькулятор (сделать его упрощенную версию только для 4 операций).
Пример архитектуры классов:
- Number - базовый класс для всех чисел (возможно, абстрактный)
- BigInteger и др. - классы наследники для каждого множества чисел.
- Complex - комплексное число, наследник Number, шаблонный, в качестве T будет использоваться любой из классов из п. 2
- Polynom - многочлен, шаблонный, в программе использовать его в виде Polynom
- Dictionary - использовать для хранения значений переменных
- Calc (название, возможно, стоит изменить) - для вычисления выражений
- набор классов для тестирования
- Класс, обслуживающий ввод\вывод, в который передаются потоки для чтения, записи.
Подсказка: любое число считайте многочленом, парсить многочлен лучше всего вычисляя значение выражение калькулятором, то есть, если у вас есть строка x^2+2x, то ее лучше распознать как многочлен x возведенный в квадрат, к которому прибавили многочлен 2, умноженный на многочлен x.