Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выполнить string'ую переменную 
:(
    Опции темы
fanat107
Дата 22.3.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



У меня такой вопрос. Допустим стринговая переменная сожержит выражение (1+2) и мне надо ето выражение выполнить и преравнять переменной. Можно ли это сделать и если можно то как?
PM ICQ   Вверх
XbiT
Дата 22.3.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 9.2.2006

Репутация: нет
Всего: 1



Думаю этот вопрос больше подходит в раздел Алгоритмы.
Посмотри это http://algolist.manual.ru/syntax/revpn.php
Вот моя реализация алгоритма(писал давно на freepascal'e, так что не уверен что всё правильно smile):
Код

Const
   Oper : array [1..5] of char = ('(', '+', '-', '*', '/');
   Priority : array [1..5] of byte = (0, 1, 1, 2, 2);
Var
   SA : array [1..120] of char;
   SB : array [1..120] of longint;
   LenSA, LenSB : integer;

Procedure Push(Num : longint); overload; Begin inc(LenSB); SB[LenSB] := Num; end;
Procedure Push(Num : Char); overload; Begin inc(LenSA); SA[LenSA] := Num; end;

Procedure Evaluate(Num1, Num2 : longint; Operation : Char);
Var
   Rez : longint;
begin
   Rez := 0;
   Case Operation of
      '+' : Rez := Num1 + Num2;
      '-' : Rez := Num1 - Num2;
      '*' : Rez := Num1 * Num2;
      '/' : Rez := Num1 div Num2;
   end;
   dec(LenSA);
   dec(LenSB);
   SB[LenSB] := Rez;
end;

Function Calc(Expr : string) : longint;
Var
   Position, tPrior : longint;

   Procedure GetNumber;
   Var
      StrNum : string;
      RezNum : longint;
   begin
      StrNum := '';
      while Expr[Position] in ['0'..'9'] do
         begin
            StrNum := StrNum + Expr[Position];
            inc(Position);
         end;
      Val(StrNum, RezNum);
      Push(RezNum);
   end;

begin
   Position := 1; LenSB := 0; LenSA := 0;
   while Position <= Length(Expr) do
      begin
         if Expr[Position] in ['0'..'9'] then
            GetNumber()
          else
            if (Expr[Position] = '(') or (LenSA = 0) then
               begin
                  Push(Expr[Position]);
                  inc(Position);
                  if Expr[Position] = '-' then
                     insert('0', Expr, Position);
               end
             else
               if (Expr[Position] = ')') then
                  begin
                     while (SA[LenSA] <> '(') do
                        begin
                           Evaluate(SB[LenSB-1], SB[LenSB], SA[LenSA]);
                        end;
                        dec(LenSA);
                        inc(Position);
                     end
                else
                  begin
                     tPrior := Priority[ Pos(Expr[Position], Oper) ];
                     while (Priority[ Pos(SA[LenSA], Oper) ] >= tPrior)
                              and (LenSA > 0) do
                        begin
                           Evaluate(SB[LenSB-1], SB[LenSB], SA[LenSA]);
                        end;
                        Push(Expr[Position]);
                        inc(Position);
                  end;
      end;
      while LenSA > 0 do
         Evaluate(SB[LenSB-1], SB[LenSB], SA[LenSA]);
      Calc := SB[1];
end;
Procedure DeleteSpace(Var Str : string);
begin
   While pos(' ', Str) > 0 do
      delete(Str, pos(' ', Str), 1);
end;
Var
   Expr : string;
   FileIn, FileOut : Text;
   tVariable : char;
   tmp : longint;
begin
   Assign(FileIn, 'input.txt'); Reset(FileIn);
   Assign(FileOut, 'output.txt'); ReWrite(FileOut);
   Readln(FileIn, Expr);
   DeleteSpace(Expr);
   Expr := '(' + Expr + ')';
   Writeln(FileOut, Calc(Expr));
   Close(FileIn); Close(FileOut);
end.

PM MAIL   Вверх
fanat107
Дата 22.3.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



С этим алгоритмом в принципе я знаком. Мне бы хотелось знать нет ли в Дельфи стандартных заготовок, а то при усложнение выражения. Его обработка сильно усложниться.
PM ICQ   Вверх
Poseidon
Дата 22.3.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



нет


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
fanat107
Дата 22.3.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



и еще на последок если у меня в стринговой переменной находится функция, то у еня нет выхода кроме как приведенный выше алгоритм для построения графика аналогово и цифрового.
PM ICQ   Вверх
Демо
Дата 22.3.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Код

procedure TForm1.Button1Click(Sender: TObject);    
var    
  sc: Variant;    
begin    
  SC:=CreateOLEObject('ScriptControl');    
  try    
    SC.Language:='VBScript';    
    SC.Timeout:=-1;    
    SC.AllowUI:=True;    
    Label1.Caption:=SC.Eval(Edit1.Text);    
  finally    
    SC:=Unassigned;    
  end;    
end;



--------------------
    
PM MAIL ICQ Skype   Вверх
fanat107
Дата 22.3.2006, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



Цитата(Демо @ 22.3.2006, 01:25)
Код

procedure TForm1.Button1Click(Sender: TObject);    
var    
  sc: Variant;    
begin    
  SC:=CreateOLEObject('ScriptControl');    
  try    
    SC.Language:='VBScript';    
    SC.Timeout:=-1;    
    SC.AllowUI:=True;    
    Label1.Caption:=SC.Eval(Edit1.Text);    
  finally    
    SC:=Unassigned;    
  end;    
end;

слушай а еще можешь прокоментировать, так как я мало понял и у меня вылазит ошибка(5 строка) и я не знаю как её истравить.
PM ICQ   Вверх
Guedda
Дата 22.3.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Просто необходимо парсить строку. Способов парсинга существует много. Не один этот алгоритм.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ТоляМБА
Дата 22.3.2006, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: нет
Всего: 252



Цитата(fanat107 @ 22.3.2006, 06:40 Найти цитируемый пост)
слушай а еще можешь прокоментировать, так как я мало понял и у меня вылазит ошибка(5 строка) и я не знаю как её истравить.
Дэлфей под рукой нет, но насколько я помню для команды CreateOLEObject надо в uses добавить модуль ComObj

PM   Вверх
Демо
Дата 22.3.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



ТоляМБА,

Так точно, ComObj


--------------------
    
PM MAIL ICQ Skype   Вверх
fanat107
Дата 25.3.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



Когда этот код вставляешь в цикл и хочешь чтобы он находил значение функции в зависимости от счетчика цикла( например sin(i*pi)), то он не работает(просто не считет). Как можно это сделать.
PM ICQ   Вверх
Демо
Дата 25.3.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Прекрасно считает:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  sc: Variant;
  i: Integer;
begin
  SC:=CreateOLEObject('ScriptControl');
  try
    SC.Language:='VBScript';
    SC.Timeout:=-1;
    SC.AllowUI:=True;
    for i := 0 to 100 do
    begin
      Memo1.Lines.Add(FloatToStr(SC.Eval('Sin('+IntToStr(i)+')')));
    end;
  finally
    SC:=Unassigned;
  end;
end;




--------------------
    
PM MAIL ICQ Skype   Вверх
fanat107
Дата 26.3.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



а как при этом можно посччитать 'ln' и указывать константу 'pi' ?
PM ICQ   Вверх
Guedda
Дата 26.3.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



ln - есть такая функция... И Пи есть число...
Подключи модуль Math и прочитай про него побольше. Там все есть... А принцип тебе рассказали.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
fanat107
Дата 26.3.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 27
Регистрация: 18.3.2006
Где: г.Владимир

Репутация: нет
Всего: нет



я знаю что они там есть и в простом выражение они работают прекрасно, но когда я вставляю их в этот код то вылазят ошибки.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.