Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.045 c
2-1127825697
Anton22
2005-09-27 16:54
2005.10.23
Строка в буфер


4-1124295704
TG
2005-08-17 20:21
2005.10.23
Хочу написать звонилку


4-1124631667
Дмитрий_05
2005-08-21 17:41
2005.10.23
Проблема с WM_SIZE


2-1128327404
Eleepod
2005-10-03 12:16
2005.10.23
Закрытие окна во время цикла


3-1126247046
kreyl
2005-09-09 10:24
2005.10.23
Как остановить выполнение длинного запроса?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский