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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2012, 01:31   #1
АлексВ
 
Регистрация: 18.05.2012
Сообщений: 6
По умолчанию Недоделанный калькулятор ОПЗ

Создал недоделанную программу по переводу в ОПЗ и подсчету от нее выражения из любых чисел, в том числе с дужками (но правильно считает только первые 2 действия, дальше вместо следующей цифры берет 3ю по счету). Программа получилась очень громоздкой, поэтому попрошу советов по тому как уменьшить исходный код, не потеряв функциональности, или исправить вышеупомянутые недостатки.
Код:
Program PPZ;
const
    oper1=['+','-'];
    oper2=['*','/'];
    symbol=['a'..'z','A'..'Z','0'..'9','.'];
var
    i,m,j,k,o,a :integer;
    s :char;
    eb,ea,d,c :string;
    p :word;
    r,v,cr: real;
    L: array [1..100] of real;
    Stack: array [1..100] of real;
    
procedure findsym;
begin
    while (p<=length(eb)) and(eb[p] in [#32, #9]) do
        p:=p+1;
    if p>length(eb) then
        s:=#0
    else
    begin
        s:=eb[p];
        p:=p+1;
    end;
end;

procedure expression;
forward;

procedure get_var;
begin
  ea:=ea+#32;
    while s in symbol do
    begin
        ea:=ea+s;
        findsym
    end
    
end;

procedure term;
var a:char;
begin
    if s='(' then
    begin
        findsym;
        expression;
        findsym
    end
        else
        get_var;
    while s in oper2 do
    begin
        a:=s;
        findsym;
        term;
        ea:=ea+a
    end
end;

procedure expression;
var a:char;
begin
    if s='+' then
        findsym
    else if s='-' then
    begin
        a:='-';
        findsym
    end
        else
        a:=#32;
    term;
    if a='-' then ea:=ea+' (-)';
    while s in oper1 do
    begin
        a:=s;
        findsym;
        term;
        ea:=ea+a
    end
end;

procedure cleaner;
var i: integer;
begin
for i:=length(d) downto 1 do
  begin
if (d[i]='+') or (d[i]='-') or (d[i]='*') or (d[i]='/') then
   begin
delete (d,i,1);
   end;
  end;
end;

procedure transform;
var f,g: integer;
begin
d:=ea;
o:=1;
cleaner;
for f:= 1 to length(d) do
if (d[f]='0') or (d[f]='1') or (d[f]='2') or (d[f]='3') or (d[f]='4') or (d[f]='5') or (d[f]='6') or (d[f]='7') or (d[f]='8') or (d[f]='9') then
  begin
c:= c + d[f];
j:=StrToInt (c);
L[o]:=j;
  end
else 
   begin
c:= ' '; 
delete (c,1,1);
o:=o+1;
   end;
end;

{Main part}
begin

    writeln ('Input expression');
    readln (eb);
    p:=1;
    findsym;
    expression;
    delete (ea,1,1);
    writeln(ea);
    transform;
    
    m:=1;
    
     for i:=1 to length(ea) do begin
       if ea[i]=(' ') then begin m:=m+1 end
       else
            if ea[i]=('+') then begin
            m:=m+1;
            r:=(L[m-2])+(L[m-1]);
            L[m-2]:=r;
            L[m-1]:=L[m];
            m:=m-2;
                                end
                             
       else if ea[i]=('-') then begin
             m:=m+1;
                r:=(L[m-2])-(L[m-1]);
                L[m-2]:=r;
                L[m-1]:=L[m];
                m:=m-2;
                                end
                                
       else if ea[i]=('*') then begin
             m:=m+1;
                r:=(L[m-2])*(L[m-1]);
                L[m-2]:=r;
                L[m-1]:=L[m];
                m:=m-2;
                                end
                                
       else if ea[i]=('/') then begin
             m:=m+1;
                r:=(L[m-2])/(L[m-1]);
                L[m-2]:=r;
                L[m-1]:=L[m];
                m:=m-2;
                                end
            
end;            
write('Resuly of expression (',ea,') is:',L[1]);
readln;
end.
АлексВ вне форума Ответить с цитированием
Старый 20.05.2012, 06:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

АлексВ, ну и зачем ещё одну тему создавать?!

чем Вас ваша предыдущая (Вопросы по обратной польской записи) перестала устраивать?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с типами(char и int) в опз (язык с++) allozavr Помощь студентам 0 19.02.2012 14:39
опз skrepka Помощь студентам 0 22.05.2011 17:37
ОПЗ на си++ LiBeRTy_Nansy Помощь студентам 0 04.05.2011 22:41
Недоделанный тетрис!) ronil Паскаль, Turbo Pascal, PascalABC.NET 0 07.06.2010 11:06
калькулятор vetalij Общие вопросы C/C++ 3 25.01.2010 21:04