Kolokwium nr. 3 – Niewiarowski
Liczby Catalana
Treść:
Zadaniem na kolokwium było sprawdzić czy rekordy podanej przez prowadzącego tablicy są fragmentem ciągu Catalana i uzupełnić kolumnę test otrzymanym wynikiem (1 jeśli ciąg jest fragmanetem, 0 jeśli nie).
Rozwiązanie:
Funkcja w PL/SQL.
Wykorzystany wzór z angielskiej wikipedii do obliczania liczb Catalana.
Funcja wykorzysytwana w następujący sposób:
update <nazwa_tabeli> set test=mcatalan(ciag);
Kod procedury:
create or replace function mcatalan(ciag IN varchar2) return number as
--deklaracja zmiennych
ciag_test varchar2(50) := '';
element_ciag number;
begin
--obliczamy tylko 10 elementow ciagu Catalana (wiecej nie trzeba poniewaz w tabeli ciagi sa do 10 elementu)
for i in 0..10 loop
element_ciag:=1;
--obliczamy i element ciagu
for k in 2..i loop
element_ciag := element_ciag * ((i+k)/k); --wzor z angielskiej wikipedii
end loop;
--zaokraglamy bo czasem wychodzily wartosci typu 13,999999999999999999
element_ciag := round(element_ciag);
--dodajemy obliczony element do ciagu wraz z przecinkiem, zeby dopasowac sie do formatu ciagu w tabelce
ciag_test := ciag_test || ',' || element_ciag;
end loop;
--sprawdzamy czy w naszym ciagu Catalana obliczonym w procedurze znajduje sie przekazany ciag do funkcji a wiec czy jest fragmentem tego ciagu
if (instr(substr(ciag_test,1), ciag) <> 0) then
return 1; --jest, zwracamy wartosc 1
else
return 0; --nie jest, zwracamy wartosc 0
end if;
--obsluga wyjatkow
exception
when others then
raise_application_error(-20000, 'Blad' || SQLERRM || ' kod PL/SQL ' || SQLCODE);
end;