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

Вниз

Строчный калькулятор   Найти похожие ветки 

 
Volf_555   (2005-09-23 00:46) [0]

Вот код, в котором работает только сложение. Остальные математические действия не работают почему-то. Суть программы в том, что в TEdit вводится математическая строка, например: 10+5+7*9 и в другом TEdit выводится результат. Сложение работает отлично. А вот другие знаки - нет

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Edit1: TEdit;
   Edit2: TEdit;
   Button1: TButton;
   Panel2: TPanel;
   Edit3: TEdit;
   Button2: TButton;
   Edit4: TEdit;
   Button3: TButton;
   Memo1: TMemo;
   Button4: TButton;
   Memo2: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
s:String;
begin
edit2.Text:="";
s:=edit1.Text;
if Length(edit1.Text)>0 then
begin
for i:=1 to Length(edit1.Text) do
begin
 if i mod 2 = 1 then
 edit2.Text:=edit2.Text+UpperCase(s[i]) else
 edit2.Text:=edit2.Text+LowerCase(s[i]);
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
s:String; //îáùàÿ ñòðîêà ââîäà
v:Integer;
f:array of String; //ìàññèâ ñòðîê (öèôð è çíàêîâ)
op:Char;
begin
memo1.Clear;
s:=edit3.Text;
edit3.SelStart:=0;
for v:=1 to Length(edit3.Text) do
begin
 case s[v] of
  "+":
  begin
   edit3.SelLength:=v-1;
   memo1.Lines.Add(edit3.SelText);
   memo1.Lines.Add("ïëþñ");
   edit3.SelStart:=v;
  end;
  "-":
  begin

  end;
  end;
 end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
StrToFloat("2");
ShowMessage(FloatToStr(2+3));
end;

procedure TForm1.Button4Click(Sender: TObject);
var
v:Integer; //äëèíà ñòðîêè ìàòåìàòè÷åñêîé ôîðìóëû
s:String; //äîáàâëåíèå êàæäîãî ñèìâîëà íà íîâóþ ñòðîêó
d:String; //ïðîìåæóòî÷íîå çíà÷åíèå ÷èñåë è çíàêîâ
e:Real; //ïðîìåæóòî÷íûé è îêîí÷àòåëüíûé ðåçóëüòàò ìàòåìàòè÷åñêèõ äåéñòâèé
begin
memo1.Lines.Clear;
memo2.Lines.Clear;
s:=edit3.Text;
s:=s+"+";
e:=0;
for v:=1 to Length(s) do
begin
 if s[v]<>"+" then
 begin
  memo1.Lines.Add(s[v]);
  d:=d+s[v];
 end else
 if s[v]="+" then
 begin
  memo2.Lines.Add(d);
  memo1.Lines.Add("+");
  e:=e+StrToFloat(d);
  d:="";
 end else
 if s[v]="-" then
 begin
  memo2.Lines.Add(d);
  memo1.Lines.Add("-");
  e:=e-StrToFloat(d);
  d:="";
 end else
 if s[v]="*" then
 begin
  memo2.Lines.Add(d);
  memo1.Lines.Add("*");
  e:=e*StrToFloat(d);
  d:="";
 end else
 if s[v]="/" then
 begin
  memo2.Lines.Add(d);
  memo1.Lines.Add("/");
  e:=e/StrToFloat(d);
  d:="";
 end;
end;
edit4.Text:=FloatToStr(e);
end;

end.


 
Котик Б   (2005-09-23 08:47) [1]

Я почемуто всегода думал что такие задачи решаются переводом выражения в постфиксную форму и с учетом приоритетов операций....
Возможно я отстал от жизни и решать их нужно именно так ?


 
Джо ©   (2005-09-23 09:04) [2]


>  [1] Котик Б   (23.09.05 08:47)

Метод, предложенный в [0], становится бешенно популярен, это вы правы...


 
Barloggg   (2005-09-23 10:03) [3]

хмм... а почему в основной процедуре удлиннение переменной d в которой, как я понял, и собирается число, происходит только тогда, когда текущий символ не равен "+"?
Это условие надо удлиннить на все возможные знаки и должно работать.

Но, кстати такой метод это некорректно. ибо не учесть приоритеты.

вот кстати пример:
встроенный виндовый калькулятор
пишем выражение 2+2*2=.
результат будет различным для обычного и инженерного видов.

обычный работает вот по алгоритму [0] а инженерный - как надо.


 
REA   (2005-09-23 11:23) [4]

я в свое время тоже парсер - каклькулятор написал. выложить что ли?


 
Котик Б   (2005-09-23 11:33) [5]

REA   (23.09.05 11:23) [4]
>выложить что ли?

А смысл ? В сети куча парсеров мат. выражений - если б нужно было давно нашел бы, видимо свой написать хочет...


 
Barloggg   (2005-09-23 12:41) [6]

А мне вот нужен не только калькулятор выражений, а даже более-менее строчный компилятор. Для скриптов.
А Дельфийский компилер таскать с собой не хочу.


 
Volf_555   (2005-09-24 02:41) [7]

>>>Barloggg   (23.09.05 10:03) [3]
ПЛЮС я написал по той причине, что сперва идёт обработка значения ПЛЮС, а потом, если знак не ПЛЮС, идёт обработка других знаков. Вот здесь и начинаются вопросы! Почему работает только знак ПЛЮС, а остальные знаки работать не хотят?

>>>Это условие надо удлиннить на все возможные знаки и должно работать.

Пробывал удлинять это условие на все возможные знаки - результат тот же!

У меня напрашивается один вывод - тип Extended или Real можно только складывать, но не минусовать, делить.......................

Но есть один парадокс - если обрабатывать в скобках сразу значение, то результат будет идти на УРА. Вот примеры:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FloatToStr(12-6));
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FloatToStr(12/6));
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FloatToStr(12*6));
end;


И ещё один парадокс:
При написании следующего кода выскакивает ошибка


procedure TForm1.Button1Click(Sender: TObject);
var
b:Extended;
begin
b:=StrToFloat("12*3+2/5+3/5");
ShowMessage(FloatToStr(b));
end;


Хотя следующий код будет верным:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FloatToStr(12*3+2/5+3/5));
end;


Обясните - почему так получается и как исправить эту ошибку?


 
Джо ©   (2005-09-24 02:46) [8]


> [7] Volf_555   (24.09.05 02:41)

Забей на это все и почитай литературу по теме.

ОФФТОП:
У кого-нибудь сохранился архив незабываемой ветко про писание калькулятора? С удовольствием принял бы на мыло.


 
GrayFace ©   (2005-09-24 06:18) [9]

LOL


> ОФФТОП:
> У кого-нибудь сохранился архив незабываемой ветко про писание
> калькулятора? С удовольствием принял бы на мыло.

Отправлю, если не забуду. Ведь речь о том калькуляторе, который я писал?


 
Юрий Зотов ©   (2005-09-24 08:44) [10]

> Volf_555   (24.09.05 02:41) [7]

> У меня напрашивается один вывод - тип Extended или Real можно только
> складывать, но не минусовать, делить.

Ох, и у меня тоже напрашивается один вывод... особенно, после [7].

Ну, чтобы нам тут выводами друг в друга не бросаться, посмотрите вот эту ссылочку, там все про Вашу задачу подробненько расписано, и код готовый тоже есть:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10


 
GrayFace ©   (2005-09-24 10:22) [11]

В Орешник это надо.


 
Anatoly Podgoretsky ©   (2005-09-24 12:29) [12]

Джо ©   (23.09.05 09:04) [2]
Популярным становится решения A *  b, как a+a+...


 
atruhin ©   (2005-09-24 17:16) [13]

А ещё лучше "Книгу Дракона" почитать :)


 
TStas ©   (2005-09-24 20:30) [14]

{Офффтопик}
>Юрий Зотов
Сколько же я искал эту статью:)


 
Джо ©   (2005-09-24 21:42) [15]


>  [9] GrayFace ©   (24.09.05 06:18)

Да, она, кажется. Она еще была такой длинной-длиной, что вроде даже на 2 ветки разделилась. Вышли, плиз на kaminski#ihome.net.ua (# = @).


 
lookin ©   (2005-09-24 22:12) [16]

[10] Юрий Зотов ©   (24.09.05 08:44)
>>http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10

Статья хорошая, но она не дает ничего касательно обработки символьного представления массивов и элементов массивов...


 
Джо ©   (2005-09-24 22:19) [17]


> Статья хорошая, но она не дает ничего касательно обработки
> символьного представления массивов и элементов массивов...

Для этого достаточно освоить Language Reference.


 
lookin ©   (2005-09-24 22:20) [18]

[17] Джо ©   (24.09.05 22:19)

Например?


 
Джо ©   (2005-09-24 22:55) [19]


>  [18] lookin ©   (24.09.05 22:20)
> [17] Джо ©   (24.09.05 22:19)
>
> Например?

Для того, чтобы освоить "обработку элементов массивов", достаточно прочитать соответствующие разделы из Language Reference. Я не прав? Или ты о чем-то "о другом, о своем"?


 
lookin ©   (2005-09-24 22:58) [20]

[19] Джо ©   (24.09.05 22:55)

Лучше просто скажи, как бы ты построил обработал строки типа

 Element[i].Value[i][TheFunc(a,b,c)+1]+SomeArray[TheFuncB(z)][54+52]


 
Джо ©   (2005-09-24 23:12) [21]

[20] lookin ©   (24.09.05 22:58)
> обработал строки типа

Я неверно понял твое замечание в [16], приношу извинения и снимаю претензии :) Впрочем, замечу, что в смысле синтаксического разбора ничего особенно сложного в твоем примере не вижу ;)

А по поводу статьи - там же просто даются основы, она и не претендует на большее. Дается к тому же ссылка на 2 книги, более подробно раскрывающие тему. Со своей стороны, могу порекоммендовать следующие источники, с различной степенью сложности, в случайном порядке:

1. Д. Креншоу. Пишем компилятор. (примеры на Паскале, изложение очень неспешное и поэтапное).
2. В.А Серебряков, М.П. Галочкин. Основы конструирования компиляторов.
3. Julia Bucknell. The Tomes of Delphi Algotithms and Data Structures (главы о синтаксическом разборе и смежные)
4. А. Ахо, Р. Сети, Д. Ульман. Компиляторы. Принципы, технологии и инструменты. Ну, эта в комментариях не нуждается, aka "Книга Дракона" :)


 
jack128 ©   (2005-09-24 23:15) [22]

lookin ©   (24.09.05 22:58) [20]
atruhin ©   (24.09.05 17:16) [13]
лучше "Книгу Дракона" почитать :)


 
lookin ©   (2005-09-24 23:25) [23]

[21] Джо ©   (24.09.05 23:12)
>>в смысле синтаксического разбора ничего особенно сложного в твоем примере не вижу ;)

И каким же образом будет построен ТВОЙ алгоритм? Если не сложно...


 
Джо ©   (2005-09-24 23:50) [24]


>  [23] lookin ©   (24.09.05 23:25)
> И каким же образом будет построен ТВОЙ алгоритм?

1. Опишу формальную грамматику
2. Напишу лексический анализатор, который будет разбивать поток на лексемы
3. Передам поток лексем в синтаксический анализатор, который проверит поток на соответствие п.1.
Дальнейнее завист от того, что, собственно, необходимо сделать.


 
lookin ©   (2005-09-24 23:54) [25]

[24] Джо ©   (24.09.05 23:50)

На словах и я могу....


 
Джо ©   (2005-09-24 23:59) [26]


>  [25] lookin ©   (24.09.05 23:54)
> На словах и я могу....

Ну, не писать же мне тут готовый интерпретатор "для примера". Кому нужно, тот пусть и пишет, мне, слава Аллаху, в нем нужды нет (чур, меня) :)
А без теории, имхо, за это дело даже браться не стоит - себе дороже.


 
lookin ©   (2005-09-25 00:02) [27]

[26] Джо ©   (24.09.05 23:59)
>>А без теории, имхо, за это дело даже браться не стоит - себе дороже.

Это верно


 
TStas ©   (2005-09-25 02:24) [28]

Если уж так нужен интерпритатор, есть же, слава Богу, паскаль скрипт. Не все же самому писать


 
Volf_555   (2005-09-25 03:17) [29]

Народ! Спасибо всем за ответы, но окончательный ответ на свой вопрос не нашёл, хотя подчеркнул нечто новое.

Кто может дать пример обработки знаков минуса, умножения и деления?
Или же указать мне на ошибку в коде?


P.S.: Смотрел ссылку (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10), но там слишком мудрённо написано.


 
jack128 ©   (2005-09-25 03:33) [30]

между прочим к статье есть примеры..


 
Джо ©   (2005-09-25 03:34) [31]

[29] Volf_555   (25.09.05 03:17)
> P.S.: Смотрел ссылку (http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10),
> но там слишком мудрённо написано.

Это может показаться сложным, по той простой причине - что это и есть сложно (почти цитата).
Разбирайся, взялся за гуж...


 
lookin ©   (2005-09-25 05:35) [32]

[28] TStas ©   (25.09.05 02:24)

а куда этот паскаль скрипт пихать то??


 
Volf_555   (2005-09-29 20:21) [33]

В смысле куда?! И скажи насчёт паскаль-скрипта - что это такое и что он даёт?



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

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

Наверх




Память: 0.56 MB
Время: 0.052 c
4-1124447974
Alex870
2005-08-19 14:39
2005.10.23
PID процесса


2-1127911383
Deposit
2005-09-28 16:43
2005.10.23
С чего начать изучение Delphi ???


14-1127659842
Eraser
2005-09-25 18:50
2005.10.23
Перевод фразы на English


1-1127979875
Asmys Software
2005-09-29 11:44
2005.10.23
Ring-0


2-1128003182
hooky-mars
2005-09-29 18:13
2005.10.23
Непонятка с var в dll`ай