quinta-feira, 16 de setembro de 2010

Algoritmos, Caixa Eletrônico

Algoritmos, Caixa Eletrônico
--
-- Nome Artefato/Programa..: sp_caixa_eletro.sql
-- Instituicao.............:
-- Autor(es)...............: O Peregrino (emersonhermann at gmail.com) ou (emerson at info.ufrn.br)
-- Data Inicio ............: 29/06/2010
-- Data Atual..............: 29/06/2010
-- Versao..................: 0.01
-- Linguagem...............: PL/pgSQL
-- Compilador/Interpretador: PostgreSql
-- Sistemas Operacionais...: Linux/Windows
-- SGBD....................: PostgreSql 8.x
-- Kernel..................: Nao informado!
-- Finalidade..............: Caixa Eletronico
-- OBS1....................: Caixa Eletronico

--


/*
Algoritmo Caixa Eletronico
notasSaída = []                         #guardar as notas que saírão do caixa eletrônico
notas = [100, 50, 20, 10, 5, 1]         #notas que podem ser sacadas
valor = 375                             #valor a ser sacado

restante = valor                        #faz uma cópia do valor em "restante"
inota = 0                               #índice da nota: 0 é 100, 1 é 50, 2 é 20, 3 é 10, ...
enquanto restante>0:                    #enquanto restante for maior que 0
  resultado = restante-notas[inota]     #calcula o resultado da subtração entre o valor e a nota
  se resultado<0:                       #se for negativo:
    inota++                             #incrementa o índice para a próxima nota
  senão:                                #se for positivo ou zero:
    restante = resultado                #deixa restante com o novo resultado
    notasSaída.adicionar(notas[inota])  #adiciona a nota utilizada nas que devem sair do caixa

para nota em notasSaída:                # escreve as notas que devem sair
  escreva nota

*/

--opcao 1
--Retornando notas do caixa eletrônico
--Notas de 1, 2, 5, 10, 20, 50 e 100
DROP FUNCTION IF EXISTS sp_caixa_eletro(pvalor INTEGER);
CREATE OR REPLACE FUNCTION sp_caixa_eletro (pvalor INTEGER) RETURNS text AS $$
DECLARE
    sretorno  TEXT;
    qnota1    INTEGER;
    qnota2    INTEGER;
    qnota5    INTEGER;
    qnota10   INTEGER;
    qnota20   INTEGER;
    qnota50   INTEGER;
    qnota100  INTEGER;
    pvalorx   INTEGER;
    residual  INTEGER;
    restante  INTEGER;
     vet_notas INTEGER ARRAY[7];
     i         INTEGER;
     resultado INTEGER;
BEGIN
     vet_notas[1]=100;
     vet_notas[2]=50;
     vet_notas[3]=20;
     vet_notas[4]=10;
     vet_notas[5]=5;
     vet_notas[6]=2;
     vet_notas[7]=1;
    
     i         := 1;
     qnota1    := 0;
     qnota2    := 0;
     qnota5    := 0;
     qnota10   := 0;
     qnota20   := 0;
     qnota50   := 0;
     qnota100  := 0;
     pvalorx   := 0;
     resultado := 0;
     sretorno  := '';
     restante  := pvalor;

     WHILE (i <= 7)  LOOP
    
          resultado = restante - vet_notas[i];
    
          IF (resultado < 0) THEN
         
               i := i + 1;
              
          ELSE

               restante := resultado;                              
               RAISE NOTICE 'Restante % -> Nota: R$% Qt: %', restante, vet_notas[i], resultado; 
               IF vet_notas[i] = 100 THEN
                    qnota100 := qnota100 + 1;
               ELSIF vet_notas[i] = 50 THEN
                    qnota50 := qnota50 + 1;
               ELSIF vet_notas[i] = 20 THEN
                    qnota20 := qnota20 + 1;
               ELSIF vet_notas[i] = 10 THEN
                    qnota10 := qnota10 + 1;
               ELSIF vet_notas[i] = 5 THEN
                    qnota5  := qnota5 + 1;
               ELSIF vet_notas[i] = 2 THEN
                    qnota2  := qnota2 + 1;
               ELSIF vet_notas[i] = 1 THEN
                    qnota1  := qnota1 + 1;
               END IF;
             
          END IF;
 
     END LOOP;
    
    
     sretorno := 'Total: '
                 || pvalor
                 || ' ' --chr(10)
                 || 'Notas de 100:'
                 || qnota100
                 || ' ' --chr(10)
                 || 'Notas de 50:'
                 || qnota50
                 || ' ' --chr(10)
                 || 'Notas de 20:'
                 || qnota20
                 || ' ' --chr(10)
                 || 'Notas de 10:'
                 || qnota10
                 || ' ' --chr(10)
                 || 'Notas de 5:'
                 || qnota5
                 || ' ' --chr(10)
                 || 'Notas de 2:'
                 || qnota2                
                 || ' ' --chr(10)
                 || 'Notas de 1:'
                 || qnota1;
                
     RETURN sretorno; -- Retorna as linhas
END;
$$ LANGUAGE plpgsql;

--alguns testes

--SELECT sp_caixa_eletro(2678);
--SELECT sp_caixa_eletro(1078); 

Nenhum comentário:

Postar um comentário