Показать сообщение отдельно
  #5  
Старый 30.12.2008, 15:48
BlackCash BlackCash вне форума
Прохожий
 
Регистрация: 08.06.2007
Сообщения: 42
Репутация: 15
По умолчанию

Вот держи код, думаю все понятно...

Код:
function ReplaseString(InStr,FindStr,ReplaseStr: String) : string;
var
  id  : integer;
  str : string;
begin
  Result := InStr;
  id     := pos(LowerCase(FindStr), LowerCase(InStr));
  str    := InStr;
  Delete(str,id,length(FindStr));
  Insert(ReplaseStr,str,id);
  Result := str;
end;

function ReplaseAllString(Line, Prefix, Return: String) : String;
var
  tmp  : string;
begin
  tmp := Line;
  while pos(Prefix,tmp) > 0 do
    tmp := ReplaseString(tmp,prefix,return);

  Result := tmp;
end;

procedure GetWordsList(Line: String; List : TStrings);
var
  tmp : String;
begin
  tmp := Line;
  tmp := ReplaseAllString(tmp,' ',#13#10);
  List.Text := tmp;
end;

function CalculateExpression(Expression: String) : integer;
const
  Minus   = '-';
  Plus    = '+';
  Divider = '\';
  Mplying = '*';
var
  Temp    : String;
  sList   : TStringList;
  sResult : integer;
  sCalc   : integer;
  i       : integer;
begin
  sResult := 0;
  sList   := TStringList.Create;
  try
  {}
  Temp  := '';
  for i := 1 to Length(Expression) do
    if (Expression[i] = Minus) or (Expression[i] = Plus) or (Expression[i] = Divider) or (Expression[i] = Mplying) then
    begin
      sList.Add(Temp);
      sList.Add(Expression[i]);
      Temp := '';
    end else
    Temp := Temp + Expression[i];
  sList.Add(Temp);
  {}
  sCalc   := 0;
  sResult := 0;
  i       := 0;
  while i < sList.Count-1 do begin
    if (sList[i] <> Minus) and (sList[i] <> Plus) and (sList[i] <> Divider) and (sList[i] <> Mplying) then begin
      sCalc := strtoint(sList[i]);
    end
    else begin
      if sList[i] = Minus then
        sCalc := (sCalc -   strtoint(sList[i+1]));
      if sList[i] = Plus then
        sCalc := (sCalc +   strtoint(sList[i+1]));
      if sList[i] = Divider then
        sCalc := (sCalc div strtoint(sList[i+1]));
      if sList[i] = Mplying then
        sCalc := (sCalc *   strtoint(sList[i+1]));
      sResult := sCalc;
      inc(i);
    end;
    inc(i);
  end;
  {}
  finally
    Result := sResult;
    sList.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  l : TStringList;
begin
  ListBox1.Clear;
  l := TStringList.Create;
  GetWordsList(Memo1.Text,l);
  {}
  for i := 0 to l.Count-1 do
    if (pos('-',l[i])<>0) or (pos('+',l[i])<>0) or (pos('*',l[i])<>0) or (pos('\',l[i])<>0) then
    begin
      try
        ListBox1.Items.Add(l[i]+'='+inttostr(CalculateExpression(l[i])));
      except
      end;
    end;
  {}
  l.Free;
end;
Вложения
Тип файла: rar GET MATH.rar (2.1 Кбайт, 8 просмотров)
Ответить с цитированием