Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм разбора выражения 
:(
    Опции темы
Валерия
Дата 6.12.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Нужно написать прогу которая сможет распознавать типа такого

((5+(3-2))*sin(2*2))/5

Как примерно такое делать smile?
PM MAIL   Вверх
Walker
Дата 7.12.2007, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: нет
Всего: 16



Доброго времени суток, Валерия!

Тема уже поднималась. Без определённых соглашений никак. Пользователь может накатать любую ересь. Не знаю, какой вы придумали интерфейс, но могу предложить, например, следующее: Поле отображения формулы readonly - заполняется с помощью button, combobox, listbox и прочих контролов, которые могут предложить набор функций, ограниченный Вами.

Удачи!



--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
esperant0
Дата 7.12.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Цитата(Walker @ 7.12.2007,  08:16)
Доброго времени суток, Валерия!

Тема уже поднималась. Без определённых соглашений никак. Пользователь может накатать любую ересь. Не знаю, какой вы придумали интерфейс, но могу предложить, например, следующее: Поле отображения формулы readonly - заполняется с помощью button, combobox, listbox и прочих контролов, которые могут предложить набор функций, ограниченный Вами.

Удачи!

Вопрос почти наверняка на формальные грамматики и распознавание языка. И бутоны тут скорей всего не причем.


Валерия, построй грамматику для ваших выражений переведите грамматику в форму Хомского и распознавайте


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
NaOH
  Дата 8.12.2007, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.12.2007

Репутация: нет
Всего: нет



Я делал программку для распознования математических выражений на Делфи  smile 

Кто хочет, могу показать...

*

Это сообщение отредактировал(а) NaOH - 8.12.2007, 06:08
PM MAIL WWW   Вверх
Валерия
Дата 8.12.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



NaOH, я хочу smile
PM MAIL   Вверх
dereyly
Дата 8.12.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 1
Всего: 4



Обычно строят дерево арифмитических выражений, можно так же через префиксную форму
((5+(3-2))*sin(2*2))/5 ~ [3] [2] [-] [5] [+] [2] [2] [*] [sin] [*] [5] [/]
В моем фиговом интерпретаторе это работало через 2 стека (только непомню как я там унарный минус обходил)
Стек операндов(чисел): [3] [2] [5] [2] [2]  [5]
Стек операций [-] [+] [*] [sin] [*] [/]
(Будем читать стек слева направо)
Берем первую операцию [-], она требует 2 операнда (т.е. мы минус не считаем унарным), далее берем [3] [2] и вычисляем 3-2=1 и записывем в стек результат
у нас получится
2.
[1] [5] [2] [2]  [5]
[+] [*] [sin] [*] [/]
3.
[6] [2] [2]  [5]
[*] [sin] [*] [/]
4.
[12] [2]  [5]
[sin] [*] [/]
5.
[-0.54] [2]  [5]
[*] [/]
6.
[-1.04] [5]
[/]
7.
[-0.22]
[]
Понятно что последнее число оставшееся в стеке есть ответ
Так же следует рассмотреть 3 случая
1. Стек 1 содержит больше 1й цифры
2. Стек 2 не пуст
3. Оператору не хватает операндов

Все случаи значат что исходное выражение составлено не правильно
PM MAIL   Вверх
NaOH
Дата 8.12.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.12.2007

Репутация: нет
Всего: нет



Цитата(Валерия @ 8.12.2007,  13:55)
NaOH, я хочу smile

Валерия, выложил на своей страничке (наз."интерпритатор") с исходниками  smile 

Может не только арифметические опреации распознавать, но и многие функции, напимер cos, sin, abs, tg, ln ...

Жду комментарии... smile 

Это сообщение отредактировал(а) NaOH - 8.12.2007, 17:41
PM MAIL WWW   Вверх
Валерия
Дата 9.12.2007, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



Спасибо, только в Дэлфи я не пишу а на C# smile
Да и уже не важно, я всетаки забила на это, и решила что бы после ввода текстовой строки, генерировалась и компилировалась другая программа, которая передает обратно результат smile
Всем спасибо smile
PM MAIL   Вверх
_Y_
Дата 10.12.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Я когда-то в древности писал парсер для логических выражений на VB. Если нужно - могу поискать.

Естественно, что пользователь должен знать правила написания выражения: что скобки должны быть парными и т.п.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Sartorius
Дата 10.12.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



 В .NET не нужно придумывать такие велосипеды. 
Код

object result = Microsoft.JScript.Eval.JScriptEvaluate("2+2", Microsoft.JScript.Vsa.VsaEngine.CreateEngine()));
 Console.WriteLine(result);

PM MAIL ICQ   Вверх
_Y_
Дата 10.12.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Sartorius @ 10.12.2007,  11:22)
В .NET не нужно придумывать такие велосипеды.

Все зависит от степени стандартности задачи  smile 
Кстати, вот подобная тема в ветке по Java


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.