Kilka dodatkowych zadan z procedur PL/SQL

Transkrypt

Kilka dodatkowych zadan z procedur PL/SQL
1.
Napisz program znajdowania wszystkich liczb automorficznych w podanym
przedziale domkniętym <A, B>. Liczba automorficzna to liczba, która występuję na
końcu swojego kwadratu np.: 5 bo 52 = 25 lub 25 bo 252 = 625.
CREATE OR REPLACE PROCEDURE automorficzne(a NUMBER, b NUMBER) IS
liczba_ch VARCHAR2(16);
liczba_len NUMBER;
kwadrat_ch VARCHAR2(16);
kwadrat_len NUMBER;
exBlad EXCEPTION;
BEGIN
IF (a > b) THEN
RAISE exBlad;
ELSE
dbms_output.put_line('Wyniki:');
END IF;
FOR x IN a .. b LOOP
liczba_ch := to_char(x);
liczba_len := length(liczba_ch);
kwadrat_ch := to_char(x*x);
kwadrat_len := length(kwadrat_ch);
IF (substr(kwadrat_ch, kwadrat_len-liczba_len+1, liczba_len) = liczba_ch) THEN
dbms_output.put_line(liczba_ch);
END IF;
END LOOP;
EXCEPTION
WHEN INVALID_NUMBER THEN
dbms_output.put_line('Przekroczono zakres typu NUMBER. Podawany zakres powinien byc
mniejszy.' );
WHEN exBlad THEN
dbms_output.put_line('Niepoprawnie wprowadzony zakres. Musi byc: a<=b');
END automorficzne;
2. Napisz program czytania rozmiaru n (skończona liczba naturalna) i
rysowania macierzy o rozmiarach n x n typu lewa-dolna. Macierz lewadolna zawiera na głównej przekątnej i pod tą przekątną znaki X, natomiast
powyżej głównej przekątnej są znaki spacji.
Oto przykład macierzy lewa-dolna dla n=4:
X
XX
XXX
XXXX
CREATE OR REPLACE PROCEDURE macierz_lewa_dolna(n NUMBER) IS
tmp VARCHAR2(64);
exBlad EXCEPTION;
BEGIN
IF (n <= 0) THEN
RAISE exBlad;
END IF;
FOR x IN 1 .. n LOOP
tmp := '';
FOR y IN 1 .. x LOOP
tmp := tmp || 'x';
END LOOP;
dbms_output.put_line(tmp);
END LOOP;
EXCEPTION
WHEN exBlad THEN
dbms_output.put_line('Blad. Za male n.');
END macierz_lewa_dolna;
3. Napisz program wyszukiwania wszystkich liczb pierwszych w podanym
przedziale <A, B>.
CREATE OR REPLACE PROCEDURE pierwsze(a NUMBER, b NUMBER) IS
pierwsza boolean := true;
exBlad Exception;
BEGIN
IF (a > b) THEN
RAISE exBlad;
END IF;
FOR x IN a .. b LOOP
IF (x < 2) THEN
continue;
end if;
pierwsza := true;
FOR y IN 2 .. x-1 LOOP
IF (mod(x,y) = 0) THEN
pierwsza := false;
exit;
END IF;
END LOOP;
if (pierwsza = true) THEN
dbms_output.put_line(to_char(x));
END IF;
END LOOP;
EXCEPTION
WHEN exBlad THEN
dbms_output.put_line('Blad. Niepoprawny zakres. Musi byc: a<b');
END pierwsze;
4. Napisać funkcję
a. zwracająca n-ty wyraz ciągu Fibonacciego; funkcja ma działać
rekurencyjnie;
CREATE OR REPLACE FUNCTION Fibonacci(n NATURAL) RETURN NATURAL IS
exBlad Exception;
wynik NATURAL := 0;
BEGIN
CASE n
WHEN 0 THEN wynik := 0;
WHEN 1 THEN wynik := 1;
WHEN 2 THEN wynik := 1;
ELSE wynik := Fibonacci(n-1) + Fibonacci(n-2);
END CASE;
RETURN wynik;
EXCEPTION
WHEN INVALID_NUMBER THEN
dbms_output.put_line('Blad. Niepoprawna wartosc liczbowa');
END Fibonacci;
/
--wywolanie:
SELECT Fibonacci(5) FROM DUAL;
b. zwracającą n-ty wyraz ciągu Fibonacciego i wypisującą poprzednie
wyrazy ciągu na ekran; funkcja ma działać iteracyjnie;
CREATE OR REPLACE FUNCTION FibonacciCiag(n NATURAL) RETURN NATURAL IS
exBlad Exception;
--TYPE TABLICA IS TABLE OF NATURAL;
TYPE TABLICA IS TABLE OF NATURAL INDEX BY BINARY_INTEGER;
wyniki TABLICA;
BEGIN
dbms_output.put_line('Ciag Fibonacciego:');
wyniki(0) := 0;
wyniki(1) := 1;
dbms_output.put_line('0');
dbms_output.put_line('1');
FOR x in 2 .. n-1 LOOP
wyniki(x) := wyniki(x-1)+wyniki(x-2);
dbms_output.put_line(wyniki(x));
END LOOP;
RETURN wyniki(n-1);
EXCEPTION
WHEN INVALID_NUMBER THEN
dbms_output.put_line('Blad. Niepoprawna wartosc liczbowa');
END FibonacciCiag;
/
--wywolanie:
VARIABLE wynik NUMBER
execute :wynik := FibonacciCiag(50);
PRINT wynik