Cod sursa(job #445896)

Utilizator lianaliana tucar liana Data 24 aprilie 2010 14:05:00
Problema Evaluarea unei expresii Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 4.27 kb
program pmax;
var f, g:text;
    expr, strpr, s:widestring;
    max, iii, i, nr, ii, pozinc, nr2, pr, rez:longint;
    smn:char;

procedure citire;
var c:char;
  begin
    while not seekeof(f) do
      begin
        read(f,c);
        s:=s+c;
      end;
  end;

procedure calculare;
var aux:char;
    semnp, poz:longint;
    neg:boolean;
  begin
    nr:=0;
    ii:=1;
    pozinc:=1;
    while ii<=length(expr) do
      begin
        if (expr[ii]>='0') and (expr[ii]<='9') then
          nr:=nr*10+ord(expr[ii])-ord('0')
         else
        if (expr[ii]='+') or (expr[ii]='-') then
          begin
            nr:=0;
            pozinc:=ii+1;
          end
         else
           begin
             nr2:=0;
             smn:=expr[ii];
             ii:=ii+1;
             if expr[ii]='-' then
               begin
                 semnp:=-1;
                 ii:=ii+1;
               end
              else
                semnp:=1;
             while (expr[ii]>='0') and (expr[ii]<='9') and (ii<=length(expr)) do
               begin
                 nr2:=nr2*10+ord(expr[ii])-ord('0');
                 ii:=ii+1;
               end;
             if smn='*' then
               pr:=nr*nr2
              else
                pr:=nr div nr2;
             strpr:='';
             while pr>0 do
               begin
                 strpr:=strpr+chr(ord(pr mod 10)+ord('0'));
                 pr:=pr div 10;
               end;
            for iii:=1 to (length(strpr)+1) div 2 do
              begin
                aux:=strpr[iii];
                strpr[iii]:=strpr[length(strpr)-iii+1];
                strpr[length(strpr)-iii+1]:=aux;
              end;
             delete(expr,pozinc,ii-pozinc);
             insert(strpr,expr,pozinc);
{             ii:=ii-1;}
             if semnp=-1 then
               insert('-',expr,pozinc);
             ii:=0;
             nr:=0;
             pozinc:=1;
           end;
        ii:=ii+1;
      end;
    ii:=1;
    smn:='+';
    nr:=0;
    rez:=0;
    insert('+',expr,length(expr)+1);
    while pos('--',expr)<>0 do
      begin
        poz:=pos('--',expr);
        delete(expr,poz,2);
        insert('+',expr,poz);
      end;
    while ii<length(expr) do
      begin
        while (expr[ii]>='0') and (expr[ii]<='9') and (ii<=length(expr)) do
          begin
            nr:=nr*10+ord(expr[ii])-ord('0');
            ii:=ii+1;
          end;
        if smn='+' then
          rez:=rez+nr
         else
           rez:=rez-nr;
        smn:=expr[ii];
        ii:=ii+1;
        nr:=0;
      end;
    if rez>max then
      max:=rez;
    pr:=rez;
    strpr:='';
    neg:=false;
    if pr<0 then
      begin
        neg:=true;
        pr:=abs(pr);
      end;
    while pr>0 do
      begin
        strpr:=strpr+chr(ord(pr mod 10)+ord('0'));
        pr:=pr div 10;
      end;
    for iii:=1 to (length(strpr)+1) div 2 do
      begin
        aux:=strpr[iii];
        strpr[iii]:=strpr[length(strpr)-iii+1];
        strpr[length(strpr)-iii+1]:=aux;
      end;
    if neg then
      strpr:='-'+strpr;
  end;

procedure rezolvare;
var gp:boolean;
    pozpd, pozpi, poz:longint;
    ss:widestring;
  begin
    gp:=true;
    insert('(',s,1);
    insert(')',s,length(s)+1);
    insert('(',s,1);
    insert(')',s,length(s)+1);
    while gp do
      begin
        gp:=false;
        ss:=s;
        poz:=pos('(',ss);
        delete(ss,poz,1);
        if pos('(',ss)=0 then
          begin
            writeln(g,copy(ss,1,length(ss)-1));
            close(g);
            halt;
          end;
        for i:=1 to length(s) do
          begin
            if s[i]='(' then
              begin
                pozpd:=i;
                gp:=true;
              end;
            if s[i]=')' then
              begin
                pozpi:=i;
                expr:=copy(s,pozpd+1,pozpi-(pozpd+1));
                calculare;{DACA E NEGATIV}
                delete(s,pozpd,pozpi-pozpd+1);
                insert(strpr,s,pozpd);
                break;
              end;
          end;
      end;
  end;

  begin
    assign(f,'expresie.in'); reset(f);
    assign(g,'expresie.out'); rewrite(g);
    max:=-maxlongint;
    citire;
    rezolvare;
    close(f);
    close(g);
  end.