"Programowanie w języku C++"

Identyfikator Librowy: 286581

Spis treści

Przedmowa 14

Podziękowania 16

Podziękowania do wydania polskiego 18

Wykaz skrótów 20

1. Wprowadzenie 22

1.1. Struktura książki 28

1.2. Konwencje formatowania 31

1.3. O kodzie i projektach 33

2. Wprowadzenie do programowania 36

2.1. Model sprzętowy 36

2.2. Ekosystem tworzenia oprogramowania 40

2.3. Etapy tworzenia oprogramowania 43

2.4. Reprezentacja i uruchamianie algorytmów 45

2.4.1. Reprezentowanie algorytmów 45

2.4.2. Korzystanie z kompilatorów dostępnych w Internecie 47

2.4.3. Struktura programu w C++ 49

2.4.4. Analiza kodu 50

2.4.5. (•) Budowa linuksowej postaci wykonywalnej 51

2.5. Przykładowy projekt – kalkulator procentu składanego 54

2.5.1. Analiza procentu składanego 55

2.5.2. Implementacja kalkulatora procentu składanego 56

2.5.3. Budowanie i uruchamianie oprogramowania 59

2.6. Przykładowy projekt – zliczanie wystąpień znaków w tekście 60

2.6.1. Analiza problemu i implementacja 60

2.6.2. Uruchomienie kodu C++ za pomocą kompilatora dostępnego w Internecie 62

2.6.3. Kod histogramu – wyjaśnienie 63

2.7. Podsumowanie 66

Pytania i ćwiczenia 66

3. Podstawy C++ 70

3.1. Stałe i zmienne – wbudowane typy danych, ich zakres oraz inicjalizacja 70

3.2. Przykładowy projekt – zbieranie ocen studentów 81

3.3. Nasz przyjaciel debugger 85

3.4. Podstawowa struktura danych – std::vector 88

3.5. Przykładowy projekt – implementowanie macierzy w postaci wektora wektorów 94

3.6. Specjalny wektor do przechowywania tekstu – std::string 96

3.7. Słowo kluczowe auto oraz decltype do automatycznej dedukcji typu 102

3.8. Popularne algorytmy standardowe 105

3.9. Struktury: zbieranie obiektów różnego typu 109

3.10. (•) Tablice o stałym rozmiarze 114

3.10.1. Wielowymiarowe tablice o stałym rozmiarze 116

3.11. Referencje 118

3.12. (•) Wskaźniki 122

3.12.1. Dostęp do obiektów za pomocą wskaźników 122

3.13. Instrukcje 127

3.13.1. Bloki instrukcji oraz dostęp do zmiennych – rola nawiasów klamrowych 128

3.13.2. Instrukcje C++ 130

3.13.2.1. Instrukcje warunkowe 130

3.13.2.2. Instrukcje pętli 136

3.13.2.3. Instrukcje pomocnicze – continue oraz break 141

3.13.2.4. Instrukcja goto 143

3.13.2.5. Strukturalna obsługa wyjątków – instrukcja try-catch 143

3.14. Funkcje 145

3.14.1. Anatomia funkcji w C++ 146

3.14.2. Przekazywanie argumentów do i z funkcji 151

3.14.2.1. Przekazywanie argumentów przez kopię (semantyka wartości) 152

3.14.2.2. Pośrednie przekazywanie argumentów przez referencję 154

3.14.2.3. (•) Przekazywanie przez wskaźnik 156

3.14.3. Mechanizm wywoływania funkcji i funkcje wbudowane 158

3.14.4. Funkcje rekurencyjne i stos wywołań 160

3.14.5. Przeciążanie funkcji – rozwiązywanie widoczności za pomocą przestrzeni nazw 161

3.14.6. Funkcje lambda 164

3.14.7. (•) Więcej na temat funkcji lambda 169

3.14.8. (•) Wskaźniki do funkcji 175

3.14.9. (•) Funkcje w środowisku obiektowym 177

3.15. Przykładowy projekt – opakowywanie obiektów strukturą z konstruktorem 179

3.15.1. EMatrix w środowisku obiektowym 182

3.15.2. Podstawowe operacje z użyciem EMatrix 183

3.15.3. Operacje wejścia i wyjścia na EMatrix 185

3.15.4. Proste operacje matematyczne na macierzy EMatrix 187

3.15.5. Organizowanie plików projektu i uruchamianie aplikacji 189

3.15.6. Rozszerzanie inicjalizacji macierzy za pomocą prostego generatora liczb losowych 192

3.16. Przykładowy projekt – reprezentowanie równań kwadratowych 194

3.16.1. Definicja klasy do reprezentowania wielomianów kwadratowych 195

3.16.2. Implementacja składowych TQuadEq 195

3.16.3. TQuadEq w akcji 206

3.17. Przykładowy projekt – krotki i powiązania strukturalne do konwertowania liczb rzymskich 207

3.17.1. Więcej o std::tuple i powiązaniu strukturalnym 211

3.17.2. Jak napisać test jednostkowy oprogramowania 213

3.17.3. Automatyzowanie testów jednostkowych – z użyciem standardowej biblioteki liczb losowych 214

3.18. Projekt przykładowy – tworzenie komponentu kalkulatora walutowego 217

3.18.1. Analiza problemu wymiany walut 217

3.18.2. Projekt oprogramowania CurrencyCalc 220

3.18.3. Klasa TCurrency reprezentująca rekordy walut 221

3.18.3.1. Manipulatory wejścia/wyjścia C++ 224

3.18.4. Klasa TCurrencyExchanger do wymiany walut 226

3.18.5. Łączenie wszystkiego w całość – kompletny program wymiany walut 231

3.19. Operatory 237

3.19.1. Podsumowanie operatorów C++ 240

3.19.2. Dalsze uwagi na temat operatorów 264

3.20. Podsumowanie 265

Pytania i ćwiczenia 266

4. Zgłębianie programowania obiektowego 270

4.1. Podstawowe reguły oraz filozofia projektowania i programowania obiektowego 271

4.2. Anatomia klasy 275

4.2.1. Konwencja nazewnictwa i samodokumentujący się kod 278

4.3. Reguły uzyskiwania dostępu do składowych klasy 278

4.4. Przykładowy projekt – klasa TComplex do przeciążania operatorów 281

4.4.1. Definicja klasy TComplex 282

4.4.2. Definicja składowych klasy TComplex 288

4.4.3. Funkcje testujące dla klasy TComplex 290

4.5. Więcej o referencjach 294

4.5.1. Referencje prawostronne i przekazywania 294

4.5.2. Referencje kontra wskaźniki 299

4.5.3. Pułapki z referencjami 300

4.6. Przykładowy projekt – opanowywanie składowych klasy z użyciem klasy TheCube 302

4.6.1. Automatyczna kontra jawna definicja konstruktorów 303

4.6.2. Układ i semantyka obiektu TheCube 313

4.6.3. Semantyka kopiowania płytkiego i głębokiego 314

4.6.4. Semantyka konstruktora przenoszącego i przypisania przenoszącego 315

4.6.5. Implementacja operatorów strumieniowania dla TheCube 317

4.6.6. Sprawdzanie TheCube 319

4.7. Projekt przykładowy – przenoszenie EMatrix do klasy 322

4.7.1. Definicja klasy EMatrix 323

4.7.2. Implementacja operatorów strumieniowania klasy 325

4.7.3. Implementacja operatorów arytmetycznych 329

4.7.4. Testowanie operacji na macierzach 331

4.8. Wprowadzenie do szablonów i programowania uogólnionego 333

4.8.1. Uogólnianie klasy przy użyciu szablonów 333

4.8.2. (•) Specjalizacje szablonów 338

4.8.3. Funkcje szablonowe i sprawdzanie typu 339

4.8.4. Przykładowy projekt – projektowanie klas szablonowych przy użyciu TStack 341

4.8.4.1. Projekt i implementacja klasy TStackFor 343

4.8.4.2. Testowanie TStack 346

4.8.5. Szablonowe funkcje składowe 348

4.9. Relacje między klasami – „zna”, „ma” oraz „jest” 351

4.10. Przykładowy projekt – rozszerzanie funkcjonalności poprzez dziedziczenie klas z użyciem TComplexQuadEq 358

4.11. Funkcje wirtualne i polimorfizm 364

4.12. (•) Więcej na temat mechanizmu wirtualnego 371

4.13. (•) Ciekawie rekurencyjny wzorzec szablonu i statyczny polimorfizm 374

4.14. (•) Klasy domieszki 378

4.15. Przykładowy projekt – klasa TLongNumberFor do wydajnego przechowywania liczb o dowolnej długości 380

4.15.1. Reprezentacja Binary-Coded Decimal 382

4.15.2. Kolejność bajtów 382

4.15.3. Definicja klasy TLongNumberFor 383

4.15.3.1. Operacje konwersji typu 386

4.15.3.2. Funkcja testująca TLongNumberFor 392

4.15.4. Projektowanie klas dla numeru PESEL 393

4.15.4.1. Agregowanie klasy PESEL 394

4.15.4.2. Odziedziczona klasa PESEL 396

4.15.4.3. Organizacja projektu LongNumber 397

4.15.5. (•) Rozszerzanie funkcjonalności klasy TLongNumberFor z użyciem wzorca pełnomocnika 399

4.15.5.1. Definicja klasy Proxy 400

4.15.5.2. Testowanie funkcjonalności klasy TLongNumberFor z użyciem wzorca pełnomocnika 403

4.16. Silne typy 404

4.17. Podsumowanie 406

Pytania i ćwiczenia 406

5. Zarządzanie pamięcią 410

5.1. Rodzaje magazynów danych 410

5.2. Dynamiczny przydział pamięci – jak unikać wycieków pamięci 417

5.2.1. Wprowadzenie do inteligentnych wskaźników i zarządzania zasobami 420

5.2.1.1. RAII i odwijanie stosu 421

5.3. Inteligentne wskaźniki – omówienie z przykładami 422

5.3.1. (•) Więcej o std::unique_ptr 422

5.3.1.1. Kontekst użycia std::unique_ptr 422

5.3.1.2. Wzorzec projektowy metody wytwórczej 436

5.3.1.3. Niestandardowe usuwanie unique_ptr 439

5.3.1.4. Konstrukcje do unikania podczas korzystania z unique_ptr 440

5.3.2. (•) Więcej o shared_ptr i weak_ptr 441

5.4. Podsumowanie 444

Pytania i ćwiczenia 444

6. Zaawansowane programowanie obiektowe 446

6.1. Obiekty funkcyjne 446

6.2. Projekt przykładowy – rozszerzanie o wyszukiwanie walut w plikach XML oraz korzystanie z maszyny stanów i wyrażeń regularnych za pomocą biblioteki regex 453

6.2.1. Dopasowywanie do wzorca za pomocą biblioteki wyrażeń regularnych 454

6.2.2. Wzorzec maszyny stanów 456

6.2.3. Implementowanie klasy rozszerzonej 457

6.2.4. Rozszerzenie projektu – wczytywanie informacji o walutach z internetu 464

6.2.5. Uruchamianie rozszerzonej wersji CurrencyCalc 470

6.2.6. Tworzenie biblioteki statycznej 475

6.2.7. System plików C++ 476

6.2.8. Interfejs użytkownika 485

6.2.8.1. Definicja klasy CC_GUI 486

6.2.8.2. Definicje składowych klasy CC_GUI i mechanizm wywołania zwrotnego 490

6.2.8.3. Uruchamianie aplikacji z GUI 498

6.3. Zegary systemowe i pomiar czasu 499

6.4. (•) Mierzenie czasu wykonywania funkcji 503

6.5. Klasa Range 506

6.5.1. Programowanie funkcyjne i biblioteka std::ranges 511

6.6. Przykładowy projekt – parsowanie wyrażeń 512

6.6.1. Definiowanie wyrażeń języka i zasad gramatyki formalnej 513

6.6.2. Projektowanie biblioteki przetwarzania wyrażeń 516

6.6.3. Pierwszy interpreter poleceń 517

6.6.4. Budowanie drzewa składniowego z użyciem wzorca projektowego kompozytu 521

6.6.4.1. Wzorzec projektowy kompozytu do definiowania węzłów drzewa 522

6.6.4.2. Implementacja hierarchii TNode i współpraca z wizytatorami 523

6.6.4.3. Implementacja klasy ValueLeafNode 526

6.6.4.4. Implementacja klasy BinOperator 527

6.6.4.5. Implementacja klasy PlusOperator 529

6.6.4.6. Głębokie kopiowanie obiektów węzła – mechanizm prototypowania 530

6.6.5. Interpreter do budowy drzew składniowych 532

6.6.6. Stos dla inteligentnych wskaźników 537

6.6.7. Przechodzenie po drzewach za pomocą wzorca projektowego wizytatora 541

6.6.7.1. Wizytator ewaluujący wyrażenie 544

6.6.7.2. Wizytator wypisujący wyrażenie 546

6.6.8. Testowanie interpreterów 548

6.6.9. Reprezentowanie wyrażeń na stosie w odwrotnej notacji polskiej 552

6.6.9.1. Odwrócona notacja polska 552

6.6.9.2. Algorytm do ewaluowania wyrażenia RPN 553

6.7. Podsumowanie 559

Pytania i ćwiczenia 559

7. Arytmetyka komputerowa 564

7.1. Reprezentacja wartości całkowitej 564

7.1.1. Algorytm konwersji podstawy 566

7.1.2. Reprezentacje szesnastkowe i ósemkowe 567

7.1.3. Dodawanie binarne 568

7.1.4. Wartości ujemne i odejmowanie 569

7.2. Operacje przesunięcia binarnego 570

7.1.5. Flagi kontroli arytmetycznej 571

7.1.6. Reprezentowanie ułamków 574

7.2. Operacje przesunięcia binarnego 578

7.3. (•) Przykładowy projekt – model programowy dla reprezentacji stałoprzecinkowej 579

7.3.1. Liczby stałoprzecinkowe i ich arytmetyka 580

7.3.2. Definicja klasy FxFor 580

7.3.3. Wybrane metody klasy FxFor 588

7.3.4. Zastosowania dla FxFor 594

7.4. Reprezentacje liczb zmiennoprzecinkowych 597

7.4.1. Reprezentacja liczb w formacie zmiennoprzecinkowym 599

7.4.2. Rozkład liczb zmiennoprzecinkowych i konsekwencje obliczeniowe 603

7.4.3. (•) Błąd przybliżenia wartości rzeczywistej przy użyciu reprezentacji zmiennoprzecinkowej 607

7.4.4. Standard IEEE 754 dla arytmetyki zmiennoprzecinkowej 609

7.4.5. Standardowy model operacji zmiennoprzecinkowych 612

7.4.6. Obliczenia ze świadomością o błędach numerycznych 612

7.4.7. Przykładowy projekt – ewaluacja algorytmów sumujących 618

7.4.8. Przykładowy projekt – metoda Newtona do znajdywania miejsc zerowych funkcji 624

7.4.8.1. Funkcja do obliczania pierwiastka kwadratowego na podstawie iteracji Newtona 628

7.5. Podsumowanie 630

Pytania i ćwiczenia 631

8. Podstawy programowania równoległego 634

8.1. Podstawowe zagadnienia związane z obliczeniami równoległymi 634

8.2. Dodawanie równoległości do algorytmów standardowych 638

8.3. Uruchamianie zadań asynchronicznych 641

8.4. Zrównoleglanie za pomocą biblioteki OpenMP 644

8.4.1. Uruchamianie zespołu wątków i zapewnianie ochrony wyłącznego dostępu 645

8.4.2. Równoległa pętla for i operacje redukcji 647

8.4.3. Równoległość dla dużych ilości danych 650

8.5. Podsumowanie 659

Pytania i ćwiczenia 659

A.1. Dyrektywy preprocesora 662

Dodatek 662

A.2. Krótkie wprowadzenie do języka C 667

A.2.1. Tablice wbudowane 668

A.2.1.1. Wielowymiarowe tablice o stałym rozmiarze 671

A.2.2. Przekazywanie tablic do funkcji – funkcja main 672

A.2.3. Struktury C 677

A.2.4. Funkcje i operacje wejścia/wyjścia w C 678

A.2.5. Unie 679

A.2.6. Operacje wykonywane na pamięci i ciągach znaków 681

A.2.7. Łączenie kodu C i C++ 687

A.3. Łączenie i organizacja binarna obiektów C/C++ 687

A.4. Graficzny interfejs użytkownika i interfejs sieci Web dla projektów C++ 690

A.5. Konwertowanie wartości bin, oct, dec i hex za pomocą FixBinCalc 692

A.6. Zestaw narzędzi programistycznych 693

A.6.1. Narzędzie do generowania projektów (CMake) 693

A.6.2. Systemy kontroli wersji i repozytoria 698

A.6.3. Profiler 699

A.7. Testowanie oprogramowania 700

A.8. Podsumowanie 707

Pytania i ćwiczenia 707

Bibliografia 710

Indeks 714