Guest User

Untitled

a guest
Apr 19th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 10.68 KB | None | 0 0
  1. (* Desenvolvido por : Pedro Gabriel Lancelloti Pinto em 04/12/2011, feito para ajudar a o pessoal da eletrônica na prova de programacao.
  2. Creditos especiais para Alan Carpilovsky que me enviou seu programa de agenda guiada por ponteiros e persistencia, muito obrigado.
  3. Esse programa e baseado na prova P3 do professor Antonio Claudio (AC) de 2009/1 *)
  4.  
  5. Program estoquecontrole;
  6.  
  7. uses usual,crt,sysutils,dos;
  8.  
  9. //tipos usados
  10.  
  11. Type
  12.         ptrproduto:^produto;
  13.        
  14.         produto = record;
  15.             nome:string;
  16.             codigo:integer;
  17.             preco:real;
  18.             qnt:integer;
  19.             proximo:ptrproduto;
  20.             anterior:ptrproduto;
  21.         end;
  22.         // Esse tipo e o que sera salvo no arquivo binario, portanto nao possui pointer ja que esses sao apenas enderecos na memoria
  23.         rproduto = record;
  24.             nome:string;
  25.             codigo:integer;
  26.             preco:real;
  27.             qnt:integer;
  28.             ativo:boolean;
  29.         end;
  30.  
  31.         (* rvendidos = record;
  32.                 nome:string;
  33.                 codigo:integer;
  34.                 preco:real;
  35.                 qnt:integer // vendida
  36.                 ativo:boolean;
  37.         end; *)
  38.        
  39. //////Fim dos tipos
  40.        
  41. // variaveis globais
  42.        
  43. var
  44.     arqproduto: File of regproduto;
  45.     arqvendido:File of regproduto (*ou rvendidos*)
  46.     regproduto: rproduto;
  47.     novo, primeiro, ultimo, atual, anterior, auxiliar : ^prtproduto;
  48.     nomearq,data:string;
  49.     op:integer;
  50.  
  51. // Começo dos procedimentos
  52.  
  53. // OBS : Durante a programacao, primeiro foi pensado no IncluirPonteiro e suas restricoes, para cada uma delas foi criada um procedure
  54. //esses procedures devem estar antes do IncluirPonteiro para que possam ser utilizados por ele.
  55.  
  56. Procedure IncluirPrimeiro;
  57. begin
  58.     primeiro^.anterior := nil;
  59.     primeiro^.proximo := nil;
  60.     primeiro := novo;
  61.     ultimo := novo;
  62.     atual := novo;
  63. end;
  64.  
  65. Procedure IncluirTopo;
  66. begin
  67.     novo^.proximo := anterior;
  68.     novo^.anterior := ultimo;
  69.     ultimo^.proximo := novo;
  70.     primeiro^.anterior := novo;
  71.     primeiro := novo;      
  72. end;
  73.  
  74. Procedure IncluirFim;
  75. begin
  76.     novo^.proximo := primeiro;
  77.     novo^.anterior := ultimo;
  78.     primeiro^.anterior := novo;
  79.     ultimo^.proximo := novo;
  80.     ultimo := novo;
  81. end;
  82.  
  83. Procedure IncluirGeral;
  84. begin
  85.     auxiliar := primeiro; // Preparando para fazer uma varredura nos produtos, começando do primeiro.
  86.     // Aqui começa a busca e comparação entre o buscado e os produtos existente. Ele ira parar assim que achar um produto menor que o auxiliar
  87.     While upcase (novo^.nome) > upCase (auxiliar.nome) do
  88.     begin
  89.         anterior := auxiliar;
  90.         auxiliar := auxiliar^.proximo;
  91.     end;
  92.     // Aqui começa a "troca" dos pointers.
  93.     novo^.proximo := auxiliar ;
  94.     novo^.anterior := anterior ;
  95.     auxiliar^.anterior := novo;
  96.     anterior^.proximo := novo;
  97. end;
  98.  
  99. procedure IncluirPonteiro;
  100.  
  101. var
  102.     sn:char;
  103.  
  104. begin
  105.     Repeat
  106.         new(novo);
  107.         VerifString('Digite o Nome do Produto que deseja adicionar'40,3,novo^.nome);
  108.         VerifInt('Digite o codigo do produto que deseja adicionar'1000,1,novo^.codigo);
  109.         VerifReal('Digite o preco do produto que deseja adicionar'50000,1,novo^.preco);
  110.         If primeiro = nil then
  111.         begin
  112.             IncluirPrimeiro
  113.         else
  114.         If Upcase (novo^.nome) <= UpCase (primeiro^.nome) then
  115.             IncluirTopo
  116.         else
  117.         If Upcase (novo.^nome) >= UpCase (ultimo^.nome) then
  118.             IncluirFim
  119.         else
  120.         IncluirGeral;
  121.         writeln;
  122.         writeln (' Produto Incluido, deseja incluir outro ? S/N' )
  123.         readln(sn);
  124.         sn := Upcase (sn);
  125.     until sn = 'N';
  126. end;
  127.  
  128. // Procedimento Menu
  129. Procedure Menu(Op1,Op2,Op3,Op4:string; var escolha:integer);
  130. begin
  131.         Writeln('--------Menu--------');
  132.         writeln(Op1);
  133.         writeln(Op2);
  134.         writeln(Op3);
  135.         writeln(Op4);
  136.         writeln('---------------------');
  137.         writeln('Digite a opcao desejada');
  138.         readln(escolha);
  139. end;
  140.  
  141. Procedure Buscar;
  142. var
  143.         buscado:string;
  144.         encontrado:boolean;
  145.  
  146. begin
  147.     If primeiro = nil then // Caso do estoque nao ter produtos
  148.     begin
  149.         writeln (' Nao ha produtos no catalogo ');
  150.     end
  151.     else
  152.         VerifString('Digite o nome do produto que deseja Buscar: ',30,3,buscado);
  153.         auxiliar := primeiro // e usado o auxiliar para que nao altere a lista encadeada.
  154.         encontrado := false; // para realizar a checagem.
  155.         Repeat
  156.                 If upcase((auxiliar^.nome) = Upcase (buscado)) and (auxiliar^.ativo = true) then
  157.                 (*Explicando: O auxiliar recebe o primeiro para comecar do inicio da lista, se for igual e ativo ele lista. Em seguida o auxiliar recebe o proximo
  158.                 registro. O ativo e uma booleana verdadeira em true, falsa em false , ela sera falsa quando quantidade dos produtos for igual a false ou quando o usuario decidir
  159.                 excluir o produto*)
  160.                 begin
  161.                     encontrado := true;
  162.                     writeln('-------------------------------------------Informacoes:--------------------------------------------------------');
  163.                     writeln(' Codigo : ');
  164.                     write(auxiliar.codigo);
  165.                     writeln(' Nome : ');
  166.                     write(auxiliar.nome);
  167.                     writeln(' Quantidade em estoque : ');
  168.                     write(auxiliar.qnt);
  169.                     writeln('----------------------------------------------------------------------------------------------------------------');
  170.                 end;
  171.         auxiliar := auxiliar^.proximo;
  172.         until auxiliar.nome = primeiro.nome; //Isso marca o fim de uma volta na lista
  173.         If encontrado = false then
  174.         writeln('PRODUTO NAO ENCONTRADO VERIFIQUE NO REGISTRO DE VENDIDOS SE TODAS SUAS UNIDADES FORAM VENDIDAS !!!');
  175.     end;
  176. end;
  177.  
  178. Procedure Excluir;
  179.  
  180. var
  181.         buscado:string;
  182.         sn:char;
  183.        
  184. begin
  185.         If primeiro = nil then
  186.         writeln (' Nao ha produtos adicionados ao estoque ');
  187.         else
  188.             VerifString('Digite o nome do produto que deseja Buscar: ',30,3,buscado);
  189.             auxiliar := primeiro // e usado o auxiliar para que nao altere a lista encadeada.
  190.             Repeat
  191.                 If upcase((auxiliar^.nome) = Upcase (buscado)) and (auxiliar^.ativo = true) then // procedure similar ao buscar
  192.                 begin
  193.                         writeln('Deseja Excluir : ',auxiliar^.nome,' ? ') // validacao da escolha do usuario
  194.                         readln(sn);
  195.                         sn:= Upcase(sn);
  196.                         If Upcase(sn) = 's' then // validacao da resposta
  197.                         auxiliar^.ativo := false; // exclusao logica, todos com false nao serao passados para o registro
  198.                 end;
  199.             auxiliar := auxiliar^.proximo;
  200.             until auxiliar.nome = primeiro.nome; // marcando 1 volta no registro.
  201.         end;
  202. end;
  203.  
  204. Procedure Vender;
  205.  
  206. buscado:string;
  207. nvendido:integer;
  208.  
  209. begin
  210.     If primeiro = nil then
  211.     writeln (' Nao ha produtos adicionados ao estoque ');
  212.     else
  213.         VerifString('Digite o nome do produto que deseja Buscar: ',30,3,buscado);
  214.         auxiliar := primeiro // e usado o auxiliar para que nao altere a lista encadeada.
  215.         Repeat
  216.             If upcase((auxiliar^.nome) = Upcase (buscado)) and (auxiliar^.ativo = true) then // procedure similar ao buscar
  217.             begin
  218.                 writeln('Deseja Vender : ',auxiliar^.nome,' ? ') // validacao da escolha do usuario
  219.                 readln(sn);
  220.                 sn:= Upcase(sn);
  221.                 If Upcase(sn) = 's' then // validacao da resposta
  222.                 begin
  223.                     writeln(' Digite a quantidade a ser vendida ');
  224.                     readln(nvendido);
  225.                     If auxiliar^.qnt < nvendido then // Validando se a quantidade requisitada e disponivel
  226.                     writeln ('Operacao invalida, numero de produtos disponiveis menor que a quantidade requisitada');
  227.                     else
  228.                     If auxiliar^.qnt < nvendido then
  229.                     begin
  230.                         auxiliar^.qnt := auxiliar^.qnt - (nvendido); // exclusao logica, todos com false nao serao passados para o registro
  231.                         If auxiliar^.qnt := 0 then
  232.                         auxiliar^.ativo := false; // Todas unidades vendidas, logo produto sai do catalogo.
  233.                     end;
  234.                 end;  
  235.             end;
  236.         auxiliar := auxiliar^.proximo;
  237.         until auxiliar.nome = primeiro.nome; // marcando 1 volta no registro.
  238.     end;
  239. end;
  240.  
  241.  Procedure Entrada;
  242.  
  243.  var
  244.  
  245.  sn:char;
  246.  adicionado:integer;
  247.  
  248.  begin
  249.     If primeiro = nil then // Caso do estoque nao ter produtos
  250.     begin
  251.         writeln (' Nao ha produtos no catalogo ');
  252.     end
  253.     else
  254.         VerifString('Digite o nome do produto que deseja Buscar: ',30,3,buscado);
  255.         auxiliar := primeiro // e usado o auxiliar para que nao altere a lista encadeada.
  256.         Repeat
  257.             If upcase((auxiliar^.nome) = Upcase (buscado)) and (auxiliar^.ativo = true) then // procedure similar ao buscar
  258.             begin
  259.                 writeln('Deseja adicionar mais produto de  : ',auxiliar^.nome,' ? ') // validacao da escolha do usuario
  260.                 readln(sn);
  261.                 sn:= Upcase(sn);
  262.                 If Upcase(sn) = 's' then // validacao da resposta
  263.                 begin
  264.                     writeln(' Digite a quantidade a ser adicionada: ');
  265.                     readln(adicionado);
  266.                     If auxiliar^.qnt = 0 then // Validando se o item esta fora de estoque
  267.                     begin
  268.                         auxiliar^.qnt := adicionado;
  269.                         auxiliar^.ativado := true;
  270.                     end
  271.                     else
  272.                     auxiliar^.qnt := auxiliar^.qnt + (adicionado); // adicionando.
  273.                 end;  
  274.             end;
  275.             auxiliar := auxiliar^.proximo;
  276.         until auxiliar.nome = primeiro.nome; // marcando 1 volta no registro.
  277.     end;
  278.  end;
  279.  
  280. Procedure SalvarInfo;
  281. var
  282. begin
  283.         auxiliar := primeiro
  284.     reset(regproduto)
  285.         Repeat
  286.                 rproduto.nome := auxiliar^.nome;
  287.                 rproduto.codigo := auxiliar^.codigo;
  288.                 rpdrouto.preco := auxiliar^.preco;
  289.                 rproduto.qnt := auxiliar^.qnt;
  290.                 rproduto.ativo := auxiliar^.ativo;
  291.                 If rprotudo.ativo = true then (*escreve no registro de ativos*)
  292.                 begin
  293.                     assign(regproduto,estoque.bin);
  294.                     write(rproduto,regproduto);
  295.                 end
  296.                 else
  297.                 If rproduto.ativo = false then (*escreve no registro de vendidos do dia*)
  298.                 begin
  299.                     data:= date;
  300.                     nomearq:= 'vendidos' + (data) + '.bin';
  301.                     assign(regproduto,nomearq);
  302.                     write(rproduto,regproduto);
  303.                 end;
  304.                 auxiliar := auxiliar^.proximo;
  305.         until auxiliar.nome = primeiro.nome; //Isso marca o fim de uma volta na lista
  306. end;
  307.  
  308. Function Fechar():char; // Fechar tem que ser uma function para retornar ao "loop" do menu seu valor, caso ela retorne com S, o programa fecha e sai do loop do menu.
  309.  
  310. var
  311.  
  312. sn:char;
  313.  
  314. begin
  315.         writeln('Deseja Realmente fechar o programa ? s/n' );
  316.         readln(sn);
  317.         sn:=Upcase(sn);
  318.         If sn = 'S' then
  319.         begin
  320.                 SalvarInfo;
  321.         end;
  322.         Fechar := sn;
  323. end;
  324.  
  325.  
  326. // Corpo principal do programa.
  327.  
  328. Begin
  329.     Repeat
  330.         Menu('1- Incluir novo Produto','2- Buscar Produto','3- Entrada de Produto','4- Venda de Produto','5- Excluir Produto',op);
  331.         Case (op) of
  332.         1 :
  333.         begin
  334.             IncluirPonteiro;
  335.             SalvarInfo;
  336.         end;
  337.         2 :
  338.         begin
  339.             Buscar;
  340.             SalvarInfo;
  341.         end;
  342.         3 :
  343.         begin
  344.             Entrada;
  345.             SalvarInfo;
  346.         end;
  347.         4 :
  348.         begin
  349.             Vender;
  350.             SalvarInfo;
  351.         end;
  352.         5 :
  353.         begin
  354.             Excluir;
  355.             SalvarInfo;
  356.         end;
  357.         6:
  358.         begin
  359.             Fechar;
  360.         end;
  361.     until Fechar = 'S';
  362. End.
Add Comment
Please, Sign In to add comment