-- -- 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);
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
quinta-feira, 16 de setembro de 2010
Algoritmos, Caixa Eletrônico
Algoritmos, Caixa Eletrônico
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário