Вычисления выражени, Проблемка... |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Вычисления выражени, Проблемка... |
Relrin |
8.04.2011 16:03
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
Необходима помощь в задаче. Суть ее состоит в следующем: Необходимо с помощью рекурсии вычислить значение выражения, представленного в виде некоторого "константного выражения". То есть, вы вводим некоторую строку, и потом работаем с нем, вычисляя необходимое
Примеры таких выражений: 24; 2*2+2; (634+45); ((7-121)*32) Мой код получился следующим: Uses Crt; Сообщение отредактировано: Relrin - 8.04.2011 16:09 |
Гость |
8.04.2011 16:33
Сообщение
#2
|
Гость |
Во-первых, не
Function Res(i:integer; s:string):integer; а Function Res(i:integer; const s:string):integer; Я так понял, у тебя приоритеты операций и скобки не учитываются пока что. То, что есть, уже неплохо. Но, для того, чтобы алгоритм понимал приоритеты, надо, чтобы в функцию Res передавалась не только последняя позиция, но и приоритет последнего арифметического оператора. Также тебе придётся распознавание чисел вынести в отдельную процедуру, потому что пока что у тебя только цифра распознаётся. Ссылка на статью с готовым алгоритмом давать не хочу, потому что то, что есть, уже неплохо, надо только довести. |
Relrin |
8.04.2011 19:05
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
C приоритетами и скобками пока не очень могу представить как нужно сделать...
А вот с выделением чисел подправил(правда, больше чем integer значения не берет). {Выделения числа из строки} |
Гость |
8.04.2011 19:51
Сообщение
#4
|
Гость |
1. Перепиши определитель числа без библиотечного val. Перебор подстрок, для которых вал сработает - это лажа.
2.
Не так
И внутри res организуй цикл. В общем, пока ещё подумай, через час где-то я постараюсь написать полное решение на основе твоего. |
Relrin |
8.04.2011 20:38
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
Переделал, теперь берет и longint числа
Function DetNumber(const s:string;pos: integer):longint; Сообщение отредактировано: Relrin - 8.04.2011 20:41 |
TarasBer |
8.04.2011 20:55
Сообщение
#6
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
В общем, переделать чуть-чуть у меня не вышло, к сожалению.
Переделал дофига (то есть как бы делал я). Вышло так:
А общая теория тут: http://algolist.manual.ru/syntax/parsear.php -------------------- |
Relrin |
8.04.2011 21:11
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
За помощь! Пока читаю "теорию"+разбираю код. До этого пару раз проверил пару примеров, типа (634+45), однако результат получил 0. Вопрос: как это исправить?
Сообщение отредактировано: Relrin - 8.04.2011 21:16 |
TarasBer |
8.04.2011 21:18
Сообщение
#8
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> До этого пару раз проверил пару примеров, типа 7-121+3, однако результат получил 0.
В смысле, у тебя? (я у себя проверил - у меня выдаёт -117, но вот на пробелы он реагировать не умеет, значит, надо вставить код, пропускающий пробелы. Только не вздумай писать код, УДАЛЯЮЩИЙ пробелы!!! Их надо именно пропускать, а не удалять.) > Вопрос: как это исправить? Долго сидеть с отладчиком, и понять, где не разбирается какой-то левый случай, точнее сказать не могу. При написании разборщика выражений всё ошибки именно такого мерзского характера - в какой-то ситуации надо сдвигать индекс, а в какой-то не надо, а в какой-то надо, но не так. Что-то общее сказать сложно. Из-за этого попытки написать надёжный разборщик превращаются в монструозный код с кучей проверок на каждом шагу. Сообщение отредактировано: TarasBer - 8.04.2011 21:20 -------------------- |
Relrin |
8.04.2011 21:48
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
Ошибка найдена!
Вот это: if GetNumber then Изменил на вот это if GetNumber then tmp_prior := 0; и заработало |
TarasBer |
8.04.2011 21:55
Сообщение
#10
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Не верю.
(634+45) работает в моём варианте. В моём вообще всё работает (кроме пробелов), не? Кстати, Д7 на твоё код выдаёт предупреждение: из-за того, что ты тмп+приор внёс в условие, оно стало "возможно не определено". И ещё почему-то 2(2+2) стало равно 4. -------------------- |
Relrin |
8.04.2011 22:04
Сообщение
#11
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
Не верю. (634+45) работает в моём варианте. В моём вообще всё работает (кроме пробелов), не? Кстати, Д7 на твоё код выдаёт предупреждение: из-за того, что ты тмп+приор внёс в условие, оно стало "возможно не определено". И ещё почему-то 2(2+2) стало равно 4. У меня все обратно. Все так, в подправленном, работает как надо Скриншот как подтверждение Эскизы прикрепленных изображений |
TarasBer |
8.04.2011 22:10
Сообщение
#12
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ты покажи выражение, которое НЕ работает в моём варианте.
А в свой вбей 2(2+2) -------------------- |
Relrin |
8.04.2011 22:17
Сообщение
#13
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
Ты покажи выражение, которое НЕ работает в моём варианте. А в свой вбей 2(2+2) Если указать 2(2+2), то конечно 4 будет, т.к. знака между 2 и скобками нету В изначальном варианте, у меня не работает варианты: (7-121)=0 (634+45)*3=0 ((7-121)+3)=0 т.е. выражение, где есть скобки, показывает результат 0 у меня же, в подправленном варианте, эти варианты, как и без скобок решает без проблем |
TarasBer |
8.04.2011 22:24
Сообщение
#14
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> В изначальном варианте, у меня не работает варианты:
(7-121)=0 (634+45)*3=0 ((7-121)+3)=0 т.е. выражение, где есть скобки, показывает результат 0 Да ты просто походу пробел в начале выражения поставил. Всё в моём варианте прекрасно работает. Хоть сейчас перепроверь и отладчиком пройдись. Либо ты сначала сделал с ним что-то не то. Так вот, если ты его покорёжил, то это не о мне претензии. Потому что я его проверил и отладил. > Если указать 2(2+2), то конечно 4 будет, т.к. знака между 2 и скобками нету А вот мой вариант останавливает разбор после первой двойки. И в него намного проще добавить диагностику неверных выражений. -------------------- |
Relrin |
8.04.2011 22:44
Сообщение
#15
|
Пионер Группа: Пользователи Сообщений: 64 Пол: Мужской Репутация: 0 |
|
TarasBer |
8.04.2011 22:47
Сообщение
#16
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Значит, что-то не то сделал с моим кодом.
Судя по ошибке, ты куда-то дел елсе при переписывании того фрагмента. И почему, вместо того, чтобы внимательно посмотреть, правильно ли ты переписал код и восстановить елсе, ты просто дописал точкозапятую после тхена и перенёс явное присвоение тмп_приор в одну из ветвей, заставляя компилятор выдавать предупреждение? Сообщение отредактировано: TarasBer - 8.04.2011 23:06 -------------------- |
Текстовая версия | 23.05.2024 18:06 |