Opowieść o programowaniu w Adzie



Pobieranie 0.69 Mb.
Strona8/16
Data28.04.2016
Rozmiar0.69 Mb.
1   ...   4   5   6   7   8   9   10   11   ...   16

Instrukcja wyboru

Z typami wyliczeniowymi oraz tworzeniem podtypów związana jest kolejna instrukcja powodująca, że program działa w różny sposób w zależności od wartości pewnego parametru - instrukcja wyboru. Ma ona postać


[1] case selektor is

when lista_możliwości_1   => instrukcje_1



when lista_możliwości_2   => instrukcje_2

..........

when lista_możliwości_n   => instrukcje_n

end case;


lub też
[2] case selektor is

when lista_możliwości_1   => instrukcje_1



when lista_możliwości_2   => instrukcje_2

..........

when lista_możliwości_n   => instrukcje_n

when others               => instrukcje_dalsze

end case;


Selektor musi być zmienną typu dyskretnego (czyli całkowitego lub wyliczeniowego). Jeżeli przybierze on wartość znajdującą się na liście_możliwości_1, wykonywane są instrukcje_1, jeżeli na liście_możliwości_2, wykonywane są instrukcje_2 itd. Jeżeli wartość selektora nie znajduje się na żadnej z list, a instrukcja ma postać [2], to wykonywane są instrukcje następujące po when others. Instrukcja case musi zawierać odniesienie do każdej z możliwych (teoretycznie) wartości selektora, a więc do wszystkich elementów typu (lub podtypu), do którego on należy. Użyteczne jest przy tym napisanie when others => lub zdefiniowanie podtypu obejmującego wszystkie rzeczywiście przyjmowane przez selektor wartości. Przypuśćmy na przykład, że zmienna będąca selektorem jest liczbą całkowitą (np. typu integer) i oznacza numer dnia tygodnia, a więc przyjmuje wartości od 1 do 7. Instrukcja wyboru musi obsłużyć wszystkie te przypadki. Jeśli napiszemy
case selektor is

when 1 => ...

when 2 => ....

...........

when 7=> ....

end case;


to podczas kompilowania programu wystąpi błąd. Nie obsłużyliśmy całości typu integer, a selektor teoretycznie może przyjąć każdą wartość całkowitą. W celu rozwiązania tego problemu możemy dodać w powyższej instrukcji jeszcze jedną, ostatnią możliwość
when others => null;
- wówczas w razie przyjęcia przez selektor innej wartości po prostu nie robimy nic, lub zadeklarować podtyp typu integer
subtype nr_dnia is integer range 1..7;

selektor:nr_dnia;


ograniczając zakres typu selektora do siedmiu rzeczywiście możliwych wartości. Wówczas wystarczająca jest instrukcja w postaci napisanej na początku.
A jak może wyglądać lista_możliwości? Jeżeli jest ona jednoelementowa, na przykład tak:
when 1 =>

when 'a' =>

when pon => -- pon jest elementem typu wyliczeniowego
Jeżeli lista ma mieć więcej elementów, możemy ja zapisać w postaci
when 1| 2 | 7 =>
co oznacza, że zapisane dalej instrukcje wykonujemy, gdy selektor przyjmie wartość 1, 2 lub 7, albo w postaci
when 1..4 =>
Podane instrukcje będą wówczas wykonywane w przypadku przyjęcia przez selektor wartości z powyższego przedziału . W razie potrzeby można łączyc obie formy zapisu, np.
when 1 | 2 | 5..7 =>
Oto przykłady zastosowania instrukcji case:
-- przyklad uzycia instrukcji wyboru

-- program oblicza - w zaleznosci od zyczenia -

-- pole trojkata, prostokata badz kola
with ada.text_io,ada.numerics;

use ada.text_io;


procedure pr22 is

package int_io is new ada.text_io.integer_io(integer);

package flt_io is new ada.text_io.float_io(float);

use int_io, flt_io;

subtype mozliwosc is integer range 1..3;

nr:mozliwosc;

a,b:float;
begin
put_line(" Program oblicza pola nastepujacych figur :");

set_col(10);put_line("1 : trojkat ");

set_col(10);put_line("2 : prostokat");

set_col(10);put_line("3 : kolo");

new_line;

put("Podaj numer wybranej figury : "); get(nr);

new_line;

case nr is

when 1 => put("podaj dlugosc podstawy : ");

get(a);


put("podaj dlugosc wysokosci opuszczonej na te

podstawe : ");

get(b);

new_line;



put("pole trojkata wynosi ");

put(a*b/2.0,exp=>0);

put(" j.kw");

when 2 => put_line("podaj dlugosci bokow : ");

put("a : ");get(a);

put("b : ");get(b);

new_line;

put("pole prostokata wynosi ");

put(a*b,exp=>0);

put(" j.kw");

when 3 => put("podaj promien kola : ");

get(a);


new_line;

put("pole kola wynosi ");

put(ada.numerics.pi*a**2,exp=>0);

put(" j.kw");

end case;

end pr22;


Kolejny przykład - tym razem z selektorem należącym do typu wyliczeniowego:
-- kolejny przyklad uzycia instrukcji wyboru

--

-- wazymy caly samochod



-- otrzymujemy wage ladunku
with ada.text_io;

use ada.text_io;


procedure pr23 is

type ciezarowka is (zuk, star_5t, jelcz_14t, steyer, inne);

package pod_sam is new ada.text_io.enumeration_io(ciezarowka);

use pod_sam;

package int_io is new ada.text_io.integer_io(integer);

use int_io;

waga_zuk : constant integer:=3000;

waga_star_5t : constant integer:=4000;

waga_jelcz_14t : constant integer:=10000;

waga_steyer : constant integer:=14000;

sam:ciezarowka;

mc,m:integer;

begin

new_line;



set_col(5);

put_line(" *** WAGA DLA SAMOCHODOW CIEZAROWYCH ***");

new_line;

put_line("znane masy : zuk, star_5t, jelcz_14t, steyer ");

put_line("wazony samochod (wybierz z listy lub wpisz ""inne"" ");

set_col(20);put("> ");

get(sam);

case sam is

when zuk => m:=waga_zuk;

when star_5t => m:=waga_star_5t;

when jelcz_14t => m:=waga_jelcz_14t;

when steyer => m:=waga_steyer;

when inne => put("podaj mase wlasna samochodu (w kg) : ");

get(m);


end case;

put("podaj mase calosci : ");get(mc);

new_line;

put("masa ladunku wynosi : "); put(mc-m,0);

end pr23;

1   ...   4   5   6   7   8   9   10   11   ...   16


©absta.pl 2016
wyślij wiadomość

    Strona główna