kurs c od zera do gier kodera

558
Karol Kuczmarski (Xion) Od zera do gier kodera megatutorial

Upload: filipo55

Post on 26-Nov-2015

197 views

Category:

Documents


4 download

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