![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Строчный калькулятор [D6, D7, WinXP]
Volf_555 © (2005-09-23 00:46:00)Вот код, в котором работает только сложение. Остальные математические действия не работают почему-то. Суть программы в том, что в 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.
atruhin (2005-09-24 17:16:00) [21]А ещё лучше "Книгу Дракона" почитать :)
Anatoly Podgoretsky (2005-09-24 12:29:00) [22]Джо © (23.09.05 09:04) [2]
Популярным становится решения A * b, как a+a+...
GrayFace (2005-09-24 10:22:00) [23]В Орешник это надо.
Юрий Зотов (2005-09-24 08:44:00) [24]> Volf_555 (24.09.05 02:41) [7]
> У меня напрашивается один вывод - тип Extended или Real можно только
> складывать, но не минусовать, делить.
Ох, и у меня тоже напрашивается один вывод... особенно, после [7].
Ну, чтобы нам тут выводами друг в друга не бросаться, посмотрите вот эту ссылочку, там все про Вашу задачу подробненько расписано, и код готовый тоже есть:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=10
GrayFace (2005-09-24 06:18:00) [25]LOL
> ОФФТОП:
> У кого-нибудь сохранился архив незабываемой ветко про писание
> калькулятора? С удовольствием принял бы на мыло.
Отправлю, если не забуду. Ведь речь о том калькуляторе, который я писал?
Джо (2005-09-24 02:46:00) [26]
> [7] Volf_555 (24.09.05 02:41)
Забей на это все и почитай литературу по теме.
ОФФТОП:
У кого-нибудь сохранился архив незабываемой ветко про писание калькулятора? С удовольствием принял бы на мыло.
Volf_555 (2005-09-24 02:41:00) [27]>>>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;
Обясните - почему так получается и как исправить эту ошибку?
Barloggg (2005-09-23 12:41:00) [28]А мне вот нужен не только калькулятор выражений, а даже более-менее строчный компилятор. Для скриптов.
А Дельфийский компилер таскать с собой не хочу.
Котик Б (2005-09-23 11:33:00) [29]REA (23.09.05 11:23) [4]
>выложить что ли?
А смысл ? В сети куча парсеров мат. выражений - если б нужно было давно нашел бы, видимо свой написать хочет...
REA (2005-09-23 11:23:00) [30]я в свое время тоже парсер - каклькулятор написал. выложить что ли?
Barloggg (2005-09-23 10:03:00) [31]хмм... а почему в основной процедуре удлиннение переменной d в которой, как я понял, и собирается число, происходит только тогда, когда текущий символ не равен "+"?
Это условие надо удлиннить на все возможные знаки и должно работать.
Но, кстати такой метод это некорректно. ибо не учесть приоритеты.
вот кстати пример:
встроенный виндовый калькулятор
пишем выражение 2+2*2=.
результат будет различным для обычного и инженерного видов.
обычный работает вот по алгоритму [0] а инженерный - как надо.
Джо (2005-09-23 09:04:00) [32]
> [1] Котик Б (23.09.05 08:47)
Метод, предложенный в [0], становится бешенно популярен, это вы правы...
Котик Б (2005-09-23 08:47:00) [33]Я почемуто всегода думал что такие задачи решаются переводом выражения в постфиксную форму и с учетом приоритетов операций....
Возможно я отстал от жизни и решать их нужно именно так ?