You are on page 1of 297

Metody i narzdzia

programowania

Metody i narzdzia
programowania
Pawe Lula, Jan Madej, Janusz Stal,
Ryszard Tadeusiewicz, Janusz Tuchowski

Komitet redakcyjny:
prof. dr hab. Tadeusz Grabiski, dr Lesaw Piecuch
Recenzent:
dr hab. in. Krzysztof Boryczko, prof. AGH
Redakcja naukowa:
Jan Madej
Zesp autorw:
Pawe Lula, Jan Madej, Janusz Stal,
Ryszard Tadeusiewicz, Janusz Tuchowski
Lider projektu:
Uniwersytet Ekonomiczny wKrakowie
ul. Rakowicka 27, 31-510 Krakw
tel.: +48 12 293 57 00 lub +48 12 293 52 00
faks: +48 12 293 50 10
www.uek.krakow.pl
Partner projektu:
Stowarzyszenie Edukacja dla Przedsibiorczoci
ul. Basztowa 23/5, 31-156 Krakw
tel.: +48 12 430 03 10
faks: +48 12 423 01 56
www.edp.org.pl
Copyright by Uniwersytet Ekonomiczny wKrakowie
Krakw 2012 r.
ISBN 978-83-63498-01-6
Publikacja bezpatna
Opracowanie wydawnicze, skad, amanie i projekt okadki
na zlecenie Uniwersytetu Ekonomicznego w Krakowie
Studio R.C.
Wydawnictwo przygotowane wramach projektu Uruchomienie
unikatowego kierunku studiw Informatyka Stosowana odpowiedzi
na zapotrzebowanie rynku pracy jest wspfinansowane ze rodkw
Unii Europejskiej wramach Europejskiego Funduszu Spoecznego.

Spis treci
Wstp. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

Teoretyczne podstawy programowania R. Tadeusiewicz


1.1. Podstawy algorytmiki..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2. Historia algorytmw ikoncepcja rekurencji. .

. . . . . . . . . . . . . . . . . . . . . .

27

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

1.3. Koncepcja maszyny Turinga. .


1.4. Automat skoczony.

1.5. Automat ozmiennych stanach ukad sekwencyjny.

. . . . . . . . . . . . . .

32

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

1.6. Jzyki igramatyki formalne.


1.7. Automat igramatyki. .

1.8. Kilka uzupeniajcych uwag na temat gramatyk ijzykw.


1.9. Waciwoci maszyny Turinga..

. . . . . . . . .

41

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

1.10. Przykadowa budowa maszyny Turinga ijej dziaanie..


1.11. Literatura. .

17

. . . . . . . . . . . .

44

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

Praktyka programowania
imperatywno-strukturalnego J. Stal, J. Tuchowski
2.1. Paradygmaty programowania. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

2.2. Jzyk programowania Java. .


2.2.1. Tworzenie programu..

2.2.2. Kompilacja iuruchamianie programu. .

. . . . . . . . . . . . . . . . . . . . . . . .

53

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

2.2.3. rodowisko uruchomieniowe. .


2.2.4. Stosowane konwencje. .
2.2.5. Wejcie iwyjcie..

2.3. Typy danych, zmienne ioperatory.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

2.3.1. Typy danych. .


2.3.2. Literay. .

Stowarzyszenie Edukacja dla Przedsibiorczoci

6 Metody inarzdzia programowania


2.3.3. Stae izmienne..
2.3.4. Operatory. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

2.3.5. Konwersja irzutowanie typw. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

2.3.6. acuchy znakw. .


2.3.7. Tablice. .

2.3.8. Typ wyliczeniowy..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4. Sterowanie przebiegiem wykonania programu.


2.4.1. Blok instrukcji. .

. . . . . . . . . . . . . . . . . . .

70

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

2.4.2. Instrukcja warunkowa..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4.3. Instrukcja wielokrotnego wyboru..


2.4.5. Ptle okrelone..

71

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

2.4.4. Ptle nieokrelone..

2.4.6. Przerywanie dziaania instrukcji sterowania. .


2.5. Dekompozycja programu. .

. . . . . . . . . . . . . . . . . . .

82

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82

2.5.1. Zmienne typu prostego iklasowego..


2.5.2. Tworzenie iusuwanie obiektw. .

. . . . . . . . . . . . . . . . . . . . . . . . .

83

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

2.5.3. Tworzenie iwywoywanie metod..

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

2.5.4. Uycie klas bibliotecznych..


2.5.5. Klasy opakowujce. .
2.6. Pytania. .

69

Paradygmat programowania obiektowego

J. Stal, J. Tuchowski

3.1. Podstawowe zagadnienia. .


3.1.1. Definicja klasy..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

101

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

101

3.1.2.Tworzenie obiektw..
3.1.3. Skadowe klasy..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

104

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

106

3.2. Kompozycja idziedziczenie.


3.2.1. Kompozycja. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

114

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

114

3.2.2. Dziedziczenie. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Uniwersytet Ekonomiczny w Krakowie

117

Spis treci 7
3.2.3. Polimorfizm.
3.2.4. Pakiety. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

120

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

122

3.2.5. Pojcia dodatkowe. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3. Interfejsy iklasy abstrakcyjne..


3.3.1. Interfejsy. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

125

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

125

3.3.2. Klasy imetody abstrakcyjne.


3.3.3. Klasy imetody finalne..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

131

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

132

3.4. Strumienie, pliki iobsuga bdw. .


3.4.1. Wyjtki iich struktura. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

134

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

134

3.4.2. Obsuga sytuacji wyjtkowych. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

137

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

140

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

144

3.4.3. Strumienie danych.


3.4.4. Pliki ikatalogi. .

3.5. Graficzny interfejs uytkownika..


3.5.1. Gwne okno aplikacji.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

146

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

146

3.5.2. Kontenery ikomponenty..


3.5.3. Obsuga zdarze. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

148

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

153

3.5.4. Elementy graficzne. .


3.6. Aplety. .

124

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

159

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

162

3.7. Pytania. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.8. Literatura. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

166
168

Programowanie urzdze mobilnych J. Stal, J. Tuchowski


4.1. Zasady tworzenia witryn mobilnych..
4.1.1. Definicja oraz zawarto strony.

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

173

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

175

4.1.2. Tworzenie nawigacji iodnonikw.

. . . . . . . . . . . . . . . . . . . . . . . . . .

178

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

179

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

179

4.1.3. Interakcja zuytkownikiem. .


4.1.4. Testowanie witryny. .

4.2. Wprowadzenie do tworzenia aplikacji mobilnych.


4.3. Interfejs uytkownika. .

. . . . . . . . . . . . . . . .

180

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

185

4.3.1. Interfejs wysokopoziomowy. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

185

Stowarzyszenie Edukacja dla Przedsibiorczoci

8 Metody inarzdzia programowania


4.3.2. Graficzny interfejs uytkownika.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4. 3.3. Jednolity interfejs uytkownika. .


4.4. Metody komunikacji zotoczeniem..

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

200

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

204

4.4.1. Nawizywanie izamykanie pocze.


4.4.2. Wielowtkowo. .

. . . . . . . . . . . . . . . . . . . . . . . .

205

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

206

4.4.3. Praktyczna realizacja komunikacji..

. . . . . . . . . . . . . . . . . . . . . . . . . . .

4.4.4. Wysyanie iodbir wiadomoci tekstowych oraz binarnych..

210

. . . . . . . . . . . . .

212

. . . . . . . . . . . . . . . . . . . . . . . . . . .

214

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

217

4.4.6. Programowy odbir wiadomoci..


4.5.1. Record Management System. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.5.2. Praktyczne wykorzystanie moliwoci RMS. .


4.6. Pytania. .

207

. . . .

4.4.5. Wysyanie iodbir wiadomoci multimedialnych..


4.5. Zapis iodczyt danych. .

194

218

. . . . . . . . . . . . . . . . . .

221

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

224

4.7. Literatura. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

225

Algorytmy istruktury danych P. Lula


5.1. Zoono algorytmw..
5.1.1 . Klasy zoonoci.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

229

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

229

5.1.2. Okrelanie zoonoci obliczeniowej algorytmu. .

. . . . . . . . . . . . . .

232

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

234

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

243

5.2. Rekurencja ijej zastosowania..


5.3. Algorytmy tablicowe..

5.3.1. Inwersja elementw wwektorze. .


5.3.2. Sito Eratostenesa. .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

243

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

245

5.3.3. Sortowanie przez wybieranie. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

247

5.3.4. Sortowanie przez wstawianie. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

247

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

248

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

249

5.3.5. Sortowanie bbelkowe.


5.3.6. Sortowanie szybkie..

5.3.7. Sortowanie przez czenie. .


5.4. Algorytmy kombinatoryczne. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

252

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

254

5.4.1. Kombinacje bez powtrze.


Uniwersytet Ekonomiczny w Krakowie

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

254

Spis treci 9
5.4.2. Permutacje bez powtrze. .
5.5. Struktury dynamiczne.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

256

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

257

5.5.1. Zbiory iich implementacja. .


5.5.2. Struktury listowe. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

258

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

267

5.5.3. Tablica asocjacyjna.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

275

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

280

5.5.5. Grafy..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

288

5.6. Literatura. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

291

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

292

5.5.4. Drzewa.

SPIS TABEL

SPIS RYSUNKW

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

292

Stowarzyszenie Edukacja dla Przedsibiorczoci

Wstp
Od pocztku powstania komputerw (czy szerzej maszyn liczcych) ich twrcom przywieca cel rozwizania lub przypieszenia procesw, ktrych tradycyjna realizacja trwaaby owiele duej lub wymagaa zaangaowania znacznych
zasobw. Jednak aby byo to moliwe, najpierw musiaa pojawi si myl, e da
si to zrobi. Od tej myli naleao przej do pomysu jak to zrobi (algorytm).
Pomys trzeba byo zapisa wpostaci moliwej do przetworzenia na rozkazy dla
komputera (kod rdowy wjzyku programowania), anastpnie przetumaczy
go na zestaw instrukcji maszynowych, ktre komputer potrafi wykona (posta
wykonywalna programu). Niestety proces ten chocia powyej zosta przedstawiony wtrzech zdaniach nie jest prosty. Kady zetapw wymaga odpowiedniej
wiedzy iumiejtnoci.
Podrcznik Metody inarzdzia programowania, ktry oddajemy do rk Czytelnikw jest prb zbiorczego spojrzenia na proces tworzenia programw komputerowych. Na rynku dostpnych jest wiele publikacji opisujcych algorytmy,
struktury danych ijzyki programowania, ale zamierzeniem autorw byo przedstawienie wjednym podrczniku pewnej caoci: od historii algorytmw, poprzez
ich omwienie, do programowania obiektowego ioprogramowywania urzdze
mobilnych. Takie podejcie do problemu nie byo jednak proste. Spord bogactwa zagadnie dotyczcych tworzenia algorytmw, budowania iwykorzystywania
struktur danych oraz pisania programw, autorzy musieli wybra te, ktrych znajomo jest niezbdna do zrozumienia caoci, azarazem pozwala zdoby wiedz
wystarczajc do skutecznego programowania.
Podrcznik skada si zpiciu rozdziaw. Pierwszy rozdzia pt. Teoretyczne
podstawy programowania zawiera podstawowe informacje dotyczce algorytmiki.
Zamieszczone s wnim najwaniejsze definicje, krtka historia algorytmw oraz
ich wasnoci imetody notacji. Nastpnie przedstawiona jest koncepcja maszyny
Turinga maszyny, ktra jest abstrakcyjnym modelem procesu obliczeniowego.
Wrozdziale omwione s take zagadnienia zwizane zjzykami igramatykami
formalnymi. Na zakoczenie zaprezentowana jest budowa idziaanie przykadowej maszyny Turinga.
Poniewa jako narzdzie do ilustracji zagadnie prezentowanych wdalszej
czci podrcznika posuy jzyk programowania Java Standard Edition, dlatego
pocztek drugiego rozdziau pt. Praktyka programowania imperatywno-strukturalnego powicony jest omwieniu rodowiska pracy oraz zasad przygotowywania aplikacji wtym jzyku. Czytelnik ma moliwo zapoznania si zpodStowarzyszenie Edukacja dla Przedsibiorczoci

12 Wstp
stawowymi pojciami, zestawem narzdzi oraz wytycznymi odnonie tworzenia
programu (jego pisania, kompilacji iuruchamiania) zwykorzystaniem rodowiska IDEiwiersza polece. Wdalszej czci rozdziau omwione s zagadnienia
zwizane zdefinicj typw danych, deklaracj zmiennych istaych oraz wykonywaniem operacji przy uyciu dostpnego zbioru operatorw. Wpodrozdziale
powiconym sterowaniu przebiegiem programu, zostay pokazane moliwoci
wielokrotnego wykonania instrukcji programu oraz omwione kwestie dotyczce
warunkowego wykonania iprzerywania bloku instrukcji zawartego wprogramie.
Rozdzia trzeci pt. Paradygmat programowania obiektowego porusza zagadnienia stanowice podstaw programowania wkadym jzyku obiektowym. Zawiera
definicje klasy, omwienie obiektw imetod oraz prezentuje zasady ich tworzenia. Jako narzdzie wspomagajce ilustracj prezentowanych zagadniew dalszym cigu wykorzystany jest jzyk Java SE. Na jego przykadzie omwione
s m.in. zmienne typu prostego, zmienne typu klasowego, tworzenie iusuwanie
obiektw, tworzenie iwywoywanie metod, modyfikatory dostpu iprzecianie
metod, uywanie klas bibliotecznych. Wdalszej czci rozdziau przedstawione
s te cechy jzyka, ktre charakteryzuj programowanie obiektowe omwione jest wszczeglnoci dziedziczenie, polimorfizm ienkapsulacja. Wkolejnych
podrozdziaach poruszone s zagadnienia dotyczce tworzenia klas abstrakcyjnych iwykorzystania interfejsw oraz komunikacji aplikacji zotoczeniem (operacje wejcia-wyjcia iobsuga bdw). Na koniec rozdziau przedstawione s
zagadnienia odnoszce si do tworzenia graficznego interfejsu uytkownika.
Rozdzia czwarty pt. Programowanie urzdze mobilnych zosta zainspirowany obserwacj zjawisk, ktre zachodz wnaszym yciu codziennym. Na przestrzeni ostatnich lat jestemy wiadkami byskawicznego rozwoju technologii
bezprzewodowego dostpu do Internetu. Stwarza to nowe moliwoci zarwno
wsferze rozrywki, jakiwprowadzeniu dziaalnoci biznesowej. Naley jednak
pamita, i wraz zrozwojem infrastruktury mobilnej konieczne jest opracowanie
iwykonanie odpowiednich aplikacji czsto rnicych si od normalnych programw komputerowych. Rozdzia zawiera informacje dotyczce zasad tworzenia
aplikacji wrodowisku Java Micro Edition. Jest wnim scharakteryzowany nisko
iwysoko poziomowy interfejs uytkownika majcy zasadniczy wpyw na ksztat
tworzonych aplikacji.
Na pocztku rozdziau pitego pt. Algorytmy istruktury danych omwiona
jest zoono obliczeniowa algorytmw. Nastpnie zaprezentowana jest rekurencja jeden zwaniejszych mechanizmw stosowanych wprogramowaniu,
azarazem stwarzajcy due problemy pocztkujcym programistom. Po przedstawieniu definicji iomwieniu jej stosowania, zaprezentowane s wybrane algorytmy rekurencyjne (wyznaczanie liczb Fibonacciego, wyznaczanie silni, wiee
Hanoi).Wdalszej czci rozdziau przedstawione s tablice jedno- iwielowymiaUniwersytet Ekonomiczny wKrakowie

Wstp 13
rowe oraz scharakteryzowane najwaniejsze grupy algorytmw operujcych na
tego typu strukturach (m.in. algorytmy sortowania ialgorytmy wyznaczanie kombinacjii permutacji). Na zakoczenie rozdziau zaprezentowane s dynamiczne
struktury danych, takie jak stosy, kolejki, zbiory, listy, tablice asocjacyjne, drzewa
igrafy.
Majc wiadomo braku wielu zagadnie, ktre ze wzgldu na ograniczon
objto podrcznika musiay zosta pominite, mamy nadziej, e publikacja
ta okae si pomocna przy nauce programowania oraz pozwoli zrozumie zasady
tworzenia algorytmw przydatnych do rozwizania wielu problemw.

Stowarzyszenie Edukacja dla Przedsibiorczoci

1
Teoretyczne

podstawy
programowania
Ryszard Tadeusiewicz
Stowarzyszenie Edukacja dla Przedsibiorczoci

1.1. Podstawy algorytmiki


Proces programowania zawiera dwie komponenty. Pierwsza znich polega na
opracowaniu algorytmu to znaczy na stworzeniu metody rozwizania postawionego problemu ito takiej metody, ktr moe posuy si komputer. Druga
komponenta polega na opisaniu tego algorytmu wwybranym jzyku programowania, zaprojektowaniu struktur danych, ktre maj by uyte, znalezieniu
odpowiednich bibliotek gotowych podprogramw albo klas, ktre mona wbudowa do tworzonego programu, wykonaniu kompilacji, konsolidacji, implementacji, uruchamiania (debuggingu1 itestowania) programu iwreszcie oddaniu
go do eksploatacji wraz zodpowiednim przeszkoleniem uytkownika, ktry go
bdzie wykorzystywa.
Niniejszy podrozdzia powicony jest pierwszemu zwymienionych skadnikw. Dokadniej rozdzia powicony jest prezentacji podstawowych informacji
dotyczcych algorytmiki, dziedziny wiedzy oalgorytmach iich oglnych waciwociach. Podrozdzia ten stanowi teoretyczne wprowadzenie do zagadnie szczegowych, ktre Czytelnik znajdzie wrozdziale Algorytmy istruktury danych, gdzie
do przedstawionej tu teorii dodane bd zagadnienia praktyczne, stanowice podstaw profesjonalnego dziaania programisty tworzcego okrelony program. Zanim jednak zaczniemy mwi oalgorytmice, tak jak j zdefiniowano midzy inny1

Termin debugging zastpowany niekiedy wjzyku polskim terminem odpluskwianie


albo odrobaczanie oznacza wyszukiwanie iusuwanie technicznych bdw, ktre praktycznie zawsze wystpuj wnowo napisanym kodzie programu. Od testowania programu
debugging rni si poziomem szczegowoci kontroli programu. Na etapie testowania
sprawdza si, jak dziaanie programu postrzega czowiek, ktry korzysta zjego usug. Na
etapie debuggingu sprawdza si, jak dziaanie programu postrzega komputer, ktry ma wykonywa wszystkie przewidziane wprogramie czynnoci. Debugging poprzedza testowanie, poniewa zanim si pokae dziaanie programu uytkownikowi, ktry ma je oceni
iwyrazi ewentualne yczenia poprawek trzeba sprawi, eby program wogle dziaa, co
wbrew pozorom nie zawsze jest takie oczywiste. Debugging wykrywa wic iusuwa wszelkie
zacicia techniczne, ktre utrudniaj dziaanie programu na jego najbardziej podstawowym,
technicznym poziomie. Do tego celu uywa si zwykle specjalnych programw (debuggerw), ktre stanowi swoiste robocze opakowanie dla uruchamianego programu, pozwalajc na jego bezpieczne uruchomienie nawet wprzypadku, gdy program zawiera bdy, ktre
mogyby mie katastrofalne skutki dla komputera, atake umoliwia dokadn obserwacj
ikontrol jego dziaania wraz zmoliwoci wykonywania badanego programu krok po
kroku. Podczas debuggingu zachodzi zwykle konieczno umieszczania specjalnych puapek wbadanym programie, atake podgldania zmian wartoci okrelonych zmiennych
oraz stanu okrelonych elementw technicznych komputera (zawartoci rejestrw mikroprocesora, sygnaw przesyanych na magistrali, komunikatw nadchodzcych zurzdze
peryferyjnych itp.).
Stowarzyszenie Edukacja dla Przedsibiorczoci

18 Metody inarzdzia programowania


mi wklasycznej ksice (Harel, 1992), musimy sprbowa przynajmniej wstpnie
okreli, co to jest algorytm. Podkrelamy wtym miejscu ina tym etapie bdzie
to jedynie okrelenie wstpne, bdce wistocie jedynie zapowiedzi tego, co bdzie
obszerniej omwione wrozdziale Algorytmy istruktury danych.
Na uytek rozwaa prowadzonych tu iteraz zadowolimy si okreleniem,
ktre zostao przytoczone wskrypcie Akademii Ekonomicznej (poprzedniczki
dzisiejszego Uniwersytety Ekonomicznego) wydanym w1974 roku (Kulik, Tadeusiewicz, 1974):
() algorytm jest zbiorem opisw prostych krokw icisych regu ich wykonywania.

Biorc pod uwag zastosowania wtechnice obliczeniowej2, wtym samym podrczniku (wydanymw1974 roku!) sprecyzowano ten zapis (str. 234), piszc:
() algorytm jest cisym przepisem okrelajcym proces obliczeniowy iprowadzcym od wykazujcych zmienno danych wejciowych do poszukiwanego
wyniku.

Jednak biorc pod uwag przytoczon dalej (wtej samej ksice) oglniejsz definicj, okrelajc algorytm jako:
() zbir regu, instrukcji, opisw kolejnych czynnoci lub ogranicze, ktre
okrelaj porzdek wykonywania poszczeglnych operacji wcelu otrzymania
pewnego wyniku.

stwierdzono tame, i:
() mona traktowa jako algorytm zarwno wzr matematyczny, recept produkcyjn lub instrukcj obsugi jakiego sprztu, jak ina przykad program rozwoju organizmu zawarty wkodzie genetycznym3.

Jak wynika zprzywoanych wyej definicji iokrele do dawno sformuowanych, ale wci aktualnych algorytm jest przepisem postpowania, ktre
powinno doprowadzi do uzyskania jakiego okrelonego celu. Jednak nie kady
przepis moemy nazwa algorytmem. Aby mona byo mwi oalgorytmie, przepis musi spenia cztery wymagania (Tadeusiewicz, 1998).
Pierwszym jest wymaganie jednoznacznoci. Wymaganie to wynika zfaktu,
e moemy uywa rnych sposobw definiowania algorytmw irnych metod
Okrelenie Informatyka jeszcze wtamtych czasach nie istniao, wic mwio siotechnice
obliczeniowej.

Byo to pisane dokadnie trzydzieci lat przed odczytaniem kodu genetycznego rnych organizmw, wtym czowieka.

Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 19


ich wyraania. Przykady tych sposobw bd obszernie przedstawiane wdalszej
treci tego skryptu, poniewa rne jzyki programowania s wanie rnymi
metodami wyraania algorytmw. Jednak musimy zagwarantowa, e niezalenie
od tego, kto lub co bdzie wykonawc algorytmu (to znaczy niezalenie od tego,
czy algorytm bdzie kierowa postpowaniem czowieka, czy dziaaniem ukadw elektronicznych komputera) wynik dziaania musi by dokadnie taki sam.
Oznacza to, e opis czynnoci, jakie bd wykonywane podczas realizacji algorytmu, nie moe zawiera adnych niedomwie czy elementw domylnych (bo to
si rozumie samo przez si). Rwnie zasady okrelajce kolejno wykonywania tych czynnoci atake warunki ewentualnej zmiany tej kolejnoci musz by
okrelone wsposb nie pozostawiajcy adnych moliwoci dowolnych interpretacji czy woluntarystycznych decyzji. Wykonawca algorytmu musi bywsytuacji
przypominajcej tramwaj na szynach, anie samochd, ktry poda do celu, swobodnie wybierajc tras swego ruchu.
Rozwamy przykad. Jeli mamy regu mwic, e studentowi naley
przyzna stypendium za wyniki wnauce, gdy rednia ocen zpoprzedniego
roku akademickiego jest wiksza lub rwna 4,8 to dziaa tu sztywny algorytm. Niezalenie od tego, kto bdzie podejmowa decyzj, ci ktrzy speniaj okrelony warunek, stypendium otrzymaj, za ci, ktrzy warunku nie speniaj, nie maj szans na pozytywn decyzj, bo sformuowane kryterium jest
jednoznaczne (Rys. 1)

Rys. 1. Jednoznaczno kryterium gwarantuje sprawiedliwy


przydzia stypendiw

Jeli natomiast wyobrazilibymy sobie sytuacj (abstrakcyjn, bo nikt nigdy


tego tak nie robi ale wyobrazi sobie co takiego mona), e stypendia socjalne
przyznaje si woparciu ooglnikowe iniejednoznaczne kryterium, i naley je
Stowarzyszenie Edukacja dla Przedsibiorczoci

20 Metody inarzdzia programowania


przyznawa studentom zniezamonych rodzin, to oprzewidywalnoci decyzji nie
ma mowy. Wtakim przypadku wysoce prawdopodobne jest, e zdwch studentw, bdcych dokadnie wtakiej samej sytuacji materialnej, jeden stypendium
otrzyma, adrugi nie (Rys. 2). Oczywicie taki sposb rozdzielania wiadcze nie
ma nic wsplnego zalgorytmem!

Rys. 2. Brak jednoznacznoci kryteriw prowadzi do krzywdzcych decyzji

Drugie wymaganie wie si zdyskretnym charakterem algorytmu. Wieloznaczne sowo dyskretny naley wtym kontekcie traktowa jako przeciwiestwo okrelenia cigy, anie jako przeciwiestwo sowa jawny. Przepis dziaania moe pretendowa do tego, by by algorytmem, jeli opisuje wymagane
dziaania wformie sekwencji kolejno wykonywanych elementarnych krokw.
Przez elementarny krok rozumiemy tu czynno tak prost, e jej wykonanie
nie wymaga adnych dodatkowych objanie. Tworzc algorytm, musimy wic
wybra, ktre zelementarnych czynnoci maj by wykonane, wjakiej kolejnoci, przy jakich warunkach naley wybra te, anie inne czynnoci, ale samych
czynnoci jako takich objania nie trzeba. Jak si niektre znich wskae iwybierze, to dokadnie wiadomo, co naley zrobi.
Dyskretny charakter algorytmu wniektrych przypadkach moe pozostawawsprzecznoci zcig natur wiata, wktrym yjemy. Rozwamy bardzo
prosty przykad. Wyobramy sobie naczynie zdziurk przy dnie napenione wod
(lub innym pynem) Rys. 3.
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 21

Rys. 3. Obiekt, na przykadzie ktrego dyskutowana jest rnica midzy


cig rzeczywistoci idyskretnym opisem algorytmicznym

Pocztkowo dziurka jest zatkana ipoziom wody wnaczyniu wynosi H0. Gdy
dziurka zostanie odetkana, woda zacznie wypywa ijej poziom wnaczyniu bdzie opada. Poniewa woda wypywa pod wpywem cinienia wywieranego przez
sup wody wnaczyniu, szybko jej wypywania jest proporcjonalna do tego cinienia, acinienie jest proporcjonalne do poziomu wody H.
Wypywanie wody powoduje, e poziom H maleje. Szybko z jak obnia
si, wyraana pochodn dH/dt, jest proporcjonalna do H. Mona wic napisa
rwnanie:

(1)

wyraajce t zaleno, wktrym k oznacza wspczynnik szybkoci wypywu


wody (jest tym wiksze, im wikszy jest otwr, przez ktry woda wypywa). Rozwizanie rwnania (1), pokazujce jak poziom wody wnaczyniu bdzie si zmienia wczasie, jest znane ima posta:

(2)

Jest to funkcja ciga, ktrej wykres zosta przedstawiony na rysunku 4. Przebieg tej funkcji przedstawia wiernie sytuacj znan zcodziennego dowiadczenia:
poziomwnaczyniu opada, przy czym spadek ten jest pocztkowo szybki, apotem
wmiar ubywania wody, coraz mniejszy.
Stowarzyszenie Edukacja dla Przedsibiorczoci

22 Metody inarzdzia programowania

Rys. 4. Przebieg rzeczywistego procesu wobiekcie zrysunku 3.


jest zsamej swojej natury cigy

Przebieg rzeczywistego procesu jest zsamej swojej natury cigy, to znaczywkadej chwili czasowej t moliwe jest podanie konkretnej wartoci poziomu
wody H(t).
Gdybymy jednak chcieli opisa ten proces wformie algorytmu (na przykad
po to, eby komputer symulowa wypyw wody), to nie wolno by nam byo odwoa si do jakiegokolwiek procesu cigego wszystko musiaoby si odbywa wsposb dyskretny. Konieczne wic byoby wprowadzenie dyskretnej skali
czasu. Zamiast zmiennej cigej t, reprezentujcej ten parametr wfizyce, musimy
wprowadzi dyskretne numery chwil czasowych n, odlegych od siebie opewien
skoczony krok czasowy (odstp czasu) , idyskretne wartoci interesujcej nas
zmiennej (poziomu wody) H(n)wtych wanie branych pod uwag chwilach czasowych. Ustalamy, e rozwaa bdziemy chwile czasowe zpewnego ustalonego
przedziau: n = 1, 2, , N. Dodatkowo umawiamy si, e znak = wzapisie
algorytmu nie oznacza rwnoci wsensie matematycznym, tylko nakazuje obliczenie wartoci wystpujcej po prawej stronie tego znaku inadanie tej wartoci
zmiennej znajdujcej si po lewej jego stronie. Schemat takiej czynnoci (oglnie
znanej winformatyce jako tzw. instrukcja podstawienia) jest nastpujcy:
zmienna_ktrej_bdzie_nadana_ warto = formua_obliczajca_warto
Uniwersytet Ekonomiczny w Krakowie

(3)

Teoretyczne podstawy programowania 23


Warto uwanie przyjrze si podanemu wyej schematowi, bo jego dokadne
zrozumienie ustrzee nas przed zdziwieniem towarzyszcym ogldaniu zapisu:
n = n +1

(4)

Gdyby powyszy zapis traktowa jako rwnanie matematyczne to byaby


to sprzeczno, bo niezalenie od tego, co bymy chcieli podstawi jako aktualn
warto zmiennej n, nigdy nie uda si sprawi, by owa warto bya rwna
samej sobie powikszonej ojeden!
Jeli jednak uwzgldnimy interpretacj podan formu (3), to zapis podany
we wzorze (4) staje si jasny: po prostu naley wzi poprzedni (dotychczasow)
warto zmiennej n inaley ja zwikszy o1, za to, co wyjdzie, naley dalej wykorzystywa jako now warto zmiennej n.
Po tych wyjanieniach moemy ju poda algorytm, ktrym moglibymy si
posuy. Wygldaby on nastpujco:
1. Ustaw n = 1 oraz H(n) = H(1) = H0.
2. Oblicz spadek poziomu wodyU(n), spowodowany t wod, ktra wypynie
znaczynia wcigu odstpu czasu pomidzy chwil czasow n achwil czasow n+1. Ten ubytekU(n) moemy wyliczy ze wzoru:
U(n) = H(n) k
3. Oblicz poziom wody wchwili n+1, odejmujc od poziomu H(n) spadek poziomuU(n), jaki nastpi pomidzy chwil czasow n achwil czasow n+1.
Korzystamy przy tym ze wzoru:
H(n+1) = H(n) U(n)
4. Zmieniamy numer rozwaanej chwili czasowej, to znaczy warto zmiennej
n zwikszamy ojeden:
n = n +1
5. Jeli n < N to powtarzamy powysze czynnoci, poczynajc od punktu2.
6. Do tego punktu docieramy, gdy n osignie zaoon warto N. Oznacza to
zakoczenie oblicze izatrzymanie algorytmu.
Wnastpstwie wykonania tego algorytmu moemy uzyska seri dyskretnych
wartoci, podajcych poziom wody wnaczyniu wwybranych dyskretnych momentach czasu (Rys. 5), co jednak rni si dosy istotnie od przebiegu cigego
ilustrujcego rzeczywisty przebieg zjawiska (por. Rys. 4).

Stowarzyszenie Edukacja dla Przedsibiorczoci

24 Metody inarzdzia programowania

Rys. 5. Zbir dyskretnych wartoci przybliajcych zwykorzystaniem


algorytmu przebieg procesu oprniania naczynia

Dyskretny charakter algorytmu nie musi by istotn przeszkod przy uzyskiwaniu uytecznych praktycznie wynikw. Interpolujc dyskretne punkty uzyskane przy pomocy algorytmicznej symulacji, moemy uzyska przebieg (pokazany
lini przerywan na rysunku 6), ktry cakiem dobrze aproksymuje cig rzeczywisto. Niemniej to fundamentalne rozrnienie pomidzy cigym (Rys.
4)idyskretnym (Rys. 5) obrazem tych samych zjawisk iprocesw musi towarzyszy kadej prbie odwoania si do algorytmu.

Rys. 6. Odtwarzanie aproksymacji przebiegu cigego


zserii dyskretnych wartoci za pomoc interpolacji
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 25


Trzecie wymaganie, ktre musi speni przepis, eby mg by uznany za algorytm, dotyczy jego finistycznego charakteru. Finistycznego to znaczy gwarantujcego zakoczenie realizacji przepisu po wykonaniu skoczonej liczby krokw.
Przykadowo finistyczno omawianego wpoprzednim punkcie algorytmu zagwarantowana bya poprzez podanie maksymalnej wartoci zmiennej n (numeru kroku),
ktrej osignicie (lub przekroczenie) powodowao zatrzymanie oblicza. Owa graniczna liczba krokw, jak trzeba wykona, eby zakoczy dziaanie algorytmu,
moe by woglnym przypadku niemoliwa do konkretnego okrelenia. Co wicej,wprzypadku wielu algorytmw moe by konieczne wykonanie naprawd bardzo duej liczby krokw, zanim algorytm zakoczy dziaanie. Jednak algorytm musi
by tak zbudowany, by wykluczy moliwo, e kolejne kroki bd wykonywane
bez koca. Pojawienie si takiej sytuacji, e algorytm liczyi liczy, iliczy inie
moe skoczy, jest zawsze zwizane zbdn budow algorytmu, ataka sytuacja
nigdy nie koczcych si czynnoci nazywana jest zaptleniem si algorytmu. artobliwy obraz pokazujcy, co grozi informatykowi na skutek czekania na wynik
oblicze po zaptlenia si algorytmu, przedstawia rysunek 7. Jest to oczywicie art,
ale pokazuje on dobitnie, dlaczego uwaamy, e dobry algorytm nie ma prawa si
zaptli, niezalenie od tego, co si bdzie dziao.

Rys. 7. artobliwy komentarz na temat skutkw


braku finistycznoci algorytmu
rdo: http://1.bp.blogspot.com/__vUx979RBaY/TKT1gMAe_hI/AAAAAAAAAjs/
zK-JP5aFy_I/s1600/dead-at-computer.jpg (dostp 2011-04-14)

Warto przy tym zda sobie spraw zjednej wanej okolicznoci. Ot cel, ktry postawiono przed algorytmem, moe by niekiedy nieosigalny. Twrca algoStowarzyszenie Edukacja dla Przedsibiorczoci

26 Metody inarzdzia programowania


rytmu musi wic by przygotowany zarwno na sukces, jak ina niepowodzenie.
Jeli sukces zostanie osignity, to sam fakt uzyskania podanego kocowego
rezultatu zatrzymuje kady poprawnie zbudowany algorytm, bo woczywisty sposb nie ma potrzeby wykonywania dalszych dziaa, skoro rozwizanie zostao
znalezione. Gorzej zprzypadkiem niepowodzenia.
Otym, e rozwizanie jest nieosigalne, czasem mona si przekona do
szybko po sprawdzeniu walgorytmie jakiego kryterium. Przy rozwizywaniu
rwnania kwadratowego opostaci:
ax2 + b x + c = 0

(5)

wprzypadku stwierdzenia, e wyrnik rwnania jest ujemny


b2 4 ac < 0

(6)

wiadomo, e nie istniej rozwizania tego rwnania wdziedzinie liczb rzeczywistych. (Rozwizaniem s pierwiastki zespolone sprzone, ale nie zawsze takie
rozwizanie akceptujemy). Zatem sprawdzenie znaku wyrnika pozwala przerwa dziaanie algorytmu zsygnaem niepowodzenia ialgorytm nadal jest finistyczny, chocia nie dostarcza podanych rozwiza.
Czciej jednak niepowodzenie przejawia si tym, e wykonawca algorytmu
(powiedzmy, e jest to komputer) ponawia iponawia prby znalezienia rozwizania,askutek jest wci negatywny. Na tak okoliczno wstrukturze algorytmu
musi by wbudowany hamulec bezpieczestwa, ktry zadziaa gdy zawiod
wszystkie inne metody zakoczenia pracy. Algorytm wtedy zatrzyma si awaryjnie, sygnalizujc niepowodzenie, nie popadnie jednakwfatalne zaptlenie.
Ostatnim wymaganiem, jakie stawiamy, gdy chcemy sprawi, eby pewien
przepis dziaania mona byo uzna za algorytm to wymaganie oglnoci. Algorytm powinien pozwala rozwiza pewn klas problemw albo osign pewn
grup celw, anie jeden problem czy jeden cel. Najatwiej bdzie to wytumaczy
na przykadzie. Podany niej wzr matematyczny spenia trzy zczterech warunkw, jakie wi si zpojciem algorytmu:
X = 2 + 3

(7)

Wzr ten jest jednoznaczny (niezalenie od tego, kto si nim posuy, zawsze
dostanie taki sam wynik), nastpnie jest dyskretny (konieczne jest wykonanie
dwch elementarnych krokw: dodanie dwch liczb iprzypisanie wyniku jako
wartoci zmiennej X), atake jest finistyczny (zpewnoci wynik uzyskamy po
upywie skoczonego czasu).
Jednak ten wzr nie moe by zaakceptowany jako algorytm, bo rozwizuje on
tylko jeden, zgry zadany problem. Cokolwiek bymy nie robili, skutek zawsze
bdzie taki sam: zmienna X bdzie miaa nadan warto 5.
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 27


Natomiast bardzo podobny do wzoru (7) zapis:
X = A+ B

(8)

jest ju algorytmem wcaym tego sowa znaczeniu, poniewa przy jego pomocy
mona rozwiza ca KLAS zada odpowiednio podstawiajc rne wartoci
za zmienneAiB.

1.2. Historia algorytmw ikoncepcja rekurencji


Podobnie jak wiele innych osigni cywilizacyjnych ikulturowych algorytmy
zostay odkryte wstaroytnej Grecji, za do Europy trafiy ponownie po okresie
Mrokw redniowiecza za spraw uczonych arabskich.
Wrd matematykw greckich najbardziej znanym pomysodawc itwrc
algorytmw jest Euklides. Co prawda niektrzy historycy twierdz, e rzeczywistym twrc koncepcji algorytmu by Eudoksos zKnidos, ale wwikszoci
ksiek na temat algorytmiki (Harel, 1992) przyjo si wiza t koncepcj wanie zpracami Euklidesa. Jego nazwisko wgreckim oryginale pisane byo jako
, co warto przytoczy na wypadek, gdyby ktozCzytelnikw chcia
je umieci gdzie wwidocznym miejscu na swoim pulpicie. Awarto, bo temu
czowiekowi powinno si stawia pomniki za jego wiekopomne dziea. Opisany
przez niegowdziele zatytuowanym Elementy (woryginale , Stoicheia)
algorytm poszukiwania najwikszego wsplnego podzielnika dwch, liczb jest
przytaczany od ponad dwch tysicy lat jako przykad wrcz wzorcowego algorytmicznego rozwizania naprawd niebanalnego problemu.
Algorytm ten odwouje si do rekurencji, co jest naprawd budzcym szacunek osigniciem jego Autora, bo rekurencja jest pojciem trudnym inawet
wspczesnym informatykom czasem sprawia kopoty.
Przypomnijmy, e rekurencja polega na tym, i rozwizujc przy pomocy algorytmu jaki problem, umieszczamy wrodku tego algorytmu odwoanie do tego
samego algorytmu traktowanego jako gotowa do uycia cz rozwizania.
Istot rekurencji bardzo dobrze przedstawia przywoany wWikipedii rysunek
pudeka kakao firmy Droste (Rys. 8). Na rysunku tym wida zakonnic niosc na tacy... kakao firmy Droste. Na tym niesionym przez zakonnic pudeku
znowu wida zakonnic, niosc na tacy kakao firmy Droste itd.Wteorii takich
zagniede mogoby by nieskoczenie duo, wpraktyce jednak niedoskonao poligrafii dosy szybko kadzie kres kolejnym wizerunkom zakonnicy
na pudeku.
Walgorytmie Euklidesa rekurencja odniesiona jest do zadania matematycznego, ktrego celem jest znalezienie najwikszego wsplnego podzielnika (NWD)
Stowarzyszenie Edukacja dla Przedsibiorczoci

28 Metody inarzdzia programowania


dwch liczb. Oznaczmy te dwie liczby odpowiednio Aoraz B, przy czym zakadamy, e A> B.
1. Dzielimy Aprzez B, przy czym interesuje nas jedynie reszta ztego dzielenia.
T reszt oznaczamy jako C.
2. Zastpujemy pozycj Aliczb B, apozycj B liczb C.
3. Jeeli pozycja B = 0, to szukane NWD =A, wprzeciwnym wypadku przejd
do 1.

Rys. 8. Rysunek wykorzystujcy zasad rekurencji. Objanienie wtekcie


rdo: http://upload.wikimedia.org/wikipedia/commons/6/62/Droste.jpg (dostp 2011-04-14)

Wokresie redniowiecza cay dorobek intelektualny staroytnoci (wszczeglnoci staroytnych grekw) poszed wzapomnienie. Wzwizku ztym koncepcja
algorytmu jako takiego,awszczeglnoci koncepcja algorytmu Euklidesa (bdcego zreszt jedynie przykadem), byaby nieznana gdyby nie Arabowie, ktrzy
przejli dziedzictwo hellenistyczne iprzez wiele wiekw je rozwijaliwizolacji
od prdw naukowych wystpujcych wEuropie.
Jeli idzie oalgorytmy, to szczegln zasug wich zachowaniu irozwoju
mia perski matematyk Muhammad ibn Musa al-Chuwarizmi. y wIX wieUniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 29


kuw Bagdadzie, przyczyni si do rozwinicia dziesitnego systemu liczenia,
stworzy podstawy algebry itrygonometrii. To od jego znieksztaconego nazwiska
wziy nazw same algorytmyiwiedza onich, jak jest algorytmika.

1.3. Koncepcja maszyny Turinga


Opisujc wyej algorytmy, podkrelalimy wielokrotnie, e ich sens polega na
tym, e powinien znale si wykonawca, ktry zrealizuje to wszystko, co zostao
walgorytmie zapisane.
Kto jednak miaby by tym wykonawc?
Wykonywanie algorytmw przez czowieka teoretycznie jest moliwe, jest
jednak bardzo niewygodne. Uycie komputera jako wykonawcy rozwaanych algorytmw jest mao przydatne, bo kady komputer ma wswojej strukturze cae
mnstwo skomplikowanych szczegw technicznych, ktrych poznawanieianaliza tylko po to, eby zobaczy jak dziaa taki czy inny algorytm, jest bardzo niepraktyczne. Dlatego celowe jest posuenie si pewnym modelem formalnym, na
tyle uproszczonym, eby jego wasne cechy nie przeszkadzay wskupieniu uwagi
nad dziaaniem badanych algorytmw inad ich waciwociami, ale jednoczenie
na tyle sprawnym, eby mg zrealizowa dowolny algorytm. Takim znanym icenionym modelem jest tak zwana maszyna Turinga, bdca abstrakcyjnym modelem procesu obliczeniowego.
Maszyna Turinga (Rys. 9) skada si ztak zwanego automatu skoczonegoA(bdcego uproszczonym modelem mikroprocesora dziaajcego wkadym
komputerze) oraz pamici majcej form tamy podzielonej na klatki, wktrych
specjalna gowica G zapisuje iodczytuje wybrane symbole si, przesuwajc si przy
tym do ssiedniej klatki (ojedn pozycj wlewo lub wprawo) albo pozostajc
wtym samym miejscu (jeli algorytm wanie tego wtym momencie wymaga).
Tama peni rol modelu pamici masowej komputera, przy czym cech odrniajc maszyn Turinga od prawdziwego komputera jest fakt, e tama maszyny
Turinga ma nieograniczon dugo.

Rys. 9. Schemat maszyny Turinga


Stowarzyszenie Edukacja dla Przedsibiorczoci

30 Metody inarzdzia programowania


Symbole si znajdujce si na tamie mog mie rne znaczenie, przy czym ich
zbir , nazywany alfabetem maszyny Turinga jest dowolnie definiowany przez
twrc maszyny wzalenoci od potrzeb.

= < s1 , s2 , ., sn >

(9)

Ze wzgldu na podobiestwo do funkcjonowania elementw cyfrowych wchodzcychwskad typowego komputera rozwaane s czasem binarne maszyny Turinga, wktrych zbir moliwych symboli skada si wycznie zzera ijedynki
= <0, 1>. Taka maszyna Turinga dyskutowana jest midzy innymi wznanej ksice Rogera Penroseazatytuowanej Nowy umys cesarza. Jednak przy rozwaaniu
binarnych maszyn Turinga trzeba bra pod uwag dosy dugie acuchy symboli,
eby uzyska jakie sensowne dziaanie maszyny, wic wtym rozdziale bdziemy
si posugiwali bogatszymi zbiorami symboli rozwaajc dziaanie przykadowych maszyn Turinga na krtszych acuchach bardziej znaczcych symboli.

1.4. Automat skoczony


Jak wspomniano wyej sercem maszyny Turinga, przedstawionej na rysunku 9, jest automatA. Automat woglnoci jest tworem teoretycznym, ale
wpraktyce technicznej uywa si dosy licznych praktycznych implementacji automatw, bo s one wysoce przydatne do rnych celw.
Automat woglnym przypadku posiada wejcie iwyjcie. Na wejciu automatu pojawiaj si sygnay (informujce automat ostanie jego otoczenie) atake
na wyjciu pojawiaj si sygnay, bdce odpowiedziami automatu na oddziaywanie otoczenia. Sygnay wejciowe iwyjciowe woglnym przypadku mog
by dowolne, ale wmaszynie Turinga (iwielu innych zastosowaniach) uywa si
automatw, ktre na wejciu ina wyjciu maj sygnay wpostaci symboli pochodzcych zokrelonych alfabetw. Poniewa kady alfabet skada si ze SKOCZONEJ liczby symboli, wic automaty posugujce si takimi alfabetami nazywane s automatami skoczonymi. Ich teoria jest najlepiej rozwinita, atake
ich praktyczne zastosowania s najpowszechniej spotykane.
Alfabet sygnaw wejciowych automatu skoczonego moe by rny od
alfabetu sygnaw wyjciowych, ale wnaszym przypadku, gdy automat Ajest
sercem maszyny Turinga zarwno symbole wejciowe jak isymbole wyjciowe
nale do tego samego alfabetu , bo s to symbole odczytywane ztamy lub zapisywane na tamie przez gowic.
Regua wica sygnay (symbole) wejciowe iwyjciowe nazywa si funkcj wyjcia automatu iprzy automacie skoczonym moe by wygodnie zapisana wpostaci tabelki, ktra bdzie miaa tyle kolumn ile jest moliwych symboli
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 31


wejciowych. Rozwamy wcharakterze przykadu automat skoczony, sucy
do szyfrowania (utajniania) wiadomoci. Jedn zmetod szyfrowania jest zasada podstawiania wmiejsce prawdziwych znakw skadajcych si na okrelon
wiadomo ich odpowiednikw wybieranych zgodnie zjak regu (kluczem
szyfrowania). Jednym zbardziej znanych szyfrw tego rodzaju jest tzw. szyfr Cezara. Nazwa pochodzi od Juliusza Cezara, ktry szyfrowa swoj korespondencj zCyceronem wtaki sposb, e zamiast kadej litery pisa liter wystpujc
walfabecie trzy miejsca dalej. Liter walfabecie jest duo, asama zasada, ktr
chcemy pokaza, jest bardzo prosta. Dlatego dla zilustrowania dziaania automatu
skoczonego, realizujcego tego typu szyfrowanie, wystarczy jeli pokaemy tabelk wic sygnay (symbole) wejciowe iwyjciowe jedynie dla zbioru cyfr,
anie dla wszystkich znakw (liter, cyfr, odstpw, znakw przystankowych itp.).
Funkcj wyjcia takiego automatu mona wyrazi tabel (Tab. 1).

Tabela 1. Funkcja wyjcia wybranego automatu skoczonego


Symbol wejciowy

Symbol wyjciowy

Dziaanie takiego automatu przedstawia rysunek 10. Jeli na wejcie automatu


poda si jaki cig cyfr, to na wyjciu otrzyma si inny cig cyfr, wprowadzajcy
wbd postronn osob, ale atwy do poprawnego zinterpretowania przez waciciela automatu szyfrujcego. Majc taki automat skoczony, moemy zaszyfrowa na przykad numer PIN albo numer telefonu kolegi imoemy mie pewno,
e przypadkowy podgldacz nie bdzie wstanie wykra nam naszej tajemnicy.

Tabela 2. Funkcja wyjcia wybranego automatu skoczonego ze stanami


wewntrznymi
Symbol wejciowy

Poniedziaek

Wtorek

roda

Czwartek

Pitek

Sobota

Niedziela

Symbol wewntrzny

Stowarzyszenie Edukacja dla Przedsibiorczoci

32 Metody inarzdzia programowania


Automat skoczony, ktry tym samym symbolom wejciowym przyporzdkowuje stale te same symbole wyjciowe, jest urzdzeniem dosy prymitywnym
iubogim wmoliwoci. Mona jednak wprowadzi bardziej wyrafinowan konstrukcj automatu posiadajcego cech zmieniajc jego zachowanie wzalenoci od tak zwanego stanu wewntrznego. Na przykad wyobramy sobie automat, ktry bdzie szyfrowa symbole wejciowe (wnaszym przypadku cyfry)
wzalenoci od tego, wjakim dniu tygodnia nastpuje szyfrowanie. Tak szyfr
trudniej zama, wic takie postpowanie moe by bardzo racjonalne. Odpowiedni maszyn szyfrujc bdzie automat skoczony, ktrego zachowanie
trzeba bdzie uzaleni od dwch informacji: sygnau na wejciu oraz stanu wewntrznego, ktrym bdzie dzie tygodnia. Odpowiednia tabelka opisujca funkcj wyjcia takiego automatu przedstawiona jest wtabeli 2. Wnagwku kolumn
tabelki podane s sygnay wejciowe (podlegajce kodowaniu cyfry), wopisach
poszczeglnych wierszy podane bd stany wewntrzne (dni tygodnia), awartoci podane wtabelce bd okrelay sygnay wyjciowe produkowane przez
automat szyfrujcy.

1.5. Automat ozmiennych stanach


ukad sekwencyjny
Przykadowy automat skoczony opisany tabel 2 mia stany wewntrzne narzuconezzewntrz (przez kalendarz ustalajcy, jaki jest aktualny dzie tygodnia),
natomiast mona zbudowa automat, ktry sam bdzie sobie zmienia stany wewntrzne. Taki automat bdzie musia mie zdefiniowane dwie funkcje: rozwaan wyej funkcj wyjcia, okrelajc jaki sygna wyprodukuje na wyjciu ten
automat gdy bdc wokrelonym stanie otrzyma okrelony sygna wejciowy,
oraz funkcj przejcia, okrelajc, do jakiego nowego stanu przejdzie automat,
jeli bdc wokrelonym stanie, otrzyma okrelony sygna wejciowy. Zwrmy
uwag, e funkcja przejcia zdefiniowana jest dla tych samych informacji determinujcych jej wartoci, co funkcja wyjcia (nowy stan te zaley od aktualnego stanu isygnau wejciowego). To oznacza, e obie wymienione funkcje mog
by przedstawione wtej samej tabeli przy zaoeniu, e wpolach tabeli wpisywa
bdziemy dwie wartoci, zakadajc, e pierwsza znich to produkowany przez
automat sygna wyjciowy, adruga to nowy stan, do jakiego automat przejdzie
wnastpstwie zadziaania funkcji przejcia.
Rozwamy przykad automatu prostego skoczonego majcego trzy stany wewntrzne (oznaczone dla prostoty wycznie numerami) iprodukujcego na wejciu iwyjciu wycznie trzy symbole:A, B iC. Tabela 3 przedstawia zarwno
funkcj wyjcia, jakifunkcj przejcia tego automatu.
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 33


Tabela 3. Funkcja wyjcia ifunkcja przejcia przykadowego automatu
Wejcie

B, 2

A,3

C,1

C,1

B,3

A,2

A,3

C,2

B,1

Stan

Do kompletu definicji automatu naley jeszcze stan pocztkowy. Jest


to ten ze stanw wewntrznych automatu, od ktrego zaczyna on swoj prac wmomencie startu. Wautomatach, jakimi s komputery, atake inne zoone systemy cyfrowe jak GPS czy bardziej rozbudowanie telefony GSM, do
tego stanu pocztkowego powraca si po wyczeniu iwczeniu zasilania
albo naciniciu przycisku reset. Wrozwaanym przykadzie stanem startowym jest stan numer 1, ktry wzwizku ztym wtabeli 3 jest zaznaczony
pogrubion czcionk.
Za chwil przeledzimy, jak ten automat dziaa. Zacznijmy jednak od nastpujcej oglnej uwagi. Ot automaty majce stany wewntrzneizdefiniowan
funkcj przejcia tym si charakteryzuj, e mog dawa rne sygnay wyjciowe wodpowiedzi na takie same sygnay wejciowe. Wynika to zfaktu, e
do odpowiedzi na dany sygna, wdanej chwili czasu automat mg wdrowa
przez rne cigi wczeniejszych stanw wewntrznych, ajego biece dziaanie zaley od jego historii. Dlatego automaty tego typu nazywane s niekiedy
automatami zpamici albo automatami sekwencyjnymi, bowiem ich zachowanie iwaciwoci mona opisa, biorc pod uwag sekwencje (uporzdkowane wczasie cigi) sygnaw wyjciowych powstajce wodpowiedzi na sekwencje sygnaw wejciowych. Dla kompletu informacji dodajmy jeszcze, e
zwyke automaty, nie majce stanw wewntrznych icakowicie zdeterminowane sygnaami aktualnie pojawiajcymi si na ich wejciu, nosz nazw
ukadw kombinacyjnych.
Przeledzimy dziaanie ukadu sekwencyjnego, posugujc si przywoanym
wyej przykadem.
Wyobramy sobie, e na wejcie automatu zdefiniowanego tabel 3 podana
zostaa sekwencja symboli:
ABBACACA
Stowarzyszenie Edukacja dla Przedsibiorczoci

34 Metody inarzdzia programowania

Rys. 10. Pierwszy krok dziaania przykadowego automatu


(ukadu sekwencyjnego) opis wtekcie

Wchwili pocztkowej sytuacja przedstawia si tak, jak to pokazano na rysunku 10, po lewej stronie. Automat znajduje si wstanie 1 iotrzymuje jako
sygna wejciowyA. Jak wynika zelementw zaznaczonych wtabelce wrodkowej czci rysunku, na wyjciu automatu pojawi si symbol B jako pierwszy element sekwencji wyjciowej, astan automatu zmieni si (zgodnie ztabel na numer 2). T sytuacj przedstawia schemat automatu po prawej stronie
rysunku.

Rys. 11. Drugi krok dziaania ukadu sekwencyjnego

Nastpny krok przedstawiono na rysunku 11. Jak wida, automat znajdujcy


si teraz wstanie 2 otrzymuje na wejciu symbol B wwyniku czego na wyjciu
produkuje take symbol B (tak wynika ztabelki) iprzechodzi do stanu 3.
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 35


Czytelnik zechce we wasnym zakresie przeledzi dalsze etapy dziaania automatu (wymaga to sporej uwagi!), wwyniku czego przekona si, e wodpowiedzi na sekwencj:
ABBACACA
automat wyprodukuje na wyjciu sekwencj symboli:
BBCCCBAC
ikoczc swoje dziaanie, bdzie si znajdowa wstanie 1.
Jak wida, rozwaajc zachowanie ukadu sekwencyjnego na przykad tego
opisanego tabel 3 musimy wzi pod uwag sekwencj sygnaw wejciowych,
wodpowiedzi na ktr automat wygeneruje sekwencj sygnaw wyjciowych.
Odbdzie si to cakiem automatycznie (zgodnie zpotocznym rozumieniem sowa automat). Dla dalszych rozwaa wane jest, e zasad przeksztacenia
sekwencji wejciowej wsekwencje wyjciow moemy powiza zpewnym algorytmem, wwyniku czego moemy mwi, e automat jest realizatorem tego
algorytmu.
Wprawdzie kady algorytm mona przedstawi wtakiej postaci, eby istota
jego dziaania polegaa na zamianie wejciowej sekwencji wybranych symboli na
sekwencj symboli wyjciowych, ale nie kady algorytm moe by zrealizowany
za pomoc automatu, bywaj bowiem takie algorytmy, dla ktrych nie udaje si
takiego automatu zbudowa.
Omaszynie, ktra potrafi zrealizowa dowolny algorytm, bdzie mowa nieco
dalej, natomiast chwilowo przedyskutujmy krtko zwizki, jakie zachodz pomidzy automatami ijzykami.

1.6. Jzyki igramatyki formalne


Cig symboli wejciowych ABBACACA rozwaany wyej podczas omawiania dziaania automatu sekwencyjnego moe by rozpatrywany jako napis wpewnym jzyku. Mona si oczywicie zastanawia nad tym, co ten napis wtym jzyku znaczy itym zagadnieniem zajmuje si dziedzina nauki okrelana jako
semantyka. Nas jednak wtym rozdziale tre isens napisw wrnych jzykach
interesowa nie bdzie, jest to bowiem obszar zaleny od celw, wktrych takie
czy inne napisy zostay sporzdzone, ato nie jest obszar nauki wchodzcy wzakres
teoretycznych podstaw programowania. Mona jednak zada pytanie, czy ten napis
jest wdanym jzyku poprawnie zbudowany ina tym wanie skupimy uwag.
Poprawnoci rnych struktur jzykowych zajmuje si syntaktyka. Okazuje
si, ewinformatyce to wanie syntaktyka jest najwaniejsza, bo na niej opiera
Stowarzyszenie Edukacja dla Przedsibiorczoci

36 Metody inarzdzia programowania


si caa praktyka stosowania sztucznych jzykw (tak zwanych jzykw algorytmicznych) bdcych podstaw nowoczesnych metod programowania. Kluczowym pojciem przy syntaktycznym podejciu do kwestii jzyka jest gramatyka.
Dla jzykw naturalnych gramatyki powstaway wten sposb, e wmiar rozwoju praktyki komunikacyjnej uytkownicy jzyka spontanicznie zaczynali przestrzega pewnych regu izasad (pocztkowo waden sposb nie spisanych ani
nie skodyfikowanych)wcelu sprawniejszego uywania jzyka iskuteczniejszego
porozumiewania si. Potem te reguy izasady zarejestrowano wformie konkretnych zalece, definiujcych jak naley budowa poprawne zdania wtym oto jzyku itak powstay okrelone gramatyki normatywne, okrelajce poprawny
sposb budowy zda icaych wypowiedzi wokrelonym jzyku. Ze wzgldu na
taki sposb powstania naturalnych gramatyk s one zreguy skomplikowane,
nie do koca logiczne, pene wyjtkw sowem kiepsko przystaj do wiata
komputerw, oczym bardzo dobrze wiedz komputerowi specjalici zajmujcy si dziedzin informatyki, okrelan jako lingwistyka komputerowa lub NLP
(ang. Natural Language Processing).
Odmiennie wyglda sytuacja jeli idzie ojzyki sztuczne, przystosowane do
komunikacji ludzi zmaszynami. Chodzi gwnie ojzyki do programowania
komputerw, chocia obecnie rozwija si take tematyka jzykw do komunikacji zrobotamiizinnymi systemami zautomatyzowanymi. Ot budowie tych
sztucznych jzykw towarzyszy obecnie konstrukcja ich gramatyk, bdcych od
pocztku tworami silnie sformalizowanymi. Dziki temu proces translacji, czyli automatycznego tumaczenia programu zzapisu wygodnego dla czowieka (to
znaczy wyraonego wczytelnymi zrozumiaym dla programisty jzyku algorytmicznym) na tak zwane kody wewntrzne (binarne zapisy sterujce prac maszyny,
wtym gwnie mikroprocesorw) moe by prowadzony szybko iefektywnie.
Teoria gramatyk ijzykw formalnych to bardzo obszerna dziedzina, ktrej
elementy Czytelnik moe pozna, korzystajc zpozycji literatury podanych na
kocu tego rozdziau. Wtym miejscu podamy jedynie podstawowe fakty inajprostsze przykady. Opiszemy tak zwan gramatyk formaln pozwalajc matematycznie rozstrzyga, czy okrelone zdanie4 jest poprawnie zbudowane wrozwaanym jzyku. Przy czymzdefinicji zakadamy, e do kadego jzyka naley
Wjzykach naturalnych zdania skadaj si ze sw, ate sowa zapisujemy przy uyciu okrelonych symboli (liter). Wjzykach formalnych, wtym take wjzykach programowania, zakada
si, e uywane symbole, nawet jeli s pojedynczymi znakami, peni rol sw, anie liter,
bdcych skadnikami sw. Powoduje to midzy innymi, e elementy tych jzykw majce
okrelone znaczenie, ale zapisane wpraktyce przy uyciu wielu liter na przykad zdefiniowane
wjzyku sowa kluczowe albo dusze nazwy zmiennych traktowane s jako pojedyncze niepodzielne symbole. Na przykad wjzyku C symbolem jest +, ale pojedynczym symbolem jest
te zapis ++ albo sowo while, atake nazwa_zmiennej_przechowujcej_dane.

Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 37


(midzy innymi) zdanie puste oznaczane symbolem . Jest to zdanie nie zawierajce ani jednego znaku, pozornie nieprzydatnew praktyce, ale konieczne dla
domknicia rnych rozwaa teoretycznych.
Zmatematycznego punktu widzenia gramatyka formalna to czwrka uporzdkowanych elementw
G = (, N, S, P)

(10)

wktrej:
oznacza zbir symboli wejciowych (zwanych te symbolami terminalnymi).
Nie bez kozery uyto tu takiego samego oznaczenia jak we wzorze (9). Napisy,
ktre mog by rozwaane jako elementy rozwaanego jzyka, musz si skada wycznie zsymboli terminalnych, przy czym jest to warunek konieczny,
ale nie wystarczajcy, bowiem nie kade zestawienie symboli terminalnych
jest poprawnym elementem rozwaanego jzyka. Zatem gramatyka musi zawiera dodatkowe reguy pozwalajce rozrnia napisy poprawne iniepoprawne zgodnie ztymi reguami.
N jest zbiorem symboli nieterminalnych, zwanych te pomocniczymi lub wprost
nieterminalami. Nieterminale uywane s pomocniczo wtrakcie generowania sowa, ale s zniego eliminowane, zanim generowanie dobiegnie koca.
S N jest specjalnym nieterminalem pocztkowym lub aksjomatem. Od niego
rozpoczyna si kade generowanie sowa.
P jest skoczonym zbiorem tak zwanych produkcji gramatyki.
Kluczowym pojciem wrd podanych wyej jest pojcie produkcji, ktrego
nazwa jest nieco mylca iktremu wzwizku ztym musimy si przyjrze zdu
uwag. Produkcje s to reguy, ktre pozwalaj zastpowa nieterminale okrelonymi napisami zawierajcymi (zalenie od potrzeb) nieterminale oraz ewentualnie take symbole terminalne. Stosujc produkcje, mamy gwarancj, e nie wyjdziemy poza obrb definiowanego przez gramatyk jzyka. Jeli wic zaczniemy
od napisu nalecego do jzyka (na przykad od aksjomatu) ipotem zastosujemy
dowoln liczb razy dowolne produkcje ze zbioru P, to napisy, ktre bdziemy
tworzyli, stale bd naleay do jzyka.
Rozwamy elementarny przykad.
Niech zbir skada si zdwch tyko liter:aib ( = {a,b}). Oznacza to,
e rozwaany jzyk skada si bdzie wycznie znapisw zawierajcych literyaib wrnych kombinacjach, apojawienie si napisu zawierajcego chocia
jedn inn liter od razu bdzie wskazywao, e ten napis do jzyka definiowanego
zpomoc tej gramatyki po prostu nie naley.

Stowarzyszenie Edukacja dla Przedsibiorczoci

38 Metody inarzdzia programowania


Gramatyka, ktr zbudujemy, jest bardzo prosta, wic wystarczy tylko jeden
nieterminal. Bdzie nim oczywicie aksjomat S (N = {S}).
Zbir produkcji P bdzie te bardzo prosty. Bdzie on zawiera dwie reguy:
S = aSb

(11)

S = ab

(12)

Pierwsza znich jest wykorzystywana do budowania prawidowych wyrae


wrozwaanym tu jzyku, za druga jest konieczna do tego, eby mona byo zakoczy budow kadego takiego wyraenia.
Jeli mamy jaki cig symboli terminalnych ichcemy si dowiedzie, czy jest
on prawidowym zdaniem wjzyku definiowanym przez rozwaan gramatyk,
to moliwe jest zastosowanie jednej zdwch metod. Czowiek, dokonujc takiego
sprawdzenia rcznie, najchtniej posuy si metod generacyjn zasugerowan wyej przy opisie roli produkcji P. Sprbujmy na przykad wykaza, e napis
aaabbb naley do jzyka generowanego przez rozwaan tu gramatyk.
Zaczniemy od aksjomatu S. On zdefinicji do jzyka naley. Stosujc produkcj opisan wzorem (11), moemy kolejno wykona nastpujce przeksztacenia:
S aSb aaSbb aaabbb

(13)

Cig przeksztace podany wformule (13) zaczyna si od elementu nalecego do jzyka (od aksjomatu tego jzyka), prowadzony jest wycznie woparciu
oprodukcje zawarte wgramatyce jzyka ikoczy si badanym napisem aaabbb,
co dowodzi, e napis ten naley do jzyka generowanego przez rozwaan tu
gramatyk.
Podobnej serii przeksztace nie da si zbudowa, gdy napis (zoony zprawidowych symboli terminalnych) ma nieprawidow struktur. Niepodobna na
przykad zbudowa cigu przeksztace zaczynajcych si od aksjomatu jzyka
ikoczcych si na napisie aab, co dowodzi, e ten napis jest wrozwaanej tu gramatyce niepoprawny. Niepoprawne s te napisy abab atake bbbaaa. Czytelnik,
zatwoci sam odkryje zasad decydujc otym, ktre napisy wtej gramatyce
bd traktowane jako poprawne, aktre bd niepoprawne. Uwane przyjrzenie
si strukturze produkcji (11) ijej dziaaniu podczas budowy wywodu (13) pozwoli
t regu uoglni na dowolnie dugie napisy, ktre dany jzyk moe generowa.
Metoda generacyjna, pokazana wyej wformie przykadu, nadaje si do zastosowania, gdy dowodzenie poprawnoci gramatycznej przeprowadzane jest
przez czowieka. Czowiek ma zdolno wyboru najwaciwszych produkcji na
podstawie inteligentnego ogldu tego napisu, do ktrego dy oraz tego napisu,
jaki aktualnie ma do dyspozycji (na kadym kroku budowania wywodu) wnastpstwie rozpoczcia procesu dowodzenia od aksjomatu jzyka izastosowania kilUniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 39


ku wczeniej wybranych produkcji. Dla maszyny takie postpowanie jest jednak
niewygodne, gdy wymaga pomysowociiinwencji. Dlatego najczciej stosuje
si dowodzenie poprawnoci okrelonych napisw wjakim jzyku (na przykad
programw komputerowych) metod redukcyjn. Wmetodzie tej wychodzi si
od napisu, ktrego poprawno mamy sprawdzi, ikolejno przechodzc poprzez
moliwe do zastosowania produkcje wykorzystywane odwrotnie: wnapisie
podlegajcym analizie wyszukuje si cig symboli znajdujcy si po prawej stronie odpowiedniej produkcji izastpuj si go napisem znajdujcym si po lewej
stronie. Zreguy produkcje s tak zbudowane, e napisy po ich lewych stronach s
znaczco krtsze, ni napisy po stronach prawych, wzwizku ztym stosowaniu
produkcji wschemacie od prawej do lewej towarzyszy systematyczne skracanie
badanego napisu, std nazwa metoda redukcyjna. Jeli po kolejnej redukcji badany
napis zostanie zredukowany do pojedynczego aksjomatu jzyka (S), to moemy
uzna, e zostao dowiedzione, e badany napis by poprawny. Jeli jednak takiej
redukcji nie uda si dokona, to jest to dowd niepoprawnoci napisu.

1.7. Automat igramatyki


Poprawno bd niepoprawno gramatyczna konkretnego napisu moe by
ustalona przy uyciu automatu. Ten zwizek midzy omwionymi wyej sferami:
sfer jzykw igramatyk formalnych oraz sfer automatw skoczonych, bdzie
przedmiotem tego podrozdziau. Warto podkreli praktyczny walor przedstawianych tu wiadomoci. Uywanie jzykw programowania, co jest dzisiaj norm przy
programowaniu komputerw, oparte jest na moliwoci dokonywania automatycznej
translacji (tumaczenia) programw napisanychwjednym zjzykw programowania do postaci wykonywalnej przez komputer. Ta ostatnia posta na form sekwencji
kodw sterujcych prac mikroprocesora izwykle nazywana jest programem wynikowym lub kodem binarnym. Napisanie programu binarnego wprost przez czowieka jest wprawdzie moliwe, ale bardzo pracochonne, mczce iobarczone duym
prawdopodobiestwem bdu std praktycznie nikt dzisiaj tak nie programuje.
Jednak translatory tumaczce programy zrnych jzykw algorytmicznych
do postaci kodw binarnych musz dokona dokadnej analizy tekstu programu
pod wzgldem jego poprawnoci gramatycznej. Co wicej, okazuje si, e produkcje odpowiedniej gramatyki uywane przy redukcyjnej analizie poprawnoci
instrukcji programu wskazuj jednoznacznie te czynnoci, jakie ma wykona mikroprocesor, eby speni yczenie programisty izrealizowa wymagany algorytm. Analiza gramatycznej poprawnoci jest wic take kluczem do wytworzenia
wykonywalnego programu, co ma due znaczenie praktyczne.
Cz translatora, ktra dokonuj kontroli gramatycznej poprawnoci napisw
wyraonychwokrelonym jzyku programowania, nazywana jest parserem, atyStowarzyszenie Edukacja dla Przedsibiorczoci

40 Metody inarzdzia programowania


powa realizacja parsera odwouje si do jego realizacji wformie automatu skoczonego.
Zobaczmy na prostym przykadzie, jak taki parser moe dziaa.
Rozwamy gramatyk onastpujcej postaci:
= {a}

(14)

N = {S}

(15)

S = S

(16)

P = {S = aaS, S = aa}

(17)

atwo si zorientowa, e gramatyka ta definiuje jzyk, wktrym poprawne s


tylko takie napisy, ktre skadaj si zparzystej liczby powtrze symbolua. Poprawne s wic napisy aaaa albo aaaaaa, natomiast niepoprawny jest napis aaa.

Tabela 4. Funkcja wyjcia ifunkcja przejcia automatu akceptujcego sowawrozwaanej gramatyce


Wejcie

?, 2

AKCEPTACJA, STOP

?,1

ODRZUCENIE, STOP

KONIEC, STOP

KONIEC, STOP

Stan

STOP

Rozwaana gramatyka jest regularna, co oznacza, e moliwe jest zbudowanie automatu, ktry bdzie bada poprawno dowolnych napisw wtym jzyku.
Automat taki musi odczytywa kolejne znaki wchodzce wskad badanego napisu, przechodzc ze stanu do stanu zgodnie zodpowiedni tabel przej, a do
napotkania symbolu pustego , ktry zatrzyma jego dziaanie (stan automatu stanie si wyrnionym stanem STOP, zktrego aden sygna automatu wyrwa nie
potrafi). Stanem startowym automatu jest stan numer 1. Podczas przechodzenia
od stanu do stanu automat moe, ale nie musi, wysya sygnay wyjciowe (wtym
przypadku s one ignorowane, wic zostay oznaczone symbolem ?), natomiast
po dojciu do stanu STOP podaje na wyjciu sygna AKCEPTACJA lub ODRZUCENIE wzalenoci od tego, czy rozwaany napis by poprawnym zdaniem
wrozwaanym jzyku, czy te nie.
Jak ju wyej wspomniano, nie dla kadej gramatyki uda si zbudowa taki automat. Jeli jest to moliwe, gramatyk nazywamy gramatyk regularn. Jeli si
nie uda, gramatyka jest nieregularna. Na przykad gramatyka rozwaana wpodrozdziale 1.8 generujca sowa typu anbn, czyli takie, wktrych najpierw n-krotnie
Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 41


powtarza si symbola, anastpnie n-krotnie (czyli tyle samo razy!) powtarza si
symbol b mimo swojej prostoty jest gramatyk nieregularn. Jak za chwil zobaczymy, mona zbudowa system, ktry bdzie mia istotnie bogatsze moliwoci,
ni automat skoczony. Bdzie to maszyna Turinga, bdca najbardziej znanym
przykadem uoglnionego systemu realizujcego dowolne algorytmy, ale do tego
wtku powrcimy za chwil.

1.8. Kilka uzupeniajcych uwag na temat


gramatyk ijzykw
Przykadowe jzyki, ktrymi zajmowalimy si wpodrozdziaach 1.8 i1.9,
byy oczywicie trywialnie proste, poniewa na takich jzykach mona byo pokaza wszystkie istotne waciwoci dyskutowanych tu poj, nie wikajc Czytelnikaw konieczno ledzenia nadmiernej liczby niepotrzebnych szczegw.
eby jednak nie pozostawia wraenia, e teoria gramatyk ijzykw formalnych
zajmuje si wycznie jaow onglerk pozbawionymi sensu symbolami, pokaemy teraz prosty przykad gramatyki, ktra ma znamiona praktycznej przydatnoci.
Rozwaymy gramatyk badajc poprawno prostych wyrae algebraicznych,
takich jak na przykad:
x + y * (z+ x)

(18)

Gramatyk opisujc jzyk rozpoznajcy poprawne iniepoprawne wyraenie


opiszemy, korzystajc ztak zwanej Formalizacji Backusa iNaura (oznaczanej
wliteraturze BNF od Backus Naur Formalization). BNF zostaa po raz pierwszy
zastosowana w1960 roku do opisu gramatyki jzyka programowania nazwanego
Algol (od Algorithmic Language) ijest do dzi chtnie stosowana przy opisywaniu kolejnych jzykw programowania.
Wnotacji BNF elementu zbioru N (nieterminale) zapisywane s wformie
sw pisanych kursyw, anie pojedynczych liter. Uatwia to zrozumienie ich roli
wstrukturze jzyka. Ponadto zaobserwowawszy, e wwielu wypadkach przy budowie duych gramatyk wystpuj serie produkcji majcych ten sam symbol nieterminalny po lewej stronieirne kombinacje symboli po prawej stronie wBNF
zastosowano zapis pozwalajcy poda te wszystkie zamienniki wjednej formule.
Przykadowo zamiast pisa:
S =a, S = b, S = c

(19)

S = a| b | c

(20)

mona zapisa:
gdzie symbol | (pionowej kreski) czyta si jako albo.
Stowarzyszenie Edukacja dla Przedsibiorczoci

42 Metody inarzdzia programowania


BNF (azwaszcza jej nowsza wersja EBNF ang. Extended Backus Naur Formalization) oferuje jeszcze kilka dalszych pomysowych skrtw, ktre mogyby
si przyda przy definiowaniu potrzebnej nam gramatyki, ale ich objanianie zajo by zbyt wiele miejsca, zostan one wic pominite.
Rozwaana gramatyka uywa bdzie zaledwie siedmiu symboli terminalnych:
= {x, y,z, +, *, (, )}

(21)

Symboli tych mogoby by wicej (mona by uwzgldni wiksz liczb


zmiennych, jak rwnie mona by byo dopuci moliwo wystpowania wwyraeniach take liczb), ale dla zbudowania ciekawego przykadu tyle symboli wystarczy.
Zbir N zawiera bdzie symbole nieterminalne przedstawione zgodnie zBNF
w postaci napisw:
N = {wyraenie, skadnik, czynnik}

(22)

Aksjomatem jzyka bdzie nieterminal wyraenie


S = wyraenie

(23)

no ina koniec rzecz najwaniejsza, produkcje:


P = {wyraenie = skadnik | wyraenie + skadnik ,

(24)

skadnik = czynnik | skadnik * czynnik ,

(25)

czynnik = x | y | z| (wyraenie)}

(26)

Chcc wykaza wtej gramatyce, e napis (18) jest prawidowo zbudowany,


moemy stworzy wywd wygldajcy nastpujco:
wyraenie = wyraenie + skadnik = wyraenie + skadnik * czynnik =
= wyraenie + skadnik * (wyraenie) =
= wyraenie + skadnik * (wyraenie + skadnik) = x + y * (z+ x)
(27)
Czytelnik moe sam sprawdzi, e nie da si zbudowa prawidowego wywodu dla takich (przykadowo) wyrae:
x+*y
)z+ y(
xy +z
z+
wzwizku ztym wszystkie te wyraenia traktujemy jako niepoprawne (isusznie).

Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 43

1.9. Waciwoci maszyny Turinga


Zainteresowanie informatykw konstrukcj idziaaniem maszyny Turinga
bierze si std, e ju wlatach 40. XX wieku, kiedy powstaway pierwsze komputery, sformuowana zostaa tak zwana hipoteza Churcha-Turinga, stwierdzajca
co nastpuje:
Maszyna Turinga moe rozwiza kady problem, dla ktrego uda si sformuowa algorytm jego rozwizywania.

Innymi sowy mona dziki tej tezie zrwna zbir wszystkich problemw
algorytmizowanych ze zbiorem wszystkich problemw rozwizywalnych, co ma
daleko idce konsekwencje praktyczne iteoretyczne. Zwizkami hipotezy Churcha-Turingazogln teori umysu zajmuj si filozofowie, wywodzc ztej hipotezy rne wnioski na temat tego, co jest rozumowo poznawalne, aco mieci si
ju poza obszarem moliwoci racjonalnego poznania. Rwnie fizycy korzystaj
zhipotezy Churcha-Turinga, prbujc orzeka, czy Wszechwiat jest poznawalny,
czy te zawsze bd istniay takie aspekty tego Wszechwiata, ktrych nie zdoamy pozna mimo setek lat bada iustawicznego rozwoju wiedzy owiecie.
Wtym skrypcie ukierunkowanym na dostarczenie Czytelnikom wiedzy przydatnej zpunktu widzenia praktycznych zastosowa informatyki ito gwnie zastosowa zwizanych ze sfer gospodarki moemy hipotez Churcha-Turinga
traktowa jako swoist ciekawostk, natomiast dla kadego, kto obserwujc szybki rozwj informatyki i zastanawia si nad tym, do czego ten rozwj doprowadzi,
istnienie tej hipotezy jest istotnym skadnikiem prowadzonych rozwaa iwyciganych wnioskw.
Nie zagbiajc si zbyt daleko wdywagacje teoretyczne, moemy jednak odnotowa jeszcze kilka interesujcych faktw. Ot po pierwsze hipoteza Churcha-Turinga nie zostaa nigdy formalnie cile dowiedziona. Jej funkcjonowanie
oparte jest wic na fakcie, e od zgr p wieku nikomu nie udao si jej sfalsyfikowa, to znaczy pokaza takiego problemu, dla ktrego mona zbudowa
algorytm, ajednoczenie nie da si zbudowa maszyny Turinga realizujcej ten
algorytm. Jednak formalnego dowodu jej poprawnoci take nie ma.
Drugie interesujce spostrzeenie jest takie, e maszyna Turinga jest bardziej
uniwersalnym systemem rozwizujcym problemy obliczeniowe, ni jakikolwiek
realnie istniejcy komputer. Rnica polega na dostpnoci wmaszynie Turinga
pamici (tamy) onieograniczonej pojemnoci, czego mimo staego postpu technologii nie mona zaimplementowa wpraktycznie istniejcych komputerach.
Chocia adna maszyna Turinga nie wykorzystaa nigdy nieskoczonej dugoci
posiadanej tamy (bo wszystkie algorytmy s finistyczne, to znaczy kocz si po
wykonaniu skoczonej liczby krokw,awczasie wykonywania skoczonej liczStowarzyszenie Edukacja dla Przedsibiorczoci

44 Metody inarzdzia programowania


by krokw nie da si skorzysta znieskoczonej tamy) to jednak fakt, e prawdziwemu komputerowi czasem pamici zabraknie, amaszynie Turinga nigdy, stanowi otym, e zbir wszystkich moliwych oblicze, ktre s wykonywalne dla
komputerw jest znaczco wszy ni zbir wszystkich oblicze.
Jeszcze jeden (ju ostatni zprzytaczanych tutaj) teoretyczny aspekt rozwaanej
tu kwestii wie si ztym, e istniej takie obliczenia, dla ktrych nie mona stworzy algorytmu. Najbardziej znanym problemem tego rodzaju jest Busy Beaver
(z ang. pracowity bbr), definiujcy pewne zadanie (konieczno wygenerowania
na tamie maszyny Turinga najduszej moliwej serii jedynek, po czym algorytm
powinien si zatrzyma), dla ktrego mona udowodni, e nie da si zbudowa
efektywnego algorytmu.

Rys. 12. Ilustracja problemu Busy Beaver


rdo: http://www.catonmat.net/blog/wp-content/uploads/2009/10/busy-beaver-turing-machine.jpg (dostp 2011-04-17)

Przytoczone uwagi skaniaj do zapoznania si zmaszynami Turinga ido ich


przynajmniej powierzchownego poznania.

1.10. Przykadowa budowa maszyny Turinga


ijej dziaanie
Omawiajc automaty, ktre potrafi dowodzi poprawnoci gramatycznej
okrelonych napisw, zmuszeni bylimy przyzna, e nie dla kadej gramatyki
taki automat da si zbudowa. Wszczeglnoci nie potrafilimy zbudowa automatu akceptujcego sowawgramatyce opisanej formuami (11) i(12), std t
prost isympatyczn gramatyk musielimy okreli jako gramatyk nieregularn. Tymczasem to, czego automat skoczony dokona nie potrafi, maszyna Turninga moe zrobi, dowodzc tym samym swojej wyszoci.
Rozwamy wic maszyn Turinga zbudowan wedug schematu pokazanego
na rysunku 9 zautomatem zdefiniowanym wsposb przedstawiony wtabeli 5.

Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 45


Tabela 5. Funkcja wyjcia ifunkcja przejcia automatu, bdcego gwnym
elementem rozwaanej maszyny Turinga
Wejcie

aP0

bP0

L1

aNB

L2

L1

aL3

bL2

NB

aL3

bNB

P4

P5

bNB

NB

aP5

bP6

L7

aNB

bP6

L1

aNB

bNB

PA

A(akceptacja)

aNA

bNA

NA

B (bd)

aNB

bNB

NB

Stan

Wtabeli tej podane s stany automatu. Jest ich 10, przy czym jeden ztych
stanw okrelony jest jako A(akceptacja), co odpowiada przerwaniu pracy przez
maszyn Turinga istwierdzeniu, e napisane sowo jest poprawne wrozwaanej
gramatyce, ainny okrelony jest jako B (bd), co take przerywa prac, bo wtym
momencie wiadomo ju, e napisane sowo jest zpewnoci niepoprawne. Owyborze pola wtabeli decydujtake symbole wejciowe (a, b lub , co odpowiada
pustej komrce na tamie). Wposzczeglnych polach tabelki wpisane s wartoci funkcji wyjcia, ktre maj form pary: symbolu, ktry za pomoc gowicy
bdzie wpisany do aktualnej komrki na tamie, oraz kierunku przemieszczenia
gowicy (L = ojedno pole wlewo, P = ojedno pole wprawo, N = pozostawienie
gowicy wtej samej komrce). Oczywicie automat po kadym odczytaniu izapisaniu symbolu na tamie oraz po przemieszczeniu gowicy zmienia swj stan,
przy czym stan, do jakiego przechodzi automat, jest take zapisanywodpowiednich polach tabeli jako trzeci symbol kadego zapisu.
Przeledmy, jak to funkcjonuje. Maszyna rozpoczyna prac wsytuacji, gdy
automat znajduje si wstanie startowym (stan ten okrelony jest jako 0), na tamie
znajduje si podlegajcy badaniu napis, agowica ustawiona jest gdzie po prawej
stronie wstosunku do pierwszego symbolu badanego napisu (Rys. 13).

Stowarzyszenie Edukacja dla Przedsibiorczoci

46 Metody inarzdzia programowania

Rys. 13. Rozpoczcie pracy przez maszyn Turinga

Pierwszy krok pracy maszyny suy sprawdzeniu, czy jej praca zostaa prawidowo zainicjowana. Jeli wmomencie startu pod gowic znajduje si jaki symbol (nie pusta komrka), to oznacza, e gowica jest nieprawidowo ulokowana
(wewntrz napisu, anie po jego prawej stronie). Maszyna wtedy utrzymuje stan 0
iprzesuwa gowic wprawo tak dugo, a znajdzie pierwsze puste pole.
Gdy pod gowic znajdzie si puste pole, maszyna przechodzi wstan 1 iprzesuwa siwlewo a do znalezienia pierwszego (skrajnie prawego) znaku napisu
(Rys. 14).

Rys. 14. Maszyna Turinga uchwycia pierwszy symbol napisu

Jeli znakiem tym jest a, to maszyna przerywa, przechodzc do stanu B (bd).


Wprzeciwnym razie kasuje napotkany symbol b, przechodzi do stanu 2 irozpoczyna wdrwk wlewo (bez naruszania znajdujcych si wkomrkach znakw b) wcelu znalezienia pierwszego symbolu serii a(Rys. 15). Gdy go znajdzie,
przechodzi do stanu 3 ikontynuuje przeszukiwania wlewo, a do znalezienia pustej komrki (Rys. 16).

Rys. 15. Kolejny etap pracy maszyny Turinga


Uniwersytet Ekonomiczny w Krakowie

Teoretyczne podstawy programowania 47

Rys. 16. Moment nawrotu wpracy maszyn Turinga

Po jej znalezieniu nastpuje nawrt maszyna zaczyna zmierza wprawo po


drodze, odcinajc najbardziej po lewej stronie pooony symbola.
Zapewne Czytelnik potrafi sam przeledzi dalsze dziaanie maszyny, ktra na
przemian przemieszczajc si wzdu napisu to na jego prawy, apotem na jego
lewy koniec isystematycznie obgryzajc symboleaib na kocach napisu doprowadza wkocu do tego, e prawidowo zbudowany napis zostaje cakowicie
unicestwiony. Jeli jednak cigi symboli alub b nie s rwnoliczne, to pozostanie przynajmniej jeden nieskasowany symbol alub b iwwczas sygnalizowany
jest bd.
Pokazane dziaanie maszyny Turinga dowodzi, e moe ona wykona takie
operacje, ktrych zwyky automat wykona by nie potrafi. Dowodzi jednak take,
i projektowanie maszyny Turinga do konkretnego zastosowania wymaga sporej
pomysowoci, aprzeledzenie pracy tej maszyny podczas rozwizywania takiego
czy innego programu, wymaga witej cierpliwoci.
Czytelnikom chccym potrenowa zabaw zciekaw maszyn Turinga mona poleci tekst zawarty na stronie:
http://goodmath.blogspot.com/2006/03/playing-with-mathematical-machines.html
gdzie mona zobaczy, jak maszyna Turinga moe realizowa obliczenia wtak
zwanej arytmetyce unarnej.

Stowarzyszenie Edukacja dla Przedsibiorczoci

48 Metody inarzdzia programowania

1.11. Literatura
AhoA.V., Hopcroft J.E., Ullman J.D. [2003], Projektowanie ianaliza algorytmw, Helion, Gliwice.
Alagi S., Arbib M.A. [1982], Projektowanie programw poprawnych idobrze
zbudowanych, WNT, Warszawa.
Ben-Ari M. [2005], Logika matematyczna winformatyce, WNT, Warszawa.
Cormen T.H., Leiserson C. E., Rivest R. L. [2001], Wprowadzenie do algorytmw, WNT, Warszawa.
Dembiski P., Mauszyski J. [1981], Matematyczne metody definiowania jzykw programowania, WNT, Warszawa.
Harel D. [1992], Rzecz oistocie informatyki Agorytmika, WNT, Warszawa
Hopcroft J.E., Motwani R., Ullman J.D.[2005], Wprowadzenie do teorii automatw, jzykw ioblicze, PWN, Warszawa.
Kulik C., Tadeusiewicz R. [1974], Elementy cybernetyki ekonomicznej, Wydawnictwo Akademii Ekonomicznej, Krakw.
Tadeusiewicz R., Moszner P., SzydekoA. [1998], Teoretyczne podstawy informatyki, Wydawnictwo Naukowe WSP, Krakw.

Uniwersytet Ekonomiczny wKrakowie

2
Praktyka

programowania
imperatywno-strukturalnego
Janusz Stal, Janusz Tuchowski

Stowarzyszenie Edukacja dla Przedsibiorczoci

Teoretyczne podstawy programowania 51

2.1. Paradygmaty programowania


Zgodnie zdefinicj zawart wSowniku Jzyka Polskiego PWN, paradygmat to przyjty sposb widzenia rzeczywistoci wdanej dziedzinie, doktrynie.
Wprzypadku programowania termin ten odnosi si do stylu programowania wykorzystywanego wdanym okresie rozwoju informatyki czy te wykorzystywanego wokrelonych sytuacjach. Kady paradygmat cechuje zbir mechanizmw
stosowanych przez programist podczas tworzenia programw oraz sposb,
wjaki te programy bd wykonywane przez komputer. Przedmiotem rozwaa
niniejszego rozdziau jest charakterystyka zasad programowania imperatywnego
oraz, wkolejnym rozdziale, programowania obiektowego.
Programowanie imperatywne to metoda programowania, wktrej tworzony
program skada si ze zmiennych oraz sekwencji instrukcji modyfikujcych wartoci zmiennych. Rozwiniciem tej koncepcji jest programowanie strukturalne
polegajce na hierarchicznym podziale zestawu instrukcji wchodzcych wskad
programu na bloki, zapewniajce przejrzysto tworzonego kodu programu, oraz
programowanie proceduralne, wykorzystujce podzia kodu programu na mniejsze fragmenty realizujce okrelone zadania. Typowym przykadem jzyka programowania wykorzystujcym paradygmat programowania imperatywnego jest
kod maszynowy komputera. Kolejne tworzone jzyki programowania wysokiego
poziomu (Fortran, Pascal, C), dziki swym waciwociom, eliminoway niedogodnoci tworzenia programw wkodzie maszynowym. Jednym ztakich jzykw jest Java, ktra pomimo, i realizuje przede wszystkim paradygmat programowania obiektowego, zawiera szereg klasycznych konstrukcji odnoszcych si
do programowania imperatywnego. Dlatego te jzyk ten zosta wykorzystany
wniniejszej pracy jako narzdzie ilustrujce omawiane zagadnienia.

2.2. Jzyk programowania Java


Java to szybko rozwijajcy si jzyk programowania wysokiego poziomu
stworzony przez firm Sun Microsystems5, jak rwnie platforma suca do
uruchamiania aplikacji. Jego podstawowe cechy to:
pena obiektowo,
niezaleno od architektury (systemu operacyjnego, procesora),
W2009 roku nastpio przejcie firmy przez Oracle Corporation.

Stowarzyszenie Edukacja dla Przedsibiorczoci

52 Metody inarzdzia programowania


funkcjonalno automatyczne zarzdzanie pamici, obsuga wyjtkw,
wielowtkowo, obsuga sieci, tworzenie aplikacji zwykorzystaniem GUI
(ang. Graphical User Interface), tworzenie apletw (aplikacji uruchamianych
wrodowisku przegldarki internetowej),
niezawodno ibezpieczestwo tworzonych aplikacji.
Szersze omwienie zarwno waciwoci jzyka, jak irodowiska, wktrym
aplikacje s tworzonei uruchamiane, dostpne jest wopracowaniach The Java
Language Environment6 oraz The Java Language Specification7.
Wpraktyce spotka si mona zwieloma pojciami inazwami zwizanymi
ztworzeniemiuruchamianiem aplikacji wjzyku programowania Java. Poniej
zostay przedstawione najczciej wystpujce:8
JDK (ang. Java Development Kit)9 zestaw narzdzi pozwalajcych na utworzenie programu, wskad ktrych wchodzi kompilator, interpreter kodu bajtowego, przegldarka umoliwiajca uruchamianie apletw czy dodatkowe
programy narzdziowe,
kompilator (ang. compiler) program dokonujcy zamiany kodu rdoego
na kod zrozumiay dla wirtualnej maszyny Javy, tzw. kod bajtowy (ang. bytecode),
JVM (ang. Java Virtual Machine) Wirtualna Maszyna Javy stanowica wirtualny komputer, na ktrym uruchamiane s programy napisane wjzyku
Java,
JRE (ang. Java Runtime Environment) Wirtualna Maszyna Javy wraz ze
zbiorem standardowych klas; JRE jest niezbdne do uruchomienia jakiegokolwiek programu utworzonego wjzyku Java,
API (ang. Application Programming Interface) kolekcja gotowych do uycia
komponentw; wprzypadku jzyka Java jest to zbir klas iinterfejsw pogrupowanych wodpowiednie pakiety,
The Java Language Environment, http://java.sun.com /docs/white/langenv/ (dostp 2011-04-14).

Gosling J., Joy B., Steele G., Bracha G. [2005], The Java Language Specification. Third Edition, Addison-Wesley, Boston, http://java.sun.com/docs/books/jls/download/langspec-3.0.pdf
(dostp 2011-04-14).

Zobacz rwnie: Unraveling Java Terminology, http://java.sun.com/new2java/programming/


learn/unravelingjava.html (dostp 2011-04-14).

Wzalenoci od rodowiska, wktrym uruchamiane bd aplikacje utworzone wJavie, zdefiniowanych zostao szereg specyfikacji jzyka: SE (ang. Standard Edition), ME (ang. Micro
Edition), EE (ang. Enterprise Edition).

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 53


IDE (ang. Integrated Development Environment) zintegrowane rodowisko
programistyczne suce do tworzenia, modyfikowania oraz testowania programu,
konsola, wiersz polece elementy umoliwiajce komunikacj uytkownika
zkomputerem za pomoc polece tekstowych.

2.2.1. Tworzenie programu


Przygotowanie aplikacji wymaga uycia narzdzi umoliwiajcych lub wspomagajcych proces tworzenia kodu rdowego, jego kompilacji oraz uruchomienia. Do niezbdnych zaliczy mona:
Java SE Development Kit10,
znakowy edytor tekstu (np. notepad, notepad++, vi, jedit) lub zintegrowane
rodowisko programistyczne (np. JCreator, NetBeans, Eclipse),
dokumentacja, zawierajca szczegowy opis wszystkich klas dostpnych wraz
zJav (ang. Java API)11.
Edycja kodu rdowego programu zrealizowana moe zosta wdowolnym
edytorze znakowym. Utworzony wten sposb plik rdowy wjzyku Java posiada rozszerzenie .java (np. Test.java).

2.2.2. Kompilacja iuruchamianie programu


Zadaniem kompilatora jest zamiana kodu rdowego programu na kod wykonywany przez komputer. Wwyniku kompilacji powstaje program wpostaci pliku
wykonywalnego zrozszerzeniem .class (np. Test.class).
Wykonanie programu sprowadza si do wydania komendy java wraz znazw
programu (np. java Test). Program zostanie uruchomiony za pomoc Wirtualnej
Maszyny Javy.

10

Java Standard Edition, http://www.oracle.com/technetwork/java/javase/downloads/ (dostp


2011-04-14).

Java SE Technical Documentation, http://download.oracle.com/javase/index.html (dostp


2011-04-14).

11

Stowarzyszenie Edukacja dla Przedsibiorczoci

54 Metody inarzdzia programowania

Rys. 17. Etapy tworzenia iuruchamiania aplikacji

Wskad aplikacji tworzonych wjzyku Java moe wchodzi wiele plikw


rdowych. Wkadym znich wyrni mona szereg skadowych stanowicych
oprzyszym dziaaniu programu. Typowe elementy kadego pliku to:
opcjonalny komentarz pocztkowy, zawierajcy dane autora, opis programu
czy te sposb jego uruchamiania,
instrukcje deklaracji pakietu bd/iinstrukcje importu uytych klas,
deklaracje interfejsu lub klasy.
/*
* PierwszyProgram
* autor: Jan Kowalski (c) 2009
*
* Wywietlenie napisu na konsoli.
*
* Uruchomienie: java PierwszyProgram
*
*/
public class PierwszyProgram {
public static void main(String[] args) {
// wywietlenie prostego napisu
System.out.println("Pierwszy program w Javie");
}
}
Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 55


Wskad powyszego programu wchodzi klasa onazwie PierwszyProgram
zawierajca metod main(), ktra wyznacza pocztek dziaania programu. Jego
zadaniem jest wyprowadzenie na konsol (wywietlenie na monitorze) przykadowego tekstu, co jest realizowane dziki uyciu metody System.out.println(),
argumentem ktrej jest cig znakw do wywietlenia.
Nagwek metody wjzyku Java zawiera informacje onazwie, modyfikatorze
dostpu, typie zwracanej wartoci oraz argumentach przekazywanych podczas jej
wywoania. Cig instrukcji zawartych wmetodzie ujty jest wnawiasy klamrowe
oraz oddzielony rednikami. Poszczeglne elementy powyszego programu to:
/*...*/ komentarz blokowy (obejmuje zazwyczaj kilka linii), pomijany podczas kompilacji,
public modyfikator dostpu12 (okrela zakres widocznoci klasy),
class pocztek definicji klasy,
PierwszyProgram nazwa klasy (zgodna znazw pliku rdowego),
static kategoria metody oznaczajca, i mona j wywoa bez koniecznoci tworzenia obiektu klasy PierwszyProgram,
void typ wartoci zwracanej przez metod (wtym przypadku metoda nie
zwraca adnej wartoci),
main() nazwa metody, od ktrej rozpoczyna si dziaanie programu13, zdefiniowana wklasie PierwszyProgram,
(String[] args) argumenty metody main(); kod metody umieszczony jest
zawsze pomidzy nawiasami klamrowymi,
// ... komentarz wierszowy14, pomijany podczas kompilacji programu,
System.out uycie klasy System wraz ze standardowym strumieniem wyjciowym (skojarzonym domylnie zekranem monitora),
println() metoda umieszczajca acuch znakw wstrumieniu wyjciowym.

12

Modyfikatory dostpu zostay omwione szczegowo wdalszej czci pracy.

13

Metoda od ktrej rozpoczyna si dziaanie programu zawiera nagwek public static void
main(String[] args).

14

Istnieje jeszcze jeden rodzaj komentarza, tak zwany komentarz dokumentacyjny.


Stowarzyszenie Edukacja dla Przedsibiorczoci

56 Metody inarzdzia programowania

2.2.3. rodowisko uruchomieniowe


Proces przygotowania kodu programu, jego kompilacji iuruchomienia moe
zosta przeprowadzony przy uyciu wiersza polece lub zwykorzystaniem zintegrowanego rodowiska programistycznego (IDE). Wpierwszym przypadku
naley:
utworzy plik zkodem rdowym wdowolnym edytorze tekstowym:
notepad PierwszyProgram.java
skompilowa kod rdowy (powstanie plik zrozszerzeniem .class):
javac PierwszyProgram.java
uruchomi program:
java PierwszyProgram
Zintegrowane rodowisko programistyczne umoliwia wykonanie wszelkich czynnoci wchodzcych wskad procesu tworzenia programu, poczwszy
od utworzenia kodu rdowego, jego kompilacji do uruchomienia programu.
Wprzykadowym IDE JCreator proces ten sprowadza si do:
utworzenia pliku rdowego (File New File Java Classes Empty
Java File),
okrelenia nazwy ilokalizacji pliku,
edycji kodu programu woknie edycyjnym,
kompilacji kodu rdowego (Build Build File),
uruchomienia programu (Run Run File).
Program 1. Ustalenie wersji JDK
Jedn zpierwszych czynnoci warunkujcych tworzenie aplikacji jest sprawdzenie, jaka wersja narzdzi dostpna jest na komputerze, na ktrym tworzony bdzie program komputerowy. Wtym celu naley wywoa tryb wiersza polece15,
anastpnie uruchomi kompilator (javac16) oraz Wirtualn Maszyn Javy (java).
Poprawne uruchomienie programw powinno skutkowa wywietleniem listy
dostpnych parametrw. Zastosowanie parametru version umoliwia wywietlenie informacji onumerze wersji dostpnego kompilatora (javac) czy interpretera
(java).

Wsystemie operacyjnym Windows (2000, XP, Vista) zmenu Start naley wybra opcj
Uruchom, nastpnie wprowadzi komend cmd inacisn klawisz Enter.

15

Brak dostpu do kompilatora ztrybu wiersza polece moe by zwizany zbrakiem lub nieprawidowym zdefiniowaniem odpowiedniej cieki wzmiennej rodowiskowej PATH.

16

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 57

2.2.4. Stosowane konwencje


Tworzc program, dobrze jest przestrzega kilku prostych zasad dotyczcych
stosowanego nazewnictwa klas, metod czy zmiennych. Znacznie uatwia to pniejsz analiz kodu rdowego. Warto rwnie pamita, aby uywane nazwy
czytelnie identyfikoway elementy kodu programu, ajednoczenie nie byy przesadnie zwize17. Poniej przedstawione zostay wybrane zasady, ktrymi naley
si kierowa, tworzc kod programu.
Nazwy klas, interfejsw:
rozpoczynaj si zwielkiej litery,
nie zawieraj znaku podkrelenia ("_"),
kolejne wyrazy skadajce si na nazw, rozpoczynaj si zwielkiej litery,
przykady: Klient, KlientBanku.
Nazwy zmiennych imetod:
rozpoczynaj si od maej litery,
nie zawieraj znaku podkrelenia,
kolejne wyrazy skadajce si na nazw rozpoczynaj si zwielkiej litery,
nazwa metody powinna okrela czynno (zazwyczaj stosuje si par wyrazw czasownik-rzeczownik bd te sam czasownik),
przykady: cena, cenaTowaru, dodaj(), dodajPracownika().
Nazwy staych:
skadaj si wycznie zwielkich liter,
kolejne wyrazy oddzielane s znakiem podkrelenia,
przykady: PODATEK, PODATEK_VAT.
Szczegowe informacje na temat konwencji stosowanych wkodzie rdowym programw wjzyku Java (np. wcicia, komentarze itp.) dostpne s wsieci
Internet18.

17

Naley zwrci uwag, i skadnia jzyka Java rozrnia wielko stosowanych znakw (wielko liter).

18

Zobacz: Code Conventions for the Java Programming Language, http://www.oracle.com/technetwork/java/codeconv-138413.html (dostp 2011-04-14).
Stowarzyszenie Edukacja dla Przedsibiorczoci

58 Metody inarzdzia programowania

2.2.5. Wejcie iwyjcie


Standardowe wejcie iwyjcie zwizane jest zaplikacj, wktrej wydawane
s komendy (okno terminala). Przekazywanie danych do programu moe odbywa si za pomoc dodatkowych parametrw umieszczonych wwierszu polece
podczas wywoania programu bd te dostpnych klas pobierajcych dane od
uytkownika wtrakcie pracy programu (np. klasa Scanner). Wywietlanie informacji odbywa si dziki uyciu klas zwizanych ze standardowym strumieniem
wyjcia. Wykorzystywane s tu przede wszystkim metody print(), println() oraz
printf(), np. System.out.print("Java").

2.3. Typy danych, zmienne ioperatory


Program komputerowy skada si zsekwencji instrukcji, ktre wykonywane
s przez komputer dla realizacji zadania. Wskad instrukcji wchodz wyraenia
operujce na danych, reprezentowanych przez zmienne oraz literay. Rodzaj realizowanej operacji okrelony jest poprzez uycie operatorw.

2.3.1. Typy danych


Typ danych okrela rodzaj informacji oraz zakres dopuszczalnych wartoci, jakie moe przyjmowa staa, zmienna, argument wyraenia, parametr czy rezultat
metody. Jzyk Java definiuje typy proste (prymitywne) oraz typy zoone (obiektowe). Wprzypadku tych pierwszych wyrni mona19:
cakowite (int, short, long, byte),
zmiennoprzecinkowe (float, double),
znakowy (char),
logiczny (boolean),
pusty (void).
Rodzaj informacji oraz zakresy dopuszczalnych wartoci okrela specyfikacja
jzyka. Warto nadmieni, i sposb reprezentacji danych jest niezaleny od platformy systemowej, aco za tym idzie, zakres dopuszczalnych wartoci pozostaje
niezmienny niezalenie od platformy, na ktrej uruchamiany jest program.

Pena specyfikacja wystpujcych wjzyku programowania typw danych dostpna jest


wopracowaniu Primitive Data Types, http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html (dostp 2011-04-14).

19

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 59

2.3.2. Literay
Litera jest to cig znakw reprezentujcy warto zapisan bezporednio
wkodzie programu. Naley zwrci uwag na stosowanie dodatkowej symboliki
wcelu precyzyjnego okrelenia typu literau (293L, 293F). Poniej wymienione
zostay przykadowe wartoci:
"bordowy"
'K'
'\u0041'
293
49.6
0251
0x25
400L
2.45F
3.06D
9.72E4
true

//
//
//
//
//
//
//
//
//
//
//
//

acuch znakw
warto typu "char"
warto typu "char" wstandardzie "unicode" (przedrostek \u)
warto dziesitna typu "integer"
warto rzeczywista typu "double"
warto semkowa (przedrostek 0) typu "integer"
warto szestnastkowa (przedrostek 0x) typu "integer"
warto typu "long" (przyrostek L)
warto typu "float" (przyrostek F lub f)
warto typu "double" (przyrostek D lub d domylny)
zapis wykadniczy (symbol E lub e)
warto logiczna

Jzyk Java zawiera rwnie zbir znakw specjalnych (ang. escape characters): \b, \t, \f, \r, \n, \", \', \\, moliwych do zastosowania bezporednio
wkodzie programu:

System.out.println("Uniwersytet Ekonomiczny\nw Krakowie");

Program 2. Wyprowadzanie rezultatw na konsol


Efektem dziaania programu jest prezentacja uzyskanych rezultatw. Mog one
zosta skierowane na konsol czy te drukark. Poniszy przykad prezentuje metody wyprowadzania informacji na konsol zwykorzystaniem metody println.

Stowarzyszenie Edukacja dla Przedsibiorczoci

60 Metody inarzdzia programowania

public class OperacjePodstawowe {


public static void main(String[] args){
int i= 7;
System.out.println("Powie \"Wojna ipokj\" Lwa Tostoja");
System.out.println("64kB to " + 0xFFFF + " bitw");
System.out.println("Czy 32 > 15 ? " + (32>15 ? "tak" : "nie") );
System.out.println("\\u0042 (unicode) reprezentuje znak \u0042");
System.out.println("7 * (2 do potgi 3) = " + (7 << 3) );
System.out.println("Cz cakowita 2.56 wynosi " + (int) 2.56);
System.out.println("7/2 = " + 7/2 + ", ale dlaczego?");
System.out.println("Adlaczego 7/2d = " + 7/2d + " ?");
System.out.println("Reszta zdzielenia 10/6 = " + 10%6);
System.out.println("Wartoi=" + i+ ", a++i=" + (++i));
System.out.println("Gdy teraz wykonamy operacji*=9 toi=" + (i*=9));
}
}

2.3.3. Stae izmienne


Zmienna20 okrela obszar pamici przeznaczony do przechowywania danych.
Kada zmienna posiada nazw oraz typ, ktry okrela zakres dopuszczalnych wartoci oraz rodzaj moliwych do przeprowadzenia operacji. Zmienne prymitywne
okrelaj obszar pamici przechowujcy dane typu podstawowego. Natomiast
zmienne obiektowe, oktrych bdzie mowa wkolejnych rozdziaach, zawieraj
referencje (wskazania) do utworzonych wczeniej obiektw. Jzyk Java wymaga
deklaracji (okrelenia nazwy oraz typu) kadej zmiennej przed jej pierwszym uyciem. Pierwszy odczyt wartoci zmiennej powinien by poprzedzony jej inicjalizacj, czyli przypisaniem wartoci pocztkowej. Poniej zamieszczone zostay
przykady ich uycia.

int liczbaPojazdow;
double rataKredytu;
liczbaPojazdow = 4;
rataKredytu = 330.58;
double stopaProcentowa = 0.04;

//
//
//
//
//

deklaracja (okrelenie nazwy itypu zmiennej)


deklaracja
inicjalizacja (nadanie wartoci zmiennej)
inicjalizacja
jednoczesna deklaracja iinicjalizacja

Java wyrnia 4 kategorie zmiennych: obiektowe (ang. instance variables) unikalne dla
kadej instancji klasy, klasowe (ang. class variables) jednakowe dla wszystkich instancji
klasy, lokalne (ang. local variables) suce do tymczasowego przechowywania wartoci
oraz parametry, zadaniem ktrych jest przekazywanie wartoci do metody.

20

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 61


Podobnie jak zmienna, staa okrela obszar pamici operacyjnej, sucy do
przechowywania danych. Posiada nazw oraz typ dopuszczalnych wartoci, jakie
moe przyjmowa. Wprzypadku staej nie jest moliwa zmiana ju raz nadanej
wartoci wtrakcie dziaania programu. Deklaracja staej poprzedzona jest sowem
kluczowym final:
final double KURS_EURO = 2.48;
final String NAZWA_UCZELNI = "Uniwersytet Ekonomiczny";
final String MIEJSCOWOSC = "Krakw";
System.out.println(NAZWA_UCZELNI + " " + MIEJSCOWOSC);

Program 3. Formatowanie rezultatw


Zamieszczony poniej kod programu przedstawia przykadowe sposoby formatowania21, zarwno cigu znakw, jak iwartoci numerycznych woparciu
oklas java.text.MessageFormat.
import java.text.MessageFormat;
import java.util.Date;
public class FormatowanieRezultatow {
public static void main(String[] args){
String s;
Date teraz = new Date();
String miejsce = "Krakw";
int mila = 1852;
double vat = 0.22;
double cena = 31560.76;










}
}

21

s = MessageFormat.format("{0}, {1,date,full}, godz. {1,time,short}", miejsce, teraz);


System.out.println(s);
s = MessageFormat.format("{0}kB to {1}B", 256,256*1024);
System.out.println(s);
s = MessageFormat.format("{0} x {0} x {0} = {1}", 7, 7*7*7);
System.out.println(s);
s = MessageFormat.format("{0,number,currency} + VAT({1,number,percent})", cena, vat);
System.out.println(s);
s = MessageFormat.format("{0} {1} to wprzyblieniu {2}m", 1, "mila morska", mila);
System.out.println(s);

Osoby preferujce styl formatowania dostpny wjzykach C oraz C++ (funkcja printf), mog
skorzysta znarzdzi zawartych wklasie java.util.Formatter.
Stowarzyszenie Edukacja dla Przedsibiorczoci

62 Metody inarzdzia programowania

2.3.4. Operatory
Operatory22 wjzyku programowania to zestaw symboli okrelajcych rodzaj
wykonywanej operacji na argumencie lub argumentach wyraenia. Dokonujc
klasyfikacji ich podziau, wyrni mona operatory:
przypisania: = += -= *= /= %= &= ^= |= <<= >>= >>>=
arytmetyczne23: + - * / %
jednoargumentowe: + - ++ -- !
relacji: == != > >= < <= instanceof
warunkowe: && || ?:
bitowe: ~ << >> >>> & ^ |
Naley zwrci uwag, i sposb uycia operatorw zaleny jest od typu
argumentu (argumentw), natomiast kolejno wykonywania operacji wynika
zpriorytetu, jaki posiadaj operatory. Zmiana kolejnoci wykonywania operacji
realizowana jest przez zastosowanie nawiasw. Ponisze wyraenia przedstawiaj
przykadowe wykorzystanie operatorw:
komputerPrzenosny = true;
komputerStacjonarny = !komputerPrzenosny;
dystans -= 24;
i++;
iloczynSumy = (1+2)*(3+4);
delta = b*b 4*a*c;
poleKola = 3.14 * r * r;
sredniaOcen = (ocenaBiologia + ocenaFizyka + ocenaHistoria) / 3;

Program 4. Podstawowe operacje arytmetyczne


Przekazanie danych do programu moe odbywa si na kilka sposobw.
Mog one zosta odczytane zpliku, wprowadzone przez uytkownika za pomoc klawiatury czy te umieszczone wwierszu polece podczas uruchamiania
programu. Wprzypadku tej ostatniej moliwoci dostp do danych realizowany
jest poprzez odczytanie zawartoci tablicy args. Wartoci poszczeglnych komrek tablicy zawieraj kolejne wartoci umieszczone wwierszu polece. Poniszy program demonstruje uycie wiersza polece do przekazywania danych
do programu. Podczas jego wywoania zostanie wyznaczona suma wartoci
Zobacz: Operators, http://download.oracle.com/javase/tutorial/java/nutsandbolts/operators.
html (dostp 2011-04-14).

22

Operator dzielenia daje wwyniku warto cakowit (bez reszty), jeli obydwa argumenty s
liczbami cakowitymi. Wpozostaych przypadkach wartoci jest liczba rzeczywista.

23

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 63


dwch liczb cakowitych umieszczonych wwierszu polece podczas uruchamiania programu.
/*
* Przykadowe wywoanie programu:
* java OperacjeArytmetyczne 523 -68
*/
public class OperacjeArytmetyczne {
public static void main(String[] args){
// odczyt oraz konwersja liczb do postaci numerycznej
int liczbaA = Integer.parseInt(args[0]);
int liczbaB = Integer.parseInt(args[1]);
// wywietlenie rezultatw na konsoli
System.out.print("A= " + liczbaA);
System.out.println(", B = " + liczbaB);
System.out.println("A+ B = " + (liczbaA+liczbaB));
}
}

2.3.5. Konwersja irzutowanie typw


Jeli argumenty wyraenia nie s zgodnych typw, zachodzi konieczno dokonania konwersji typu. Gdy przebiega ona bez utraty informacji, wykonywana
jest niejawnie. Jeli moe prowadzi do utraty informacji, konieczne jest wykonanie rzutowania jawnego:

byte x = 17;
int y = x;
//niezgodno typw (konwersja niejawna)
double a= 15.4;
int b = (int)a;
//niezgodno typw (moliwa utrata informacji,
//wymagane rzutowanie)

Stowarzyszenie Edukacja dla Przedsibiorczoci

64 Metody inarzdzia programowania


Program 5. Rzutowanie typw
Jednym zatrybutw danych wystpujcych wjzykach programowania jest
okrelenie typu. Odnosi si ono bezporednio do sposobu fizycznej reprezentacji
danych, wktrej cig bitw odpowiada przedstawianej wartoci. Podczas tworzenia programw czsto zachodzi konieczno wykonania operacji na danych
rnych typw czy te potraktowania danych wodmienny sposb. Czynnoci te
mog zosta zrealizowane poprzez zastosowanie konwersji typw.
Poniszy przykad stanowi program dokonujcy konwersji temperatury wyraonej wstopniach Celsjusza na temperatur wstopniach Fahrenheita oraz Kelvina. Warto temperatury wstopniach Celsjusza wprowadzana jest zklawiatury.
Wyznaczone wartoci temperatury wstopniach K iF prezentowane s jako wartoci cakowite, co zostao uzyskane poprzez wykonanie operacji rzutowania do
typu int.
import java.util.Scanner;
public class KonwerterTemperatur {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);

// odczytaj warto temperatury wstopniach Celsjusza
System.out.print("Podaj warto temperatury wstopniach Celsjusza: ");
double tempC = sc.nextInt();
// Celsjusz

// oblicz warto temperatury na pozostaych skalach
double tempF = 32 + (9/5d)*tempC;
// Fahrenheit
double tempK = tempC + 273.15;
// Kelvin

// wywietl rezultaty oblicze, zdokadnoci do penych stopni
System.out.println("* temperatura wstopniach C: " + (int)tempC);
System.out.println("* temperatura wstopniach F: " + (int)tempF);
System.out.println("* temperatura wstopniach K: " + (int)tempK);
}
}

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 65

2.3.6. acuchy znakw


acuch to cig (sekwencja) znakw zawarty wobiekcie lub literale typu
String24:
String osoba = "Joanna Kowalski"; // deklaracja oraz inicjalizacja zmiennej typu String

Okrelenie liczby znakw zmiennej lub literau typu String moliwe jest dziki metodzie length():
String nazwaProduktu = "Telefon komrkowy Sony-Ericsson K800i";
System.out.println("Liczba znakw: " + nazwaProduktu.length());
System.out.println("Liczba znakw: " + "Programowanie rozproszone".length());

Klasa java.lang.String zawiera metody umoliwiajce manipulowanie znakami wacuchu, porwnywanie acuchw25, przeszukiwanie, wyodrbnianie podcigu, tworzenie kopii znakw, zamian znakw na wielkie/mae litery
woparciu ostandard Unicode26 czy konwersj wartoci numerycznych do postaci
cigu znakw.
String rezultat;
String adres = "ul.Szeroka";
rezultat = "ul.Kwiatowa".equals("ul.Kwiatowa") ? "adres zgodny" : "adres inny";
System.out.println(rezultat);
rezultat = "ul.Kwiatowa".equals(adres) ? "adres zgodny" : "adres inny";
System.out.println(rezultat);

24

Moliwe jest rwnie utworzenie obiektu String przy uyciu operatora new (zobacz dostpne
konstruktory klasy String).

25

Ze wzgldu na sposb reprezentacji danych zaleca si uycie metody equals() do porwnywania acuchw znakwwmiejsce operatora porwnania ==.

26

Komputerowy standard przemysowy przeznaczony do kodowania znakw wykorzystywanych wwikszoci uywanych wwiecie jzykw pisanych.
Stowarzyszenie Edukacja dla Przedsibiorczoci

66 Metody inarzdzia programowania


Program 6. Operacje na acuchach znakowych
Wprzeciwiestwie do int, char czy double, String jest typem obiektowym.
Udostpnia on liczny zbir metod umoliwiajcych przeprowadzenie operacji na
acuchach znakowych. Charakterystyka tych metod dostpna jest wAPI Java.
Przykadowe wykorzystanie kilku znich zawarte jest wponiszym programie.
Realizuje on funkcj zamiany dowolnego cigu znakw odczytanego zkonsoli27
na wielkie litery.
import java.util.Scanner;

public class WielkieLitery {


public static void main(String[] args){



// pobranie tekstu zkonsoli


Scanner sc = new Scanner(System.in);
System.out.print("Wprowad dowolny tekst: ");
String tekst = sc.nextLine();

// wywietlenie tekstu, poprzez konwersj na wielkie litery


System.out.println(tekst.toUpperCase());
}
}

Odczyt danych zkonsoli moe by zrealizowany rwnie innymi metodami, przykadowo


przy wykorzystaniu klasy java.io.Console. Zobacz:I/Ofrom the Command Line, http://download.oracle.com/javase/tutorial/essential/io/cl.html (dostp 2011-04-14).

27

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 67

2.3.7. Tablice
Tablice reprezentuj kontener sucy do przechowywania dowolnej liczby
wartoci pojedynczego typu. Liczba elementw tablicy jest okrelona wmomencie jej tworzenia inie moe zosta zmieniona wtrakcie dalszego dziaania
programu. Kady element posiada kolejny numer (indeks28) umoliwiajcy zapis
iodczyt danych:
//# tablice jednowymiarowe
// deklaracja zmiennej tablicowej
double[] cenaArtykulu;
// deklaracja zmiennej tablicowej (nazwa ityp elementw)
String[] cechaCharakteru; // deklaracja zmiennej tablicowej
int[] rzutKostka;
// utworzenie tablicy (okrelenie liczby jej elementw)
cenaArtykulu = new double[50];
cechaCharakteru = new String[3];
rzutKostka = new int[8];
// jednoczesna deklaracja zmiennej tablicowej oraz utworzenie tablicy
String[] srodekTransportu = new String[2];
// jednoczesna deklaracja zmiennej, utworzenie tablicy 3-elem. oraz nadanie wartoci
String[] sygnalizator = {"czerwony", "ty", "zielony"};
// dostp do elementw tablicy (przypisanie iodczytwartoci)
cenaArtykulu[17] = 328.50;
cenaArtykulu[25] = 29.0;
double razem = cenaArtykulu[17] + cenaArtykulu[25];
rzutKostka[7] = 3;
cechaCharakteru[0] = "komunikatywno";
cechaCharakteru[2] = "asertywno";
srodekTransportu[1] = "rower";
System.out.println(sygnalizator[2]);
//# tablice wielowymiarowe
// deklaracja oraz inicjalizacja tablicy dwuwymiarowej
int[][] tabliczkaMnozenia = {{1,2,3},{2,4,6},{3,6,9}};
System.out.println(tabliczkaMnozenia[2][0]);

28

Numeracja elementw tablicy rozpoczyna si od indeksu 0.


Stowarzyszenie Edukacja dla Przedsibiorczoci

68 Metody inarzdzia programowania


Wcelu okrelenia liczby elementw tablicy naley odczyta warto pola
length:
String[] koloryTeczy =
{"czerwony", "pomaraczowy", "ty", "zielony", "niebieski", "fioletowy"};
int liczbaKolorowTeczy = koloryTeczy.length;

Kopiowanie danych pomidzy tablicami moliwe jest dziki dostpnej metodzie java.lang.System.arraycopy(). Istnieje pokana liczba metod umoliwiajcych manipulowanie na tablicach, realizujcych operacje sortowania czy przeszukiwania elementw. Metody te zostay zgrupowane wklasie java.util.Arrays.
Program 7. Parametry wiersza polece
Jak ju zostao wspomniane wczeniej, wartoci parametrw wiersza polece
podane wmomencie wywoania programu dostpne s wtablicy args, przekazanej jako argument metody main(). Poniszy przykad demonstruje wyprowadzenie
na konsol danych (nazwiska, imienia oraz adresu zamieszkania) wprowadzonych
do programu przy jego uruchomieniu poprzez wiersz polece.

/*
* Przykadowe wywoanie programu:
* java ParametryWierszaPolecen Kowalewski Eugeniusz "ul. Szeroka 15 m.3"
*/
public class ParametryWierszaPolecen {
public static void main(String[] args){
System.out.println("nazwisko: " + args[0]);
System.out.println("imi " + args[1]);

System.out.println("adres: " + args[2]);

}
}

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 69


Program 8. Operacje na tablicach
Zapis lub odczyt danych zposzczeglnych komrek tablicy moliwy jest przez
wykorzystanie indeksu wskazujcego na konkretn komrk. Ilustracj tych czynnoci jest poniszy program, wskad ktrego wchodzi tablica acuchw znakowych zawierajca podstawowe jednostki ukadu SI (jednostki[]). Rezultatem
dziaania aplikacji jest wyprowadzenie na konsol jednostek temperatury, masy
idugoci.

public class JednostkiSI {


public static void main(String[] args){
String[] jednostki = {"kg", "cd", "s", "A", "K", "mol", "m"};
System.out.println("Jednostki podstawowe ukadu SI");
System.out.println("=================================");
System.out.println("Jednostka temperatury (kelvin): " + jednostki[4]);
System.out.println("Jednostka masy (kilogram): " + jednostki[0]);
System.out.println("Jednostka dugoci (metr): " + jednostki[jednostki.length-1]);
System.out.println("---------------------------------");
System.out.println("Liczba jednostek: " + jednostki.length);
}
}

2.3.8. Typ wyliczeniowy


Typ wyliczeniowy skada si zustalonego, skoczonego zbioru staych wartoci (egzemplarzy typu). Kady zegzemplarzy pozostaje niezmienny wtrakcie
dziaania programu. Std, zgodnie zkonwencj, identyfikatory egzemplarzy powinno tworzy si przy pomocy wielkich liter iznaku podkrelenia.
enum Dzien {PN,WT,SR,CZ,PT,SB,ND};
Dzien dzienPracy = Dzien.WT;
Dzien dzienWolny = Dzien.SB;
System.out.println(dzienPracy!=dzienWolny);

Stowarzyszenie Edukacja dla Przedsibiorczoci

70 Metody inarzdzia programowania

2.4. Sterowanie przebiegiem wykonania programu


Instrukcje wchodzce wskad programu komputerowego wykonywane s
najczciej sekwencyjnie, poczwszy od pierwszej, askoczywszy na ostatniej
znich. Jednake zoone zadania obliczeniowe wymagaj czstokro czenia instrukcji wgrupy, warunkowego przetwarzania czy te wielokrotnego ich powtarzania dla realizacji zadania. Std prawie kady jzyk programowania zaopatrzony
jest wzbir instrukcji sterujcych, majcych za zadanie umoliwi skonstruowanie programu zgodnie zrealizowanym algorytmem29. Jzyk Java wyrnia 5 instrukcji sterujcych: while, do..while, for, if, switch, zadaniem ktrych jest
umoliwienie rozwizywania wielorakich problemw, przed ktrymi stoi twrca
programu.

2.4.1. Blok instrukcji


Praktyka programowania pokazuje, i czsto zachodzi konieczno zbiorczego przetwarzania instrukcji wchodzcych wskad realizowanego programu. Tak
funkcjonalno zapewnia blok instrukcji. Umoliwia on ich grupowanie poprzez
ujcie wznaki nawiasw klamrowych {}:
{
instrukcje;
}

Wewntrz bloku moliwe jest umieszczenie deklaracji zmiennych. Naley


jednak zwrci uwag, i zmienne te widoczne bd wycznie wewntrz tego
bloku nie bdzie moliwe odwoanie do zmiennych poza blokiem, wktrym zostay zadeklarowane. Rwnie prba deklaracji zmiennej wewntrz bloku, ktrej
nazwa jest identyczna zistniejc zmienn poza blokiem, spowoduje powstanie
bdu kompilacji.
{
String nrTelefonu = "555302 197";
System.out.println(nrTelefonu);
}
System.out.println(nrTelefonu); // zmienna niedostpna - poza blokiem instrukcji

Algorytm to, wuproszczeniu, skoczony, uporzdkowany cig czynnoci niezbdnych do realizacji zadania.

29

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 71

2.4.2. Instrukcja warunkowa


Ten rodzaj instrukcji sterujcej umoliwia warunkowe wykonanie pojedynczej
instrukcji lub bloku instrukcji programu wzalenoci od wartoci wyraenia logicznego. Jeli wyraenie logiczne jest prawdziwe (przyjmuje warto true), to wykonaniu podlega bd instrukcje programu wystpujce wewntrz bloku instrukcji30
if. Wprzypadku gdy wyraenie logiczne przyjmie warto false, adna zinstrukcji umieszczonych wbloku instrukcji nie zostanie wykonana.
if (wyraenie_logiczne) {
instrukcje;
}

Wponiszym przykadzie obydwie instrukcje programu umieszczone wbloku


instrukcji zostan wykonane jedynie wprzypadku, gdy warto zmiennej x bdzie
rna od 0.
int x = 5;
if (x != 0) {
x *= 3;
y = x + 4;
}

// wyraenie logiczne przyjmuje warto true


// zatem obydwie instrukcje zostan wykonane

Dostpna jest rwnie wersja instrukcji warunkowej if uwzgldniajca sytuacj alternatywn. Dodatkowy blok instrukcji umieszczony po klauzuli else zostanie wykonany jedynie wtedy, gdy wyraenie logiczne przyjmie warto false.

if (wyraenie_logiczne) {
instrukcje1;
} else {
instrukcje2;
}

Poniszy przykad demonstruje zastosowanie klauzuli else. Blok instrukcji


wystpujcy po klauzuli else zostanie wykonany jedynie wtedy, gdy warto x
bdzie rwna lub mniejsza od 0.
30

Gdy instrukcja warunkowa if zawiera wycznie jedn instrukcj programu, wtedy stosowanie bloku instrukcji (uycie pary nawiasw klamrowych {}) nie jest wymagane.
Stowarzyszenie Edukacja dla Przedsibiorczoci

72 Metody inarzdzia programowania

int x = 0;
if (x > 0) {
x = 2*x+4;
} else {
x = x 5;
y = 2*x;
}

// wyraenie logiczne przyjmuje warto false


// zatem instrukcja nie zostanie wykonana
// obydwie instrukcje zostan wykonane

Wprzypadku gdy liczba warunkw podlegajcych sprawdzeniu jest dua,


moliwe jest stosowanie zagniedania instrukcji warunkowych:
int x = 5;
if (x > 0) {
System.out.println("Dodatnia warto x");
} else if (x < 0) {
System.out.println("Ujemna warto x");
} else {
System.out.println("Warto x wynosi 0");
}

Program 9. Sprawdzanie wartoci liczby


Wykorzystujc instrukcj warunkow, program sprawdza, czy odczytana zkonsoli
liczba naturalna jest parzysta. Uyta zostaa wtym celu instrukcja warunkowa if.
import java.util.Scanner;
public class LiczbaParzysta {
public static void main(String[] args) {
int liczbaNaturalna;
// analizowana warto
/* pobierz liczb zkonsoli */
Scanner sc = new Scanner(System.in);
System.out.print("Wprowad dowoln liczb naturaln: ");
liczbaNaturalna = sc.nextInt();
/* sprawd, czy liczba jest parzysta (podzielna przez 2 bez reszty) */
boolean liczbaParzysta = liczbaNaturalna % 2 == 0 ? true : false;
/* wywietl rezultat na konsoli */
if (liczbaParzysta) {
System.out.printf("Liczba %d jest parzysta", liczbaNaturalna);
} else {
System.out.printf("Liczba %d jest nieparzysta", liczbaNaturalna);
}
}
}
Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 73


Program 10. Wyznaczanie pierwiastkw rwnania kwadratowego
Rwnanie kwadratowe jest rwnaniem algebraicznym zjedn niewiadom postaci ax2+bx+c=0. Zadaniem programu jest wyznaczenie pierwiastkw rwnania
kwadratowego. Zastosowana metoda sqrt() pozwala na wyznaczenie wartoci
pierwiastka kwadratowego (klasa java.lang.Math).
import java.util.Scanner;
public class RownanieKwadratowe {
public static void main(String[] args) {
double x1, x2; // pierwiastki rwnania
// odczytanie wspczynnikw rwnania zkonsoli
Scanner sc = new Scanner(System.in);
System.out.println("Wspczynniki rwnania kwadratowego");
System.out.println("postaci ax2 + bx + c = 0");
System.out.print("a= ");
double a= sc.nextDouble();
System.out.print("b = ");
double b = sc.nextDouble();
System.out.print("c = ");
double c = sc.nextDouble();
// jeden pierwiastek rwnania
if( a== 0) {
x1 = -c/b;
System.out.printf("Pierwiastek rwnania: x = %s", x1);
return;
}
// wyznaczenie wyrnika rwnania
double delta = b*b - 4*a*c;
// wyznaczenie wartoci pierwiastkw rwnania
if (delta > 0) {
x1 = (-b - Math.sqrt(delta))/(2*a);
x2 = (-b + Math.sqrt(delta))/(2*a);
System.out.printf("Pierwiastki rwnania: x1 = %s, x2 = %s", x1, x2);
} else if (delta == 0) {
x1 = -b / (2*a);
System.out.printf("Pierwiastek rwnania: x = %s", x1);
} else {
System.out.println("Brak pierwiastkw rwnania!");
}
}
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

74 Metody inarzdzia programowania

2.4.3. Instrukcja wielokrotnego wyboru


Wprzypadku gdy liczba warunkw podlegajcych sprawdzeniu jest znaczna,
stosowanie instrukcji ifelse moe sta si nieporczne. Wtakiej sytuacji moliwe jest uycie instrukcji wielokrotnego wyboru switch. Jej dziaanie polega na
wyznaczeniu wartoci wyraenia, anastpnie porwnaniu tej wartoci zwymienionymi po klauzulach case wartociami staych. Wprzypadku rwnoci sterowanie przekazywane jest do instrukcji wystpujcej po klauzuli case, dla ktrej
warto staej jest zgodna zwartoci wyraenia. Jeli adna rwno nie zachodzi, wykonywane s instrukcje wystpujce po sowie kluczowym default lub
kolejne instrukcje programu, gdy klauzula ta nie zostaa uyta. Instrukcja break
umoliwia przerwanie wykonywania instrukcji switch iprzeniesienie sterowania
do kolejnych instrukcji programu wystpujcych po instrukcji switch.
switch (wyraenie) {
case warto1:
instrukcje1;
break;
case warto2:
instrukcje2;
break;
case wartoN:
instrukcjeN;
break;
default:
instrukcje;
}

// cz opcjonalna instrukcji switch

Poniszy przykad ilustruje uycie instrukcji wielokrotnego wyboru. Wzalenoci od wartoci, jak przyjmuje zmienna poraRoku, na konsol zostanie wyprowadzony stosowny napis.

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 75

char poraRoku = 'Z';


switch(poraRoku) {
case 'W':
System.out.println("wiosna");
break;
case 'L':
System.out.println("lato");
break;
case 'J':
System.out.println("jesie");
break;
case 'Z':
// warto staej zgodna
zwartoci wyraenia
System.out.println("zima");
// instrukcja zostanie wykonana
break;
// instrukcja zostanie wykonana
default:
System.out.println("symbol nieprawidowy");
}

Program 11. Reprezentacja sowna wartoci numerycznej


Ocena stanowi umowny sposb zakwalifikowania postpw ucznia lub studenta. Moe zosta przedstawiona wzapisie symbolicznym (np. cyfry od 1 do 6)
lub sownym. Poniszy program prezentuje sowny zapis oceny (celujcy, bardzo
dobry, dobry, dostateczny, mierny, niedostateczny) jako reprezentacj jej wartoci
numerycznej. Wyprowadzenie zapisu sownego oceny na konsol zostao zrealizowane dziki uyciu instrukcji wielokrotnego wyboru.

Stowarzyszenie Edukacja dla Przedsibiorczoci

76 Metody inarzdzia programowania

import java.util.Scanner;
public class OcenaSlownie {
public static void main(String[] args) {
// odczytanie danych zkonsoli
Scanner sc = new Scanner(System.in);
System.out.print("ocena (1..6): ");
int n = sc.nextInt();
// wywietlenie oceny
System.out.print("ocena " + n + " ");
switch(n) {
case 1:
System.out.println("niedostateczny");
break;
case 2:
System.out.println("mierny");
break;
case 3:
System.out.println("dostateczny");
break;
case 4:
System.out.println("dobry");
break;
case 5:
System.out.println("bardzo dobry");
break;
case 6:
System.out.println("celujcy");
break;
default:
System.out.println("nieprawidowa!");
}
}
}

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 77

2.4.4. Ptle nieokrelone


Instrukcje iteracyjne (ptle) umoliwiaj wielokrotne wykonywanie pojedynczej instrukcji lub bloku instrukcji. Wprzypadku gdy nie jest zgry znana
liczba powtrze, stosowane s ptle nieokrelone. Jedn znich jest instrukcja while, ktrej dziaanie polega na wyznaczeniu wartoci wyraenia logicznego. Jeli wyraenie to przyjmuje warto prawdy (true), wykonywany jest
blok instrukcji wystpujcy po wyraeniu, anastpnie ponownie obliczana jest
warto wyraenia logicznego. Blok instrukcji bdzie wykonywany wielokrotnie do momentu gdy wyraenie logiczne nie przyjmie wartoci false. Wtedy
sterowanie zostanie przekazane do kolejnej instrukcji programu, wystpujcej po
instrukcji while.
while (wyraenie_logiczne) {
instrukcje;
}

Poniszy kod programu przedstawia przykad uycia instrukcji iteracyjnej


while. Blok instrukcji programu bdzie wykonywany do momentu, a zmienna
x nie przyjmie wartoci mniejszej od 0 (wtym przypadku blok instrukcji zostanie wykonany omiokrotnie). Naley zwrci uwag, i zwykle konieczna jest
modyfikacja wartoci wyraenia logicznego wewntrz bloku instrukcji, aby moliwe byo zakoczenie wykonywania instrukcji while wskoczonej liczbie powtrze.
int x = 7;
while (x >= 0) {
x--;
// obydwie instrukcje wchodzce wskad bloku instrukcji
System.out.println(x); // zostan wykonane omiokrotnie
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

78 Metody inarzdzia programowania


Odmian instrukcji while jest ptla nieokrelona do..while, ktrej dziaanie jest
zblione. Jedyna rnica polega na wyznaczaniu wartoci wyraenia logicznego
dopiero po wykonaniu bloku instrukcji. Zatem, wprzeciwiestwie do instrukcji
while, blok instrukcji zostanie wykonany przynajmniej jeden raz.
do {
instrukcje;
} while (wyraenie_logiczne);

Program 12. Okrelanie liczby monet


Przyjmujc zaoenie, i wobiegu znajduj si monety 1, 2 i5 z, poniszy
kod programu realizuje zadanie przedstawienia dowolnej kwoty, wyraonej liczb
naturaln zprzedziau <1,1000> za pomoc jak najmniejszej liczby monet. Zastosowana instrukcja iteracyjna do kontroluje wprowadzan przez uytkownika
warto, aby miecia si ona wzadanym przedziale.
import java.util.Scanner;
public class Monety {
public static void main(String[] args) {
int kwota;
Scanner sc = new Scanner(System.in);
// pobranie kwoty zkonsoli
do {
System.out.print("Podaj kwot wz (1..1000): ");
kwota = sc.nextInt();
} while (kwota < 1 || kwota > 1000);
// wyznaczenie najmniejszej moliwej liczby monet
System.out.println("-----------------------");
System.out.println("monety 5z: " + kwota/5);
System.out.println("monety 2z: " + (kwota%5)/2);
System.out.println("monety 1z: " + (kwota%5)%2);
}
}

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 79

2.4.5. Ptle okrelone


Jeli znana jest zgry liczba powtrze, moliwe jest uycie instrukcji iteracyjnej for. Jej dziaanie polega na ustaleniu wartoci pocztkowej, okrelajcej pocztek iteracji. Wykonanie bloku instrukcji jest uwarunkowane wartoci
wyraenia logicznego. Jeli jest ono prawdziwe (warto true), blok instrukcji
jest wykonywany, anastpnie wykonywane jest wyraenie modyfikujce ustalon
warto pocztkow. Wkolejnym kroku ponownie sprawdzana jest warto wyraenia logicznegoiwprzypadku wartoci true wykonywany jest blok instrukcji
programu. Opisane czynnoci s powtarzane do momentu, gdy wyraenie logiczne przyjmie warto false. Wtedy sterowanie programu przekazane zostaje do
kolejnych instrukcji wystpujcych po instrukcji for.

for (warto_pocztkowa; wyraenie_logiczne; wyraenie_modyfikujce) {


instrukcje;
}

Wponiszym przykadzie blok instrukcji programu wystpujcy winstrukcji


iteracyjnej for zostanie wykonany omiokrotnie, wywietlajc kadorazowo na
konsoli warto zmienneji.
for (inti=5;i<=12;i++) {
System.out.print("Wartoi=");
System.out.println(i);
}

Jedn zodmian instrukcji for jest konstrukcja programowa, umoliwiajca


wykonanie bloku instrukcji programu dla kadego elementu tablicy31. Wkadej
iteracji zmienna element przyjmuje warto kolejnego przetwarzanego elementu
tablicy. Liczba iteracji jest rwna wtym przypadku liczbie elementw przetwarzanej tablicy.
for (element : tablica) {
instrukcje
}

31

Instrukcji for mona uy do wszystkich obiektw stanowicych kolekcj elementw.


Stowarzyszenie Edukacja dla Przedsibiorczoci

80 Metody inarzdzia programowania


Poniszy przykad wywietla na konsoli woddzielnych wierszach wszystkie
wartoci elementw tablicy poraDnia.
String[] poraDnia = {"wit","zmierzch","mrok"};
for (String pora : poraDnia) {
System.out.println(pora);
}

Program 13. Wyznaczanie silni


Silnia liczby naturalnej N to iloczyn wszystkich liczb naturalnych nie wikszych ni N. Poniszy program, wykorzystujc instrukcj iteracyjn for, umoliwia wyznaczenie wartoci silni dla zadanego N, odczytanego zkonsoli.
import java.util.Scanner;
public class Silnia {
public static void main(String[] args) {
long silnia = 1;
// odczytanie danych zkonsoli
Scanner sc = new Scanner(System.in);
System.out.print("Liczba naturalna (1..20): ");
int n = sc.nextInt();
// oblicz warto silni
for (inti=1;i<=n;i++) {
silnia *=i;
}
// wywietlenie rezultatw
System.out.println(n + "! = " + silnia);
}
}

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 81


Program 14. Porzdkowanie danych
Jednym ze sposobw uporzdkowania danych jest wykorzystanie metody sort
zawartej wklasie java.util.Arrays. Poniszy program, wykorzystujc t metod,
tworzy, porzdkuje iwywietla na konsoli dowoln liczb wartoci naturalnych
zprzedziau [a,b].
import java.util.Scanner;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// okrelenie dopuszczalnych wartoci liczbowych
System.out.println("Generator n liczb pseudolosowych zprzedziau [a,b]");
System.out.println("===================================================");
System.out.print("ilo liczb (n): ");
int n = sc.nextInt();
System.out.print("warto minimalna (a): ");
int a= sc.nextInt();
System.out.print("warto maksymalna (b): ");
int b = sc.nextInt();

// utworzenie zbioru liczb naturalnych zprzedziau [a,b]


long[] zbiorLiczb = new long[n];
for (inti=0;i<zbiorLiczb.length;i++) {
zbiorLiczb[i] = a+ (int)(Math.random()*(b-a+1));
}
// wywietlenie liczb nieuporzdkowanych
System.out.printf("liczby nieuporzdkowane (%d..%d): ",a, b);
for (long x : zbiorLiczb) {
System.out.print(x + " ");
}
System.out.println();

// uporzdkowanie liczb
Arrays.sort(zbiorLiczb);
// wywietlenie uporzdkowanych liczb
System.out.printf("liczby uporzdkowane (%d..%d): ",a, b);
for (long x : zbiorLiczb) {
System.out.print(x + " ");
}
System.out.println();
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

82 Metody inarzdzia programowania

2.4.6. Przerywanie dziaania instrukcji sterowania


Jzyk Java umoliwia sterowanie wykonaniem instrukcji iteracyjnych. Instrukcja break umieszczona wewntrz bloku instrukcji powoduje zakoczenie wykonywania iteracji iprzeniesienie sterowania do instrukcji programu wystpujcej
po instrukcji iteracyjnej. Natomiast instrukcja continue przerywa biec iteracj, przekazujc sterowanie do miejsca, gdzie wyznaczana jest warto wyraenia
logicznego kontrolujcego wykonywanie ptli. Poniszy przykad zuyciem instrukcji continue wywietla na konsoli wycznie cyfry zbadanego cigu znakw
(zmienna nrDowoduOsobistego).
for (inti=0;i<nrDowoduOsobistego.length();i++){
// gdy znak nie jest cyfr, pobranie kolejnego znaku
if (!Character.isDigit(nrDowoduOsobistego.charAt(i)))
continue;
// wywietlenie cyfry na konsoli
System.out.print(nrDowoduOsobistego.charAt(i));
}

2.5. Dekompozycja programu


Wprzypadku zoonych programw zawierajcych szereg instrukcji zwykle
dokonuje si jego podziau na mniejsze czci, funkcjonalnie spjne irealizujce
okrelone zadania. Takie wydzielone logicznie fragmenty programu nosz nazw
podprogramw32. Pozwalaj one zjednej strony na zwikszenie czytelnoci tworzonego kodu programu, zdrugiej za na wielokrotne wykorzystanie utworzonych
wczeniej zbiorw instrukcji. Wprzypadku jzyka obiektowego, podprogramy reprezentowane s poprzez metody zawarte wuprzednio zdefiniowanych klasach.
Java jest jzykiem silnie ukierunkowanym na obiektowo. Tworzenie programw woglnym zarysie polega na tworzeniu obiektw na bazie klas oraz wykorzystaniu waciwych metod znajdujcych si wtych klasach. Poprzednio zostaa
poruszona problematyka dotyczca typw prostych (int, float czy boolean), atake
podstawowych klas bibliotecznych (Scanner, String, System, Math). Poniej zostan
omwione zagadnienia prezentujce rnice pomidzy wymienionymi typami danych, jak rwnie pezedstawiony zostanie proces tworzenia obiektw oraz metod.
Szczegowe rozwaania zwizane ztworzeniem podprogramw, przekazywaniem parametrw oraz zwracaniem wartoci przez podprogramy zawarte zostay wopracowaniu Paradygmaty programowania/Wykad 4: Podprogramy, http://wazniak.mimuw.edu.pl/index.php?title=Paradygmaty_programowania/Wykad_4:_Podprogramy (dostp 2011-05-05).

32

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 83

2.5.1. Zmienne typu prostego iklasowego


Deklaracja zmiennej typu prostego jest rwnoznaczna zrezerwacj obszaru
wpamici komputera przeznaczonego do przechowywania wartoci zmiennej.

00000101

byte b;

rezerwacja
rezerwacjaobszary
obszarupamici
pamici(deklaracja
(deklaracjazmiennej)
zmiennej)

b = 5;

przypisaniewartoci
wartocido
dozarezerwowanego
zarezerwowanegoobszaru
obszaru(inicjalizacja
(inicjalizacjazmiennej)
zmiennej)
przypisanie

Moliwe jest rwnie jednoczesne wykonanie obu wymienionych powyej


operacji (deklaracjaiinicjalizacja zmiennej):

byte b = 5;

Tworzc dowolny obiekt, naley zapamita miejsce wpamici, wktrym


si on znajduje. Adres ten jest dostpny wzmiennej typu klasowego. Jest to tak
zwana referencja33 do obiektu. Deklaracja zmiennej typu obiektowego rezerwuje
wpamici miejsce przeznaczone na przechowywanie referencji do nowo tworzonego obiektu:
String s;

natomiast uycie operatora new powoduje utworzenie wpamici obiektu, ktrego


adres zostaje przypisany do zmiennej referencyjnej

s = new String("Uniwersytet");

33

Winnych jzykach programowania wykorzystuje si pojcie wskanika (ang. pointer).


Stowarzyszenie Edukacja dla Przedsibiorczoci

84 Metody inarzdzia programowania

Rys. 18. Etapy tworzenia iuruchamiania aplikacji

Moliwa jest take jednoczesna deklaracja zmiennej referencyjnej, utworzenie


nowego obiektu oraz przypisanie jego adresu (pooenia wpamici) do zmiennej
referencyjnej.
// Jednoczesne wykonanie obu operacji (deklaracja iinicjalizacja)
String s = new String("Uniwersytet");

2.5.2. Tworzenie iusuwanie obiektw


Obiekty wJavie tworzone s za pomoc operatora new, po ktrym wystpuje
konstruktor34 obiektu. Powstanie obiektu zwizane jest zprzydzieleniem odpowiedniej iloci miejsca wpamici oraz inicjalizacj pl obiektu. Po wykonaniu
tych operacji zwracana jest referencja do nowo utworzonego obiektu. Poniej
przedstawiono przykadowe utworzenie obiektu klasy Student:
Student andrzej = new Student();

Zmienna andrzej zawiera referencj do miejsca wpamici, gdzie znajduje si


utworzony obiekt. Referencja ta umoliwia dostp do pl imetod obiektu. Wcelu
odwoania do dowolnej skadowej obiektu (pola lub metody) naley okreli nazw zmiennej referencyjnej oraz nazw dowolnej skadowej obiektu (metody lub
pola) oddzielonej znakiem kropki. Poniszy przykad ilustruje odwoanie do metody pobierzWiek(), zawartej wklasie Student:
andrzej.pobierzWiek();

Konstruktor to specjalna metoda onazwie identycznej jak nazwa klasy.

34

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 85


Naley zauway, i modyfikacja wartoci zmiennej typu klasowego przy wykorzystaniu operatora przypisania spowoduje skopiowanie wycznie referencji
do wskazywanego obiektu (obiekt nie jest kopiowany).
Student ania; // deklaracja zmiennej typu klasowego
ania = andrzej;// skopiowanie referencji
// (zmienna ania wskazuje na ten sam obiekt, co zmienna andrzej)

Porwnanie dwch zmiennych typu klasowego (przy uyciu operatora == czy


!=) to wrzeczywistoci porwnanie referencji do obiektw (porwnanie czy obydwie zmienne wskazuj na ten sam obiekt). Sprawdzenie czy zawarto dwch
obiektw jest identyczna, odbywa si zwykorzystaniem odpowiednich metod dostpnych wdanej klasie.

String napis1 = "Jan Kowalski";


// utworzenie obiektw35 ireferencji
String napis2 = new String("Jan Kowalski");
if (napis1 == napis2)
System.out.println("TAK");
else
System.out.println("NIE");

// porwnanie referencji

if (napis1.equals(napis2)) // porwnanie zawartoci obiektw, metoda equals()


System.out.println("TAK");
else
System.out.println("NIE");

Obiekty utworzone wczasie trwania programu istniej tak dugo, jak dugo
istniej do nich odwoania. Java okresowo sprawdza referencje do obiektw te,
ktre nie s ju wykorzystywane s usuwane36. Usuwanie obiektw odbywa si
automatycznie. Programista nie musi dba ozwalnianie obszaru pamici zajmowanego przez obiekt. Zajmuje si tym specjalny proces (ang. garbage collection).

35

Obiekty klasy String mona tworzy na dwa sposoby: przy wykorzystaniu konstruktora
Stringnapis=newString("Ala") lub stosujc uproszczon dla klasy String form zapisu
Stringnapis="Ala"; dodatkowo kady acuch tekstowy jest traktowany przez Jav jako
obiekt klasy String.

36

Moliwe jest rczne usunicie referencji do obiektu poprzez przypisanie do zmiennej typu
klasowego referencji pustej np. andrzej=null.
Stowarzyszenie Edukacja dla Przedsibiorczoci

86 Metody inarzdzia programowania

2.5.3. Tworzenie iwywoywanie metod


Wydzielenie kodu programu zawierajcego instrukcje pozwala na powstanie
podprogramu. WJavie podprogramy nazywane s metodami37. Metoda to zbir instrukcji ujtych wnawiasy klamrowe38. Kada metoda posiada modyfikator39, nazw, list parametrw40 oraz informacj otypie zwracanej wartoci. Nazwa metody
wraz zlist parametrw (ich typami) jest czsto nazywana sygnatur metody41 (ang.
method signature). Kada zistniejcych metod musi zosta zdefiniowana wewntrz
tworzonej klasy. Poniszy kod programu zawiera przykadowe definicje metod.
int pobierzWiek() {
// int - typ zwracanej wartoci do miejsca wywoania metody
// pobierzWiek - nazwa metody
// () lista parametrw (pusta)
... // instrukcje metody
...
}
void ustawLiczbe(int liczba) {
// void - metoda nie zwraca wartoci
// ustawLiczbe - nazwa metody
// (int liczba) - lista parametrw
... // instrukcje metody
...
}
String dodajLiczbeDoLancucha(String lancuch, int liczba) {
// String - typ zwracanej wartoci (referecja do obiektu klasy String)
// dodajLiczbeDoLancucha - nazwa metody
// (String lancuch, int liczba) - lista parametrw
... // instrukcje metody
...
}

Winnych jzykach programowania podprogramy zwizane s ztakimi pojciami jak funkcja


czy procedura.

37

Instrukcje zawarte wmetodzie pomidzy nawiasami klamrowymi nazywane s ciaem metody


(ang. body).

38

Szczegowe omwienie modyfikatorw dostpne jest wdalszej czci pracy.

39

Lista parametrw moe by pusta. Moliwe jest rwnie stworzenie zmiennej liczby parametrw.

40

Do czsto stosuje si rwnie pojcie nagwka metody.

41

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 87


Kada metoda skada si ze skoczonej liczby instrukcji. Dziaanie metody
koczy si, gdy zachodzi jeden zprzypadkw:
zostaa wykonana ostatnia instrukcja metody,
wystpia instrukcja return,
wystpi tzw. wyjtek42.
Metody, ktre zwracaj wartoci, musz zawiera instrukcj return43, po ktrej wystpuje wyraenie okrelajce zwracan warto. Typ wyraenia musi by
zgodny ztypem zadeklarowanym wnagwku metody. Instrukcja return zwraca
warto wyraenia do miejsca wywoania metody.
int pobierzWiek() {
int wiek;
wiek = 23;
return wiek; // zakoczenie dziaania metody izwrcenie wartoci (23)
}
int obliczKwadrat(int n) {
return (n * n); // obliczenie izwrcenie wartoci wyraenia (n * n)
}

Wjzyku programowania Java wyrni mona dwa rodzaje metod: zwizane zdan instancj44 klasy (metody instancyjne) oraz klasowe45. Metody instancyjne nie posiadaj modyfikatora static iwywoanie ich jest moliwe tylko na
rzecz utworzonych obiektw danej klasy (bd te zpoziomu innych metod instancyjnych wystpujcych wtej klasie). Mwic inaczej, aby wywoa metod
instancyjn, naley posuy si zmienn zawierajc referencj do utworzonego
wczeniej obiektu.
Student marek = new Student(); // utworzenie obiektu
int wiek = marek.pobierzWiek(); // wywoanie metody instancyjnej na rzecz obiektu

42

Szczegowe informacje dotyczce wyjtkw zostan podane wdalszej czci pracy.

43

Instrukcja return nie musi by ostatni wmetodzie. Czsto wykorzystywana jest winstrukcjach warunkowych, decydujc owykonaniu kolejnych instrukcji metody.

44

Podczas tworzenia nowych obiektw przy pomocy sowa kluczowego new powstaje nowa instancja (obiekt danej klasy).

45

Inna nazwa metod klasowych to metody statyczne (posiadaj wnagwku modyfikator static).
Stowarzyszenie Edukacja dla Przedsibiorczoci

88 Metody inarzdzia programowania


Kolejny rodzaj to metody klasowe, wktrych nazwa poprzedzona jest modyfikatorem static. Ich wywoanie jest moliwe bez koniecznoci tworzenia obiektu46. Wymagane jest jedynie podanie nazwy klasy oraz wywoywanej metody. Poniszy przykad zawiera wywoanie metody klasowej random(), zawartej wklasie
java.lang.Math.
int los = (int)(Math.random() * 49 + 1); // losowa warto zprzedziau <1,49>

Program 15. Tworzenie metod statycznych


Jak ju wspomniano wczeniej, cech charakterystyczn metod statycznych
jest moliwo ich wywoania bez koniecznoci tworzenia obiektu. Zbir takich
metod zawarty jest np. wklasie Math. Moliwe jest ich uycie bez koniecznoci
tworzenia obiektu tej klasy. Poniszy kod programu zawiera definicj dwch metod statycznych: pierwsza znich osygnaturze wyswietlTekst(String), wywietlajca przekazany jako parametr acuch tekstowy, natomiast druga osygnaturze
odczytajLiczbe(), zwracajca pobran od uytkownika liczb typu int. Instrukcje
zawarte wmetodzie main pokazuj, wjaki sposb nastpuje wywoanie zdefiniowanych uprzednio metod.
import java.util.Scanner;
public class TworzenieMetodStatycznych {
static void wyswietlTekst(String s) {
System.out.print(s);
}
static int odczytajLiczbe() {
Scanner klaw = new Scanner (System.in);
return klaw.nextInt();
}
public static void main(String[] args) {
int liczbaPierwsza, liczbaDruga, wynik;
wyswietlTekst("Podaj pierwsz liczb: "); // wywoanie metody statycznej
liczbaPierwsza = odczytajLiczbe();
// wywoanie metody statycznej

Metoda main() jest przykadem metody klasowej, ktra jest wywoywana bez koniecznoci
tworzenia obiektu.

46

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 89

wyswietlTekst("Podaj drug liczb: "); // wywoanie metody statycznej


liczbaDruga = odczytajLiczbe();
// wywoanie metody statycznej
wynik = liczbaPierwsza + liczbaDruga;
wyswietlTekst("Suma wynosi: " + wynik + "\n"); // wywoanie metody statycznej
}
}

Program 16. Tworzenie metod instancyjnych


Aby zosta zrealizowany program wyznaczajcy szecian dowolnej liczby cakowitej, w pierwszej kolejnoci powinna zosta ustalona metoda
obliczSzescian(int) oraz typ zwracanej wartoci int. Zwr uwag na brak modyfikatora static wnagwku metody.

public class MetodaInstancyjna {


int obliczSzescian(int liczba) {
return liczba * liczba * liczba;
}

// tworzymy metod

public static void main(String[] args) {


int n = 3;
MetodaInstancyjna obiekt = new MetodaInstancyjna (); // tworzymy obiekt
int wynik = obiekt.obliczSzescian(n); // wywoujemy metod
System.out.printf("Szecian liczby %d wynosi %d", n, wynik);
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

90 Metody inarzdzia programowania


Program 17. Inwersja wektora
Poniszy kod programu zawiera kolejny przykad definiowania oraz wywoywania metod statycznych. Elementy tablicy zawieraj wartoci typu int. Zawarta
wprogramie metoda statyczna inwersja dokonuje zmiany kolejnoci (odwrcenia
porzdku) elementw tablicy. Wartoci te przekazane zostay do metody poprzez
zastosowanie parametru tablica.
public class InwersjaWektora {
static void inwersja(int[] tablica) { // utworzenie metody statycznej
int i= 0;
int j = tablica.length - 1;
int pomoc;
while (i< j) {
pomoc = tablica[i];
tablica[i] = tablica[j];
tablica[j] = pomoc;
i++;
j--;
}
}
public static void main(String[] args) {
int[] wektor = {4, 2, 7, 3, 9, 1, 8, 5}; // utworzenie wektora
inwersja(wektor); // wywoanie metody statycznej
for(int liczba : wektor) // wywietlenie zawartoci wektora
System.out.print(liczba + " ");
}
}

Wszystkie parametry wJavie przekazywane s poprzez warto. Wprzypadku parametrw typu prymitywnego tworzona jest kopia wartoci wewntrz ciaa metody. Instrukcje metody mog modyfikowa jedynie kopi, nie za warto
oryginaln, ktra pozostaje niezmienna. Gdy parametrem metody jest zmienna
obiektowa, tworzona jest kopia referencji do obiektu, jednake jej uycie winstrukcjach metody powoduje wykonanie operacji bezporednio na obiekcie (nie
jest tworzona kopia obiektu wewntrz metody).

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 91

void dodajLiczby(inta, int b) { // utworzenie metody


int suma = a+ b; // uycie kopii parametrw (zmienne lokalneaib)
a++;
// modyfikacja zmiennej a
b -= 5; // modyfikacja zmiennej b
}
// wywoanie metody zciaa innej metody
int x = 4;
int y = 2;
dodajLiczby(x, y); // wywoanie metody iprzekazanie jej wartoci zmiennych x iy
// wartoci zmiennych x iy nie zmieniy si
System.out.printf("Warto zmiennej x to %d, ay to %d", x, y);

Zwykorzystaniem metod cile zwizane jest pojcie modyfikatora dostpu.


Definiuje on zakres widocznoci metody. Ponisza tabela przedstawia zasady uycia modyfikatorw, okrelajce reguy dostpu do skadowych klasy (pl imetod)
zpoziomu innej klasy, pakietu (zbioru klas), klasy dziedziczcej (podklasy) oraz
dowolnego miejsca programu.

Tabela 6. Modyfikatory dostpu do skadowych obiektu


Modyfikator

Klasa

Pakiet

Podklasa

Wszyscy

brak modyfikatora

private

public
protected
47

modyfikatora47

Deklaracja wielu metod (wobrbie tej samej klasy), ktre posiadaj identyczn nazw, ale inny zestaw parametrw, nazywana jest przecianiem metod (ang.
method overloading). Metody przecione rozrniane s przez kompilator na
podstawie liczby oraz typu parametrw48. Takie podejcie do tworzenia metod
pozwala na wiksz elastyczno wprogramowaniu zorientowanym obiektowo.

47

Brak modyfikatora oznacza zastosowanie modyfikatora domylnego (package).

48

Metody nie mog by przeciane wycznie poprzez okrelenie rnych typw zwracanych
wartoci.
Stowarzyszenie Edukacja dla Przedsibiorczoci

92 Metody inarzdzia programowania

void wyswietlNapis(String napis) {


... // instrukcje
}
void wyswietlNapis(String napis, int liczbaTabulacji) {
... // instrukcje
}
void wyswietlNapis(String napis, String extra) {
... // instrukcje
}

Powysze metody posiadaj rne sygnatury:


wyswietlNapis(String),
wyswietlNapis(String,int),
wyswietlNapis(String,String)

Uruchomienie wybranej metody zwizane jest ze sprawdzeniem liczby oraz


typu jej parametrw. Przykadowo wywoanie:
wyswietlNapis("Informatyka iEkonometria", 7);

uruchomi metod osygnaturze wyswietlNapis(String,int).

2.5.4. Uycie klas bibliotecznych


JDK zawiera pokany zbir klas bibliotecznych. Ze wzgldu na ich liczebno,
zostay one pogrupowane wpakiety (ang. package). Podstawowym pakietem dostpnym wJavie jest java.lang49. Zawiera on najbardziej przydatne inajczciej
wykorzystywane klasy (np. klasa System). Wykorzystanie klas znajdujcych si
winnych pakietach wie si zpowiadomieniem otym fakcie kompilatora poprzez
uycie na pocztku kodu programu sowa kluczowego import50. Konstrukcja ta wystpuje wdwch wersjach, pojedynczego typu oraz typu na danie. Wpierwszym
przypadku wskazywana jest klasa, ktra moe zosta uyta wprogramie.
Wszystkie klasy zawarte wpakiecie java.lang s dostpne dla kadego programu bez koniecznoci uycia instrukcji import.

49

Bez dyrektywy import konieczne staje si poprzedzenie nazwy klasy nazw pakietu, wktrym
si ona znajduje, np. java.util.Scanner wejscie = new java.util.Scanner(System.in);. Zapis
taki jest wykorzystywany tylko wprzypadku korzystania zklas oidentycznych nazwach, ale
znajdujcych si wrnych pakietach.

50

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 93

import java.util.Scanner; // wykorzystanie klasy Scanner

Drugi rodzaj umoliwia okrelenie pakietu, wktrym znajduj si wykorzystywane przez programist klasy51. Wczasie kompilacji wanie wnim kompilator bdzie szuka uytych klas.
import java.util.*; // wykorzystanie dowolnej liczby klas zpakietu java.util

Pierwsza forma zapisu stosowana jest wprzypadku uycia jednej klasy zwybranego pakietu. Drugi ze sposobw jest preferowany wsytuacji wykorzystania
wikszej liczby klas. Najczciej wykorzystywane pakiety wjzyku programowania Java to:
java.lang podstawowe klasy wykorzystywane podczas tworzenia programw,
java.util zbir klas pomocniczych (np. klasy do obsugi daty, czasu, kolekcji),
java.io obsuga strumieni wejcia iwyjcia, obsuga systemu plikw.
Oto wybrane klasy biblioteczne, powszechnie uywane podczas tworzenia
programw:
System metody zwizane zwaciwociami systemu, wktrym uruchamiany
jest program,
Scanner odczyt wartoci prymitywnych iacuchw tekstowych, czsto ze
standardowego wejcia,
Math zbir metod realizujcych podstawowe operacje arytmetyczne,
String reprezentacja acuchw tekstowych, zawierajca wiele przydatnych
metod pozwalajcych na operacje na cigach znakw,
Arrays zbir metod umoliwiajcych operacj na tablicach (sortowanie, wyszukiwanie itp.),
Calendar podstawowe operacje zwizane zdatami.

51

Kompilator wykorzysta tylko informacj oklasach, ktre rzeczywicie zostan uyte wkodzie
programu, anie owszystkich klasach znajdujcych si wkonkretnym pakiecie.
Stowarzyszenie Edukacja dla Przedsibiorczoci

94 Metody inarzdzia programowania


Program 18. Wykorzystanie klas bibliotecznych
Klasy biblioteczne pozwalaj programicie na szybk realizacj postawionych celw poprzez wykorzystanie gotowych rozwiza. Ponisze kody programw stanowi ilustracj wykorzystania dostpnych metod zawartych wklasach bibliotecznych
Math oraz String. Wykorzystane wprogramach metody umoliwiaj zaokrglanie
wartoci rzeczywistych oraz poczenie (konkatenacj) acuchw znakowych.
public class ZaokraglanieWartosci {
public static void main(String[] args) {
double v = 10.5;
System.out.println(Math.ceil(v));
System.out.println(Math.round(v));
System.out.println(Math.floor(v));
System.out.println((int) Math.ceil(v));
System.out.println((int) Math.floor(v));
}
}
public class KonkatenacjaLancuchow {
public static void main(String[] args) {
String napis1 = "Uniwersytet";
String napis2 = "Ekonomiczny";
String napis3 = "wKrakowie";
napis1.concat(napis2);
System.out.println(napis3.concat(napis1));
}
}

2.5.5. Klasy opakowujce


Jzyk Java zawiera zbir typw prostych (prymitywnych). Pomimo i sprawdzaj si one doskonale wpodstawowych operacjach, ze wzgldu na obiektowy
charakter jzyka Java, powstay tak zwane klasy opakowujce (ang. wrapper
classes). Ich zadaniem jest umoliwienie przechowywania wartoci typu prostego
wformie obiektu. Kady ztypw prostych posiada swoj klas opakowujc (int
Integer, short Short, byte Byte, long Long, double Double, float Float,
boolean Boolean, char Character). Dodatkowo kada zklas opakowujcych
posiada szereg metod uatwiajcych operacj na danych (np. metody konwersji,
sprawdzania poprawnoci wartoci). Przykadowo, klasa Integer przechowujca
dane typu int posiada metod signum() sprawdzajc znak liczby przekazanej
jako parametr (metoda zwrci -1 dla liczb ujemnych, 0 dla zera i1 dla liczb dodatnich).
Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 95

2.6. Pytania
1. Czym jest ijak funkcj peni Wirtualna Maszyna Javy?
2. Ktre zwymienionych zmiennych nie s zgodne zprzyjt konwencj tworzenia nazw: KolorOczu, wzrost, wiekOsoby, umyjTwarz, Gimnastykaporanna,
CechaCharakteruKobiety, Licznik?
3. Zjakich elementw skada si kod rdowy?
4. Zmienne, stae oraz literay to skadowe kodu rdowego programu. Jakie
wystpuj pomidzy nimi rnice?
5. Jakie funkcje wprogramie peni deklaracja zmiennej?
6. Kolejno wykonywania operacji zalena jest od priorytetu uytego operatora. Ktry zoperatorw: + % -- < posiada najwyszy, aktry najniszy
priorytet?
7. Jak funkcjonalno realizuj operatory: ++ ?: /= % ?
8. Ktre zwymienionych instrukcji nie spowoduj powstania bdu
kompilacji: float f = 1.01; int i= 1/3; double d = 777d;?
9. Jakie oznaczenie (indeks) posiada pierwszy element tablicy?
10. Jak informacj zwrci wyraenie tablica.length wprzypadku tablicy
wielowymiarowej?
11. Algorytm to uporzdkowany cig czynnoci umoliwiajcy wskoczonej
liczbie krokw rozwizanie zadania okrelonej klasy. Jakie istniej metody
jego zapisu?
12. Czym jest blok instrukcji ijaki jest sposb jego notacji wjzyku programowania Java?
13. Jaki jest zasig widocznoci zmiennych zadeklarowanych wewntrz bloku
instrukcji?
14. Winstrukcji warunkowej if moliwe jest uycie klauzuli else. Jak peni
ona rol?
15. Jaki bdzie rezultat dziaania poniszego kodu programu?
int i= 0;
if (i++ > 0) {
System.out.println(i);
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

96 Metody inarzdzia programowania


16. Jaki typ danych moe przyjmowa wyraenie instrukcji switch: boolean,
byte, short, int, long, char, float, double?
17. Jak funkcj peni klauzula default winstrukcji wyboru? Czy jej uycie
jest kadorazowo wymagane?
18. Poniszy kod programu ilustruje dziaanie instrukcji switch. Jaki bdzie
rezultat jego dziaania?
int i= 2;
switch (i) {
case 1:
System.out.println("jeden");
break;
case 2:
System.out.println("dwa");
case 3:
System.out.println("trzy");
default:
System.out.println("inna liczba");
}

19. Jakie skadowe wchodz wskad instrukcji iteracyjnej for? Jakie realizuj
czynnoci?
20. Poniszy kod programu zawiera instrukcj iteracyjn. Jaki bdzie rezultat
jego dziaania?
int x = 5;
for (inti=1;i<8;i+=4) {
x +=i;
}
System.out.println(x);

21. Czym charakteryzuje si odmiana instrukcji for przeznaczona do operacji


na elementach tablicy?
22. Jakie zasadnicze rnice cechuj ptl okrelon for oraz ptl nieokrelon while?
23. Czym rni si instrukcje iteracyjne while oraz do..while?
24. Wjaki sposb utworzone obiekty usuwane s zpamici operacyjnej? Kiedy to nastpuje?

Uniwersytet Ekonomiczny w Krakowie

Praktyka programowania imperatywno-strukturalnego 97


25. Jakie istotne cechy charakteryzuj metod instancyjn oraz metod klasow?
26. Ktra instrukcja koczy dziaanie metody?
27. Czym rni si poszczeglne modyfikatory dostpu do metod?
28. Dlaczego metody klasy Math zostay zdefiniowane jako klasowe?
29. Poniej podane zostay przykadowe nagwki metody przecionej
wlaczZawor(). Czy podany zapis jest poprawny?
boolean wlaczZawor(String nazwa, int typ)
int wlaczZawor(String identyfikator, int numer)

30. Ktre z poniszych klas nale do kategorii klas opakowujcych?


java.lang.Void, java.lang.Int, java.lang.Boolean,
java.lang.Long, java.lang.String, java.lang.Char

Stowarzyszenie Edukacja dla Przedsibiorczoci

3
Paradygmat

programowania
obiektowego
Janusz Stal, Janusz Tuchowski
Stowarzyszenie Edukacja dla Przedsibiorczoci

3.1. Podstawowe zagadnienia


Wotaczajcej nas rzeczywistoci wystpuje szereg obiektw tego samego
typu (np. zbir samochodw, drzew czy studentw). Klasa okrelana jest jako
zbir stanw oraz zachowa opisujcych obiekty nalece do tej samej kategorii.
Jest to pewnego rodzaju wzorzec, na podstawie ktrego tworzone s unikalne wersje obiektu (np. czerwony samochd marki Fiat, wysokie drzewo). Wskad kadej
klasy wchodz:
pola (zmienne), zawierajce informacje opisujce waciwoci (stany) obiektw,
metody (podprogramy) modelujce zachowania obiektw.
Na podstawie zdefiniowanej klasy tworzone s obiekty rnice si waciwociami. Kady obiekt posiada wasny zbir pl, ktrych wartoci okrelaj jego
indywidualno. Na podstawie klasy moliwe jest zatem utworzenie dowolnej
liczby obiektw (instancji klasy), nalecych do tej samej kategorii, zrnicowanych pod wzgldem waciwoci.

3.1.1. Definicja klasy


Proces definiowania klasy polega na okreleniu jej skadowych, tj. pl oraz metod, reprezentujcych stany izachowania obiektw, ktre bd tworzone woparciu ot klas. Poniszy przykad ilustruje klas Telefon stanowic wzorzec dla
zbioru opisywanych telefonw. Kady telefon posiada pewne unikalne cechy (numer telefonu, czny czas rozmw) oraz zachowania, tj. czynnoci, ktre moe
wykona (zadzwo).

Stowarzyszenie Edukacja dla Przedsibiorczoci

102 Metody inarzdzia programowania

Rys. 19. Diagram UML52 klasy Telefon

Definicja klasy wjzyku Java realizowana jest za pomoc sowa kluczowego


class:
class Telefon {
// ciao klasy (skadowe klasy)
}

Kada tworzona klasa moe zawiera zbir pl oraz metod stanowicych skadowe klasy.
Pola to zmienne deklarowane wewntrz klasy. Wprzypadku braku jawnej inicjalizacji zmiennej otrzymuje ona warto domyln53. Zwyczajowo deklaracja
pl klasy wystpuje przed deklaracj metod. Poniszy kod programu zawiera definicj klasy Telefon wraz zwchodzcymi wjej skad polami.
class Telefon {
// deklaracja pl klasy
private String numerTelefonu;
private int lacznyCzasRozmow;
private static double cenaRozmowy = 0.48; // z/min.
}

Szczegowe informacje odiagramach UML dostpne s pod adresem http://www.uml.org/

52

Wprzypadku braku jawnej inicjalizacji pl klasy, przyjmuj one wartoci domylne (pola
numeryczne wartoci zerowe, pola logiczne warto false, natomiast pola klasowe warto
null).

53

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 103


Pola statyczne (oznaczone wkodzie modyfikatorem static), wprzeciwiestwie do pl niestatycznych, s wsplne dla wszystkich obiektw danej klasy54.
Dostp do nich jest moliwy bez koniecznoci tworzenia obiektu klasy. Wpowyszym przykadzie pole cenaRozmowy dotyczy waciwoci odnoszcej si do
wszystkich obiektw klasy Telefon. Dostp do pl klasy jest moliwy zgodnie
zrodzajem uytego wdeklaracji modyfikatora dostpu.
Metody deklarowane wklasie stanowi odpowiednik zachowa konkretnych
obiektw. Sposb deklaracji metod zosta omwiony wpoprzednim rozdziale.
Warto przypomnie ometodach statycznych (klasowych), do ktrych dostp moliwy jest bez koniecznoci tworzenia obiektu danej klasy. Metody te nie mog
zatem odwoywa si do niestatycznych (instancyjnych) skadowych klasy (pl
imetod) powizanych zkonkretnym obiektem. Poniszy kod programu zawiera
definicj klasy Telefon wraz zjej skadowymi polami oraz metodami.
class Telefon {
// deklaracja pl klasy
private String numerTelefonu;
private int lacznyCzasRozmow;
private static double cenaRozmowy = 0.48;

// z/min.

// deklaracja metod klasy


public double obliczKwoteDoZaplaty() {
return cenaRozmowy * (lacznyCzasRozmow / 60);
}
public static void ustawCeneRozmowy(double nowaCena){
cenaRozmowy = nowaCena;
}
public void zadzwon(String nrTelefonu) {
System.out.println ("Dzwoni do: " + nrTelefonu);
System.out.println ("Dry, dry...");
System.out.println ("Rozmowa wtoku...");
int czasRozmowy = (int) (Math.random()*3600);
lacznyCzasRozmow += czasRozmowy;
System.out.println ("Rozmowa zakoczona. ");
System.out.printf ("Czas rozmowy: %d min. %d sek.",
czasRozmowy/60, czasRozmowy%60);
}
}

54

Pola statyczne do czsto nazywane s polami klasowymi.


Stowarzyszenie Edukacja dla Przedsibiorczoci

104 Metody inarzdzia programowania


Konstruktor stanowi specyficzn metod, ktra wywoywana zostaje wmomencie tworzenia obiektu55. Jego nazwa musi by identyczna znazw klasy. Konstruktor nie moe rwnie zwraca adnej wartoci56. Wskad konstruktora wchodz instrukcje, ktre zostan wykonane wtrakcie tworzenia obiektu. Szczeglnym
przypadkiem jest tu nadanie wartoci pocztkowej polom obiektu, co moe zosta
zrealizowane albo wmomencie deklaracji pola, albo te poprzez przypisanie wartoci wkonstruktorze obiektu. Poniszy kod programu zawiera deklaracj konstruktora Telefon(String) dla klasy Telefon. Jego skadow jest instrukcja przypisujca warto pocztkow dla pola numerTelefonu.
public Telefon (String numer) {
numerTelefonu = numer;
}

Wprzypadku braku jawnie zadeklarowanego konstruktora zostanie wywoany


konstruktor domylny57. Moliwe jest przecianie konstruktorw, podobnie jak
innych metod zadeklarowanych wklasie.

3.1.2.Tworzenie obiektw
Definicja klasy udostpnia wzorzec, na podstawie ktrego tworzone s obiekty. Ich interakcja realizowana poprzez wywoywanie metod stanowi otreci tworzonej aplikacji. Poniszy rysunek przedstawia schemat tworzenia obiektw na
podstawie klasy Telefon.

Skadnia tworzenia obiektu zawiera operator new oraz nazw konstruktora, ktry ma zosta
wywoany.

55

Przed nazw konstruktora nie moe pojawi si rwnie sowo kluczowe void.

56

Konstruktor domylny posiada pust liczb parametrw ijest wywoywany wycznie wtedy,
gdy klasa nie posiada adnego jawnie zadeklarowanego konstruktora.

57

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 105

Telefon
- nrTelefonu : String
- lacznyCzasRozmow : int
- cenaRozmowy : double

Telefon Jasia
nrTelefonu: "601342754"
lacznyCzasRozmow: 4769

Telefon Kasi
nrTelefonu: "126410991"
lacznyCzasRozmow: 8102

Telefon Ani
nrTelefonu: "503286333"
lacznyCzasRozmow: 1981

Rys. 20. Tworzenie obiektw na podstawie klasy

Tworzenie nowych obiektw polega na uyciu operatora new, po ktrym wystpuje nazwa odpowiedniego konstruktora. Poniszy kod zawiera przykad utworzenia obiektu klasy Telefon:
Telefon telefonKasi = new Telefon("126410991");

Operator new tworzy na podstawie wzorca (klasy) nowy obiekt oraz umieszcza go wpamici operacyjnej. Wartoci zwracan podczas tworzenia obiektu jest
referencja do miejsca, wktrym obiekt zosta utworzony. Warto ta przypisana
zostaje do zmiennej typu obiektowego, co pozwala na odwoywanie si do skadowych obiektu:

Stowarzyszenie Edukacja dla Przedsibiorczoci

106 Metody inarzdzia programowania

public class WykorzystanieObiektow {


public static void main(String args[]) {
Telefon telefonJasia = new Telefon("601342754");
// wywoanie metody zadzwon() na rzecz obiektu telefonJasia
telefonJasia.zadzwon("687934267");
}
}

3.1.3. Skadowe klasy


Definiowanie klas oraz tworzenie obiektw powizane jest cile ztypem referencyjnym, przechowujcym odwoania do obiektw. Wykorzystujc referencj
oraz operator kropki, uzyska mona dostp do skadowych klasy. Kto ina jakich
zasadach posiada dostp do poszczeglnych skadowych, okrelaj modyfikatory
dostpu. Naley zauway, i dostp do poszczeglnych pl klasy odbywa si
zazwyczaj za porednictwem zadeklarowanych metod dostpowych imodyfikujcych.
Metody dostpowe (ang. accessor (getter) methods) s uywane do odczytu wartoci pl (instancyjnych istatycznych). Nazwa takiej metody zazwyczaj
skada si zczasownika pobierz (ang. get) oraz nazwy pola. Zadaniem metod
modyfikujcych (ang. mutator (setter) methods) jest nadanie bd te zmiana wartoci pl (instancyjnych istatycznych). Nazwa metody zawiera zwykle czasownik
ustaw (ang. set) oraz nazw pola. Metody modyfikujce zreguy nie zwracaj
adnej wartoci.
class Zeszyt{
private int liczbaKartek;
// metoda dostpowa
public int pobierzLiczbeKartek() {
return liczbaKartek;
}
// metoda modyfikujca
public void ustawLiczbeKartek(int liczba) {
liczbaKartek = liczba;
}
}

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 107


Oddzielnego wyjanienia wymaga sowo kluczowe this oznaczajce referencj do biecego obiektu. Uatwia ono dostp do jego skadowych, jak rwnie
umoliwia wywoanie odpowiednich konstruktorw. Czsto this jest wykorzystywane, gdy nazwa parametru metody jest identyczna znazw pola58, umoliwiajc
rozrnienie tych identyfikatorw.
class Student {
private String nazwisko;
public void ustawNazwisko(String nazwisko) {
// inicjalizacja pola "nazwisko" wartoci parametru "nazwisko"
this.nazwisko = nazwisko;
}
}

Wywoanie konstruktora zciaa innego konstruktora jest moliwe poprzez


uycie sowa kluczowego this wraz zewentualn list parametrw59.
class Monitor {
private String nazwa;
private static int liczbaMonitorw;
public Monitor(){
liczbaMonitorw++;
}
public Monitor(String nazwa) {
this(); // wywoanie konstruktora bezparametrowego
this.nazwa = nazwa; // inicjalizacja pola wartoci parametru
}
}

58

Wystpuje wtedy tzw. przesanianie zmiennych.

59

Wywoanie konstruktora przy uyciu sowa kluczowego this musi wystpi na pocztku bloku instrukcji.
Stowarzyszenie Edukacja dla Przedsibiorczoci

108 Metody inarzdzia programowania


Prawidowe okrelenie widocznoci poszczeglnych skadowych klasy umoliwia ukrycie implementacji. Zgodnie zzasadami programowania zorientowanego
obiektowo dostp do pl powinien by realizowany wycznie za pomoc metod
dostpowych imodyfikujcych (tworzcych tzw. interfejs obiektu). Proces ukrywania skadowych klasy nazywany jest enkapsulacj60 iodbywa si poprzez uycie odpowiedniego modyfikatora dostpu (zazwyczaj private).
class Osoba{
// pola
private
private
private

prywatne dostp moliwy tylko za porednictwem odpowiednich metod


String imie;
String nazwisko;
double pensja;

// konstruktor
public Osoba(String imie, String nazwisko, double pensja) {
this.imie = imie;
this.nazwisko = nazwisko;
this.pensja = pensja;
}
// publiczna metoda umoliwiajca zmian pensji danej osoby
public void ustawPensje(double nowaPensja) {
pensja = nowaPensja;
}
}

Program 1. Przykadowa klasa iobiekty


Rodzina Kowalskich to posiadajcy telefony Ania iJarek. Ponisza aplikacja
zawiera definicj klasy Telefon oraz tworzy na jej podstawie dwa obiekty: telefonAni oraz telefonJarka. Dodatkowo symulowane jest wykonanie rozmw ztelefonu Ani iJarka, anastpnie obliczona zostaje kwota do zapaty, jak za rozmow
powinna uici Ania.

Enkapsulacja czsto nazywana jest rwnie hermetyzacj danych.

60

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 109

class Telefon {
// deklaracja pl klasy
private String numerTelefonu;
private int lacznyCzasRozmow;
private static double cenaRozmowy = 0.48;

// z/min.

// konstruktor klasy
public Telefon (String numer) {
numerTelefonu = numer;
}
// deklaracja metod klasy
public double obliczKwoteDoZaplaty() {
return cenaRozmowy * (lacznyCzasRozmow / 60 + 1);
}
public static void ustawCeneRozmowy(double nowaCena){
cenaRozmowy = nowaCena;
}
public void zadzwon(String nrTelefonu) {
System.out.println ("Dzwoni do: " + nrTelefonu);
System.out.println ("Dry, dry...");
System.out.println ("Rozmowa wtoku...");
int czasRozmowy = (int) (Math.random()*3600);
lacznyCzasRozmow += czasRozmowy;
System.out.println ("Rozmowa zakoczona. ");
System.out.printf ("Czas rozmowy: %d min. %d sek. \n",
czasRozmowy/60, czasRozmowy%60);
}
}
public class TelefonyKowalskich {
public static void main(String[] args){
Telefon telefonAni = new Telefon("783982331");
Telefon telefonJarka = new Telefon("608234982");
telefonAni.zadzwon("124239832");
telefonJarka.zadzwon("112");
double kwota = telefonAni.obliczKwoteDoZaplaty();
System.out.printf("Ania ma do zapaty %f z.", kwota);
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

110 Metody inarzdzia programowania


Program 2. Prosty stoper
Sprawdzanie wydajnoci aplikacji wie si zpomiarem czasu jej wykonania.
Ponisza klasa odzwierciedla funkcjonalno prostego stopera. Jej gwnym zadaniem jest pomiar czasu pomidzy uruchomieniem stopera, ajego zatrzymaniem.
class Stoper {
// deklaracja pl klasy
private long start;
private long stop;
private String nazwa;
// konstruktory klasy
public Stoper() {
this("");
}
public Stoper(String nazwa) {
this.nazwa = nazwa;
}
// metody klasy
public void start(){
start = System.currentTimeMillis();
}
public void stop(){
stop = System.currentTimeMillis();
}
public double pobierzWynik(){
return (stop - start) / 1000.0;
}
}

Program 3. Uamki zwyke


Jzyk programowania Java nie posiada klasy dla obsugi uamkw zwykych.
Poniszy kod definiuje klas Ulamek zawierajc pola licznik oraz mianownik,
atake przykadowe metody (tworzenie uamka, jego upraszczanie oraz wywietlanie).

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 111

class Ulamek {
// deklaracja pl klasy
private int licznik;
private int mianownik;
// konstruktory klasy
public Ulamek() {
this.licznik = 0;
this.mianownik = 1;
}
public Ulamek(int licznik) {
this.licznik = licznik;
this.mianownik = 1;
}
public Ulamek(int licznik, int mianownik) {
this.licznik = licznik;
this.mianownik = mianownik;
uproscUlamek(this);
}
// metody klasy
private static int obliczNWD(Ulamek a) {
int l,m;
l = a.licznik;
m = a.mianownik;
if (l < 0)
l = - l;
if (m < 0)
m = - m;
while ( l != m) {
if (l > m) l = l - m;
else m = m - l;
}
return l;
}
private static void uproscUlamek(Ulamek a) {
int nwd;

Stowarzyszenie Edukacja dla Przedsibiorczoci

112 Metody inarzdzia programowania

nwd = obliczNWD(a);
a.licznik /= nwd;
a.mianownik /= nwd;
}
public Ulamek dodaj(Ulamek a) {
Ulamek wynik = new Ulamek((this.licznik * a.mianownik)+(a.licznik *
this.mianownik), (this.mianownik * a.mianownik));
return wynik;
}

public String toString() {


return this.licznik + "/" + this.mianownik;
}
}

public class UlamkiZwykle {


public static void main (String[] args) {
Ulamek x = new Ulamek(4, 6);
Ulamek y = new Ulamek(10, 12);
System.out.println("Uamek x = " + x);
System.out.println("Uamek y = " + y);
System.out.println("Suma uamkw x + y = " + x.dodaj(y));
}
}

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 113


Program 4. Stypendium naukowe
Do uzyskania stypendium naukowego wymagana jest rednia uzyskanych
ocen wiksza bd rwna 4,8. Zadaniem programu jest pobranie ze standardowego wejcia ocen studenta isprawdzenie, czy uzyska on wymagana redni. Dodatkowo tworzona jest klasa Statystyka zawierajca metod obliczajc redni
arytmetyczn zuzyskanych ocen.
import java.util.*;
class Statystyka {
// deklaracja pl klasy
private double dane[];
// konstruktory klasy
public Statystyka(double[] tablica) {
dane = tablica;
}
// metody klasy
public double sredniaArytmetyczna(){
double suma = 0;
for (double x : dane)
suma += x;
return (suma / dane.length);
}
}
public class StypendiumNaukowe{
public static void main(String[] args){
Scanner wejscie = new Scanner(System.in);
System.out.print("Podaj ilo ocen: ");
int n = wejscie.nextInt();
double[] oceny = new double[n];
for(int i=0; i<n; i++){
System.out.print("Podaj ocen: ");
oceny[i] = wejscie.nextDouble();
}
Statystyka obliczenia = new Statystyka(oceny);
double srednia = obliczenia.sredniaArytmetyczna();
System.out.println("Stypendium naukowe" + (srednia >= 4.8 ? "zostao przyznane" :
"nie zostao przyznane"));
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

114 Metody inarzdzia programowania

3.2. Kompozycja idziedziczenie


Idea programowania zorientowanego obiektowo umoliwia wielokrotne wykorzystanie istniejcego kodu programu. Dziki temu moliwe jest uycie istniejcych klas bez naruszania ich implementacji, realizujc tym samym ide programowania przyrostowego. Podejcie obiektowe wprogramowaniu dostarcza
mechanizmw umoliwiajcych atwe wyraanie zwizkw poj odnoszcych
si do modelowanej rzeczywistoci. Najczciej spotykane to kompozycja oraz
dziedziczenie.

3.2.1. Kompozycja
Kompozycja61 wyraa relacj skada si z lub posiada. Wskad tworzonej
klasy moe wchodzi dowolna liczba obiektw tworzonych na podstawie istniejcych ju klas. Ilustracj takich zalenoci jest najczciej diagram klas UML.

Rys. 21. Relacja kompozycji

Poniszy kod programu zawiera definicj klasy Osoba wykorzystujc jako


pola obiekty dwch innych klas, String oraz Telefon.

Kompozycja jest szczeglnym przypadkiem agregacji ioznacza, i obiekty skadowe nie mog
istnie bez obiektu gwnego.

61

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 115

class Osoba {

// deklaracja pl klasy
private String imie;
private String nazwisko;
private Telefon telefon;
private int wiek;

// kompozycja (wykorzystanie klasy String)


// kompozycja (wykorzystanie klasy String)
// kompozycja (wykorzystanie klasy Telefon)

// przykadowy konstruktor klasy


public Osoba(String imie, String nazwisko, Telefon telefon, int wiek){
this.imie = imie;
this.nazwisko = nazwisko;
this.telefon = telefon;
this.wiek = wiek;
}
// przykadowe metody klasy
public String pobierzNazwisko() {
return nazwisko;
}
public void ustawNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}
}

Proces tworzenia nowego obiektu klasy Osoba wraz zobiektami zalenymi


(Telefon) zosta przedstawiony poniej:
Osoba adam = new Osoba ("Adam", "Kowalski", new Telefon("823945321"), 21);

Program 5. Pojazd
Pojazd jest rodkiem transportu uatwiajcym przemieszczanie si. Aby byo
to moliwe, musi posiada napd (silnik). Aplikacja przedstawia uproszczony model pojazdu wraz zsilnikiem. Wykorzystane zostay dwie klasy reprezentujce
samochd oraz silnik pojazdu.

Stowarzyszenie Edukacja dla Przedsibiorczoci

116 Metody inarzdzia programowania

public class Pojazd {


private String nazwa;
private Silnik silnik;
public Pojazd(String nazwa, String typSilnika) {
this.nazwa = nazwa;
silnik = new Silnik(typSilnika);
}
public void ruszaj(){
System.out.println("Wsiadam do mojego " + nazwa);
silnik.zapal();
System.out.println("Ruszam - gaz do dechy... iwdrog...");
}
public void zatrzymaj(){
System.out.println("Zatrzymuj si zpiskiem opon...");
silnik.zgas();
System.out.println("Wychodz zsamochodu...");
}
public static void main(String[] args) {
Pojazd pojazd = new Pojazd("Audi Quattro", "Turbo Diesel");
pojazd.ruszaj();
pojazd.zatrzymaj();
}
}
class Silnik {
private String typ;
public Silnik(String typ){
this.typ = typ;
}
public void zapal(){
System.out.println("Zapalam silnik..." + typ);
}
public void zgas(){
System.out.println("Gasz silnik...");
}
public String pobierzTyp(){
return typ;
}
}

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 117

3.2.2. Dziedziczenie
Aby okreli, e jedno pojcie jest uszczegowieniem (lub uoglnieniem) innego, stosowane jest dziedziczenie. Wyraa ono relacj jest ijest wykorzystywane
wszdzie tam, gdzie naley wskaza, e 2 pojcia s do siebie podobne. Realizacja
dziedziczenia polega na tym, i nowo tworzona klasa przejmuje wszelkie cechy izachowania zklas ju istniejcych, dodajc bd te modyfikujc je, tak aby byy one
bardziej wyspecjalizowane. Dziki temu powstaje nowa klasa okrelana terminem
podklasa (ang. subclass) lub klasa pochodna, natomiast klasa, zktrej dokonano dziedziczenia, to nadklasa (ang. superclass)62 lub klasa bazowa.

Rys. 22. Relacja dziedziczenia (klasa Telefon oraz klasy pochodne)

Dziedziczenie realizowane jest za pomoc sowa kluczowego extends63, po


ktrym wystpuje nazwa klasy, zktrej dziedziczone s jej skadowe:
class Student extends Osoba {
// ciao klasy (skadowe klasy)
}

62

Uywane s rwnie pojcia dziecka (ang. child) irodzica (ang. parent) dla okrelania nazwy
podklasy oraz klasy bazowej.

63

Dziedziczenie wJavie jest jednokrotne (kada klasa dziedziczy tylko zjednej klasy). Klasy,
ktre jawnie nie posiadaj zadeklarowanego dziedziczenia (brak sowa kluczowego extends
wnagwku), domylnie dziedzicz zklasy Object.
Stowarzyszenie Edukacja dla Przedsibiorczoci

118 Metody inarzdzia programowania


Klasa Student rozszerza (dziedziczy) klas Osoba. Wtym przypadku Osoba jest
klas bazow, natomiast Student klas pochodn, ktra dziedziczy wszystkie dostpne pola imetody klasy bazowej64. Wklasie pochodnej moliwe jest:
deklarowanie nowych pl, ktre nie wystpuj wklasie bazowej, oraz tworzenie nowych pl otakiej samej nazwie, ukrywajc zarazem pola oryginalne
zklasy bazowej65,
deklarowanie metod, ktre nie wystpuj wklasie bazowej, oraz tworzenie nowych metod otakiej samej sygnaturze66.
Rozszerzajc moliwoci przykadowej klasy Telefon, mona na jej podstawie
utworzy nowe klasy: TelefonKomorkowy, TelefonStacjonarny oraz TelefonInternetowy. Klasy te posiadaj nowe cechy (np. operator, prefiks), jak izachowania
(np. wylij SMS). Kada zklas posiada rwnie wasn implementacj metody
zadzwon(String). Tworzc nowe obiekty, mona posugiwa si rwnie typem
klasy bazowej (zarwno telefon stacjonarny, jak ikomrkowy jest przecie telefonem67).
class TelefonKomorkowy extends Telefon {
// nowe pole klasy
String operator;
// konstruktor klasy
public TelefonKomorkowy (String numer, String operator) {
super(numer); // wywoanie konstruktora klasy bazowej
this.operator = operator;
}
// nowa metoda klasy
public void wyslijSMS(String nrTelefonu, String tresc) {
System.out.println ("Wysylam SMS'a o tresci: " + tresc);
System.out.println ("pod numer: " + nrTelefonu);
}

// nowa implementacja metody zadzwon (metoda przesonita)


public void zadzwon(String nrTelefonu) {
System.out.println ("Dzwoni z komrki do: " + nrTelefonu);
}

class TelefonStacjonarny extends Telefon {

Konstruktory nie s dziedziczone.

64

Tworzenie wklasie pochodnej pl otakiej samej nazwie jak wklasie bazowej nie jest zalecane.

65

Tworzenie wklasie pochodnej metod otakiej samej sygnaturze jak metody wklasie bazowej
nazywane jest przesanianiem metod (ang. override).

66

Taki sposb tworzenia obiektw nazywany jest rzutowaniem wgr (ang. upcasting).

67

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 119

// nowe pole klasy


String prefiks;
// konstruktor klasy
public TelefonStacjonarny (String numer, String prefiks) {
super(numer);
this.prefiks = prefiks;
}
// nowa implementacja metody zadzwon (metoda przesonita)
public void zadzwon(String nrTelefonu) {

System.out.println ("Dzwoni ze stacjonarnego do: " + nrTelefonu);
}
}
class TelefonInternetowy extends Telefon {
// nowe pole klasy
String identyfikator;
// konstruktor klasy
public TelefonInternetowy (String numer, String identyfikator) {
super(numer);
this.identyfikator = identyfikator;
}
// nowa metoda klasy
public boolean sprawdzPolaczenie() {
return true;
}
// nowa implementacja metody zadzwon (metoda przesonita)
public void zadzwon(String nrTelefonu) {
if(sprawdzPolaczenie())

System.out.println ("Dzwoni z internetowego do: " + nrTelefonu)
else
System.out.println ("Brak poczenia z internetem");
}
}
public class Test {
public static void main(String args[]) {




}

Telefon
Telefon
Telefon
Telefon

telefonJasia = new Telefon("867312632");


komorkaMarka = new TelefonKomorkowy("606345956", "Orange");
stacjonarnyKasi = new TelefonStacjonarny("125439876", "1044");
internetowyAni = new TelefonInternetowy("146743253", "Anula7");

Stowarzyszenie Edukacja dla Przedsibiorczoci

120 Metody inarzdzia programowania

3.2.3. Polimorfizm
Zarwno kompozycja, jak idziedziczenie, ktre pozwala kojarzy klasy obiektw whierarchie klas, nale do fundamentalnych wasnoci podejcia obiektowego. Umoliwiaj realizacj idei programowania przyrostowego oraz pniejsz
szybk modyfikacj kodu programu.
Tworzc obiekty na podstawie klas dziedziczcych zinnych klas, mona jako
zmienn referencyjn poda typ klasy bazowej68. Wywoujc nastpnie odpowiednie metody, kompilator decyduje, ktra znich ma zosta wykonana (na podstawie
typu obiektu, na rzecz ktrego s one wywoane). Taki sposb wywoania metod
nazywany jest polimorfizmem.
Poniszy przykad przedstawia tablic elementw klasy Telefon. Poszczeglne
elementy tablicy zawieraj referencje zarwno do obiektw klasy Telefon, jak
rwnie do obiektw utworzonych na podstawie klas pochodnych (TelefonKomorkowy, TelefonStacjonarny).
Telefon[] tablicaTelefonow = new Telefon[4];
tablicaTelefonow[0]
tablicaTelefonow[1]
tablicaTelefonow[2]
tablicaTelefonow[3]

=
=
=
=

new
new
new
new

Telefon("634295432");
TelefonKomorkowy("504295432", "Orange");
TelefonStacjonarny("126493042", "1033");
TelefonInternetowy("325649344", "lech23");

Wywoanie dla kadego obiektu znajdujcego si wtablicy tablicaTelefonow


metody zadzwon("112") bdzie wywoaniem polimorficznym. Wzalenoci od
klasy obiektu wywoana zostanie odpowiednia metoda.

for (Telefon tel : tablicaTelefonow)


tel.zadzwon("112");

Mona uy rwnie nazwy interfejsu, ktry dana klasa implementuje.

68

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 121


Program 6. Zwierzta
Na podwrzu gospodarskim biegaj zwierzta domowe (pies, kot, krowa), wydajce odgosy. Zadaniem aplikacji jest przedstawienie zaistniaej sytuacji zwykorzystaniem jzyka obiektowego. Istotnym elementem wpywajcym na prostot
rozwizania jest wykorzystanie polimorfizmu.
public class Zwierzeta {
public static void main(String[] args) {
Zwierze[] zwierzeta = new Zwierze[3];
zwierzeta[0] = new Pies();
zwierzeta[1] = new Kot();
zwierzeta[2] = new Krowa();
System.out.println("Rykowisko...");
for(Zwierze zwierze: zwierzeta){
zwierze.dajGlos();
}
}
}
class Zwierze {
public void dajGlos(){
System.out.println("Gos zwierzcia");
}
}
class Pies extends Zwierze {
public void dajGlos(){
System.out.println("hau hau");
}
}
class Kot extends Zwierze {
public void dajGlos(){
System.out.println("miau miau");
}
}
class Krowa extends Zwierze {
public void dajGlos(){
System.out.println("muuuuu");
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

122 Metody inarzdzia programowania

3.2.4. Pakiety
Powizane ze sob klasy iinterfejsy69 umieszczane s wjednostkach bibliotecznych zwanych pakietami (ang. package). Takie grupowanie pozwala na szybsze odnalezienie waciwych klas iinterfejsw, jak rwnie wpywa korzystnie na
przejrzysto tworzonych aplikacji. Dodatkowe zalety pakietw to m.in.:
jasne okrelenie zwizkw (powiza) midzy klasami,
unikanie konfliktu nazw70,
moliwo skorzystania zdodatkowych modyfikatorw dostpu71.
Pakiety tworzy si poprzez uycie wkodzie rdowym programu sowa kluczowego package72, po ktrym wystpuje nazwa pakietu73. Okrela to lokalizacj
pliku skompilowanego (.class), ktry musi zosta umieszczony wpodanym pakiecie (folderze)74:
package telefonia;
package uczelnia.podstawy.narzedzia;

Pakiety posiadaj podobn struktur jak katalogi wsystemie plikw


(mog by rwnie zagniedane). Utworzenie pakietu uczelnia.podstawy.
narzedzia jest rwnoznaczne zutworzeniem struktury katalogw na dysku
./uczelnia/podstawy/narzedzia. Wszystkie pliki nalece do tego pakietu powinny znale si wprzytoczonej lokalizacji. Korzystanie zelementw pakietu
umoliwia sowo kluczowe import, po ktrym wystpuje nazwa pakietu oraz nazwa klasy, bd te znak gwiazdki symbolizujcy wszystkie klasy nalece do
wskazanego pakietu75.

Tematyka interfejsw zostanie poruszona wdalszej czci podrcznika.

69

Pakiety umoliwiaj korzystanie zklas lub interfejsw otakiej samej nazwie, ale innej strukturze (np. identyczna nazwa klas wodrbnych pakietach).

70

Moliwo uycia modyfikatora package.

71

Sowo package musi pojawi si jako pierwsza instrukcja programu.

72

Nazwy pakietw zawieraj tylko mae litery is tworzone na kilka sposobw (np. wykorzystujc odwrotny zapis domeny internetowej firmy).

73

Naley pamita, i spoza pakietu moliwy jest dostp tylko do elementw publicznych danego pakietu (klasy, interfejsy). Klasy, ktre nie okrelaj przynalenoci do konkretnego pakietu
s grupowane wtak zwany pakiet domylny, nieposiadajcy adnej nazwy.

74

Kompilator Javy poszukuje klas, wykorzystujc ciek zbudowan ze zmiennej rodowiskowej CLASSPATH oraz nazwy konkretnego pakietu (kropki wpakiecie zostaj zastpione znakiem /).

75

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 123

// wszystkie skadowe pakietw telefonia oraz uczelnia.podstawy.narzedzia


// s dostpne
import telefonia.*;
import uczelnia.podstawy.narzedzia.*;

Nazwa pakietw dostarczanych wraz zjzykiem programowania Java rozpoczyna si od sowa java (pakiety zwizane ze specyfikacj jzyka) bd te javax
(rozszerzenie specyfikacji).
Program 8. Wykorzystanie pakietu
Grupowanie klas realizujcych zblion funkcjonalno uatwia tworzenie
aplikacji. Zadaniem pakietu telefonia jest pogrupowanie wszystkich klas dotyczcych telefonw. Przykadowe wykorzystanie pakietu to import zniego klasy
potrzebnej do utworzenia telefonu komrkowego Kasi (onumerze 503984532
wsieci Plus) oraz wysanie zniego SMSaotreci Zadanie zpakietem wykonane na numer 602875295. Klasy wchodzce wskad pakietu telefonia powinny by klasami publicznymi76. Niezbdne jest uycie sowa kluczowego package
wraz znazw pakietu jako pierwszej instrukcji zawartej wpliku rdowym.

package telefonia; // pierwsza instrukcja wpliku rdowym


public class Telefon {
// ciao klasy (skadowe klasy)
}
package telefonia;
public class TelefonKomorkowy extends Telefon {
// ciao klasy (skadowe klasy)
}
package telefonia;
public class TelefonStacjonarny extends Telefon {
// ciao klasy (skadowe klasy)
}
package telefonia;
public class TelefonInternetowy extends Telefon {
// ciao klasy (skadowe klasy)
}
76

Nazwa klasy publicznej musi by zgodna znazw pliku rdowego. Wprzykadowym rozwizaniu kada zklas publicznych musi znajdowa si woddzielnym pliku rdowym.
Stowarzyszenie Edukacja dla Przedsibiorczoci

124 Metody inarzdzia programowania

import telefonia.*;
public class TelefonKasi {
TelefonKomorkowy telefonKasi = new TelefonKomorkowy ("503984532", "Plus");
telefonKasi.wyslijSMS("602875295", "Zadanie zpakietem wykonane");
}

3.2.5. Pojcia dodatkowe


Object77 jest gwn klas, zktrej porednio lub bezporednio dziedzicz
wszystkie klasy. Zawiera ona szereg metod uatwiajcych operacje na obiektach.
Najwaniejsze znich to78:
clone() tworzy kopi obiektu,
toString() zwraca reprezentacj obiektu wformie acucha tekstowego,
equals(Object) porwnuje dwa obiekty,
getClass() zwraca nazw klasy, na podstawie ktrej powsta obiekt.
Najczciej uywane to toString() oraz equals(Object), ktre przesaniane s
wklasach pochodnych.
Operator instanceof suy do sprawdzenia, czy dany obiekt naley do wskazanej klasy. Przyjmuje on warto true lub false. Warto true oznacza, i dany
obiekt naley do wskazanej klasy lub te dowolnej podklasy.
boolean sprawdzenie = telefonAni instanceof Telefon;

Dostp do skadowych klasy bazowej zklasy dziedziczcej moliwy jest za pomoc sowa kluczowego super. Wten sposb mona rwnie odwoywa si do
konstruktorw klasy nadrzdnej79 (nie s one dziedziczone). Wywoanie konstruktora
klasy bazowej musi by pierwsz instrukcj wciele konstruktora podklasy.
Klasa Object jest jedyn klas nie posiadajc klasy bazowej. Znajduje si ona na szczycie
hierarchii klas.

77

Pozostae metody zwizane s zsynchronizacj wtkw, generowaniem unikalnych kluczy dla


obiektw oraz czyszczeniem pamici przy usuwaniu obiektw.

78

Warto pamita osytuacji, gdy konstruktor podklasy nie wywouje jawnie konstruktora zklasy bazowej. Wtakich sytuacjach Java automatycznie wywoa konstruktor domylny (bezparametrowy) klasy bazowej.

79

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 125

3.3. Interfejsy iklasy abstrakcyjne


Niewtpliwym atutem programowania obiektowego jest zblienie tworzonych
programw do sposobu postrzegania rzeczywistoci przez czowieka. Przy pomocy klas moliwe jest modelowanie poj zdziedziny tworzonego programu.
Efektywne wykorzystanie narzdzi stosowanych wprogramowaniu zorientowanym obiektowo (interfejsy, klasy abstrakcyjne, wewntrzne oraz finalne) pozwala
na uzyskanie wysokiej elastycznoci wprocesie modelowania.

3.3.1. Interfejsy
Interfejsy wprogramowaniu obiektowym stanowi zbir wymaga dotyczcych
klas, ktre bd go stosowa. Wyraaj sposb opisu funkcjonalnoci klasy bez okrelania, wjaki sposb bdzie to uzyskane. Wskad interfejsw wchodz metody oraz
pola. Deklaracja metod skada si znagwkw (brak jest ciaa metody), natomiast
pola interfejsu to wycznie stae statyczne zjawnie okrelon wartoci. Wdeklaracjach wszystkich skadowych niezbdne jest uycie modyfikatora public.

Rys. 23. Interfejs iklasa implementujca

Stowarzyszenie Edukacja dla Przedsibiorczoci

126 Metody inarzdzia programowania


Klasy wykorzystujce interfejs nie rozszerzaj jego moliwoci, ale go implementuj. Oznacza to, e klasa musi zawiera definicj wszystkich metod (ciaa
tych metod) zadeklarowanych winterfejsie. Skadnia interfejsu zbliona jest do
deklaracji klasy. Wmiejsce class stosowane jest sowo kluczowe interface80.
interface Dzwoni {
public static String NUMER_ALARMOWY = "112";
public void zadzwon(String);
public void zadzwonNaNrAlarmowy();
}

Implementacja interfejsu polega na umieszczeniu sowa kluczowego implements wnagwku deklaracji klasy, anastpnie wymienieniu nazwy interfejsu,
ktry klasa implementuje81. Skadowymi klasy staj si wszelkie pola imetody
wystpujce wdefinicji klasy oraz pola imetody okrelone wdeklaracji interfejsu. Poniszy kod programu ilustruje implementacj interfejsu Dzwoni.

class Telefon implements Dzwoni {


// deklaracja pl klasy
private String numerTelefonu;
private int lacznyCzasRozmow;
private static double cenaRozmowy = 0.48;

// z/min.

// konstruktor klasy
public Telefon (String numer) {
numerTelefonu = numer;
}
// deklaracja metod klasy
public double obliczKwoteDoZaplaty() {
return cenaRozmowy * (lacznyCzasRozmow / 60);
}
public static void ustawCeneRozmowy(double nowaCena){
cenaRozmowy = nowaCena;
}

Dopuszczalne jest dziedziczenie interfejsw.

80

Moliwa jest implementacja dowolnej liczby interfejsw przez pojedyncz klas, co pozwala
na realizacj tzw. dziedziczenia wielobazowego.

81

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 127

// metody wymagane przez interfejs


public void zadzwon(String nrTelefonu) {
System.out.println ("Dzwoni do: " + nrTelefonu);
System.out.println ("Dry, dry...");
System.out.println ("Rozmowa wtoku...");
int czasRozmowy = (int) (Math.random()*3600);
lacznyCzasRozmow += czasRozmowy;
System.out.println ("Rozmowa zakoczona. ");
System.out.printf ("Czas rozmowy: %d min. %d sek.",
czasRozmowy/60, czasRozmowy%60);
}
public void zadzwonNaNrAlarmowy() {
System.out.println ("Dzwoni do: " + Dzwoni.NUMER_ALARMOWY);
System.out.println ("Dry, dry...");
System.out.println ("Centrum pomocy, sucham");
}
}
public class Test {
public static void main(String args[]) {
Telefon telefonKasi = new Telefon("127659463");
telefonKasi.zadzwon("606342765");
telefonKasi.zadzwonNaNrAlarmowy();
}
}

Interfejsy, podobnie jak klasy, mog by stosowane jako typ danych przy deklaracji zmiennej82. Jej warto stanowi odwoanie do obiektu dowolnej klasy,
ktra implementuje interfejs83.
Program 9. rodki transportu
Do zamodelowania istniejcych rodkw transportu uywanych do przemieszczania si zarwno na ldzie, wodzie, jak iwpowietrzu aplikacja tworzy interfejs
Plywa oraz Lata zawierajcy metody plyn() ilec(). Poniej przedstawione zostay
klasy implementujce kady zinterfejsw (np. Statek, Samolot) oraz klasa tworzca przykadowe obiekty wraz zwywoaniem zaimplementowanych metod.
82

Jest to tak zwane rzutowanie rozszerzajce.

83

Odwoania do metod, ktre nie wystpuj winterfejsie, moliwe s za pomoc odpowiedniego


rzutowania (tzw. rzutowanie zawajce).
Stowarzyszenie Edukacja dla Przedsibiorczoci

128 Metody inarzdzia programowania

interface Plywa {
public void plyn();
}
interface Lata {
public void lec();
}
class Statek implements Plywa {
public void plyn(){
System.out.println ("Statek pynie");
}
}
class Samolot implements Lata {
public void lec(){
System.out.println ("Samolot leci");
}
}
public class SrodkiTransportu {
public static void main (String[] args) {
Lata samolot = new Samolot();
samolot.lec();
Plywa statek = new Statek();
statek.plyn();
}
}

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 129


Program 10. Lista studentw
Dostpna jest lista studentw, ktr naley uporzdkowa wedug numeru albumu. Wykorzystana zostanie omawiana ju klasa Student, zawierajc imi, nazwisko oraz numer albumu studenta. Klasa ta powinna rwnie implementowa
interfejs Comparable. Do sortowania tablicy zawierajcej studentw uyta zostaa
metoda sort() klasy java.util.Arrays. Poniej przedstawiona zostaa przykadowa lista studentw.
Student[] lista = new Student[4];
lista[0]
lista[1]
lista[2]
lista[3]

=
=
=
=

new
new
new
new

Student("Jan", "Kowalski", 432187);


Student("Adam", "Nowak", 332132);
Student("Joanna", "Wyszek", 632165);
Student("Ania", "Nowak", 321419);

oraz uzyskane wyniki.


Student:
Student:
Student:
Student:

Ania Nowak
Adam Nowak
Jan Kowalski
Joanna Wyszek

nr
nr
nr
nr

albumu:
albumu:
albumu:
albumu:

321419
332132
432187
632165

Interfejs Comparable posiada metod compareTo(Object). Zwraca ona dodatni,


ujemn lub zerow warto typu int, okrelajc rezultat porwnania obiektw.
Metoda sort() zklasy java.util.Arrays umoliwia porzdkowanie tablicy skadajcej si ze zbioru obiektw, wykorzystujc warto zwracan przez metod
compareTo().

Stowarzyszenie Edukacja dla Przedsibiorczoci

130 Metody inarzdzia programowania

import java.util.*;
class Student implements Comparable {
private String imie;
private String nazwisko;
private int nrAlbumu;
public Student(String imie, String nazwisko, int nrAlbumu) {
this.imie = imie;
this.nazwisko = nazwisko;
this.nrAlbumu = nrAlbumu;
}
public int compareTo(Object s){
return (nrAlbumu - ((Student)s).nrAlbumu);
}
public String toString() {
return "Student " + imie + " " + nazwisko + " nr albumu: " + nrAlbumu;
}
}
public class PorzadkowanieListyStudentow {
public static void main (String[] args) {
Student[] lista = new Student[4];
lista[0]
lista[1]
lista[2]
lista[3]

=
=
=
=

new
new
new
new

Student("Jan", "Kowalski", 432187);


Student("Adam", "Nowak", 332132);
Student("Joanna", "Wyszek", 632165);
Student("Ania", "Nowak", 321419);

Arrays.sort(lista);
for(Student student: lista){
System.out.println(student);
}
}
}

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 131

3.3.2. Klasy imetody abstrakcyjne


Klasy abstrakcyjne wykorzystywane s wprocesie modelowania, zawierajc
jedynie oglne cechy izachowania obiektw. Nie wszystkie cechy izachowania
musz zosta szczegowo opisane. Cz zmetod (nawet wszystkie84) moe skada si wycznie zdeklaracji nazwy (tzw. metody abstrakcyjne85) poprzedzonej
identyfikatorem abstract. Umoliwia to stworzenie oglnego modelu bez koniecznoci zagbiania si wszczegy implementacyjne. Klasa abstrakcyjna nie moe
stanowi podstawy do utworzenia obiektu, moliwe jest natomiast na jej podstawie
tworzenie klas pochodnych, ktre musz zaimplementowa wszystkie metody abstrakcyjne wystpujce wklasie bazowej. Deklaracja klasy abstrakcyjnej odbywa si
za pomoc sowa kluczowego abstract umieszczonego przed nazw klasy.
abstract class Figura {
protected String kolor;
public Figura(String kolor) {
this.kolor = kolor;
}
public abstract double obliczPowierzchnie();
}
class Kwadrat extends Figura {
private double bok;
public Kwadrat(String kolor, double bok) {
super(kolor);
this.bok = bok;
}
public double obliczPowierzchnie() {
return bok * bok;
}
}
class Prostokat extends Figura {
private double szerokosc;

84

Wprzypadku gdy klasa skada si wycznie zmetod abstrakcyjnych, preferowane jest stosowanie interfejsw.

85

Klasa posiadajca jakkolwiek metod abstrakcyjn staje si automatycznie klas abstrakcyjn (jej nazwa musi zosta poprzedzona identyfikatorem abstract).
Stowarzyszenie Edukacja dla Przedsibiorczoci

132 Metody inarzdzia programowania

private double wysokosc;


public Prostokat(String kolor, double szerokosc, double wysokosc) {
super(kolor);
this.szerokosc = szerokosc;
this.wysokosc = wysokosc;
}
public double obliczPowierzchnie() {
return szerokosc * wysokosc;
}
}

3.3.3. Klasy imetody finalne


Klasy, zktrych nie jest moliwe dziedziczenie, nazywane s klasami finalnymi, co wyraane jest za pomoc sowa kluczowego final86.
public final class Procesor {
// ciao klasy (skadowe klasy)
}

Wprzypadku metod uycie sowa kluczowego final powoduje, e nie jest moliwe jej przesonicie wklasach dziedziczcych.
Wprzypadku ograniczonego uycia tworzonej klasy preferowane jest zdefiniowanie jej jako klasy wewntrznej (moliwe jest ukrycie jej implementacji).
Definicja klasy wewntrznej musi znale si wciele innej klasy87.
class Testowa {
// ciao klasy gwnej (skadowe klasy)
class KlasaWewnetrzna {
// ciao klasy wewntrznej (skadowe klasy)
}
}

Przykadami klas finalnych s rwnie klasy opakowujce czy te klasa String.

86

Klasy wewntrzne mog by rwnie definiowane wewntrz metod. Tak utworzone klasy nosz nazw lokalnych klas wewntrznych.

87

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 133


Klasa wewntrzna posiada dostp do wszystkich skadowych klasy, wktrej
zostaa zdefiniowana88. Nie ma rwnie adnych ogranicze co do wykorzystania
dziedziczenia czy te implementacji interfejsw. Szczeglnym przypadkiem klas
wewntrznych s klasy anonimowe89 (nie posiadajce nazwy).
Program 11. Telefon komrkowy zkart SIM
Kady telefon komrkowy posiada kart SIM zawierajc informacj zwizane znumerem, operatorem oraz ksik adresow. Model takiego telefonu reprezentuje klasa TelefonKomorkowyZKartaSIM, wktrej zadeklarowana zostaa klasa
wewntrzn KartaSIM.
public class TelefonKomorkowyZKartaSIM {
private KartaSIM sim;
public TelefonKomorkowyZKartaSIM(String numer) {
sim = new KartaSIM(numer);
}
// definicja klasy wewntrznej KartaSIM
class KartaSIM {
private String numerTelefonu;
public KartaSIM(String numer) {
numerTelefonu = numer;
}
public String pobierzNumerTelefonu() {
return numerTelefonu;
}
}
public String toString(){
return "Telefon zkart SIM onumerze: " + sim.pobierzNumerTelefonu();
}
public static void main (String[] args) {
TelefonKomorkowyZKartaSIM telefonMarcina = new
TelefonKomorkowyZKartaSIM("507864934");

88

Rwnie skadowych prywatnych.

89

Klasy anonimowe czsto wykorzystywane s do obsugi zdarze wprogramowaniu aplikacji


korzystajcych zgraficznego interfejsu uytkownika.
Stowarzyszenie Edukacja dla Przedsibiorczoci

134 Metody inarzdzia programowania

TelefonKomorkowyZKartaSIM telefonKasi = new


TelefonKomorkowyZKartaSIM("679342123");
System.out.println (telefonMarcina);
System.out.println (telefonKasi);
}
}

3.4. Strumienie, pliki iobsuga bdw


Program komputerowy skada si zcigu instrukcji wykonywanych przez komputer. Podstaw dla wykonania programu s dane wejciowe, bdce rdem informacji. Rezultat dziaania programu stanowi dane wyjciowe, najczciej skadowane na nonikach pamici. Operacje wejcia-wyjcia (ang. I/Oinput/output)
stanowi fundament dla komunikacji programu komputerowego zotoczeniem.
Naley zwrci uwag, i operacje majce za zadanie komunikowa si zotoczeniem programu mog stanowi potencjalne rda bdw. Tworzc kod programu, programista stara si je wmaksymalnym stopniu eliminowa. Niektre
znich moliwe s do zdiagnozowania ju na etapie kompilacji (dotyczy to przede
wszystkim bdw skadniowych kodu programu). Jednake pewne bdy ujawniaj si dopiero wmomencie wykonania programu. Ich obsuga jest warunkiem
dalszego prawidowego dziaania programu.

3.4.1. Wyjtki iich struktura


Gdy system napotka instrukcj programu, ktrej nie jest wstanie poprawnie
wykona, powstaje sytuacja wyjtkowa. Zgaszany jest wtedy tzw. wyjtek (ang.
exception). Jest to obiekt wywodzcy si zklasy Throwable lub klasy pochodnej,
co przedstawia poniszy rysunek (Rys. 24).

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 135

Rys. 24. Struktura wyjtkw

Poniszy kod zwiera instrukcj, ktra spowoduje bd wykonania programu.


Wprzedstawionym przykadzie zostanie zgoszony wyjtek ArithmeticException.
public void podziel() {
System.out.println("Wykonuj operacj dzielenia...");
double x = 5.0/0;
// miejsce powstania wyjtku ArithmeticException
System.out.println("Rezultat dzielenia: " + x);
System.out.println("Operacja dzielenia wykonana.");
}

Klasa Exception oraz jej klasy pochodne opisuj te wyjtki, ktre odnosz si
do wykonywanego programu. Gdy pojawia si sytuacja wyjtkowa (bd wprogramie), tworzony jest obiekt90 klasy Exception (lub klasy pochodnej) iprzekazywany
do JVM. Klasa Error wraz zjej klasami pochodnymi opisuje te wyjtki, ktre odnosz si do JVM. Tworzone na podstawie tych klas obiekty reprezentuj powane
bdy systemowe wystpujce wtrakcie wykonywania programu.
Jzyk programowania wprowadza podzia wszystkich wyjtkw na niekontrolowane oraz kontrolowane. Te ostatnie musz zosta obsuone bezporednio
wkodzie programu. Brak obsugi wyjtku kontrolowanego spowoduje powstanie
bdu kompilacji.
90

Obiekt moe zosta utworzony bezporednio wprogramie (instrukcja throw) lub te wygenerowany przez JVM.
Stowarzyszenie Edukacja dla Przedsibiorczoci

136 Metody inarzdzia programowania


Wyjtki kontrolowane (wywodzce si zklasy Exception, oprcz klasy RuntimeException) pojawiaj si najczciej wsytuacji, gdy wykonywany program
prbuje skorzysta zdostpnych zasobw (odczyt lub zapis do pliku, prba dostpu do bazy danych, zasobw wsieci Internet) ioperacja taka zakoczy si niepowodzeniem. Jeli wywoywana metoda wystpujca wkodzie programu zgasza
wyjtek kontrolowany, niezbdne jest jego przechwycenie oraz obsuga za pomoc
instrukcji try..catch lub te przekazanie go do metody nadrzdnej (wywoujcej).
Wymagane jest wtedy uycie klauzuli throws umieszczonej wnagwku metody
nadrzdnej, ktra zawiera musi nazwy wszystkich zgaszanych wyjtkw91:
public void odczytZawartosciPliku() throws IOException {
...
/* konieczne jest uycie try..catch
lub przekazanie wyjtku metodzie nadrzdnej (klauzula throws) */
FileReader fr = new FileReader("dane.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
...
}

Przykadami wyjtkw kontrolowanych s:


FileNotFoundException (prba dostpu do nieistniejcego pliku),

UnknownHostException (bdny adres dostpu do zasobu wsieci Internet),

SQLException (bd dostpu do zasobw bazy danych).

Wyjtki niekontrolowane (wywodzce si zklasy Error lub RuntimeException)


zwizane s najczciej zbdami logicznymi wystpujcymi wprogramie lub te
bdami JVM. Typowe przykady to:

ArithmeticException (problem zwykonaniem operacji arytmetycznej, np.


prba dzielenia przez zero),

ArrayIndexOutOfBoundsException (odwoanie do nieistniejcego elementu tablicy),

OutOfMemoryError (brak pamici),

StackOverflowError (przepenienie pamici stosu).

Wyjtki wywodzce si zklasy Error oznaczaj najczciej powane problemy systemowe. Std ich obsuga nie zawsze jest moliwa.
Brak nazwy wyjtku kontrolowanego wnagwku metody, wktrej moe on wystpi, powoduje bd kompilacji.

91

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 137

3.4.2. Obsuga sytuacji wyjtkowych


Jeli kod programu nie zawiera instrukcji obsugi zgoszonego wyjtku, program koczy dziaanie wywietlajc na konsoli informacj opowstaym bdzie92.
Moliwe jest jednak przechwycenie zgoszonego wyjtku iprogramowa jego obsuga. Aby moliwe byo przechwycenie wyjtku, naley umieci instrukcje mogce spowodowa bd wewntrz bloku instrukcji try:
public void podziel() {
try {
System.out.println("Wykonuj operacj dzielenia...");
double x = 5.0/0;
System.out.println("Rezultat dzielenia: " + x);
...
}
catch (ArithmeticException e){

System.out.println("Niestety, dzielenie przez 0 nie jest dozwolone!");

System.out.println("Wprowad inne, poprawne argumenty dziaania.");
}
finally {
// dodatkowe instrukcje (opcjonalnie)
}
// dalsze instrukcje metody

System.out.println("Operacja dzielenia wykonana.");
...
...
}

Jeli ktrakolwiek zinstrukcji umieszczonych wewntrz bloku try spowoduje


bd, wykonanie programu zostanie przerwane, asterowanie przekazane do bloku instrukcji catch93. Jeli typ powstaego wyjtku jest zgodny zwymienionym
typem winstrukcji catch, zostan wykonane wszystkie instrukcje znajdujce si
wewntrz bloku catch. Nastpnie sterowanie przebiegiem wykonania programu
zostanie przekazane do kolejnych instrukcji wystpujcych po bloku catch. Moliwe jest umieszczenie po catch bloku finally, ktrego instrukcje zostan wykonane niezalenie od powstaych wbloku try bdw. Wbloku finally umieszczane
s zreguy polecenia, zadaniem ktrych jest zarzdzanie zasobami systemu (np.
zamknicie pliku, zwolnienie nieuywanego zasobu pamici).
92

Wywietlany komunikat zawiera nazw wyjtku oraz miejsce, wktrym zosta zgoszony.

93

Blok programu try dopuszcza wystpowanie dowolnej liczby blokw catch(). Kolejno ich
wystpowania jest istotna icile zalena od struktury klas (zobacz schemat struktury wyjtkw).
Stowarzyszenie Edukacja dla Przedsibiorczoci

138 Metody inarzdzia programowania


Jeli wyjtek nie zostanie przechwycony iobsuony wmetodzie, wktrej wystpi, przekazywany jest do metod wywoujcych, zktrych ostatnia to metoda
main(). Gdy wadnej zmetod nie nastpi przechwycenie iobsuga wyjtku, program koczy dziaanie, wywietlajc na konsoli komunikat opowstaym bdzie.
Program 12. Suma liczb cakowitych
Zadaniem programu jest wyznaczenie sumy liczb cakowitych wprowadzonych zkonsoli. Aplikacja posiada zawart wkodzie programu obsug bdw,
umoliwiajc weryfikacj poprawnoci wprowadzonych danych.
import java.util.*;
public class SumaLiczbCalkowitych {
public static void main(String[] args) {
int sumaLiczb = 0;
int liczbaCalkowita = 0;
System.out.println("Wprowad liczby cakowite.");
System.out.println("Warto 0 koczy wprowadzanie.\n");
Scanner sc = new Scanner(System.in);
do {
try {
System.out.print("Liczba cakowita: ");
liczbaCalkowita = sc.nextInt();
sumaLiczb += liczbaCalkowita;
}
catch (InputMismatchException e) {
System.out.println("Wprowadzona warto \""
+ sc.nextLine() + "\" jest niepoprawna!!!");
}
} while (liczbaCalkowita!=0);
System.out.println("Suma wprowadzonych wartoci: " + sumaLiczb);
}
}

Oprcz wyjtkw zgaszanych przez JVM, moliwe jest programowe zgaszanie wyjtkw bezporednio wkodzie programu. Poniszy fragment zawiera
instrukcj zgaszajc wyjtek (throw), wprzypadku gdy nastpi prba odwoania
do nieistniejcego elementu tablicy:

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 139

int[] tab = new int[3];


for (int i=0; i<=3; i++) {
if (i>= 3) {
throw new ArrayIndexOutOfBoundsException("Przekroczony zakres tablicy");
}
tab[i] = 5;
}

Mechanizm obsugi wyjtkw umoliwia rozbudow struktury klas onowe


kategorie wyjtkw. Nowe klasy naley tworzy na podstawie klasy Exception
lub klas pochodnych. Klasy takie zawieraj najczciej zadeklarowane jawnie
konstruktory umoliwiajce przekazanie informacji opowstaym bdzie.
class WyjatekLiczbaNaturalna extends Exception {
public WyjatekLiczbaNaturalna() {
super("Nieprawidowa liczba naturalna.");
}
public WyjatekLiczbaNaturalna(String komunikat) {
super(komunikat);
}
}

Po utworzeniu nowej klasy wyjtku moliwe jest zgaszanie wyjtkw utworzonego typu.
if (liczba < 1) {
throw new WyjatekLiczbaNaturalna();
}

Zgoszony wyjtek moe by nastpnie przechwycony iobsugiwany za pomoc instrukcji try..catch.


Program 13. Temperatura pomieszczenia
Wpomieszczeniu zamontowano regulator temperatury sterowany komputerowo. Poniszy program steruje urzdzeniem regulujcym temperatur. Wprzypadku pojawienia si bdu wyrzucany jest nowy wyjtek.

Stowarzyszenie Edukacja dla Przedsibiorczoci

140 Metody inarzdzia programowania

public class TemperaturaPomieszczenia {


private final double TEMP_MAX = 25.0;
private final double TEMP_MIN = 15.0;
private double temperatura;
public static void main(String[] args) {
TemperaturaPomieszczenia kuchnia = new TemperaturaPomieszczenia();
System.out.println("ELEKTRONICZNY REGULATOR TEMPERATURY");
kuchnia.ustawTemperature(19.4);
System.out.println("Aktualna temperatura wkuchni to: " +
kuchnia.pobierzTemperature());
kuchnia.ustawTemperature(27.1);
}
public void ustawTemperature(double temp) throws TemperaturaException {
if ((temp < TEMP_MIN) || (temp > TEMP_MAX)) {
throw new TemperaturaException();
} else {
temperatura = temp;
}
}
public double pobierzTemperature() {
return temperatura;
}
}
class TemperaturaException extends Exception {
public TemperaturaException() {
super("Temperatura poza dopuszczalnym zakresem.");
}
public TemperaturaException(String komunikat) {
super(komunikat);
}
}

3.4.3. Strumienie danych


Operacje wejcia-wyjcia opieraj si na pojciu strumienia (ang. stream),
rozumianego jako kana transmisyjny, przez ktry przepywa sekwencja bajtw
ze rda do programu lub zprogramu do miejsca przeznaczenia. Gdy dane przekazywane s ze rda do programu, mowa jest ostrumieniu wejciowym (ang.
input stream), natomiast jeli dane przekazywane s zprogramu do miejsca przeznaczenia, wtedy okrelane jest to jako strumie wyjciowy (ang. output stream),
co przedstawia poniszy rysunek (Rys. 25). rdem czy miejscem przeznaczenia
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 141


danych mog by pliki dyskowe, urzdzenia (np. drukarka, skaner), inne programy czy zasoby danych dostpne wsieci (np. zasoby sieci Internet).

Rys. 25. Wejciowe iwyjciowe strumienie danych

Istnieje pokana grupa klas bibliotecznych do obsugi strumieni danych. Poniewa Java dzieli strumienie danych na strumienie wejcia oraz wyjcia, std te
zbir klas bibliotecznych rwnie zosta podzielony wedug tych dwch kategorii.
Tabela 7 przedstawia klasy bazowe.

Tabela 7. Klasy bazowe dla operacji wejcia-wyjcia


Strumie

znakowy

binarny

Wejciowy (input)

java.io.Reader

java.io.InputStream

Wyjciowy (output)

java.io.Writer

java.io.OutputStream

Wzalenoci od charakteru rda lub miejsca przeznaczenia danych wykorzystywane s dedykowane klasy pochodne.
Sekwencyjny dostp do plikw94 realizowany jest poprzez klasy FileInputStream, FileOutputStream oraz FileReader, FileWriter. Dwie pierwsze umoliwiaj dostp (odczyt oraz zapis) do danych binarnych (pliki graficzne, dwikowe, ), atake do danych tekstowych wformacie ASCII, natomiast dwie ostatnie
realizuj dostp do plikw tekstowych wformacie Unicode. Poniszy program ilustruje odczyt zawartoci pliku tekstowego. Naley zwrci uwag na konieczno
uycia obsugi bdw.
94

Wyrni mona sekwencyjny dostp do plikw (ang. sequencial access) oraz dostp swobodny (ang. random access).
Stowarzyszenie Edukacja dla Przedsibiorczoci

142 Metody inarzdzia programowania

import java.io.*;
public class OdczytPlikuTekstowego {
public static void main(String[] args) {
FileReader plik = null;
int znak;
try {
// obiekt reprezentujcy wskazany plik tekstowy
plik = new FileReader("dane.txt");
// odczyt kolejnych znakw zpliku
while ( (znak = plik.read()) != -1 ) {
// wywietlenie odczytanego znaku na konsoli
System.out.print((char)znak);
}
}
catch (FileNotFoundException e) {
System.out.println("Brak pliku opodanej nazwie!");
}
catch (IOException e) {
System.out.println("Problem zodczytem pliku!");
}
finally {
if (plik != null)
try {
plik.close();
}
catch (IOException e){
System.out.println("Problem zzamkniciem pliku!");
}
}
}
}

Dla zwikszenia wydajnoci operacji wejcia-wyjcia odczyt oraz zapis danych moe by buforowany, co realizowane jest poprzez uycie klas
BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter.
FileReader plik = new FileReader("dane.txt");
BufferedReader plikBuforowany = new BufferedReader(plik);
...
String liniaTekstu;
liniaTekstu = plikBuforowany.readLine();
...

Dodatkowo klasa BufferedReader posiada metod readLine(), umoliwiajc


odczyt pojedynczej linii zpliku tekstowego.
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 143


Program 14. Krainy geograficzne
Na podstawie danych odczytanych zwiersza polece program tworzy plik tekstowy zwykazem krain geograficznych.
import java.io.*;
public class KrainyGeograficzne {
public static void main(String[] args) {
FileWriter plik = null;
final boolean dopisywanie = true; // tryb zapisu do pliku

String EOL = System.getProperty("line.separator"); // znak koca linii
try {
// obiekt reprezentujcy wskazany plik tekstowy
plik = new FileWriter("KrainyGeograficzne.txt", dopisywanie);
plik.write(args[0] + EOL);
System.out.println("Zapisano do pliku: " + args[0]);
}
catch (IOException e) {
System.out.println("Problem zzapisem do pliku!");
}
finally {
if (plik != null)
try {
plik.close();
}
catch (IOException e) {
System.out.println("Problem zzamkniciem pliku!");
}
}
}
}

Wdobie Internetu trudno wyobrazi sobie jzyk programowania, ktry nie


umoliwiaby dostpu oraz korzystania zzasobw zgromadzonych wsieci. Jzyk
programowania Java, dziki rozbudowanej bibliotece klas, posiada silne wsparcie
dla wykonywania takich operacji. Jednym zpodstawowych narzdzi umoliwiajcych dostp do zasobw sieciowych jest klasa java.net.URL. Dziki zastosowaniu ujednoliconego formatu adresowania URL (ang. Uniform Resource Locator),
moliwe jest wykorzystanie dowolnego zasobu udostpnionego wsieci WWW.
Moe nim by zarwno plik, katalog, ale take, poprzez wykorzystanie dostpnych protokow, dostp do zasobw zgromadzonych wbazach danych.

Stowarzyszenie Edukacja dla Przedsibiorczoci

144 Metody inarzdzia programowania


Program 15. Zasoby sieci Internet
Zadaniem aplikacji jest wywietlenie na konsoli zawartoci wskazanej strony
WWW.
import java.net.*;
import java.io.*;
public class ZasobyInternetu {
public static void main(String[] args) {
String adres = "http://www.uek.krakow.pl";
try {
URL url = new URL(adres);
InputStream inStream = url.openStream();
BufferedReader dane =
new BufferedReader(new InputStreamReader(inStream));
String linia = "";
while ((linia = dane.readLine()) != null)
System.out.println(linia);
}
catch (Exception e) {
System.out.println(e.toString());
}
}
}

3.4.4. Pliki ikatalogi


Obiekt klasy File reprezentuje pojedynczy plik wsystemie lub katalog (rwnie nieistniejcy). Szereg metod tej klasy pozwala na operowanie na plikach lub
katalogach systemu. Poniszy przykad ilustruje uycie klasy File do wywietlenia zawartoci katalogu Windows:
import java.io.*;
public class ZawartoscFolderu {
public static void main(String[] args) {
String nazwaFolderu = "C:" + File.separator + "WINDOWS";
File folder = new File(nazwaFolderu);
for(String nazwaPlikuLubFolderu : folder.list())
System.out.println(nazwaPlikuLubFolderu);
}
}
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 145


Ponadto metody klasy File umoliwiaj wszczeglnoci utworzenie nowego
pliku, usuwanie plikw, tworzenie folderw, zmian atrybutw plikw, zmian
nazwy pliku, sprawdzenie statusu (plik czy katalog). Peny wykaz metod dostpny
jest wJava API.
Program 16. Pojemno dyskw
Wikszo komputerw wyposaona jest wpami masow. Aplikacja wywietla
na konsoli wykaz dostpnych nonikw pamici wraz zinformacj oich cakowitej
pojemnoci. Wykorzystane zostay metody dostpne wklasie java.io.File.
import java.io.*;
public class PojemnoscDyskow {
public static void main(String[] args) {
String folderGlowny = File.separator;
String zasob;
double pojemnosc;
double GB = 1024*1024*1024;
System.out.println("NAZWA POJEMNO");
File[] dyski = (new File(folderGlowny)).listRoots();
for(File dysk : dyski) {
zasob = dysk.getPath();
pojemnosc = dysk.getTotalSpace()/GB;
System.out.printf("%4s %8.2fGB\n", zasob, pojemnosc);
}
}
}

Program 17. Folder dysku systemowego


Zadaniem aplikacji jest wywietlenie zawartoci folderu gwnego dysku systemowego.
import java.io.*;
public class FolderDyskuSystemowego {
public static void main(String[] args) {
String nazwaFolderu = "C:" + File.separator;
File folder = new File(nazwaFolderu);
for(String nazwaPlikuLubFolderu : folder.list())
System.out.println(nazwaPlikuLubFolderu);
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

146 Metody inarzdzia programowania

3.5. Graficzny interfejs uytkownika


Wykorzystanie wprojektowanych aplikacjach graficznego interfejsu uytkownika GUI (ang. Graphical User Interface) zdecydowanie poprawia komfort uytkowania programu. Dostpny wJavie zbir klas bibliotecznych Swing95 jest rozwiniciem istniejcej biblioteki AWT (ang. Abstract Window Toolkit), realizujcej
operacje graficzne wpoprzednich wersjach jzyka. Zawarte wdystrybucji Javy
pakiety graficzne skadaj si zpokanej liczby komponentw, ktre umieszczone
wodpowiednich kontenerach, przy zastosowaniu obsugi zdarze, tworz kocow aplikacj. Poszczeglne elementy wchodzce wskad aplikacji dostpne s
wpakietach javax.swing, java.awt oraz java.awt.event.
Podstaw kadej aplikacji jest wybr odpowiedniego kontenera gwnego
(okna) sucego do przechowywania pozostaych elementw96. Swing oferuje
kilka takich kontenerw: JApplet, JDialog, JWindow oraz JFrame, dostpnych wpakiecie javax.swing. Zazwyczaj wykorzystywana jest klasa JFrame udostpniajca
definicj okna wraz zpaskiem tytuowym iniezbdnymi przyciskami.

3.5.1. Gwne okno aplikacji


Tworzenie interfejsu graficznego przy zastosowaniu biblioteki Swing, sprowadza si do wykorzystania dostpnych wpakiecie zestaww klas. Utworzenie
nowego okna polega na utworzeniu instancji klasy javax.swing.JFrame, ustaleniu
jego rozmiaru oraz wywietleniu go na ekranie97.

Swing wystpuje rwnie do czsto pod nazw JFC (ang. Java Foundation Classes).

95

Kontenery gwne (okna) nazywane s inaczej komponentami cikimi (odwouj si do natywnych komponentw danej platformy systemowej).

96

Domylnie obiekty klasy JFrame nie s widoczne na ekranie.

97

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 147

import javax.swing.*;
public class ModelRGB {
public static void main(String[] args) {
// utworzenie okna wraz zokreleniem tytuu
JFrame okno = new JFrame("Model RGB przestrzeni barw");
// ustalenie rozmiarw
okno.setSize(400, 200);
// okrelenie operacji realizowanej podczas zamknicia okna
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// wywietlenie okna
okno.setVisible(true);
}
}

Wtak utworzonym oknie mona umieszcza poszczeglne komponenty.


Umieszczenie przykadowego tekstu (obiekt klasy JLabel) realizowane jest za pomoc instrukcji:
JLabel opisRGB =
new JLabel("R-red (czerwony), G-green (zielony), B-blue (niebieski)");
okno.add(opisRGB);

Stowarzyszenie Edukacja dla Przedsibiorczoci

148 Metody inarzdzia programowania

Rys. 26. Okno aplikacji wykorzystujcej graficzny interfejs uytkownika

Wymienione instrukcje naley umieci przed wywietleniem okna (Rys. 26).


Taki sposb sprawdza si jedynie podczas umieszczania woknie niewielkiej
liczby komponentw.

3.5.2. Kontenery ikomponenty


Wprzypadku wikszej liczby komponentw wykorzystywane s kontenery
grupujce elementy. Jednym znich jest obiekt klasy JPanel. Poniszy kod stanowi
przykad aplikacji wywietlajcej okno zawierajce 3 przyciski. Naley zwrci
uwag na odmienny sposb tworzenia okna gwnego (klasa dziedziczca zklasy
JFrame).

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 149

import javax.swing.*;
import java.awt.*;
class Kontener extends JPanel {
private JButton przyciskR, przyciskG, przyciskB;
public Kontener() {
// utworzenie przyciskw
przyciskR = new JButton("R-czerwony");
przyciskG = new JButton("G-zielony");
przyciskB = new JButton("B-niebieski");
// umieszczenie przyciskw wkontenerze
add(przyciskR);
add(przyciskG);
add(przyciskB);
// ustalenie koloru ta kontenera
setBackground(Color.green);
}
}
class Okno extends JFrame {
public Okno(){
super("Model RGB przestrzeni barw");
setSize(400, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
public class ModelRGBKontener {
public static void main(String[] args) {
// utworzenie okna oraz kontenera zprzyciskami
Okno okno = new Okno();
Kontener kontener = new Kontener();
// umieszczenie kontenera woknie
okno.add(kontener);
// wywietlenie okna
okno.setVisible(true);
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

150 Metody i narzdzia programowania


Wynikdziaaniaprogramuprzedstawiaponiszyrysunek(Rys.27).

Rys. 27. grupowanie elementw w kontenerach

PozaklasJPanelistniejeszeregkontenerwumoliwiajcychgrupowanie
komponentw98.Tabela8przedstawianajczciejwykorzystywane.

tabela 8. wykaz najczciej stosowanych kontenerw


Kontener
JPanel

Realizowana funkcja
grupowanie komponentw

JScrollPane

dodawanie paskw przesuwnych

JSplitPane

Podzia kontenera (w pionie bd w poziomie)

JTabbedPane

tworzenie zakadek

JToolBar

obsuga paska narzdziowego

GUIudostpniaszeregkomponentwrealizujcychfunkcjinterakcjizuytkownikiem.Dzikiichwykorzystaniuuytkownikprogramumoewprowadza
informacjetekstowe,dokonywawyborupoprzezwskazaniewywietlonychopcji
lubtezatwierdzawprowadzonedane.BibliotekaSwingdysponujeklasamirealizujcymiwymienioneczynnoci.Wykaznajczciejwykorzystywanychkomponentw99zawartyzostawponiszejtabeli(Tabela9).
Szczegowa charakterystyka kontenerw oraz komponentw dostpna jest na stronie
http://download.oracle.com/javase/tutorial/ui/features/components.html

98

Komponentytenazywanesdoczstokomponentamilekkimi.

99

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 151


Tabela 9. Wykaz wybranych komponentw pakietu Swing
Komponent
JButton
JComboBox
JList
JCheckBox
JMenu
JRadioButton
JSlider
JTextField, JTextArea

Realizowana funkcja
Przycisk
Lista rozwijana
Lista
Pole wyboru
Menu
Pole opcji
Suwak
Pole tekstowe

JLabel

Etykieta tekstowa

JProgressBar

Wskanik postpu

JToolTip
JColorChooser

Podpowied
Panel wyboru koloru

JTable

Tabela danych

JTree

Ukad hierarchiczny danych (struktura drzewa)

Rozmieszczenie poszczeglnych elementw (kontenerw czy te komponentw) woknie aplikacji zalene jest od zastosowania tzw. menadera rozkadu.
Wpywa on zarwno na pozycj elementw wzgldem siebie, jak rwnie na ich
rozmiar isposb wyrwnywania. Kady kontener stosuje domylny rozkad elementw. Jego zmiana moliwa jest poprzez uycie metody setLayout().Tabela
10 przedstawia typowe ukady elementw zalene od zastosowanego menadera
rozkadu.

Stowarzyszenie Edukacja dla Przedsibiorczoci

152 Metody inarzdzia programowania


Tabela 10. Wybrane metody rozmieszczania elementw interfejsu100
Menader
BorderLayout

Ukad elementw
wg kierunkw geograficznych (pnoc, poudnie,
wschd, zachd, rodek)

BoxLayout

wrzdzie lub kolumnie

FlowLayout

ssiadujcy wpoziomie

GridLayout, GridBagLayout

tabelaryczny

GroupLayout

wgrupach

CardLayout

wkartach

Utworzenie okienka korzystajcego zrozkadu BorderLayout oraz umieszczenie przykadowych komponentw moe wyglda wnastpujcy sposb:
import javax.swing.*;
import java.awt.*;
public class ModelRGBMenadzerRozkladu extends JFrame {
public ModelRGBMenadzerRozkladu() {
super("Model RGB przestrzeni barw");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JPanel kontener = new JPanel();
kontener.add(new JButton("R-czerwony"));
kontener.add(new JButton("G-zielony"));
kontener.add(new JButton("B-niebieski"));
add(kontener, BorderLayout.SOUTH);
add(new JTextArea(), BorderLayout.CENTER);
}
public static void main(String[] args) {
ModelRGBMenadzerRozkladu okno = new ModelRGBMenadzerRozkladu();
okno.setVisible(true);
}
}

Szczegowa charakterystyka menaderw rozkadu umoliwiajcych rozmieszczenie poszczeglnych elementw dostpna jest na stronie http://download.oracle.com/javase/tutorial/
uiswing/layout/index.html

100

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 153


Wynikdziaaniaprogramuprzedstawiaponiszyrysunek(Rys.28).

Rys. 28. Rozmieszczanie elementw w oknie aplikacji

3.5.3. obsuga zdarze


Programowanie aplikacji wykorzystujcej GUI zwizane jest nierozerwalnie
zpojciemobsugizdarze.Generowanesonenajczciejprzezmysz,klawiaturczyteposzczeglneelementyinterfejsugraficznego.WprzypadkuJavyzdarzeniemjestobiekt,ktryopisujezmianstanuswojegordaspowodowannp.
przez nacinicie klawisza, kliknicie myszk, wybr elementu zlisty wyboru,
zamknicieokna.rdemjestobiekt,ktrywygenerowazdarzenie.
Obsugazdarzesprowadzasidodeklaracjiklasyobsugujcejkonkretnytyp
zdarzeniaorazpowizaniaobiektutejklasyzkonkretnymkomponentem(rdem
zdarzenia).Wszystkiezdarzeniaokreloneszapomocspecjalnychinterfejsw
(tzw.nasuchiwaczy).Zostayoneprzedstawionewponiszejtabeli(Tabela11).

tabela 11. obsuga zdarze101


Interfejs

Rodzaj zdarzenia

ActionListener

zmiana stanu komponentu

WindowListener

zmiana stanu okna

MouseListener

zmiana stanu przyciskw myszy

MouseMotionListener
ComponentListener
FocusListener
ListSelectionListener

zmiana pooenia wskanika myszy


zmiana widocznoci, rozmiarw i pooenia
komponentu
aktywacja komponentu
wybr wartoci z listy

Penyopisobsugizdarzewrazzprzykadowymikodamirdowymidostpnyjestnastroniehttp://download.oracle.com/javase/tutorial/uiswing/events/index.html

101

Stowarzyszenie Edukacja dla Przedsibiorczoci

154 Metody inarzdzia programowania


Kady interfejs zawiera nagwki metod reprezentujce poszczeglne rodzaje
zdarze. Klasa obsugujca zdarzenia implementuje odpowiedni interfejs (interfejsy).
Poniej podany zosta przykadowy kod klasy obsugujcej kliknicie przycisku.
class Obsluga implements ActionListener {
public void actionPerformed(ActionEvent e){
// instrukcje wykonywane podczas wystpienia zdarzenia
// ...
}
}

Powizanie komponentu zobiektem obsugujcym zdarzenie realizowane jest


za pomoc metody addNazwaInterfejsu()102.
JButton przycisk = new JButton("Tekst przycisku");
Obsluga dzialanie = new Obsluga();
przycisk.addActionListener(dzialanie);

Wszystkie interfejsy iklasy zwizane zobsug zdarze dostpne s wpakiecie java.awt.event. Poniszy kod programu zawiera przykadow aplikacj, wktrej zaimplementowana zostaa obsuga zdarzenia, polegajcego na naciniciu
przycisku umieszczonego woknie aplikacji. Rezultatem tej czynnoci jest zmiana
koloru wywietlanego okna.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ModelRGBObslugaZdarzen extends JFrame {
private JButton przyciskR, przyciskG, przyciskB;
private JPanel panel1, panel2;
public ModelRGBObslugaZdarzen() {
super("Model RGB przestrzeni barw");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());

NazwaInterfejsu oznacza konkretny typ zdarzenia.

102

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 155

panel1 = new JPanel();


panel2 = new JPanel();
przyciskR = new JButton("R-czerwony");
przyciskG = new JButton("G-zielony");
przyciskB = new JButton("B-niebieski");
ObslugaZdarzenia zmianaNaCzerwony = new ObslugaZdarzenia(Color.red);
ObslugaZdarzenia zmianaNaZielony = new ObslugaZdarzenia(Color.green);
ObslugaZdarzenia zmianaNaNiebieski = new ObslugaZdarzenia(Color.blue);
przyciskR.addActionListener(zmianaNaCzerwony);
przyciskG.addActionListener(zmianaNaZielony);
przyciskB.addActionListener(zmianaNaNiebieski);
panel1.add(przyciskR);
panel1.add(przyciskG);
panel1.add(przyciskB);
panel2.setBackground(Color.white);
add(panel1, BorderLayout.SOUTH);
add(panel2, BorderLayout.CENTER);
}
private class ObslugaZdarzenia implements ActionListener {
private Color kolor;
public ObslugaZdarzenia(Color k){
this.kolor = k;
}
public void actionPerformed(ActionEvent e) {
panel2.setBackground(kolor);
repaint();
}
}
public static void main(String[] args) {
ModelRGBObslugaZdarzen okno = new ModelRGBObslugaZdarzen();
okno.setVisible(true);
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

156 Metody inarzdzia programowania


Program 18. Sumator liczb rzeczywistych
Zadaniem aplikacji jest wyznaczenie sumy wartoci dwch liczb typu rzeczywistego.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SumatorLiczbRzeczywistych extends JFrame {
private JButton przycisk;
private JTextField liczbaPierwsza, liczbaDruga;
private JLabel wynik;
public SumatorLiczbRzeczywistych() {
super("Sumator liczb rzeczywistych");
setSize(350, 70);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
liczbaPierwsza = new JTextField("0", 4);
liczbaDruga = new JTextField("0", 4);
JLabel plus = new JLabel("+");
wynik = new JLabel("");
przycisk = new JButton("=");
Obsluga dzialanie = new Obsluga();
przycisk.addActionListener(dzialanie);
panel.add(liczbaPierwsza);
panel.add(plus);
panel.add(liczbaDruga);
panel.add(przycisk);
panel.add(wynik);
}

add(panel);

private class Obsluga implements ActionListener {






}

public void actionPerformed(ActionEvent e) {


Float wartoscPierwsza = new Float(liczbaPierwsza.getText());
Float wartoscDruga = new Float(liczbaDruga.getText());
float suma = wartoscPierwsza + wartoscDruga;
wynik.setText("" + suma);
}

public static void main(String[] args) {


SumatorLiczbRzeczywistych okno = new SumatorLiczbRzeczywistych();
okno.setVisible(true);
}
}
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 157


Program 19. Przegldarka plikw tekstowych
Aplikacja umoliwia wywietlenie zawartoci wskazanego pliku tekstowego.
import
import
import
import

javax.swing.*;
java.awt.*;
java.awt.event.*;
java.io.*;

public class PrzegladarkaPlikowTekstowych extends JFrame implements ActionListener


{
JMenuItem menuOtworz;
JMenuItem menuZamknij;
JTextArea poleTekstowe;
File plik;
// definicja wygldu aplikacji
public PrzegladarkaPlikowTekstowych() {
super("Przegldarka plikw tekstowych");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// dodanie obszaru wywietlania pliku tekstowego
setLayout(new BorderLayout());
poleTekstowe = new JTextArea("");
poleTekstowe.setEditable(false);
JScrollPane panel = new JScrollPane(poleTekstowe);
add(panel, BorderLayout.CENTER);
// dodanie menu programu wraz obsug zdarze
JMenu menu = new JMenu("Plik");
menuOtworz = new JMenuItem("Otwrz");
menuOtworz.addActionListener(this);
menuZamknij = new JMenuItem("Zamknij");
menuZamknij.addActionListener(this);
menu.add(menuOtworz);
menu.add(menuZamknij);
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
setJMenuBar(menuBar);
setSize(400,400);
}
// obsuga zdarze (wybr opcji menu)
public void actionPerformed(ActionEvent e) {
boolean status = false;
String akcja = e.getActionCommand();
// wybrana opcja "Otwrz"
Stowarzyszenie Edukacja dla Przedsibiorczoci

158 Metody inarzdzia programowania

if(akcja.equals("Otwrz")) {
status = otworzPlik();
if(!status)
JOptionPane.showMessageDialog(null, "Bd otwarcia pliku!", "Bd",
JOptionPane.ERROR_MESSAGE);
}
// wybrana opcja "Zamknij"
else if(akcja.equals("Zamknij")){
System.exit(0);
}

}
// odczyt pliku tekstowego iumieszczenie jego zawartoci woknie programu
private boolean otworzPlik() {
// wywietlenie okna dialogowego zmoliwoci wyboru pliku tekstowego
JFileChooser dialog = new JFileChooser();
dialog.setDialogTitle("Otwrz plik");
dialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
dialog.setCurrentDirectory(new File("."));
// otworzenie wskazanego pliku iodczytanie jego zawartoci
int wynik = dialog.showOpenDialog(this);
if (wynik == JFileChooser.CANCEL_OPTION) {
return true;
} else if (wynik == JFileChooser.APPROVE_OPTION) {
plik = dialog.getSelectedFile();
String zawartosc = odczytajPlik(plik);
if (zawartosc != null)
poleTekstowe.setText(zawartosc);
else
return false;
} else {
return false;
}
return true;
}
// odczyt zawartoci pliku tekstowego
private String odczytajPlik(File file) {
StringBuffer bufor;
String linia;
try {
FileReader in = new FileReader(file);
BufferedReader bin = new BufferedReader(in);
bufor = new StringBuffer();
while ((linia = bin.readLine()) != null) {
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 159

bufor.append(linia + "\n");
}
in.close();
}
catch(IOException e) {
return null;
}
return bufor.toString();
}
// uruchomienie aplikacji
public static void main(String[] args) {
PrzegladarkaPlikowTekstowych przegladarka = new PrzegladarkaPlikowTekstowych();
przegladarka.setVisible(true);
}
}

3.5.4. Elementy graficzne


Kady obiekt graficznego interfejsu uytkownika (kontener, komponent) posiada metod paintComponent(), zadaniem ktrej jest narysowanie obiektu na ekranie
monitora. Przesonicie tej metody umoliwia umieszczenie przez programist
dodatkowych elementw graficznych (punkty, linie, figury geometryczne) wwybranym obiekcie. Mimo i operacje rysowania przeprowadzi mona na kadym
komponencie dziedziczcym zklasy JComponent to najczeciej wykorzystywany
jest kontener JPanel. Tworzone aplikacje graficzne wykorzystuj przewanie dostpne klasy zawarte wpakiecie java.awt.geom103, jak rwnie klasy java.awt.
Color czy java.awt.Font.
Ponisza aplikacja rysuje 3 prostokty, wypeniajc kady znich jednym zkolorw palety RGB. Kady zkolorw zosta opisany poprzez umieszczenie wnim
cigu znakw.

Przykadowe klasy umoliwiajce rysowanie punktw, linii lub figur geometrycznych na


paszczynie to: Point2D, Line2D, Rectangle2D, Ellipse2D.

103

Stowarzyszenie Edukacja dla Przedsibiorczoci

160 Metody inarzdzia programowania

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
class MojPanel extends JPanel {
private
private
private
private
private

int x, y;
int wysokoscCzcionki, szerokoscNapisu;
String czerwony = "R - czerwony";
String zielony = "G - zielony";
String niebieski = "B - niebieski";

public MojPanel (){


setBackground(Color.white); // ustalenie koloru ta
}
public void paintComponent(Graphics g) {

x = getSize().width;
y = getSize().height;

super.paintComponent(g); // wywoanie metody paintComponent() zklasy nadrzdnej


Graphics2D g2 = (Graphics2D) g; // rzutowanie parametru

g2.setPaint(Color.red);
g2.fillRect(0, 0, x, y/3);

// ustawienie koloru rysowania

g2.setPaint(Color.green);
g2.fillRect(0, y/3, x, y/3);
g2.setPaint(Color.blue);
g2.fillRect(0, y/3*2, x, y/3);

// ustawienie koloru rysowania

Font czcionka = new Font("Verdana", Font.PLAIN, 20);


g2.setFont(czcionka);
// ustawienie czcionki

g2.setPaint(Color.white);

wysokoscCzcionki = getFontMetrics(czcionka).getHeight();

// wywietlenie napisu
szerokoscNapisu = getFontMetrics(czcionka).stringWidth(czerwony);
g2.drawString(czerwony, x/2-szerokoscNapisu/2, (y/3)/2+(wysokoscCzcionki/2));

// wywietlenie napisu
szerokoscNapisu = getFontMetrics(czcionka).stringWidth(zielony);
g2.drawString(zielony, x/2-szerokoscNapisu/2, (y/2)+(wysokoscCzcionki/2));

// wywietlenie napisu
szerokoscNapisu = getFontMetrics(czcionka).stringWidth(niebieski);
g2.drawString(niebieski, x/2-szerokoscNapisu/2,

Uniwersytet Ekonomiczny w Krakowie

// ustawienie koloru rysowania

Paradygmat programowania obiektowego 161

(y-((y/3)/2)+(wysokoscCzcionki/2)));
}

}
public class ModelRGBFigury {
public static void main(String[] args) {

JFrame ramka = new JFrame("Model RGB");


MojPanel panel = new MojPanel();

ramka.add(panel);

ramka.setSize(400, 200);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ramka.setVisible(true);
}

Wynik dziaania programu przedstawia poniszy rysunek (Rys. 29).

Rys. 29. Wykorzystanie elementw grafiki uytkownika

Stowarzyszenie Edukacja dla Przedsibiorczoci

162 Metody inarzdzia programowania

3.6. Aplety
Aplet stanowi aplikacj graficzn utworzon wjzyku programowania Java,
uruchamian wrodowisku przegldarki internetowej. Strona WWW tworzona jest
zwykle przy uyciu jzyka HTML (XHTML) iposiada nastpujc struktur:

<html>
<head>
<title>tytu dokumentu</title>
</head>
<body>
tre dokumentu ...








<applet
codebase = codebaseURL (lokalizacja plikw klas)
archive = archiveList (archiwum plikw JAR)
code
= appletFile (nazwa pliku kasy)
alt
= alternateText (tekst alternatywny)
name
= appletInstanceName (nazwa instancji apletu)
width
= pixels (wysoko apletu wpikselach)
height = pixels (szeroko apletu wpikselach)
align
= alignment (wyrwnanie apletu)
vspace = pixels HSPACE = pixels (dodatkowy margines wok apletu)
>
<param name = appletAttribute1 VALUE = value>
<param name = appletAttribute2 VALUE = value>
...
alternatywny HTML
</applet>
tre dokumentu ...

</body>
</html>

Podstawowe waciwoci dotyczce apletu zawarte s welemencie APPLET,


umieszczonym wtreci dokumentu HTML. Wartoci atrybutu CODE jest nazwa pliku (.class) zawierajcego kod programu do wykonania. Atrybuty WIDTH
iHEIGHT okrelaj szeroko oraz wysoko apletu wpikselach104. Na szczegln
uwag zasuguj elementy PARAM umoliwiajce przekazywanie wartoci zdokumentu HTML bezporednio do apletu.

Wymagane jest uycie jedynie atrybutw CODE, WIDTH oraz HEIGHT. Zastosowanie pozostaych
atrybutw jest opcjonalne.

104

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 163

Rys. 30. Okrelanie gabarytw apletu

Tworzenie programu uruchamianego wrodowisku przegldarki internetowej


polega na utworzeniu nowej klasy, dziedziczcej zklasy java.applet.Applet105
iprzesaniajcej 4 podstawowe metody106 wchodzce wskad struktury apletu.
public class MojAplet extends Applet {
...
public void init() { . . . }
public void start() { . . . }
public void stop() { . . . }
public void destroy() { . . . }
...
}

Zadaniem wymienionych metod jest reakcja na zdarzenia zwizane zobsug


apletu107. Metoda:
init wywoywana zostaje podczas adowania apletu,
start wywoywana jest automatycznie po zaadowaniu apletu (po metodzie
init()) oraz za kadym razem, gdy uytkownik powrci na stron WWW,
ktra zawiera aplet,
stop wykonywana zostaje kadorazowo, gdy uytkownik opuszcza stron
WWW zawierajc aplet,
Aplety mog dziedziczy po klasie javax.swing.JApplet (jeli wykorzystywany jest wapletach graficzny interfejs uytkownika GUI Swing) lub java.applet.Applet (jeli stosowane s
wasne procedury rysujce przy wykorzystaniu dostpnych metod klasy Graphics).

105

Nie wszystkie wymienione metody musz zosta przesonite.

106

Zobacz: http://java.sun.com/docs/books/tutorial/deployment/applet/appletMethods.html

107

Stowarzyszenie Edukacja dla Przedsibiorczoci

164 Metody inarzdzia programowania


destroy przeznaczona jest do zwalniania zasobw systemu wmomencie zamykania przegldarki internetowej.
Otwarcie strony WWW w przegldarce internetowej zawierajcej aplet powoduje zaadowanie pliku apletu (plik z rozszerzeniem .class). Nastpnie tworzona jest instancja pochodnej klasy java.awt.Applet, zawierajca wymienione metody. Po zakoczeniu inicjalizacji apletu nastpuje jego uruchomienie.
Wcelu uzyskania graficznej reprezentacji dziaania apletu wewntrz przegldarki internetowej naley uy metody paint().
Uruchomienie aplikacji utworzonej wjzyku Java wrodowisku przegldarki
internetowej wie si zwykonaniem szeregu czynnoci. Najistotniejsze znich to:
utworzenie kodu programu (plik / pliki rdowe *.java),
kompilacja utworzonych plikw rdowych do postaci kodu bajtowego (pliki
*.class),
utworzenie dokumentu HTML, zawierajcego wywoanie aplikacji wjzyku
Java (plik *.class),
otwarcie przygotowanego dokumentu HTML wprzegldarce internetowej.
Poniszy przykad prezentuje zestaw plikw wjzyku Java oraz HTML, niezbdnych do wywietlenia woknie przegldarki internetowej apletu zawierajcego dane kontaktowe firmy. Aby to uzyska naley:
utworzy plik DaneKontaktowe.java wprowadzajc podan poniej zawarto,
anastpnie dokona jego kompilacji,
utworzy plik WitrynaFirmy.html wprowadzajc podan poniej zawarto,
otworzy plik WitrynaFirmy.html wprzegldarce internetowej.

Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 165

import java.applet.*;
import java.awt.*;

// klasy do tworzenia apletw


// klasy do projektowania aplikacji
// uruchamianych wrodowisku graficznym

public class DaneKontaktowe extends Applet {


// metoda wywoywana automatycznie, gdy aplet ma zosta uruchomiony
public void init(){
}
// metoda wywoywana, gdy dziaanie apletu zostaje wstrzymane, np.
// wsytuacji, gdy uytkownik wywietli kolejn stron internetow
// lub zamknie okno przegldarki
public void stop(){
}
// metoda umoliwiajca uytkownikowi rysowanie elementw graficznych
// wobszarze apletu
public void paint(Graphics g){
//rysuj tekst
g.drawString("Pracownia graficzna RYSIK", 40, 20);
g.drawString("ul. Polna 40, Suwaki", 40, 40);
g.drawString("tel. +48 505 100 000, faks. +48 87 923 12 12", 40, 60);
// rysuj lini
g.drawLine(40, 80, 360, 80);
}
}
<html>
<head>
<title>Pracownia graficzna RYSIK</title>
</head>
<body bgcolor="green">
<center>

<h2>Polecamy usugi naszej firmy!!</h2>
<applet
code = "DaneKontaktowe.class"
width = "400"
height = "100">
</applet>
</center>
</body>
</html>

Tworzc kod apletu, naley zwrci uwag na to, i nie wszystkie operacje
mog zosta wykonane108. Wszczeglnoci mocno ograniczony jest dostp do zasobw komputera (pami masowa, urzdzenia peryferyjne). Podyktowane jest to
wzgldami bezpieczestwa systemu komputerowego uytkownika.
Zobacz: http://java.sun.com/docs/books/tutorial/deployment/applet/security_practical.html

108

Stowarzyszenie Edukacja dla Przedsibiorczoci

166 Metody inarzdzia programowania

3.7. Pytania
1. .Czym jest klasa oraz jakie posiada waciwoci?
2. .Czym jest obiekt oraz wjaki sposb jest tworzony?
3. .Jaka rol wprogramowaniu obiektowym spenia operator new?
4. .Jakie s rnice pomidzy metod, akonstruktorem.
5. .Jak funkcj peni sowo kluczowe this?
6. .Jakie jest gwne zastosowanie enkapsulacji?
7. .Czym rni si statyczne (klasowe) iniestatyczne (instancyjne) pola klasy?
8. .Czym jest kompozycja wprogramowaniu obiektowym?
9. .Jakie skadowe klasy bazowej dziedziczy podklasa?
10. C
. zy kada klasa wJavie dziedziczy zinnej klasy? Czy moliwe jest dziedziczenie zwielu klas?
11. .Jaka jest gwna idea polimorfizmu?
12. .Jakie zadania spenia klasa Object? Jakimi metodami dysponuje?
13. .Czym s pakiety ijakie jest ich zastosowanie?
14. .Wjakim celu stosuje si interfejsy.
15. C
. zy specyfikacja jzyka Java narzuca ograniczenia na liczb interfejsw,
ktre moe implementowa tworzona klasa?
16. .Czy moliwe jest utworzenie obiektw na bazie klasy abstrakcyjnej?
17. C
. zy nazwa klasy, ktra dziedziczy zklasy abstrakcyjnej inie dostarcza implementacji metod zawartych wnadklasie, musi zosta poprzedzona identyfikatorem abstract?
18. .Jakie wasnoci posiadaj metody finalne?
19. .Czym s klasy anonimowe?
20. C
. o oznaczaj nastpujce wyjtki: ArrayIndexOutOfBoundsException, NumberFormatException, NullPointerException?
21. .Czym charakteryzuj si wyjtki kontrolowane? Zjakich klas si wywodz?
22. .Do jakiej kategorii naley wyjtek FileNotFoundException?
23. .Jak funkcj peni klauzula throws wnagwku metody?
24. .Zjakich klas mog dziedziczy nowo tworzone wyjtki.
25. J. zyk Java zawiera par klas: InputStreamReader oraz Output
StreamWriter. Jaki jest cel stosowania tych klas?
26. .Co oznacza skrt URL? Podaj skadni jego zapisu.
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 167


27. O
. peracja buforowania dostpu do danych pozwala na zwikszenie wydajnoci odczytu oraz zapisu informacji. Wjaki sposb jest realizowana?
28. D
. o czego wykorzystywane s podstawowe kontenery (okna) wpakiecie
Swing?
29. .Jakie rnice wystpuj pomidzy kontenerami JPanel oraz JScrollPane?
30. .Czym s oraz jak funkcj peni menadery rozkadu?
31. .Czy pakiet Swing umoliwia obsug zdarze?
32. J. ak powinna zosta zbudowana klasa obsugujca wystpujce wprogramie zdarzenia?
33. W
. jaki sposb odbywa si powizanie komponentu ze zdarzeniem ijego
obsug?
34. K
. tra metoda powinna zosta przesonita, aby moliwe byo wykonanie
operacji rysowania?
35. .Czym jest aplet? Wjakim rodowisku jest uruchamiany?
36. J. aka jest rnica pomidzy apletem, aaplikacj komunikujc si poprzez
konsol?
37. J. ak funkcj peni opcjonalny element PARAM wystpujcy wstrukturze dokumentu HTML.
38. .Wjakich jednostkach wyraane s wymiary apletu?

Stowarzyszenie Edukacja dla Przedsibiorczoci

168 Metody inarzdzia programowania

3.8. Literatura
Arnold K., Gosling J., Holmes D. [2005], Java Programming Language, Prentice Hall, New Jersey.
Arnold K., Gosling J., Holmes D. [2005], Java(TM) Language Specification,
The (4th Edition), Prentice Hall, New Jersey.
Barteczko K., Drabik W., Starosta B. [2003], wiczenia zprogramowania wjzyku Java, Mikom, Warszawa.
Darwin I. [2004], Java Cookbook (Second Edition), OReilly Media, Inc.
Eck D. [2006], Introduction to Programming Using Java, Fifth Edition, New
York, URL:http://math.hws.edu/javanotes/index.html (dostp 2011-04-04).
Eckel B. [2002], Thinking In Java, 3rd Edition, URL: http://www.mindviewinc.
com/Books/ (dostp 2011-04-04).
Eckel B. [2006], Thinking In Java,Wydanie IV, Helion, Gliwice.
Horstmann C., Cornell G. [2003], Core Java 2. Podstawy, Helion, Gliwice.
Horstmann C., Cornell G. [2005], Core Java 2. Techniki zaawansowane, Helion,
Gliwice.
Lis M. [2006], Java. wiczenia praktyczne, Helion, Gliwice.
MacVittie D.W., MacVittie L.A. [1996], Programowanie zorientowane obiektowo. Nowy sposb mylenia, Mikom, Warszawa.
Meshplex, The Tutorial Database, Introduction to Java, URL: http://www.meshplex.org/wiki/Java_Tutorial1 (dostp 2011-04-04).
Roy P. V., Haridi S. [2005], Programowanie. Koncepcje, techniki imodele, Helion, Gliwice.
Sedgewick R., Wayne K. [2007], Introduction to Programming in Java: An Interdisciplinary Approach, Addison Wesley.
Sun Microsystem, Java Platform Standard Edition 6. API Specification, URL:
http://download.oracle.com/javase/6/docs/api/ (dostp 2011-04-04).
Sun Microsystem, Java tutorial, URL: ftp://ftp.javasoft.com/docs/tutorial.zip,
(dostp2009-01-24).
Sun Microsystem, The Java Tutorials, URL: http://download.oracle.com/javase/
tutorial/ (dostp 2011-04-04).
Swartz F., Java Basics, URL: http://www.leepoint.net/JavaBasics/ (dostp 201104-04).
Uniwersytet Ekonomiczny w Krakowie

Paradygmat programowania obiektowego 169


Swartz F., Java Programming Notes, URL: http://www.leepoint.net/notes-java/
(dostp 2011-04-04).
Wirth N. [2002], Algorytmy + struktury danych = programy, WNT, Warszawa.
Wrycza S., Marcinkowski B., Wyrzykowski K. [2006], Jzyk UML 2.0 wmodelowaniu systemw informatycznych, Helion, Gliwice.
Wu T. [2007], AComprehensive Introduction to Object-Oriented Programming
with Java, McGraw-Hill.
Zukowski J. [2005], The Definitive Guide to Java Swing, Third Edition,
Apress.

Stowarzyszenie Edukacja dla Przedsibiorczoci

4
Programowanie
urzdze
mobilnych
Jausz Stal, Janusz Tuchowski

4.1. Zasady tworzenia witryn mobilnych


Tworzenie witryn przeznaczonych dla urzdze mobilnych zasadniczo zblione jest do tworzenia oglnodostpnych witryn dedykowanych dla komputerw
stacjonarnych109. Konieczne jest jednak przestrzeganie pewnych regu, ktre pozwol na dopasowanie witryny do caego spektrum urzdze oodmiennych charakterystykach (system operacyjny, rodzaj przegldarki internetowej, wymiary
ekranu, standard obsugi pocze internetowych). Pozwoli to na efektywne korzystanie zzasobw Internetu przy wykorzystaniu urzdze mobilnych.
Wprzypadku komputera stacjonarnego wzasadzie nie wystpuj problemy
podczas prezentacji informacji. Instalacja rozszerze dla wykorzystywanej przegldarki internetowej pozwala na poprawn prezentacj zasobu opisanego przy
uyciu praktycznie dowolnego standardu. Tworzenie witryn dla urzdze mobilnych stanowi dla projektanta pewne wyzwanie. Konieczne staje si zapewnienie
prawidowej prezentacji informacji dla szerokiej gamy urzdze ozdecydowanie odmiennych charakterystykach.
Zalecanym jzykiem opisu zasobw dla prezentacji informacji na urzdzeniach mobilnych jest, rekomendowany przez WWW Consortium, jzyk XHTML
MP (ang. Extensible HyperText Markup Language Mobile Profile), stanowicy
aplikacj jzyka XML110 (ang. eXtensible Markup Language) (zobacz Rys. 31).
XHTML MP, wchodzcy wskad specyfikacji WAP 2.0 (ang. Wireless Application Protocol)111, dostpny jest praktycznie na kadym urzdzeniu mobilnym112.

Podczas tworzenia iopisu zasobu internetowego wykorzystywane s najczciej technologie:


HTML, XHTML, Java, JavaScript, Adobe Flash czy JPG.

109

Rozszerzalny jzyk znacznikw (XML) to formalny, niezaleny od platformy jzyk pozwalajcy na opisywanie danych wstrukturalizowany sposb.

110

WAP stanowi specyfikacj sposobu dostpu do informacji dostpnych wsieci Internet.

111

Szczegowy opis jzyka XHTML MP dostpny jest pod adresem http://www.developershome.com/wap/xhtmlmp/ (dostp 2011-05-17).

112

Stowarzyszenie Edukacja dla Przedsibiorczoci

174Metody inarzdzia programowania

Rys. 31. Ewolucja jzykw opisu zasobw

Jzyk XHTML MP stanowi podzbir jzyka XHTML, std struktura dokumentu dedykowanego dla urzdze mobilnych jest praktycznie identyczna rnice wystpuj wodwoaniu do schematu dokumentu DTD (ang. Document Type
Definition).

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC
"-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
"http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dane personalne</title>
</head>
<body>
<p>Jestem studentem UEK Krakw</p>
</body>
</html>

Podczas jego tworzenia obowizuj reguy skadni jzyka XML. Wszczeglnoci naley zwrci uwag na:
konieczno zamknicia wszystkich wystpujcych wdokumencie znacznikw elementw, np. <p></p>,
Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 175


umieszczanie
numer="123",

wartoci

atrybutw

wznakach

cudzysowia

(""),

np.

poprawne stosowanie wielkich imaych liter wnazwach elementw iatrybutw (mae iwielkie litery s rozrnialne), np. nazwisko iNazwisko to dwie
rne nazwy elementw,
prawidowy sposb
<b><i>UEK</i></b>.

zagniedania

znacznikw

elementw,

np.

Tworzc poszczeglne strony witryny internetowej, niezbdne jest sprawdzenie poprawnoci skadniowej tworzonych plikw. Mona to zrealizowa wykorzystujc dostpne narzdzia on-line113.

4.1.1. Definicja oraz zawarto strony


Przygotowujc witryn przeznaczon dla urzdze mobilnych, naley przestrzega okrelonych regu114, co sprawi, i jej zawarto we waciwy sposb
bdzie prezentowana na urzdzeniu. Przekazywane informacje powinny zosta
dostosowane do rodowiska mobilnego. Trudno wyobrazi sobie uytkownika
spdzajcego godziny na odczytywaniu treci dostpnej wwitrynie mobilnej.
Przekaz powinien by zwizy, atre dostosowana do oczekiwa odbiorcy. Zasadom tym powinny podlega rwnie tytuy stron wchodzcych wskad tworzonej
witryny. Powinny by one krtkie, tym bardziej, i zwykle bd one stanowiy
tytu zakadki prowadzcej do zasobu.
Istotn kwesti staje si zaprojektowanie ipoprawne rozplanowanie elementw wchodzcych wskad strony internetowej. Wprzeciwiestwie do ekranu monitora stacjonarnego, wywietlacz urzdzenia mobilnego posiada orientacj pionow. Wymusza to umieszczenie elementw nawigacyjnych (menu, odsyacze do
innych zasobw) nad oraz pod zasadnicz treci strony.

Markup Validation Service, http://validator.w3.org (dostp 2011-05-16).

113

Zasady tworzenia treci dla urzdze mobilnych zostay ujte wpracy Mobile Web Best
Practices, http://www.w3.org/TR/mobile-bp/ (dostp 2011-05-08).

114

Stowarzyszenie Edukacja dla Przedsibiorczoci

176Metody inarzdzia programowania

Rys. 32. Zalecany ukad graficzny strony internetowej

Ze wzgldu na ograniczon przepustowo czy internetowych, szczeglnie


na terenach pozamiejskich, przyjmuje si, i wielko pojedynczego pliku wchodzcego wskad strony witryny nie powinna przekracza 10kB. Natomiast objto wszystkich plikw tworzcych stron witryny (tekst, grafika, szablony) powinna by mniejsza ni 20kB. Naley dy do minimalizacji objtoci plikw.
Std podane jest wyeliminowanie wszelkich zbdnych znakw zawartych wplikach tekstowych opisu zasobw, wszczeglnoci wielokrotnych spacji, znakw
tabulacji, koca linii ipodobnych (ang. white spaces). Takie dziaania pozwol na
szybsze adowanie iwkonsekwencji szybsz prezentacj zasobw Internetu na
urzdzeniu mobilnym. Wprzypadku elementw graficznych naley:
dostosowa wielko grafiki do wielkoci ekranu urzdzenia mobilnego; przyjmuje si, i szeroko elementu graficznego nie powinna przekracza 120 pikseli, aby moliwe byo wywietlenie zdjcia czy rysunku na kadym urzdzeniu mobilnym,
wmaksymalnym stopniu zredukowa objto pliku graficznego,
dostosowa kolor grafiki do koloru ta strony (zapewnienie maksymalnego
kontrastu115).
Naley wzi pod uwag, i rozbudowana strona internetowa skadajca si
ztekstu, obrazw oraz arkusza stylw bdzie adowana znacznie wolniej, gdy uytkownik bdzie korzysta zcza oniewielkiej przepustowoci. Ztego powodu liczba odrbnych zasobw na pojedynczej stronie powinna zosta zminimalizowana.
Naley wzi pod uwag, i witryna mobilna prezentowana bdzie rwnie wniekorzystnych
warunkach owietleniowych. Zatem zastosowany zestaw kolorw powinien zosta dobrany
wtaki sposb, aby zapewni moliwie najwikszy kontrast pomidzy poszczeglnymi elementami strony.

115

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 177


Kolejne zagadnie, ktre wymaga szczeglnej uwagi, to poprawne okrelenie
typw zasobw (ang. Content-Type, Internet Media Type/MIME) wchodzcych
wskad tworzonej witryny mobilnej. Stosowany jest tu dwuczciowy identyfikator formatu plikw MIME116 okrelajcy rodzaj oraz zawarto opisywanego
zasobu. Informacje te umieszcza si wdokumencie XHTML MP, wykorzystujc
element META:
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

gdzie wartoci atrybutu content jest jeden zponiszych identyfikatorw formatw plikw (zwykle stosuje si pierwsz lub drug posta zwymienionych):
application/vnd.wap.xhtml+xml,
application/xhtml+xml,
text/html.
Witryny mobilne powinny zapewni prawidow prezentacj znakw narodowych na urzdzeniach mobilnych. Dla spenienia tego warunku konieczne jest
stosowanie kodowania znakw wstandardzie UTF-8117. Naley pamita, i deklaracja kodowania powinna wystpi zarwno wnagwku dokumentu XML
(XHTML MP), jak iwdeklaracji META Content-Type.
Pomimo dynamicznego rozwoju urzdze mobilnych istosowania nowatorskich rozwiza, jedn zpodstawowych funkcjonalnoci pozostaje wci moliwo komunikacji gosowej. Jeeli wtreci witryny wystpuj numery telefoniczne, warto zastosowa specjaln skadni, ktra umoliwi dodanie numeru
telefonicznego do spisu numerw wurzdzeniu mobilnym:
<ahref="tel:125552323">125552323</a>

Takie rozwizanie zdecydowanie zwiksza efektywno korzystania zurzdzenia mobilnego, czc dostpne wsieci Internet informacje zpodstawow
funkcjonalnoci urzdzenia.

MIME (ang. Multipurpose Internet Mail Extensions) standard stosowany przy przesyaniu
poczty elektronicznej.

116

UTF-8 jest zalecanym systemem kodowania znakw midzynarodowych przy opisywaniu informacji publikowanych wsieci Internet.

117

Stowarzyszenie Edukacja dla Przedsibiorczoci

178Metody inarzdzia programowania

4.1.2. Tworzenie nawigacji iodnonikw


Jedn zistotnych kwestii jest zaplanowanie jasnych iczytelnych zasad nawigacji. Jest spraw oczywist, i wskazywanie na poszczeglne elementy strony
internetowej przy uyciu dostpnych wurzdzeniu mobilnym funkcjonalnoci
jest nieporwnywalnie mniej wygodne, ni wprzypadku urzdzenia stacjonarnego. Std konieczno zastosowania takich rozwiza, ktre pozwol na sprawne
przemieszczanie si pomidzy informacjami umieszczonymi wwitrynie. Moe to
zosta osignite poprzez:
okrelenie jednolitych zasad nawigacji dla kadej ze stron witryny,
umieszczenie na kocu strony odsyacza do jej pocztku,
dodanie odnonika do strony gwnej witryny na kadej zjej stron,
umieszczenie menu witryny zarwno na pocztku, jak ina kocu strony,
zastosowanie maksymalnie 10 pozycji menu reprezentowanych przez 10 klawiszy numerycznych.
Wcelu uatwienia wyboru poszczeglnych pozycji menu naley przypisa je
do poszczeglnych klawiszy klawiatury numerycznej. Realizowane jest to poprzez uycie atrybutu accesskey, ktrego warto stanowi symbol przypisanego
do pozycji menu klawisza (0-9, * oraz #):
<ahref="dane.xhtml" accesskey="1">Dane personalne</a>

Jeli do formatowania strony wykorzystany zosta mobilny kaskadowy arkusz stylw WCSS (ang. Wireless Cascading Style Sheets), wtedy skadnia zapisu
przyjmuje posta:
a.dane {-wap-accesskey: 1}
http://www.developershome.com/wap/wcss/

Podczas przydzielania nazw poszczeglnym zasobom naley dy, aby identyfikatory zasobw URL (ang. Uniform Resource Locator) skaday si zjak najmniejszej liczby znakw. Uatwi to uytkownikowi pniejsze wprowadzanie
adresu zasobu przy uyciu ograniczonych moliwoci klawiatury urzdzenia mobilnego.

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 179

4.1.3. Interakcja zuytkownikiem


Ograniczona funkcjonalno klawiatury urzdzenia mobilnego oraz jej niewielkie rozmiary powoduj, i wprowadzanie danych przez uytkownika staje si
niezmiernie kopotliwe. Dlatego te, oile jest to moliwe, naley dy do minimalizacji iloci wprowadzanych informacji oraz dostosowa sposb, wjaki dane
bd wprowadzane.
Popraw efektywnoci wprowadzania danych mona uzyska poprzez:
stosowanie formantw alternatywnych, nie wymagajcych wprowadzania tekstu (lista rozwijana, pole opcji, pole wyboru),
ustalanie wartoci domylnych,
okrelanie dla pl tekstowych:
formatu danych (typu informacji),
dopuszczalnej liczby znakw,
prawidowe okrelanie kolejnoci prezentacji informacji.

4.1.4. Testowanie witryny


Opracowana iwykonana witryna podlega weryfikacji, czy zawarta na poszczeglnych stronach tre prezentowana jest wsposb waciwy. Do tego celu wykorzystywane jest:
urzdzenie stacjonarne,
emulator urzdzenia mobilnego,
urzdzenie mobilne.
Poniewa witryna tworzona jest najczciej na komputerze stacjonarnym, std
jej podstawow poprawno najwygodniej jest zweryfikowa wanie na tym urzdzeniu. Kolejny etap to sprawdzenie, czy umieszczona wwitrynie tre jest prawidowo prezentowana na urzdzeniu przenonym. Wcelu minimalizacji kosztw
stosowane s na tym etapie emulatory urzdzenia mobilnego. Kocowe sprawdzenie witryny powinno odby si zuyciem waciwego urzdzenia, awaciwie
wielu urzdze oodmiennych charakterystykach, na ktrych prezentowane bd
utworzone treci. Istniej rwnie dedykowane narzdzia118 uatwiajce sprawdzenie, czy stworzona witryna internetowa bdzie prawidowo prezentowana na
urzdzeniach mobilnych. Umoliwiaj one dokonanie oceny witryny iwskazanie,
jakie elementy powinny zosta skorygowane.
mobiReady, http://ready.mobi (dostp 2011-05-16).

118

Stowarzyszenie Edukacja dla Przedsibiorczoci

180Metody inarzdzia programowania

4.2. Wprowadzenie do tworzenia


aplikacji mobilnych
Java Micro Edition (wskrcie Java ME119) to specjalna wersja Javy przeznaczona dla urzdze mobilnych, dysponujcych niewielk moc obliczeniow (np.
telefony, palmtopy itp.). Ze wzgldu na specyfik tych urzdze Java ME udostpnia rne konfiguracje, ktre mog zosta poszerzone oprofile, jak iuzupenione
dodatkowymi rozszerzeniami. Wpracy zaplikacjami mobilnymi spotyka si nastpujce pojcia: CLDC (ang. Connected Limited Device Configuration) oznaczajce konfiguracj urzdzenia, MIDP (ang. Mobile Information Device Profile)
odnoszcy si do profilu urzdzenia oraz JSR (ang. Java Specification Request)
okrelajce specyfikacje rozszerze (np. GPS, Bluetooth).
Aplikacje mobilne tworzone za pomoc jzyka programowania Java ME nazywane s MIDletami. Tworzenie aplikacji oparte jest ozbir specyfikacji rozwijanych przez Java Community Process120. Okrelany jest on jako Java Specification
Requests (JSR)121. Praktycznie kade urzdzenie mobilne obsuguje dwie podstawowe specyfikacje:
CLDC (ang. Connected Limited Device Configuration), definiujce zachowanie wirtualnej maszyny Javy (JVM) uywanej na urzdzeniu mobilnym oraz
dostarczajce rwnie podstawowego API do tworzenia aplikacji122,
MIDP (ang. Mobile Information Device Profile), rozszerzajce moliwoci
programisty, dostarczajc narzdzia do tworzenia interfejsu uytkownika, obsugi multimediw, przechowywania danych czy tworzenia gier.
Wykorzystanie odpowiednich wersji specyfikacji umoliwia tworzenie aplikacji dla rnego typu urzdze mobilnych (obsugujcych odpowiednie konfiguracje czy te profile).
Do projektowania, kompilacji oraz uruchamiania aplikacji dla urzdze mobilnych niezbdne jest rodowisko Java ME SDK. Wjego skad wchodzi:
kompilator,
rodowisko uruchomieniowe,
Jzyk programowania Java Micro Edition to uproszczona wersja Javy Standard Edition. Programista moe korzysta zklas, interfejsw, dziedziczenia, wyjtkw, podstawowych typw
danych (prymitywne iobiektowe), wielowtkowoci itp. Nie jest moliwe natomiast stosowanie typw generycznych, typw wyliczeniowych czy te zaawansowanych struktur danych.

119

Java Community Process, http://jcp.org (dostp 2011-05-21).

120

Kadej specyfikacji nadawany jest unikalny numer. Peny wykaz dla technologii Java ME:
http://jcp.org/en/jsr/platform?listBy=1&listByType=platform (dostp 2011-05-23).

121

Zbir odpowiednich pakietw zklasami.

122

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 181


emulator urzdze mobilnych,
edytor kodu.
Cao dostpna jest bezpatnie na stronach firmy Oracle123. Dodatkowo wsystemie musi zosta zainstalowana Java124 (JDK) wwersji co najmniej 1.6.
Aplikacja mobilna (MIDlet) skada si zarchiwum Javy tj. pliku JAR (ang.
Java ARchive) zawierajcego skompilowane klasy wraz zplikami zasobw oraz
deskryptora MIDletu plik tekstowy JAD (ang. Java Archive Descriptor) opisujcy zawarto MIDletu. Istnienie pliku JAD umoliwia pobranie przez urzdzenie wycznie deskryptora isprawdzenie, czy istnieje moliwo uruchomienia
MIDletu (JAR) przed jego pobraniem125. MIDlety sterowane s zdarzeniami oraz
posiadaj stan, wktrym mog si znajdowa. Kady ze stanw powizany jest
zodpowiednia metod wystpujc wkodzie MIDletu:
stan active (aktywny) wystpujcy podczas normalnej pracy aplikacji, powizany zmetod startApp() wywoywan podczas inicjalizacji MIDletulub
powrotu ze stanu zatrzymania,
stan paused (zawieszony), wystpujcy gdy aplikacja zostaa wstrzymana np. przez odebranie poczenia telefonicznego), powizany zmetod
pauseApp(),
stan destroyed (zakoczony), wystpujcy gdy aplikacja zostaa wyczona,
powizany zmetod destroyApp().
Diagram na poniszym rysunku (Rys. 33) przedstawia poszczeglne stany
MIDletu oraz ich zwizki zodpowiednimi metodami.

rodowisko programistyczne JavaME, http://www.oracle.com/technetwork/java/javame/javamobile/download/sdk/index.html (dostp 2011-05-21).

123

Wwersji Java SE (Standard Edition).

124

Sprawdzana jest konfiguracja iprofil urzdzenia.

125

Stowarzyszenie Edukacja dla Przedsibiorczoci

182Metody inarzdzia programowania

Rys. 33. Cykl ycia MIDletu

Kady MIDlet zbudowany jest woparciu oklas dziedziczc zklasy


javax.microedition.midlet.MIDlet. Najprostszy zmoliwych prezentuje si nastpujco:
import javax.microedition.midlet.MIDlet;
public class PierwszyMIDlet extends MIDlet {
public void startApp(){
}
public void pauseApp(){
}
public void destroyApp(boolean unconditional){
}
}

Poszczeglne metody (zgodnie zcyklem ycia MIDletu) oznaczaj:


startApp() aplikacja staje si aktywna, nastpuje inicjalizacja aplikacji,
wczytanie zasobw oraz wywietlenie danych na ekranie,
pauseApp() aplikacja zostaje zawieszona/wstrzymana, nastpuje zwolnienie
wszystkich zasobw zajmujcych pami lub obciajcych procesor,
Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 183


destroyApp() aplikacja zostaje wyczona, nastpuje zapisanie danych, zamknicie pocze oraz zwolnienie zasobw.
MIDlety s aplikacjami sterowanymi zdarzeniami, ich dziaanie zaley zarwno od stanu urzdzenia mobilnego, jak iinterakcji ze strony uytkownika.
Program 1. Pierwszy MIDlet
Ponisza aplikacja wywietla na ekranie urzdzenia mobilnego acuch tekstowy. Wykorzystane zostay dwie nowe klasy zpakietu javax.microedition.lcdui:
TextBox oraz Display. Pierwsza znich tworzy obiekt (okienko ztytuem itekstem
umieszczonym centralnie), adruga wywietla go na ekranie. Wicej informacji
dotyczcych tych klas zostao zaprezentowanych wdalszej czci opracowania.
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class PierwszyMIDlet extends MIDlet {

// wykorzystanie klasy TextBox (okno tekstowe)


private TextBox tb;

public void startApp() {

// utworzenie obiektu klasy TextBox


tb = new TextBox("Wywietlanie tekstu", "Pisanie
programw wJavie ME nie jest trudne", 160, TextField.UNEDITABLE);

// ustawienie ekranu poczatkowego


Display.getDisplay(this).setCurrent(tb);

public void pauseApp() {


}

public void destroyApp(boolean u) {


}

Rezultat dziaania aplikacji (MIDletu uruchomionego wemulatorze urzdzenia mobilnego) przedstawia poniszy rysunek (Rys. 34).

Stowarzyszenie Edukacja dla Przedsibiorczoci

184Metody inarzdzia programowania

Rys. 34. MIDlet uruchomiony wemulatorze urzdzenia mobilnego

Naley zwrci uwag na obiekt klasy TextBox. Po kadym zatrzymaniu


iwznowieniu MIDletu wywoywana jest metoda startApp(), ktra tworzy obiekt
ponownie. Istniej dwie metody rozwizania tego problemu:
uzupenienie programu opodany poniej fragment (obiekty s tworzone tylko
raz, wkonstruktorze klasy):
// utworzenie obiektu wkonstruktorze MIDletu
public PierwszyMIDlet() {
tb = new TextBox("Wywietlanie tekstu",
"Pisanie programw wJavie ME nie jest trudne", 160, TextField.UNEDITABLE);
}

sprawdzenie czy referencja do obiektu jest pusta itylko wtakim przypadku


utworzenie nowego obiektu, awprzeciwnym przypadku wykorzystanie ju
istniejcego:
Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 185

// utworzenie obiektu klasy TextBox (tylko gdy jeszcze nie istnieje)


if (tb == null) {
tb = new TextBox("Wywietlanie tekstu",
"Pisanie programw wJavie ME nie jest trudne", 160, TextField.UNEDITABLE);
}

4.3. Interfejs uytkownika


4.3.1. Interfejs wysokopoziomowy
Tworzenie interfejsu uytkownika przeznaczonego na urzdzenia mobilne rni si wzasadniczy sposb od jego tworzenia na komputery stacjonarne. Wpyw
na to ma przede wszystkim:
rnica wwymiarach ekranu poszczeglnych urzdze mobilnych,
odmienny sposb wprowadzania informacji wynikajcy zograniczonych moliwoci klawiatury.
Dostpny wjzyku programowania Java ME zestaw klas LCDUI (ang. Liquid
Crystal Display User Interface) dostarcza narzdzi dla tworzenia interfejsu uytkownika, co pozwala na tworzenie aplikacji niezalenie od rodzaju urzdzenia, na
ktrym aplikacja bdzie uruchamiana. Klasy te zgromadzone zostay wpakiecie
javax.microedition.lcdui. Wymienione poniej odpowiadaj czterem podstawowym rodzajom ekranw:
TextBox, zawierajcy tytu oraz przestrze, gdzie moliwe jest wywietlanie
lub te wprowadzanie tekstu,
Alert, przeznaczony do wywietlania komunikatw,
List, umoliwiajcy wywietlenie listy pozycji, zktrych uytkownik moe
wskaza jedn lub kilka,
Form, na ktrym moliwe jest umieszczenie dostpnych formantw, np. pl
wyboru, pl opcji, pl tekstowych, list rozwijanych itp.
Aby moliwa bya prezentacja informacji zawartych na jednym zwymienionych czterech ekranw, konieczne jest skojarzenie MIDletu zfizycznym wywietlaczem urzdzenia, anastpnie uaktywnienie wskazanego ekranu (metoda
setCurrent(ekran)). Wyjtek stanowi tu ekran zwizany zklas Alert. Wtym
przypadku naley okreli dodatkowo ekran, ktry zostanie wywietlony wnastpnej kolejnoci.

Stowarzyszenie Edukacja dla Przedsibiorczoci

186Metody inarzdzia programowania

// skojarzenie MIDletu zwywietlaczem urzdzenia


Display d = Display.getDisplay(this);
...
// dla typw Form, List, TextBox
Form f = new Form("Pierwszy formularz");
d.setCurrent(f);
...
// dla typu Alert naley okreli nastpny ekran (Form, List, TextBox)
Alert a= new Alert("Istotny komunikat");
d.setCurrent(a, nastepnyEkran);

Klasa TextBox dostarcza narzdzia umoliwiajce zarwno wywietlanie, jak


iwprowadzanie tekstu, przy czym dostpny obszar obejmuje praktycznie ca powierzchni ekranu fizycznego urzdzenia. Podczas tworzenia ekranu moliwe jest
okrelenie tytuu, zawartoci (wywietlanego tekstu), maksymalnej liczby znakw,
jaka moe zosta wprowadzona przez uytkownika, oraz rodzaju wprowadzanej
informacji (tekst, warnoci numeryczne, adres email, numer telefonu)126. Przykadowy wygld ekranu wraz z odpowiadajcym mu zestawem instrukcji wjzyku
Java ME zosta przedstawiony na poniszym rysunku (Rys. 35).

Rys. 35. Ekran TextBox

TextBox tb = new TextBox("Pierwsza aplikacja",


"Pisanie programw wJavie ME nie jest trudne",160,TextField.ANY);
Display.getDisplay(this).setCurrent(tb);

Okrelenie rodzaju wprowadzanej informacji realizowane jest poprzez uycie staych:


TextField.ANY, TextField.DECIMAL, TextField.NUMERIC, TextField.EMAILADDR, TextField.
PHONENUMBER.

126

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 187


Klasa Alert dostarcza funkcji do wywietlania komunikatw przeznaczonych
dla uytkownika. Posiada cztery parametry, ktre odpowiadaj za sposb prezentowania informacji: tytu okna, wywietlany tekst komunikatu, opcjonalny obraz
(ikona) oraz typ prezentowanego komunikatu (ALARM, CONFIRMATION, ERROR, INFO,
WARNING). Ponadto moliwe jest okrelenie, przez jaki okres czasu informacja bdzie prezentowana na wywietlaczu urzdzenia.
Display d = Display.getDisplay(this);
Alert a= new Alert("Wany komunikat", "JavaME jest cool!", null, AlertType.INFO);
a.setTimeout(3000); // wywietlaj 3 sekundy
d.setCurrent(a, nastepnyEkran);

Praktycznie kady tworzony program powinien reagowa na dziaania podejmowane przez uytkownika. Przykadowo, wskazanie przez uytkownika pozycji
menu powinno skutkowa wywietleniem nowego zbioru informacji, wykonaniem operacji obliczeniowej, zapisaniem danych do pamici masowej czy zakoczeniem dziaania programu. Konieczne jest zatem okrelenie zestawu czynnoci
(zbioru komend), ktre uytkownik moe wykona waplikacji. Ponadto aplikacja
powinna czuwa (nasuchiwa), czy uytkownik nie wybra jednej zdostpnych
komend do wykonania. Klasa Command umoliwia okrelenie zbioru komend, przy
czym okrelenie nowej komendy wymaga zdefiniowania:
skrtowej nazwy komendy (tzw. krtkiej etykiety),
penej nazwy komendy (tzw. dugiej etykiety),
typu komendy (np. BACK, CANCEL, EXIT, HELP, OK, STOP),
okrelenia priorytetu komendy.
Naley zaznaczy, i to wycznie urzdzenie decyduje, ktra etykieta (tytu)
iwjaki sposb zostanie wywietlona. Programista nie ma wpywu na sposb prezentacji komendy. Zwykle duga etykieta komendy wywietlana jest wtworzonym dynamicznie menu, natomiast etykieta krtka prezentowana jest powyej
tzw. klawiszy programowych.
Command mKoniec = new Command("Zakocz program", "Zakocz", Command.EXIT, 0);
Command mPodatek = new Command("Oblicz VAT", "VAT", Command.SCREEN, 1);

Aby aplikacja moga zareagowa na wywoan przez uytkownika komend, musi zosta powiadomiona, gdy komenda zostanie wywoana. Std tworzona klasa powinna implementowa interfejs CommandListener zawierajcy metod
commandAction. Metoda ta zostaje wywoana za kadym razem, gdy uytkownik
Stowarzyszenie Edukacja dla Przedsibiorczoci

188Metody inarzdzia programowania


podejmie jakiekolwiek dziaanie. Wmomencie wywoania, do metody tej przekazywana jest informacja okrelajca nazw komendy, ktra wywoaa t metod. Poprzez sprawdzenie (np. za pomoc instrukcji warunkowej if) moliwe jest
podjcie stosownej akcji (np. wywietlenie kolejnego ekranu lub te zakoczenie
dziaania aplikacji).
public class VATowiec extends MIDlet implements CommandListener {
private Command mKoniec;
...
// utworzenie polecenia
mKoniec = new Command("Zakocz prac", "Zakocz", Command.EXIT, 0);
...
Form ekran = new Form("Obliczanie podatku VAT");
ekran.addCommand(mKoniec); // skojarzenie polecenia zekranem
...
// obsuga zdarze
public void commandAction(Command c, Displayable d) {
if (c == mKoniec && d == ekran) { // zakocz program
destroyApp(true);
notifyDestroyed();
} else if (c == mObliczVAT && d == ekran1) { // oblicz podatek VAT
// instrukcje obliczajce podatek
}
}

Program 2. MIDlet zobsug zdarze


Poniszy kod programu przedstawia kompletn aplikacj wjzyka Java ME
(MIDlet) zzaimplementowan obsug zdarze. Zadaniem aplikacji jest wywietlenie tekstu na ekranie urzdzenia mobilnego, co zostao zrealizowane przez zastosowanie klasy TextBox.

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 189

public class MIDletObsugaZdarzen extends MIDlet implements CommandListener {


private TextBox tb;
private Command exitCommand;
public void startApp() {
if (tb == null) {
TextBox tb = new TextBox("Pierwsza aplikacja",
"Pisanie programw wJavie ME nie jest trudne", 160,TextField.ANY);
exitCommand = new Command("Zakocz", Command.EXIT, 0);
tb.addCommand(exitCommand);
tb.setCommandListener(this);
Display.getDisplay(this).setCurrent(tb);
}
}
public void pauseApp() {}
public void destroyApp(boolean u) {}
public void commandAction(Command c, Displayable d) {
if (c == exitCommand) {
destroyApp(true);
notifyDestroyed();
}
}
}

Lista (klasa List) jest kolejnym rodzajem ekranu, ktry zawiera zbir elementw. Kada pozycja listy skada si zetykiety tekstowej. Moliwe jest rwnie
przypisanie ikony graficznej. Dostpne s trzy rodzaje list (zobacz Rys. 36):
lista opcji (EXCLUSIVE), wktrej moliwe jest wskazanie jednej pozycji zlisty,
lista wyboru (MULTIPLE), wktrej moliwe jest wskazanie dowolnej liczby pozycji zlisty,
lista menu (IMPLICIT), funkcjonalnie zbliona do dziaania typowego menu
aplikacji.

Stowarzyszenie Edukacja dla Przedsibiorczoci

190Metody inarzdzia programowania

Rys. 36. Rodzaje list (opcji, wyboru, menu)

Tworzenie listy skada si zdwch etapw:


1. U
tworzenie obiektu reprezentujcego list, okrelenie tytuu listy oraz jej
typu.
2. Dodanie do listy jej skadowych (elementw).
// utworzenie listy
List TypKomputera = new List("Lista produktw", List.MULTIPLE);
// dodawanie pozycji do listy
TypKomputera.append("laptop", null);
TypKomputera.append("komputer stacjonarny", null);

To, ktre elementy zostay wybrane, uzalenione jest od rodzaju zastosowanej


listy. Listy EXCLUSIVE oraz IMPLICIT umoliwiaj wybr tylko jednej opcji, std
ich dziaanie jest podobne. Metoda getSelectedIndex() zwraca warto 0..N-1
okrelajc, ktry element listy zosta wybrany (elementy listy s numerowane
poczwszy od 0). Wprzypadku listy MULTIPLE konieczne jest przekazanie tablicy elementw typu logicznego do metody getSelectedFlags(boolean[] tablica).
Liczba elementw tablicy powinna by identyczna, jak liczba elementw listy.
Elementy tablicy, ktrych indeks odpowiada numerom zaznaczonych pozycji listy,
przyjm warto true. Moliwe jest rwnie programowe zaznaczanie elementw
listy. Wtym celu naley zastosowa metody setSelectedIndex() lub setSelectedFlag(), wzalenoci od typu uytej listy.
Listy EXCLUSIVE oraz MULTIPLE funkcjonuj podobnie jak opisane wczeniej
ekrany. Obsuga zdarze tych list jest praktycznie identyczna. Wyjtek stanowi
Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 191


lista IMPLICIT, ktra wywouje zdarzenie natychmiast po wybraniu pozycji zlisty
(nie jest konieczne zatwierdzenie wyboru przyciskiem przez uytkownika, jak to
ma miejsce wprzypadku pozostaych dwch list). Informacja, ktra pozycja listy
zostaa wybrana, wskazywana jest poprzez sta List.SELECT_COMMAND:

// obsuga zdarzenia dla listy IMPLICIT


public void commandAction(Command c, Displayable d) {
if (c == List.SELECT_COMMAND && d == ekran) {
...

Formularz (klasa Form) to ekran stanowicy kontener dla komponentw, ktre


mona na nim umieszcza (zobacz Rys. 37). Do dyspozycji programisty przeznaczonych zostao osiem rodzajw komponentw ozrnicowanej funkcjonalnoci:
StringItem, odpowiadajcy za wywietlanie dowolnego cigu znakw,
TextField, umoliwiajcy wprowadzanie danych tekstowych,
ImageItem, wywietlajcy obrazy (jpg lub png),
ChoiceGroup, prezentujcy listy pozycji do wyboru,
Gauge, wywietlajcy wskanik postpu (ang. progress bar),
Spacer, umoliwiajcy dodanie odstpu, wykorzystywanego do pozycjonowania komponentw,
DateField, umoliwiajcy wprowadzanie daty iczasu,
CustomItem, dajcy programicie narzdzia umoliwiajce tworzenie wasnych
komponentw.

Stowarzyszenie Edukacja dla Przedsibiorczoci

192Metody inarzdzia programowania

Rys. 37. Elementy formularza

Proces tworzenia formularza polega na utworzeniu ekranu formularza, na


ktrym umieszczone zostan wymagane komponenty. Naley zwrci uwag, i
pozycja komponentw na formularzu nie jest precyzyjnie okrelona (brak wsprzdnych). Faktyczne rozmieszczenie komponentw zalene jest od urzdzenia,
na ktrym aplikacja zostanie uruchomiona. Takie rozwizanie pozwala na dopasowanie formularza praktycznie do kadego ekranu urzdzania, niezalenie od
jego rozmiarw.

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 193

// utworzenie ekranu formularza


Form f = new Form("Kursy walut");
...
// umieszczenie na ekranie pola tekstowego
TextField tf = new TextField("Symbol waluty:", "EUR", 3, TextField.ANY);
f.append(tf);
...
// umieszczenie na ekranie pola daty
DateField df = new DateField("Data notowania:", DateField.DATE);
f.append(df);
...
// umieszczenie na ekranie pola opcji
ChoiceGroup cg = new Choicegroup("Waluty:", ChoiceGroup.POPUP);
cg.append("USD", null);
cg.append("EUR", null);
cg.append("PLN", null);
f.append(cg);
...
// umieszczenie na ekranie obrazka
try {
// pobranie obrazka zarchiwum jar
// (plik taurus.png naley umieci wfolderze scr projektu)
image = Image.createImage("/taurus.png");
} catch (IOException e) {
System.out.println ("Nie mona zaadowa obrazka!");
}
// dodanie obrazka do formularza
img = new ImageItem(null, image, ImageItem.LAYOUT_CENTER, "Obrazek przedstawiajcy
byka");
f.append(img);

Tworzc obsug zdarze formularza, wyrni mona trzy rodzaje sytuacji:


uytkownik wybra jedn zopcji menu formularza,
uytkownik wybra jedn zopcji menu komponentu,
wystpia zmiana stanu komponentu.
Zpowyszego wynika, i polecenia moe posiada nie tylko formularz (ekran),
ale rwnie kady komponent oddzielnie. Polecenia komponentu wywietlane s
wwczas, gdy komponent jest aktywny, np. gdy uytkownik wprowadza tekst
wpolu edycyjnym lub wybiera jedn zopcji menu. Dodatkowo, jeli warto
komponentu zostaa zmieniona, program jest powiadamiany otym fakcie. Obsuga tych trzech sytuacji moe zosta zrealizowana poprzez implementacj interfejsw CommandListener, ItemCommandListener, ItemStateListener dostarczajcych
metod pozwalajcych na obsug wystpienia zdarze.
Stowarzyszenie Edukacja dla Przedsibiorczoci

194Metody inarzdzia programowania

public class MojMIDlet extends MIDlet imlpements CommandListener,


ItemCommandListener, ItemStateListener {
...
// polecenia formularza
public void commandAction(Command c, Displayable d) {
if (c == mOblicz && d == EkranFormularza) {
...
// polecenia komponentu
// (polecenia dodajemy do komponentu poprzez Komponent.addCommand() )
// (polecenie pojawia si, gdy komponent jest aktywny)
public void CommandAction(Command c, Item item) {
if (c == mPolecenie && item == mKomponent) {
...
// zmiana stanu komponentu (np. zmiana wartoci pola tekstowego)
public void itemStateChanged(Item item) {
if (item == mKomponent) {
...

4.3.2. Graficzny interfejs uytkownika


Interfejs niskopoziomowy pozwala programicie na pen swobod wtworzeniu strony wizualnej programu. Moliwe jest operowanie wsprzdnymi, co
daje moliwo precyzyjnego umieszczania zarwno tekstu, jak ielementw graficznych na ekranie. Naley jednak pamita ornicach wystpujcych pomidzy urzdzeniami mobilnymi. Dlatego te na programicie spoczywa obowizek
takiego tworzenia programu, aby moliwe byo jego uruchomienie na kadym
urzdzeniu.
Interfejs wysokopoziomowy, oktrym bya mowa wpoprzednim punkcie,
tworzony by woparciu ozestaw czterech klas: Alert, Form, List oraz TextBox.
Wprzypadku interfejsu niskopoziomowego, wykorzystywana jest klasa Canvas
(atake klasa Graphics127) umoliwiajca rysowanie tekstu oraz elementw graficznych (Rys. 38).

Zobacz: MID Profile, http://download.oracle.com/javame/config/cldc/ref-impl/midp2.0/


jsr118/index.html (dostp 2011-05-16).

127

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 195

Rys. 38. Hierarchia klas jzyka Java ME

Wtrakcie dziaania aplikacji urzdzenie przekazuje obiekt klasy Graphics,


reprezentujcy wywietlacz urzdzenia. Aplikacja wywouje metody klasy
Graphics, aby ukaza ksztaty, tekst oraz obrazy na wywietlaczu urzdzenia.

Stowarzyszenie Edukacja dla Przedsibiorczoci

196Metody inarzdzia programowania

import javax.microedition.lcdui.*;
class RysowanieDemoCanvas extends Canvas {
public void paint (Graphics g) {
g.setColor(128,0,0);
g.fillRect (0, 0, getWidth(), getHeight());
g.setColor(255,255,0);
g.drawLine (0, 0, 100, 200);
g.fillRect (20, 30, 30, 20);
}
}

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class RysowanieDemo extends MIDlet {
public void startApp () {
Display d = Display.getDisplay(this);
RysowanieDemoCanvas ekran = new RysowanieDemoCanvas();
d.setCurrent(ekran);
}
public void pauseApp () {}
public void destroyApp (boolean u) {}
}

Wprzypadku tworzenia interfejsu uytkownika woparciu oklasy Canvas


iGraphics konieczne jest precyzyjne okrelenie pozycji kadego elementu umieszczonego na ekranie urzdzenia mobilnego. Wymiary ekranu urzdzenia wyraane
s wpikselach, przy czym punkt owsprzdnych 0,0 zlokalizowany jest wlewym grnym naroniku ekranu.

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 197

Rys. 39. Okrelanie wsprzdnych elementw ekranu urzdzenia mobilnego

Dla uzyskania informacji omaksymalnych wymiarach ekranu urzdzenia mobilnego mona wywoa metody getWidth() oraz getHeight(). Metoda
setFullScreenMode(true) umoliwia przeczenie urzdzenia do trybu penoekranowego.
Klasa Graphics zawiera zestaw metod umoliwiajcych rysowanie na ekranie linii (drawLine) oraz figur geometrycznych (drawRect, drawRound, drawArc).
Wprzypadku koniecznoci wypenienia figur zadanym kolorem naley wykorzysta metody fillRect, fillRoundRect, fillArc. Moliwe jest zastosowanie 24-bitowej
palety kolorw (zobacz tabela 12). Zmiana koloru odbywa si przy uyciu metody
setColor().

Tabela 12. Wartoci kolorw


wARTO
0x00ff0000
0x0000ff00
0x000000ff
0x00777777
PARAMETRY
setColor(255,0,0)
setColor(0,255,0)
setColor(0,0,255)
setColor(128,0,0)
setColor(255,255,0)
setColor(0,0,0)
setColor(255,255,255)
setColor(128,128,128)

kOLOR
Czerwony
Zielony
Niebieski
Szary
KOLOR
Czerwony
Zielony
Niebieski
Ciemnoczerwony
ty
Czarny
Biay
50% szary

Stowarzyszenie Edukacja dla Przedsibiorczoci

198Metody inarzdzia programowania

// przykady uycia
g.setColor(0x0000ff00); // zielony
g.setColor(0,255,0); // zielony

Wprzypadku umieszczania na ekranie tekstu bardziej zasadne wydaje si uycie terminu rysowanie tekstu. Stosowana jest wtej sytuacji metoda
drawString(string, x, y, anchor), pozwalajca na okrelenie pooenia tekstu na
ekranie urzdzenia oraz sposobu jego wyrwnywania (poziome oraz pionowe, do
lewej lub prawej strony oraz rodkowanie). Poniszy przykad ilustruje sposb
wyrwnania rysowanego tekstu.

public void paint(Graphics g) {


int w= getWidth();
g.drawString("UEK Krakw", w/ 2, 0, Graphics.HCENTER | Graphics.TOP);
}

Wcelu ustalenia wygldu rysowanego tekstu naley przed jego umieszczeniem na ekranie ustali parametry fontu. Niestety, ze wzgldu na ograniczone zasoby systemowe, do dyspozycji programisty przekazano niewielki zbir rozmiarw oraz stylw (tabela 13).

Tabela 13. Waciwoci fontw


Waciwo

Staa

Rozmiar

SIZE_SMALL, SIZE_MEDIUM, SIZE_LARGE

Styl

STYLE_PLAIN, STYLE_ITALICS, STYLE_BOLD, STYLE_UNDERLINED

Krj

FACE_SYSTEM, FACE_MONOSPACE, FACE_PROPROTIONAL

Poniej przedstawiono sposb, wjaki naley okreli waciwoci tekstu


umieszczanego na ekranie urzdzenia.

Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.SIZE_LARGE, Font.BOLD);


g.setFont(f);

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 199


Zmiana ustawie fontu wpywa na faktyczn dugo tekstu. Wcelu precyzyjnego umieszczania tekstu na ekranie programista powinien posiada informacje
orzeczywistej dugoci acucha znakowego. Dla uzyskania tych informacji dostpny jest nastpujcy zestaw metod: getHeight(), stringWidth(), substringWidth(), charsWidth(), charWidth()
Program 3. Niskopoziomowy interfejs uytkownika
Poniszy program stanowi ilustracj niskopoziomowego interfejsu uytkownika. Zastosowane zostay klasy imetody, ktrych podstawowa charakterystyka
zostaa zawarta wniniejszym rozdziale. Rezultatem dziaania programu jest wywietlenie na ekranie urzdzenia tekstu oraz podstawowych figur geometrycznych. Pooenie poszczeglnych elementw zalene jest od fizycznego rozmiaru
ekranu urzdzenia.

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
class Ekran extends Canvas {
public void paint(Graphics g) {
int szer = getWidth(); // ustalenie rozmiarw ekranu
int wys = getHeight();
g.setColor(0x00ffffff); // zmiana koloru ekranu (biay)
g.fillRect(0, 0, szer - 1 , wys - 1);
g.setColor(0x00ff0000); // narysowanie czerwonego prostokta
g.drawRect(szer / 10, wys / 10, szer / 5, wys / 5);
g.setColor(0x0000ff00); // narysowanie zielonej linii
g.drawLine(10, 10, 70, 70);
g.setColor(0x000000ff); // dodanie niebieskiego tekstu
g.drawString("Piszemy po ekranie...", 10, 90, Graphics.TOP | Graphics.LEFT);
}
}

public class ObslugaEkranu extends MIDlet implements CommandListener {


private Ekran ekr;
private Command exitCommand;
private Display dp;
public ObslugaEkranu () {
ekr = new Ekran();
exitCommand = new Command("Zakocz", Command.EXIT, 0);
Stowarzyszenie Edukacja dla Przedsibiorczoci

200Metody inarzdzia programowania

ekr.addCommand(exitCommand);
ekr.setCommandListener(this);
}
public void startApp() {
dp = Display.getDisplay(this);
dp.setCurrent(ekr);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable d) {
// obsluga exitCommand (koniec dziaania aplikacji)
if (c == exitCommand) {
destroyApp(true);
notifyDestroyed();
}
}
}

4.3.3. Jednolity interfejs uytkownika


W poprzednim rozdziale podane zostay podstawowe zasady dotyczce tworzenia interfejsu uytkownika przeznaczonego dla urzdze mobilnych. Wykorzystanie zbioru klas Form, TextBox, List, Alert pozwala wprosty sposb konstruowa
aplikacje, ktre mog zosta uruchamiane na praktycznie kadym urzdzeniu
przenonym. Wad tego podejcia jest rny wygld aplikacji na kadym zurzdze. Rozwizaniem jest uycie interfejsu niskopoziomowego, odwoujcego
si bezporednio do waciwoci fizycznych wywietlacza urzdzenia. Niestety
tworzenie aplikacji jest wtakim przypadku znacznie bardziej uciliwe, aprzede
wszystkim czasochonne. Alternatyw dla powyszych podej stanowi biblioteka
LWUIT (ang. Lightweight User Interface Toolkit128), zawierajca zbir gotowych
narzdzi, ktre znacznie uatwiaj oraz przyspieszaj tworzenie MIDletw.
LWUIT jest pakietem narzdziowym umoliwiajcym tworzenie wpeni przenonych interfejsw niezalenie od urzdzenia iwykorzystanej wersji platformy
Java. Dziki temu moliwe jest ujednolicenie interfejsw przeznaczonych na rne urzdzenia. LWUIT stanowi szkielet dla tworzenia aplikacji przeznaczonych
Sun Microsystems, Inc. [2009], LWUIT Developers Guide. Lightweight UI Toolkit, http://
download.oracle.com/javame/dev-tools/lwuit-1.3/LWUIT_Developer_Guide.pdf (dostp 201105-16).

128

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 201


dla urzdze mobilnych129. Dostarcza zbir komponentw, gotowe iopracowane
ukady graficzne, style itematy, animowan obsug ekranw oraz mechanizm obsugi zdarze. Oprcz gotowych do wykorzystania rozwiza programista moe
opracowywa itworzy wasne komponenty, ukady graficzne czy fonty. Funkcjonalnie LWUIT zbliona jest do biblioteki Swing130, wspierajcej tworzenie
aplikacji dla komputerw stacjonarnych. Tworzenie aplikacji131 sprowadza si do
wykonania nastpujcych czynnoci:
1. Utworzenie nowego projektu waplikacji Jave ME Platform SDK 3.0.
2. Dodanie do projektu biblioteki LWUIT.
3. Inicjalizacja biblioteki LWUIT
Display.init(this);
4. Utworzenie okna
Form f = new Form("Pierwszy MIDlet");
5. Wywietlenie okna na ekranie urzdzenia
f.show();
Program 4. Jednolity interfejs uytkownika LWUIT
Poniszy program stanowi ilustracj aplikacji wykorzystujcej jednolity interfejs uytkownika. Zastosowane zostay klasy i metody zawarte w pakiecie LWUIT,
co pozwala na uzyskanie identycznego wygldu aplikacji, niezalenie od urzdzenia, na ktrym bdzie ona uruchamiana.

Wykaz przykadowych aplikacji komercyjnych wykorzystujcych LWUIT dostpny jest pod


adresem http://lwuit.java.net/nonav/featuredapp.html (dostp 2011-05-16).

129

Swing odnosi si do biblioteki graficznej umoliwiajcej wjzyku programowania Java SE


tworzenie aplikacji graficznych przeznaczonych dla komputerw stacjonarnych.

130

Wprowadzenie do programowania (tutorial) zwykorzystaniem LWUIT dostpne jest na stronie http://lwuit.java.net/tutorial/index.html (dostp 2011-05-16).

131

Stowarzyszenie Edukacja dla Przedsibiorczoci

202Metody inarzdzia programowania

import javax.microedition.midlet.*;
import com.sun.lwuit.*;
import com.sun.lwuit.events.*;
public class LWUITMidlet extends MIDlet
implements ActionListener {
public void startApp() {
// inicjalizacja biblioteki
Display.init(this);
// utworzenie okna
Form f = new Form("Mj MIDlet LWUIT");
// wywietlenie okna
f.show();
// dodanie tekstu (komponentu) woknie
Label label = new Label("UEK Krakw");
f.addComponent(label);
// utworzenie idodanie komendy do okna
Command exitCommand = new Command("Zamknij");
f.addCommand(exitCommand);
// uaktywnienie obsugi zdarze
f.setCommandListener(this);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void actionPerformed(ActionEvent ae) {
notifyDestroyed();
}
}

Wskad tworzonej aplikacji mog wchodzi dodatkowe zasoby, ktre wzasadniczy sposb wzbogacaj funkcjonowanie aplikacji (obrazy jpg ipng, animacje,
fonty, lokalizacje, tematy). Wymienione zasoby przechowywane s pocztkowo
woddzielnym folderze (.res), ktry jest nastpnie doczany do archiwum wynikowego (.jar).
Biblioteka LWUIT zawiera zbir klas132 realizujcych funkcjonalno pl edycyjnych, list wyboru, list opcji czy okien modalnych. Poniszy, uproszczony schemat, przedstawia hierarchi klas wchodzcych wskad biblioteki LWUIT.
Wykaz dostpnych klas (LWUIT API) dostpny jest pod adresem http://lwuit.java.net/nonav/
javadocs/index.html (dostp 2011-05-16).

132

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 203

Rys. 40. Hierarchia klas LWUIT

Umieszczanie komponentw woknie polega zwykle na:


utworzeniu komponentu uycie odpowiedniej klasy wzalenoci od typu
obiektu),
dodaniu komponentu do okna uycie metody okno.addComponent(komponent).
Poszczeglne komponenty prezentowane s woknie wkolejnoci, wjakiej
zostay dodane. Moliwe jest rwnie sterowanie ich rozmieszczeniem. Su do
tego celu menadery rozkadu (ang. layout manager)133 pozwalajce na:
rozmieszczenie komponentw od lewej do prawej strony (klasa FlowLayout),
podzia powierzchni okna na pi obszarw centralny oraz cztery pozostae,
zlokalizowane wok krawdzi (BorderLayout), zobacz Rys. 41,
organizacj komponentw wwierszu lub kolumnie (BoxLayout),
umieszczenie komponentw wtabeli (GridLayout),
niezalene co do rzdw ikolumn rozmieszczanie komponentw (GroupLayout).

Funkcjonowanie menaderw rozkadu jest praktycznie identyczne jak wprzypadku rozwiza stosowanych podczas tworzenia aplikacji dla komputerw stacjonarnych (Java Standard
Edition, biblioteka Swing). Szczegowe informacje dostpne s pod adresem http://download.oracle.com/javase/tutorial/uiswing/layout/index.html (dostp 2011-05-16).

133

Stowarzyszenie Edukacja dla Przedsibiorczoci

204Metody inarzdzia programowania

Rys. 41. Menader rozkadu BorderLayout

Wykorzystanie menadera rozkadu polega na jego przypisaniu do kontenera


(np. okna), anastpnie umieszczeniu komponentu/komponentw we wskazanej
czci kontenera.

4.4. Metody komunikacji zotoczeniem


Aplikacje mobilne umoliwiaj obsug pocze sieciowych za pomoc prostego interfejsu bdcego skadow GCF134 (ang. Generic Connection Framework). Urzdzenia mobilne obsuguj przynajmniej dwa protokoy: http oraz
https.
GCF upraszcza sposb komunikacji sieciowej. Programista okrela wformie
acucha tekstowego zasb sieciowy, aframework tworzy odpowiednie strumienie wejciowe iwyjciowe. Obsuga strumieni jest identyczna jak wJavie SE135.
Java ME udostpnia prost komunikacj tekstow imultimedialn (SMS,
MMS) za pomoc interfejsu programowego Wireless Messaging API136 (wskrcie WMA). Wysyanie bd te odbieranie danych sprowadza si do utworzenia
obiektu klasy MessageConnection oraz podania odpowiednich informacji137. Sam
interfejs wystpuje wdwch wersjach:

GCF jest zbiorem hierarchicznie uoonych interfejsw oraz klas do tworzenia pocze oraz
wykonywania operacji wejcia iwyjcia.

134

Wikszo klas wchodzcych wskad GCF dostpnych jest wpakiecie javax.microedition.io.

135

WMA bazuje na GCF. Klasy zwizane z WMA dostpne s w pakiecie


javax.wireless.messaging.

136

Programista moe przetestowa MIDlety wykorzystujce WMA za pomoc specjalnej konsoli


dostpnej standardowo wSDK.

137

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 205


1.0 i1.1 (rozszerzenie JSR 120138) odnoszce si do obsugi krtkich wiadomoci tekstowych (SMS),
2.0 (rozszerzenie JSR 205139) realizujce funkcje wysyania iodbioru wiadomoci tekstowych oraz multimedialnych (MMS).
Naley pamita ostosowaniu zasad programowania wielowtkowego podczas tworzenia aplikacji mobilnych, szczeglnie wprzypadku realizacji funkcji
komunikacyjnych (nawizanie poczenia, wysyanie wiadomoci, obsuga Bluetooth).

4.4.1. Nawizywanie izamykanie pocze


Nawizanie poczenia realizowane jest poprzez wykorzystanie jednej zmetod
open zawartych wklasie Connector. Sposb dostpu do danych zawartych wsieci
ilustruje poniszy przykad:
String url = "http://strona.pl/index.html";
HttpConnection c = (HttpConnection) Connector.open(url);
InputStream in = c.openInputStream();
// np. in.read() ...odczyt danych

Metoda open() zwraca obiekt implementujcy oglny interfejs poczenia


Connection. Aby sprecyzowa rodzaj poczenia, aco za tym idzie wykorzysta
jego moliwoci, naley dokona rzutowania do odpowiedniej klasy (np. implementujcej interfejs HttpConnection). Interfejs Connection posiada pokan liczb
podinterfejsw umoliwiajcych tworzenie rnego typu pocze, wrd ktrych
wyrni mona:
protokoy http, https,
gniazdka sieciowe (ang. sockets), wtym take serwery,
port szeregowy,
datagramy,
SMSy, MMSy (wspomniane ju rozszerzenie JSR 205),
Bluetooth (rozszerzenie JSR 82140).
Wireless Messaging API, http://www.jcp.org/en/jsr/detail?id=120 (dostp 2011-05-21).

138

Wireless Messaging API 2.0, http://www.jcp.org/en/jsr/detail?id=205 (dostp 2011-05-21).

139

Java APIs for Bluetooth, http://www.jcp.org/en/jsr/detail?id=82 (dostp 2011-05-21).

140

Stowarzyszenie Edukacja dla Przedsibiorczoci

206Metody inarzdzia programowania


Kade poczenie powinno zosta zamknite po odczytaniu wszystkich danych. Interfejs Connection dostarcza metod close(). Zamykajc poczenie, naley pamita rwnie ozamkniciu wszystkich otwartych wczeniej strumieni
danych141:
HttpConnection polaczenie = (HttpConnection)Connector.open(adresURL);
try {
InputStream wejscie = polaczenie.openInputStream();
try {
// odczyt danych ze strumienia (wejscie)
} finally { wejscie.close(); }
} finally { polaczenie.close(); }

Powyszy kod programu musi dodatkowo uwzgldnia przechwycenie wyjtkw (wtym przypadku IOException).

4.4.2. Wielowtkowo
Funkcjonowanie aplikacji wykorzystujcych poczenia sieciowe uzalenione
jest od wielu czynnikw, na przykad szybkoci cza czy te poprawnoci transmisji. Wymusza to na programicie stosowanie oddzielnych wtkw dla kadego
poczenia. Uytkownik moe wkadej chwili przerwa takie poczenie, zakoczy dziaanie aplikacji lub te pracowa zjej inn czci. Tworzenie nowego
wtku polega na utworzeniu obiektu klasy Thread iprzekazaniu do jej konstruktora obiektu implementujcego interfejs Runnable. Uruchomienie wtku odbywa si
za pomoc metody start(). Waplikacjach mobilnych, wwikszoci przypadkw,
gwna klasa MIDletu implementuje interfejs Runnable142.
// tworzenie nowego wtku
Thread t = new Thread(this);
// uruchomienie wtku
t.start();

Tak utworzony wtek wykona ciao metody run() niezalenie od pozostaego


kodu programu.

Zastosowanie finally powoduje wykonanie kodu wkadej sytuacji.

141

Interfejs Runnable posiada metod run(), ktra jest uruchamiana podczas startu wtku.

142

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 207

4.4.3. Praktyczna realizacja komunikacji


Zadaniem programu jest prezentacja aktualnego kursu waluty USD. Informacje pobierane bd zserwisu internetowego143. Aplikacja wykorzystuje obsug
pocze sieciowych realizowan przy wykorzystaniu zasad programowania wielowtkowego. Rezultat dziaania aplikacji zosta przedstawiony na poniszym rysunku (Rys. 42).

Rys. 42. Rezultat dziaania aplikacji: pobieranie danych


oraz wywietlenie aktualnego kursu USD

Tworzc klas, naley pamita oimplementacji interfejsu Runnable (obsuga


wielowtkowoci):
public class PobieranieDanych extends MIDlet implements CommandListener, Runnable {
// ciao klasy
}

Wprzykadowej aplikacji wykorzystana zostaa witryna NBP; http://nbp.pl/Kursy/KursyA.


html (dostp 2011-05-21).

143

Stowarzyszenie Edukacja dla Przedsibiorczoci

208Metody inarzdzia programowania


Wkonstruktorze klasy utworzony zostanie ekran startowy wywietlajcy acuch tekstowy Pobieranie danych..., wczona zostanie obsuga zdarze oraz uruchomiony wtek odpowiedzialny za poczenie ze stron zawierajc kursy walut.

public PobieranieDanych () {
// utworzenie obiektu klasy TextBox
tb = new TextBox("Kursy NBP", "Pobieram dane....", 100, TextField.ANY);
// utworzenie nowego polecenia
exitCommand = new Command("Zakocz", Command.EXIT, 0);
// dodanie polecenia do pola tekstowego
tb.addCommand(exitCommand);
// wskazanie obiektu obsugujcego zdarzenia
tb.setCommandListener(this);
// utworzenie nowego wtku
Thread t = new Thread(this);
// uruchomienie wtku
t.start();
}

Po uruchomieniu MIDletu jako gwny ekran wskazywany jest obiekt klasy


TextBox.
public void startApp() {
// ustawienie ekranu pocztkowego
Display.getDisplay(this).setCurrent(tb);
}

Jedyn obsugiwan przez aplikacj komend jest polecenie Zakocz. Po wybraniu tej opcji program zostanie zamknity.
public void commandAction(Command c, Displayable d) {
// obsuga polecenia exitCommand (zakoczenie aplikacji)
if (c == exitCommand) {
destroyApp(true);
notifyDestroyed();
}
}

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 209


Proces pobierania danych zostanie uruchomiony jako oddzielny wtek (ciao metody run()). Po uzyskaniu poczenia zwitryn NBP tworzony jest strumie przesyanych danych wejciowych, ktre trafiaj do bufora (obiekt klasy
StringBuffer). Wbuforze znajdzie si zatem caa zawarto strony witryny
(wformie pliku rdowego wjzyku HTML). Korzystajc zmetod dostpnych
wklasie String, ustalane jest pooenie cigu znakw USD oraz pobierane s
wartoci okrelajce kurs waluty. Ostatnia faza dziaania programu to zamknicie poczenia oraz strumienia danych iwywietlenie biecego kursu na ekranie
(metoda setString() zklasy TextBox).
public void run() {
//utworzenie obiektu klasy StringBuffer
sb = new StringBuffer();
try {
//poczenie ze stron NBP
c = (HttpConnection) Connector.open("http://nbp.pl/Kursy/KursyA.html",
Connector.READ, true);
// otwarcie strumienia danych wejciowych
is = c.openInputStream();
int ch = 0;
// odczyt wszystkich danych (-1 koniec danych) oraz
// dodanie ich do acucha tekstowego
while ((ch = is.read()) != -1) {
sb.append((char) ch);
}
}
catch (IOException x){
System.out.println("Bd wejcia/wyjcia");
}
finally {
try {
is.close();
c.close();
} catch (IOException x) {
System.out.println("Bd
wejcia/wyjcia");
}
}
// zamiana obiektu klasy StringBuffer na String
String wyn = sb.toString();
// wyszukanie cigu znakw USD
int i = wyn.indexOf("USD");
// wyszukanie aktualnego kursu USD
i = i + 32;
// wycicie danych kursu (acuch tekstowy)
String wartosc = wyn.substring(i, i + 6);
// zamiana , na .
wartosc = wartosc.replace(',', '.');

Stowarzyszenie Edukacja dla Przedsibiorczoci

210Metody inarzdzia programowania

// konwersja zmiennej typu String z kursem na zmienn typu float


float kurs = Float.parseFloat(wartosc);
// aktualizacja obiektu klasy TextBox
tb.setString("Aktualny kurs USD: " + kurs);
}

4.4.4. Wysyanie iodbir wiadomoci tekstowych oraz binarnych


Wysyanie wiadomoci zwizane jest zotwarciem poczenia. Wykorzystywana jest, podobnie jak wpoczeniach sieciowych, metoda open()klasy Connector.
Inaczej jednak wyglda rzutowanie obiektu zwracanego przez metod. Wmiejsce
HttpConection stosowany jest interfejs MessageConnection. Parametrem metody
open() jest acuch tekstowy zawierajcy rodzaj protoku (sms://) oraz numer
telefonu odbiorcy wiadomoci:
String cs = "sms://+48639457325";
// utworzenie poczenia
MessageConnection mc = (MessageConnection) Connector.open(cs);

Utworzenie wiadomoci umoliwia metoda newMessage(), wktrej parametr


wejciowy okrela rodzaj wysyanej wiadomoci (tekstowa, binarna):
// utworzenie nowej wiadomoci tekstowej
TextMessage tm = (TextMessage) mc.newMessage(MessageConnection.TEXT_MESSAGE);

Kocowe czynnoci, ktre naley wykona, to okrelenie treci wiadomoci


(metoda setPayloadText()) oraz jej wysanie (metoda send()144).
// ustawienie treci wiadomoci
tm.setPayloadText("Wiadomosc tekstowa zMIDletu.");
// wysanie wiadomoci
mc.send(tm);

Warto pamita, e wysyanie wiadomoci tekstowych obcione jest opatami pobieranymi


przez operatorw komrkowych (konieczna bdzie zgoda uytkownika na wykonanie operacji
realizowanej przez MIDlet).

144

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 211


Po uruchomieniu konsoli WMA, anastpnie utworzonej aplikacji moliwe jest
sprawdzenie poprawnoci jej dziaania.

Rys. 43. Konsola WMA zotrzyman wiadomoci

Wprzypadku wysyania wiadomoci binarnych konieczne jest prawidowe


okrelenie jej rodzaju (MessageConnection.BINARY_MESSAGE) oraz przekazywanej
treci (dane binarne).

String cs = "sms://+48639457325";
// utworzenie poczenia
MessageConnection mc = (MessageConnection) Connector.open(cs);
// utworzenie nowej wiadomoci binarnej (inny typ)
BinaryMessage bm = (BinaryMessage) mc.newMessage(MessageConnection.BINARY_MESSAGE);
// ustawienie treci wiadomoci (tablica bajtowa)
byte[] dane ...
bm.setPayloadData(dane);
// wysanie wiadomoci
mc.send(bm);

Stowarzyszenie Edukacja dla Przedsibiorczoci

212Metody inarzdzia programowania

4.4.5. Wysyanie iodbir wiadomoci multimedialnych


Wiadomoci multimedialne (ang. Multimedia Messaging Service MMS) stanowi rozszerzenie wiadomoci tekstowych. Umoliwiaj przesyanie danych multimedialnych, skadajcych si zwielu czci (tekst, grafika, dwik). Gwn klas odpowiedzialn za obsug MMS jest klasa MultipartMessage, wskad ktrej
wchodz adresy odbiorcw, temat oraz okrelona liczba czci (klasa MessageParts).
Kada cz musi posiada okrelony typ, identyfikator oraz zawarto. Typ danych okrelany jest identycznie, jak ma to miejsce wkomunikacji e-mailowej (typ
MIME). Poniszy przykad ilustruje wysanie wiadomoci multimedialnej MMS
skadajcej si ztematu oraz dwch czci: tekstowej oraz graficznej.
MessageConnection mc = null;
String cs = "mms://+987654321"; // Inbox telefonu komrkowego
// utworzenie poczenia
mc = (MessageConnection) Connector.open(cs);
// utworzenie wiadomoci iustawienie jej rodzaju na wieloczciow
MultipartMessage mm =(MultipartMessage) mc.newMessage(MessageConnection.MULTIPART_
MESSAGE);
// ustawienie tematu wiadomoci
mm.setSubject("Testujemy wysylanie MMS'a");

Po przygotowaniu szkieletu wiadomoci konieczne jest dodanie jej zawartoci.


Wprzypadku czci tekstowej realizowane jest to tak, jak przedstawiono na poniszym przykadzie:

MessagePart mp;
int licznik = 1;
// cz tekstowa
// typ MIME (czysty tekst)
String mimeType = "text/plain";
// kodowanie
String encoding = "UTF-8";
// tekst wiadomoci

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 213

String text = "Przykladowy MMS wyslany zMIDletu";


// zamiana tekstu na tablic bajtw zodpowiednim kodowaniem
byte[] contents = text.getBytes(encoding);
// utworzenie czci
mp = new MessagePart(contents, mimeType, "id" + licznik, null, encoding);
// dodanie je do wiadomoci
mm.addMessagePart(mp);

Cz binarna wiadomoci multimedialnej zawiera bdzie obrazek wformacie PNG (zostanie on umieszczony wkatalogu res projektu). Jego doczenie do
wiadomoci przeprowadzane jest zgodnie zponiszym kodem programu:
licznik++;
// cz binarna
// typ MIME (plik graficzny PNG)
mimeType = "image/png";
// lokalizacja (katalog res)
String image = "/uek.png";
// utworzenie strumienia danych ipowizanie go zzasobem
InputStream is = getClass().getResourceAsStream(image);
// utworzenie tablicy bajtowej orozmiarze zasobu
contents = new byte[is.available()];
// odczyt danych ze strumienia do tablicy
is.read(contents);
// utworzenie czci
mp = new MessagePart(contents, mimeType, "id" + licznik, null, null);
// dodanie do wiadomoci
mm.addMessagePart(mp);

Zmienna licznik wykorzystywana jest do generowania numeru identyfikacyjnego kadej czci. Ostatni czynnoci jest wysanie poprawnie utworzonej
wiadomoci:

Stowarzyszenie Edukacja dla Przedsibiorczoci

214Metody inarzdzia programowania

Rys. 44. Konsola WMA zwiadomoci wieloczciow

4.4.6. Programowy odbir wiadomoci


Podczas wysyania wiadomoci tekstowej okrelany jest numer telefonu komrkowego adresata wiadomoci. Dodatkowo mona ustawi numer portu145, na
ktry ma zosta dostarczona wiadomo. Brak numeru portu powoduje odebranie wiadomoci przez domyln aplikacj urzdzenia mobilnego (skrzynka odbiorcza). Dodanie numeru portu pozwala na odbir wysyanej wiadomoci przez
MIDlety nasuchujce na podanym porcie (wten sposb tworzy si aplikacje odbierajce wiadomoci tekstowe jak i, co ciekawsze, uruchamiajce odpowiedni
MIDlet po nadejciu takiej wiadomoci technologia Push Registry).
String cs = "sms://+987654321:50000";
MessageConnection mc = (MessageConnection) Connector.open(cs);

145

Numer portu to 16-bitowa liczba umoliwiajca ustalenie przynalenoci danej transmisji do


konkretnego procesu.

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 215


Wprzypadku wiadomoci multimedialnych nie ma moliwoci okrelenia numeru portu. Zamiast tego czsto podawane jest ID aplikacji wysyajcej (wwikszoci przypadkw stosowane jest nazewnictwo takie, jak przy okrelaniu nazewnictwa pakietw Javy).
String cs = "sms://+987654321:pl.krakow.uek";
MessageConnection mc = (MessageConnection) Connector.open(cs);

Numer 987654321 jest standardowym numerem konsoli WMA. Dziki temu


moliwe jest sprawdzenie poprawnoci dziaania aplikacji. WMA umoliwia rwnie wysyanie wiadomoci pod wskazany numer emulowanego urzdzenia mobilnego (mona przetestowa poprawno odbioru wiadomoci).
Implementujc obsug odbioru wiadomoci, naley wzi pod uwag, i nie
jest moliwy programowy jej odbir wprzypadku jej wysania bezporednio na
skrzynk odbiorcz urzdzenia mobilnego. Jedyn moliwoci jest odbir danych wysyanych na podany numer portu. Realizowane jest to na jeden zdwch
sposobw:
utworzenie wtku nasuchujcego,
wykorzystanie aplikacji nasuchujcej.
Pierwsze zwymienionych rozwiza nie jest zalecane ze wzgldu na konieczno nieprzerwanego dziaania procesu zajmujcego si obsug odbieranych wiadomoci. Drugie zrozwiza pozwala przenie ciar oczekiwania na wiadomoci zaplikacji na system. Zchwil nadejcia wiadomoci zostanie wywoana
odpowiednia metoda. Konieczne jest jedynie pobranie oraz wywietlenie dostarczonych informacji.
Ponisze rozwaania odnosz si do aplikacji, ktrej podstawow funkcj jest
prosty edytor tekstu. Dodatkowo MIDlet nasuchuje na ustalonym porcie nadejcie
wiadomoci tekstowej. Zchwil jej otrzymania pojawia si na ekranie urzdzenia
komunikat zawierajcy nadawc oraz tre wiadomoci, apo jego zatwierdzeniu
uytkownik ma moliwo dalszego kontynuowania pracy (Rys. 45).

Stowarzyszenie Edukacja dla Przedsibiorczoci

216Metody inarzdzia programowania

Rys. 45. Ekran edycji tekstu oraz otrzymana wiadomo tekstowa

Ustawienie nasuchu zwizane jest zwywoaniem metody setMessageListener() iprzekazaniem jej jako parametru obiektu implementujcego interfejs
MessageListener. Wprzykadzie ten interfejs zosta zaimplementowany wklasie
MIDletu:
public class OdbieranieSMS extends MIDlet implements CommandListener, Runnable,
MessageListener {
}

Metoda open() otwiera poczenie (podany jest tylko typ wiadomoci oraz
numer portu), natomiast metoda setMessageListener() wskazuje klas zwizan
znasuchem.
String cs = "sms://:5000";
// ustawienie nasuchiwacza (obiekt klasy implementujcej interfejs MessageListener)
try {
mc = (MessageConnection) Connector.open(cs);
mc.setMessageListener(this);
} catch (IOException ioe) {
System.out.println("Bd wejcia/wyjcia");
}
Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 217


Konieczna jest rwnie implementacja metody zinterfejsu MessageListener,
wktrej tworzony jest nowy wtek, zajmujcy si dalsz obsug wiadomoci.
Dodanie wtku pozwala na natychmiastowe zwolnienie nasuchiwacza iwznowienie jego pracy (oczekiwania na kolejne wiadomoci).
// metoda wywoywana podczas otrzymania przez aplikacj wiadomoci SMS
public void notifyIncomingMessage(MessageConnection conn) {
mc = conn;
// utworzenie nowego wtku
Thread t = new Thread(this);
// uruchomienie wtku
t.start();
}

Wmetodzie run() odebrana zostanie wiadomo, ktrej tre wywietlona zostanie na ekranie zwykorzystaniem klasy Alert.

public void run() {


Message msg = null;
try {
// odbir wiadomoci
msg = mc.receive();
} catch (IOException ioe) {
System.out.println("Bd wejcia/wyjcia");
}
if(msg instanceof TextMessage) {
// rzutowanie do wiadomoci tekstowej
TextMessage tmsg = (TextMessage) msg;
// utworzenie obiektu klasy Alert wraz zodpowiednimi danymi
//(adres nadawcy, tre wiadomoci)
Alert al = new Alert("Informacja", "Nowa wiadomo SMS od" + tmsg.getAddress() +
":\n" + tmsg.getPayloadText(), null, AlertType.INFO);
// ustawienie czasu przez jaki Alert ma by wywietlany
//(tutaj do zamknicia przez uytkownika)
al.setTimeout(Alert.FOREVER);
// wywietlenie Alertu oraz wskazanie na ekran,
//ktry ma zosta wywietlony po jego zamkniciu
dp.setCurrent(al, tb);
}
Stowarzyszenie Edukacja dla Przedsibiorczoci

218Metody inarzdzia programowania


Identycznie realizowany jest odbir wiadomoci binarnych oraz multimedialnych. Zostaje otwarte odpowiednie poczenie iaplikacja oczekuje na informacj
onadejciu wiadomoci.

4.5. Zapis iodczyt danych


Aplikacje tworzone dla urzdze mobilnych udostpniaj kilka moliwoci
trwaego przechowywania danych. Moe to zosta zrealizowane poprzez:
wykorzystanie dostpnej bazy danych (ang. Record Management System
RMS),
dostp do systemu plikw urzdzenia mobilnego,
dostp zbioru informacji personalnych (kontakty, lista zada, kalendarz) uytkownika urzdzenia mobilnego (ang. Personal Information Management
PIM).
Pierwsze zwymienionych rozwiza (RMS) moe zosta bezporednio zaimplementowane na kadym urzdzeniu mobilnym. Pozostae dwa wymagaj dostpnoci dodatkowego rozszerzenia (JSR 75146). Ich obsuga wymaga ponadto
podpisu cyfrowego lub zgody uytkownika urzdzenia mobilnego.

4.5.1. Record Management System


RMS stanowi baz danych udostpniajc tabel zrekordami przechowujcymi tablice bajtowe. API RMS zwizane jest zpakietem javax.microedition.rms.
Gwna klasa RecordStore udostpnia zbir metod umoliwiajcych manipulacj
rekordami (dodawanie, usuwanie, aktualizacj itp.). Obsuga bazy danych wwikszoci przypadkw polega na:
utworzeniu obiektu klasy RecordStore (utworzenie lub otwarcie bazy),
RecordStore rs = RecordStore.openRecordStore("baza", true);

wykonaniu operacji na zbiorze rekordw (dodawanie, modyfikacja, usuwanie),


zamkniciu otwartego zbioru.
rs.closeRecordStore();

PDA Optional Packages for the Java ME Platform, http://www.jcp.org/en/jsr/detail?id=75


(dostp 2011-05-21).

146

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 219


Do utworzenia nowej lub otwarcia istniejcej bazy wykorzystywana jest statyczna metoda openRecordStore():
try {
// otwarcie zbioru zrekordami (jeli nie istnieje zostanie on utworzony)
rs = RecordStore.openRecordStore("Notatki", true);
} catch (RecordStoreException e) {
System.out.println ("Problem zRMS");
}

Drugi zwymienionych parametrw metody (typu boolean) okrela, czy baza


ma zosta utworzona, jeli nie istnieje. Otwarcie bazy moe powodowa pojawienie si bdw typu RecordStoreException. Wyjtki te s przechwytywane, auytkownik jest onich powiadamiany za pomoc komunikatu147.
Kod programu zawierajcy otwarcie bazy najczciej umieszczany jest
wkonstruktorze klasy. Poszczeglne rekordy skadaj si ztablic bajtowych.
Kady rekord posiada unikalny numer (ID). Moliwe jest wykonanie nastpujcych operacji:

dodanie rekordu metoda addRecord(),

int id = rs.addRecord(dane, 0, dane.length);


// gdzie:
// rs to obiekt klasy RecordStore: RecordStore rs = ...
// dane to tablica bajtowa: byte[] dane = ...

modyfikacja rekordu metoda setRecord(), wymagajca znajomoci jego


ID,

usunicie rekordu metoda deleteRecord(), wymagajca znajomoci jego


ID,
pobranie rekordu metoda getRecord(), zwracajca tablic bajtw:

Wgotowej aplikacji, przeznaczonej do dystrybucji, naley wywietla komunikaty obdach


na urzdzeniu mobilnym np. wykorzystujc klas Alert.

147

Stowarzyszenie Edukacja dla Przedsibiorczoci

220Metody inarzdzia programowania

byte[] dane = rs.getRecord(id);


// gdzie
// rs to obiekt klasy RecordStore: RecordStore rs = ...
// id to ID rekordu

uzyskanie informacji orozmiarze rekordu (metoda getRecordSize()),


pobranie wszystkich rekordw zbazy (metoda enumerateRecords()),
try {
// wyliczenie wszystkich rekordw
RecordEnumeration re = rs.enumerateRecords(null, null, false);
// przejcie przez wszystkie rekordy wzbiorze
while(re.hasNextElement()){
// odczyt rekordu
byte[] record = re.nextRecord();
}
} catch (RecordStoreException e) {
System.out.println ("Bd RMS");
}

Metoda enumerateRecords() zwraca obiekt klasy RecordEnumeration poprzez


wykorzystanie metod hasNextElement(), nextRecord(), previousRecord() itp. oraz
pozwala dodatkowo okreli:
zakres pobieranych rekordw (implementacja interfejsu RecordFilter),
sposb ich uporzdkowania (implementacja interfejsu RecordComparator).
Dla potrzeb projektu obie te wartoci ustawione s na null (pobierane s
wszystkie rekordy). Za zamknicie otwartej bazy odpowiada statyczna metoda
closeRecordStore(). Poniszy kod zamyka baz oraz obsuguje wyjtki.
try {
// zamknicie zbioru zdanymi
rs.closeRecordStore();
} catch (RecordStoreException e) {
System.out.println ("Nie mona zamkn RMS");
}

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 221

4.5.2. Praktyczne wykorzystanie moliwoci RMS


Zadaniem aplikacji bdzie tworzenie iprzechowywanie notatek tekstowych
(Rys. 46). Wykorzystane zostan omwione wczeniej elementy aplikacji mobilnych oraz nowe pojcia zwizane zprzechowywaniem danych.

Rys. 46. Przykadowy wygld aplikacji:


menu gwne, nowa notatka, lista notatek, podgld notatki

Wkonstruktorze MIDletu zawarta zostaa obsuga otwarcia bazy danych (oile


istnieje) albo tworzona jest nowa baza danych onazwie Notatki.

Stowarzyszenie Edukacja dla Przedsibiorczoci

222Metody inarzdzia programowania

try {
// otwarcie zbioru zrekordami (jeli nie istnieje zostanie on utworzony)
rs = RecordStore.openRecordStore("Notatki", true);
} catch (RecordStoreException e) {
System.out.println ("Problem zRMS");
}

Uytkownik ma moliwo dodania nowej notatki (opcja Nowa notatka).


Do zrealizowania tej funkcji wykorzystana zostaa klasa TextBox. Wybranie opcji
Zapisz spowoduje pobranie tekstu zokna oraz utworzenie nowego rekordu wbazie danych.

// utworzenie strumienia danych wyjciowych


ByteArrayOutputStream arrayStream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(arrayStream);
try {
// zapis danych pobranych zpola tekstowego do
//strumienia out.writeUTF(tb.getString());
// utworzenie tablicy bajtw
byte[] data = arrayStream.toByteArray();
// dodanie rekordu
rs.addRecord(data, 0, data.length);
// zamknicie strumienia
out.close();
} catch (IOException e) {
System.out.println ("Bad wejcia/wyjcia.");
} catch (RecordStoreException e) {
System.out.println ("Bd zapisu RMS.");
}

Po wybraniu opcji Lista notatek pobierane s zbazy wszystkie przechowywane rekordy iwywietlane uytkownikowi wformie listy (notatki dusze ni
40 znakw wywietlane s na licie wformie skrconej). Dodatkowo podczas
pobierania wszystkich rekordw zapisywane s one wtablicy acuchw tekstowych (zmienna notki[]), tak aby nie odczytywa ich ponownie przy penym wywietlaniu notatki.

Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 223

// utworzenie listy notatek


listaNotek = new List("Lista notek", List.IMPLICIT);
try {
// wyliczenie wszystkich rekordw
RecordEnumeration re = rs.enumerateRecords(null, null, false);
// zmienna pomocnicza
int i= 0;
// utworzenie tablicy Stringw znotkami orozmiarze takim jak liczba rekordw
notki = new String[re.numRecords()];
// przejcie przez wszystkie rekordy wzbiorze
while(re.hasNextElement()) {
// odczyt rekordu
byte[] record = re.nextRecord();
// utworzenie strumienia danych wejciowych
ByteArrayInputStream raw = new ByteArrayInputStream(record);
DataInputStream in = new DataInputStream(raw);
// odczyt notatki
String notka = in.readUTF();
// wpisanie notatki do tablicy
notki[i] = notka;
i++;
// utworzenie krtkiej wersji notatki do pokazania na licie
notka = notka.substring(0, (notka.length()) > 40 ? 40 : notka.length()) +
((notka.length()>40) ? "..." : "");
listaNotek.append(notka, null);
// zamknicie strumienia danych wejciowych
in.close();
}
} catch (IOException e) {
System.out.println ("Bd wejcia/wyjcia.");
} catch (RecordStoreException e) {
System.out.println ("Bd odczytu RMS.");
}

Po wybraniu przez uytkownika notatki, ktr chce zobaczy wformie penej,


pobierana jest zawarto tablicy oodpowiednim indeksie. Tak pobrane dane zostan wywietlone na ekranie.
// utworzenie pola tekstowego zzawartoci odpowiedniej notatki pobranej ztablicy
tbf = new TextBox("Peny tekst", notki[listaNotek.getSelectedIndex()],
320, TextField.UNEDITABLE);

Stowarzyszenie Edukacja dla Przedsibiorczoci

224Metody inarzdzia programowania

4.6. Pytania
1. Ktry zjzykw znacznikowych posiada rekomendacj dla opisu zasobw
dedykowanych dla urzdze mobilnych?
2. Jakie reguy skadni charakteryzuj metajzyk XML?
3. Ze wzgldu na ograniczone fizyczne moliwoci urzdzenia mobilnego
utrudniona jest interakcja zuytkownikiem. Jakie dziaania umoliwiaj
popraw efektywnoci wprowadzania danych?
4. Ktre zwymienionych urzdze uytych do weryfikacji poprawnoci utworzonej witryny mobilnej moe generowa dodatkowe koszty finansowe:
urzdzenie mobilne, emulator urzdzenia mobilnego, komputer stacjonarny?
5. Ktry ze sposobw kodowania polskich znakw narodowych zalecany jest
wprzypadku tworzenia witryn przeznaczonych dla urzdze mobilnych?
6. Jaka jest zalecana maksymalna wielko pojedynczego pliku wchodzcego
wskad witryny mobilnej? Jaka jest zalecana maksymalna wielko witryny?
7. Liczba pozycji menu, wprzypadku tworzenia witryny przeznaczonej dla
urzdze mobilnych, nie powinna przekracza liczby dostpnych klawiszy
klawiatury numerycznej. Jakie inne dziaania zaleca si podczas konstruowania menu?
8. Ze wzgldu na niewielkie gabaryty urzdzenia mobilnego oraz zwykle brak
klawiatury alfanumerycznej zalecane jest unikanie wprowadzania wikszej
iloci tekstu. Ktre ze sposobw pozwalaj na alternatywne wprowadzanie
danych?
9. Czym charakteryzuje si interfejs wysokopoziomowy? Jakie waciwoci
odrniaj go od interfejsu niskopoziomowego?
10. Jakie cztery podstawowe rodzaje ekranw dostarcza LCDUI? Ktry znich
umoliwia wywietlanie komunikatw?
11. Co odrnia metod drawString() od drawRect()? Ktra znich umoliwia
narysowanie na ekranie figury geometrycznej?
12. Wktrej czci ekranu interfejsu niskopoziomowego zlokalizowany jest
punkt owsprzdnych 0,0?
13. Jak funkcjonalno dostarcza metoda setColor()?
14. Dlaczego zmiana ustawie fontu wpywa na faktyczn dugo wywietlanego tekstu?
15. Czym charakteryzuje si pakiet narzdziowy LWUIT? Wjakim celu si go
stosuje?
16. Co oznaczaj pojecia CLDC, MIDP, JSR?
Uniwersytet Ekonomiczny w Krakowie

Programowanie urzdze mobilnych 225


17. Jakie s rnice pomidzy wersj Javy Micro Edition aStandard Edition?
18. Jak wyglda cykl ycia MIDletu? Jakie metody s powizane zposzczeglnymi stanami?
19. Zjakiej klasy musi dziedziczy klasa MIDletu?
20. Jakie narzdzia/aplikacje s niezbdne do utworzenia wpeni dziaajcego
MIDletu?
21. Zjakich plikw skada si skompilowany igotowy do dystrybucji MIDlet?
22. Czym jest GCF? Do czego suy klasa Connector?
23. Aplikacje wykorzystujce poczenia sieciowe korzystaj zwielowtkowoci. Wjaki sposb tworzy si iwykorzystuje wtki?
24. Co umoliwia Wireless Messaging API?
25. Jaka klasa odpowiedzialna jest za tworzenie wiadomoci tekstowych, jaka
binarnych, ajaka multimedialnych?
26. Czy wJavie ME istnieje moliwo odbioru wiadomoci przychodzcych?
Jeli tak, to wjaki sposb jest to realizowane?
27. Wjaki sposb mona zapisywa dane wMIDletach?
28. Co oznacza skrt RMS?
29. Na przechowywanych wpamici urzdzenia mobilnego rekordach mona
wykonywa operacje. Ktre znich nale do czynnoci podstawowych?
30. Jaka metoda umoliwia odczyt zbazy RMS wszystkich rekordw?

4.7. Literatura
Bielecki J. [1999], Programowanie wspbiene, obiektowe izdarzeniowe, Helion, Gliwice.
Cremin R., Rabin J., Fling B., Robinson D.K. [2007], Mobile Web Developers
Guide. Part I: Creating Simple Mobile Sites for Common Handsets, mobile
Top Level Domain, Dublin, http://pc.dev.mobi/files/dotMobi Mobile Web
Developers Guide.pdf (dostp 2011-05-23).
Goetz B., Peielrs T., Bloch J., Nowbeer J., Holmes D., Lea D. [2007], Java.
Wspbieno dla praktykw, Helion, Gliwice.
Goyal V. [2006], Pro Java ME MMAPI: Mobile Media API for Java Micro Edition, Apress.
Keogh J. [2003], J2ME: The Complete Reference, McGraw-Hill.
Stowarzyszenie Edukacja dla Przedsibiorczoci

226Metody inarzdzia programowania


Knudsen J. [2007], Kicking Butt with MIDP and MSA, Addison Wesley Professional.
Knudsen J., Li S. [2005], Beginning J2ME Platform: From Novice to Professional, Apress.
Rabin J., McCathieNevile C., (Eds.), Mobile Web Best Practices, WWW Consortium, http://www.w3.org/TR/mobile-bp/ (dostp 2011-05-08).
Sun Microsystems, Inc. [2009], LWUIT Developers Guide. Lightweight UI
Toolkit, http://download.oracle.com/javame/dev-tools/lwuit-1.3/LWUIT_
Developer_Guide.pdf (dostp 2011-05-16).
Topley K. [2003], J2ME Almanach, Wydawnictwo Helion, Gliwice.
Tutorials and Code Camps, http://developers.sun.com/mobility/learning/tutorial/, (dostp 2011-05-23).
XHTML Mobile Profile, http://www.developershome.com/wap/xhtmlmp/ (dostp 2011-05-23).

Uniwersytet Ekonomiczny w Krakowie

5
Algorytmy

istruktury danych
Pawe Lula

Przystpujc do lektury biecego rozdziau, musimy przyj pewne definicje


kluczowych dla nas poj:
algorytm jest to sposb postpowania umoliwiajcy rozwizanie zadania
okrelonego typu, podany wpostaci zestawu kolejnych czynnoci przeznaczonych do wykonania; wykonawc algorytmu moe by czowiek lub urzdzenie
(np. komputer),
struktura danych jest to zestaw powizanych ze sob danych wraz zmechanizmami okrelajcymi sposb tworzenia, likwidowania iwykorzystania
zdefiniowanego zestawu jako caoci oraz poszczeglnych jego elementw,
program komputerowy jest to zrozumiay dla komputera sposb zapisu algorytmu iopisu struktur danych; program komputerowy zapisywany jest przy
uyciu jzykw programowania.
Kady znas mgby zdefiniowa rne oczekiwania jakie ma wstosunku do
algorytmw, ale chyba dwa znich s szczeglnie istotne:
wymg poprawnoci algorytmu, ktrego spenienie gwarantuje, e wwyniku
wykonania algorytmu uzyskamy prawidowe rezultaty albo inaczej mwic, e
uzyskane wyniki nie bd zawiera bdw;
oczekiwanie dotyczce zoonoci algorytmu, zgodnie zktrym chcielibymy,
aby realizacja algorytmu wymagaa uycia akceptowalnej przez nas iloci podstawowych zasobw komputera, tzn. czasu pracy procesora oraz pamici operacyjnej.

5.1. Zoono algorytmw


5.1.1 . Klasy zoonoci
Przystpujc do omawiania problematyki algorytmw istruktur danych,
musimy wpierw troch dokadniej przyjrze si pojciu zoonoci algorytmu orazsposobom jej okrelania. Ju wiemy, e ilo zasobw niezbdnych
do realizacji algorytmu to zoono algorytmu. Jeli rozpatrujemy algorytm
zpunktu widzenia jego zapotrzebowania na czas pracy procesora, to mamy na
myli zoono czasow algorytmu. Natomiast, gdy prbujemy okreli zapotrzebowanie algorytmu na pami operacyjn komputera, to interesuje nas zoono pamiciowa.
Stowarzyszenie Edukacja dla Przedsibiorczoci

230Metody inarzdzia programowania


Jest spraw oczywist, e zoono algorytmu jest funkcj wielkoci zadania. Znacznie mniej czasu ipamici bdzie potrzebowa algorytm rozwizujcy
ukad trzech rwna liniowych ztrzema niewiadomymi, ni algorytm rozwizujcy dziesi rwna tego typu zdziesicioma niewiadomymi. Podobnie, mniej
czasu ipamici bdziemy potrzebowali do posortowania tysica liczb znajdujcych si wwektorze, ni do wykonania tej samej operacji na wektorze omilionie elementw. Przyjmijmy, e wielko zadania jest okrelona przez pewn
liczb n. Wprzypadku sortowania liczb n bdzie okrela liczb wartoci przeznaczonych do sortowania, aprzy odwracaniu macierzy n bdzie wskazywa
na rozmiar macierzy. Okrelajc zoono algorytmu chcemy okreli, wjaki
sposb zmienia si zapotrzebowanie na czas i/lub na pami przy zmianie wielkoci zadania czyli przy zmianie wartoci n. Zaleno ta moe zosta opisana za
pomoc funkcji matematycznej. Chyba onajprostszym przypadku bdziemy mwi
wwczas, gdy zaleno pomidzy wielkoci zadania (n), azapotrzebowaniem na
czas (T) lub pami (M) bdzie wyraona za pomoc funkcji liniowej:
T = a* n
M=b*n
gdzie aib s pewnymi staymi.
Patrzc na zamieszczony powyej wzr, moemy powiedzie, e liczba jednostek czasu potrzebnych do wykonania oblicze bdzie zawsze wprost proporcjonalna do wartoci parametru okrelajcego wielko zadania, awspczynnik
proporcjonalnoci bdzie wynosi a.
Poniewa zarwno dla zoonoci czasowej, jak ipamiciowej mona przeprowadzi analogiczne rozwaania, wdalszej czci skupimy si na zoonoci
czasowej. Takim rodzajem zoonoci charakteryzuj si wszystkie te algorytmy,
ktre wymagaj jednokrotnego przejrzenia wszystkich przetwarzanych danych
(np. algorytm sumowania liczb znajdujcych si wwektorze).
Czytelnik zapewne si domyla, e algorytmy oliniowej zoonoci czasowej
nale do tych najprostszych, ktre sprawiaj najmniej problemw swoj zoonoci148. Gorzej wyglda ju sytuacja wprzypadku zoonoci kwadratowej.
Wwczas czas realizacji algorytmu wyraony jest za pomoc formuy:
Obok zoonoci liniowej wyrnia si jeszcze zoono liniowo-logarytmiczn. Mona j
wyrazi wzorem T= n*log(n) iwystpuje ona wprzypadku algorytmw, wktrych zadanie
rozmiaru n sprowadzone zostaje do dwch zada rozmiaru n/2 oraz pewnej liczby dziaa liniowych wzgldem rozmiaru n (potrzebnych do rozbicia, apotem scalenia rozwiza rozmiaru n/2 wrozwizanie rozmiaru n). Przykadem algorytmu otej zoonoci jest przedstawiony
wdalszej czci podrcznika algorytm sortowania przez czenie.

148

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 231


T = c * n2
Jeli przyjmiemy, e c rwna si jednoci, to zauwaymy, e dwukrotne zwikszenie wielkoci zadania spowoduje czterokrotne zwikszenie zapotrzebowania na
czas procesora, atrzykrotne zwikszenie n spowoduje, e czas realizacji zwikszy
si dziewiciokrotnie. Algorytmami ozoonoci kwadratowej s na przykad te,
ktre zapisujemy za pomoc dwch zagniedonych ptli for (jako przykad posuy moe sortowanie przez wybieranie lub transponowanie elementw wmacierzy kwadratowej).
Czasami zoono jest jeszcze wiksza i wyraona jest wzorem:
T = 2n
Moemy wic atwo policzy, e dla zadania owielkoci n = 2 bdziemy potrzebowa cztery jednostki czasu, za gdy n wyniesie 5, to czas oblicze wyniesie
32 jednostki. Algorytmem charakteryzujcym si tym typem zoonoci jest metoda rozwizywania amigwki wiee Hanoi, gdzie n okrela liczb krkw, ktre
naley przenie pomidzy wieami.
Ijeszcze jeden rodzaj zoonoci:
T = n!
Zalgorytmami tego typu spotkamy si wszdzie tam, gdzie przetwarza bdziemy n elementw iwtrakcie przetwarzania bdziemy musieli rozpatrzy wszystkie
permutacje tych elementw (czyli wszystkie moliwe sposoby uporzdkowania
tych elementw. Czyli dla n = 2 czas wyniesie rwnie dwie jednostki, ale dla n = 5
obliczenia bd ju trway przez 120 jednostek czasu.
Czytajc powysze rozwaania, mona si zastanawia, czy s one potrzebne
wdzisiejszych czasach, gdy komputery wyposaone s wcoraz szybsze procesory icoraz wicej pamici operacyjnej. Niech odpowiedzi na tak postawione
pytanie bdzie zestawienie zamieszczone wpracy Piotra Wrblewskiego: Algorytmy, struktury danych itechniki programowania. Pokazuje ono czas realizacji
algorytmw owymienionych powyej typach zoonoci dla zada ornej wielkoci (wielko zadania jest zdefiniowana za pomoc parametru n). Czasy te oszacowano przy zaoeniu goszcym, e komputer realizujcy badane algorytmy jest
wstanie wykona jeden milion instrukcji wcigu sekundy.

Stowarzyszenie Edukacja dla Przedsibiorczoci

232Metody inarzdzia programowania


Tabela 14. Zoono obliczeniowa algorytmw
Rodzaj
zoonoci

Czas realizacji algorytmu


n = 10

n = 20

n = 30

n = 40

n = 50

n = 60

0,00001 sek. 0,00002 sek. 0,00003 sek. 0,00004 sek. 0,00005 sek. 0,00006 sek.

n2

0,0001 sek.

0,0004 sek.

0,0009 sek.

0,0016 sek.

0,0025 sek.

0,0036 sek.

2n

0,001 sek.

1 sek.

17,9 min.

12,7 dni

35,7 lat

366 wiekw

768 wiekw

8,4 * 10
wiekw

2,6 * 10
wiekw

9,6 * 10
wiekw

2,6 * 1066
wiekw

n!

3,6 sek.

16

32

48

Zanalizy danych przedstawionych wtabeli 14 pynie bardzo wany wniosek: zoono czasowa jest bardzo wan cech kadego algorytmu. Algorytmy
ozoonoci liniowej lub kwadratowej moemy wykonywa praktycznie dla dowolnych wartoci n. Wprzypadku algorytmw oczasie wykonania opisanym za
pomoc funkcji wykadniczej lub funkcji silnia moliwe jest wycznie wykonywanie algorytmw dla niewielkich wartoci n. Izakup nowego, dwukrotnie szybszego komputera nic tu nie zmieni, bo czy ma dla nas znaczenie to, czy uruchomiony przez nas program bdzie si liczy tysic wiekw, czy tylko piset?

5.1.2. Okrelanie zoonoci obliczeniowej algorytmu


Wprzypadku wielu algorytmw czas ich realizacji jest uzaleniony od pocztkowego ukadu danych. Wyobramy sobie nastpujc sytuacj: na kolejnych
pozycjach wwektorze znajduj si liczby cakowite. Nie s one waden sposb
uporzdkowane, a ich kolejno jest cakowicie przypadkowa. Nasze zadanie
polega na sprawdzeniu, czy wwektorze znajduje si przynajmniej jedna liczba
pierwsza. Rozwamy dwie sytuacje:
1. Wwektorze znajduj si wycznie liczby parzyste rne od 2 (oczym oczywicie nie wiemy). Chcc wykona nasze zadanie bdziemy po kolei sprawdza,
czy kolejna liczba jest liczb pierwsz. Dopiero po przegldniciu wszystkich
liczb stwierdzimy, e wwektorze nie ma liczb pierwszych.
2. Na pierwszej pozycji wwektorze znajduje si liczba 13. Po stwierdzeniu tego
faktu bdziemy ju znali odpowied na postawione pytanie; analizowanie kolejnych wartoci znajdujcych si wwektorze nie jest ju potrzebne.
Czasy potrzebne na udzielenie odpowiedzi wkadym zprzypadkw bd rne. Zca pewnoci czas wsytuacji a) bdzie duszy ni wsytuacji b).

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 233


Powyej opisany problem upowania nas do zdefiniowania:
pesymistycznego czasu realizacji algorytmu awic takiego, jaki bdzie potrzebny wprzypadku wystpienia najmniej sprzyjajcego ukadu danych jest
to maksymalny czas, jaki moe by potrzebny do wykonania algorytmu;
optymistycznego czasu realizacji algorytmu to jest takiego, jaki jest wymagany wprzypadku najbardziej dogodnego pocztkowego uoenia danych
jest to najkrtszy czas, wjakim mona zrealizowa algorytm;
redniego czasu realizacji algorytmu przy czym rednia liczona jest dla czasw uzyskanych dla kadego moliwego zastawu danych.
Wpodrcznikach zzakresu algorytmiki podaje si najczciej informacje
dotyczce pesymistycznej zoonoci czasowej algorytmu. Informacja ta specyfikowana jest za pomoc notacji duego O. Mwi ona ocharakterze zalenoci
pomidzy wielkoci zadania ajego zoonoci (czasow lub pamiciow), adokadniej ogrnym ograniczeniu tej zalenoci. Mwic na przykad, e zoono
rozpatrywanego algorytmu sortowania wynosi O(n2) stwierdzamy, e rzeczywista
posta funkcji opisujcej zaleno pomidzy wielkoci zadania azoonoci
ograniczona jest od gry za pomoc funkcji kwadratowej. Trzeba pamita, e notacja duego Onie definiuje dokadnej postaci grnego ograniczenia, ale jedynie
ogln posta tej funkcji. Zatem zzapisu O(n2) wiemy, e funkcj ograniczajc
od gry rzeczywist zoono jest funkcja kwadratowa, ale nie znamy jej parametrw. Notacja duego Oma charakter asymptotyczny, co oznacza, e podane
ograniczenie grne jest spenione dla wszystkich wartoci n >= n0. Niestety, nie
znamy wartoci n0.
Podsumowujc sformuowane wpoprzednim akapicie uwagi, wiemy, e
stwierdzenie opostaci:
czas realizacji algorytmu wynosi O(g(n))

lub:
czas realizacji algorytmu jest rzdu co najwyej g(n)

lub:
algorytm jest klasy O(g(n))

oznacza, e istnieje taka staa c, e dla n n0 czas realizacji algorytmu wynosi co


najwyej cg(n).

Stowarzyszenie Edukacja dla Przedsibiorczoci

234Metody inarzdzia programowania

5.2. Rekurencja ijej zastosowania


Orekurencji mwimy wwczas, gdy przy definiowaniu pewnego pojcia odwoujemy si do niego samego. Wprogramowaniu mechanizm rekurencji wykorzystywany jest przy zapisie algorytmw.
Rekurencja wzapisie algorytmu pojawia si wwczas, gdy zpoziomu podprogramu wywoywany jest ten sam podprogram. Najprostszy program wykorzystujcy rekurencj przedstawiony jest poniej.
Wydruk 1. Program Rekurencja01
public class Rekurencja01 {
static void f() {
System.out.println("Poczatek");
f();
System.out.println("Koniec");
}
public static void main(String [] args) {
f();
}
}

Spenia on podan powyej definicj rekurencji: zpodprogramu f() wywoywany jest ten sam podprogram f().

Rys. 47. Sposb realizacji programu przedstawionego na wydruku nr 1

Niestety, prba uruchomienia programu dowodzi, e jego poprawna realizacja


nie jest moliwa.
Wtrakcie wykonania programu zauwaamy, e pocztkowo podprogram f() wywouje samego siebie, ale po pewnym czasie realizacja programu niespodziewanie
si koczy iwywietlony zostaje komunikat oprzepenieniu stosu (StackOverflowError).
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 235

Poczatek
Poczatek
Poczatek
....
Poczatek
Exception in thread "main" java.lang.StackOverflowError

Opisane powyej dowiadczenie programistyczne dowodzi, e rekurencja realizowana jako bezwarunkowe wywoanie podprogramu zwntrza tego samego
podprogramu prowadzi do bdu przepenienia stosu wystpujcego na etapie wykonania programu, atym samym rozwizanie to nie jest przydatne przy tworzeniu
oprogramowania. Kluczem do rozwizania tego problemu jest uyte wpoprzednim zdaniu sformuowanie bezwarunkowe wywoanie podprogramu czyli takie,
wktrym podprogram zawsze bdzie chcia wywoa siebie po raz kolejny. Aby
mechanizm rekurencji by przydatny, wywoanie podprogramu zwntrza jego samego musi mie charakter warunkowy, to znaczy musi zachodzi tylko wwczas,
gdy speniony jest pewien warunek logiczny. Inaczej mwic, seria kolejnych wywoa musi si zakoczy. Ten warunek logiczny, nazywany jest warunkiem zatrzymania lub warunkiem stopu.
Biorc pod uwag powysze fakty, mechanizm rekurencji wprogramowaniu
naleaoby zdefiniowa jako wywoanie podprogramu zwntrza tego samego
podprogramu realizowane a do momentu, wktrym wyraenie logiczne penice
funkcj warunku zatrzymania przyjmie warto wskazujc na potrzeb zatrzymania acucha kolejnych wywoa.
Spjrzmy na nastpujcy program:
Wydruk 2. Program Rekurencja02
public class Rekurencja02 {
static int licznik = 0;
static void f() {
licznik++;
System.out.println("Poczatek");
if (licznik <=5) f();
System.out.println("Koniec");
}
public static void main(String [] args)
f();
}
}

Sposb jego realizacji przedstawiony jest na rysunku:


Stowarzyszenie Edukacja dla Przedsibiorczoci

236 metody i narzdzia programowania

rys. 48. sposb realizacji programu przedstawionego na wydruku nr 2

Analizujc kod programu i schemat jego realizacji przedstawiony na powyszym rysunku widzimy, e z poziomu funkcji main() wywoywana jest metoda f(),
ktra z kolei wywouje swoje kolejne kopie, a do momentu, w ktrym warto
pola licznik przekroczy warto 5. Wwczas (a wic, gdy licznik > 5) kolejne wywoanie ju nie nastpi i wykona si dalsza cz metody. Po zakoczeniu jej realizacji nastpi powrt do tej kopii metody f(), z poziomu ktrej by wywoana ta,
ktra jest aktualnie realizowana. Po kolejnych powrotach powrcimy do metody
main() i po jej zrealizowaniu program zakoczy swoje dziaanie.
Program przedstawiony na wydruku 2 mia charakter czysto ilustracyjny i nie
realizowa adnych przydatnych zada. Kolejny przykad pokazuje, e rekurencja
jest przydatna w praktyce. Program przedstawiony na wydruku nr 3 pozwala obliczy warto silni.
Wydruk 3. Program Rekurencja03

public class Rekurencja03 {


static int silnia(int n) {
int pomoc;
System.out.println("Wywolanie: silnia(" + n + ")");
if ((n == 0) || (n == 1)) pomoc = 1;
else pomoc = n * silnia(n-1);
System.out.println("Zwrocenie wyniku: " + n + "! = " + pomoc);
return pomoc;
}
public static void main(String [] args) {
System.out.println("4! = " + silnia(4));
}
}

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 237


Sposb realizacji programu przedstawiony jest na poniszym rysunku (Rys. 49).

Rys. 49. Sposb realizacji programu przedstawionego na wydruku nr 3

Wmetodzie main() znajdujemy wywoanie funkcji silnia zparametrem n rwnym 4. Wtrakcie jej realizacji zmiennej pomoc nadawana jest warto rwna iloczynowi aktualnej wartoci n (czyli 4) iwartoci zwracanej przez kolejn kopi
funkcji silnia tym razem wywoan zparametrem rwnym 3. acuch kolejnych wywoa zostanie zakoczony, gdy nastpi wywoanie silnia(1). Wwczas
zwrcona zostanie warto 1! wynoszca 1 irozpocznie si seria powrotw do
wczeniejszych kopii funkcji iwkadej znich obliczana bdzie warto zmiennej
pomoc. Wkocu warto 4! zostanie przesana do funkcji main().
Bazujc na ostatnim przykadzie naley podkreli, e kada kolejna kopia
rekurencyjnie wywoywanego podprogramu posiada niezalene od pozostaych
zmienne lokalne.
Warto wtej chwili odpowiedzie sobie na pytanie: kiedy stosowa rekurencj? Chyba najprostsza odpowied jest nastpujca: rekurencj wprogramowaniu
warto stosowa wwczas, gdy opis sposobu postpowania rozwaanego problemu
ma charakter rekurencyjny. Dokadnie tak sytuacja wyglda wprzypadku wyznaStowarzyszenie Edukacja dla Przedsibiorczoci

238Metody inarzdzia programowania


czania wartoci silni. Doskonale pamitamy zzaj zmatematyki, e silnia definiowana jest wnastpujcy sposb:

Chcc upodobni sposb zapisu programu do rekurencyjnego ujcia metody


liczenia silni, zdecydowalimy si na zastosowanie rekurencji.
Innym przykadem problemu matematycznego wyraanego za pomoc definicji rekurencyjnej jest wyznaczanie liczb Fibonacciego. Liczby Fibonacciego tworz cig, wktrym pocztkowe dwa elementy wynosz zero oraz jeden, akady
nastpny jest sum dwch poprzednich. Mona to zapisa wpostaci wzoru:

Program obliczajcy n-t liczb Fibonacciego przedstawia wydruk 4.


Wydruk 4. Program Rekurencja04
public class Rekurencja04 {
static int licznik = 0;
static int fib(int n)
//obliczanie n-tej liczby Fibonacciego
{
licznik++;
if (n == 0) return 0;
else
if (n == 1) return 1;
else return fib(n-1) + fib(n-2);
}

public static void main(String [] args) {
System.out.println("5-ta liczba Fibonacciego to: " + fib(5));
System.out.println("Liczba wywolan funkcji:" + licznik);
}
}

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 239


Realizacja powyszego kodu daje nastpujce rezultaty:
5-ta liczba Fibonacciego to: 5
Liczba wywolan funkcji: 15

Za sposb realizacji programu przy wyznaczaniu pitej liczby Fibonacciego


pokazuje poniszy rysunek (Rys. 50).

Rys. 50. Sposb realizacji programu przedstawionego na wydruku nr 4

Przygldajc si rysunkowi 4 bez trudu zauwaymy, e wdrzewie ilustrujcym kolejne wywoania, pewne fragmenty si powtarzaj. Wdwch miejscach
pojawia si identyczny fragment, sucy obliczeniu trzeciej liczby Fibonacciego,
za obliczenia prowadzce do obliczenia drugiej liczby Fibonacciego wystpuj a trzy razy. Widzimy, e przy obliczaniu pitej liczby Fibonacciego funkcja
fib() zostaa wywoana a 15 razy. Program nie jest efektywny, gdy wsposb
daleki od doskonaoci wykorzystuje gwne zasoby systemu komputerowego:
czas pracy procesora oraz pami operacyjn. Jeli bymy starali si zwikszy
efektywno kodu, to ucierpiaaby na tym jego czytelno, gdy efektywna wersja nie odzwierciedlaaby ju bezporednio matematycznej definicji cigu liczb
Fibonacciego. Niestety, programy rekurencyjne do czsto nie s efektywne pod
wzgldem czasu oblicze izapotrzebowania na pami!

Stowarzyszenie Edukacja dla Przedsibiorczoci

240Metody inarzdzia programowania


Oto jeszcze jeden aspekt zwizany ze stosowaniem rekurencji. Naley zwrci
szczegln uwag na kolejno realizacji instrukcji oraz na miejsce wkodzie podprogramu, wktrym pojawia si jego rekurencyjne wywoanie. Aby skorzysta
zrekurencji naley nie tylko wywoa ten sam podprogram zwaciwymi parametrami, ale trzeba jeszcze to wywoanie umieci we waciwym miejscu! Aby
zilustrowa to zagadnienie, spjrzmy na poniszy program.
Wydruk 5. Program Rekurencja05
public class Rekurencja05 {
static void sekwencja(int n) {
System.out.print(n + " ");
if (n > 0) sekwencja(n-1);
}
public static void main(String [] args) {
sekwencja(5);
System.out.println();
}
}

Jego uruchomienie spowoduje wywietlenie sekwencji liczb:


543210

Natomiast dokonanie niewielkiej zmiany wkodzie polegajcej na odwrceniu


kolejnoci wywoania dwch instrukcji pokazano na wydruku nr 6:
Wydruk 6. Program Rekurencja06
public class Rekurencja06 {
static void sekwencja(int n) {
if (n > 0) sekwencja(n-1);
System.out.print(n + " ");
}
public static void main(String [] args)
sekwencja(5);
System.out.println();
}
}

Uruchomienie programu spowoduje, e wywietlone zostan liczby:


012345

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 241


Ju ten prosty przykad pokazuje, e kolejno instrukcji wpywa bardzo mocno na efekt dziaania programu.
Chyba wkadym podrczniku omawiajcym zagadnienia rekurencji pojawiaj
si dwa przykady: rekurencyjne obliczanie wartoci silni oraz rozwizanie amigwki onazwie wiee Hanoi. Nie ma adnych powodw, aby wnaszym przypadku byo inaczej. Spraw liczenia silni ju przedyskutowalimy, wic teraz przejdmy do wie Hanoi.
amigwka skada si ztrzech drkw (zwanych wieami), na ktre naoone s rnej wielkoci krki. Na Rys. 51 przedstawiono wersj ztrzema krkami. Wiee s oznaczone literami A, B oraz C.

Rys. 51. Wiee Hanoi

Zadanie polega na przeoeniu krkw zwiey Ana wie C, przy czym naley pamita odwch istotnych zasadach:
wjednym ruchu mona przenie tylko jeden krek,
nigdy nie mona pooy wikszego krka na mniejszym.
To zpozoru skomplikowane zadanie ma bardzo proste rozwizanie rekurencyjne.

Stowarzyszenie Edukacja dla Przedsibiorczoci

242Metody inarzdzia programowania


Wydruk 7. Program Rekurencja07
public class Rekurencja07
{
static void przesun(int ile, char wiezaZrodlowa,
char wiezaDocelowa, char wiezaPomocnicza){

if (ile == 1)

System.out.println
(wiezaZrodlowa + " => " + wiezaDocelowa);

else
{


przesun(ile-1,
wiezaZrodlowa,wiezaPomocnicza,wiezaDocelowa);

System.out.println(wiezaZrodlowa + " => "
+ wiezaDocelowa);


przesun(ile-1,
wiezaPomocnicza,wiezaDocelowa,wiezaZrodlowa);

}

}


public static void main(String [] args)
{


przesun(3,'A','C','B');

}
}

Wpowyszym kodzie metoda przesun() wyznacza sposb przesunicia krkw


(ktrych liczba okrelona jest za pomoc parametru ile) zwiey reprezentowanej
przez parametr wiezaZrodlowa na wie wiezaDocelowa, przy czym wtrakcie przenoszenia krki mona chwilowo umieszcza na wiey wiezaPomocnicza. Jeeli
liczba krkw jest rwna jednoci, to krek wdruje bezporednio zwiey rdowej na wie docelow (oczym metoda informuje poprzez wywietlenie odpowiedniego komunikatu). Wprzypadku wikszej liczby krkw przenosimy (za pomoc
rekurencyjnego wywoania tej samej metody przesun) wszystkie krki zwyjtkiem
ostatniego (najwikszego, pooonego najniej) zwiey rdowej na wie pomocnicz, nastpnie ostatni krek jest przesuwany zwiey rdowej na docelow
iwkocu krki, ktre wczeniej umiecilimy na wiey pomocniczej, przenosimy
na wie docelow (ponownie poprzez rekurencyjne wywoanie metody przesun).

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 243

5.3. Algorytmy tablicowe


Tablice nale do najpopularniejszych struktur danych. Kada tablica skada
si zelementw skadowych zwanych elementami tablicy. Dostp do elementw
odbywa si za pomoc indeksw. Tablica jest struktur jednorodn, co oznacza,
e wszystkie jej elementy skadowe s tego samego typu. Tablice rni si liczb
wymiarw. Wymiar tablicy okrela liczb indeksw stosowanych do okrelenia
pooenia jej elementw skadowych. Do najpopularniejszych typw tablic zaliczamy:
wektory bdce tablicami jednowymiarowymi, wktrych pooenie elementu jest okrelane za pomoc pojedynczego indeksu,
macierze bdce tablicami dwuwymiarowymi, wktrych pooenie elementu
jest okrelane za pomoc dwch indeksw (zwykle pierwszy znich jest interpretowany jako numer wiersza, za drugi to numer kolumny, wktrej znajduje
si rozpatrywany element).
Wdalszej czci biecego podrozdziau przedstawione zostan najpopularniejsze inajczciej wykorzystywane metody przetwarzania danych umieszczonych wtablicach. Znajomo tych algorytmw stanowi niezbdne wyposaenie
kadego programisty!

5.3.1. Inwersja elementw wwektorze


Inwersja elementw wektora polega na odwrceniu ich kolejnoci. Warto podkreli, e operacja inwersji wykonywana jest wewntrz jednego wektora, bez potrzeby wprowadzania drugiego wektora, do ktrego byyby kopiowane elementy
wodwrotnej kolejnoci (uycie drugiego wektora zwikszyoby dwukrotnie zapotrzebowanie na pami operacyjn).
Przedstawimy dwie wersje algorytmu inwersji. Pierwsza znich ma charakter
rekurencyjny.

Stowarzyszenie Edukacja dla Przedsibiorczoci

244Metody inarzdzia programowania


Wydruk 8. Inwersja rekurencyjna
public class Inwersja {
static void wyswietlWektor(int [] w) {
for(int i= 0; i< w.length; i++)
System.out.print(w[i] + " ");
System.out.println();
}
static void inwersja(int poczatek, int koniec, int [] w)
if (poczatek < koniec) {
int pomoc = w[poczatek];
w[poczatek] = w[koniec];
w[koniec] = pomoc;
inwersja(poczatek+1,koniec-1,w);
}
}
public static void main(String [] args) {
int [] tab = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
wyswietlWektor(tab);
inwersja(0,tab.length-1,tab);
wyswietlWektor(tab);
}
}

Efekt dziaania powyszego programu jest nastpujcy:


1 2 3 4 5 6 7 8 9 10 11
11 10 9 8 7 6 5 4 3 2 1

Sposb dziaania algorytmu jest niezwykle prosty: zamieniamy wartoci znajdujce si na pocztkowej ikocowej pozycji wwektorze, anastpnie za pomoc wywoywanej rekurencyjnie tej samej metody dokonujemy zamiany elementu drugiego iprzedostatniego. Wten sposb przestawiamy kolejne elementy, a
do momentu dotarcia do poowy wektora. Wwczas proces przestawiania naley
zakoczy, gdy jeli tego nie zrobimy to ponownie przestawia bdziemy
kolejne pary elementw iponownie uzyskamy pierwotne ustawienie wartoci
wwektorze. Przy okazji zwrmy uwag na jeden szczeg implementacyjny:
wjzyku Java parametry tablicowe zawsze s przekazywane przez referencj.
Oznacza to, e nie jest tworzona kopia parametru aktualnego imodyfikacja wartoci parametru formalnego wewntrz metody zawsze skutkuje zmian wartoci
parametru aktualnego. Jeli parametr byby przekazywany przez warto, to przy
kadym kolejnym wywoaniu metody inwersji byaby tworzona imodyfikowana
inna kopia przetwarzanego wektora, co zca pewnoci nie daoby poprawnego
wyniku!
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 245


Inwersj elementw wwektorze mona zapisa rwnie iteracyjnie. Fragment
odpowiedniego programu pokazano na wydruku 9.
Wydruk 9. Inwersja iteracyjna
static void inwersja(int [] tab)
// metoda modyfikuje tablice przekazana jako parametr
{
int i= 0;
int j = tab.length - 1;
int pomoc;
while (i< j)
{
pomoc = tab[i];
tab[i] = tab[j];
tab[j] = pomoc;
i++;
j--;
}
}

Idea postpowania jest tu taka sama jak wwersji rekurencyjnej. Podobna jest
chyba rwnie prostota zapisu. Majc algorytm zapisany rekurencyjnie iiteracyjnie zwykle bdziemy si decydowa na wersj iteracyjn, poniewa to ona
najprawdopodobniej bdzie realizowana szybciej ibdzie wymaga mniejszego
obszaru pamici.

5.3.2. Sito Eratostenesa


Mianem sita Eratostenesa okrelany jest algorytm pozwalajcy na wyznaczenie liczb pierwszych mniejszych lub rwnych wartoci N. Algorytm ten wymaga
utworzenia wektora skadajcego si zN-1 wartoci. Wtrakcie realizacji algorytmu realizujemy kolejno nastpujce operacje:
na kolejne pozycje wwektorze wpisujemy kolejne liczby naturalne zprzedziau od 2 do N (wprezentowanym przykadzie zaoono, e N = 20):
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

pierwsza liczba na licie jest liczb pierwsz (jest to liczba 2 zostaa ona ujta
wramk):
2 , 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Stowarzyszenie Edukacja dla Przedsibiorczoci

246Metody inarzdzia programowania


zaznaczamy wwektorze wszystkie wielokrotnoci wyznaczonej liczby pierwszej (czyli wielokrotnoci liczby 2 poniej zaznaczono je, stosujc podkrelenie):
2 , 3 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

powtarzamy przedstawione powyej operacje odczytanie kolejnej liczby


pierwszej (jest ni zawsze pierwsza niezaznaczona warto) ipodkrelenie
wszystkich wielokrotnoci a do momentu zaznaczenia wszystkich wartoci
wwektorze. Operacje te daj nastpujcy efekt:
Kolejna liczba pierwsza: 3
2 , 3 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

Kolejna liczba pierwsza: 5


2 , 3 , 4, 5 , 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

Kolejna liczba pierwsza: 7


2 , 3 , 4, 5 , 6, 7 , 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

Kolejna liczba pierwsza: 11


2 , 3 , 4, 5 , 6, 7 , 8, 9, 10, 11 , 12, 13, 14, 15, 16, 17, 18, 19, 20

Kolejna liczba pierwsza: 13


2 , 3 , 4, 5 , 6, 7 , 8, 9, 10, 11 , 12, 13 , 14, 15, 16, 17, 18, 19, 20

Kolejna liczba pierwsza: 17


2 , 3 , 4, 5 , 6, 7 , 8, 9, 10, 11 , 12, 13 , 14, 15, 16, 17 , 18, 19, 20

Kolejna liczba pierwsza: 19


2 , 3 , 4, 5 , 6, 7 , 8, 9, 10, 11 , 12, 13 , 14, 15, 16, 17 , 18, 19 , 20

Stosujc sito Eratostenesa, wyznaczylimy liczby pierwsze zprzedziau od 2 do


20. S to wartoci: 2, 3, 5, 7, 11, 13, 17 oraz 19. Niestety, opisany algorytm charakteryzuje si ograniczon przydatnoci zuwagi na konieczno umieszczenia
wpamici operacyjnej wektora oN-1 elementach. Przy poszukiwaniu duych liczb
pierwszych taki wektor si po prostu nie mieci wpamici operacyjnej komputera!
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 247

5.3.3. Sortowanie przez wybieranie


Operacja sortowania polega na uporzdkowaniu elementw ze wzgldu na ich
warto. Zwykle sortujemy liczby, ale wpodobny sposb moemy sortowa acuchy znakw bdzie to wwczas problem porzdkowania alfabetycznego. Wtrakcie
sortowania moemy dy do uzyskania uporzdkowania rosncego lub malejcego
(wprzedstawionych poniej wersjach chcemy uporzdkowa wartoci rosnco).
Algorytm sortowania przez wybieranie jest bardzo intuicyjny. Wpierwszym
kroku znajdujemy warto najmniejsz wcaym wektorze iprzenosimy j na pocztkow pozycj wwektorze (jednoczenie przenoszc warto, ktra do tej pory
bya na pierwszej pozycji, na miejsce zajmowane dotychczas przez warto minimaln). Wten sposb znamy ju warto, ktra powinna si pojawi wposortowanym wektorze na pierwszej pozycji. Nastpnie powtarzamy opisany proces, ale
wodniesieniu do fragmentu wektora od pozycji drugiej do ostatniej. Wkolejnym
kroku zajmujemy si fragmentem wektora rozpoczynajcym si od trzeciego elementu, pniej od czwartego itak postpujemy a do N-1 elementu. Wwczas
wektor jest ju posortowany wcaoci. Opisany sposb postpowania przedstawia
wydruk 10.
Wydruk 10. Sortowanie przez wybieranie
for (int i= 0; i< liczby.length - 1; i++){
k = i;
for (int j = i; j < liczby.length; j++)
if (liczby[k] > liczby[j])
k = j;
pomoc = liczby[i];
liczby[i] = liczby[k];
liczby[k] = pomoc;
}

Jest to algorytm ozoonoci O(n2).

5.3.4. Sortowanie przez wstawianie


Rwnie sortowanie przez wstawianie jest algorytmem ozoonoci O(n2).
Wtym przypadku sposb postpowania jest inny. Przetwarzany wektor zliczbami dzielimy na dwie czci: posortowan (po lewej stronie) inieposortowan
(po prawej stronie). Na pocztku granic podziau ustawiamy wtaki sposb, aby
cz posortowana skadaa si zjednego elementu (zauwamy, e wektor jednoStowarzyszenie Edukacja dla Przedsibiorczoci

248Metody inarzdzia programowania


elementowy zawsze mona uzna za posortowany). Nastpnie bierzemy pierwszy
element zczci nieposortowanej iwstawiamy go na odpowiedni pozycj do czci posortowanej. T operacj powtarzamy zkadym kolejnym elementem zczci posortowanej za kadym razem wyduamy ojeden dugo czci posortowanej ijednoczenie skracamy ojeden dugo czci nieposortowanej. Warto
jeszcze wspomnie, wjaki sposb odbywa si poszukiwanie pozycji, na ktrej ma
pojawi si wczci posortowanej przenoszony element. Wtym celu wstawiany
element (czyli ten, ktry znajdowa si jako pierwszy wczci nieposortowanej)
jest porwnywany zkolejnymi elementami (idc od prawej strony) wczci posortowanej. Jeli element wwektorze jest wikszy od wstawianego, to jest przesuwany ojedn pozycj wprawo. Napotkanie pierwszego elementu mniejszego
od wstawianego (lub osignicie pocztku wektora) jest sygnaem do wstawienia
przenoszonego elementu na biec pozycj wwektorze.
Opisany sposb postpowania przedstawiony zosta wpostaci fragmentu programu zamieszczonego na wydruku 11.
Wydruk 11. Sortowanie przez wstawianie
for (int i= 1;
pomoc
j=
while

i< liczby.length; i++){


= liczby[i];
i- 1;
((j >= 0) && (pomoc < liczby[j])) {
liczby[j+1] = liczby[j];
j--;

}
liczby[j+1] = pomoc;
}

5.3.5. Sortowanie bbelkowe


Sortowanie bbelkowe to trzeci algorytm nalecy do prostych metod sortowania. Podobnie jak poprzednie rwnie i ten charakteryzuje si zoonoci O(n2).
Na pocztku swojego dziaania algorytm sprawdza, czy dwa ostatnie elementy
wwektorze s uporzdkowane (to znaczy, czy przedostatni jest mniejszy ni ostatni) jeli nie s, to zmieniana jest ich kolejno. Po sprawdzeniu uporzdkowania
pierwszego idrugiego elementu, liczc od prawej strony, ta sama operacja wykonywana jest wzgldem elementu drugiego itrzeciego, potem wzgldem trzeciego
iczwartego (cay czas liczc od prawej strony) itak dalej, a do osignicia lewego koca wektora. Po takim przejciu przez cay wektor, na pierwszej pozycji
wwektorze (tym razem idc od lewej strony!) pojawi si element najmniejsze jest
on ju na waciwej pozycji wwektorze posortowanym. Opisan procedur porwUniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 249


nywania elementw powtarzamy. Tak jak poprzednio rozpoczynamy od prawego
koca wektora, ale koczymy po osigniciu elementu drugiego (od lewej strony).
Nie ma potrzeby przesuwa si dalej wlewo, gdy tam mamy ju element znajdujcy si na waciwej pozycji. Kolejn iteracj koczymy na trzecim elemencie od
lewej strony, nastpn na czwartym. Dziaania koczymy, gdy wykonamy ostatnie
powtrzenie, wktrym bdziemy przetwarza tylko dwa ostatnie elementy.
Wszystko to, co zostao opisane powyej, przedstawia kod na wydruku 12.
Wydruk 12. Sortowanie bbelkowe
for (int i= 1; i<liczby.length; i++){
for (j = liczby.length - 1; j >= i; j--)
if (liczby[j-1] > liczby[j]){
pomoc = liczby[j];
liczby[j] = liczby[j-1];
liczby[j-1] = pomoc;
}
}

Na koniec naley wytumaczy genez nazwy tej metody sortowania. Pono


pochodzi ona std, e po pionowym ustawieniu przetwarzanego wektora, wtrakcie sortowania s mniejsze liczby wypychane ku grze, tak jak bbelki wkieliszku szampana.

5.3.6. Sortowanie szybkie


Ju sama nazwa tej metody sugeruje, e mamy do czynienia zalgorytmem
lepszym od tych, ktre omwilimy poprzednio. Itak jest rzeczywicie. Wprzypadku omawianej metody pesymistyczna zoono obliczeniowa jest typu O(n2),
ale rednia zoono ju typu O(n*log(n)).
Algorytm zosta zaproponowany przez Charlesa Hoareana pocztku lat szedziesitych XX wieku. Wcelu uatwienia prezentacji idei postpowania przyjmijmy,
e algorytm realizowany jest przez metod quickSort onastpujcym nagwku:
void quickSort(int tab[], int first, int last)

gdzie tab jest wektorem przeznaczonym do sortowania, za first ilast s indeksami wskazujcymi na pocztkowy ikocowy element wpewnym fragmencie
wektora tab.
Stowarzyszenie Edukacja dla Przedsibiorczoci

250Metody inarzdzia programowania


Przy pierwszym wywoaniu metody quickSort wartoci first ilast wskazuj
odpowiednio na pocztkowy ikocowy element wwektorze co oznacza, e
przetwarzany bdzie przez procedur cay wektor.
Bezporednio po wywoaniu metody quickSort zfragmentu wektora ograniczonego przez indeksy first ilast wybierany jest element osiowy (ang. pivot). Wprzedstawionej tu implementacji przyjmuje si, e elementem osiowym staje si ten, ktry znajduje si wwektorze na pozycji okrelonej przez warto parametru first.
Nastpnie dokonuje si takiego przemieszczenia elementw wwektorze, aby:
na lewo od elementu osiowego znalazy si elementy mniejsze od niego,
na prawo od elementu osiowego znalazy si elementy wiksze od niego lub
jemu rwne.
Zauwamy, e fragmenty wektora pooone na lewo iprawo od elementu osiowego nie s posortowane. Wiemy jedynie, e po lewej stronie s elementy mniejsze, za po prawej nie mniejsze ni warto elementu osiowego. Gdy uda si nam
uzyska taki ukad elementw, to moemy mie pewno, e element osiowy znajduje si na waciwej pozycji wwektorze, ktra nie ulegnie ju zmianie wtrakcie
dalszego przebiegu procedury sortujcej.
Nastpnie skorzystamy zmechanizmu rekurencji iwywoamy dwukrotnie metod quickSort: za pierwszym razem dla fragmentu wektora znajdujcego si na
lewo od elementu osiowego, za za drugim razem wcelu przetworzenia fragmentu znajdujcego si na prawo od elementu osiowego. Wkadej ztych czci
zostanie wybrany lokalny element osiowy inastpi przemieszczenie elementw
wkadym ztych fragmentw wzgldem ich elementw osiowych.
Zapewne Czytelnik si ju domyla, e wkolejnych krokach bdziemy wywoywa quickSort dla coraz mniejszych fragmentw wektora tych, ktre znajduj
si na lewo iprawo od lokalnych elementw osiowych. Proces rekurencyjnych
wywoa zakoczymy, gdy dugo fragmentu wektora przekazanego do metody
quickSort za pomoc wartoci first ilast bdzie wynosi jeden lub zero. Taki fragment wektora mona zawsze uzna za posortowany!
Tym razem zamiecimy peny tekst programu sortujcego (wydruk 13).
Wydruk 13. Sortowanie szybkie

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 251

public class QuickSort{


public static void swap (int tab[], int x, int y) {
// dokonuje zamiany elementw na pozycjach x oraz y
int temp = tab[x];
tab[x] = tab[y];
tab[y] = temp;
}
public static int partition(int tab[], int first, int last) {
// wyznacza element osiowy oraz porzdkuje elementy
// wzgldem elementu osiowego
int pivot = tab[first]; // pozycja el. osiowego
int up = first;
int down = last;
do {
while ((up < last) && (pivot >= tab[up])) up++;
//idc od lewej strony zatrzymujemy si
//na pierwszym elemencie wikszym od
//elementu osiowego
while (pivot < tab[down]) down--;
//idc od prawej strony zatrzymujemy si
//na pierwszym elemencie mniejszym od
//elementu osiowego
if (up < down) swap(tab,up,down);
//zamiana wyznaczonych powyej elementw
} while (up< down);
swap(tab,first,down);
return down;
}
public static void quickSort(int tab[], int first,
int last) {
if (first >= last) return;
int pivot = partition(tab, first, last);
quickSort(tab, first, pivot-1);
quickSort(tab, pivot+1, last);
}
public static void main(String argv[])
int n = 10;

int tab[] = new int[n];


for (int i=0 ; i< n; i++)
tab[i] = (int) (100 * Math.random());
quickSort(tab, 0, n-1);
for (int i=0 ; i< n; i++)
System.out.print(tab[i] + " ");
System.out.println();
}
}
Stowarzyszenie Edukacja dla Przedsibiorczoci

252Metody inarzdzia programowania

5.3.7. Sortowanie przez czenie


Sortowanie przez czenie (ang. merge sort) jest kolejnym wydajnym ipopularnym algorytmem sucym do porzdkowania danych. Zoono obliczeniowa
tej metody to O(n * log(n)).
Tym razem zamy, e procedura sortujca ma nagwek:
void sort(int poczatek, int koniec, int [] w),

gdzie wjest sortowanym wektorem, za poczatek ikoniec wskazuj na pocztkowy ikocowy element wpewnym fragmencie tego wektora. Przy pierwszym
wywoaniu poczatek ikoniec wskazuj na pierwszy iostatni element wprzetwarzanym wektorze.
Dziaanie algorytmu mona opisa nastpujco:
podziel fragment wektora znajdujcy si pomidzy elementami wskazywanymi przez poczatek ikoniec na dwie poowy (oczywicie przy pierwszym wywoaniu dzielony jest na p cay wektor w),
oile dugoci uzyskanych powek s wiksze od jednoci, to dla kadej znich
wywoaj metod sort (tu wanie stosowana jest rekurencja oczywicie przy
realizacji metody sort dla kadej zpowek nastpi wywoanie tej samej metody dla kadej wiartki wektora; te wywoania bd powtarzane a do chwili,
gdy uzyskiwane fragmenty wektora bd miay dugo jeden lub zero co jak
wiemy, pozwala je uzna za posortowane),
pocz posortowane powki wcao proces czenia naley jednak przeprowadzi wtaki sposb, aby wwyniku czenia posortowanych powek
uzyska rwnie posortowan cao.
Zauwamy, e proces sortowania odbywa si tu tak naprawd na etapie czenia powek wcao. Operacje te bd realizowane, gdy kolejne rekurencyjne
wywoania metody sort bd koczy swoje dziaanie (wzamieszczonym poniej
kodzie realizuje to metoda scal). Wic najpierw bdziemy scala dwa fragmenty
wektora ojednostkowej lub zerowej dugoci, co pozwoli uzyska posortowany
fragment odugoci co najwyej dwa. Potem bdziemy scala takie dwuelementowe fragmenty, a potem czteroelementowe itak dalej, a wostatnim etapie
poczymy ze sob dwie posortowane powki wektora w.
Kod zamieszczony na wydruku 14 pokazuje wszystkie szczegy metody sortowania przez czenie.
Wydruk 14. Sortowanie przez czenie
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 253

public class MergeSort{


static void wyswietlWektor(int [] w){
for(int i= 0; i<w.length; i++)

System.out.print(w[i] + " ");
System.out.println();
}
static void sort(int poczatek, int koniec, int [] w){
if (poczatek >= koniec)

return;
int srodek = (poczatek + koniec) / 2;
sort(poczatek, srodek, w);
sort(srodek+1, koniec, w);
scal(poczatek, srodek, koniec, w);
}
static void scal(int poczatek, int srodek, int koniec,
int [] w) {
int pocz1 = poczatek;
int kon1 = srodek;
int pocz2 = srodek + 1;
int kon2 = koniec;

while ((pocz1 <= kon1) && (pocz2 <= kon2))
{
// czenie posortowanych powek
// wcelu uzyskania posortowanej caoci

if (w[pocz1] < w[pocz2]) pocz1++;

else {

int pomoc = w[pocz2];

for (int i= pocz2 - 1; i>= pocz1; i--)
w[i+1] = w[i];

w[pocz1] = pomoc;


pocz1++;

kon1++;

pocz2++;

}
}
}
public static void main(String [] args)
{
int [] tab = {1, 5, 3, 7, 7, 9, 2, 3, 2, 2, 3};
wyswietlWektor(tab);
sort(0,tab.length-1,tab);
wyswietlWektor(tab);
}
}
Stowarzyszenie Edukacja dla Przedsibiorczoci

254Metody inarzdzia programowania


Prezentujc metod sortowania przez czenie, zakoczylimy omawianie wybranych algorytmw tablicowanych. Wkolejnej czci opracowania zajmiemy si
dwoma algorytmami kombinatorycznymi.

5.4. Algorytmy kombinatoryczne


Kombinatoryka jest dziaem matematyki zajmujcym si problematyk tworzenia zpewnego zbioru elementw innych zbiorw wedug cile okrelanych
zasad. Wspomniane zasady mog dotyczy midzy innymi dozwolonej liczby wystpie kadego elementu wtworzonym zbiorze, ewentualnego uporzdkowania
elementw wzbiorze, liczebnoci tworzonego zbioru.

5.4.1. Kombinacje bez powtrze


Wniniejszym punkcie zajmiemy si problemem tworzenia kombinacji bez powtrze. Wpierw przypomnijmy definicj:
Niech Aoznacza zbir skadajcy si zn elementw. k-elementow kombinacj
bez powtrze (k n) elementw zbioru Anazywamy kady k-elementowy podzbir zbioru A.

Pewnie pamitamy rwnie zzaj zmatematyki, e liczba k-elementowych


kombinacji bez powtrze n elementw dana jest wzorem:

n
n!
=
k k !(n - k )!
Wyposaeni wt wiedz sprbujmy zaprojektowa algorytm, ktry pozwoli na
rozwizanie nastpujcego zadania:
Napisa program wywietlajcy wszystkie k-elementowe kombinacje bez powtrze elementw zbioru obejmujcego liczby naturalne od 1 do n (przyjmij, e
wartoci n oraz k podawane bd przez uytkownika wtrakcie dziaania programu).

Jeli na przykad uytkownik okreli wartoci parametrw wnastpujcy sposb:


n = 4,
k = 3.
to program powinien wyznaczy cztery kombinacje:
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 255

1,
1,
1,
2,

2,
2,
3,
3,

3
4
4
4

Algorytm wyznaczajcy kolejne kombinacje dziaa bdzie wedug nastpujcych zasad:


1. Elementy wchodzce wskad kadej kombinacji wywietlane bd wkolejnoci rosncej dziki czemu moemy okreli wartoci maksymalne, ktre
mog si pojawi na kolejnych pozycjach: na pozycji k bdzie to warto n, na
pozycji k-1 bdzie to n-1 itd.
2. Kolejne kombinacje prezentowane s wporzdku leksykograficznym (tzw.
uporzdkowanie sownikowe) jeeli bymy przyjli, e liczby wchodzce
wskad danej kombinacji s kodami znakw, to utworzone wten sposb sowa
uporzdkowane byyby alfabetycznie. Czyli pierwsza kombinacja (dla n = 4 ik
= 3) ma posta: 1, 2, 3.
3. Przy generowaniu kadej nastpnej kombinacji realizowane s nastpujce
kroki:
- indeks = k (numer rozpatrywanego elementu wkombinacji);
- max = n (warto maksymalna na pozycji indeks);
- analizuj kolejne elementy znajdujce si wwektorze zawierajcym biec kombinacj (idc od prawej jego strony, zmniejszajc przy przejciu do kolejnego elementu wartoci indeks imax), wcelu znalezienia
pierwszej (od prawej strony!) pozycji, na ktrej mona umieci warto
wiksz od tej, ktra tam si dotychczas znajdowaa; po znalezieniu takiej
wartoci indeks wskazuje jej pooenie;
- zwikszam warto znajdujc si na pozycji indeks ojeden;
- na kolejne pozycje (czyli od pozycji indeks+1 do k) wpisuj kolejne liczby (na pozycji indeks+1 umieszczona zostanie warto ojeden wiksza
od wartoci znajdujcej si na pozycji indeks, na pozycji indeks+2 znajdzie si warto ojeden wiksza od wartoci znajdujcej si na pozycji
indeks+1 itd.);
- utworzona wten sposb kombinacja jest wywietlana.

Stowarzyszenie Edukacja dla Przedsibiorczoci

256Metody inarzdzia programowania

5.4.2. Permutacje bez powtrze


Podobnie jak wpoprzednim punkcie rozpocznijmy od definicji:
Niech Aoznacza zbir skadajcy si zn elementw. Permutacj bez powtrze
elementw zbioru Anazywamy kady cig n-elementowy (a1, a2, ..., an), skadajcy si zrnych elementw zbioru A. Ilo permutacji bez powtrze elementw
zbioru Awynosi n!.

Naszym celem jest przedstawienie algorytmu pozwalajcego na realizacj zadania programistycznego:


Napisz program wywietlajcy wszystkie permutacje elementw zbioru
liczb cakowitych obejmujcego kolejne wartoci od 1 do n (warto n ma
by podawana wtrakcie dziaania programu).
Jeli wic uytkownik okreli, e:
n=3
to liczba wyznaczanych permutacji wynosi: 3! = 6.
Za nasz programpowinien wywietli:
1,
1,
2,
2,
3,
3,

2,
3,
1,
3,
1,
2,

3
2
3
1
2
1

Edsger Dijkstra zaproponowa algorytm wyznaczania permutacji dziaajcy


zgodnie znastpujcymi zasadami:
kolejne permutacje wywietlane bd wporzdku leksykograficznym,
pierwsza permutacja ma posta: 1, 2, ... n,
zakada si, e elementy tworzce permutacj przechowywane s wwektorze
aindeksowanym wartociami od 1 do n,
przy generowaniu kadej nastpnej permutacji realizowane s nastpujce kroki:
- na podstawie biecej permutacji wyznaczana jest warto i, ktra jest
maksymaln wartoci indeksu, dla ktrej speniony jest warunek:
a[i]<a[i+1]

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 257


Przykad:
dla a= [1 4 6 2 9 5 8 7 3] poszukiwana warto iwynosi 6

fragment wektora aod pozycji i+1 do koca nazywany jest ogonem.


- poszukujemy wartoci j (przy czym j spenia musi warunek: i+1 j n,
czyli jest indeksem elementu znajdujcego si wogonie wektora a), dla
ktrej a[j] jest najmniejsz wartoci speniajc warunek a[j] > a[i]
Przykad:
dla wektora zdefiniowanego powyej j jest rwne 8

- dokonujemy zamiany elementw znajdujcych si na pozycji ioraz j


Przykad:
wpowyszym przypadku uzyskujemy: a= [1 4 6 2 9 7 8 5 3]

- odwracamy kolejno elementw znajdujcych si wogonie wektora a


Przykad:
wpowyszym przypadku uzyskujemy: a= [1 4 6 2 9 7 3 5 8]

5.5. Struktury dynamiczne


Struktury dynamiczne s tworzone, likwidowane imodyfikowane przez
umieszczenie przez programist odpowiednich instrukcji wkodzie programu.
To programista jest odpowiedzialny za przydzielenie im odpowiedniego obszaru
pamici wchwili ich tworzenia (np. stosujc operator new). Programista ma te
wpyw na moment ich likwidacji, atym samym odzyskania zajmowanej przez nie
pamici. Struktury dynamiczne mog si zmienia wtrakcie dziaania programu
(jeli si zwikszaj, to zajmuj coraz wiksze obszary pamici; jeli s redukowane, to zajmowany przez nie obszar pamici powinien si zmniejsza).
Do najpopularniejszych struktur dynamicznych naley:
kolekcja grupa obiektw (obiekty mog si powtarza, wkolekcji mog wystpi identyczne obiekty),
zbir grupa elementw (obiekty wchodzce wskad zbioru nie mog si powtarza),
zbir posortowany jest to zbir, ale kolejno umieszczonyh w nim elementw jest okrelona, moliwe jest pobranie nastpnego lub poprzedniego eleStowarzyszenie Edukacja dla Przedsibiorczoci

258Metody inarzdzia programowania


mentu zbioru (np. uporzdkowany alfabetycznie zbir liter lub zbir acuchw znakw),
lista kolekcja, wktrej elementy mog si powtarza, elementy listy s uporzdkowane; dostp do nich jest rwnie moliwy poprzez indeks (rodzaje
struktur listowych to: stos, kolejka, lista jednokierunkowa, lista dwukierunkowa, lista cykliczna),
tablica asocjacyjna zbir par (klucz, warto); dostp do elementu jest moliwy po podaniu klucza,
posortowana tablica asocjacyjna tablica asocjacyjna zawierajca elementy
uporzdkowane wedug klucza,
drzewa zbir wzw pozostajcych wzalenoci hierarchicznej, wktrym
jeden wze jest wyrniony (jest to korze drzewa),
grafy zbir wzw powizanych za pomoc krawdzi.

5.5.1. Zbiory iich implementacja


Struktury zbiorowe s odpowiednikiem zbiorw znanych zmatematyki inie
maj nic wsplnego zplikami dyskowymi.
Wjzyku Java zbiory s zdefiniowane wpostaci interfejsu Set. Dokadne przestudiowanie dokumentacji jzyka pozwoli nam si zapozna ze wszystkimi operacjami moliwymi do wykonania na zbiorach (niestety, zuwagi na ograniczon
objto tego podrcznika, nie jestemy wstanie dokadniej omwi wszystkich
tych instrukcji). Jedynie przedstawimy sposb realizacji podstawowych operacji,
anastpnie skupimy nasz uwag na problemie przechowywania elementw zbiorw wpamici operacyjnej.
Wspomniany wpoprzednim akapicie interfejs Set specyfikuje jedynie nagwki metod przeznaczonych do dziaa na zbiorach. Ich implementacja musi
si znale wklasie implementujcej ten interfejs. Jedn ztakich klas dostpnych
wstandardowej bibliotece jzyka Java jest klasa HashMap, za pomoc ktrej
mona tworzy ju zbiory. Program zamieszczony na wydruku 15 pokazuje sposb operowania na prostym zbiorze elementw typu acuch znakw.

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 259


Wydruk 15. Przykadowy zbir HashMap
Wynik dziaania programu bdzie nastpujcy:

import java.util.*;
public class PrzykladZbioru {
public static void main(String args[]) {
Set<String> set = new HashSet<String>();
set.add("Wiosna");
set.add("Lato");
set.add("Jesien");
set.add("Zima");
set.add("Zima");
//oczywicie dodanie identycznego
//elementu do zbioru nie zostanie
//zrealizowane!
set.add("Zima");
set.add("Zima");
System.out.println(set);
set.remove("Lato");
System.out.println(set);
}
}

Teraz sprbujemy odpowiedzie na pytanie dotyczce sposobu reprezentacji


zbioru reprezentowanego przez obiekt typu HashSet.
[Jesien, Wiosna, Zima, Lato]
[Jesien, Wiosna, Zima]

Do przechowywania elementw zbioru typu HashSet wykorzystywana jest


struktura danych nazywana tablic zhaszowaniem. Do podstawowej cechy tej
struktury naley zaliczy:
moliwo szybkiego dostpu do jej elementw skadowych,
efektywne zarzdzanie pamici operacyjn.
Wtablicy zhaszowaniem mog by przechowywane obiekty (wnaszym przypadku elementy zbioru), dla ktrych mona wyznaczy warto klucza:
ktry jest liczb cakowit,
ktrego warto klucza jest uzaleniona od wartoci przechowywanych
wobiekcie,
przy definiowaniu ktrego spenione s nastpujce warunki:
Stowarzyszenie Edukacja dla Przedsibiorczoci

260Metody inarzdzia programowania


- dwa identyczne obiekty (ze wzgldu na metod equals, czyli tego samego typu iprzechowujce takie same wartoci maj identyczne wartoci
kluczy),
- dwa rne obiekty mog posiada identyczne lub rne wartoci kluczy
(zaleca si, aby byy one rne).
Wjzyku Java do wyznaczenia wartoci klucza suy funkcja zklasy Object:
public int hashCode()

Funkcja hashCode jest dziedziczona przez wszystkie inne klasy. Oczywicie


moe azwykle powinna by redefiniowana. Wspomniana konieczno redefinicji funkcji hashCode wynika znastpujcego faktu: jej definicja wklasie Object
zwraca informacj opooeniu obiektu (adres obiektu przeksztacony do wartoci
typu int), ato powoduje, e nie jest speniony warunek goszcy, e identyczne
obiekty (wsensie metody equals) posiadaj identyczne kody. Jeli obiekty maj
by przechowywane wzbiorze typu HashSet, to musz mie poprawnie zdefiniowan funkcj hashCode.
Prosty program przedstawiony na wydruku 16 pokazuje wjaki sposb mona
wywietli warto klucza haszujcego dla obiektu typu String (wklasie String
odziedziczona po klasie Object funkcja hashCode zostaa zredefiniowana)
Wydruk 16. Wywietlenie wartoci klucza haszujcego
class Test {
public static void main(String [] args) {
String s = "Java";
System.out.println(s.hashCode());
}
}

Uruchomienie powyszego programu wywietla liczb:


2301506

Klucz dla konkretnego acucha znakw wyznaczany jest przy uwzgldnieniu


kodw znakw wchodzcych wskad acucha. Dokadna formua podana jest
wdokumentacji jzyka Java.
Tablica zhaszowaniem przedstawiona jest na poniszym rysunku (Rys. 52).

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 261

Rys. 52. Tablica zhaszowaniem

Jej podstawowym elementem jest wektor wskanikw na listy elementw. Wektor ten posiada n elementw (warto n jest oczywicie ustalona dla konkretnej tablicy). Elementy skadowe tablicy przechowywane s jako elementy skadowe list.
Wchwili dodawania nowego elementu do tablicy realizowane s nastpujce
operacje:
dla dodawanego elementu wyznaczana jest warto klucza haszujcego (poprzez wywoanie funkcji hashCode),
wyznaczany jest numer listy, do ktrej doczony zostanie obiekt; zadanie to
jest realizowane poprzez wyznaczenie reszty zdzielenia wartoci klucza haszujcego dla obiektu iliczby elementw wwektorze (czyli: hashCode % n)
warto tu zauway, e listy (atym samym elementy wwektorze) powinny
by numerowane od zera,
obiekt zostaje doczony na koniec wyznaczonej listy.
Natomiast wcelu sprawdzenia, czy dany element znajduje si wzbiorze, wykonywane s nastpujce czynnoci:
dla rozpatrywanego elementu wyznaczana jest warto klucza haszujcego,
wyznaczany jest numer listy, na ktrej powinien znajdowa si element (wtaki
sam sposb jak przy dodawaniu elementu),
Stowarzyszenie Edukacja dla Przedsibiorczoci

262Metody inarzdzia programowania


zidentyfikowana lista przegldana jest wsposb sekwencyjny iwtrakcie tej
operacji poszukiwany jest element identyczny zrozpatrywanym, aodnalezienie elementu na licie jest rwnoznaczne ze stwierdzeniem, e dany element
jest elementem zbioru.
Klasy, ktre wchodz wskad standardowej biblioteki jzyka Java, s przygotowane do tego, aby na ich podstawie tworzy obiekty przeznaczone do przechowywania wzbiorach typu HashSet. Natomiast szczegln uwag powici
musimy obiektom tworzonym na podstawie naszych wasnych klas. Zwykle nie s
one automatycznie przygotowane do poprawnego funkcjonowania jako elementy
zbioru HashSet. Ilustruje to poniszy program (wydruk 17).
Wydruk 17. Przykad nieprawidowego dziaania zbioru HashSet
import java.util.*;
class Lancuch{
String s;
Lancuch(String s){

this.s = s;
}
public String toString(){

return s;
}
}
public class Test{
public static void main(String args[]) {
Set<Lancuch> set = new HashSet<Lancuch>();
set.add(new Lancuch("Szczecin"));
set.add(new Lancuch("Olsztyn"));
set.add(new Lancuch("Opole"));
set.add(new Lancuch("Katowice"));
set.add(new Lancuch("Katowice"));
System.out.println(set);
}
}

Efekt dziaania programu jest nastpujcy:


[Olsztyn, Szczecin, Katowice, Opole, Katowice]

Jest to oczywicie wynik bdny, gdy wzbiorze nie mog dwa razy wystpi
identyczne elementy. To bdne dziaanie wynika zdwch powodw:
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 263


obiekty klasy Lancuch nie posiadaj prawidowo zdefiniowanej funkcji
hashCode zagadnienie to zostao ju wczeniej omwione,
klasa Lancuch odziedziczya po klasie Object funkcj equals, ktra nie dziaa
prawidowo zpunktu widzenia zasad funkcjonowania tablicy zhaszowaniem.
Nagwek funkcji equals jest nastpujcy:
public boolean equals(Objectobj)

Jej implementacja zawarta wklasie Object sprawdza, czy referencja do biecego obiektu jest rwna referencji do obiektu reprezentowanego przez parametr
(czyli, czy te dwa obiektu zajmuj to samo miejsce wpamici). Wic tak naprawd funkcja ta nie sprawdza, czy dwa obiekty s identyczne, lecz tylko, czy znajduj si wtym samym miejscu wpamici operacyjnej.
Aby obiekt utworzony na podstawie zdefiniowanej klasy mg by przechowywany wzbiorze HashSet, musi mie we waciwy sposb zredefiniowan funkcj hashCode oraz funkcj equals. Program po odpowiednich modyfikacjach zamieszczony zosta na wydruku 18.
Wydruk 18. Modyfikacja funkcji hashCode iequals

class Lancuch {
String s;
Lancuch(String s) {
this.s = s;
}
public String toString() {
return s;
}
public boolean equals(Object obj) {
if (!(obj instanceof Lancuch))

return false;
if (((Lancuch) obj).s.equals(s))

return true;
else

return false;
}
public int hashCode() {
return s.hashCode();
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

264Metody inarzdzia programowania


Efekt dziaania programu teraz jest ju poprawny:
[Szczecin, Katowice, Opole, Olsztyn]

Interesujc odmian zbiorw s zbiory posortowane. Tego typu struktury posiadaj wszystkie cechy zbiorw, ale dodatkowo elementy wchodzce wich skad s
uporzdkowane wokrelony sposb. Zbiory posortowane s reprezentowane wjzyku Java za pomoc interfejsu SortedSet. Przegldajc zdefiniowane wnim funkcje, moliwe jest wyznaczenie pierwszego lub ostatniego elementu zbioru, mona
zdefiniowa elementy poprzedni inastpny oraz moliwe jest okrelenie podzbioru
elementw poprzez wyspecyfikowanie pierwszego iostatniego jego elementu.
Sposb porzdkowania elementw wchodzcych wskad tego typu zbioru jest
okrelony za pomoc nastpujcych dwch regu:
jeli wzbiorze umieszczone s elementy opisane za pomoc klasy, ktra implementuje interfejs Comparable, to domylny sposb uszeregowania elementw zdefiniowany jest za pomoc funkcji compareTo pochodzcej ze wspomnianego interfejsu,
jeli domylny sposb porzdkowania nie jest dla nas dogodny lub klasa definiujca elementy zbioru nie implementuje interfejsu Comparable, to sposb
porzdkowania okrelany jest za pomoc obiektu dostarczonej przez programist klasy implementujcej interfejs Comparator.
Interfejs SortedSet implementowany jest przez klas TreeSet. Przykadowy
program wykorzystujcy zbiory uporzdkowane pokazano na wydruku 19.
Wydruk 19. Wykorzystanie zbioru uporzdkowanego
public class PrzykladZbioru
{
public static void main(String args[])
{
Set<String> set = new TreeSet<String>();
set.add("Wiosna");
set.add("Lato");
set.add("Jesien");
set.add("Zima");
System.out.println(set);
}
}

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 265


Efekt dziaania programu jest nastpujcy:
[Jesien, Lato, Wiosna, Zima]

Widzimy, e elementy zbioru (ktrymi s acuchy znakw typu String) zostay uporzdkowane alfabetycznie. Taki sposb dziaania jest zgodny zsytuacj
opisan wpierwszej regule: klasa String implementuje interfejs Comparable iposiada zdefiniowan wtym interfejsie metod:
public int compareTo(element: Object)

ktra porwnuje biecy obiekt zobiektem reprezentowanym za pomoc parametru element izwraca:
warto ujemn, jeli biecy obiekt jest mniejszy,
zero, jeli s rwne,
warto dodatni, jeli biecy obiekt jest wikszy.
Wklasie String przy porwnywaniu bierze si pod uwag uporzdkowanie alfabetyczne. Ztego powodu elementy wzbiorze zostay uporzdkowane zgodnie
zalfabetem.
Jeli elementami zbioru maj by obiekty, ktre nie implementuj interfejsu
Comparable, to sposb ich porwnania dokonywany jest za pomoc metody compare interfejsu Comparator.
public int compare(element1: Object, element2: Object)

Metoda ta powinna zwraca warto ujemn, zero lub warto dodatni, jeli
odpowiednio obiekt element1 jest mniejszy, rwny lub wikszy od obiektu element2.
Odpowiedni przykad zamieszczony zosta na wydruku 20. Celem zdefiniowanego komparatora jest uszeregowanie elementw wchodzcych wskad zbioru
wedug ich dugoci.

Stowarzyszenie Edukacja dla Przedsibiorczoci

266Metody inarzdzia programowania


Wydruk 20. Wykorzystanie zbioru uporzdkowanego wedug dugoci

class PorownajDlugosciTekstow implements Comparator {


public int compare(Object element1, Object element2) {
int dlugosc1 = ((String) element1).length();
int dlugosc2 = ((String) element2).length();
return dlugosc1 - dlugosc2;
}
}
public class Porownania {
public static void main(String [] args) {
PorownajDlugosciTekstow p = new
PorownajDlugosciTekstow();
TreeSet<String> zbior = new TreeSet<String>(p);
zbior.add("Andrzej");
zbior.add("Basia");
zbior.add("Jan");
zbior.add("Boleslaw");
System.out.println(zbior);
}
}

Wynik dziaania programu przedstawia si nastpujco:


[Jan, Basia, Andrzej, Boleslaw]

Zbiory typu TreeSet przechowywane s wpostaci drzewa poszukiwa binarnych. Elementy zbioru przechowywane s jako wzy drzewa. Drzewo poszukiwa binarnych posiada bardzo wane cechy:
jego wzy maj co najwyej dwa elementy potomne, zktrych jeden znajduje
si po lewej, adrugi po prawej stronie elementu nadrzdnego rodzicielskiego
(jest to cecha wszystkich drzew binarnych),
warto znajdujca si wlewym elemencie potomnym nigdy nie jest wiksza
od wartoci przechowywanej welemencie rodzicielskim,
warto znajdujca si wprawym elemencie potomnym nigdy nie jest mniejsza od wartoci przechowywanej welemencie rodzicielskim.
Przykadowe drzewo poszukiwa binarnych znajduje si na poniszym rysunku.
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 267

Rys. 53. Przykadowe drzewo poszukiwa binarnych

Elementy zbioru typu TreeSet s przechowywane jako elementy drzewa poszukiwa binarnych. Dziki czemu wbardzo szybki iwygodny sposb mona wskaza elementy najmniejsze oraz najwiksze wzbiorze, sprawdzi czy poszukiwany
element wchodzi wskad zbioru lub wywietli elementy wsposb uporzdkowany. Dokadny sposb realizacji tych zada omwiony zostanie wpunkcie powiconym drzewom.

5.5.2. Struktury listowe


Lista to kolekcja uporzdkowanych elementw. Sowo kolekcja wystpujce
wpoprzednim zdaniu wskazuje, e na licie mog wielokrotnie wystpi identyczne elementy. Za okrelenie uporzdkowane elementy wskazuje, e skadniki
listy wystpuj wpewnym porzdku, awic dla kadego elementu mona wskaza element poprzedni oraz nastpny (oczywicie wyjtkiem jest element pierwszy, ktry nie ma elementu poprzedzajcego oraz element ostatni, dla ktrego nie
mona wskaza elementu nastpnego). Czsto (aczkolwiek nie zawsze) elementy
listy s rwnie ponumerowane wzalenoci od implementacji numeracja moe
rozpoczyna si od zera lub od jedynki. Nie zapominajmy rwnie, e lista jest
struktur dynamiczn, co oznacza, e wtrakcie dziaania programu liczba jej elementw moe si zmienia co oczywicie powoduje zmian wielkoci obszaru
pamici zajmowanego przez list.
Ze wzgldu na moliwe sposoby poruszania si po elementach listy wyrnia
si zwykle:
Stowarzyszenie Edukacja dla Przedsibiorczoci

268Metody inarzdzia programowania


listy jednokierunkowe, wktrych istnieje moliwo przejcia do nastpnego
elementu, natomiast nie mona przej do elementu poprzedniego,
listy dwukierunkowe, skonstruowane wten sposb, e moliwe jest przejcie
do elementu nastpnego oraz do elementu poprzedniego (oczywicie zwyjtkiem elementw skrajnych),
listy cykliczne, wktrych element ostatni jest powizany zpierwszym wtaki
sposb, e nastpnikiem elementu ostatniego jest element pierwszy, za poprzednikiem pierwszego bdzie element ostatni.
Listy s dostpne wwielu jzykach programowania. S na przykad podstawow struktur danych wjzyku Perl. S rwnie dostpne wjzyku Java, gdzie
s reprezentowane przez interfejs List (aby efektywnie korzysta ze struktur listowych warto zaznajomi si zjego opisem wdokumentacji!).
Podobnie jak wprzypadku zbiorw, rwnie teraz skupimy si na zagadnieniu
sposobu przechowywania list wpamici komputera iwynikajcych ztego faktu
konsekwencji.
Mona wskaza dwa zupenie odmienne sposoby przechowywania list:
1. Przechowywanie listy wwektorze; jest to rozwizanie stosunkowo proste
wrealizacji, pozwalajce na szybki dostp do elementw listy, ale niestety
posiadajce istotn wad: wektor jest struktur ocile okrelonej liczbie elementw, co powoduje, e zastosowanie zbyt maego wektora nie pozwoli na
przechowywanie wszystkich elementw listy, za zastosowanie zbyt duego
powoduje, e pami komputera nie jest optymalnie wykorzystana.
2. Niezalene przydzielanie pamici dla kadego tworzonego elementu listy ijej
zwalnianie wchwili likwidacji elementw; przy takim rozwizaniu niezbdne
jest zapamitywanie dla kadego elementu wskanika do kolejnego elementu
(czasami rwnie do nastpnego). Takie rozwizanie gwarantuje, e pami
operacyjna komputera bdzie wykorzystana optymalnie. Trzeba jednak pamita, e poprawna implementacja tego typu listy nie jest trywialnym zadaniem
programistycznym. Rwnie szybko wykonywania operacji na tego typu licie nie jest dua. Wynika to z faktu, e elementy listy mog by przetwarzane
wycznie wsposb sekwencyjny.
Oba opisane powyej rozwizania znajdujemy wjzyku Java, gdzie wstandardowej bibliotece mamy dwie klasy implementujce interfejs List. S to:
ArrayList implementacja interfejsu List jako wektora; chcc jednake wyeliminowa podstawow wad tego podejcia (sztywno okrelony maksymalny
rozmiar listy) twrcy jzyka Java zastosowali wektor ozmieniajcej si wielkoci,

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 269


LinkedList implementacja interfejsu List jako klasycznej struktury listowej
zoonej zelementw powizanych wskanikami.
Jak ju wspomniano powyej ArrayList przechowuje elementy listy wwektorze. Gdy elementy listy wypeni cay wektor, to wwczas tworzony jest drugi
wektor (posiadajcy opoow wicej elementw ni pierwotny) ido niego kopiowane s elementy zwektora pierwotnego (Rys. 54). Rozwizanie to pozwala na
dalsze powikszanie si listy. Oczywicie operacja tworzenia nowego wektora,
kopiowania do niego zawartoci wektora pierwotnego iusuwanie zpamici wektora pierwotnego nie jest widoczna dla uytkownika klasy ArrayList.

Rys. 54. Powikszanie obszaru zajmowanego przez list wklasie ArrayList

Wykonanie opisanej powyej operacji powikszenia listy wymaga zaangaowania dodatkowego czasu ipamici.
Analizujc charakterystyk klasy ArrayList, mona sformuowa zalecenie
mwice, e tego typu rozwizanie jest szczeglnie przydatne wwczas, gdy
wnaszym programie zachodzi potrzeba czstego odwoywania si do elementw
listy za pomoc ich indeksw, natomiast stosunkowo rzadko wykonywane s operacje zmieniajce wielko listy.
Zamieszczony poniej program (wydruk 21) pokazuje wjaki sposb korzysta
si zlisty typu ArrayList. Wystpujcy wtym programie ListIterator jest mechanizmem pozwalajcym na sprawdzenie, czy istnieje kolejny lub poprzedni element
listy iewentualne przejcie do ktrego znich. Dokadny opis iteratora listowego
dostpny jest oczywicie wdokumentacji jzyka Java.

Stowarzyszenie Edukacja dla Przedsibiorczoci

270Metody inarzdzia programowania


Wydruk 21. Wykorzystanie listy typu ArrayList

import java.util.*;
public class Wektor {
public static void main(String[] args) {
ArrayList<Integer> w= new ArrayList<Integer>(5);

for (int i= 1; i<= 10; i++)
w.add(new Integer(i));

//wyswietlenie wektora
System.out.println("Wektor: " + w);
//korzystanie zListIteratora
ListIterator iter = w.listIterator(0);

while (iter.hasNext())
if (((Integer) iter.next()).intValue() % 2 != 0)

iter.remove();

//wyswietlenie wektora
System.out.println("Wektor: " + w);
}
}

Wjzyku Java rwnie dostpna jest implementacja listy wykorzystujca


wskaniki. To rozwizanie zostao wykorzystane wklasie LinkedList bdcej
klasyczn list dwukierunkow (Rys. 55).

Rys. 55. Konstrukcja listy typu LinkedList

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 271


Stosowanie listy typu LinkedList jest zalecane wtedy, gdy:
rzadko zachodzi potrzeba odwoywania si do elementw listy za pomoc indeksw,
czsto zachodzi potrzeba dodawania iusuwania elementw znajdujcych si
na licie.
Na wydruku 22 przedstawiono przykadowy program pokazujcy sposb korzystania zlisty typu LinkedList. Wprogramie tym tworzona jest lista liczb cakowitych, anastpnie te elementy, ktre s liczbami pierwszymi, otaczane s nawiasami klamrowymi.
Wydruk 22. Wykorzystanie listy typu LinkedList
import java.util.*;
public class LiczbyPierwsze {
static boolean czyPierwsza(int liczba) {
for (int i= 2; i<= Math.min(
(int) Math.sqrt(liczba) + 1,liczba-1); i++)
if (liczba % i== 0)

return false;
return true;
}
public static void main(String[] args) {
LinkedList<Integer> lista = new LinkedList<Integer>();
for (int i= 1; i<= 20; i++)
lista.add(new Integer(i));
System.out.println("Lista: " + lista);
ListIterator iter = lista.listIterator();
Integer element;
while (iter.hasNext())
if (czyPierwsza((element = (Integer)

iter.next()).intValue()))

iter.set("{" + element.intValue() + "}");
System.out.println("Lista: " + lista);
iter = lista.listIterator();
while (iter.hasNext())
if (!(iter.next() instanceof String))

iter.remove();
System.out.println("Lista: " + lista);
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

272Metody inarzdzia programowania


Efekt dziaania programu jest nastpujcy:
Lista: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Lista: [{1}, {2}, {3}, 4, {5}, 6, {7}, 8, 9, 10, {11}, 12, {13}, 14, 15, 16, {17},
18, {19}, 20]
Lista: [{1}, {2}, {3}, {5}, {7}, {11}, {13}, {17}, {19}]

Omawiajc struktury listowe, nie mona pomin dwch do specyficznych,


ale bardzo czsto stosowanych wpraktyce, rozwiza. Tymi szczeglnymi strukturami listowymi jest stos oraz kolejka. Ju teraz zapamitajmy, e oba te rozwizania s zaimplementowane wklasie LinkedList.
Stos przedstawiony zosta na poniszym rysunku (Rys. 56).

Rys. 56. Struktura stosu

Stos jest list, do ktrej mamy dostp tylko wjednym punkcie zwanym
wierzchokiem stosu. Tylko wtym miejscu moemy doda element (jest to operacja umieszczania na stosie). Rwnie chcc usun element ze stosu, mamy do
ograniczone moliwoci wyboru, gdy mona usun tylko ten element, ktry jest
na stosie. Przegldajc elementy znajdujce si na stosie, rwnie rozpoczynamy
od wierzchoka iprzechodzimy do kolejnych poruszajc si wkierunku podstawy stosu.
Program zamieszczony na wydruku 23 pokazuje, wjaki sposb wykonuje si
podstawowe operacje na stosie.

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 273


Wydruk 23. Obsuga stosu
import java.util.*;
public class TablicaAsocjacyjna
{
public static void main(String [] args)
{
Map<Integer, String> asoc = new HashMap<Integer, String>();

// dodawanie par: klucz - warto

asoc.put(new Integer(1),"Jeden");
asoc.put(new Integer(2),"Dwa");
asoc.put(new Integer(3),"Trzy");

asoc.put(new Integer(4),"Cztery");

asoc.put(new Integer(5),"Piec");


System.out.println("Tablica asocjacyjna: " + asoc);
System.out.println("czy jest klucz '44' - " + asoc.containsKey(new Integer(44)));
System.out.println("czy jest klucz '1' - " + asoc.containsKey(new Integer(1)));

System.out.println("element okluczu '44': " + asoc.get(new Integer(44)));
System.out.println("element okluczu '1': " + asoc.get(new Integer(1)));

System.out.println("czy jest wartosc 'Dwa': " + asoc.containsValue("Dwa"));
System.out.println("czy jest wartosc 'Siedem': " + asoc.containsValue("Siedem"));
Set zawartosc = asoc.entrySet();
Iterator iter = zawartosc.iterator();
Map.Entry element;
System.out.println("\nZawartosc tablicy asocjacyjnej\n");

while(iter.hasNext())
{

element = (Map.Entry) iter.next();

System.out.print("klucz=" + element.getKey());

System.out.println(" wartosc=" + element.getValue());
}
}
}

Efekt dziaania programu pokazano poniej:

Stowarzyszenie Edukacja dla Przedsibiorczoci

274Metody inarzdzia programowania

Na wierzcholku stosu znajduje sie: Sroda


Elementy: [Sroda, Wtorek, Poniedzialek]
Pobieranie elementow ze stosu
Pobrany element to: Sroda
Zawartosc stosu: [Wtorek, Poniedzialek]
Pobrany element to: Wtorek
Zawartosc stosu: [Poniedzialek]
Pobrany element to: Poniedzialek
Zawartosc stosu: []

Rys. 57 przedstawia kolejk.

pocztek

koniec

kolejki

kolejki
Rys. 57. Struktura kolejki

Dostp do elementw kolejki jest moliwy tylko wdwch miejscach na jej


pocztku ina jej kocu. Naley jednak pamita, e nowy element mona doda
tylko na koniec kolejki, za pobra zkolejki mona tylko ten element, ktry si
znajduje na jej pocztku.
Wydruk 24 pokazuje, wjaki sposb wykonywane s podstawowe operacje
wodniesieniu do kolejki.

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 275


Wydruk 24. Obsuga kolejki
import java.util.*;
public class Kolejka {
public static void main(String[] args) {
LinkedList<String> kol = new LinkedList<String>();
kol.addLast("Poniedzialek");
kol.addLast("Wtorek");
kol.addLast("Sroda");

//sprawdzenie elementu znajdujacego si
//na poczatku kolejki (bez usuwania go zkolejki)
System.out.println("Na poczatku kolejki znajduje sie:" + kol.getFirst());
//wyswietlenie kolejki
System.out.println("Elementy: " + kol);
//pobieranie elementow zkolejki (zusuwaniem)
System.out.println("\nPobieranie elementowzkolejki\n");
while(!kol.isEmpty()) {
System.out.println(" Pobrany element to: " + kol.removeFirst());
System.out.println(" Zawartosc kolejki: " + kol);
System.out.println();
}
}
}

Powyszy program wygeneruje nastpujce rezultaty:


Na poczatku kolejki znajduje sie: Poniedzialek
Elementy: [Poniedzialek, Wtorek, Sroda]
Pobieranie elementow zkolejki
Pobrany element to: Poniedzialek
Zawartosc kolejki: [Wtorek, Sroda]
Pobrany element to: Wtorek
Zawartosc kolejki: [Sroda]
Pobrany element to: Sroda
Zawartosc kolejki: []

5.5.3. Tablica asocjacyjna


Kolejn ciekaw struktur dynamiczn jest tablica asocjacyjna, ktr mona
zdefiniowa jako zbir par: klucz warto. Klucz pozwala nam odwoa si do
wartoci, podobnie jak indeks wwektorze umoliwia dostp do elementu. Typ
Stowarzyszenie Edukacja dla Przedsibiorczoci

276Metody inarzdzia programowania


wartoci bdcej kluczem nie jest jednak ograniczony do liczb cakowitych (tak
jest wprzypadku wektora). Do czsto kluczem jest acuch znakw. Zuwagi
na konieczno zapewnienia jednoznacznego dostpu do elementw tablicy asocjacyjnej, wartoci kluczy nie mog si powtarza. Natomiast nie ma adnych
przeszkd, aby powtarzay si wartoci.
Wjzyku Java tablica asocjacyjna jest opisana za pomoc interfejsu Map, natomiast element tablicy awic para klucz warto jest reprezentowana przez
interfejs Map.Entry (zachcamy do zapoznania si zdokumentacj!).
Mamy dwie klasy bdce gotowymi do uycia tablicami asocjacyjnymi. Rni si one sposobem przechowywania kluczy. S to:
HashMap tablica asocjacyjna, wktrej klucze przechowywane s wpostaci
tablicy zhaszowaniem,
TreeMap tablica przechowujc klucze wdrzewie poszukiwa binarnych.
Oczywicie zlektury tekstu dotyczcego zbiorw wiemy, jakie bd cechy obu
rozwiza.
Wdostpnych implementacjach moliwe jest wyszukiwanie elementu przy
znajomoci klucza lub te bezporednie poszukiwanie wartoci. Ta pierwsza operacja wykonywana jest znacznie szybciej.
Stosujc klas HashMap, naley pamita, e obiekty speniajce rol kluczy
musz posiada prawidowo zaimplementowan funkcj hashCode() oraz equals().
Przykadowy program pokazany jest na wydruku 25.

Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 277


Wydruk 25. Wykorzystanie klasy HashMap
import java.util.*;
public class Stos {
public static void main(String[] args) {
LinkedList<String> st = new LinkedList<String>();

// umieszczanie elementw na stosie
st.addFirst("Poniedzialek");
st.addFirst("Wtorek");
st.addFirst("Sroda");

//sprawdzenie elementu znajdujcego si
//na wierzchoku stosu (bez usuwania go ze stosu)
System.out.println("Na wierzcholku stosu znajduje sie: " + st.getFirst());
//wyswietlenie zawartoci stosu
System.out.println("Elementy: " + st);

//pobieranie elementow ze stosu (zusuwaniem)
System.out.println("\nPobieranie elementow ze stosu\n");
while(!st.isEmpty())
{

System.out.println(" Pobrany element to: " + st.removeFirst());

System.out.println(" Zawartosc stosu: " + st);

System.out.println();
}
}
}

Stowarzyszenie Edukacja dla Przedsibiorczoci

278Metody inarzdzia programowania


Przedstawiony program wywietli:
Tablica asocjacyjna: {2=Dwa, 4=Cztery, 1=Jeden, 3=Trzy, 5=Piec}
czy jest klucz '44' - false
czy jest klucz '1' - true
element okluczu '44': null
element okluczu '1': Jeden
czy jest wartosc 'Dwa': true
czy jest wartosc 'Siedem': false
Zawartosc tablicy asocjacyjnej
klucz=2 wartosc=Dwa
klucz=4 wartosc=Cztery
klucz=1 wartosc=Jeden
klucz=3 wartosc=Trzy
klucz=5 wartosc=Piec

Stosujc klas TreeMap, uzyskujemy efekt uporzdkowania kluczy. S one


przechowywane wdrzewie poszukiwa binarnych, wktrym porzdek moe zosta okrelony:
za pomoc metody compareTo zdefiniowanej dla kluczy (wprzypadku kluczy
opisanych za pomoc klas implementujcych interfejs Comparable),
za pomoc komparatora.
Prosty program pokazujcy sposb dziaania tablicy asocjacyjnej typu TreeMap pokazano na wydruku 26.
Wydruk 26. Tablica asocjacyjna TreeMap

import java.util.*;
public class TreeMapTest1 {
public static void main(String [] args) {

Map kraje = new TreeMap();


kraje.put("Niemcy","Berlin");

kraje.put("Polska","Warszawa");

kraje.put("Czechy","Praga");

kraje.put("Hiszpnia","Madryt");

kraje.put("Grecja","Ateny");

kraje.put("Wlochy","Rzym");

System.out.println(kraje);
}
}
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 279


Porzdek elementw wynika zalfabetycznego uporzdkowania kluczy (nazwy
krajw), co zkolei okrela metoda compareTo:
{Czechy=Praga, Grecja=Ateny, Hiszpnia=Madryt, Niemcy=Berlin, Polska=Warszawa,
Wlochy=Rzym}

Chcc zastosowa inny sposb uporzdkowania, naley zdefiniowa wasny


komparator. Przykadowe rozwizanie pokazuje wydruk 27 celem jest uzyskanie odwrconego uporzdkowania alfabetycznego:
Wydruk 27. Definiowanie Comparatora
import java.util.*;
class Porzadkowanie implements Comparator
{
public int compare(Object o1, Object o2)
{

return -1 * ((String) o1).compareTo((String) o2);
}
}
public class TreeMapTest2 {
public static void main(String [] args) {

Porzadkowanie p = new Porzadkowanie();

Map<String, String> kraje = new TreeMap<String, String>(p);


kraje.put("Niemcy","Berlin");

kraje.put("Polska","Warszawa");

kraje.put("Czechy","Praga");

kraje.put("Hiszpnia","Madryt");

kraje.put("Grecja","Ateny");

kraje.put("Wlochy","Rzym");


System.out.println(kraje);
}
}

Powyszy program wywietli:

{Wlochy=Rzym, Polska=Warszawa, Niemcy=Berlin, Hiszpnia=Madryt, Grecja=Ateny,


Czechy=Praga}
Stowarzyszenie Edukacja dla Przedsibiorczoci

280Metody inarzdzia programowania

5.5.4. Drzewa
Drzewo to kolekcja elementw pozostajcych wzalenoci hierarchicznej,
posiadajca jeden element wyrniony zwany korzeniem drzewa. Przykadowe
drzewo pokazane zostao na poniszym rysunku (Rys. 58).

Rys. 58. Przykadowe drzewo

Studiujc literatur dotyczc drzew, przydatna bdzie znajomo podstawowych poj, ktre s znimi zwizane:
wze element skadowy drzewa,
krawd poczenie wystpujce wdrzewie,
korze drzewa pocztkowy element drzewa,
rodzic, przodek element nadrzdny,
dziecko, potomek element podrzdny,
li wze nieposiadajcy potomkw,
wze wewntrzny wze posiadajcy elementy potomne,
poddrzewo rozpatrywany element wraz ze wszystkimi jego potomkami (bezporednimi iporednimi),
wysoko drzewa dugo najduszej cieki prowadzcej od korzenia do
licia,
poziom wza (gboko wza) dugo cieki od korzenia do danego wza,
stopie wza liczba posiadanych przez wze potomkw,
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 281


elementy siostrzane wzy posiadajce tego samego rodzica, co rozpatrywany wze,
drzewo etykietowane drzewo, wktrym wzy lub krawdzie maj przypisane nazwy i/lub wartoci,
drzewo uporzdkowane drzewo, wktrym potomkowie wzw wystpuj
wcile okrelonej kolejnoci (np. etykiety wystpuj wkolejnoci alfabetycznej),
drzewo binarne drzewo, wktrym wzy maj co najwyej dwch potomkw (potomek lewy oraz potomek prawy).
Istnieje wiele sposbw przechowywania drzew wpamici komputera. Do
najwaniejszych znich zaliczamy nastpujce implementacje:
wektorow,
listow,
LCRS (ang. Leftmost-Child, Right-Sibling),
dla drzew binarnych.
Jedn znajprostszych metod przechowywania drzew jest implementacja
wektorowa. Zwana jest ona rwnie implementacj rodzicielsk, poniewa dla danego elementu przechowywana jest informacja ojego przodku. Sposb funkcjonowania tego rozwizania pokazuje Rys. 59. Sposb postpowania zmierzajcy
do zastosowania podejcia wektorowego skada si znastpujcych etapw:
elementy drzewa ponumerowa kolejnymi liczbami cakowitymi,
utworzy wektor oliczbie elementw zgodnej zliczb wzw,
na i-t pozycj wwektorze wpisa numer elementu bdcego rodzicem i-tego
wza wdrzewie.

Stowarzyszenie Edukacja dla Przedsibiorczoci

282 metody i narzdzia programowania

rys. 59. implementacja wektorowa (rodzicielska)

Do najwaniejszych cech implementacji wektorowej zaliczamy:


prostot i intuicyjno rozwizania,
atwo wdrwki w kierunku korzenia drzewa (wdrwka od korzenia w kierunku lici wymaga sekwencyjnego przegldnicia wektora, co istotnie wydua czas przetwarzania).
Kolejnym sposobem przechowywania drzew w pamici jest zastosowanie
implementacji listowej (Rys. 60).

Uniwersytet Ekonomiczny w Krakowie

algorytmy i struktury danych

283

rys. 60. implementacja listowa

Stosujc to rozwizanie tworzymy wektor o liczbie elementw rwnej liczbie


wzw drzewa. Element o numerze i przechowuje wskanik na list potomkw
i-tego wza. Jeli rozpatrywany element drzewa jest jego liciem, to na odpowiedniej pozycji w wektorze pojawia si wskanik pusty.
Omawiajc cechy implementacji listowej, atwo zauwaymy, e s one dokadn odwrotnoci tych, ktre znamy z implementacji wektorowej:
implementacja listowa pozwala na atw wdrwk od korzenia w kierunku
lici,
trudna natomiast jest wdrwka w kierunku korzenia, gdy wymaga sekwencyjnego przegldania list potomkw.
Stowarzyszenie Edukacja dla Przedsibiorczoci

284 metody i narzdzia programowania


Chyba najbardziej zaawansowanym sposobem przechowywania drzew w pamici jest implementacja LCRS (ang. Leftmost-Child, Right-Sibling). Jej nazwa
wskazuje, e kluczowymi elementami bdzie tu pierwszy od lewej strony element
potomny (ang. LeftmostChild) oraz prawy element siostrzany (ang. RightSibling).
Ide tego rozwizania przedstawia poniszy rysunek (Rys. 61).

rys. 61. implementacja lcrs

W tym rozwizaniu dane dotyczce drzewa przechowywane s w tablicy. Kady wiersz tablicy opisuje jeden element drzewa. Niezalenie musimy przechowywa informacj wskazujc, ktry wiersz opisuje wierzchoek (na powyszym rysunku jest to wiersz sidmy). Tablica opisujca drzewo ma zawsze trzy kolumny.
Pierwsza z nich przechowuje etykiety wzw. Druga zawiera numer wiersza bdcego pierwszym od lewej strony elementem potomnym rozpatrywanego wza.
Trzecia kolumna zawiera informacj na temat numeru wiersza reprezentujcego
Uniwersytet Ekonomiczny w Krakowie

algorytmy i struktury danych

285

prawy element siostrzany. Jeli w trzeciej kolumnie pojawia si warto ujemna


ma to miejsce dla ostatniego elementu siostrzanego to okrela ona rodzica
danego elementu (oczywicie minus naley pomin).
Podstawowe cechy metody LCRS to:
wzy identyfikowane s przez etykiety, a nie indeksy,
stosunkowo proste poruszanie si po drzewie w obu kierunkach,
moliwo realizacji zaawansowanych operacji na drzewie (np. czenie
drzew).
Drzewa binarne s specyficzn form drzew. Ich cechy uatwiaj implementacj. Przechowujc informacje o ich strukturze, korzysta si z faktu, e wze moe
mie co najwyej dwa elementy potomne, z ktrych jeden jest po prawej, a drugi po
lewej stronie. Stosowne rozwizanie pokazuje poniszy rysunek (Rys. 62).

rys. 62. implementacja drzew binarnych

Stowarzyszenie Edukacja dla Przedsibiorczoci

286Metody inarzdzia programowania


Rwnie tu stosuje si tablic otrzech kolumnach. Pierwsza zawiera etykiet
wza, druga wskanik do lewego potomka (LC leftchild), za trzecia do prawego (RC rightchild).
Wwielu zastosowaniach praktycznych drzew zachodzi potrzeba przejcia po
wszystkich ich elementach. Zadanie to okrelamy problemem wdrwki po drzewie. Jest spraw oczywist, e wzy drzewa mog by odwiedzane wrnej kolejnoci. Trzy metody wdrwki s jednak szczeglnie istotne. S to:
metoda preorder,
metoda postorder,
metoda inorder.
Metoda preorder rozpoczyna si od korzenia drzewa, anastpnie odwiedzane
s wszystkie jego poddrzewa wkolejnoci od lewej do prawej strony (Rys. 63).

Rys. 63. Wdrwka po drzewie metod preorder


(kolejno odwiedzane wzy: 1 2 3 5 8 9 6 10 4 7)

Metoda postorder wpierwszej kolejnoci odwiedzane s wszystkie poddrzewa wkolejnoci od lewej do prawej strony, anastpnie odwiedzany jest korze
drzewa. Wprzypadku drzewa zpowyszego rysunku metoda ta spowoduje, e
wzy odwiedzane bd wkolejnoci: 2 8 9 5 10 6 3 7 4 1.
Metoda inorder odwiedzane jest lewe skrajne poddrzewo, nastpnie korze
drzewa, po czym nastpuje przejcie i wdrujemy przez pozostae poddrzewa
wkolejnoci od lewej do prawej strony. Dla drzewa zpowyszego rysunku kolejno odwiedzin wzw bdzie nastpujca: 2 1 8 5 9 3 10 6 7 4.
Uniwersytet Ekonomiczny w Krakowie

algorytmy i struktury danych

287

Warto zapozna si z praktyczn metod okrelania kolejnoci odwiedzania


wzw drzewa w kadej z omwionych powyej metod. Przy opisie metody posuymy si drzewem zamieszczonym na poniszym rysunku (Rys. 64).

rys. 64. manualna implementacja metod wdrwki po drzewie

Stosowa bdziemy nastpujce zasady:


wychodzc od korzenia drzewa naley odwiedzi wszystkie jego elementy
w kierunku przeciwnym do ruchu wskazwek zegara,
sposb dalszego postpowania jest uzaleniony od metody poruszania si po
drzewie:
- metoda preorder naley wypisa etykiet kadego wza przy jego pierwszym odwiedzeniu, czyli uzyskamy kolejno: 1, 2, 3, 5, 8, 9, 6, 10, 4, 7,
- metoda postorder naley wypisa etykiet kadego wza przy jego
ostatnim odwiedzeniu, co daje kolejno: 2, 8, 9, 5, 10, 6, 3, 7, 4, 1,
- metoda inorder:

jeeli wze jest liciem, to jego etykieta jest wypisywana przy pierwszym odwiedzeniu,

jeeli wze jest wzem wewntrznym, to jego etykieta jest wypisywana przy drugim odwiedzeniu, co daje w rozpatrywanym przykadzie: 2, 1, 8, 5, 9, 3, 10, 6, 7, 4.
Stowarzyszenie Edukacja dla Przedsibiorczoci

288 metody i narzdzia programowania


Na koniec warto jeszcze wspomnie o znanym nam ju drzewie poszukiwa
binarnych (Rys. 65). Jest to drzewo binarne, etykietowane, w ktrym dla kadego
wza speniona jest nastpujca zaleno:
etykiety wzw znajdujcych si w jego lewym poddrzewie s nie wiksze od
etykiety przypisanej rozpatrywanemu wzowi,
etykiety wzw znajdujcych si w jego prawym poddrzewie s nie mniejsze
od etykiety przypisanej rozpatrywanemu wzowi.

rys. 65. drzewo poszukiwa binarnych

Drzewo tego typu pozwala na prost realizacj wielu zada. Na przykad:


wywietlanie elementw w sposb uporzdkowany uzyskujemy poprzez przejcie po drzewie metod inorder; dla drzewa na powyszym rysunku bdzie to:
2, 4, 5, 5, 6, 8,
wyznaczanie wartoci minimalnej realizujemy poprzez przejcie od korzenia
do licia, wybierajc zawsze lewe poddrzewo: 5, 4, 2,
wyznaczanie wartoci maksymalnej realizujemy poprzez przejcie od korzenia do licia, wybierajc zawsze prawe poddrzewo: 5, 6, 8.
Drzewo poszukiwa binarnych idealnie nadaje si do tworzenia struktur sownikowych.

5.5.5. Grafy
Graf to zbir wierzchokw poczonych za pomoc krawdzi. W zalenoci
od charakteru krawdzi rozrniamy:
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 289


grafy nieskierowane (wszystkie poczenia s dwukierunkowe),
grafy skierowane (wszystkie poczenia s jednokierunkowe).
Przykadowe grafy pokazano na poniszym rysunku (Rys. 66).

Rys. 66. Graf nieskierowany (po lewej) iskierowany (po prawej)

Podobnie jak wprzypadku drzew rozpocznijmy rozwaania ografach od


przedstawienia kilku podstawowych definicji:
graf nieskierowany nazywany jest grafem prostym,
cieka cig poczonych kolejno ze sob wierzchokw,
dugo cieki liczba krawdzi wchodzcych wskad cieki,
cieka prosta jeli wszystkie wchodzce wjej skad wierzchoki s rne
(dopuszcza si jedynie, aby pierwszy iostatni wierzchoek by identyczny),
graf spjny jeli dla kadej pary wierzchokw istnieje czca je cieka,
krawd (u, v) nazywana jest krawdzi przylegajc do wierzchokw uoraz
v lub krawdzi incydentn ztymi wierzchokami,
stopie wierzchoka liczba incydentnych znim krawdzi,
cykl cieka czca wierzchoek zsamym sob,
graf cykliczny graf zawierajcy co najmniej jeden cykl,
graf waony graf, wktrym zkad krawdzi skojarzony jest parametr numeryczny zwany wag; grafy waone mog by grafami nieskierowanymi lub
skierowanymi.
Omawiajc sposoby przechowywania grafw wpamici operacyjnej komputera, warto wspomnie odwch metodach. Pierwsz znich jest reprezentacja za
pomoc macierzy ssiedztwa, za drug reprezentacja listowa.
Reprezentacja za pomoc macierzy ssiedztwa (macierzy przylegoci) pokazana jest na poniszym rysunku (Rys. 67).

Stowarzyszenie Edukacja dla Przedsibiorczoci

290Metody inarzdzia programowania

Rys. 67. Reprezentacja grafu za pomoc macierzy ssiedztwa

Stosujc to rozwizanie, tworzymy macierz kwadratow, ktrej rozmiar jest


zgodny zliczb wzw wgrafie. Umieszczenie jedynki wmacierzy na pozycji
(i, j) oznacza, e wgrafie istnieje bezporednie poczenie pomidzy elementami
onumerach ioraz j. Zero natomiast wskazuje na brak takiego poczenia. Wprzypadku grafw waonych wmacierzy mog by przechowywane wartoci wag.
Stosujc reprezentacj listow, tworzymy wektor oliczbie elementw rwnej
liczbie wzw. Kady element wektora zawiera wskanik na list tych elementw, do ktrych mona bezporednio dotrze zelementu rozpatrywanego. Schemat takiej reprezentacji pokazuje poniszy rysunek (Rys. 68).

Rys. 68. Listowa reprezentacja grafu

Podobnie jak dla drzew, rwnie dla grafw wyrnia si rne metody przeszukiwania grafu (wdrwki po grafie). Dwie najwaniejsze to:
DFS ang. depth-firstsearch przeszukiwanie wgb grafu,
BFS ang. breadth-firstsearch przeszukiwanie wszerz grafu.
Algorytm przeszukiwania wgb grafu jest nastpujcy:
1. Jeli jest to moliwe, to naley przej do przylegego nieodwiedzonego wierzchoka; wierzchoek ten staje si wierzchokiem biecym; wierzchoek ten
umieszczany jest na stosie.
Uniwersytet Ekonomiczny w Krakowie

Algorytmy istruktury danych 291


2. Jeli wykonanie opisanego powyej kroku nie jest moliwe, to usuwamy jeden
element ze stosu; element znajdujcy si na wierzchoku staje si elementem
biecym.
3. Jeli wykonanie powyszych regu nie jest moliwe, to oznacza to koniec zadania.
Natomiast przeszukiwanie wszerz grafu realizowane jest zgodnie znastpujcymi zasadami:
1. Jeli jest to moliwe, to naley odwiedzi kolejny, wczeniej nieodwiedzony
wierzchoek, przylegy do wierzchoka biecego. Odwiedzony wierzchoek
umieszczany jest wkolejce. Nie nastpuje zmiana wierzchoka biecego.
2. Gdy nie ma ju kolejnych nieodwiedzonych wierzchokw, to zkolejki pobieramy pierwszy element. Staje si on wierzchokiem biecym.
3. Procedura koczy swoje dziaania, gdy nie mona zastosowa powyszych regu brakuje nieodwiedzonych wierzchokw ielementw wkolejce.

5.6. Literatura
Cormen T., Leiserson C., Rivest R., Stein C. [2004], Wprowadzenie do algorytmw, Wydawnictwo Naukowo-Techniczne, Warszawa.
Koffman E., Wolfgang P. [2006], Struktury danych itechniki obiektowe na przykadzie Javy 5.0, Wydawnictwo Helion, Gliwice.
Lafore R. [2004], Java. Algorytmy istruktury danych, Wydawnictwo Helion,
Gliwice.
Syso M. [1997], Algorytmy, Wydawnictwo Szkolne iPedagogiczne, Warszawa
Wirth N. [2004], Algorytmy + struktury danych = programy, Wydawnictwo Naukowo-Techniczne, Warszawa.
Wrblewski P. [2003], Algorytmy, struktury danych itechniki programowania,
Wydawnictwo Helion, Gliwice.

Stowarzyszenie Edukacja dla Przedsibiorczoci

292Metody inarzdzia programowania

Spis tABEL
Tabela 1. Funkcja wyjcia wybranego automatu skoczonego

.. . . . . . . . . .

31

Tabela 2. Funkcja wyjcia wybranego automatu skoczonego


ze stanami wewntrznymi .. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . .

31

Tabela 3. Funkcja wyjcia ifunkcja przejcia przykadowego automatu


Tabela 4. Funkcja wyjcia ifunkcja przejcia automatu akceptujcego
sowawrozwaanej gramatyce . . . . . . . . . . . . . . . . . . . . . . . . .

.. . .

33

. . . .

40

Tabela 5. Funkcja wyjcia ifunkcja przejcia automatu, bdcego gwnym


elementem rozwaanej maszyny Turinga . . . . . . . . . . . . . . . . . . . . 45
Tabela 6. Modyfikatory dostpu do skadowych obiektu
Tabela 7. Klasy bazowe dla operacji wejcia-wyjcia

.. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

Tabela 8. Wykaz najczciej stosowanych kontenerw

.. . . . . . . . . . . . . . .

Tabela 9. Wykaz wybranych komponentw pakietu Swing

.. . . . . . . . . . .

Tabela 10. Wybrane metody rozmieszczania elementw interfejsu

91

141
150
151

.. . . . .

152

Tabela 11. Obsuga zdarze

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

153

Tabela 12. Wartoci kolorw

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

197

Tabela 13. Waciwoci fontw

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Tabela 14. Zoono obliczeniowa algorytmw

.. . . . . . . . . . . . . . . . . . . . .

198
232

Spis RySUNKW
Rys. 1. Jednoznaczno kryterium gwarantuje sprawiedliwy przydzia
stypendiw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rys. 2. Brak jednoznacznoci kryteriw prowadzi do krzywdzcych
decyzji .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

19

. . . . . . . .

20

Rys. 3. Obiekt na przykadzie ktrego dyskutowana jest rnica midzy


cig rzeczywistoci idyskretnym opisem algorytmicznym . . .
Rys. 4. Przebieg rzeczywistego procesu wobiekcie zrysunku 3 jest
zsamej swojej natury cigy . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . .

21

. . . . . . . .

22

Rys. 5. Zbir dyskretnych wartoci przybliajcych zwykorzystaniem


algorytmu przebieg procesu oprniania naczynia . . . . . . . . . .
Uniwersytet Ekonomiczny w Krakowie

. . . . .

24

Metody inarzdzia programowania 293


Rys. 6. Odtwarzanie aproksymacji przebiegu cigego zserii
dyskretnych wartoci za pomoc interpolacji .. . . . . . .

. . . . . . . . . . . . .

Rys. 7. artobliwy komentarz na temat skutkw braku finistycznoci


algorytmu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

25

. . . . . . . . . . . . . . . . . . . . . . .

28

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

Rys. 8. Rysunek wykorzystujcy zasad rekurencji.


Objanienie wtekcie . . . . . . . . . . . . . . . . . . .
Rys. 9. Schemat maszyny Turinga

24

Rys. 10. Pierwszy krok dziaania przykadowego automatu


(ukadu sekwencyjnego) opis wtekcie . . . . . . . .

. . . . . . . . . . . . . . . .

34

.. . . . . . . . . . . . . . . . . . . . .

34

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

Rys. 11. Drugi krok dziaania ukadu sekwencyjnego


Rys. 12. Ilustracja problemu Busy Beaver

Rys. 13. Rozpoczcie pracy przez maszyn Turinga

.. . . . . . . . . . . . . . . . . . . . . .

Rys. 14. Maszyna Turinga uchwycia pierwszy symbol napisu


Rys. 15. Kolejny etap pracy maszyny Turinga

46

.. . . . . . . . . . . . .

46

.. . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

Rys. 16. Moment nawrotu wpracy maszyn Turinga

.. . . . . . . . . . . . . . . . . . . . . .

47

Rys. 17. Etapy tworzenia iuruchamiania aplikacji

.. . . . . . . . . . . . . . . . . . . . . . . .

54

Rys. 18. Etapy tworzenia iuruchamiania aplikacji

.. . . . . . . . . . . . . . . . . . . . . . . .

84

Rys. 19. Diagram UML klasy Telefon

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 20. Tworzenie obiektw na podstawie klasy


Rys. 21. Relacja kompozycji

. . . . . . . . . . . . . . . . . . . . . . .

105

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

114

Rys. 22. Relacja dziedziczenia (klasa Telefon oraz klasy pochodne)

.. . . . . . .

117

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

125

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

135

Rys. 23. Interfejs iklasa implementujca. .


Rys. 24. Struktura wyjtkw. .

102

Rys. 25. Wejciowe iwyjciowe strumienie danych..

. . . . . . . . . . . . . . . . . . . . .

Rys. 26. Okno aplikacji wykorzystujcej graficzny interfejs uytkownika.


Rys. 27. Grupowanie elementw wkontenerach. .

. . .

148

. . . . . . . . . . . . . . . . . . . . . .

150

Rys. 28. Rozmieszczanie elementw woknie aplikacji. .

. . . . . . . . . . . . . . . . . .

Rys. 29. Wykorzystanie elementw grafiki uytkownika..


Rys. 30. Okrelanie gabarytw apletu.

141

153

. . . . . . . . . . . . . . . . .

161

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

163

Rys. 31. Ewolucja jzykw opisu zasobw. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

174

Stowarzyszenie Edukacja dla Przedsibiorczoci

294Metody inarzdzia programowania


Rys. 32. Zalecany ukad graficzny strony internetowej. .
Rys. 33. Cykl ycia MIDletu. .

. . . . . . . . . . . . . . . . . .

176

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

182

Rys. 34. MIDlet uruchomiony wemulatorze urzdzenia mobilnego. .


Rys. 35. Ekran TextBox. .

. . . . . .

184

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

186

Rys. 36. Rodzaje list (opcji, wyboru, menu). .


Rys. 37. Elementy formularza..

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

190

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

192

Rys. 38. Hierarchia klas jzyka Java ME..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 39. Okrelanie wsprzdnych elementw


ekranu urzdzenia mobilnego. . . . . . . . .
Rys. 40. Hierarchia klas LWUIT. .

195

. . . . . . . . . . . . . . . . . . . . . . . .

197

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

203

Rys. 41. Menader rozkadu BorderLayout.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 42. Rezultat dziaania aplikacji: pobieranie danych


oraz wywietlenie aktualnego kursu USD.. . . . .
Rys. 43. Konsola WMA zotrzyman wiadomoci..

204

. . . . . . . . . . . . . . . . . .

207

. . . . . . . . . . . . . . . . . . . . . .

211

Rys. 44. Konsola WMA zwiadomoci wieloczciow.


Rys. 46. Przykadowy wygld aplikacji: menu gwne,
nowa notatka,lista notatek, podgld notatki. .

. . . . . . . . . . . . . . . . . .

214

. . . . . . . . . . . . . . . . . . .

221

Rys. 47. Sposb realizacji programu przedstawionego na wydruku nr 1.

. . .

234

Rys. 48. Sposb realizacji programu przedstawionego na wydruku nr 2.

. . .

236

Rys. 49. Sposb realizacji programu przedstawionego na wydruku 3..

. . . . .

237

Rys. 50. Sposb realizacji programu przedstawionego na wydruku 4..

. . . . .

239

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

241

Rys. 51. Wiee Hanoi. .

Rys. 52. Tablica zhaszowaniem. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 53. Przykadowe drzewo poszukiwa binarnych..

. . . . . . . . . . . . . . . . . . .

261
267

Rys. 54. Powikszanie obszaru zajmowanego przez list wklasie ArrayList. . 269
Rys. 55. Konstrukcja listy typu LinkedList..
Rys. 56. Struktura stosu. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

270

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

272

Rys. 57. Struktura kolejki. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 58. Przykadowe drzewo..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 59. Implementacja wektorowa (rodzicielska). .


Uniwersytet Ekonomiczny w Krakowie

. . . . . . . . . . . . . . . . . . . . . .

274
280
282

Metody inarzdzia programowania 295


Rys. 60. Implementacja listowa. .
Rys. 61. Implementacja LCRS..

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

283

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

284

Rys. 62. Implementacja drzew binarnych. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rys. 63. Wdrwka po drzewie metod preorder


(kolejno odwiedzane wzy: 1 2 3 5 8 9 6 10 4 7).

. . . . . . . . . . . . . . . .

Rys. 64. Manualna implementacja metod wdrwki po drzewie. .


Rys. 65. Drzewo poszukiwa binarnych..

286

. . . . . . . .

287

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

288

Rys. 66. Graf nieskierowany (po lewej) iskierowany (po prawej).. .

. . . . . . . . .

289

. . . . . . . . . . .

290

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

290

Rys. 67. Reprezentacja grafu za pomoc macierzy ssiedztwa. .


Rys. 68. Listowa reprezentacja grafu..

285

Stowarzyszenie Edukacja dla Przedsibiorczoci

You might also like