Thursday, October 18, 2018

Pętle


Pętle służą do wielokrotnego wykonywania jakiejś czynności. Pętle zasadniczo można podzielić na te z "FOR", te z "WHILE" i te z "EXIT WHEN". Różnica pomiędzy nimi jest taka, że przy pętlach for musisz znać konkretną ilość powtórzeń jaką ma wykonać pętla, a przy pętli z while czy exit when nie musisz. Pętla while jest wykonywana tak długo jak długo określony w niej warunek jest prawdziwy - możesz np. wykonywać pętle tak długo, jak długo prawdą jest że dziś jest środa. Pętle z exit when mają określony warunek wyjścia - tj. będziesz deklarował np. wykonuj w pętli coś, wyjdź kiedy okaże się że dziś czwartek.



Pętle FOR

Zaczniemy od pętli typu for, jako tej prostszej postaci. Poniżej przykład takiej pętli:


do
$$
begin
for x in 1..10 loop
raise notice '%' , x;
end loop;
end $$;





Pętla ta wypisuje kolejne wartości w zakresie od 1 do 10. Jak ta pętla działa? Przyjrzyjmy się nagłówkowi:


for x in 1..10 loop


X jest zmienną widoczną tylko wewnątrz pętli. Jako pierwszą wartość przypisujemy jej 1, a przy każdym obrocie pętli wartość ta będzie zwiększana o 1 aż do osiągnięcia wartości 10. Krótko mówiąc, zawartość pętli (czyli to co pomiędzy "loop" a "end loop") zostanie wykonane 10 razy. Zmiennej x nie musimy deklarować osobno w sekcji declare.

Wartości skrajne podałem bezpośrednio, ale mogą to być również zmienne. Nie muszą też być to wartości większe od zera. Poniżej przykład użycia dodatkowych zmiennych, zakres zaczyna się od wartości -10.



do
$$
declare
poczatek integer:=-10;
koniec integer:=10;
begin
for x in poczatek..koniec loop
raise notice '%' , x;
end loop;

end $$;





Możesz również określić skok o określoną ilość wartości X. W poniższym przykładzie x będzie się zwiększał nie o 1 a o 2:

do
$$
begin
for x in 1..10 by 2 loop
raise notice '%' , x;
end loop;
end $$;





 Pętle WHILE


Kolejnym rodzajem pętli są pętle while. Tu będziemy określać że dana pętla ma się wykonywać tak długo, jak długo określony warunek jest prawdziwy. Poniżej adaptacja poprzednich przykładów, ale z użyciem pętli while:


do
$$
declare
x integer:=1;
begin
while(x<=10) loop
raise notice '%',x;
x:=x+1;
end loop;

end $$;




Kluczowy jest tu warunek "while(x<=10)". Określa on kiedy pętla ma być wykonywana. Powyższa pętla będzie wykonywana tak długo, jak długo jak długo prawdą jest że x jest mniejsze bądź równe 10. Nie zapomnij o zwiększaniu iteratora "x:=x+1", ponieważ jeśli ten element pominiesz, pętla będzie wykonywała się w nieskończoność, bo warunek w while zawsze będzie prawdziwy. Jeśli warunek określony w while nie był prawdziwy od początku, pętla nie wykona się ani razu.



 Pętle z EXIT WHEN


Pętlę możesz też zdeklarować w ten sposób:


do
$$
declare
x integer:=1;
begin
loop
raise notice '%',x ;
x:=x+1;
end loop;
end $$;



Z tym że w takim przypadku pętla ta nie skończyłaby się nigdy (w zasadzie po przekroczeniu zakresu typu danych integer). Brakuje nam tutaj określenia jak długo pętla ma być wykonywana, lub kiedy ma zostać przerwana. Poniżej adaptacja przykładu z pętli while, tyle że z użyciem klauzuli exit when.


do

$$
declare
x integer:=1;
begin
loop
exit when x=10;
raise notice '%',x ;
x:=x+1;
end loop;

end $$;


Jak widzisz warunek jest sprawdzany na początku pętli. Gdyby okazało się że x ma wartość 10, pętla zostałaby przerwana. Tak też się dzieje. Troszeczkę inne jest podejście - w While mamy warunek przy spełnieniu którego pętla ma być wykonywana nadal, tutaj warunek określa kiedy ma zostać przerwana.



Ćwiczenia

  1. Stwórz program który wyświetli wartości od 1 do 100, wypisując obok czy dana wartość jest parzysta czy nie.
  2. Stwórz program który wyświetli wartości od -10 do 10, a obok każdej z nich wynik dzielenia 1 przez daną wartość. Ewentualny wyjątek powinien być obsłużony w taki sposób, by nie przerywać działania programu, a zamiast tego wyświetlić odpowiedni komunikat.
  3. Napisz symulator lokaty - program powinien przyjmować poprzez zmienne kapitał startowy, oprocentowanie w skali roku i czas trwania lokaty wyrażony w miesiącach. Program ma wyświetlić kolejne miesiące, oraz aktualny kapitał powiększony o odsetki. Kapitalizacja odsetek następuje co miesiąc. Na koniec program powinien jeszcze wyświetlić sumę zarobku z odsetek.

No comments:

Post a Comment

Bezpłatny kurs PL/pgSQL by Andrzej Klusiewicz

Cześć  :) Oddaję w Wasze ręce wersję 1.0.0.0.0.(0) swojego tutoriala dotyczącego języka PL/pgSQL - czyli proceduralnego języka przetwarza...