Математический порядок действий
От: fulleren Россия  
Дата: 19.07.05 11:58
Оценка:
Проблема такая...
Пишу программку для начальных классов по проверке порядка действий в мат.многочленах.....

на экране высвечивается строка с заданием.. например:
A+B+C+D*E
после клика мышкой поочередно по каждому мат.действию над данным действие высвечиваются цифры, соответствующие порядку нажатия на действие, предположим в результате работы пользователь получил следующее:
____________
| 1 2 3 4 |
|A+B+C+D*E |
-------------------
И нужно проверить правильно он расставил действия или нет

для числовых многочленов
например, (1+2)/3*(4+5/5) или 1+2+3*4+5 я написал проверку правильности расставленного порядка действий, проверяя результат
вычисления данной строки по польской нотации и результат, вычисленный с учетом того порядка, который расставил пользователь...
я понимаю, что это не совсе коректно... но пока ничего другого придумать не могу......
а вот для буквенных многочленов пока ничего путного придумать не могу...
польская нотация тут не поможет, т.к. по ней страка считывается в одном направлении, а пользователь может расствалять порядок в произвольном правильном порядке начиная с любого действия..
например, A+B+C+D:
по польской нотации единственно правильный порядок действий:
1 2 3
A+B+C+D
но возможны же другие правильные варианты:
1 3 2
A+B+C+D
и
3 2 1
A+B+C+D
помогите.........плиз
Как однажды в туденную зимнюю пору вышел из Windows был Norton и Dos
Re: Математический порядок действий
От: Аноним  
Дата: 19.07.05 12:13
Оценка:
F>по польской нотации единственно правильный порядок действий:
F>1 2 3
F>A+B+C+D
F>но возможны же другие правильные варианты:
F>1 3 2
F>A+B+C+D
F>и
F>3 2 1
F>A+B+C+D
F>помогите.........плиз

Напишите лучше программу расстановки скобок, чтобы получалось например для A + B * D -> (A + (B * D)).
Тогда можно забыть про нотации и следовать простой логике, что самыми первыми должны выполняться действия в самых глубоких скобках и проверять или делать расстановку исходя из этого. Например:

   1/2   3   1/2
((A + B) + (C * D))


1/2 значит, что это действие должно быть первым или вторым.
При расстановке можно выставлять порядок в зависимости от веса операции внутри текущего уровня вложенности или просто по порядку слева на право. Для удобства можно генерировать не скобки, а вот такое дерево (эквивалентно скобкам в предыдущем примере):

Выражение
  Сложение     // 3
    Сложение   // 1 или 2
      A
      B
    Умножение  // 1 или 2
      C
      D
RE: Математический порядок действий
От: Аноним  
Дата: 19.07.05 13:20
Оценка:
Проблема такая...
Пишу программку для начальных классов по проверке порядка действий в мат.многочленах.....

на экране высвечивается строка с заданием.. например:
A+B+C+D*E
после клика мышкой поочередно по каждому мат.действию над данным действие высвечиваются цифры, соответствующие порядку нажатия на действие, предположим в результате работы пользователь получил следующее:
____________
| 1 2 3 4 |
|A+B+C+D*E |
-------------------
И нужно проверить правильно он расставил действия или нет

для числовых многочленов
например, (1+2)/3*(4+5/5) или 1+2+3*4+5 я написал проверку правильности расставленного порядка действий, проверяя результат
вычисления данной строки по польской нотации и результат, вычисленный с учетом того порядка, который расставил пользователь...
я понимаю, что это не совсе коректно... но пока ничего другого придумать не могу......
а вот для буквенных многочленов пока ничего путного придумать не могу...
польская нотация тут не поможет, т.к. по ней страка считывается в одном направлении, а пользователь может расствалять порядок в произвольном правильном порядке начиная с любого действия..
например, A+B+C+D:
по польской нотации единственно правильный порядок действий:
1 2 3
A+B+C+D
но возможны же другие правильные варианты:
1 3 2
A+B+C+D
и
3 2 1
A+B+C+D
помогите.........плиз




Из такого положения я вижу только два выхода

Первый выход эвристический. Например несколько раз подставляьть вместо переменных рандомные значения и проверять или результат вычислений(результирующее число) вышел одинаковый тем порядком что ввел пользователь и тем что выдала польская анотация. Если так проверить несколько раз то очень с большой вероятностю можна сказать что все правильно

Второй выход это синтаксический разбор( вместо польской анотации). Он использует рекурсию чтобы вычислить значение выражения,но сложность его линейная. Раньше я тоже писал польскую, но когда узнал про простоту написания и понимания синтаксического разбора, то больше никогда не возвращался к польской анотации, а также его очень легко разширить например на возведение в степень и тд.
Я тут прикинул что если отказатся от линейности синтаксического разбора то можно написать его подобие что будет решать поставленную задачу.



По своему опыту могу посоветовать первый выход, но все равно советую использовать синтаксический разбор вместо польской записи, для вычисления значения выражения.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Математический порядок действий
От: Аноним  
Дата: 19.07.05 18:22
Оценка:
Здравствуйте, fulleren, Вы писали:

F>Проблема такая...

F>Пишу программку для начальных классов по проверке порядка действий в мат.многочленах.....
...
F>например, A+B+C+D:
F>по польской нотации единственно правильный порядок действий:
F>1 2 3
F>A+B+C+D
F>но возможны же другие правильные варианты:
F>1 3 2
F>A+B+C+D
F>и
F>3 2 1
F>A+B+C+D
F>помогите.........плиз

Я думаю, тут надо выражение распарсить в дерево, в дереве проставить приоритеты всем операциям, а потом проверять соответствие порядка действий этим приоритетам.
Re: Математический порядок действий
От: soljen Интернет  
Дата: 24.07.05 16:46
Оценка:
Доброго времени суток, fulleren!

[skipped]

Пару лет назад в инсте делали что-то подобное... называлось "Польская запись" или что-то вроде этого...
Поделиться в данный момент нечем... но поиск по ключевым словам должен помочь!
... << RSDN@Home 1.2.0 alpha rev. 517>>
Тиха украинская ночь, но сало надо перепрятать!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.