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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 13:05   #1
krasava0012
 
Регистрация: 30.04.2012
Сообщений: 3
По умолчанию Работа со строками: постфиксная, инфиксная и префиксная запись.

По условию задачи мне требуеться
a) префиксная -> постфиксная
b) постфиксная -> префиксная
c) префиксная -> инфиксная
d) постфиксная -> инфиксная

пока написал лишь это но оно пока не работает...

Код:
program postfixToInfix;

const   MAXStack = 100;

var
  Stack:array[1..MAXStack] of String;
  TopofStack:integer; {указатель на начало стека}
  sInput : string;   
  
{ помещение объекта в стек }
procedure Push(i:string);
begin
  if TopofStack >= MAXStack then WriteLn('Стейк заполнен')
  else
  begin
    stack[TopofStack]:=i;
    TopofStack:=TopofStack+1;
  end;
end;
{ конец  процедуры  помещения объекта в стек}



{ выборка объекта из стека }
function Pop:string;
begin
  TopofStack:=TopofStack-1;
  if TopofStack < 1 then
  begin
    WriteLn('переполнение стека снизу');
    TopofStack:=TopofStack+1;
    Pop:=' ';
  end
  else Pop := stack[TopofStack];
end;
{ конец функции выборки объекта из стека }
  

function Calculate(s : string) : string;

var i,i0, k : integer;
    s0, d0 : string;
    
begin
  i:=1;
  while i<=Length(s) do begin
    i0 :=0;
    while ((i+i0)<=Length(s)) do 
      inc(i0);
    if i0 > 0 then {нашли число в строке. поместим его в стек} 
    begin
      s0 := Copy(s,i,i0);
      Push(s0);
      inc(i, i0);
    end
    else begin
      case s[i] of
       ' ' : begin end;
       '+' : Push(concat(Pop, '+', Pop));
       '-' : Push(concat('-', Pop, '+', Pop));
       '*' : Push(concat(Pop, '*', Pop ));
       '/' : Push(concat(Pop, '/', s0));
      end;
      inc(i);
    end;
  end;
  Calculate := Pop;
end;

Begin

  TopofStack := 1; {проиницилизируем стек}
  WriteLn('Введите выражение в постфиксной форме');
  ReadLn(sInput);
  
  WriteLn('Инфиксное представление строки " '+sInput+' " равено ',  Calculate(sInput));
  Readln;

End.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 01.05.2012 в 05:56.
krasava0012 вне форума Ответить с цитированием
Старый 01.05.2012, 05:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
пока написал лишь это
во-первых, узнаю свой код (например, отсюда)

А во-вторых, этот код делает НЕ ТО, что Вам нужно! Этот код ВЫЧИСЛЯЕТ значение выражения, а Вам, как понимаю, нужно осуществлять ПЕРЕВОД из одного вида записи выражения - в другой...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2012, 20:18   #3
krasava0012
 
Регистрация: 30.04.2012
Сообщений: 3
По умолчанию

дада, код ваш. Дело в том что я попытался использовать это но у меня ничего не получилось...ни одной программы еще не написал а надо к концу мая сдать
krasava0012 вне форума Ответить с цитированием
Старый 01.05.2012, 23:16   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну так я говорю Вам - этот код предназначен для вычисления выражения. Вам же нужно другое.
Гуглить пробовали? Теорию перевода из одной форму в другую почитали?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 22:33   #5
krasava0012
 
Регистрация: 30.04.2012
Сообщений: 3
По умолчанию

пробовал...читал... пока написал лишь это:

Код:
 
program prefixToInfix;

uses CRT;

const setOper = ['+' , '-' , '*' , '/' , '^'];
      setSkob = ['(' , ')'];
      maxStake = 100;

var inputStr:string;
    outStr:string;
    Stake:array[1..maxStake] of char;
    l,i,topStake,u:integer;

procedure swap(var s:string; var result:string);
var i:integer;
    ch:char;
  begin
   i:=1;
   While i<=length(s) Do
    if ((s[i] in setOper) and (not(s[i+1] in setOper)) and (not(s[i+2] in setOper))   )
        then
          begin
            result:=concat(result,s[i+1],s[i+2],s[i]);
            delete(s,i,3);
          end
        else i:=i+1;
    {if ( (countZn(s)=1) and (length(s) ) then result:=result + s;}
  end;


function countZn(s:string):integer;
var result:integer;
begin
result:=0;
  for i:=1 to length(S) do
    if s[i] in setOper then result:=result+1;
CountZn:=result;
end;


Begin
ClrScr;

WriteLn('Enter the string in prefix form');
ReadLn(inputStr);

u := countZn(inputStr);
l := length (inputStr);

outStr:='';
swap(inputStr,OutStr);

if ( (countZn(inputStr)=1) and (length(inputStr)=1) ) then OutStr:=OutStr + inputStr;

i:=length(inputStr);

for i:=length(inputStr) downto 1 do
    outStr:=outStr+inputStr[i];

WriteLn(OutStr);

ReadLn;


End.
krasava0012 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Префиксная и постпрефиксная операции atenon Общие вопросы C/C++ 8 07.01.2011 22:14
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
Запись структуры TList в файл, проблема с длинными строками типа AnsiString Xardas Общие вопросы Delphi 2 24.05.2009 20:18
чем отличается постфиксная инкреметация (декрементация) от префиксной bender_kgn Общие вопросы C/C++ 4 05.11.2007 20:10