kurs c od zera do gier kodera
TRANSCRIPT
-
Karol Kuczmarski (Xion)
Od zera do gier kodera megatutorial
-
Kurs C++ Tutorial ten jest kompletnym opisem jzyka C++. Rozpoczyna si od wstpu do programowania i jzyka C++, by potem przeprowadzi Czytelnika przez proces konstruowania jego pierwszych programw. Po nauce podstaw przychodzi czas na programowanie obiektowe, a potem zaawansowane aspekty jzyka - z wyjtkami i szablonami wcznie. Kurs jest czci megatutoriala Od zera do gier kodera.
Copyright 2004 Karol Kuczmarski Udziela si zezwolenia do kopiowania, rozpowszechniania i/lub modyfikacji tego dokumentu zgodnie z zasadami Licencji GNU Wolnej Dokumentacji w wersji 1.1 lub dowolnej pniejszej, opublikowanej przez Free Software Foundation; bez Sekcji Niezmiennych, bez Tekstu na Przedniej Okadce, bez Tekstu na Tylniej Okadce. Kopia licencji zaczona jest w sekcji Licencja GNU Wolnej Dokumentacji. Wszystkie znaki wystpujce w tekcie s zastrzeonymi znakami firmowymi lub towarowymi ich wacicieli.
Autorzy dooyli wszelkich stara, aby zawarte w tej publikacji informacje byy kompletne i rzetelne. Nie bior jednak adnej odpowiedzialnoci ani za ich wykorzystanie, ani za zwizane z tym ewentualne naruszenie praw patentowych i autorskich. Autorzy nie ponosz rwnie adnej odpowiedzialnoci za ewentualne szkody wynike z wykorzystania informacji zawartych w tej publikacji.
Avocado Software http://avocado.risp.pl
Game Design PL http://warsztat.pac.pl
-
SPIS TRECI
PODSTAWY PROGRAMOWANIA__________________________ 17
Krtko o programowaniu _________________________________________ 19 Krok za krokiem _____________________________________________________________ 19 Jak rozmawiamy z komputerem? ________________________________________________ 21 Jzyki programowania ________________________________________________________ 23
Przegld najwaniejszych jzykw programowania ________________________________ 23 Brzemienna w skutkach decyzja ______________________________________________ 26 Kwestia kompilatora________________________________________________________ 27
Podsumowanie ______________________________________________________________ 28 Pytania i zadania __________________________________________________________ 28
Pytania ________________________________________________________________ 28 wiczenia ______________________________________________________________ 28
Z czego skada si program? ______________________________________ 29 C++, pierwsze starcie ________________________________________________________ 29
Bliskie spotkanie z kompilatorem______________________________________________ 29 Rodzaje aplikacji___________________________________________________________ 31 Pierwszy program__________________________________________________________ 32
Kod programu_______________________________________________________________ 33 Komentarze ______________________________________________________________ 33 Funkcja main() ___________________________________________________________ 33 Pisanie tekstu w konsoli _____________________________________________________ 34 Doczanie plikw nagwkowych______________________________________________ 35
Procedury i funkcje___________________________________________________________ 36 Wasne funkcje ____________________________________________________________ 36 Tryb ledzenia ____________________________________________________________ 37 Przebieg programu _________________________________________________________ 38
Zmienne i stae______________________________________________________________ 39 Zmienne i ich typy _________________________________________________________ 39 Strumie wejcia __________________________________________________________ 40 Stae ____________________________________________________________________ 41
Operatory arytmetyczne_______________________________________________________ 42 Umiemy liczy! ____________________________________________________________ 42 Rodzaje operatorw arytmetycznych ___________________________________________ 43 Priorytety operatorw_______________________________________________________ 44 Tajemnicze znaki __________________________________________________________ 44
Podsumowanie ______________________________________________________________ 45 Pytania i zadania __________________________________________________________ 45
Pytania ________________________________________________________________ 46 wiczenia ______________________________________________________________ 46
Dziaanie programu _____________________________________________ 47 Funkcje nieco bliej __________________________________________________________ 47
Parametry funkcji __________________________________________________________ 47 Warto zwracana przez funkcj ______________________________________________ 49 Skadnia funkcji ___________________________________________________________ 50
Sterowanie warunkowe _______________________________________________________ 51 Instrukcja warunkowa if____________________________________________________ 51
Fraza else _____________________________________________________________ 53 Bardziej zoony przykad__________________________________________________ 54
Instrukcja wyboru switch ___________________________________________________ 56 Ptle ______________________________________________________________________ 58
Ptle warunkowe do i while__________________________________________________ 58 Ptla do _______________________________________________________________ 58 Ptla while_____________________________________________________________ 60
-
4
Ptla krokowa for _________________________________________________________ 62 Instrukcje break i continue _________________________________________________ 65
Podsumowanie ______________________________________________________________ 66 Pytania i zadania __________________________________________________________ 67
Pytania ________________________________________________________________ 67 wiczenia ______________________________________________________________ 67
Operacje na zmiennych __________________________________________ 69 Wnikliwy rzut oka na zmienne __________________________________________________ 69
Zasig zmiennych__________________________________________________________ 69 Zasig lokalny __________________________________________________________ 70 Zasig moduowy ________________________________________________________ 72 Przesanianie nazw_______________________________________________________ 73
Modyfikatory zmiennych_____________________________________________________ 74 Zmienne statyczne_______________________________________________________ 75 Stae__________________________________________________________________ 76
Typy zmiennych _____________________________________________________________ 76 Modyfikatory typw liczbowych _______________________________________________ 77
Typy ze znakiem i bez znaku _______________________________________________ 77 Rozmiar typu cakowitego _________________________________________________ 78 Precyzja typu rzeczywistego _______________________________________________ 79 Skrcone nazwy _________________________________________________________ 80
Pomocne konstrukcje _______________________________________________________ 80 Instrukcja typedef_______________________________________________________ 80 Operator sizeof ________________________________________________________ 81
Rzutowanie_______________________________________________________________ 83 Proste rzutowanie________________________________________________________ 84 Operator static_cast____________________________________________________ 86
Kalkulacje na liczbach_________________________________________________________ 88 Przydatne funkcje__________________________________________________________ 88
Funkcje potgowe _______________________________________________________ 88 Funkcje wykadnicze i logarytmiczne _________________________________________ 89 Funkcje trygonometryczne_________________________________________________ 90 Liczby pseudolosowe _____________________________________________________ 91 Zaokrglanie liczb rzeczywistych ____________________________________________ 93 Inne funkcje ____________________________________________________________ 94
Znane i nieznane operatory __________________________________________________ 95 Dwa rodzaje ____________________________________________________________ 95 Sekrety inkrementacji i dekrementacji _______________________________________ 96 Swko o dzieleniu _______________________________________________________ 97
acuchy znakw ____________________________________________________________ 98 Napisy wedug C++ ________________________________________________________ 99
Typy zmiennych tekstowych ______________________________________________ 100 Manipulowanie acuchami znakw ___________________________________________ 100
Inicjalizacja ___________________________________________________________ 100 czenie napisw _______________________________________________________ 102 Pobieranie pojedynczych znakw___________________________________________ 103
Wyraenia logiczne__________________________________________________________ 105 Porwnywanie wartoci zmiennych ___________________________________________ 105 Operatory logiczne ________________________________________________________ 105
Koniunkcja ____________________________________________________________ 106 Alternatywa ___________________________________________________________ 106 Negacja ______________________________________________________________ 106 Zestawienie operatorw logicznych _________________________________________ 107
Typ bool________________________________________________________________ 108 Operator warunkowy ______________________________________________________ 109
Podsumowanie _____________________________________________________________ 110 Pytania i zadania _________________________________________________________ 111
Pytania _______________________________________________________________ 111 wiczenia _____________________________________________________________ 111
Zoone zmienne ______________________________________________ 113 Tablice ___________________________________________________________________ 113
-
5
Proste tablice ____________________________________________________________ 113 Inicjalizacja tablicy______________________________________________________ 115 Przykad wykorzystania tablicy ____________________________________________ 116
Wicej wymiarw _________________________________________________________ 119 Deklaracja i inicjalizacja__________________________________________________ 120 Tablice w tablicy________________________________________________________ 121
Nowe typy danych __________________________________________________________ 123 Wyliczania nadszed czas ___________________________________________________ 123
Przydatno praktyczna __________________________________________________ 123 Definiowanie typu wyliczeniowego__________________________________________ 125 Uycie typu wyliczeniowego_______________________________________________ 126 Zastosowania __________________________________________________________ 126
Kompleksowe typy ________________________________________________________ 128 Typy strukturalne i ich definiowanie ________________________________________ 128 Struktury w akcji _______________________________________________________ 129 Odrobina formalizmu - nie zaszkodzi! _______________________________________ 131 Przykad wykorzystania struktury __________________________________________ 131 Unie _________________________________________________________________ 136
Wikszy projekt ____________________________________________________________ 137 Projektowanie____________________________________________________________ 138
Struktury danych w aplikacji ______________________________________________ 138 Dziaanie programu _____________________________________________________ 139 Interfejs uytkownika____________________________________________________ 141
Kodowanie ______________________________________________________________ 142 Kilka moduw i wasne nagwki___________________________________________ 142 Tre pliku nagwkowego ________________________________________________ 144 Waciwy kod gry _______________________________________________________ 145
Zaczynamy __________________________________________________________________ 146 Deklarujemy zmienne __________________________________________________________ 147 Funkcja StartGry() ___________________________________________________________ 147 Funkcja Ruch() _______________________________________________________________ 147 Funkcja RysujPlansze() _______________________________________________________ 152
Funkcja main(), czyli skadamy program ____________________________________ 155 Uroki kompilacji ________________________________________________________ 156 Uruchamiamy aplikacj __________________________________________________ 158
Wnioski_________________________________________________________________ 158 Dziwaczne projektowanie_________________________________________________ 158 Do skomplikowane algorytmy____________________________________________ 159 Organizacja kodu _______________________________________________________ 159
Podsumowanie _____________________________________________________________ 159 Pytania i zadania _________________________________________________________ 160
Pytania _______________________________________________________________ 160 wiczenia _____________________________________________________________ 160
Obiekty______________________________________________________ 161 Przedstawiamy klasy i obiekty _________________________________________________ 161
Skrawek historii __________________________________________________________ 161 Mao zachcajce pocztki ________________________________________________ 161 Wyszy poziom_________________________________________________________ 162 Skostniae standardy ____________________________________________________ 163 Obiektw czar__________________________________________________________ 163 Co dalej? _____________________________________________________________ 163
Pierwszy kontakt _________________________________________________________ 164 Obiektowy wiat________________________________________________________ 164
Wszystko jest obiektem ________________________________________________________ 164 Okrelenie obiektu_____________________________________________________________ 165 Obiekt obiektowi nierwny ______________________________________________________ 166
Co na to C++? _________________________________________________________ 167 Definiowanie klas _____________________________________________________________ 167 Implementacja metod __________________________________________________________ 168 Tworzenie obiektw____________________________________________________________ 168
Obiekty i klasy w C++ _______________________________________________________ 169 Klasa jako typ obiektowy ___________________________________________________ 169
Dwa etapy okrelania klasy _______________________________________________ 170
-
6
Definicja klasy _________________________________________________________ 170 Kontrola dostpu do skadowych klasy _____________________________________________ 171 Deklaracje pl ________________________________________________________________ 174 Metody i ich prototypy__________________________________________________________ 175 Konstruktory i destruktory ______________________________________________________ 176 Co jeszcze? _________________________________________________________________ 178
Implementacja metod ___________________________________________________ 178 Wskanik this _______________________________________________________________ 179
Praca z obiektami _________________________________________________________ 179 Zmienne obiektowe _____________________________________________________ 180
Deklarowanie zmiennych i tworzenie obiektw_______________________________________ 180 onglerka obiektami ___________________________________________________________ 180 Dostp do skadnikw __________________________________________________________ 182 Niszczenie obiektw ___________________________________________________________ 182 Podsumowanie _______________________________________________________________ 183
Wskaniki na obiekty ____________________________________________________ 183 Deklarowanie wskanikw i tworzenie obiektw ______________________________________ 184 Jeden dla wszystkich, wszystkie do jednego_________________________________________ 184 Dostp do skadnikw __________________________________________________________ 185 Niszczenie obiektw ___________________________________________________________ 186 Stosowanie wskanikw na obiekty _______________________________________________ 187
Podsumowanie _____________________________________________________________ 188 Pytania i zadania _________________________________________________________ 188
Pytania _______________________________________________________________ 188 wiczenia _____________________________________________________________ 189
Programowanie obiektowe ______________________________________ 191 Dziedziczenie ______________________________________________________________ 191
O powstawaniu klas drog doboru naturalnego __________________________________ 192 Od prostoty do komplikacji, czyli ewolucja ___________________________________ 193 Z klasy bazowej do pochodnej, czyli dziedzictwo przodkw ______________________ 194 Obiekt o kilku klasach, czyli zmienno gatunkowa_____________________________ 195
Dziedziczenie w C++ ______________________________________________________ 195 Podstawy _____________________________________________________________ 195
Definicja klasy bazowej i specyfikator protected_____________________________________ 195 Definicja klasy pochodnej _______________________________________________________ 197
Dziedziczenie pojedyncze_________________________________________________ 198 Proste przypadki ______________________________________________________________ 198 Sztafeta pokole ______________________________________________________________ 199 Paskie hierarchie _____________________________________________________________ 201 Podsumowanie _______________________________________________________________ 202
Dziedziczenie wielokrotne ________________________________________________ 202 Puapki dziedziczenia ____________________________________________________ 202
Co nie jest dziedziczone? _______________________________________________________ 202 Obiekty kompozytowe__________________________________________________________ 203
Metody wirtualne i polimorfizm ________________________________________________ 204 Wirtualne funkcje skadowe _________________________________________________ 204
To samo, ale inaczej ____________________________________________________ 204 Deklaracja metody wirtualnej ____________________________________________________ 205 Przedefiniowanie metody wirtualnej _______________________________________________ 206 Pojedynek: metody wirtualne przeciwko zwykym ____________________________________ 206 Wirtualny destruktor ___________________________________________________________ 207
Zaczynamy od zera dosownie____________________________________________ 209 Czysto wirtualne metody________________________________________________________ 210 Abstrakcyjne klasy bazowe ______________________________________________________ 210
Polimorfizm______________________________________________________________ 211 Oglny kod do szczeglnych zastosowa_____________________________________ 212
Sprowadzanie do bazy _________________________________________________________ 212 Klasy wiedz same, co naley robi _______________________________________________ 215
Typy pod kontrol ______________________________________________________ 217 Operator dynamic_cast ________________________________________________________ 217 typeid i informacje o typie podczas dziaania programu _______________________________ 219 Alternatywne rozwizania _______________________________________________________ 221
Projektowanie zorientowane obiektowo __________________________________________ 223 Rodzaje obiektw _________________________________________________________ 223
Singletony ____________________________________________________________ 224 Przykady wykorzystania ________________________________________________________ 224
-
7
Praktyczna implementacja z uyciem skadowych statycznych___________________________ 225 Obiekty zasadnicze______________________________________________________ 228 Obiekty narzdziowe ____________________________________________________ 228
Definiowanie odpowiednich klas______________________________________________ 231 Abstrakcja ____________________________________________________________ 231
Identyfikacja klas _____________________________________________________________ 232 Abstrakcja klasy ______________________________________________________________ 233 Skadowe interfejsu klasy _______________________________________________________ 234
Implementacja _________________________________________________________ 234 Zwizki midzy klasami ____________________________________________________ 235
Dziedziczenie i zawieranie si _____________________________________________ 235 Zwizek generalizacji-specjalizacji ________________________________________________ 235 Zwizek agregacji _____________________________________________________________ 236 Odwieczny problem: by czy mie?________________________________________________ 237
Zwizek asocjacji _______________________________________________________ 237 Krotno zwizku______________________________________________________________ 238 Tam i (by moe) z powrotem ___________________________________________________ 239
Podsumowanie _____________________________________________________________ 240 Pytania i zadania _________________________________________________________ 240
Pytania _______________________________________________________________ 241 wiczenia _____________________________________________________________ 241
Wskaniki____________________________________________________ 243 Ku pamici ________________________________________________________________ 244
Rodzaje pamici __________________________________________________________ 244 Rejestry procesora ______________________________________________________ 244
Zmienne przechowywane w rejestrach _____________________________________________ 245 Dostp do rejestrw ___________________________________________________________ 246
Pami operacyjna ______________________________________________________ 246 Skd si bierze pami operacyjna? _______________________________________________ 246 Pami wirtualna______________________________________________________________ 247
Pami trwaa__________________________________________________________ 247 Organizacja pamici operacyjnej _____________________________________________ 247
Adresowanie pamici ____________________________________________________ 248 Epoka niewygodnych segmentw _________________________________________________ 248 Paski model pamici___________________________________________________________ 249
Stos i sterta ___________________________________________________________ 249 Czym jest stos?_______________________________________________________________ 249 O stercie ____________________________________________________________________ 250
Wskaniki na zmienne _______________________________________________________ 250 Uywanie wskanikw na zmienne____________________________________________ 250
Deklaracje wskanikw __________________________________________________ 252 Nieodaowany spr o gwiazdk __________________________________________________ 252 Wskaniki do staych___________________________________________________________ 253 Stae wskaniki _______________________________________________________________ 254 Podsumowanie deklaracji wskanikw _____________________________________________ 255
Niezbdne operatory ____________________________________________________ 256 Pobieranie adresu i dereferencja__________________________________________________ 256 Wyuskiwanie skadnikw _______________________________________________________ 257
Konwersje typw wskanikowych __________________________________________ 258 Matka wszystkich wskanikw____________________________________________________ 259 Przywracanie do stanu uywalnoci _______________________________________________ 260 Midzy palcami kompilatora _____________________________________________________ 260
Wskaniki i tablice ______________________________________________________ 261 Tablice jednowymiarowe w pamici _______________________________________________ 261 Wskanik w ruchu _____________________________________________________________ 262 Tablice wielowymiarowe w pamici________________________________________________ 263 acuchy znakw w stylu C______________________________________________________ 263
Przekazywanie wskanikw do funkcji _______________________________________ 265 Dane otrzymywane poprzez parametry_____________________________________________ 265 Zapobiegamy niepotrzebnemu kopiowaniu __________________________________________ 266
Dynamiczna alokacja pamici _______________________________________________ 268 Przydzielanie pamici dla zmiennych ________________________________________ 268
Alokacja przy pomocy new_______________________________________________________ 268 Zwalnianie pamici przy pomocy delete ___________________________________________ 269 Nowe jest lepsze ______________________________________________________________ 270
Dynamiczne tablice _____________________________________________________ 270
-
8
Tablice jednowymiarowe ________________________________________________________ 271 Opakowanie w klas ___________________________________________________________ 272 Tablice wielowymiarowe ________________________________________________________ 274
Referencje ______________________________________________________________ 277 Typy referencyjne ______________________________________________________ 278
Deklarowanie referencji_________________________________________________________ 278 Prawo staoci referencji ________________________________________________________ 278
Referencje i funkcje _____________________________________________________ 279 Parametry przekazywane przez referencje __________________________________________ 279 Zwracanie referencji ___________________________________________________________ 280
Wskaniki do funkcji_________________________________________________________ 281 Cechy charakterystyczne funkcji _____________________________________________ 282
Typ wartoci zwracanej przez funkcj _______________________________________ 282 Instrukcja czy wyraenie________________________________________________________ 283
Konwencja wywoania ___________________________________________________ 283 O czym mwi konwencja wywoania? ______________________________________________ 284 Typowe konwencje wywoania ___________________________________________________ 285
Nazwa funkcji__________________________________________________________ 286 Rozterki kompilatora i linkera ____________________________________________________ 286
Parametry funkcji_______________________________________________________ 286 Uywanie wskanikw do funkcji _____________________________________________ 287
Typy wskanikw do funkcji_______________________________________________ 287 Wasnoci wyrniajce funkcj __________________________________________________ 287 Typ wskanika do funkcji _______________________________________________________ 287
Wskaniki do funkcji w C++ ______________________________________________ 288 Od funkcji do wskanika na ni___________________________________________________ 288 Specjalna konwencja___________________________________________________________ 289 Skadnia deklaracji wskanika do funkcji ___________________________________________ 290 Wskaniki do funkcji w akcji _____________________________________________________ 290 Przykad wykorzystania wskanikw do funkcji_______________________________________ 291
Zastosowania __________________________________________________________ 295 Podsumowanie _____________________________________________________________ 295
Pytania i zadania _________________________________________________________ 296 Pytania _______________________________________________________________ 296 wiczenia _____________________________________________________________ 296
ZAAWANSOWANE C++ _______________________________ 299
Preprocesor __________________________________________________ 301 Pomocnik kompilatora _______________________________________________________ 301
Gdzie on jest? __________________________________________________________ 302 Zwyczajowy przebieg budowania programu __________________________________ 302 Dodajemy preprocesor___________________________________________________ 303
Dziaanie preprocesora_____________________________________________________ 304 Dyrektywy ____________________________________________________________ 304
Bez rednika _________________________________________________________________ 304 Ciekawostka: sekwencje trjznakowe______________________________________________ 305
Preprocesor a reszta kodu ________________________________________________ 306 Makra ____________________________________________________________________ 307
Proste makra ____________________________________________________________ 307 Definiowianie prostych makr ______________________________________________ 307
Zastpowanie wikszych fragmentw kodu _________________________________________ 308 W kilku linijkach ____________________________________________________________ 309
Makra korzystajce z innych makr ________________________________________________ 309 Pojedynek: makra kontra stae ____________________________________________ 310
Makra nie s zmiennymi ________________________________________________________ 310 Zasig____________________________________________________________________ 310 Miejsce w pamici i adres_____________________________________________________ 310 Typ ______________________________________________________________________ 311
Efekty skadniowe _____________________________________________________________ 311 rednik ___________________________________________________________________ 311 Nawiasy i priorytety operatorw________________________________________________ 312 Dygresja: odpowied na pytanie o sens ycia _____________________________________ 313
Predefiniowane makra kompilatora _________________________________________ 314 Numer linii i nazwa pliku ________________________________________________________ 314
Numer wiersza _____________________________________________________________ 314
-
9
Nazwa pliku z kodem ________________________________________________________ 315 Dyrektywa #line ___________________________________________________________ 315
Data i czas___________________________________________________________________ 315 Czas kompilacji_____________________________________________________________ 315 Czas modyfikacji pliku _______________________________________________________ 316
Typ kompilatora ______________________________________________________________ 316 Inne nazwy __________________________________________________________________ 316
Makra parametryzowane ___________________________________________________ 316 Definiowanie parametrycznych makr________________________________________ 317
Kilka przykadw ______________________________________________________________ 318 Wzory matematyczne________________________________________________________ 318 Skracanie zapisu____________________________________________________________ 318
Operatory preprocesora ________________________________________________________ 319 Sklejacz __________________________________________________________________ 319 Operator acuchujcy _______________________________________________________ 319
Niebezpieczestwa makr _________________________________________________ 320 Brak kontroli typw____________________________________________________________ 320 Parokrotne obliczanie argumentw ________________________________________________ 321 Priorytety operatorw __________________________________________________________ 321
Zalety makrodefinicji ____________________________________________________ 322 Efektywno _________________________________________________________________ 322
Funkcje inline ______________________________________________________________ 322 Makra kontra funkcje inline ___________________________________________________ 323
Brak kontroli typw____________________________________________________________ 323 Ciekawostka: funkcje szablonowe ______________________________________________ 323
Zastosowania makr _____________________________________________________ 324 Nie korzystajmy z makr, lecz z obiektw const____________________________________ 324 Nie korzystajmy z makr, lecz z (szablonowych) funkcji inline _________________________ 324 Korzystajmy z makr, by zastpowa powtarzajce si fragmenty kodu__________________ 324 Korzystajmy z makr, by skraca sobie zapis ______________________________________ 324 Korzystajmy z makr zgodnie z ich przeznaczeniem _________________________________ 325
Kontrola procesu kompilacji ___________________________________________________ 325 Dyrektywy #ifdef i #ifndef ________________________________________________ 326
Puste makra ___________________________________________________________ 326 Dyrektywa #ifdef ______________________________________________________ 326 Dyrektywa #ifndef _____________________________________________________ 327 Dyrektywa #else _______________________________________________________ 327
Dyrektywa warunkowa #if _________________________________________________ 328 Konstruowanie warunkw ________________________________________________ 328
Operator defined _____________________________________________________________ 328 Zoone warunki ______________________________________________________________ 329
Skomplikowane warunki kompilacji _________________________________________ 329 Zagniedanie dyrektyw ________________________________________________________ 329 Dyrektywa #elif______________________________________________________________ 330
Dyrektywa #error ______________________________________________________ 330 Reszta dobroci _____________________________________________________________ 331
Doczanie plikw_________________________________________________________ 331 Dwa warianty #include__________________________________________________ 331
Z nawiasami ostrymi ___________________________________________________________ 331 Z cudzysowami_______________________________________________________________ 332 Ktry wybra? ________________________________________________________________ 332
Nasz czy biblioteczny ________________________________________________________ 332 cieki wzgldne____________________________________________________________ 333
Zabezpieczenie przed wielokrotnym doczaniem ______________________________ 333 Tradycyjne rozwizanie_________________________________________________________ 333 Pomaga kompilator ____________________________________________________________ 334
Polecenia zalene od kompilatora ____________________________________________ 334 Dyrektywa #pragma _____________________________________________________ 334 Waniejsze parametry #pragma w Visual C++ .NET ____________________________ 334
Komunikaty kompilacji _________________________________________________________ 335 message __________________________________________________________________ 335 deprecated _______________________________________________________________ 336 warning __________________________________________________________________ 336
Funkcje inline ________________________________________________________________ 337 auto_inline ______________________________________________________________ 337 inline_recursion__________________________________________________________ 338 inline_depth______________________________________________________________ 338
-
10
Inne________________________________________________________________________ 339 comment __________________________________________________________________ 339 once _____________________________________________________________________ 339
Podsumowanie _____________________________________________________________ 340 Pytania i zadania _________________________________________________________ 340
Pytania _______________________________________________________________ 340 wiczenia _____________________________________________________________ 341
Zaawansowana obiektowo _____________________________________ 343 O przyjani ________________________________________________________________ 343
Funkcje zaprzyjanione ____________________________________________________ 345 Deklaracja przyjani z funkcj _____________________________________________ 345 Na co jeszcze trzeba zwrci uwag ________________________________________ 346
Funkcja zaprzyjaniona nie jest metod ____________________________________________ 346 Deklaracja przyjani jest te deklaracj funkcji ______________________________________ 347
Deklaracja przyjani jako prototyp funkcji ________________________________________ 347 Dodajemy definicj__________________________________________________________ 347
Klasy zaprzyjanione ______________________________________________________ 348 Przyja z pojedynczymi metodami_________________________________________ 348 Przyja z ca klas ____________________________________________________ 349
Jeszcze kilka uwag ________________________________________________________ 351 Cechy przyjani klas w C++ ______________________________________________ 351
Przyja nie jest automatycznie wzajemna__________________________________________ 351 Przyja nie jest przechodnia ____________________________________________________ 351 Przyja nie jest dziedziczna_____________________________________________________ 351
Zastosowania __________________________________________________________ 352 Wykorzystanie przyjani z funkcj ________________________________________________ 352 Korzyci czerpane z przyjani klas ________________________________________________ 352
Konstruktory w szczegach ___________________________________________________ 352 Maa powtrka ___________________________________________________________ 352
Konstruktory __________________________________________________________ 353 Cechy konstruktorw___________________________________________________________ 353 Definiowanie _________________________________________________________________ 353
Przecianie _______________________________________________________________ 353 Konstruktor domylny _______________________________________________________ 354
Kiedy wywoywany jest konstruktor _______________________________________________ 355 Niejawne wywoanie _________________________________________________________ 355 Jawne wywoanie ___________________________________________________________ 355
Inicjalizacja ___________________________________________________________ 355 Kiedy si odbywa _____________________________________________________________ 355 Jak wyglda__________________________________________________________________ 355
Inicjalizacja typw podstawowych ______________________________________________ 356 Agregaty__________________________________________________________________ 356 Inicjalizacja konstruktorem ___________________________________________________ 356
Listy inicjalizacyjne________________________________________________________ 357 Inicjalizacja skadowych__________________________________________________ 357 Wywoanie konstruktora klasy bazowej ______________________________________ 358
Konstruktory kopiujce ____________________________________________________ 359 O kopiowaniu obiektw __________________________________________________ 359
Pole po polu__________________________________________________________________ 360 Gdy to nie wystarcza _________________________________________________________ 360
Konstruktor kopiujcy ___________________________________________________ 361 Do czego suy konstruktor kopiujcy______________________________________________ 361
Konstruktor kopiujcy a przypisanie - rnica maa lecz wana________________________ 362 Dlaczego konstruktor kopiujcy ________________________________________________ 362
Definiowanie konstruktora kopiujcego ____________________________________________ 362 Inicjalizator klasy CIntArray __________________________________________________ 363
Konwersje_______________________________________________________________ 363 Sposoby dokonywania konwersji ___________________________________________ 364
Konstruktory konwertujce ______________________________________________________ 365 Konstruktor z jednym obowizkowym parametrem _________________________________ 365 Swko explicit ___________________________________________________________ 367
Operatory konwersji ___________________________________________________________ 367 Stwarzamy sobie problem ____________________________________________________ 368 Definiowanie operatora konwersji ______________________________________________ 368
Wybr odpowiedniego sposobu ____________________________________________ 369 Przecianie operatorw______________________________________________________ 370
-
11
Cechy operatorw ________________________________________________________ 371 Liczba argumentw _____________________________________________________ 371
Operatory jednoargumentowe____________________________________________________ 372 Operatory dwuargumentowe_____________________________________________________ 372
Priorytet ______________________________________________________________ 372 czno______________________________________________________________ 373
Operatory w C++ _________________________________________________________ 373 Operatory arytmetyczne _________________________________________________ 374
Unarne operatory arytmetyczne __________________________________________________ 374 Inkrementacja i dekrementacja ________________________________________________ 374
Binarne operatory arytmetyczne__________________________________________________ 375 Operatory bitowe _______________________________________________________ 375
Operacje logiczno-bitowe _______________________________________________________ 375 Przesunicie bitowe____________________________________________________________ 376
Operatory strumieniowe ______________________________________________________ 376 Operatory porwnania ___________________________________________________ 376 Operatory logiczne ______________________________________________________ 377 Operatory przypisania ___________________________________________________ 377
Zwyky operator przypisania _____________________________________________________ 378 L-warto i r-warto ________________________________________________________ 378 Rezultat przypisania _________________________________________________________ 379 Uwaga na przypisanie w miejscu rwnoci________________________________________ 379
Zoone operatory przypisania ___________________________________________________ 380 Operatory wskanikowe __________________________________________________ 380
Pobranie adresu ______________________________________________________________ 380 Dostp do pamici poprzez wskanik ______________________________________________ 381
Dereferencja_______________________________________________________________ 381 Indeksowanie ______________________________________________________________ 381
Operatory pamici ______________________________________________________ 382 Alokacja pamici ______________________________________________________________ 382
new ______________________________________________________________________ 382 new[] ____________________________________________________________________ 382
Zwalnianie pamici ____________________________________________________________ 383 delete ___________________________________________________________________ 383 delete[] _________________________________________________________________ 383
Operator sizeof ______________________________________________________________ 383 Ciekawostka: operator __alignof ______________________________________________ 384
Operatory typw _______________________________________________________ 384 Operatory rzutowania __________________________________________________________ 384
static_cast ______________________________________________________________ 384 dynamic_cast______________________________________________________________ 385 reinterpret_cast__________________________________________________________ 385 const_cast _______________________________________________________________ 386 Rzutowanie w stylu C ________________________________________________________ 386 Rzutowanie funkcyjne________________________________________________________ 386
Operator typeid ______________________________________________________________ 387 Operatory dostpu do skadowych__________________________________________ 387
Wyuskanie z obiektu __________________________________________________________ 387 Wyuskanie ze wskanika _______________________________________________________ 388 Operator zasigu______________________________________________________________ 388
Pozostae operatory _____________________________________________________ 388 Nawiasy okrge ______________________________________________________________ 388 Operator warunkowy___________________________________________________________ 389 Przecinek____________________________________________________________________ 389
Nowe znaczenia dla operatorw______________________________________________ 389 Funkcje operatorowe ____________________________________________________ 389
Kilka uwag wstpnych__________________________________________________________ 390 Oglna skadnia funkcji operatorowej____________________________________________ 390 Operatory, ktre moemy przecia____________________________________________ 390 Czego nie moemy zmieni ___________________________________________________ 391 Pozostae sprawy ___________________________________________________________ 391
Definiowanie przecionych wersji operatorw_______________________________________ 391 Operator jako funkcja skadowa klasy ___________________________________________ 392 Problem przemiennoci_______________________________________________________ 393 Operator jako zwyka funkcja globalna___________________________________________ 393 Operator jako zaprzyjaniona funkcja globalna ____________________________________ 394
Sposoby przeciania operatorw __________________________________________ 394 Najczciej stosowane przecienia _______________________________________________ 394
-
12
Typowe operatory jednoargumentowe ___________________________________________ 395 Inkrementacja i dekrementacja ________________________________________________ 396 Typowe operatory dwuargumentowe ____________________________________________ 397 Operatory przypisania _______________________________________________________ 399
Operator indeksowania _________________________________________________________ 402 Operatory wyuskania __________________________________________________________ 404
Operator -> _______________________________________________________________ 404 Ciekawostka: operator ->*____________________________________________________ 406
Operator wywoania funkcji______________________________________________________ 407 Operatory zarzdzania pamici __________________________________________________ 409
Lokalne wersje operatorw____________________________________________________ 410 Globalna redefinicja _________________________________________________________ 411
Operatory konwersji ___________________________________________________________ 412 Wskazwki dla pocztkujcego przeciacza__________________________________ 412
Zachowujmy sens, logik i konwencj _____________________________________________ 412 Symbole operatorw powinny odpowiada ich znaczeniom ___________________________ 412 Zapewnijmy analogiczne zachowania jak dla typw wbudowanych _____________________ 413
Nie przeciajmy wszystkiego____________________________________________________ 413 Wskaniki do skadowych klasy ________________________________________________ 414
Wskanik na pole klasy ____________________________________________________ 414 Wskanik do pola wewntrz obiektu ________________________________________ 414
Wskanik na obiekt ____________________________________________________________ 414 Pokazujemy na skadnik obiektu __________________________________________________ 415
Wskanik do pola wewntrz klasy __________________________________________ 415 Miejsce pola w definicji klasy ____________________________________________________ 416 Pobieranie wskanika __________________________________________________________ 417 Deklaracja wskanika na pole klasy _______________________________________________ 418 Uycie wskanika _____________________________________________________________ 419
Wskanik na metod klasy__________________________________________________ 420 Wskanik do statycznej metody klasy _______________________________________ 420 Wskanik do niestatycznej metody klasy_____________________________________ 421
Wykorzystanie wskanikw na metody_____________________________________________ 421 Deklaracja wskanika ________________________________________________________ 421 Pobranie wskanika na metod klasy ____________________________________________ 423 Uycie wskanika ___________________________________________________________ 423
Ciekawostka: wskanik do metody obiektu__________________________________________ 423 Wskanik na metod obiektu konkretnej klasy ____________________________________ 425 Wskanik na metod obiektu dowolnej klasy ______________________________________ 427
Podsumowanie _____________________________________________________________ 430 Pytania i zadania _________________________________________________________ 430
Pytania _______________________________________________________________ 430 wiczenia _____________________________________________________________ 431
Wyjtki______________________________________________________ 433 Mechanizm wyjtkw w C++ __________________________________________________ 433
Tradycyjne metody obsugi bdw ___________________________________________ 434 Dopuszczalne sposoby ___________________________________________________ 434
Zwracanie nietypowego wyniku __________________________________________________ 434 Specjalny rezultat___________________________________________________________ 435 Wady tego rozwizania_______________________________________________________ 435
Oddzielenie rezultatu od informacji o bdzie ________________________________________ 436 Wykorzystanie wskanikw ___________________________________________________ 436 Uycie struktury ____________________________________________________________ 437
Niezbyt dobre wyjcia ___________________________________________________ 438 Wywoanie zwrotne ____________________________________________________________ 438
Uwaga o wygodnictwie _______________________________________________________ 438 Uwaga o logice _____________________________________________________________ 439 Uwaga o niedostatku mechanizmw_____________________________________________ 439
Zakoczenie programu _________________________________________________________ 439 Wyjtki _________________________________________________________________ 439
Rzucanie i apanie wyjtkw ______________________________________________ 440 Blok try-catch _______________________________________________________________ 440 Instrukcja throw ______________________________________________________________ 441
Wdrwka wyjtku __________________________________________________________ 441 throw a return ____________________________________________________________ 441
Waciwy chwyt ________________________________________________________ 442 Kolejno blokw catch ________________________________________________________ 443
Dopasowywanie typu obiektu wyjtku ___________________________________________ 444
-
13
Szczegy przodem__________________________________________________________ 445 Zagniedone bloki try-catch ___________________________________________________ 446
Zapanie i odrzucenie ________________________________________________________ 448 Blok catch(...), czyli chwytanie wszystkiego ____________________________________ 448
Odwijanie stosu ____________________________________________________________ 449 Midzy rzuceniem a zapaniem_______________________________________________ 449
Wychodzenie na wierzch _________________________________________________ 449 Porwnanie throw z break i return _______________________________________________ 450 Wyjtek opuszcza funkcj_______________________________________________________ 450
Specyfikacja wyjtkw _______________________________________________________ 451 Kamstwo nie popaca________________________________________________________ 451
Niezapany wyjtek ____________________________________________________________ 453 Porzdki ______________________________________________________________ 454
Niszczenie obiektw lokalnych ___________________________________________________ 454 Wypadki przy transporcie _______________________________________________________ 454
Niedozwolone rzucenie wyjtku ________________________________________________ 454 Strefy bezwyjtkowe ________________________________________________________ 455 Skutki wypadku ____________________________________________________________ 456
Zarzdzanie zasobami w obliczu wyjtkw _____________________________________ 456 Opakowywanie _________________________________________________________ 458
Destruktor wskanika? ________________________________________________________ 459 Sprytny wskanik _____________________________________________________________ 459 Nieco uwag __________________________________________________________________ 461
Rne typy wskanikw ______________________________________________________ 461 Uywajmy tylko tam, gdzie to konieczne _________________________________________ 461
Co ju zrobiono za nas___________________________________________________ 461 Klasa std::auto_ptr __________________________________________________________ 461 Pliki w Bibliotece Standardowej___________________________________________________ 462
Wykorzystanie wyjtkw _____________________________________________________ 463 Wyjtki w praktyce________________________________________________________ 463
Projektowanie klas wyjtkw ______________________________________________ 464 Definiujemy klas _____________________________________________________________ 464 Hierarchia wyjtkw ___________________________________________________________ 465
Organizacja obsugi wyjtkw _____________________________________________ 466 Umiejscowienie blokw try i catch _______________________________________________ 466
Kod warstwowy_____________________________________________________________ 466 Podawanie bdw wyej _____________________________________________________ 467 Dobre wyporodkowanie______________________________________________________ 467
Chwytanie wyjtkw w blokach catch _____________________________________________ 468 Szczegy przodem - druga odsona_____________________________________________ 468 Lepiej referencj____________________________________________________________ 469
Uwagi oglne ____________________________________________________________ 469 Korzyci ze stosowania wyjtkw __________________________________________ 469
Informacja o bdzie w kadej sytuacji _____________________________________________ 469 Uproszczenie kodu ____________________________________________________________ 470 Wzrost niezawodnoci kodu _____________________________________________________ 470
Naduywanie wyjtkw __________________________________________________ 471 Nie uywajmy ich tam, gdzie wystarcz inne konstrukcje ______________________________ 471 Nie uywajmy wyjtkw na si __________________________________________________ 471
Podsumowanie _____________________________________________________________ 472 Pytania i zadania _________________________________________________________ 472
Pytania _______________________________________________________________ 472 wiczenia _____________________________________________________________ 472
Szablony ____________________________________________________ 473 Podstawy _________________________________________________________________ 474
Idea szablonw___________________________________________________________ 474 ciso C++ powodem blu gowy _________________________________________ 474
Dwa typowe problemy__________________________________________________________ 474 Problem 1: te same funkcje dla rnych typw ____________________________________ 474 Problem 2: klasy operujce na dowolnych typach danych ____________________________ 475
Moliwe rozwizania ___________________________________________________________ 475 Wykorzystanie preprocesora __________________________________________________ 475 Uywanie oglnych typw ____________________________________________________ 475
Szablony jako rozwizanie ________________________________________________ 476 Kod niezaleny od typu _________________________________________________________ 476 Kompilator to potrafi ___________________________________________________________ 476
Skadnia szablonu___________________________________________________________ 476
-
14
Co moe by szablonem ______________________________________________________ 477 Szablony funkcji __________________________________________________________ 478
Definiowanie szablonu funkcji _____________________________________________ 478 Podstawowa definicja szablonu funkcji _____________________________________________ 478
Stosowalno definicji________________________________________________________ 479 Parametr szablonu uyty w ciele funkcji__________________________________________ 479 Parametr szablonu i parametr funkcji____________________________________________ 480 Kilka parametrw szablonu ___________________________________________________ 480
Specjalizacja szablonu funkcji____________________________________________________ 481 Wyjtkowy przypadek _______________________________________________________ 482 Ciekawostka: specjalizacja czciowa szablonu funkcji ______________________________ 482
Wywoywanie funkcji szablonowej __________________________________________ 483 Jawne okrelenie typu__________________________________________________________ 484
Wywoywanie konkretnej wersji funkcji szablonowej ________________________________ 484 Uycie wskanika na funkcj szablonow_________________________________________ 484
Dedukcja typu na podstawie argumentw funkcji_____________________________________ 485 Jak to dziaa _______________________________________________________________ 485 Dedukcja przy wykorzystaniu kilku parametrw szablonu ____________________________ 486
Szablony klas ____________________________________________________________ 487 Definicja szablonu klas___________________________________________________ 487
Prosty przykad tablicy _________________________________________________________ 488 Definiujemy szablon _________________________________________________________ 489 Implementacja metod poza definicj ____________________________________________ 490 Korzystanie z tablicy_________________________________________________________ 491
Dziedziczenie i szablony klas_____________________________________________________ 492 Dziedziczenie klas szablonowych _______________________________________________ 492 Dziedziczenie szablonw klas __________________________________________________ 493
Deklaracje w szablonach klas ____________________________________________________ 494 Aliasy typedef _____________________________________________________________ 494 Deklaracje przyjani _________________________________________________________ 495 Szablony funkcji skadowych __________________________________________________ 495
Korzystanie z klas szablonowych ___________________________________________ 497 Tworzenie obiektw____________________________________________________________ 497
Stwarzamy obiekt klasy szablonowej ____________________________________________ 497 Co si dzieje, gdy tworzymy obiekt szablonu klasy _________________________________ 498
Funkcje operujce na obiektach klas szablonowych ___________________________________ 500 Specjalizacje szablonw klas ______________________________________________ 501
Specjalizowanie szablonu klasy___________________________________________________ 501 Wasna klasa specjalizowana __________________________________________________ 501 Specjalizacja metody klasy____________________________________________________ 503
Czciowa specjalizacja szablonu klasy_____________________________________________ 504 Problem natury tablicowej ____________________________________________________ 504 Rozwizanie: przypadek szczeglniejszy, ale nie za bardzo___________________________ 504
Domylne parametry szablonu klasy_______________________________________________ 506 Typowy typ________________________________________________________________ 506 Skorzystanie z poprzedniego parametru _________________________________________ 508
Wicej informacji ___________________________________________________________ 508 Parametry szablonw ______________________________________________________ 508
Typy _________________________________________________________________ 509 Przypominamy banalny przykad__________________________________________________ 509 class zamiast typename________________________________________________________ 510
Stae_________________________________________________________________ 510 Uycie parametrw pozatypowych ________________________________________________ 510
Przykad szablonu klasy ______________________________________________________ 511 Przykad szablonu funkcji _____________________________________________________ 512 Dwie wartoci, dwa rne typy_________________________________________________ 512
Ograniczenia dla parametrw pozatypowych ________________________________________ 513 Wskaniki jako parametry szablonu _____________________________________________ 513 Inne restrykcje _____________________________________________________________ 514
Szablony parametrw ___________________________________________________ 514 Idc za potrzeb ______________________________________________________________ 514
Dodatkowy parametr: typ wewntrznej tablicy ____________________________________ 515 Drobna niedogodno________________________________________________________ 516
Deklarowanie szablonowych parametrw szablonw __________________________________ 516 Problemy z szablonami_____________________________________________________ 517
Uatwienia dla kompilatora________________________________________________ 517 Nawiasy ostre ________________________________________________________________ 518
Nieoczywisty przykad _______________________________________________________ 518 Ciekawostka: dlaczego tak si dzieje ____________________________________________ 518
Nazwy zalene________________________________________________________________ 519
-
15
Sowo kluczowe typename ____________________________________________________ 520 Ciekawostka: konstrukcje ::template, .template i ->template ______________________ 521
Organizacja kodu szablonw ______________________________________________ 522 Model wczania ______________________________________________________________ 522
Zwyky kod ________________________________________________________________ 523 Prbujemy zastosowa szablony _______________________________________________ 523 Rozwizanie - istota modelu wczania __________________________________________ 524
Konkretyzacja jawna___________________________________________________________ 525 Instrukcje jawnej konkretyzacji ________________________________________________ 525 Wady i zalety konkretyzacji jawnej _____________________________________________ 525
Model separacji _______________________________________________________________ 526 Szablony eksportowane ______________________________________________________ 526 Nie ma ry bez kolcw ______________________________________________________ 527 Wsppraca modelu wczania i separacji_________________________________________ 527
Zastosowania szablonw _____________________________________________________ 529 Zastpienie makrodefinicji __________________________________________________ 529
Szablon funkcji i makro __________________________________________________ 529 Pojedynek na szczycie ___________________________________________________ 530
Starcie drugie: problem dopasowania tudzie wydajnoci ______________________________ 530 Jak zadziaa szablon _________________________________________________________ 530 Jak zadziaa makro __________________________________________________________ 531 Wynik ____________________________________________________________________ 531
Starcie trzecie: problem rozwinicia albo poprawnoci_________________________________ 531 Jak zadziaa szablon _________________________________________________________ 531 Jak zadziaa makro __________________________________________________________ 532 Wynik ____________________________________________________________________ 532
Konkluzje____________________________________________________________________ 532 Struktury danych _________________________________________________________ 532
Krotki ________________________________________________________________ 533 Przykad pary ________________________________________________________________ 533
Definicja szablonu___________________________________________________________ 533 Pomocna funkcja ___________________________________________________________ 534 Dalsze usprawnienia_________________________________________________________ 535
Trjki i wysze krotki __________________________________________________________ 536 Pojemniki _____________________________________________________________ 537
Przykad klasy kontenera - stos __________________________________________________ 538 Czym jest stos _____________________________________________________________ 538 Definicja szablonu klasy ______________________________________________________ 538 Korzystanie z szablonu _______________________________________________________ 539
Programowanie oglne _________________________________________________________ 540 Podsumowanie _____________________________________________________________ 540
Pytania i zadania _________________________________________________________ 541 Pytania _______________________________________________________________ 541 wiczenia _____________________________________________________________ 541
INNE _____________________________________________ 543
Indeks ______________________________________________________ 545
Licencja GNU Wolnej Dokumentacji ________________________________ 551 0. Preambua ______________________________________________________________ 551 1. Zastosowanie i definicje ____________________________________________________ 551 2. Kopiowanie dosowne ______________________________________________________ 552 3. Kopiowanie ilociowe ______________________________________________________ 553 4. Modyfikacje _____________________________________________________________ 553 5. czenie dokumentw _____________________________________________________ 555 6. Zbiory dokumentw _______________________________________________________ 555 7. Zestawienia z pracami niezalenymi __________________________________________ 555 8. Tumaczenia _____________________________________________________________ 556 9. Wyganicie _____________________________________________________________ 556 10. Przysze wersje Licencji ___________________________________________________ 556
Zacznik: Jak zastosowa t Licencj do swojego dokumentu? _____________________ 556
-
1 PODSTAWY
PROGRAMOWANIA
-
1 KRTKO O
PROGRAMOWANIU
Programy nie spadaj z nieba, najpierw tym niebem potrz trzeba.
gemGreg Rozpoczynamy zatem nasz kurs programowania gier. Zanim jednak napiszesz swojego wasnego Quakea, Warcrafta czy te inny wielki przebj, musisz nauczy si tworzenia programw (gry to przecie te programy, prawda?) czyli programowania. Jeszcze niedawno czynno ta bya traktowana na poy mistycznie: oto bowiem programista (czytaj jajogowy) wpisuje jakie dziwne cigi liter i numerkw, a potem w niemal magiczny sposb zamienia je w edytor tekstu, kalkulator czy wreszcie gr. Obecnie obraz ten nie przystaje ju tak bardzo do rzeczywistoci, a tworzenie programw jest prostsze ni jeszcze kilkanacie lat temu. Nadal jednak wiele zaley od umiejtnoci samego kodera oraz jego dowiadczenia, a zyskiwanie tyche jest kwesti dugiej pracy i realizacji wielu projektw. Nagrod za ten wysiek jest moliwo urzeczywistnienia dowolnego praktycznie pomysu i wielka satysfakcja. Czas wic przyjrze si, jak powstaj programy.
Krok za krokiem Wikszo aplikacji zostaa stworzona do realizacji jednego, konkretnego, cho obszernego zadania. Przykadowo, Notatnik potrafi edytowa pliki tekstowe, Winamp odtwarza muzyk, a Paint tworzy rysunki.
Screen 1. Gwnym zadaniem Winampa jest odtwarzanie plikw muzycznych
Moemy wic powiedzie, e gwn funkcj kadego z tych programw bdzie odpowiednio edycja plikw tekstowych, odtwarzanie muzyki czy tworzenie rysunkw. Funkcj t mona jednak podzieli na mniejsze, bardziej szczegowe. I tak Notatnik potrafi otwiera i zapisywa pliki, drukowa je i wyszukiwa w nich tekst. Winamp za pozwala nie tylko odtwarza utwory, ale te ukada z nich playlisty.
-
Podstawy programowania 20
Idc dalej, moemy dotrze do nastpnych, coraz bardziej szczegowych funkcji danego programu. Przypominaj one wic co w rodzaju drzewka, ktre pozwala nam niejako rozoy dan aplikacj na czci.
Schemat 1. Podzia programu Notatnik na funkcje skadowe
Zastanawiasz si pewnie, na jak drobne czci moemy w ten sposb dzieli programy. Innymi sowy, czy dojdziemy wreszcie do takiego elementu, ktry nie da si rozdzieli na mniejsze. Spiesz z odpowiedzi, i oczywicie tak w przypadku Notatnika bylimy zreszt bardzo blisko. Czynno zatytuowana Otwieranie plikw wydaje si by ju jasno okrelona. Kiedy wybieramy z menu Plik programu pozycj Otwrz, Notatnik robi kilka rzeczy: najpierw pokazuje nam okno wyboru pliku. Gdy ju zdecydujemy si na jaki, pyta nas, czy chcemy zachowa zmiany w ju otwartym dokumencie (jeeli jakiekolwiek zmiany rzeczywicie poczynilimy). W przypadku, gdy je zapiszemy w innym pliku lub odrzucimy, program przystpi do odczytania zawartoci danego przez nas dokumentu i wywietli go na ekranie. Proste, prawda? :) Przedstawiona powyej charakterystyka czynnoci otwierania pliku posiada kilka znaczcych cech: okrela dokadnie kolejne kroki wykonywane przez program wskazuje rne moliwe warianty sytuacji i dla kadego z nich przewiduje
odpowiedni reakcj Pozwalaj one nazwa niniejszy opis algorytmem. Algorytm to jednoznacznie okrelony sposb, w jaki program komputerowy realizuje jak elementarn czynno.1 Jest to bardzo wane pojcie. Myl o algorytmie jako o czym w rodzaju przepisu albo instrukcji, ktra mwi aplikacji, co ma zrobi gdy napotka tak czy inn sytuacj. Dziki swoim algorytmom programy wiedz co zrobi po naciniciu przycisku myszki, jak zapisa, otworzy czy wydrukowa plik, jak wywietli poprawnie stron WWW, jak odtworzy utwr w formacie MP3, jak rozpakowa archiwum ZIP i oglnie jak wykonywa zadania, do ktrych zostay stworzone. Jeli nie podoba ci si, i cay czas mwimy o programach uytkowych zamiast o grach, to wiedz, e gry take dziaaj w oparciu o algorytmy. Najczciej s one nawet znacznie
1 Nie jest to cisa matematyczna definicja algorytmu, ale na potrzeby programistyczne nadaje si bardzo dobrze :)
Edycja plikw tekstowych
Otwieranie i zapisywanie plikw
Drukowanie plikw
Wyszukiwanie i zamiana tekstu
Otwieranie plikw
Zapisywanie plikw
Wyszukiwanie tekstu w pliku
Zamiana danego tekstu na inny
-
Krtko o programowaniu 21
bardziej skomplikowane od tych wystpujcych w uywanych na co dzie aplikacjach. Czy nie atwiej narysowa prost tabelk z liczbami ni skomplikowan scen trjwymiarow? :) Z tego wanie powodu wymylanie algorytmw jest wan czci pracy twrcy programw, czyli programisty. Wanie t drog koder okrela sposb dziaania (zachowanie) pisanego programu. Podsumujmy: w kadej aplikacji moemy wskaza wykonywane przez ni czynnoci, ktre z kolei skadaj si z mniejszych etapw, a te jeszcze z mniejszych itd. Zadania te realizowane s poprzez algorytmy, czyli przepisy okrelone przez programistw twrcw programw.
Jak rozmawiamy z komputerem? Wiemy ju, e programy dziaaj dziki temu, e programici konstruuj dla nich odpowiednie algorytmy. Poznalimy nawet prosty algorytm, ktry by moe jest stosowany jest przez program Notatnik do otwierania plikw tekstowych. Zauwa jednak, e jest on napisany w jzyku naturalnym to znaczy takim, jakim posuguj si ludzie. Chocia jest doskonale zrozumiay dla wszystkich, to ma jedn niezaprzeczaln wad: nie rozumie go komputer! Dla bezmylnej maszyny jest on po prostu zbyt niejednoznaczny i niejasny. Z drugiej strony, ju istniejce programy s przecie doskonale zrozumiae dla komputera i dziaaj bez adnych problemw. Jak to moliwe? Ot pecet te posuguje si pewnego rodzaju jzykiem. Chcc zobaczy prbk jego talentu lingwistycznego, wystarczy podejrze zawarto dowolnego pliku EXE. Co zobaczymy? Cig bezsensownych, chyba nawet losowych liter, liczb i innych znakw. On ma jednak sens, tyle e nam bardzo trudno pozna go w tej postaci. Po prostu jzyk komputera jest dla rwnowagi zupenie niezrozumiay dla nas, ludzi :)
Screen 2. Tak wyglda plik EXE :-)
Jak poradzi sobie z tym, zdawaoby si nierozwizalnym, problemem? Jak radz sobie wszyscy twrcy oprogramowania, skoro budujc swoje programy musz przecie rozmawia z komputerem? Poniewa nie moemy peceta nauczy naszego wasnego jzyka i jednoczenie sami nie potrafimy porozumie si z nim w jego mowie, musimy zastosowa rozwizanie kompromisowe. Na pocztek ucilimy wic i przejrzycie zorganizujemy nasz opis algorytmw. W przypadku otwierania plikw w Notatniku moe to wyglda na przykad tak:
Algorytm Plik -> Otwrz Poka okno wyboru plikw Jeeli uytkownik klikn Anuluj, To Przerwij
-
Podstawy programowania 22
Jeeli poczyniono zmiany w aktualnym dokumencie, To Wywietl komunikat "Czy zachowa zmiany w aktualnym dokumencie?" z przyciskami Tak, Nie, Anuluj Sprawd decyzj uytkownika Decyzja Tak: wywoaj polecenie Plik -> Zapisz Decyzja Anuluj: Przerwij Odczytaj wybrany plik Wywietl zawarto pliku Koniec Algorytmu
Jak wida, sprecyzowalimy tu kolejne kroki wykonywane przez program tak aby wiedzia, co naley po kolei zrobi. Fragmenty zaczynajce si od Jeeli i Sprawd pozwalaj odpowiednio reagowa na rne sytuacje, takie jak zmiana decyzji uytkownika i wcinicie przycisku Anuluj. Czy to wystarczy, by komputer wykona to, co mu kaemy? Ot nie bardzo Chocia wprowadzilimy ju nieco porzdku, nadal uywamy jzyka naturalnego jedynie struktura zapisu jest bardziej cisa. Notacja taka, zwana pseudokodem, przydaje si jednak bardzo do przedstawiania algorytmw w czytelnej postaci. Jest znacznie bardziej przejrzysta oraz wygodniejsza ni opis w formie zwykych zda, ktre musiayby by najczciej wielokrotnie zoone i niezbyt poprawne gramatycznie. Dlatego te, kiedy bdziesz wymyla wasne algorytmy, staraj si uywa pseudokodu do zapisywania ich oglnego dziaania. No dobrze, wyglda to cakiem niele, jednak nadal nie potrafimy si porozumie z tym mao inteligentnym stworem, jakim jest nasz komputer. Wszystko dlatego, i nie wie on, w jaki sposb przetworzy nasz algorytm, napisany w powstaym ad hoc jzyku, do postaci zrozumiaych dla niego krzaczkw, ktre widziae wczeniej. Dla rozwizania tego problemu stworzono sztuczne jzyki o dokadnie okrelonej skadni i znaczeniu, ktre dziki odpowiednim narzdziom mog by zamieniane na kod binarny, czyli form zrozumia dla komputera. Nazywamy je jzykami programowania i to wanie one su do tworzenia programw komputerowych. Wiesz ju zatem, czego najpierw musisz si nauczy :) Jzyk programowania to forma zapisu instrukcji dla komputera i programw komputerowych, porednia midzy jzykiem naturalnym a kodem maszynowym. Program zapisany w jzyku programowania jest, podobnie jak nasz algorytm w pseudokodzie, zwykym tekstem. Podobiestwo tkwi rwnie w fakcie, e sam taki tekst nie wystarczy, aby napisan aplikacj uruchomi najpierw naley j zamieni w plik wykonywalny (w systemie Windows s to pliki z rozszerzeniem EXE). Czynno ta jest dokonywana w dwch etapach. Podczas pierwszego, zwanego kompilacj, program nazywany kompilatorem zamienia instrukcje jzyka programowania (czyli kod rdowy, ktry, jak ju mwilimy, jest po prostu tekstem) w kod maszynowy (binarny). Zazwyczaj na kady plik z kodem rdowym (zwany moduem) przypada jeden plik z kodem maszynowym. Kompilator program zamieniajcy kod rdowy, napisany w jednym z jzykw programowania, na kod maszynowy w postaci oddzielnych moduw. Drugi etap to linkowanie (zwane te konsolidacj lub po prostu czeniem). Jest to budowanie gotowego pliku EXE ze skompilowanych wczeniej moduw. Oprcz nich mog tam zosta wczone take inne dane, np. ikony czy kursory. Czyni to program zwany linkerem.
-
Krtko o programowaniu 23
Linker czy skompilowane moduy kodu i inne pliki w jeden plik wykonywalny, czyli program (w przypadku Windows plik EXE). Tak oto zdjlimy nimb magii z procesu tworzenia programu ;D Skoro kompilacja i linkowanie s przeprowadzane automatycznie, a programista musi jedynie wyda polecenie rozpoczcia tego procesu, to dlaczego nie pj dalej niech komputer na bieco tumaczy sobie program na swj kod maszynowy. Rzeczywicie, jest to moliwe powstao nawet kilka jzykw programowania dziaajcych w ten sposb (tak zwanych jzykw interpretowanych, przykadem jest choby PHP, sucy do tworzenia stron internetowych). Jednake ogromna wikszo programw jest nadal tworzona w tradycyjny sposb. Dlaczego? C jeeli w programowaniu nie wiadomo, o co chodzi, to na pewno chodzi o wydajno2 ;)) Kompilacja i linkowanie trwa po prostu dugo, od kilkudziesiciu sekund w przypadku niewielkich programw, do nawet kilkudziesiciu minut przy duych. Lepiej zrobi to raz i uywa szybkiej, gotowej aplikacji ni nie robi w ogle i czeka dwie minuty na rozwinicie menu podrcznego :DD Zatem czas na konkluzj i usystematyzowanie zdobytej wiedzy. Programy piszemy w jzykach programowania, ktre s niejako form komunikacji z komputerem i wydawania mu polece. S one nastpnie poddawane procesom kompilacji i konsolidacji, ktre zamieniaj zapis tekstowy w binarny kod maszynowy. W wyniku tych czynnoci powstaje gotowy plik wykonywalny, ktry pozwala uruchomi program.
Jzyki programowania
Przegld najwaniejszych jzykw programowania Obecnie istnieje bardzo, bardzo wiele jzykw programowania. Niektre przeznaczono do konkretnych zastosowa, na przykad sieci neuronowych, inne za s narzdziami oglnego przeznaczenia. Zazwyczaj wiksze korzyci zajmuje znajomo tych drugich, dlatego nimi wanie si zajmiemy. Od razu musz zaznaczy, e mimo to nie ma czego takiego jak jzyk, ktry bdzie dobry do wszystkiego. Spord jzykw oglnych niektre s nastawione na szybko, inne na rozmiar kodu, jeszcze inne na przejrzysto itp. Jednym sowem, panuje totalny rozgardiasz ;) Naley koniecznie odrnia jzyki programowania od innych jzykw uywanych w informatyce. Na przykad HTML jest jzykiem opisu, gdy za jego pomoc definiujemy jedynie wygld stron WWW (wszelkie interaktywne akcje to ju domena JavaScriptu). Inny rodzaj to jzyki zapyta w rodzaju SQL, suce do pobierania danych z rnych rde (na przykad baz danych). Niepoprawne jest wic (popularne skdind) stwierdzenie programowa w HTML. Przyjrzyjmy si wic najwaniejszym uywanym obecnie jzykom programowania:
1. Visual Basic Jest to nastpca popularnego swego czasu jzyka BASIC. Zgodnie z nazw (basic znaczy prosty), by on przede wszystkim atwy do nauki. Visual Basic pozwala na tworzenie programw dla rodowiska Windows w sposb wizualny, tzn. poprzez konstruowanie okien z takich elementw jak przyciski czy pola tekstowe. Jzyk ten posiada dosy spore moliwoci, jednak ma rwnie jedn, za to bardzo
2 Niektrzy powiedz, e o niezawodno, ale to ju kwestia osobistych priorytetw :)
-
Podstawy programowania 24
powan wad. Programy w nim napisane nie s kompilowane w caoci do kodu maszynowego, ale interpretowane podczas dziaania. Z tego powodu s znacznie wolniejsze od tych kompilowanych cakowicie. Obecnie Visual Basic jest jednym z jzykw, ktry umoliwia tworzenie aplikacji pod lansowan przez Microsoft platform .NET, wic pewnie jeszcze o nim usyszymy :)
Screen 3. Kod przykadowego projektu w Visual Basicu
2. Object Pascal (Delphi)
Delphi z kolei wywodzi si od popularnego jzyka Pascal. Podobnie jak VB jest atwy do nauczenia, jednake oferuje znacznie wiksze moliwoci zarwno jako jzyk programowania, jak i narzdzie do tworzenia aplikacji. Jest cakowicie kompilowany, wic dziaa tak szybko, jak to tylko moliwe. Posiada rwnie moliwo wizualnego konstruowania okien. Dziki temu jest to obecnie chyba najlepsze rodowisko do budowania programw uytkowych.
Screen 4.Tworzenie aplikacji w Delphi
3. C++
C++ jest teraz chyba najpopularniejszym jzykiem do zastosowa wszelakich. Powstao do niego bardzo wiele kompilatorw pod rne systemy operacyjne i dlatego jest uwaany za najbardziej przenony. Istnieje jednak druga strona medalu mnogo tych narzdzi prowadzi do niewielkiego rozgardiaszu i pewnych
-
Krtko o programowaniu 25
trudnoci w wyborze ktrego z nich. Na szczcie sam jzyk zosta w 1997 roku ostatecznie ustandaryzowany. O C++ nie mwi si zwykle, e jest atwy by moe ze wzgldu na dosy skondensowan skadni (na przykad odpowiednikiem pascalowych sw begin i end s po prostu nawiasy klamrowe { i }). To jednak dosy powierzchowne przekonanie, a sam jzyk jest spjny i logiczny. Jeeli chodzi o moliwoci, to w przypadku C++ s one bardzo due w sumie mona powiedzie, e nieco wiksze ni Delphi. Jest on te chyba najbardziej elastyczny niejako dopasowuje si do preferencji programisty.
4. Java Ostatnimi czasy Java staa si niemal czci kultury masowej wystarczy choby wspomnie o telefonach komrkowych i przeznaczonych do aplikacjach. Ilustruje to dobrze gwny cel Javy, a mianowicie przenono i to nie kodu, lecz skompilowanych programw! Osignito to poprzez kompilacj do tzw. bytecode, ktry jest wykonywany w ramach specjalnej maszyny wirtualnej. W ten sposb, program w Javie moe by uruchamiany na kadej platformie, do ktrej istnieje maszyna wirtualna Javy a istnieje prawie na wszystkich, od Windowsa przez Linux, OS/2, QNX, BeOS, palmtopy czy wreszcie nawet telefony komrkowe. Z tego wanie powodu Java jest wykorzystywana do pisania niewielkich programw umieszczanych na stronach WWW, tak zwanych apletw. Cen za t przenono jest rzecz jasna szybko bytecode Javy dziaa znacznie wolniej ni zwyky kod maszynowy, w dodatku jest strasznie pamicioerny. Poniewa jednak zastosowaniem tego jzyka nie s wielkie i wymagajce aplikacje, lecz proste programy, nie jest to a tak wielki mankament. Skadniowo Java bardzo przypomina C++.
Screen 5. Krzywka w formie apletu Javy
5. PHP
PHP (skrt od Hypertext Preprocessor) jest jzykiem uywanym przede wszystkim w zastosowaniach internetowych, dokadniej na stronach WWW. Pozwala doda im znacznie wiksz funkcjonalno ni ta oferowana przez zwyky HTML. Obecnie miliony serwisw wykorzystuje PHP du rol w tym sukcesie ma zapewne jego licencja, oparta na zasadach Open Source (czyli brak ogranicze w rozprowadzaniu i modyfikacji). Moliwoci PHP s cakiem due, nie mona tego jednak powiedzie o szybkoci jest to jzyk interpretowany. Jednake w przypadku gwnego zastosowania PHP, czyli obsudze serwisw internetowych, nie ma ona wikszego znaczenia czas
-
Podstawy programowania 26
wczytywania strony WWW to przecie w wikszoci czas przesyania gotowego kodu HTML od serwera do odbiorcy. Jeeli chodzi o skadni, to troch przypomina ona C++. Kod PHP mona jednak swobodnie przeplata znacznikami HTML. Z punktu widzenia programisty gier jzyk ten jest w zasadzie zupenie bezuyteczny (chyba e kiedy sam bdziesz wykonywa oficjaln stron internetow swojej wielkiej produkcji ;D), wspominam o nim jednak ze wzgldu na bardzo szerokie grono uytkownikw, co czyni go jednym z waniejszych jzykw programowania.
Screen 6. Popularny skrypt forw dyskusyjnych, phpBB, take dziaa w oparciu o PHP
To oczywicie nie wszystkie jzyki jak ju pisaem, jest ich cae mnstwo. Jednake w ogromnej wikszoci przypadkw gwn rnic midzy nimi jest skadnia, a wic sprawa mao istotna (szczeglnie, jeeli dysponuje si dobr dokumentacj :D). Z tego powodu poznanie jednego z nich bardzo uatwia nauk nastpnych po prostu im wicej jzykw ju znasz, tym atwiej uczysz si nastpnych :)
Brzemienna w skutkach decyzja Musimy zatem zdecydowa, ktrego jzyka bdziemy si uczy, aby zrealizowa nasz nadrzdny cel, czyli poznanie tajnikw programowania gier. Sprecyzujmy wic wymagania wobec owego jzyka: programy w nim napisane musz by szybkie w takim wypadku moemy wzi
pod uwag jedynie jzyki cakowicie kompilowane do kodu maszynowego musi dobrze wsppracowa z rnorodnymi bibliotekami graficznymi, na przykad
DirectX powinien posiada due moliwoci i zapewnia gotowe, czsto uywane
rozwizania nie zaszkodzi te, gdy bdzie w miar prosty i przejrzysty :)
Jeeli uwzgldnimy wszystkie te warunki, to spord caej mnogoci jzykw programowania (w tym kilku przedstawionych wczeniej) zostaj nam a dwa Delphi oraz C++. Przygldajc si bliej Delphi, moemy zauway, i jest on przeznaczony przede wszystkim do programowania aplikacji uytkowych, ktre pozostaj przecie poza krgiem naszego obecnego zainteresowania :) Na plus mona jednak zaliczy prostot i przejrzysto jzyka oraz jego bardzo du wydajno. Rwnie moliwoci Delphi s cakiem spore. Z kolei C++ zdaje si by bardziej uniwersalny. Dobrze rozumie si z wanymi dla nas bibliotekami graficznymi, jest take bardzo szybki i posiada due moliwoci. Skadnia z kolei jest raczej ekonomiczna i by moe nieco bardziej skomplikowana.
-
Krtko o programowaniu 27
Czybymy mieli zatem remis, a prawda leaa (jak zwykle) porodku? :) Ot niezupenie nie uwzgldnilimy bowiem wanego czynnika, jakim jest popularno danego jzyka. Jeeli jest on szeroko znany i uywany (do programowania gier), to z pewnoci istnieje o nim wicej przydatnych rde informacji, z ktrych mgby korzysta. Z tego wanie powodu Delphi jest gorszym wyborem, poniewa ogromna wikszo dokumentacji, artykuw, kursw itp. dotyczy jzyka C++. Wystarczy chociaby wspomnie, i Microsoft nie dostarcza nar