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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2013, 23:38   #1
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию Преобразование из инфиксной нотации

Итак пишу строковый калькулятор (в строку записывается арифметическое выражение и производятся вычисления). Вопросы начались с того момента как необходимо было определить является ли операция лево-ассоциированной или право-ассоциированной, или как определить что унарный оператор является знаком числа (т.е. -1+2 , а не 2-1)?
предполагается использование только следующих операторов +-*/^
MIKE11IPME вне форума Ответить с цитированием
Старый 25.04.2013, 02:07   #2
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

код некорректно работает , а точнее почему-то добавляет пустые пробелы в одну из строк, т.е. при записи 2+2 он должен вывести 22+ , а выводиться только 2 , подозреваю что делит не так удаляет и задно не укорачивает длину строки.
Код:
function opz(strc00:string):string;
var t,f,u,i:Integer; ad:Char; strc01,steckc00:string;
label inct;
begin
  t:=1;
  f:=Length(strc00);
  while t<(f+1) do
    begin
      ad:=strc00[t];
      if IsCharAlphaNumeric(ad) then
        begin
          strc01:=strc01+ad;
          goto inct;
        end;
      if ad=')' then
        begin
          for i:=Pos('(',steckc00)+1 to f do strc01:=strc01+steckc00[i];
          u:=f-pos('(',steckc00)+1;
          Delete(steckc00,pos('(',steckc00),u);
          goto inct;
        end;
      if steckc00=EmptyStr then steckc00:=ad else
        begin
          case ad of
            '+','-': begin
                       strc01:=strc01+steckc00[t-1];
                       Delete(steckc00,t-1,1);
                     end;
            '*','/': begin
                       if (steckc00[t-1]<>'+')or(steckc00[t-1]<>'-')then
                         begin
                           strc01:=strc01+steckc00[t-1];
                           Delete(steckc00,t-1,1);
                         end
                     end;
          end;
          steckc00:=steckc00+ad;
        end;
      inct:
      Inc(t);
    end;
  for t:=Length(steckc00) downto 1 do strc01:=strc01+steckc00[t];
  Result:=strc01;
end;

procedure TForm1.Button1Click(Sender: TObject);
var strc0,strc1:string;
begin
strc0:=Edit1.Text;
strc1:=opz(strc0);
ShowMessage(strc1);
end;
MIKE11IPME вне форума Ответить с цитированием
Старый 25.04.2013, 02:11   #3
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

некорректно работает с выражениями аля 9+6/3*9
MIKE11IPME вне форума Ответить с цитированием
Старый 25.04.2013, 09:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

MIKE11IPME, а не хотите воспользоваться моим кодом?..
библиотечка для разбора выражений в инфиксной форме Exprus.
отсюда
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.04.2013, 10:13   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
      ad:=strc00[t];
t индекс текущей позиции в исходной строке

Код:
                       strc01:=strc01+steckc00[t-1];
t индекс заполнения (текущей позиции) в рабочем стеке.
чему спрашивается верить?

Код:
      inct:
      Inc(t);
опять индекс в исходной строке !
советую ознакомиться http://www.gunsmoker.ru/2011/01/blog-post.html
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.04.2013, 11:18   #6
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

спасибо понял ошибку, вообще не обратил на это внимание когда писал...лучше на ночь глядя ничего не писать
MIKE11IPME вне форума Ответить с цитированием
Старый 25.04.2013, 11:45   #7
MIKE11IPME
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
MIKE11IPME, а не хотите воспользоваться моим кодом?..
библиотечка для разбора выражений в инфиксной форме Exprus.
отсюда
если не сумею реализовать весь необходимый функционал , так и быть воспользуюсь вашей бибитекой
MIKE11IPME вне форума Ответить с цитированием
Старый 25.04.2013, 12:17   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
так и быть воспользуюсь вашей бибитекой
Оригинально. Типа сделаю одолжение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2013, 14:35   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от MIKE11IPME
так и быть воспользуюсь вашей бибитекой
Супер!
я буду надеяться и ждать, что Вы меня осчастливите этой милостью!
Спасибо Вам, что позволяете мне на это надеяться!!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование арифметического выражения из инфиксной в постфиксную форму записи Nelson1992 Паскаль, Turbo Pascal, PascalABC.NET 2 29.05.2021 18:04
Из инфиксной в постфиксную запись Колесо Общие вопросы C/C++ 1 18.12.2011 10:54
построение бинарного дерева по инфиксной записи Екатерина Семенова Помощь студентам 1 23.05.2011 20:45
Перевод из инфиксной записи в обратную польскую Anny_Apple Паскаль, Turbo Pascal, PascalABC.NET 1 10.04.2011 20:49
Реализация объєктно-ориентированого подхода при разработке программы (с использованием нотации Буча) Vikk22 Помощь студентам 3 18.11.2007 19:53