Está en la página 1de 6

create or replace package body CAP_PK_EJERCICIOS_LOG_JDE is

PROCEDURE Cap_Pr_Suma(Pi_num_a IN INTEGER,


Pi_num_b IN INTEGER,
Pi_suma OUT INTEGER,
Pv_error OUT VARCHAR2) IS

--Bloque de Declaraciones (Variables locales, cursores)


--Li_auxiliar INTEGER := 0;
BEGIN
--Bloque de Validaciones
IF Pi_num_a IS NULL OR Pi_num_a <= 0 THEN
Pv_error := 'Numero A invalido';
RETURN;
END IF;
IF Pi_num_b IS NULL OR Pi_num_b <= 0 THEN
Pv_error := 'Numero B invalido';
RETURN;
END IF;
Pi_suma := Pi_num_a + Pi_num_b;

--Bloque de Excepciones
END Cap_Pr_Suma;

PROCEDURE Cap_Pr_Resta(Pi_num_a IN INTEGER,


Pi_num_b IN INTEGER,
Pi_resta OUT INTEGER,
Pv_error OUT VARCHAR2) IS

--Bloque de Declaraciones (Variables locales, cursores)


--Li_auxiliar INTEGER := 0;
BEGIN
--Bloque de Validaciones
IF Pi_num_a IS NULL OR Pi_num_a <= 0 THEN
Pv_error := 'Numero A invalido';
RETURN;
END IF;
IF Pi_num_b IS NULL OR Pi_num_b <= 0 THEN
Pv_error := 'Numero B invalido';
RETURN;
END IF;

IF Pi_num_a > Pi_num_b THEN


Pi_resta := Pi_num_a - Pi_num_b;
ELSE
Pi_resta := Pi_num_b - Pi_num_a;
END IF;
--Bloque de Excepciones
END Cap_Pr_Resta;

PROCEDURE Cap_Pr_verifica_par(Pi_num IN INTEGER,


Pi_par OUT INTEGER,
Pv_error OUT VARCHAR2) IS
--Funcion que obtiene el residuo MOD(A,B) -> RESIDUO DE A/B.
BEGIN
IF Pi_num IS NULL OR Pi_num <= 0 THEN
Pv_error := 'Numero no valido';
RETURN;
END IF;
IF MOD(Pi_num, 2) = 0 THEN
Pi_par := 1;
ELSE
Pi_par := -1;
END IF;
END Cap_Pr_verifica_par;

PROCEDURE Cap_Pr_Ordena_numeros(Pi_num_a IN OUT INTEGER,


Pi_num_b IN OUT INTEGER,
Pi_num_c IN OUT INTEGER,
Pv_error OUT VARCHAR2) IS

Li_temporal INTEGER := 0;

BEGIN
IF Pi_num_a IS NULL OR Pi_num_a <= 0 THEN
Pv_error := 'Numero A invalido';
RETURN;
END IF;
IF Pi_num_b IS NULL OR Pi_num_b <= 0 THEN
Pv_error := 'Numero B invalido';
RETURN;
END IF;
IF Pi_num_c IS NULL OR Pi_num_c <= 0 THEN
Pv_error := 'Numero C invalido';
RETURN;
END IF;

IF Pi_num_a > Pi_num_b THEN


Li_temporal := Pi_num_a;
Pi_num_a := Pi_num_b;
Pi_num_b := Li_temporal;
END IF;
IF Pi_num_b > Pi_num_c THEN
Li_temporal := Pi_num_b;
Pi_num_b := Pi_num_c;
Pi_num_c := Li_temporal;
END IF;
IF Pi_num_a > Pi_num_b THEN
Li_temporal := Pi_num_a;
Pi_num_a := Pi_num_b;
Pi_num_b := Li_temporal;
END IF;
END Cap_Pr_Ordena_numeros;

PROCEDURE Cap_Pr_Suma_Numeros(Pi_num_limite IN INTEGER,


Pv_cadena_num OUT VARCHAR2,
Pv_error OUT VARCHAR2) IS
--Variable que guarda la suma de los numeros anteriores
Lv_cadena VARCHAR2(200) := '';
BEGIN
IF Pi_num_limite IS NULL OR Pi_num_limite <= 0 THEN
Pv_error := 'Numero no valido';
RETURN;
END IF;

FOR Li_num IN 1 .. Pi_num_limite LOOP


Lv_cadena := Lv_cadena || ' ' || TO_CHAR(Li_num);
END LOOP;

Pv_cadena_num := Lv_cadena;

END Cap_Pr_Suma_Numeros;

PROCEDURE Cap_Pr_Factorial(Pi_num IN INTEGER,


Pi_factorial OUT INTEGER,
Pv_error OUT VARCHAR2) IS
--Variable que guarda la suma de los numeros anteriores
Li_multiplicacion INTEGER := 1;
BEGIN
IF Pi_num IS NULL OR Pi_num <= 0 THEN
Pv_error := 'Numero no valido';
RETURN;
END IF;

IF Pi_num = 0 OR Pi_num = 1 THEN


Pi_factorial := 1;
RETURN;
END IF;
FOR i IN 1 .. Pi_num LOOP
Li_multiplicacion := Li_multiplicacion * i;
END LOOP;

Pi_factorial := Li_multiplicacion;

END Cap_Pr_Factorial;

PROCEDURE Cap_Pr_Contar_Dig(Pi_Num IN INTEGER,


Pi_Digitos OUT INTEGER,
Pv_Error OUT VARCHAR2) IS
--Bloque de Declaraciones
Li_numero INTEGER := 0;
Li_contador INTEGER := 0;

BEGIN
--Bloque de Validaciones
IF Pi_Num IS NULL OR Pi_num <= 0 THEN
Pv_Error := 'Numero no valido';
RETURN;
END IF;
Li_numero := Pi_Num;
WHILE Li_numero != 0 LOOP
Li_contador := Li_contador + 1;
Li_numero := FLOOR(Li_numero / 10);
END LOOP;
Pi_Digitos := Li_contador;
END Cap_Pr_Contar_Dig;

PROCEDURE Cap_Pr_Encontrar_Pares(Pi_num_limite IN INTEGER,


Pv_cadena_pares OUT VARCHAR2,
Pv_error OUT VARCHAR2) IS
Lv_cadena VARCHAR2(1000) := '';
BEGIN
IF Pi_num_limite IS NULL OR Pi_num_limite < 2 THEN
Pv_Error := 'Numero limite no valido';
RETURN;
END IF;

FOR I IN 1 .. Pi_num_limite LOOP


IF MOD(I, 2) = 0 THEN
Lv_cadena := Lv_cadena || TO_CHAR(I) || ',';
END IF;
END LOOP;
Pv_cadena_pares := Lv_cadena;
END Cap_Pr_Encontrar_Pares;

PROCEDURE Cap_Pr_Encontrar_Primos(Pi_num_limite IN INTEGER,


Pv_cadena_primos OUT VARCHAR2,
Pv_error OUT VARCHAR2) IS
Lv_cadena VARCHAR2(1000) := '';
Li_contador INTEGER := 0;
BEGIN
IF Pi_num_limite IS NULL OR Pi_num_limite < 2 THEN
Pv_Error := 'Numero limite no valido';
RETURN;
END IF;

FOR Li_num IN 1 .. Pi_num_limite LOOP


FOR Li_div IN 1 .. Li_num LOOP
IF Mod(Li_num, Li_div) = 0 THEN
Li_contador := Li_contador + 1;
END IF;
END LOOP;
IF Li_contador = 2 THEN
Lv_cadena := Lv_cadena || TO_CHAR(Li_num) || ',';
END IF;
Li_contador := 0;
END LOOP;
Pv_cadena_primos := Lv_cadena;
END Cap_Pr_Encontrar_Primos;

PROCEDURE Cap_Pr_Encontrar_Perfectos(Pi_num_limite IN INTEGER,


Pv_cadena_perfectos OUT VARCHAR2,
Pv_error OUT VARCHAR2) IS
Lv_cadena VARCHAR2(1000) := '';
Li_suma_divisores INTEGER := 0;
BEGIN
IF Pi_num_limite IS NULL OR Pi_num_limite < 2 THEN
Pv_Error := 'Numero limite no valido';
RETURN;
END IF;

FOR Li_num IN 1 .. Pi_num_limite LOOP


FOR Li_div IN 1 .. Li_num - 1 LOOP
IF Mod(Li_num, Li_div) = 0 THEN
Li_suma_divisores := Li_suma_divisores + Li_div;
END IF;
END LOOP;
IF Li_suma_divisores = Li_num THEN
Lv_cadena := Lv_cadena || TO_CHAR(Li_num) || ',';
END IF;
Li_suma_divisores := 0;
END LOOP;
Pv_cadena_perfectos := Lv_cadena;
END Cap_Pr_Encontrar_Perfectos;

PROCEDURE Cap_Pr_Verifica_Amigos(Pi_num_a IN INTEGER,


Pi_num_b IN INTEGER,
Pv_cadena_amigos OUT VARCHAR2,
Pv_error OUT VARCHAR2) IS

Li_suma_div_a INTEGER := 0;
Li_suma_div_b INTEGER := 0;
BEGIN

--Bloque de Validaciones
IF Pi_num_a IS NULL OR Pi_num_a <= 0 THEN
Pv_error := 'Numero A invalido';
RETURN;
END IF;
IF Pi_num_b IS NULL OR Pi_num_b <= 0 THEN
Pv_error := 'Numero B invalido';
RETURN;
END IF;

--Se obtiene la suma de los divisores propios del numero A


FOR Li_div_a IN 1 .. Pi_num_a - 1 LOOP
IF MOD(Pi_num_a, Li_div_a) = 0 THEN
Li_suma_div_a := Li_suma_div_a + Li_div_a;
END IF;
END LOOP;
--Se obtiene la suma de los divisores propios del numero B
FOR Li_div_b IN 1 .. Pi_num_b - 1 LOOP
IF MOD(Pi_num_b, Li_div_b) = 0 THEN
Li_suma_div_b := Li_suma_div_b + Li_div_b;
END IF;
END LOOP;

IF Li_suma_div_a = Pi_num_b AND Li_suma_div_b = Pi_num_a THEN


Pv_cadena_amigos := TO_CHAR(Pi_num_a) || ',' || TO_CHAR(Pi_num_b);
ELSE
Pv_cadena_amigos := '-1';
END IF;
END Cap_Pr_Verifica_Amigos;

PROCEDURE Cap_Pr_Palindromo(Pv_palabra IN VARCHAR2,


Pv_palindromo OUT VARCHAR2,
Pv_error OUT VARCHAR2) IS
Lv_cadena VARCHAR2(1000) := '';

BEGIN
IF Pv_palabra IS NULL THEN
Pv_error := 'palabra no valida';
RETURN;
END IF;

FOR Li_indice IN REVERSE 1 .. LENGTH(Pv_palabra) LOOP


Lv_cadena := Lv_cadena || SUBSTR(Pv_palabra, Li_indice, 1);
END LOOP;
IF Lv_cadena = Pv_palabra THEN
Pv_palindromo := Lv_cadena;
ELSE
Pv_palindromo := '-1';
END IF;
END Cap_Pr_Palindromo;

PROCEDURE Cap_Pr_Palin_2_num(Pv_pareja_palindromo OUT VARCHAR2,


Pv_Error OUT VARCHAR2) IS

Lv_cadena_pareja VARCHAR2(1000) := '';


Li_mayor_palindromo INTEGER := 0;
Lv_palindromo VARCHAR2(1000) := '';

BEGIN
FOR Li_num_1 IN 10 .. 99 LOOP
FOR Li_num_2 IN 10 .. 99 LOOP
CAP_PK_EJERCICIOS_LOG_JDE.Cap_Pr_Palindromo(Pv_palabra => to_char(Li_num_1 *
Li_num_2),
Pv_palindromo => Lv_palindromo,
Pv_Error => Pv_Error);
IF Lv_palindromo != '-1' THEN
IF Li_mayor_palindromo < Li_num_1 * Li_num_2 THEN
Li_mayor_palindromo := Li_num_1 * Li_num_2;
Lv_cadena_pareja := to_char(Li_num_1) || '*' ||
to_char(Li_num_2) || '=' ||
Lv_palindromo;
END IF;
END IF;
END LOOP;
END LOOP;

Pv_pareja_palindromo := Lv_cadena_pareja;

END Cap_Pr_Palin_2_num;

PROCEDURE CAP_PR_CADENA_SUD(Pi_Numero_Limite IN INTEGER,


Pv_Cadena_Sud OUT VARCHAR2,
Pv_Error OUT VARCHAR2) IS

Li_Suma INTEGER := 0;
Li_Factorial INTEGER := 1;
Lv_Cadena_Sud VARCHAR2(2000) := '';
Li_Numero_Temp INTEGER := 0;

BEGIN
IF NVL(Pi_Numero_Limite, 0) <= 0 THEN
Pv_Error := 'Numero limite invalido';
RETURN;
END IF;

FOR Li_Numero IN 1 .. Pi_Numero_Limite LOOP


Li_Numero_Temp := Li_Numero;

WHILE Li_Numero_Temp != 0 LOOP


FOR Li_Num IN 1 .. MOD(Li_Numero_Temp, 10) LOOP
Li_Factorial := Li_Factorial * Li_Num;
END LOOP;
Li_Suma := Li_Suma + Li_Factorial;
Li_Factorial := 1;
Li_Numero_Temp := FLOOR(Li_Numero_Temp / 10);
END LOOP;
IF Li_Suma = Li_Numero THEN
Lv_Cadena_Sud := Lv_Cadena_Sud || ',' || TO_CHAR(Li_Numero);
IF Lv_Cadena_Sud IS NULL THEN
Lv_Cadena_Sud := Lv_Cadena_Sud || TO_CHAR(Li_Numero);
ELSE
Lv_Cadena_Sud := Lv_Cadena_Sud || ',' || TO_CHAR(Li_Numero);
END IF;
--Lv_Cadena_Sud := SUBSTR(Lv_Cadena_Sud,2,LENGTH(Lv_Cadena_Sud));
END IF;
Li_Suma := 0;
END LOOP;
Pv_Cadena_Sud := Lv_Cadena_Sud;

END CAP_PR_CADENA_SUD;
end CAP_PK_EJERCICIOS_LOG_JDE;

También podría gustarte