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