Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 17.06.2005, 12:32   [включить плавающее окно]   #81
Darthman
Мужской Опытный
 
Аватар для Darthman
 
Регистрация: 10.02.2003
Адрес: Москва
Парсер строковой нужен. Короче говоря нужен некий скриптовый язык несложный. Поищи в гугле "разбор математических выражений в программе" я натыкался на много статей по этому вопросу.
__________________
Если работает, лучше не трогай!
Darthman вне форума  
Ответить с цитированием
Непрочитано 17.06.2005, 13:01   [включить плавающее окно]   #82
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
Jabberwocky
я так понимаю, тебе нужен калькулятор выражений?
для этого тебе нужно из инфиксной формы перевести выражение в постфиксную
она еще называется обратной польской
пример
1 + 2 * 3 + 4 * ( 5 + 6 )
переведется вот так
1 2 3 * + 4 5 6 + * +

если расставить скобки, станет понятно, что это означает
((1, (2, 3)*)+, (4, (5, 6)+)*)+

посчитать после этого значение можно при помощи стека
по очереди берутся символы из записи
1 2 3 * + 4 5 6 + * +
если это операнд (число), то он заносится в стек
если это оператор (+ или *), то из стека вынимается столько элементов, какова местность оператора (для + и * это 2), над ними выполнятеся соотвествующая операция и ее результат заносится в стек

пример по шагам (содержимое стека)
1; 1 2; 1 2 3; 1 6; 7; 7 4; 7 4 5; 7 4 5 6; 7 4 11; 7 44; 51
в конце получается результат

остается только понять, как перевести выражение из инфиксной в постфиксную запись

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

пример (запись / содержимое стека)
1 /
1 / +
1 2 / +
1 2 / + * (приоритет * выше, чем +)
1 2 3 / + *
1 2 3 * + / +
1 2 3 * + 4 / +
1 2 3 * + 4 / + *
1 2 3 * + 4 / + * (
1 2 3 * + 4 5 / + * (
1 2 3 * + 4 5 / + * ( +
1 2 3 * + 4 5 + / + *
1 2 3 * + 4 5 + * + /

это все, что касается инфиксных бинарных оператор (типа A ? B)
в записи еще принят унарный минус (типа -1) и префиксные функции (типа sin(x))
когда я делал такой калькулятор, унарный минус я предварительно заменял на символ унарной префиксной функции (чтобы при переводе можно было легко отличить от бинарного a - b)
при преобразовании в постфиксную запись префиксные функции я рассматривал как обычные операторы с самым высоким приоритетом
если префиксная функция принимает несколько аргументов, разделяемых запятой (типа C(l,r)) то запятая действует как закрывающая скобка, только открывающая скобка не выкидывается, и при вычислении выбирается из стека столько операндов, какова местность финкции (сорри, в прошлый раз соврал)
в общем, алгоритмы перевода и вычисления остаются теми же самыми
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.

Последний раз редактировалось CapOne; 21.06.2005 в 09:15.
CapOne вне форума  
Ответить с цитированием
Непрочитано 19.06.2005, 17:17   [включить плавающее окно]   #83
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
Jabberwocky
блин, спросил, я тут старался, а теперь молчишь
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 20.06.2005, 13:24   [включить плавающее окно]   #84
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
1. Перевариваю. Прогрузил.
2. Мне всё это в среду ваять предется. Сейчас пока со временем туго было. Особенно на выходных.
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 20.06.2005, 16:58   [включить плавающее окно]   #85
Barloggg
Мужской Продвинутый
 
Аватар для Barloggg
 
Регистрация: 11.03.2003
Адрес: Тьмутаракань2, лен. обл
Да, век живи, век учись.
CapOne, "обратная польская" это прикольно... хех.. действительно, найти хоть что-нибудь можно только тогда, когда знаешь чего ищешь...
Я подобную задачу решал дробя изначальную строку на кучу мелких строк, в одно действие... напарился сверх всякой меры... и заглох...
Barloggg вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 21.06.2005, 08:57   [включить плавающее окно]   #86
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
кстати, тут можно делать разного рода вариации
например, можно делать вычисление в один проход, не сохраняя обратную запись, а сразу работая со стеком операндов

если в качестве операндов выступают не только константы, но и переменные, то ответом является не число, а дерево разбора выражения
в этом случае в стеке операндов хранятся ссылки на поддеревья разбора, а операция над такими поддеревьями выглядит как слияние этих деревьев, и помещение полученного поддерева обратно в стек
например, выражение (b+2)*a, обратная запись b 2 + a *, и в стеке перед последним шагом лежат поддеревья
(a)
и
---(+)
--/---\
(b)---(2)
результатом умножения будет дерево
------(*)
-----/---\
---(+)---(a)
--/---\
(b)---(2)
после чего можно означивать переменные и разными способами упрощать выражение
например, означили b:=3
где-то хранится список указателей на все листы (b) дерева
проходитесь по этому списку, в листе отдельно приписываете значение 3, поднимаетесь на узел выше, если у всех детей узла есть значения, то самому узлу тоже приписываете значение (например узлу (+) значение 5), поднимаетесь еще на узел выше и т. д.; если у какого-то сына нет значения, то процесс останавливаете и переходите к следующему листу с (b)
если все переменные означены, то появится значение в корне
если меняется означивание только одной переменной, получается новое значение выражения без пересчета всего дерева, а только пути от листьев с этоу переменной к корню

PS: сорри, в первом посте соврал про префиксные функции нескольких аргументов, уже исправил
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.

Последний раз редактировалось CapOne; 21.06.2005 в 09:18.
CapOne вне форума  
Ответить с цитированием
Непрочитано 21.06.2005, 13:59   [включить плавающее окно]   #87
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
CapOne
О. Это хорошее дополнение. Мне именно с переменными надо. Эллиптические интегралы высчитывать.
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 02.07.2005, 16:02   [включить плавающее окно]   #88
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
CapOne
В общем и целом, работает. Правда, глюки какие-то постоянно. Но, наверно, проблемы моей реализации. Спасибо.

Теперь еще вопрос.
Надо чтоб в форме был список, элементы которого можно переставлять местами, перетаскивая мышкой.
Как это реализовать?

И еще. Как в компоненте StringGrid разрешить редактирование только некоторых ячеек?
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер

Последний раз редактировалось Jabberwocky; 02.07.2005 в 17:45.
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 02.07.2005, 17:58   [включить плавающее окно]   #89
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
я в этом не шарю

я больше по алгоритмам
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 02.07.2005, 18:03   [включить плавающее окно]   #90
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
А это ко всем вопросы.
А алгоритм здоровский.
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 17.07.2005, 15:36   [включить плавающее окно]   #91
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Нда.
Лето, жара, все в отпусках...
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 17.07.2005, 18:16   [включить плавающее окно]   #92
groger
Мужской Интересующийся
 
Регистрация: 05.07.2005
Адрес: Троицк
Почитайте про drag&drop и соответствующие события - должно быть, то что надо.
А в StringList обрабатывайте onSelEditText.
__________________
Вчера с пальмы слез
groger вне форума  
Ответить с цитированием
Непрочитано 20.07.2005, 14:33   [включить плавающее окно]   #93
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
А как в StringGrid каждой колонке или строке задавать свою ширину или высоту?
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 20.07.2005, 15:23   [включить плавающее окно]   #94
groger
Мужской Интересующийся
 
Регистрация: 05.07.2005
Адрес: Троицк
Set ColWidths at runtime to change the width of an individual column.
Все есть в help!!!
__________________
Вчера с пальмы слез
groger вне форума  
Ответить с цитированием
Непрочитано 20.07.2005, 16:02   [включить плавающее окно]   #95
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Цитата (groger) »
Все есть в help!!!
Это если знать, где и как и что искать.
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 20.07.2005, 17:09   [включить плавающее окно]   #96
groger
Мужской Интересующийся
 
Регистрация: 05.07.2005
Адрес: Троицк
Если честно я не знал, что искать. Набрал TStringGrid и посмотрел properties, ведь несложно, правда?
__________________
Вчера с пальмы слез
groger вне форума  
Ответить с цитированием
Непрочитано 20.07.2005, 18:35   [включить плавающее окно]   #97
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
groger
Ну, я просто проглядел.
Мое понимание англицкого конкретно зависит от настроения и усталости
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 23.08.2005, 18:48   [включить плавающее окно]   #98
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Подскажите, как сделать такой финт ушами...
Есть процедура в которой используется функция pos
Эта процедура должна применяться к разным текстовым переменнным и Edit.Text. Вот как сделать так, чтоб она была универсальна и применялась ко всем Edit.Text, что писать pos('substring', ????) ?
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 23.08.2005, 20:45   [включить плавающее окно]   #99
CapOne
Мужской Умудрённый
 
Аватар для CapOne
 
Регистрация: 08.02.2003
Адрес: Новосибирск
в смысле применялась ко всем?
__________________
Гайдар и другие экономисты поступили очень просто: представили потребности общества в виде решётки, а затем её сплющили.
CapOne вне форума  
Ответить с цитированием
Непрочитано 23.08.2005, 21:13   [включить плавающее окно]   #100
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Типа того. Есть много разных обработок событий с разными текстовыми переменными. Данная процедура служит единым фильтром для всех строк.
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 13:28. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey