Помогите с реализацией
|
|
Ramilyanamana | Дата: Пятница, 13 Ноября 2015, 15:16 | Сообщение # 1 |
Биззи Джей Ужасный
Сейчас нет на сайте
| Дали тему курсовой: "Программная реализация операций над многочленами для двух переменных в форме линейных списков. Демонстрация основных операций."
Как бы из задания все понятно, но когда начал писать программу столкнулся с проблемой: допустим пользователь вводит уравнение 12*x*23*y*55+x^2 происходит считывание строки: сначала находим букву (пусть это i-ый элемент), после проверяем, является ли символ i-2 - цифрой. если является, то идем назад, пока не дойдем до начала строки или цифры не закончатся. после присваиваем переменной полученное число. затем ищем еще одну букву или знак "+" или "^". если находим еще одну букву. то также проверяем на наличие числа перед ней, и если число есть, то присваиваем новой переменной это число. если встретился символ "+" или "^", то умножаем эти две переменные и присваиваем полученное число переменной в списке. и так далее. Но как видно из уравнения, есть еще число 55, оно так же является коэффициентом, следовательно его тоже нужно записать в переменную, отвечающую за коэффициент. вот тут и возникла проблема: я не знаю, как это реализовать
проверки на неправильность введенных данных я уже сделал, так что приведенная выше запись уравнения верная. пользователь не сможет написать, например, 12xy^2+x.
подскажите пожалуйста (ну или дайте ссылку на какой-нибудь ресурс, где с этим можно разобраться), как правильно реализовать считывание данных. кстати, данные в список заносятся в виде (k,x,y), где k - коэффициент, x - степень числа x, y - степень числа y.
заранее, благодарю
|
|
| |
Saitei | Дата: Пятница, 13 Ноября 2015, 21:26 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Ramilyanamana, советую из строки выдирать токены, а потом по токенам строить дерево. Например: 2+2*x^2 Токены: 1)Число 2 2)Операция + 3)Число 2 4)Операция * 5)Переменная x 6)Операция ^ 7)Число 2
На основании токенов ты можешь построить дерево. Например данный случай можно описать деревом, корнем которого является узел "+", у которого слева "2", а справа "*". У этого "*" слева "2", а справа "^". У "^" слева "x", а справа - "2". Мб сложно выразился, но попробуй на листочке нарисовать
У любого узла будет метод "вычислить". Тобишь узлы-операции возвращают числа (даже если ребенок узла-операции - ещё один узел-операция). Метод "вычислить" в случае узлов-чисел просто возвращает само число.
Так же по этому же дереву можно проводить оптимизацию формул. Вместо корня "+" с детьми "2" и "2" можно просто поставить узел "4" - верно ведь?
|
|
| |
Saitei | Дата: Пятница, 13 Ноября 2015, 21:33 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Ну или просто читай токены, ну а там уж сам смастери способ анализа. Работать с уже проанализироваными кусочками гораздо проще
|
|
| |
|
Saitei | Дата: Понедельник, 16 Ноября 2015, 08:49 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Ramilyanamana, что-то вроде того. Ключевые слова для поиска - AST (абстрактное синтаксическое дерево) и дерево разбора (грубо говоря AST + мусор)
|
|
| |
Xakep | Дата: Понедельник, 16 Ноября 2015, 19:34 | Сообщение # 6 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Думаю этого должно хватить: http://habrahabr.ru/post/119850/ http://habrahabr.ru/post/120005/
|
|
| |
Gudleifr | Дата: Вторник, 17 Ноября 2015, 11:45 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| Xakep, проще, насколько помню, посмотреть пример калькулятора из старого дистрибутива трубо поскакаля (или, скорее, Турбо C (?)). И сильно рекомендую посмотреть "Этюды" Уэзерелла.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Вторник, 17 Ноября 2015, 13:57 |
|
| |