1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| Веталь |
17.04.2009 13:48
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 1 Пол: Мужской Репутация: 0 |
Формулу вида
<формула >::=<терминал >|(<формула ><знак><формула >) <знак>::= + | – | * | / <терминал >::=<переменная>|<цифра > <переменная>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z <цифра >::=0|1|2|3|4|5|6|7|8|9 можно представить в виде двоичного дерева по следующим правилам: формула из одного терминального символа (цифры или переменной ) представляется деревом, состоящим из одной вершины, содержащей этот символ, а формула вида (f1 s f2) — деревом, в котором корень — это знак s, а левое и правое поддеревья — это соответствующие представления формул f1 и f2. О писать подпрограмму, которая: преобразует дерево-формулу, заменяя в нем все поддеревья, соответствующие формулам ((f1 +- f2) * f3) и (f1 * (f2 + - f3)), на поддеревья, соответствующие формулам ((f1 * f3) +-(f2 * f3)) и ((f1 * f2) +-(f1 * f3)); есть несколько готовых методов: модуль создания корня дерева, здесь функция создания узла
добавление числа в дерево
добавление переменной в дерево
добавление знака в дерево
И, собственно, загрузка формулы из файла
Помогите пожалуйста дописать нехватающие методы и оформить задачу. Заранее спасибо, кто поможет Сообщение отредактировано: Веталь - 17.04.2009 16:36 |
![]() ![]() |
| volvo |
27.04.2009 20:46
Сообщение
#2
|
|
Гость |
Ну, в общем, тема открыта даже раньше, чем я говорил. Итак, по порядку:
1) я не знаю, зачем ты привел здесь эти куски программы, они ничего не дают. Либо надо было приводить только структуру классов, либо - программу, строящую дерево разбора полностью. Третьего не дано. Я не думаю, что кто-то будет подгонять программу, чтобы она легла точно на описания классов, которые привел ты. Тем более, что ты явно что-то перемудрил, все делается гораздо проще... 2) теперь о том, как это - "проще". Вот так: Запусти программу и посмотри на результаты ее работы. Она сначала строит дерево разбора для приведенного выражения и вычисляет его, а потом Цитата преобразует дерево-формулу, заменяя в нем все поддеревья, и снова вычисляет значение выражения. При правильной замене значение всего выражения должно остаться неизменным. Смотри, разбирайся. Это можно было бы еще немного укоротить, но я этого делать не стал, боюсь, скажется на читабельности. Если разберешься в алгоритме создания дерева и замены поддеревьев, с легкостью сократишь программу самостоятельно... Пробуй соответствующие формулам ((f1 +- f2) * f3) и (f1 * (f2 + - f3)), на поддеревья, соответствующие формулам ((f1 * f3) +-(f2 * f3)) и ((f1 * f2) +-(f1 * f3)); Прикрепленные файлы
expr.zip ( 1.78 килобайт )
Кол-во скачиваний: 218 |
| Гость |
4.05.2009 18:52
Сообщение
#3
|
|
Гость |
спасибо, буду разбираться
|
Веталь Упростить дерево-формулу! 17.04.2009 13:48
volvo Тему скрыл временно, до 1-го мая. Топикстартер уве... 17.04.2009 17:56![]() ![]() |
|
Текстовая версия | 8.12.2025 16:45 |