Program Prova_GA_T41_2004_1; uses rotpilha,rotfilc; { *** Definicoes importadas das Units RotPilha e RotFilC *** const MAX_PILHA = 20; MAX_FILA_CIRCULAR = 20; type TInfo = record nome:string[30]; valor:real; end; TPilha = record Info : array[1..MAX_PILHA] of TInfo; Topo : integer; end; TFilaCircular = record Info : array[1..MAX_FILA_CIRCULAR] of TInfo; Inicio, Fim : integer; NumItens : integer; end; *** PILHA *** procedure InicializaPilha(var p:TPilha); function InserePilha(var p:TPilha; info:TInfo):boolean; function RetiraPilha(var p:TPilha; var info:TInfo):boolean; procedure ImprimePilha(p:TPilha); *** FILA CIRCULAR *** procedure InicializaFilaCircular(var fc:TFilaCircular); function InsereFilaCircular(var fc:TFilaCircular; info:TInfo):boolean; function RetiraFilaCircular(var fc:TFilaCircular; var info:TInfo):boolean; procedure ImprimeFilaCircular(fc:TFilaCircular); } procedure atende_cliente(var F:TFilaCircular; var P1,P2:TPilha; var Saldo:real); var Dado:TInfo; Daux:TInfo; begin RetiraFilaCircular(F, Dado); writeln('Atendendo: ',Dado.nome); if Dado.valor > 0 then begin Saldo:=Saldo+Dado.valor; while RetiraPilha(P1,Daux) do if Daux.nome=Dado.nome then Dado.valor:=Dado.valor+Daux.valor else InserePilha(P2,Daux); while RetiraPilha(P2,Daux) do InserePilha(P1,Daux); InserePilha(P1,Dado); end else begin if (Dado.valor*-1.0) > Saldo then begin writeln('Prezado cliente, va para o fim da fila'); if not InsereFilaCircular(F, Dado) then writeln('### Estouro da FILA ####') end else begin Saldo:=Saldo+Dado.valor; while RetiraPilha(P1,Daux) do if Daux.nome=Dado.nome then Dado.valor:=Dado.Valor+Daux.valor else InserePilha(P2,Daux); while RetiraPilha(P2,Daux) do InserePilha(P1,Daux); InserePilha(P1,dado); end; end; end; { Programa Principal } var P1,P2:TPilha; F:TFilaCircular; Dado:TInfo; Saldo:real; cont:integer; ArqIn,ArqOut:Text; narqin:string; begin InicializaFilaCircular(F); InicializaPilha(P1); InicializaPilha(P2); Saldo:=0; cont:=0; writeln; writeln('>>> BANCO ACME <<<'); writeln; write('Arquivo de entrada: '); readln(narqin); assign(arqin,narqin); assign(arqout,'saida.txt'); reset(arqin); while not eof(arqin) do begin readln(arqin,Dado.nome); readln(arqin,Dado.valor); if not InsereFilaCircular(F, Dado) then writeln('### Estouro da FILA ####'); end; close(arqin); ImprimeFilaCircular(F); writeln; writeln('>> Atendendo Clientes...'); while (not FilaVazia(F)) and (cont <= 50) do begin inc(cont); atende_cliente(F,P1,P2,Saldo); end; writeln; writeln('>> Fim do expediente!'); writeln('>> Saldo no final do dia: ',Saldo:7:2); writeln; writeln('>> Gravando arquivo em disco... saida.txt'); writeln; rewrite(arqout); while RetiraPilha(P1,Dado) do begin writeln(arqout,Dado.nome); writeln(arqout,Dado.valor:7:2); end; close(arqout); writeln('>> FIM <<'); readln; end.