V.
Złożone typy danych i wyliczenia stałych
Poprzednie ćwiczenia wykorzystywały zmienne takich typów, które pozwalają przechowywać je-
dynie pojedynczą wartość – liczbę całkowitą, albo rzeczywistą, znak, wartość logiczną. Jednak nawet
najprostsze zjawisko, przedmiot czy osoba wymagają do opisu zestawu danych. Do przedstawienia
położenia punktu na płaszczyźnie potrzeba dwóch współrzędnych, do przedstawienia wydajności
pracy zespołu w ciągu miesiąca – kilkudziesięciu liczb. Kolejne ćwiczenie pokaże trudności pojawia -
jące się w programowaniu z użyciem większych zestawów danych.
Ćwiczenie 44
Zaprojektować aplikację pozwalającą zapamiętać wartości pięciu liczb i obliczyć ich
sumę, a także wypisać pierwsze trzy w kolejności odwrotnej do tej, w jakiej zostały
wprowadzone.
1. Utwórz Projekt_044 aplikacji konsolowej.
2. Zadeklaruj sześć zmiennych typu Double, pięć do przechowywania wartości podanych
przez użytkownika, jedną do przechowywania sumy tych liczb.
3. Zaprogramuj:
◦
pobranie od użytkownika pięciu liczb,
◦
obliczenie oraz wyświetlenie w konsoli sumy wprowadzonych wartości,
◦
wyświetlenie trzech liczb wprowadzonych jako pierwsze, ale w kolejności odwrot-
nej niż zostały wprowadzone.
4. Sprawdź działanie aplikacji.
Przykład działania programu przedstawiono poniżej:
Rysunek 19: Projekt_044 w działaniu.
Bardzo przydatna byłaby możliwość wykorzystania konstrukcji pętli w ćwiczeniu 44. Pojedyncze
zmienne nie pozwalają na takie skonstruowanie programu. Stosunkowo prosta sytuacja zostanie
skomplikowana w kolejnym ćwiczeniu.
Ćwiczenie 45
Zaprojektować aplikację pozwalającą zapamiętać imiona i wzrosty pięciu osób oraz
obliczyć średni wzrost grupy, a także wypisać dane pierwszych trzech osób w kolejności
odwrotnej do tej, w jakiej zostały wprowadzone.
1. Utwórz Projekt_045 aplikacji konsolowej.
2. Zadeklaruj:
◦
pięć zmiennych typu String do przechowywania imion podawanych przez użyt-
kownika,
◦
sześć zmiennych typu Double, pięć do przechowywania wzrostów podanych przez
użytkownika, jedną do przechowywania średniej wartości tych liczb.
3. Zaprogramuj:
◦
pobranie od użytkownika pięciu imion i wzrostów,
◦
obliczenie oraz wyświetlenie w konsoli średniej wprowadzonych wzrostów,
◦
wyświetlenie danych trzech osób wprowadzonych jako pierwsze, ale w kolejności
odwrotnej niż zostały wprowadzone.
4. Sprawdź działanie aplikacji.
Przykład działania programu przedstawiono poniżej:
Rysunek 20: Projekt_045 w działaniu.
Również w ćwiczeniu 45. wskazane byłoby wykorzystanie pętli. W tym przypadku dodatkowe
obciążenie dla programującego to dwa zestawy danych, nad którymi musi zapanować. Oba problemy
zostały rozwiązane w języku Visual Basic 2010 poprzez zmienne typu strukturalnego oraz zmienne
tablicowe.
V.1.
Typ strukturalny
Imię i wzrost podawane przez użytkownika w ćwiczeniu 45. dotyczyły jednej osoby. Przykład,
z celowo rozbudowanymi nazwami, pokazuje deklaracje zmiennych służących do przechowywania
imienia i wzrostu osoby numer 1:
Dim strOsoba1Imię As String
Dim dblOsoba1Wzrost As Double
Wspólny dla obu zmiennych fragment nazwy, „aż prosi”, żeby (używając języka algebry) „wycią -
gnąć go przed nawias”. Takim nawiasem w Visual Basic 2010 jest deklaracja typu strukturalnego
składająca się ze słów kluczowych
Structure
…
End Structure
. Przekształcając powyższy
przykład do deklaracji typu strukturalnego możemy napisać:
Structure Osoba1
Dim strImię As String
Dim dblWzrost As Double
End Structure
Po takiej deklaracji słowo
Osoba1
jest nazwą nowego typu. Można go stosować wszędzie tam,
gdzie dopuszczalne jest stosowanie innych typów wprowadzonych do tej pory, zatem możliwa jest
deklaracja zmiennej takiego typu:
Dim osoDrybals As Osoba1
Co oznacza powyższa deklaracja? Zanim nastąpi odpowiedź na to pytanie, konieczne jest obja-
śnienie budowy nowego typu. Tak, jak inne typy (
Integer
,
Double
,
Char
,
Boolean
) typ
Osoba1
jest
wzorcem, według którego zmiennym będzie przydzielana pamięć operacyjna. Ustala on również spo-
sób interpretowania zawartości pamięci operacyjnej przydzielonej zmiennej takiego typu.
Deklaracja typu
Osoba1
zawiera deklaracje dwóch zmiennych strImię i dblWzrost. W odniesie-
niu do typu strukturalnego zmienne te nazywamy polami. Powiemy zatem, że „typ strukturalny Oso -
ba1 ma dwa pola: strImię typu String oraz dblWzrost typu Double”. Wielkość typu strukturalnego (licz-
ba bajtów pamięci do przechowywania zmiennej tego typu) pozwala na przechowywanie wszystkich
pól.
Wracając do deklaracji zmiennej osoDryblas można napisać, że zmiennej tej zostanie przydzie-
lona taka ilość pamięci operacyjnej jaka wynika z wielkości typu
Osoba1
.
Do pól zmiennej odwołujemy się (pobieramy, lub ustalamy ich wartość) łącząc nazwę zmiennej i
nazwę pola kropką:
osoDryblas.strImię = "Bożydar"
SumaWzrostów += osoDryblas.dblWzrost
Przed przejściem do kolejnego ćwiczenia zapoznającego z metodyką definiowania typu struktu-
ralnego należy dodać, że deklaracja typu strukturalnego musi występować na poziomie przestrzeni
nazw albo modułu, natomiast nie może być zawarta w metodzie (np. procedurze Main).
Ćwiczenie 46
Zaprojektować aplikację definiującą typ strukturalny DaneOsobowe o trzech polach:
Imię i Nazwisko typu String oraz RokUrodzenia typu Integer.
1. Utwórz Projekt_046 aplikacji konsolowej.
2. Zdefiniuj w module Module1 nowy typ strukturalny o nazwie DaneOsobowe, w tym celu:
◦
ustaw kursor tekstowy w pustym wierszu pomiędzy początkiem modułu, a począt-
kiem procedury Main – jest to część deklaracyjna modułu,
◦
wpisz słowo kluczowe Structure i dodaj po spacji nazwę nowego typu – DaneOso-
bowe,
◦
naciśnij Enter i zauważ, że edytor dokończył deklarację typu dodając słowa klu-
czowe End Structure, kursor tekstowy znajduje się wewnątrz bloku deklaracji.
3. Zadeklaruj w typie DaneOsobowe pola wymienione w zadaniu.
Przykład.
Structure DaneOsobowe
Dim Imię, Nazwisko As String
Dim RokUrodzenia As Integer
End Structure
4. Skompiluj projekt.
W projekcie Projekt_046 obok wcześniej zdefiniowanych typów pojawił się nowy typ
DaneOso-
bowe
. Podlega on tym samym prawom, które posiadają inne typy. W szczególności możliwe jest de-
klarowanie zmiennych takiego typu. Pokazuje to kolejne ćwiczenie.
Ćwiczenie 47
Zadeklarować w procedurze Main zmienną daoOsoba1 typu DaneOsobowe.
W trakcie deklarowania zmiennej daoOsoba1, po wpisaniu słowa kluczowego
As
, pojawiła się li-
sta dostępnych w danym kontekście elementów, a wśród nich nowy typ
DaneOsobowe
. Fakt ten ko-
lejny raz potwierdza ogromną użyteczność środowiska. Kolejne ćwiczenie pokazuje w jaki sposób
ustalać wartości pól zmiennej oraz pobierać te wartości.
Ćwiczenie 48
Zaprogramować pobieranie od użytkownika danych osobowych oraz wyświetlanie ich w
innym formacie.
1. Zaprogramuj:
◦
wyświetlenie w konsoli zachęty do wprowadzenia przez użytkownika imienia.
◦
pobranie i przypisanie podanej przez użytkownika wartości do pola Imię zmiennej
daoOsoba1, w tym celu:
▪
wpisz nazwę zmiennej – daoOsoba1 – i dopisz kropkę; zauważ, że lista do-
stępnych w tym kontekście elementów zawiera również nazwę pola Imię,
▪
wybierz z listy, lub wpisz nazwę pola, Imię,
▪
dokończ instrukcję przypisania w poznany wcześniej sposób;
Przykład.
daoOsoba1.Imię = Console.ReadLine
◦
pobranie i przypisanie polu Nazwisko zmiennej daoOsoba1 nazwiska pobranego
od użytkownika; posłuż się schematem przedstawionym przy pobieraniu imienia,
◦
pobranie i przypisanie polu RokUrodzenia zmiennej daoOsoba1 liczby pobranej
od użytkownika,
◦
wyświetlenie danych zawartych w zmiennej daoOsoba1 w formacie:
Osoba: Imię Nazwisko urodziła się w roku RokUrodzenia.
Przykład.
Console.WriteLine("Osoba: {0} {1} urodziła się w roku {2}.", _
daoOsoba1.Imię, daoOsoba1.Nazwisko, daoOsoba1.RokUrodzenia)
2. Sprawdź działanie aplikacji.
Ustalanie wartości pól i pobieranie z nich danych realizuje się tak, jak dla zwykłych zmiennych,
jednak ze względu na to, że są polami zmiennej typu strukturalnego konieczne jest podawanie opisu
składającego się z nazwy zmiennej i nazwy pola połączonych kropką. Powstałą w ten sposób nazwę
pola nazywa się nazwą kwalifikowaną. Dodać należy, że pole struktury może być również typu struk-
turalnego, jak w poniższym przykładzie:
Structure OsobaPomierzona
Dim Osoba As Osoba1
Dim Wzrost, Waga As Double
End Structure
Typ
OsobaPomierzona
zawiera pole Osoba typu strukturalnego
Osoba1
. Po utworzeniu zmien-
nej tego typu:
Dim Bramkarz As OsobaPomierzona
ustalenie imienia wymagać będzie rozszerzenia notacji:
Bramkarz.Osoba.Imię = "Waldemar"
W ten sposób odwołujemy się do pola Imię, które jest polem pola Osoba, które jest polem
zmiennej Bramkarz. Zapis taki, chociaż niezwykle czytelny – uwidoczniona jest pełna przynależność
pól – jest jednak dosyć pracochłonny. Należy sobie uzmysłowić, że typ pola Osoba może zawierać
więcej niż jedno, dwa, czy trzy pola, a w takim przypadku konieczne będzie wielokrotne powtórzenie
sekwencji Bramkarz.Osoba. Można tego uniknąć stosując konstrukcję wiążącą
With
…
End With
.
Poniższy przykład obrazuje jej użycie w celu ustalenia wartości wszystkich pól zmiennej Bramkarz,
z jednoczesnym pokazem możliwości zagnieżdżania (po prawej stronie pokazany jest zapis tradycyj-
ny):
With Bramkarz
With .Osoba
.Imię = "Waldemar"
.Nazwisko = "Szeroki"
.RokUrodzenia = 2010
End With
.Wzrost = 221.5
.Waga = 98.5
End With
Bramkarz.Osoba.Imię = "Waldemar"
Bramkarz.Osoba.Nazwisko = "Szeroki"
Bramkarz.Osoba.RokUrodzenia = 2010
Bramkarz.Wzrost = 221.5
Bramkarz.Waga = 98.5
Każdy element objęty konstrukcją wiążącą
With
i poprzedzony kropką odnosi się do zmiennej
(pola), której nazwa pojawia się po słowie
With
. Chociaż trudno w to uwierzyć, kod źródłowy przed-
stawiony po lewej stronie zawiera o kilkanaście procent mniej znaków, co oznacza, że programista
używający konstrukcji
With
może napisać kod źródłowy szybciej niż ten, który jej nie stosuje. Przy
większej liczbie pól struktury oszczędności rosną. Kolejne ćwiczenie polegać będzie na zastosowaniu
konstrukcji
With
w projekcie Projekt_046.
Ćwiczenie 49
Zastosować konstrukcję With w kodzie źródłowym Projekt_046.
1. Dodaj pusty wiersz przed wierszem, w którym pobierane jest imię i ustaw w nim kursor
tekstowy.
2. Utwórz konstrukcję With dla zmiennej daoOsoba1, w tym celu:
◦
wpisz słowo kluczowe With rozpoczynające konstrukcję i po spacji dopisz nazwę
zmiennej,
◦
naciśnij Enter i zauważ, że edytor dokończył konstrukcję dopisując słowa End
With, a kursor znajduje się wewnątrz bloku konstrukcji With.
3. Przenieś wszystkie instrukcje występujące poniżej wiersza ze słowami End With do wnę-
trza konstrukcji With i pozostaw zaznaczenie tego fragmentu kodu źródłowego.
4. Usuń wszystkie wystąpienia tekstu daoOsoba1 z zaznaczonego tekstu, w tym celu:
◦
rozwiń menu Edit (Edycja) i zapoznaj się z jego poleceniami,
◦
postaraj się zapamiętać ikony oraz skróty klawiaturowe poleceń: Quick Find
(Szybkie odnajdywanie) oraz Quick Replace (Szybka zamiana),
◦
uruchom polecenie Quick Replace, pojawia się okno dialogowe Find and Replace
(Znajdź i zamień), rozpoznaj jego elementy, w tym:
▪
listę rozwijaną Find what (Co znaleźć) – służy do wprowadzenia ciągu znaków
poszukiwanych w tekście; lista zapamiętuje wcześniej poszukiwane ciągi zna-
ków;
▪
listę rozwijaną Replace with (Zastąp tym) – służy do wprowadzenia ciągu zna-
ków, którym ma zostać zastąpiony ciąg odszukany; lista zapamiętuje wcześniej
wpisane ciągi znaków;
▪
listę rozwijaną Look in (Szukaj w), pozwala ustalić zakres przeszukiwanego
tekstu:
•
Current document – Bieżący dokument,
•
Selection – Zaznaczony obszar,
•
All open documents – Wszystkie otwarte dokumenty,
•
Current Project – Bieżący projekt,
•
Entire Solution – Całe rozwiązanie,
•
Current block ( Main ) – bieżący blok ( Main ), jest to opcja dynamiczna,
tekst wyświetlany w nawiasie zależy od położenia kursora tekstowego i
przedstawia blok kodu, w którym znajduje się kursor,
▪
przycisk Replace All (Zastąp wszystko) – służy do uruchomienia wyszukiwania
i zamiany wszystkich odnalezionych we wskazanym zakresie tekstu ciągów
znaków;
◦
wprowadź do pola listy Find what tekst: daoOsoba1,
◦
wyczyść pole Replace with,
◦
uruchom wyszukiwanie i zamianę przyciskiem Replace All,
◦
zamknij komunikat o liczbie wykonanych zamian i zamknij okno Find and Replace
przyciskiem Close.
5. Sprawdź działanie aplikacji.
Konstrukcja wiążąca nie wpływa na kod wykonywalny stanowi jedynie ułatwienie i przyspiesza
pracę programisty.
Typ strukturalny stosuje się wtedy, kiedy występuje potrzeba utworzenia zestawu, logicznie po-
łączonych, wielkości różnych typów – imię i nazwisko z wagą i wzrostem osoby.
Jeżeli wielkości są tego samego typu to można je przechowywać w zmiennych tablicowych.
V.2.
Zmienne tablicowe
Jeśli pewien uczeń otrzyma zadanie notowania temperatury powietrza przez pięć dni o godzinie
7:00, to zapewne narysuje tabelkę podobną do przedstawionej poniżej:
Dzień
Temperatura
powietrza
o godzinie 7:00
[ºC]
1
2
3
4
5
Warto zauważyć, że wszystkie liczby, które zostaną wpisane do pustych komórek tej tabeli re-
prezentują – temperaturę. Programowe przechowywanie wartości temperatur, na podstawie zdoby-
tych wcześniej umiejętności, realizowalibyśmy deklarując pięć zmiennych, np.:
Dim Temperatura0, Temperatura1, Temperatura2, Temperatura3, Temperatura4 As Double
(Pierwszą zmienną celowo nazwano Temperatura0, aby uprościć dalsze objaśnienia.) Ponow-
nie, taki zapis, aż się prosi o „wyciągnięcie przed nawias” słowa Temperatura. Język Visual Basic
2010 umożliwia takie działanie poprzez zmienne tablicowe. W odniesieniu do powyższego przykładu
deklaracja przyjmie następującą postać:
Dim Temperatura(4) As Double
Co oznacza ta deklaracja? Oznacza ona zarezerwowanie miejsca w pamięci operacyjnej dla
zmiennej o nazwie Temperatura, która składa się z pięciu, numerowanych od zera, elementów typu
Double
. Numer każdego elementu nazywa się jego indeksem. Do elementu tablicy można się odwo-
łać używając jej nazwy i indeksu. Przykładowo, chcąc przypisać wartość do trzeciego elementu tabli-
cy użyjemy następującej instrukcji:
Temperatura(2) = 23.5
Indeks 2 jest indeksem trzeciego elementu tablicy, gdyż indeksem pierwszego elementu jest
zero, a drugiego – jeden. Elementy tablicy – zwane komórkami – mogą być dowolnego (ale wszystkie
jednakowego) typu. Tablicę taką, jaką opisano w przykładzie nazywa się tablicą jednowymiarową.
Kolejne ćwiczenie polegać będzie na wykorzystaniu tablicy jednowymiarowej do zrealizowania ćwi-
czenia.
Ćwiczenie 50
Zaprojektować aplikację realizującą zadanie ćwiczenia 44. w oparciu o tablicę
jednowymiarową.
1. Utwórz Projekt_050 aplikacji konsolowej.
2. Zadeklaruj zmienną dblSuma typu Double o wartości początkowej 0.
3. Zadeklaruj zmienną tablicową Liczby o pięciu komórkach typu Double, w tym celu:
◦
wpisz w zwykły sposób deklarację zmiennej Liczby typu Double, a następnie do-
daj po słowie Liczby liczbę 4 objętą w nawiasy okrągłe.
Przykład.
Liczby(4) As Double
4. Zadeklaruj zmienną intLicznik typu Integer, posłuży jako zmienna sterująca pętlą.
5. Skonstruuj pętlę For ze zmienną sterującą intLicznik zmieniającą się od 0 do 4, a w niej
zaprogramuj:
◦
wyprowadzenie do konsoli tekstu zachęcającego do wprowadzenia liczby,
◦
pobranie i przypisanie wprowadzonej przez użytkownika wartości do komórki ta-
beli o indeksie równym wartości zmiennej sterującej pętlą – intLicznik,
Przykład.
Liczby(intLicznik) = CDbl(Console.ReadLine)
◦
zwiększenie wartości zmiennej dblSuma o wartość przechowywaną w komórce ta-
beli o indeksie równym wartości zmiennej sterującej pętlą.
Przykład.
dblSuma += Liczby(intLicznik)
6. Zaprogramuj, po zakończeniu pętli, wyświetlenie wartości zmiennej dblSuma.
7. Skonstruuj pętlę For ze zmienną sterującą intLicznik zmieniającą się od 2 do 0 z prze-
skokiem równym -1, a w niej zaprogramuj wyprowadzenie do konsoli wartości z komórki
tabeli o indeksie równym wartości zmiennej sterującej pętlą – intLicznik.
Przykład.
Console.WriteLine(Liczby(intLicznik))
8. Sprawdź działanie aplikacji. Porównaj długość kodu procedury Main ćwiczeń 44. i 50.
Występuje skrócenie kodu źródłowego tym większe im większa jest krotność wykonania pętli.
Ponadto widać, że pewne działania programu można parametryzować.
Tablice wielowymiarowe, najprostszy przypadek – tablica dwuwymiarowa
Załóżmy, że uczeń notujący temperatury powietrza otrzyma ponownie to samo zadanie, jednak
tym razem ma notować temperaturę co 12 godzin (o 7:00 i 19:00). Prawdopodobnie przygotuje sobie
nową tabelkę:
Dzień
Temperatura powietrza [ºC]
7:00
19:00
1
2
3
4
5
Ponownie, wszystkie puste komórki zostaną wypełnione wartościami tego samego typu – tem-
peraturami. Jednak tym razem tabela posiada dwie kolumny. Łatwo obliczyć, że potrzebne byłoby 10
zmiennych – Temperatura_1_7, Temperatura_1_19, …, Temperatura_5_7, Temperatura_5_19. Przy-
kładowe nazwy zmiennych zostały utworzone ze słowa „Temperatura”, numeru dnia i numeru godziny
połączonych znakiem podkreślenia. Wykorzystanie tych zmiennych wymagałoby dużego nakładu
pracy programisty, a kod źródłowy nie posiadałby żadnej elastyczności – jakiekolwiek zmiany wyma -
gałyby panowania nad wszystkimi zmiennymi.
Rozwiązanie opisanego problemu, to zmienna tablicowa o dwóch wymiarach (można je koja-
rzyć z wierszami i kolumnami, osiami układu współrzędnych itp.). Jej deklaracja wygląda następują-
co:
Dim Temperatura(4, 1) As Double
Co oznacza ta deklaracja? Oznacza ona zarezerwowanie miejsca w pamięci operacyjnej dla
zmiennej o nazwie Temperatura, która składa się z dziesięciu elementów typu Double. Zmienna za-
wiera pięć grup po dwie komórki w każdej grupie. Każda komórka dostępna jest poprzez nazwę
zmiennej oraz indeks grupy, do której należy i indeks, który posiada w grupie. Jeśli indeks grupy sko -
jarzymy z wierszem, a indeks w grupie z kolumną, to można napisać, że komórka dostępna jest po-
przez nazwę zmiennej tablicowej oraz indeks wiersza i indeks kolumny. Przykładowo, chcąc przypi-
sać wartość temperatury w trzecim dniu (indeks wiersza 2) o godzinie 19:00 (indeks kolumny 1), uży-
jemy następującej instrukcji:
Temperatura(2, 1) = 23.5
Podobnie chcąc wyprowadzić wartość porannej temperatury czwartego dnia użyjemy następu-
jącej instrukcji:
Console.WriteLine("Temperatura o godz. {0}, w {1} dniu wynosiła: {2}", "7:00", 4, _
Temperatura(3, 0))
Przed przejściem do tablic o większej liczbie wymiarów warto sobie uzmysłowić fakt, że tabelka
ucznia mogła mieć inną postać:
Dzień
1
2
3
4
5
Temperatura
powietrza [ºC]
7:00
19:00
Odzwierciedleniem programowym takiej tabeli będzie deklaracja:
Dim Temperatura(1, 4) As Double
Chcąc przypisać wartość do komórki przechowującej temperaturę wieczorną czwartego dnia
użyjemy instrukcji:
Temperatura(1, 3) = 22.5
W tym przypadku pierwszy indeks odnosi się do „wiersza temperatur”, a drugi do „kolumn dni”.
Wybór organizacji zmiennej tablicowej zależy od przyzwyczajeń programisty i konkretnego zadania.
Jednak należy pamiętać, że deklaracja jednoznacznie ustala liczbę wierszy i kolumn zmiennej tabli-
cowej. Kolejne ćwiczenie polegać będzie na zadeklarowaniu zmiennej tablicowej dwuwymiarowej do
przechowywania imion i nazwisk 10 osób.
Ćwiczenie 51
Utworzyć projekt ze zmienną tablicową pozwalającą przechowywać imiona i nazwiska
10 osób.
1. Utwórz Projekt_051 aplikacji konsolowej.
2. Zadeklaruj w procedurze Main zmienną tablicową strGodności o 10 wierszach i 2 kolum-
nach komórek typu String.
Przykład.
Dim strGodności(9, 1) As String
Zadeklarowana tablica pozwala przechowywać po dwa łańcuchy tekstowe o indeksach 0
(dla imienia) i 1 (dla nazwiska) w dziesięciu wierszach, o indeksach od 0 do 9. W kolejnym ćwiczeniu
tablica zostanie wykorzystana do przechowywania danych pobranych od użytkownika.
Ćwiczenie 52
Zaprogramować pobranie od użytkownika 10 imion i nazwisk, a następnie wyświetlenie
w konsoli tylko tych imion i nazwisk, które zajmują w zmiennej komórki wierszy o
nieparzystych indeksach, kolejność wyświetlania powinna być odwrotna do kolejności
wprowadzania.
1. Zadeklaruj zmienną sterującą pętlą, samodzielnie dobierz odpowiedni typ i zbuduj nazwę
zmiennej, która niesie informację o typie i przeznaczeniu zmiennej.
2. Skonstruuj pętlę For ze zmienną sterującą pętlą (zadeklarowaną wcześniej – patrz
punkt 1.) zmieniającą się od 0 do 9 i zaprogramuj w niej:
◦
wyświetlenie zachęty do wprowadzenia przez użytkownika kolejnego imienia,
◦
pobranie wprowadzonego imienia i przypisanie go komórce o indeksie 0 leżącej w
wierszu o indeksie zgodnym z wartością zmiennej sterującej pętlą,
Przykład (założono, że zmienna sterująca pętlą została nazwana intNumerOsoby).
strGodności(intNumerOsoby, 0) = Console.ReadLine
◦
wyświetlenie zachęty do wprowadzenia przez użytkownika kolejnego nazwiska,
◦
pobranie wprowadzonego nazwiska i przypisanie go komórce o indeksie 1 leżącej
w wierszu o indeksie zgodnym z wartością zmiennej sterującej pętlą,
Przykład (założenie o nazwie zmiennej sterującej pętlą, jak w poprzednim przykładzie).
strGodności(intNumerOsoby, 1) = Console.ReadLine
3. Skonstruuj kolejną pętlę For ze zmienną sterującą zmieniającą się od 9 do 1 z przesko-
kiem -2 i zaprogramuj w niej wyświetlenie w konsoli imienia i nazwiska przechowywa-
nych w komórkach wiersza o indeksie zgodnym z wartością zmiennej sterującej pętlą.
Przykład (założenie, jak w poprzednich przykładach).
Console.WriteLine("Osoba w wierszu nr {0} to {1} {2}", intNumerOsoby, _
strGodności(intNumerOsoby, 0), strGodności(intNumerOsoby, 1))
4. Sprawdź działanie aplikacji.
Wykonanie ćwiczenia 52. bez użycia zmiennych tablicowych wymagałoby ogromnego nakładu
pracy przy deklarowaniu zmiennych, organizacji wprowadzania i wyprowadzania danych.
Tablica zadeklarowana w ćwiczeniu 51. pozwala przechowywać imię i nazwisko. Załóżmy, że
projekt powinien przechowywać również imię ojca oraz nazwisko rodowe matki. Wyobrażając sobie
dokument z odpowiednimi rubrykami łatwo dojść do wniosku, że deklaracja odpowiedniej zmiennej
będzie wyglądać następująco:
Dim Osoby(9, 3) As String
W każdym wierszu można będzie przechować imię (indeks kolumny 0), nazwisko (1), imię
ojca (2), nazwisko rodowe matki (3). Liczba kolumn odpowiada liczbie danych wprowadzanych w jed-
nym wierszu. Liczba wierszy odpowiada liczbie obiektów, o których chcemy przechowywać informa-
cje.
Załóżmy, że przechowywane w tablicy wartości, to dane członków zespołu sportowego. Pro-
blem pojawi się, gdy będziemy chcieli przechować takie same dane dla pewnej liczby drużyn. Roz-
wiązaniem są w takim przypadku tablice trójwymiarowe.
Tablice wielowymiarowe, przypadek ogólny
Jeśli wyobrazimy sobie zmienną strGodności zadeklarowaną w ćwiczeniu 51. jako tabelę
na kartce papieru i uznamy, że to lista zawodników zespołu sportowego, to kartki z tabelami do prze -
chowywania danych innych zespołów będą wyglądały identycznie (10 wierszy 2 kolumny). Kładąc
wypełnione kartki jedną nad drugą (w stos) otrzymujemy model tablicy trójwymiarowej. Deklaracja ta-
kiej tablicy, przy założeniu, że chcemy przechowywać dane 5 zespołów, wygląda następująco:
Dim strZespoły(4, 9, 1) As String
Deklaracja ta oznacza, że zmienna będzie przechowywać w pięciu wierszach, o indeksach od 0
do 4, odpowiadających kolejnym zespołom, po 10 kolumn, po dwie komórki w każdej kolumnie. Wy-
świetlenie imienia pierwszego zawodnika trzeciej drużyny uzyskamy stosując instrukcję:
Console.WriteLine(strZespoły(2, 0, 0))
Liczba dwa (2) odpowiada indeksowi trzeciego zespołu, pierwsze zero odpowiada pierwszemu
zawodnikowi w zespole, drugie zero jest indeksem imienia.
Można dodawać wymiary do zmiennej tablicowej wykorzystując ogólną postać deklaracji:
Dim TablicaWielowymiarowa(OstatniIndeksPierwszegoWymiaru, OstatniIndeksDrugiegoWymiaru,
…, OstatniIndeksPrzedostatniegoWymiaru, OstatniIndeksOstatniegoWymiaru) As Typ
Należy przy tym pamiętać, że wielkość rezerwowanej dla takiej zmiennej pamięci operacyjnej,
rośnie tak, jak iloczyn zakresów indeksów. Przykładowo dla tablicy czterowymiarowej o 10. indeksach
w każdym wymiarze i typie przechowywanych danych wymagającym 1 bajta pamięci, na przechowy-
wanie danych potrzebne będzie 10
4
=10000 bajtów. Kolejne ćwiczenie poświęcone jest utworzeniu i
wykorzystaniu zmiennej tablicowej czterowymiarowej.
Ćwiczenie 53
Zaprojektować aplikację pozwalającą na przechowywanie danych o liczebności rodzin
zamieszkujących położone po dwóch stronach ulicy, cztery jednakowe (dwa po każdej
stronie ulicy), dwukondygnacyjne budynki o dwóch mieszkaniach na każdej kondygnacji.
Zmienna tablicowa przechowująca dane powinna uwzględniać stronę ulicy, numer
budynku po danej stronie ulicy, numer kondygnacji i numer mieszkania na kondygnacji.
Program po wprowadzeniu danych o liczbie rodzin powinien wyświetlić sumaryczną
liczbę mieszkańców osiedla.
1. Utwórz Projekt_053 aplikacji konsolowej.
2. Zadeklaruj zmienną tablicową intMieszkańcy o czterech wymiarach i elementach typu In-
teger.
3. Zadeklaruj cztery zmienne sterujące pętlami For.
4. Zadeklaruj zmienną intWszyscy typu Integer o wartości początkowej 0, posłuży do obli-
czenia sumarycznej liczby mieszkańców.
5. Skonstruuj pętlę For, w której zmienna sterująca zmienia się od 0 do 1 tak, jak strony uli-
cy, a wewnątrz pętli:
◦
skonstruuj zagnieżdżoną pętlę For, w której zmienna sterująca zmienia się od 0 do
1 tak, jak numery domów po każdej stronie ulicy, a wewnątrz pętli:
▪
skonstruuj zagnieżdżoną pętlę For, w której zmienna sterująca zmienia się od
0 do 1 tak, jak numery kondygnacji w budynku, a wewnątrz pętli:
•
skonstruuj zagnieżdżoną pętlę For, w której zmienna sterująca zmienia się
od 0 do 1 tak, jak numery mieszkań na danej kondygnacji, w pętli zaprogra-
muj:
◦
wyświetlenie informacji o mieszkaniu w następującym formacie (wyko-
rzystaj konstrukcję warunkową, aby wyświetlić prawidłowe określenie
strony ulicy i kondygnacji - parter/piętro):
Mieszkanie nr 2 na parterze bloku nr 1 po lewej stronie ulicy.
Uwaga. Lewa strona ulicy ma indeks 0, prawa – 1, pierwszy blok po każdej stronie ulicy ma in-
deks 0, drugi – 1, parter każdego bloku ma indeks 0, pierwsze piętro – 1.
◦
pobranie liczby mieszkańców mieszkania, o którym wyświetlono infor-
mację i przypisanie go do odpowiedniej komórki tabeli,
◦
zwiększenie wartości zmiennej intWszyscy o pobraną wcześniej liczbę
mieszkańców.
6. Zaprogramuj, po zakończeniu wszystkich pętli, wyświetlenie informacji o liczbie miesz-
kańców osiedla.
7. Sprawdź działanie aplikacji.
Zmienna zadeklarowana jako tablicowa posiada ważne właściwości przydatne podczas progra-
mowania. Są one omówione w kolejnym podpunkcie.
Przydatne cechy zmiennej tablicowej
Deklarowane w poprzednich ćwiczeniach tablice posiadały taką wielkość, jaka wynikała z dekla-
racji. Można jednak zadeklarować zmienną tablicową bez podawania zakresu jej indeksów:
Dim ZmiennaTablicowa() As Typ
Deklaracja taka wskazuje jedynie, że zmienna jest zmienną tablicową, nie posiada ona jednak
komórek, które mogłyby być wykorzystane do przechowywania wartości.
Rysunek 21: Projekt_053 w działaniu.
Aby zadeklarować w ten sposób tablicę wielowymiarową, np. trójwymiarową, należy użyć dekla-
racji:
Dim TablicaTrojwymiarowa( , , ) As Typ
Jeśli, w którymkolwiek momencie wykonania programu okaże się, że konieczna jest zmiana
rozmiaru wcześniej zadeklarowanej tablicy, należy posłużyć się następującą deklaracją:
ReDim ZmiennaTablicowa(NowyOstatniIndeks)
Deklaracja zmienia rozmiar tablicy ZmiennaTablicowa tak, aby maksymalny indeks miał wartość
NowyOstatniIndeks. Można również zmieniać rozmiar tablic wielowymiarowych podając nowe warto-
ści maksymalne indeksów dla każdego wymiaru. Należy jednak pamiętać, że użycie deklaracji
ReDim
powoduje utworzenie nowej tablicy w miejscu poprzedniej i ustalenie wartości wszystkich ko -
mórek tablicy na wartość domyślną typu komórki (0 dla typów liczbowych, False dla logicznych itd.).
Możliwa jest zmiana wielkości ostatniego wymiaru tablicy z zachowaniem wartości przechowy-
wanych w tablicy. Należy użyć deklaracji
ReDim
ze słowem kluczowym
Preserve
(Zachowaj):
ReDim Preserve ZmiennaTablicowa(NowyOstatniIndeks)
W przypadku tablic wielowymiarowych należy podać indeksy maksymalne, wymiarów poprze-
dzających zmieniany, takie same, jak w pierwotnej deklaracji tablicy (
Dim
). Wielkość wymiaru można
zmniejszać (odzyskując pamięć operacyjną) lub zwiększać. Kolejne ćwiczenie pokazuje przykłady
zastosowania wymienionych deklaracji dla jednowymiarowej zmiennej tablicowej.
Ćwiczenie 54
Zaprojektować aplikację ze zmienną tablicową intLiczby o elementach typu Integer.
Aplikacja powinna pobrać od użytkownika liczbę elementów, które tablica ma
przechowywać i dostosować jej rozmiar, pobrać liczby od użytkownika i wyświetlić je w
odwrotnej kolejności, pobrać od użytkownika nową (większą) liczbę elementów tablicy i
zmienić jej rozmiar tak, aby nie utracić wprowadzonych wcześniej danych, a następnie
pobrać brakujące dane i wyświetlić wszystkie w kolejności odwrotnej do kolejności
wprowadzania.
1. Utwórz Projekt_054 aplikacji konsolowej.
2. Zadeklaruj zmienną tablicową intLiczby o elementach typu Integer.
Przykład.
Dim intLiczby() As Integer
lub (nawiasy po nazwie typu określają typ tablicowy)
Dim intLiczby As Integer()
3. Zadeklaruj zmienną intPoczątkowaLiczbaElementów typu Integer, posłuży do przecho-
wywania pobranej od użytkownika liczby elementów zmiennej tablicowej intLiczby.
4. Pobierz od użytkownika wartość zmiennej intPoczątkowaLiczbaElementów.
5. Zmień wielkość zmiennej tablicowej intLiczby.
Przykład.
ReDim intLiczby(intPoczątkowaLiczbaElementów - 1)
Uwaga. Liczba elementów jest większa o 1 niż wartość maksymalnego indeksu, i odwrotnie –
maksymalny indeks jest o 1 mniejszy niż liczba elementów.
6. Zadeklaruj zmienną sterującą pętlą.
7. Skonstruuj pętlę pobierającą od użytkownika liczby i przypisującą je do odpowiednich ko-
mórek zmiennej tablicowej intLiczby.
8. Zaprogramuj wyświetlenie liczb przechowywanych w zmiennej tablicowej w odwrotnej
kolejności niż były wprowadzone.
9. Zadeklaruj zmienną intKońcowaLiczbaElementów typu Integer, posłuży do przechowy-
wania pobranej od użytkownika nowej liczby elementów tablicy.
10.Pobierz od użytkownika nową wartość zmiennej intKońcowaLiczbaElementów.
11. Zmień wielkość zmiennej tablicowej intLiczby tak, aby nie utracić przechowywanych w
niej wartości.
Przykład.
ReDim Preserve intLiczby(intKońcowaLiczbaElementów - 1)
12.Skonstruuj pętlę pobierającą od użytkownika brakujące liczby i przypisującą je do odpo-
wiednich komórek zmiennej intLiczby.
13.Zaprogramuj wyświetlenie liczb przechowywanych w zmiennej tablicowej w odwrotnej
kolejności niż były wprowadzone.
14.Sprawdź działanie aplikacji.
Rysunek 22: Projekt_054 w działaniu.
Liczbę indeksów, w wymiarze o podanym numerze, zwraca funkcja GetLength (Oddaj dłu-
gość, zwróć długość). Liczba indeksów jest o 1 większa niż wartość indeksu maksymalnego w danym
wymiarze.
Załóżmy, że zmienną tablicową zadeklarowano w następujący sposób:
Dim dblTablica(3, 4, 2) As Double
Ma ona trzy wymiary, pierwszy z indeksami od 0 do 3 (4 wiersze), drugi z indeksami od 0 do 4
(pięć kolumn), itd. Aby wyświetlić w konsoli liczbę wymiarów zmiennej dblTablica można posłużyć się
instrukcją:
Console.WriteLine("Zmienna dblTablica ma {0} wymiar(y|ów)", dblTablica.Rank)
Przy założeniach poczynionych wcześniej, w konsoli pojawi się tekst:
Zmienna dblTablica ma 3 wymiar(y|ów)
Należy raz jeszcze podkreślić, że numery wymiarów (które zostaną użyte w kolejnym przykła-
dzie) rozpoczynają się od 0, dlatego wymiar drugi ma numer 1, a trzeci – 2. Chcąc wyświetlić w kon -
soli liczbę indeksów dostępnych w drugim wymiarze można posłużyć się instrukcją:
Console.WriteLine("Drugi wymiar ma {0} indeksów, minimalny to 0, a maksymalny to {1}", _
dblTablica.GetLength(1), dblTablica.GetLength(1) – 1)
Przy wcześniejszych założeniach, w konsoli pojawi się tekst:
Drugi wymiar ma 5 indeksów, minimalny to 0, a maksymalny to 4
Kolejne ćwiczenie pozwala prześledzić zmieniający się rozmiar ostatniego wymiaru zmiennej ta-
blicowej.
Ćwiczenie 55
Wykorzystać wartość zwracaną przez metodę Rank oraz funkcję GetLength do śledzenia
rozmiaru ostatniego wymiaru zmiennej tablicowej.
1. Utwórz Projekt_055 aplikacji konsolowej.
2. Zadeklaruj zmienną tablicową intLiczby o dwóch wierszach i dwóch kolumnach, komórki
powinny być typu Integer.
3. Zadeklaruj zmienne intWymiar, intMaksymalnyIndeks, intLiczbaIndeksów typu Integer,
posłużą do przechowywania wartości zgodnie ze swoimi nazwami.
4. Skonstruuj pętlę For ze zmienną sterującą intWymiar zmieniającą się od 0 do wartości
maksymalnego numeru wymiaru zmiennej intLiczby.
Przykład.
For intWymiar = 0 To intLiczby.Rank – 1
Uwaga. Ponieważ Rank przechowuje liczbę wymiarów, to maksymalny numer wymiaru jest o 1
mniejszy, i odwrotnie – liczba wymiarów jest o 1 większa niż maksymalny numer wymiaru.
5. Zaprogramuj w pętli:
◦
przypisanie zmiennej intLiczbaIndeksów liczby indeksów w wymiarze o numerze
zgodnym z wartością zmiennej sterującej pętlą – intWymiar,
Przykład.
intLiczbaIndeksów = intLiczby.GetLength(intWymiar)
◦
przypisanie zmiennej intMaksymalnyIndeks wartości zmiennej intLiczbaIndeksów
pomniejszonej o 1,
◦
wyświetlenie w konsoli informacji o numerze wymiaru, liczbie indeksów oraz naj-
mniejszym i największym indeksie w tym wymiarze. Aby posłużyć się naturalnym
numerem wymiaru, należy wyprowadzić wartość zmiennej intWymiar powiększoną
o 1.
6. Zaprogramuj, po zakończeniu pętli, zmianę zmiennej tablicowej na pięciowierszową i
sześciokolumnową.
7. Wklej, poniżej instrukcji zmieniającej rozmiar zmiennej, kopię pętli For utworzonej w
punktach 4. i 5.
8. Sprawdź działanie aplikacji.
Zamiast obliczać maksymalny indeks danego wymiaru można go otrzymać metodą
GetUpperBound tablicy. Metoda ta przyjmuje jako parametr numer wymiaru tablicy, dla którego ma
zwrócić maksymalny indeks.
Pętla For Each … Next
Wprowadzenie typu tablicowego pozwala dokończyć temat pętli programowych. Pamiętamy, że
ostatnim typem pętli była
For
Each
…
Next
. Pętlę taką można wykorzystać do powtórzenia zbioru
Rysunek 23: Projekt_055 w działaniu.
instrukcji dla każdego elementu pewnego zbioru. Takim zbiorem może być np. zmienna typu tablico-
wego.
Załóżmy, że mamy jednowymiarową tablicę dblX o określonej liczbie komórek. Chcemy dla każ-
dej przechowywanej w tablicy wartości obliczyć wartość trójmianu:
y= f x =ax
2
bxc
Znając pętlę
For
możemy wykonać to zadanie w następujący sposób:
For intLicznik As Integer = 0 To dblX.GetUpperBound(0)
Console.WriteLine("f({0}) = {1}", dblX(intLicznik), a * dblX(intLicznik) ^ 2 + b * dblX(intLicznik) + c)
Next
Jednak czytelność instrukcji zawartej w pętli nie jest zbyt dobra. Wykorzystanie pętli ze słowem
Each pozwala poprawić ten niedostatek:
For Each X As Double In dblX
Console.WriteLine("f({0}) = {1}", X, a * X ^ 2 + b * X + c)
Next
Pętla definiuje zmienną tego samego typu jak każdy element zbioru, którego nazwa występuje
po słowie
In
(W). Do tej zmiennej pobierane są kolejne wartości ze zbioru, a następnie na zmiennej
wykonywane są instrukcje zawarte w pętli. Widać, że wzór zawarty w pętli dużo bardziej przypomina
zapis matematyczny. Ponadto programista zwolniony jest od wyznaczania maksymalnego indeksu
tablicy.
V.3.
Wyliczenia stałych – enumeracje
Przypomnijmy składnię deklaracji stałej:
Const NazwaStałej As Typ = Wartość
Od chwili zadeklarowania stałej, jej nazwa jest tożsama z wartością Wartość i w bloku, w którym
została zadeklarowana, nie może ulec zmianie. Używanie w kodzie źródłowym konkretnej wartości
zamiast nazwy stałej wpływa ujemnie na jego czytelność. Ponadto w przypadku konieczności zmiany
użytej wartości, programista musi odnaleźć i edytować kolejno każde jej wystąpienie. Jeśli użyje sta -
łej i jej nazwy, to edycja ogranicza się do deklaracji stałej.
Zdarza się, że stałe tworzą pewien logicznie powiązany zbiór. Przykładami takich zbiorów są
obowiązujące ograniczenia prędkości, temperatura topnienia i temperatura parowania pewnej sub-
stancji, itp. Język Visual Basic 2010 pozwala powiązać takie stałe w zbiór zwany enumeracją. Każda
enumeracja posiada nazwę i zawiera nazwy oraz wartości należących do niej stałych. Dostęp do
konkretnej stałej uzyskuje się poprzez nazwę enumeracji i połączoną z nią kropką nazwę stałej.
Przykład.
Zmienna = NazwaEnumeracji.NazwaStałej * 5
Język Visual Basic 2010 zawiera deklaracje wielu enumeracji. Programista może zdefiniować
własne używając konstrukcji
Enum
…
End Enum
. Kolejne ćwiczenie polegać będzie na utworzeniu
enumeracji wiążącej stałe przedstawiające temperaturę topnienia i temperaturę wrzenia wody.
Ćwiczenie 56
Zdefiniować enumerację Woda ze stałymi TemperaturaTopnienia i TemperaturaWrzenia.
1. Utwórz Projekt_056 aplikacji konsolowej.
2. Utwórz, w części deklaracyjnej modułu, szkielet deklaracji enumeracji, w tym celu:
◦
wpisz słowo kluczowe Enum i po spacji dopisz nazwę enumeracji – Woda,
◦
naciśnij Enter i zauważ, że edytor dokończył deklarację słowami kluczowymi End
Enum.
3. Zdefiniuj w enumeracji dwie stałe TemperaturaTopnienia i TemperaturaWrzenia typu Inte-
ger o wartościach odpowiednio: 0, 100.
Przykład.
TemperaturaTopnienia = 0
TemperaturaWrzenia = 100
Ponieważ elementy enumeracji są stałe z definicji, a ponadto mogą być jedynie typów całkowi-
tych (domyślnie Integer), to deklarując je nie podaje się słowa Const i można opuścić wskazanie
typu.
4. Zadeklaruj w procedurze Main zmienną intRóżnica typu Integer i przypisz jej wartość róż-
nicy stałych TemperaturaWrzenia i TemperaturaTopnienia.
Przykład.
Dim intRóżnica As Integer = Woda.TemperaturaWrzenia - Woda.TemperaturaTopnienia
5. Zaprogramuj w procedurze Main wyświetlenie w konsoli informacji o różnicy pomiędzy
temperaturami wrzenia i topnienia wody.
6. Sprawdź działanie aplikacji.
Enumeracja Woda grupuje dwie stałe TemperaturaTopnienia i TemperaturaWrzenia o warto-
ściach 0 i 100. Jeśli wartość pierwszej stałej w enumeracji wynosi 0, to można pominąć inicjowanie
tej stałej. W związku z tym deklaracja enumeracji Woda może wyglądać następująco:
Enum Woda
TemperaturaTopnienia
TemperaturaWrzenia = 100
End Enum
Dodatkowo, w przypadku, gdy niektóre wartości enumeracji tworzą ciąg liczb różniących się o 1,
można zainicjować pierwszą z nich, a następne inicjacje pominąć.
Przykład.
Enum DopuszczalneWartości
Alfa 'Pierwsza stała enumeracji ma wartość domyślną 0 (zero)
Beta 'Kolejna ma wartość o jeden większą - 1
Delta = 13
Epsilon 'Kolejna ma wartość o 1 większą - 14
Fi 'Kolejna ma wartość o 1 większą - 15
End Enum
Jeśli programista chce wykorzystać funkcję środowiska polegającą na śledzeniu poprawności
używanych typów, to może jawnie wskazać typ elementów enumeracji specyfikując go po nazwie
enumeracji. Zakładając np., że wartości ograniczeń prędkości w Polsce są liczbami nieujemnymi,
a ponadto największa z nich nie przekracza 255, można zdefiniować enumerację OgraniczeniaPręd-
kości o elementach typu Byte, której niepełną wersję przedstawia poniższy przykład:
Enum OgraniczeniaPrędkości As Byte
StrefaZamieszkania = 20
TerenZabudowany = 50
TerenZabudowanyNocą = 60
'itd.
End Enum
W chwili wykorzystania stałych takiej enumeracji środowisko dokonuje kontroli poprawności
użytego typu i jeśli typy nie są zgodne, zgłasza wystąpienie błędu.
Enumeracja działa w języku Visual Basic 2010 tak, jak typ. Możliwe jest definiowanie zmiennych
typu enumeracji.
Przykład.
Dim Temperatura As Woda
Edytor wspomaga programistę w trakcie programowania przypisań do takiej zmiennej wyświe-
tlając listę elementów enumeracji. Ponadto przy próbie przypisania wartości, które nie należą do enu-
meracji, środowisko zgłasza błąd. Taka funkcja Visual Studio 2010 może uchronić programistę przed
błędami logicznymi.
Współcześnie stosuje się różnorodne programy wspierające pomoc medyczną i przedmedycz-
ną. Przykładowo, w celu określenia przytomności osoby poszkodowanej można użyć prostego sche-
matu AVPU
. W myśl jego zasad, osoba która jest nieprzytomna i nie reaguje na żadne bodźce, jest
w stanie U (od ang. Unresponsive – ten, który nie odpowiada). Jeśli osoba reaguje na bodźce bólo-
we, to jest w stanie P (od ang. Pain – ból). Reakcje na polecenia głosowe określa litera V (Verbal –
słowny). W końcu litera A określa stan przytomności i możliwości skupienia uwagi (ang. Alert – uwa-
ga). W kolejnym ćwiczeniu utworzona zostanie enumeracja grupująca opisane stany.
6 Opracowane na podstawie: http://pl.wikipedia.org/wiki/Skala_AVPU.
Ćwiczenie 57
Zadeklarować w dodanym do projektu module enumerację grupującą stany
przytomności według schematu AVPU.
1. Utwórz Projekt_057 aplikacji konsolowej.
2. Dodaj do projektu moduł o nazwie SkalaPrzytomności (wykorzystaj schemat wprowadzo-
ny w ćwiczeniu 18.).
3. Zadeklaruj wewnątrz modułu enumerację o nazwie AVPU.
4. Dodaj wewnątrz enumeracji stałe o nazwach: A, V, P, U.
5. Skompiluj projekt.
Moduł SkalaPrzytomności zawiera enumerację
AVPU
o stałych: A, V, P, U. Z własności enume-
racji wiadomo, że stała A ma wartość 0 (zero), a kolejne stałe mają wartość o jeden większą od po -
przedzającej: V – 1, P – 2, U – 3. Zmienna typu
AVPU
może przechowywać jedynie wartości wystę-
pujące w enumeracji. Zmienna taka może posłużyć jako zmienna sterująca pętlą. Kolejne ćwiczenie
polegać będzie na wyprowadzeniu do konsoli nazw stałych oraz ich wartości.
Ćwiczenie 58
Zaprogramować wyświetlenie za pomocą pętli nazw stałych enumeracji AVPU oraz ich
wartości.
1. Zadeklaruj w procedurze Main zmienną Stan typu AVPU.
2. Utwórz pętlę For ze zmienną sterującą Stan zmieniającą się od najmniejszej wartości
enumeracji AVPU – AVPU.A do największej wartości – AVPU.U.
Przykład.
For Stan = AVPU.A To AVPU.U
Next
3. Zaprogramuj w pętli wyprowadzenie do konsoli nazwy aktualnej wartości zmiennej Stan
oraz wartości liczbowej odpowiadającej tej zmiennej.
Przykład.
Console.WriteLine("{0} – {1}", Stan, CInt(Stan))
4. Sprawdź działanie aplikacji.
Aplikacja wyprowadza do konsoli litery odpowiadające danemu stanowi oraz, po myślniku, war-
tość stałej określonej daną literą. Należy zwrócić uwagę na fakt, że zastosowanie formatu "{0} –
{1}" zmusza programistę do konwersji CInt(Stan). Bez tej konwersji nie zostanie wyprowadzona
wartość stałej, a jedynie odpowiadająca jej litera. Jeśli programista nie zastosuje formatu, to będzie
zmuszony użyć funkcji zwracającej reprezentację łańcuchową zmiennej. Funkcja ta jest dostępna dla
każdej zmiennej i nosi nazwę ToString.
Przykład.
Console.WriteLine(Stan.ToString & " - " & Stan)
Efekt działania obu poniższych instrukcji jest identyczny.
Console.WriteLine("{0} - {1}", Stan, CInt(Stan))
Console.WriteLine(Stan.ToString & " - " & Stan)
Ponieważ wartości stałych zadeklarowanych w enumeracji
AVPU
są liczbami całkowitymi, to
mogą zostać wykorzystane jako indeksy tablicy. Zostanie to wykorzystane w kolejnym ćwiczeniu.
Ćwiczenie 59
Utworzyć tablicę opisów stanu przytomności. Wykorzystać zmienną typu AVPU do
indeksowania utworzonej tablicy.
1. Zadeklaruj w module Module1 tablicę o nazwie AVPUOpis typu tablica łańcuchów teksto-
wych i przypisz jej (na etapie deklarowania) zestaw czterech łańcuchów tekstowych opi-
sujących stan przytomności.
Przykład.
Dim AVPUOpis As String() = {"przytomny, skupia uwagę", _
"reaguje na polecenia głosowe", _
"reaguje na bodźce bólowe", _
"nieprzytomny, nie reaguje na żadne bodźce"}
2. Dodaj w pętli For instrukcję WriteLine konsoli wyprowadzającą tekst zawarty w komórce
tablicy AVPUOpis o indeksie odpowiadającym zmiennej Stan.
Przykład.
Console.WriteLine(AVPUOpis(Stan))
3. Sprawdź działanie aplikacji.
Aplikacja wyświetla opis stanu przytomności poniżej wartości literowej i liczbowej tego stanu.
Enumeracje są niezwykle pomocne podczas programowania, gdyż poprawiają czytelność kodu
źródłowego.