Воскресенье, 17 Ноября 2024, 13:25

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помогите с реализацией
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". Мб сложно выразился, но попробуй на листочке нарисовать smile

У любого узла будет метод "вычислить". Тобишь узлы-операции возвращают числа (даже если ребенок узла-операции - ещё один узел-операция). Метод "вычислить" в случае узлов-чисел просто возвращает само число.

Так же по этому же дереву можно проводить оптимизацию формул. Вместо корня "+" с детьми "2" и "2" можно просто поставить узел "4" - верно ведь? smile
SaiteiДата: Пятница, 13 Ноября 2015, 21:33 | Сообщение # 3
старожил
Сейчас нет на сайте
Ну или просто читай токены, ну а там уж сам смастери способ анализа. Работать с уже проанализироваными кусочками гораздо проще
RamilyanamanaДата: Суббота, 14 Ноября 2015, 06:48 | Сообщение # 4
Биззи Джей Ужасный
Сейчас нет на сайте
то есть примерно это выглядит вот так? rezX - это коэффициент перед X; difX - степень X
после того как в блоке посчитаны коэффициенты у каждой переменной их перемножают и полученное число заносят в список.



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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг