Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Калькулятор в строке   Найти похожие ветки 

 
Dezigo ©   (2007-12-19 01:39) [0]

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


 
Германн ©   (2007-12-19 01:43) [1]


> Dezigo ©   (19.12.07 01:39)

Ищи в гугле "обратная польская запись".


 
Григорьев Антон ©   (2007-12-19 09:09) [2]


> Германн ©   (19.12.07 01:43) [1]
> Ищи в гугле "обратная польская запись".

Объясните мне, зачем для вычисления выражения нужна обратная польская (постфиксная) запись? Сначала вы методом рекурсивного спуска делаете перевод инфиксной записи в постфиксную, а потом реализуете стековую машину для вычисления выражения, заданного в виде постфиксной записи. Это неоправданное усложнение, потому что методом рекурсивного спуска можно сразу вычислять инфиксное выражение.

Dezigo:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10 - там есть готовый пример того, что вам нужно (за исключением того, что числа не целые, а вещественные), но я надеюсь, что вы всё-таки не скопируете его тупо, а разберётесь с теорией, которая там тоже есть.


 
Dimka Maslov ©   (2007-12-19 11:17) [3]

Если в выражении отсутствуют скобки, тогда простейший алгоритм выглядит так.
1. Ищем в строке первый символ умножения или деления записиваем его индекс в переменную Pos2
2. От позиции Pos2 влево ищем любой знак операции, записываем индекс в позицию Pos1
3. От позиции Pos2 вправо ищем любой знак операции, записываем индекс в позицию Pos3
4. Выделяем подстроку Op1 (копируем все символы между Pos1 и Роs2
5. Выделяем подстроку Op2 (копируем все символы между Pos2 и Роs3
6. Переводим Op1 и Op2 в числовое представление вычиляем значение операции.
7. Убираем из начального выражения все символы между Pos1 и Pos3, вставляем на его место результат.
8. Повторяем пп1..7 до тех пор, пока строка содержит символы умножения и деления
9. Делаем тоже самое для сложения и вычитания.

Конечно, алгоритм медленный и делать надо бы по другому, но он прост и позволяет ещё и выводить промежуточные результаты (для красоты)


 
oldman ©   (2007-12-19 11:19) [4]


> Григорьев Антон ©   (19.12.07 09:09) [2]
> Объясните мне, зачем для вычисления выражения нужна обратная
> польская (постфиксная) запись?


Она обычно присутствует во всех учебниках по работе со стеком именно для преобразования строки арифметических операций.
Вот в память и въелось :)))


 
ANB ©   (2007-12-19 17:38) [5]

Пишется за 5 минут, если :
1) есть СКЛ сервер (оракл, например)
2) написать на клиппере или фоксе.
В обоих случаях в среде имеется встроенный исполнитель выражений.


 
Jeer ©   (2007-12-19 17:43) [6]

Ну да, осталось написать фокс, клиппер или сиквэл и запускать их из Delphi


 
Kerk ©   (2007-12-19 17:45) [7]

http://progler.ru/search?cx=000478898831061129014%3A_kgkiuuegem&q=%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F+%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F+%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C&cof=FORID%3A11#860


 
Elec3C ©   (2007-12-19 21:15) [8]


> Мне задали написать калькулятор  в строке

...
s : String;
...
s := "Калькулятор";)))))


 
Loginov Dmitry ©   (2007-12-19 22:02) [9]

uses
 MSScriptControl_TLB;

procedure TForm1.Button1Click(Sender: TObject);
var
 SC: TScriptControl;
begin
 SC := TScriptControl.Create(nil);
 try
   SC.Language:="VBScript";
   ShowMessage(SC.Eval(Edit1.Text));
 finally
   SC.Free;
 end;
end;


 
Kostafey ©   (2007-12-19 23:24) [10]

> [9] Loginov Dmitry ©   (19.12.07 22:02)
> uses
> MSScriptControl_TLB;
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> SC: TScriptControl;
> begin
> SC := TScriptControl.Create(nil);
> try
>   SC.Language:="VBScript";
>   ShowMessage(SC.Eval(Edit1.Text));
> finally
>   SC.Free;
> end;
> end;

Здорово.

Кстати, можно еще через Excel.

Првда препод. вряд ли думал, что его задачка будет решена таким образом :)


 
Petr V. Abramov ©   (2007-12-19 23:54) [11]

> Првда препод. вряд ли думал, что его задачка будет решена таким образом :)
в оригинале задачка начинается с
"прийти на лабу, где препод подскажет...."
:)


 
grisme   (2007-12-20 08:56) [12]

здесь на сайте лежала статейка(см.раздел "Статьи") про парсинг матвыражений(даже с учетом производных, кажется) - если конечно не удалили.



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
3-1190320214
dRake
2007-09-21 00:30
2008.01.27
Строки/преобразования типов в ХП Interbase/Firebird


2-1198725839
Washington
2007-12-27 06:23
2008.01.27
Копирование таблиц из одной базы данных в другую


2-1199000648
XerSon
2007-12-30 10:44
2008.01.27
Как задекларировать свою процедуру в { Private declarations } ?


2-1199032641
den11111
2007-12-30 19:37
2008.01.27
Что делаю не так с запуском ярлыка


15-1198146970
Alkid
2007-12-20 13:36
2008.01.27
PIF-файл