Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2013, 16:34   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию Строковый калькулятор

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

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Function Aqual(Text: String): Extended;
Var stack1, stack2: TStringList;
    i: integer;
    a, b: extended;
begin
stack1:= TStringList.Create;
stack2:= TStringList.Create;

//запись в первый стек цифр, в второй стек операций
for i:= 0 to Length(Text) do
if not (Text[i] in ['0'..'9','A'..'Z','a'..'z','+','-','*','/','(',')','^'])
then Exit;
Case Text[i] of
'0'..'9': stack1.Add(Text[i]);
'A'..'Z','a'..'z','+','-','*','/','(',')','^': stack2.Add(Text[i]);
end;

//парсинг стеков по приоритетам

//0
for i:= 0 to stack2.Count-1 do
begin
  a:= StrToFloat(stack1[i]);
  b:= StrToFloat(stack1[i+1]);
  if stack2[i][1] = '^' then
    begin
    stack1.Insert(i,FloatToStr(Power(a,b)));
    stack1.Delete(i+1);
    stack2.Delete(i);
    end;
end;

//1
for i:= 0 to stack2.Count-1 do
begin
  a:= StrToFloat(stack1[i]);
  b:= StrToFloat(stack1[i+1]);
  Case stack2[i][1] of
  '*':
      begin
      stack1.Insert(i,FloatToStr(a*b));
      stack1.Delete(i+1);
      stack2.Delete(i);
      end;
  '/':
      begin
      stack1.Insert(i,FloatToStr(a/b));
      stack1.Delete(i+1);
      stack2.Delete(i);
      end;
  end;
end;

//2
for i:= 0 to stack2.Count-1 do
begin
  a:= StrToFloat(stack1[i]);
  b:= StrToFloat(stack1[i+1]);
  Case stack2[i][1] of
  '+':
      begin
      stack1.Insert(i,FloatToStr(a+b));
      stack1.Delete(i+1);
      stack2.Delete(i);
      end;
  '-':
      begin
      stack1.Insert(i,FloatToStr(a-b));
      stack1.Delete(i+1);
      stack2.Delete(i);
      end;
  end;
  if stack1.Count = 1 then break;
  if stack2.Count = 0 then break;
end;

Result:= StrToFloat(stack1[0]);

stack1.Free;
stack2.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.TextOut(200,200,FloatToStr(Aqual(Edit1.Text)));
end;

end.

Последний раз редактировалось NewLamer&Programer; 08.05.2013 в 16:37.
NewLamer&Programer вне форума Ответить с цитированием
Старый 08.05.2013, 17:01   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,302
По умолчанию

Не вдаваясь в подробности - автор статьи разбирает строку на числа и операции, а Вы на цифры и операции.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.05.2013, 17:15   #3
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не вдаваясь в подробности - автор статьи разбирает строку на числа и операции, а Вы на цифры и операции.
да ладно бы только это... но допустим я даже ввожу одноразрядные числа, например 1+1, все равно же выводит 0, так что тут что то еще
NewLamer&Programer вне форума Ответить с цитированием
Старый 08.05.2013, 17:18   #4
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

впрочем уже ладно НАШЕЛ
NewLamer&Programer вне форума Ответить с цитированием
Старый 08.05.2013, 17:27   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,302
По умолчанию

Код:
  for i := 1 to Length(Text) do
    Case Text[i] of
      '0' .. '9':
        stack1.Add(Text[i]);
      'A' .. 'Z', 'a' .. 'z', '+', '-', '*', '/', '(', ')', '^':
        stack2.Add(Text[i]);
    else
      Exit;
    end;
Ошибка была тут (это исправленный код).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строковый калькулятор, используя mathparser, не работает с дробями efkar Помощь студентам 1 12.06.2012 20:03
Строковый файл ensoleille Помощь студентам 5 15.07.2011 00:10
Строковый калькулятор Blad47 Помощь студентам 9 08.10.2010 00:23
Строковый тип McJordan Паскаль, Turbo Pascal, PascalABC.NET 1 26.08.2010 17:22
строковый калькулятор *Лена* Фриланс 4 06.05.2008 00:41