88

Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli
Page 2: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

Tytuł oryginału: Programming: Principles and Practice Using C++, First Edition

Tłumaczenie: Łukasz Piwko

ISBN: 978-83-246-7720-7

Authorized translation from the English language edition, entitled: Programming: Principles and Practice Using C++, First Edition, ISBN 0321543726, by Bjarne Stroustrup, published by Pearson Education, Inc, publishing as Addison Wesley, Copyright © 2009 by Pearson Education, Inc.

Polish language edition published by Helion S.A.Copyright © 2013.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education Inc.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie,ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkodywynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/pcppt2Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Pliki z przykładami omawianymi w książce można znaleźć pod adresem:ftp://ftp.helion.pl/przyklady/pcppt2.zip

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

3

Spis tre�ci

Wst�p 19

S�owo do studentów 21S�owo do nauczycieli 22Pomoc 23Podzi�kowania 23

Uwagi do czytelnika 25

0.1. Struktura ksi��ki 260.1.1. Informacje ogólne 270.1.2. �wiczenia, praca domowa itp. 280.1.3. Po przeczytaniu tej ksi��ki 29

0.2. Filozofia nauczania i uczenia si� 290.2.1. Kolejno�� tematów 320.2.2. Programowanie a j�zyk programowania 340.2.3. Przeno�no�� 34

0.3. Programowanie a informatyka 350.4. Kreatywno�� i rozwi�zywanie problemów 350.5. Uwagi dla autorów 350.6. Bibliografia 360.7. Noty biograficzne 37

Bjarne Stroustrup 37Lawrence „Pete” Petersen 38

Kup książkę Poleć książkę

Page 4: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

4 SPIS TRECI

Rozdzia� 1. Komputery, ludzie i programowanie 39

1.1. Wst�p 401.2. Oprogramowanie 401.3. Ludzie 421.4. Informatyka 451.5. Komputery s� wsz�dzie 46

1.5.1. Komputery z ekranem i bez 461.5.2. Transport 471.5.3. Telekomunikacja 481.5.4. Medycyna 501.5.5. Informacja 511.5.6. Si�gamy w kosmos 521.5.7. I co z tego 53

1.6. Idea�y dla programistów 54

Cz��� I Podstawy 61

Rozdzia� 2. Witaj, �wiecie! 63

2.1. Programy 642.2. Klasyczny pierwszy program 642.3. Kompilacja 672.4. �czenie 692.5. rodowiska programistyczne 70

Rozdzia� 3. Obiekty, typy i warto�ci 77

3.1. Dane wej�ciowe 783.2. Zmienne 803.3. Typy danych wej�ciowych 813.4. Operacje i operatory 823.5. Przypisanie i inicjacja 85

3.5.1. Przyk�ad wykrywania powtarzaj�cych si� s�ów 873.6. Z�o�one operatory przypisania 89

3.6.1. Przyk�ad zliczania powtarzaj�cych si� s�ów 893.7. Nazwy 903.8. Typy i obiekty 923.9. Kontrola typów 94

3.9.1. Konwersje bezpieczne dla typów 953.9.2. Konwersje niebezpieczne dla typów 96

Kup książkę Poleć książkę

Page 5: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 5

Rozdzia� 4. Wykonywanie oblicze� 103

4.1. Wykonywanie oblicze� 1044.2. Cele i narz�dzia 1054.3. Wyra�enia 107

4.3.1. Wyra�enia sta�e 1084.3.2. Operatory 1094.3.3. Konwersje 111

4.4. Instrukcje 1124.4.1. Selekcja 1134.4.2. Iteracja 119

4.5. Funkcje 1224.5.1. Po co zaprz�ta� sobie g�ow� funkcjami 1244.5.2. Deklarowanie funkcji 125

4.6. Wektor 1264.6.1. Powi�kszanie wektora 1274.6.2. Przyk�ad wczytywania liczb do programu 1284.6.3. Przyk�ad z u�yciem tekstu 130

4.7. W�a�ciwo�ci j�zyka 132

Rozdzia� 5. B��dy 139

5.1. Wst�p 1405.2. �ród�a b��dów 1415.3. B��dy kompilacji 142

5.3.1. B��dy sk�adni 1425.3.2. B��dy typów 1435.3.3. Nie b��dy 144

5.4. B��dy konsolidacji 1455.5. B��dy czasu wykonania 146

5.5.1. Rozwi�zywanie problemu przez wywo�uj�cego 1475.5.2. Rozwi�zywanie problemu przez wywo�ywanego 1485.5.3. Raportowanie b��dów 149

5.6. Wyj�tki 1515.6.1. Nieprawid�owe argumenty 1515.6.2. B��dy zakresu 1525.6.3. Nieprawid�owe dane wej�ciowe 1545.6.4. B��dy zaw��ania zakresu 156

5.7. B��dy logiczne 1575.8. Szacowanie 1595.9. Debugowanie 161

5.9.1. Praktyczna rada dotycz�ca debugowania 1625.10. Warunki wst�pne i ko�cowe 165

5.10.1. Warunki ko�cowe 1675.11. Testowanie 168

Kup książkę Poleć książkę

Page 6: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 SPIS TRECI

Rozdzia� 6. Pisanie programu 175

6.1. Problem 1766.2. Przemy�lenie problemu 176

6.2.1. Etapy rozwoju oprogramowania 1776.2.2. Strategia 177

6.3. Wracaj�c do kalkulatora 1796.3.1. Pierwsza próba 1806.3.2. Tokeny 1826.3.3. Implementowanie tokenów 1836.3.4. U�ywanie tokenów 1856.3.5. Powrót do tablicy 186

6.4. Gramatyki 1886.4.1. Dygresja — gramatyka j�zyka angielskiego 1926.4.2. Pisanie gramatyki 193

6.5. Zamiana gramatyki w kod 1946.5.1. Implementowanie zasad gramatyki 1946.5.2. Wyra�enia 1956.5.3. Sk�adniki 1996.5.4. Podstawowe elementy wyra�e� 200

6.6. Wypróbowywanie pierwszej wersji 2016.7. Wypróbowywanie drugiej wersji 2056.8. Strumienie tokenów 206

6.8.1. Implementacja typu Token_stream 2076.8.2. Wczytywanie tokenów 2096.8.3. Wczytywanie liczb 210

6.9. Struktura programu 211

Rozdzia� 7. Ko�czenie programu 217

7.1. Wprowadzenie 2187.2. Wej�cie i wyj�cie 2187.3. Obs�uga b��dów 2207.4. Liczby ujemne 2247.5. Reszta z dzielenia 2257.6. Oczyszczanie kodu 227

7.6.1. Sta�e symboliczne 2277.6.2. U�ycie funkcji 2297.6.3. Uk�ad kodu 2307.6.4. Komentarze 231

7.7. Odzyskiwanie sprawno�ci po wyst�pieniu b��du 2337.8. Zmienne 236

7.8.1. Zmienne i definicje 2367.8.2. Wprowadzanie nazw 2407.8.3. Nazwy predefiniowane 2427.8.4. Czy to ju� koniec? 243

Kup książkę Poleć książkę

Page 7: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 7

Rozdzia� 8. Szczegó�y techniczne — funkcje itp. 247

8.1. Szczegó�y techniczne 2488.2. Deklaracje i definicje 249

8.2.1. Rodzaje deklaracji 2528.2.2. Deklaracje sta�ych i zmiennych 2528.2.3. Domy�lna inicjacja 254

8.3. Pliki nag�ówkowe 2548.4. Zakres 2568.5. Wywo�ywanie i warto�� zwrotna funkcji 261

8.5.1. Deklarowanie argumentów i typu zwrotnego 2618.5.2. Zwracanie warto�ci 2638.5.3. Przekazywanie przez warto�� 2648.5.4. Przekazywanie argumentów przez sta�� referencj� 2658.5.5. Przekazywanie przez referencj� 2678.5.6. Przekazywanie przez warto�� a przez referencj� 2698.5.7. Sprawdzanie argumentów i konwersja 2718.5.8. Implementacja wywo�a� funkcji 272

8.6. Porz�dek wykonywania instrukcji 2768.6.1. Warto�ciowanie wyra�e� 2778.6.2. Globalna inicjacja 277

8.7. Przestrzenie nazw 2798.7.1. Dyrektywy i deklaracje using 280

Rozdzia� 9. Szczegó�y techniczne — klasy itp. 287

9.1. Typy zdefiniowane przez u�ytkownika 2889.2. Klasy i sk�adowe klas 2899.3. Interfejs i implementacja 2899.4. Tworzenie klas 291

9.4.1. Struktury i funkcje 2919.4.2. Funkcje sk�adowe i konstruktory 2939.4.3. Ukrywanie szczegó�ów 2949.4.4. Definiowanie funkcji sk�adowych 2969.4.5. Odwo�ywanie si� do bie��cego obiektu 2989.4.6. Raportowanie b��dów 299

9.5. Wyliczenia 3009.6. Przeci��anie operatorów 3029.7. Interfejsy klas 303

9.7.1. Typy argumentów 3049.7.2. Kopiowanie 3069.7.3. Konstruktory domy�lne 3069.7.4. Sta�e funkcje sk�adowe 3099.7.5. Sk�adowe i funkcje pomocnicze 310

9.8. Klasa Date 312

Kup książkę Poleć książkę

Page 8: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

8 SPIS TRECI

Cz��� II Wej�cie i wyj�cie 319

Rozdzia� 10. Strumienie wej�cia i wyj�cia 321

10.1. Wej�cie i wyj�cie 32210.2. Model strumieni wej�cia i wyj�cia 32310.3. Pliki 32510.4. Otwieranie pliku 32610.5. Odczytywanie i zapisywanie plików 32810.6. Obs�uga b��dów wej�cia i wyj�cia 33010.7. Wczytywanie pojedynczej warto�ci 332

10.7.1. Roz�o�enie problemu na mniejsze cz��ci 33410.7.2. Oddzielenie warstwy komunikacyjnej od funkcji 337

10.8. Definiowanie operatorów wyj�ciowych 33810.9. Definiowanie operatorów wej�ciowych 33910.10. Standardowa p�tla wej�ciowa 34010.11. Wczytywanie pliku strukturalnego 341

10.11.1. Reprezentacja danych w pami�ci 34210.11.2. Odczytywanie struktur warto�ci 34310.11.3. Zmienianie reprezentacji 347

Rozdzia� 11. Indywidualizacja operacji wej�cia i wyj�cia 353

11.1. Regularno�� i nieregularno�� 35411.2. Formatowanie danych wyj�ciowych 354

11.2.1. Wysy�anie na wyj�cie liczb ca�kowitych 35511.2.2. Przyjmowanie na wej�ciu liczb ca�kowitych 35611.2.3. Wysy�anie na wyj�cie liczb zmiennoprzecinkowych 35711.2.4. Precyzja 35811.2.5. Pola 360

11.3. Otwieranie plików i pozycjonowanie 36111.3.1. Tryby otwierania plików 36111.3.2. Pliki binarne 36211.3.3. Pozycjonowanie w plikach 365

11.4. Strumienie �a�cuchowe 36511.5. Wprowadzanie danych wierszami 36711.6. Klasyfikowanie znaków 36811.7. Stosowanie niestandardowych separatorów 37011.8. Zosta�o jeszcze tyle do poznania 376

Rozdzia� 12. Model graficzny 381

12.1. Czemu grafika? 38212.2. Model graficzny 38312.3. Pierwszy przyk�ad 384

Kup książkę Poleć książkę

Page 9: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 9

12.4. Biblioteka GUI 38712.5. Wspó�rz�dne 38812.6. Figury geometryczne 38812.7. U�ywanie klas figur geometrycznych 389

12.7.1. Nag�ówki graficzne i funkcja main 39012.7.2. Prawie puste okno 39012.7.3. Klasa Axis 39212.7.4. Rysowanie wykresu funkcji 39412.7.5. Wielok�ty 39412.7.6. Prostok�ty 39512.7.7. Wype�nianie kolorem 39712.7.8. Tekst 39812.7.9.Obrazy 39912.7.10. Jeszcze wi�cej grafik 400

12.8. Uruchamianie programu 40112.8.1. Pliki ród�owe 402

Rozdzia� 13. Klasy graficzne 407

13.1. Przegl�d klas graficznych 40813.2. Klasy Point i Line 41013.3. Klasa Lines 41213.4. Klasa Color 41413.5. Typ Line_style 41613.6. Typ Open_polyline 41813.7. Typ Closed_polyline 41913.8. Typ Polygon 42013.9. Typ Rectangle 42213.10. Wykorzystywanie obiektów bez nazw 42613.11. Typ Text 42813.12. Typ Circle 43013.13. Typ Ellipse 43113.14. Typ Marked_polyline 43313.15. Typ Marks 43413.16. Typ Mark 43513.17. Typ Image 436

Rozdzia� 14. Projektowanie klas graficznych 443

14.1. Zasady projektowania 44414.1.1. Typy 44414.1.2. Operacje 44514.1.3. Nazewnictwo 44614.1.4. Zmienno�� 448

Kup książkę Poleć książkę

Page 10: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

10 SPIS TRECI

14.2. Klasa Shape 44814.2.1. Klasa abstrakcyjna 45014.2.2. Kontrola dost�pu 45114.2.3. Rysowanie figur 45414.2.4. Kopiowanie i zmienno�� 456

14.3. Klasy bazowe i pochodne 45814.3.1. Uk�ad obiektu 45914.3.2. Tworzenie podklas i definiowanie funkcji wirtualnych 46114.3.3. Przes�anianie 46114.3.4. Dost�p 46314.3.5. Czyste funkcje wirtualne 464

14.4. Zalety programowania obiektowego 465

Rozdzia� 15. Graficzne przedstawienie funkcji i danych 471

15.1. Wprowadzenie 47215.2. Rysowanie wykresów prostych funkcji 47215.3. Typ Function 476

15.3.1. Argumenty domy�lne 47715.3.2. Wi�cej przyk�adów 478

15.4. Typ Axis 47915.5. Warto�� przybli�ona funkcji wyk�adniczej 48115.6. Przedstawianie danych na wykresach 486

15.6.1. Odczyt danych z pliku 48715.6.2. Uk�ad ogólny 48815.6.3. Skalowanie danych 48915.6.4. Budowanie wykresu 490

Rozdzia� 16. Graficzne interfejsy u�ytkownika 497

16.1. Ró�ne rodzaje interfejsów u�ytkownika 49816.2. Przycisk Next 49916.3. Proste okno 500

16.3.1. Funkcje zwrotne 50116.3.2. P�tla oczekuj�ca 504

16.4. Typ Button i inne pochodne typu Widget 50516.4.1. Widgety 50516.4.2. Przyciski 50616.4.3. Widgety In_box i Out_box 50716.4.4. Menu 507

16.5. Przyk�ad 50816.6. Inwersja kontroli 51116.7. Dodawanie menu 51316.8. Debugowanie kodu GUI 517

Kup książkę Poleć książkę

Page 11: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 11

Cz��� III Dane i algorytmy 523

Rozdzia� 17. Wektory i pami�� wolna 525

17.1. Wprowadzenie 52617.2. Podstawowe wiadomo�ci na temat typu vector 52717.3. Pami��, adresy i wska niki 529

17.3.1. Operator sizeof 53117.4. Pami�� wolna a wska niki 532

17.4.1. Alokacja obiektów w pami�ci wolnej 53317.4.2. Dost�p poprzez wska niki 53417.4.3. Zakresy 53517.4.4. Inicjacja 53617.4.5. Wska nik zerowy 53717.4.6. Dealokacja pami�ci wolnej 538

17.5. Destruktory 54017.5.1. Generowanie destruktorów 54217.5.2. Destruktory a pami�� wolna 542

17.6. Dost�p do elementów 54417.7. Wska niki na obiekty klas 54517.8. Babranie si� w typach — void* i rzutowanie 54617.9. Wska niki i referencje 548

17.9.1. Wska niki i referencje jako parametry 54917.9.2. Wska niki, referencje i dziedziczenie 55017.9.3. Przyk�ad — listy 55117.9.4. Operacje na listach 55217.9.5. Zastosowania list 554

17.10. Wska nik this 55517.10.1. Wi�cej przyk�adów u�ycia typu Link 557

Rozdzia� 18. Wektory i tablice 563

18.1. Wprowadzenie 56418.2. Kopiowanie 564

18.2.1. Konstruktory kopiuj�ce 56618.2.2. Przypisywanie z kopiowaniem 56718.2.3. Terminologia zwi�zana z kopiowaniem 569

18.3. Podstawowe operacje 57018.3.1. Konstruktory jawne 57118.3.2. Debugowanie konstruktorów i destruktorów 573

18.4. Uzyskiwanie dost�pu do elementów wektora 57518.4.1. Problem sta�ych wektorów 576

18.5. Tablice 57718.5.1. Wska niki na elementy tablicy 57818.5.2. Wska niki i tablice 580

Kup książkę Poleć książkę

Page 12: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

12 SPIS TRECI

18.5.3. Inicjowanie tablic 58218.5.4. Problemy ze wska nikami 583

18.6. Przyk�ady — palindrom 58618.6.1. Wykorzystanie �a�cuchów 58618.6.2. Wykorzystanie tablic 58718.6.3. Wykorzystanie wska ników 588

Rozdzia� 19. Wektory, szablony i wyj�tki 593

19.1. Analiza problemów 59419.2. Zmienianie rozmiaru 596

19.2.1. Reprezentacja 59719.2.2. Rezerwacja pami�ci i pojemno�� kontenera 59819.2.3. Zmienianie rozmiaru 59919.2.4. Funkcja push_back() 59919.2.5. Przypisywanie 60019.2.6. Podsumowanie dotychczasowej pracy nad typem vector 602

19.3. Szablony 60219.3.1. Typy jako parametry szablonów 60319.3.2. Programowanie ogólne 60519.3.3. Kontenery a dziedziczenie 60719.3.4. Liczby ca�kowite jako parametry szablonów 60819.3.5. Dedukcja argumentów szablonu 61019.3.6. Uogólnianie wektora 610

19.4. Sprawdzanie zakresu i wyj�tki 61319.4.1. Dygresja — uwagi projektowe 61419.4.2. Wyznanie na temat makr 615

19.5. Zasoby i wyj�tki 61719.5.1. Potencjalne problemy z zarz�dzaniem zasobami 61719.5.2. Zajmowanie zasobów jest inicjacj� 61919.5.3. Gwarancje 62019.5.4. Obiekt auto_ptr 62119.5.5. Technika RAII dla wektora 622

Rozdzia� 20. Kontenery i iteratory 629

20.1. Przechowywanie i przetwarzanie danych 63020.1.1. Praca na danych 63020.1.2. Uogólnianie kodu 631

20.2. Idea�y twórcy biblioteki STL 63420.3. Sekwencje i iteratory 637

20.3.1. Powrót do przyk�adu 63920.4. Listy powi�zane 641

20.4.1. Operacje list 64220.4.2. Iteracja 643

20.5. Jeszcze raz uogólnianie wektora 645

Kup książkę Poleć książkę

Page 13: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 13

20.6. Przyk�ad — prosty edytor tekstu 64720.6.1. Wiersze 64920.6.2. Iteracja 650

20.7. Typy vector, list oraz string 65320.7.1. Funkcje insert() i erase() 654

20.8. Dostosowanie wektora do biblioteki STL 65620.9. Dostosowywanie wbudowanych tablic do STL 65820.10. Przegl�d kontenerów 660

20.10.1. Kategorie iteratorów 662

Rozdzia� 21. Algorytmy i s�owniki 667

21.1. Algorytmy biblioteki standardowej 66821.2. Najprostszy algorytm — find() 669

21.2.1. Kilka przyk�adów z programowania ogólnego 67021.3. Ogólny algorytm wyszukiwania — find_if() 67121.4. Obiekty funkcyjne 673

21.4.1. Abstrakcyjne spojrzenie na obiekty funkcyjne 67421.4.2. Predykaty sk�adowych klas 675

21.5. Algorytmy numeryczne 67621.5.1. Akumulacja 67721.5.2. Uogólnianie funkcji accumulate() 67821.5.3. Iloczyn skalarny 67921.5.4. Uogólnianie funkcji inner_product() 681

21.6. Kontenery asocjacyjne 68121.6.1. S�owniki 68221.6.2. Opis ogólny kontenera map 68421.6.3. Jeszcze jeden przyk�ad zastosowania s�ownika 68721.6.4. Kontener unordered_map 68921.6.5. Zbiory 691

21.7. Kopiowanie 69321.7.1. Funkcja copy() 69321.7.2. Iteratory strumieni 69421.7.3. Utrzymywanie porz�dku przy u�yciu kontenera set 69621.7.4. Funkcja copy_if() 696

21.8. Sortowanie i wyszukiwanie 697

Cz��� IV Poszerzanie horyzontów 703

Rozdzia� 22. Idea�y i historia 705

22.1. Historia, idea�y i profesjonalizm 70622.1.1. Cele i filozofie j�zyków programowania 70622.1.2. Idea�y programistyczne 70822.1.3. Style i paradygmaty 714

Kup książkę Poleć książkę

Page 14: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

14 SPIS TRECI

22.2. Krótka historia j�zyków programowania 71722.2.1. Pierwsze j�zyki 71822.2.2. Korzenie nowoczesnych j�zyków programowania 71922.2.3. Rodzina Algol 72422.2.4. Simula 73122.2.5. C 73322.2.6. C++ 73622.2.7. Dzi� 73822.2.8. �ród�a informacji 740

Rozdzia� 23. Przetwarzanie tekstu 745

23.1. Tekst 74623.2. a�cuchy 74623.3. Strumienie wej�cia i wyj�cia 75023.4. S�owniki 750

23.4.1. Szczegó�y implementacyjne 75523.5. Problem 75723.6. Wyra�enia regularne 75923.7. Wyszukiwanie przy u�yciu wyra�e� regularnych 76123.8. Sk�adnia wyra�e� regularnych 764

23.8.1. Znaki i znaki specjalne 76423.8.2. Rodzaje znaków 76523.8.3. Powtórzenia 76623.8.4. Grupowanie 76723.8.5. Alternatywa 76723.8.6. Zbiory i przedzia�y znaków 76823.8.7. B��dy w wyra�eniach regularnych 769

23.9. Dopasowywanie przy u�yciu wyra�e� regularnych 77023.10. �ród�a 775

Rozdzia� 24. Dzia�ania na liczbach 779

24.1. Wprowadzenie 78024.2. Rozmiar, precyzja i przekroczenie zakresu 780

24.2.1. Ograniczenia typów liczbowych 78324.3. Tablice 78424.4. Tablice wielowymiarowe w stylu j�zyka C 78524.5. Biblioteka Matrix 786

24.5.1. Wymiary i dost�p 78724.5.2. Macierze jednowymiarowe 78924.5.3. Macierze dwuwymiarowe 79224.5.4. Wej�cie i wyj�cie macierzy 79424.5.5. Macierze trójwymiarowe 795

Kup książkę Poleć książkę

Page 15: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 15

24.6. Przyk�ad — rozwi�zywanie równa� liniowych 79624.6.1. Klasyczna eliminacja Gaussa 79724.6.2. Wybór elementu centralnego 79824.6.3. Testowanie 799

24.7. Liczby losowe 80024.8. Standardowe funkcje matematyczne 80224.9. Liczby zespolone 80324.10. �ród�a 804

Rozdzia� 25. Programowanie systemów wbudowanych 809

25.1. Systemy wbudowane 81025.2. Podstawy 813

25.2.1. Przewidywalno�� 81525.2.2. Idea�y 81525.2.3. �ycie z awari� 816

25.3. Zarz�dzanie pami�ci� 81825.3.1. Problemy z pami�ci� woln� 81925.3.2. Alternatywy dla ogólnej pami�ci wolnej 82225.3.3. Przyk�ad zastosowania puli 82325.3.4. Przyk�ad u�ycia stosu 824

25.4. Adresy, wska niki i tablice 82525.4.1. Niekontrolowane konwersje 82525.4.2. Problem — le dzia�aj�ce interfejsy 82625.4.3. Rozwi�zanie — klasa interfejsu 82925.4.4. Dziedziczenie a kontenery 832

25.5. Bity, bajty i s�owa 83425.5.1. Bity i operacje na bitach 83525.5.2. Klasa bitset 83925.5.3. Liczby ze znakiem i bez znaku 84025.5.4. Manipulowanie bitami 84425.5.5. Pola bitowe 84625.5.6. Przyk�ad — proste szyfrowanie 847

25.6. Standardy pisania kodu 85125.6.1. Jaki powinien by� standard kodowania 85225.6.2. Przyk�adowe zasady 85425.6.3. Prawdziwe standardy kodowania 859

Rozdzia� 26. Testowanie 865

26.1. Czego chcemy 86626.1.1. Zastrze�enie 867

26.2. Dowody 86726.3. Testowanie 867

26.3.1. Testowanie regresyjne 86826.3.2. Testowanie jednostkowe 869

Kup książkę Poleć książkę

Page 16: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

16 SPIS TRECI

26.3.3. Algorytmy i nie-algorytmy 87526.3.4. Testy systemowe 88226.3.5. Testowanie klas 88626.3.6. Znajdowanie za�o�e�, które si� nie potwierdzaj� 889

26.4. Projektowanie pod k�tem testowania 89026.5. Debugowanie 89126.6. Wydajno�� 891

26.6.1. Kontrolowanie czasu 89326.7. �ród�a 895

Rozdzia� 27. J�zyk C 899

27.1. C i C++ to rodze�stwo 90027.1.1. Zgodno�� j�zyków C i C++ 90127.1.2. Co jest w j�zyku C++, czego nie ma w C 90327.1.3. Biblioteka standardowa j�zyka C 904

27.2. Funkcje 90527.2.1. Brak mo�liwo�ci przeci��ania nazw funkcji 90627.2.2. Sprawdzanie typów argumentów funkcji 90627.2.3. Definicje funkcji 90727.2.4. Wywo�ywanie C z poziomu C++ i C++ z poziomu C 90927.2.5. Wska niki na funkcje 911

27.3. Mniej wa�ne ró�nice mi�dzy j�zykami 91227.3.1. Przestrze� znaczników struktur 91227.3.2. S�owa kluczowe 91327.3.3. Definicje 91427.3.4. Rzutowanie w stylu j�zyka C 91527.3.5. Konwersja typu void* 91627.3.6. Typ enum 91727.3.7. Przestrzenie nazw 917

27.4. Pami�� wolna 91827.5. a�cuchy w stylu j�zyka C 919

27.5.1. a�cuchy w stylu j�zyka C i const 92227.5.2. Operacje na bajtach 92227.5.3. Przyk�ad — funkcja strcpy() 92327.5.4. Kwestia stylu 923

27.6. Wej�cie i wyj�cie — nag�ówek stdio 92427.6.1. Wyj�cie 92427.6.2. Wej�cie 92527.6.3. Pliki 927

27.7. Sta�e i makra 92727.8. Makra 928

27.8.1. Makra podobne do funkcji 92927.8.2. Makra sk�adniowe 93027.8.3. Kompilacja warunkowa 931

27.9. Przyk�ad — kontenery intruzyjne 932

Kup książkę Poleć książkę

Page 17: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SPIS TRECI 17

Dodatki 941

Dodatek A Zestawienie w�asno�ci j�zyka 943

A.1. Opis ogólny 944A.2. Litera�y 946A.3. Identyfikatory 950A.4. Zakres, pami�� oraz czas trwania 950A.5. Wyra�enia 953A.6. Instrukcje 962A.7. Deklaracje 964A.8. Typy wbudowane 965A.9. Funkcje 968A.10. Typy zdefiniowane przez u�ytkownika 971A.11. Wyliczenia 972A.12. Klasy 972A.13. Szablony 983A.14. Wyj�tki 986A.15. Przestrzenie nazw 988A.16. Aliasy 988A.17. Dyrektywy preprocesora 989

Dodatek B Biblioteka standardowa 991

B.1. Przegl�d 992B.2. Obs�uga b��dów 995B.3. Iteratory 997B.4. Kontenery 1001B.5. Algorytmy 1008B.6. Biblioteka STL 1016B.7. Strumienie wej�cia i wyj�cia 1018B.8. Przetwarzanie �a�cuchów 1024B.9. Obliczenia 1028B.10. Funkcje biblioteki standardowej C 1032B.11. Inne biblioteki 1040

Dodatek C Podstawy �rodowiska Visual Studio 1043

C.1. Uruchamianie programu 1044C.2. Instalowanie �rodowiska Visual Studio 1044C.3. Tworzenie i uruchamianie programu 1044C.4. Pó niej 1046

Kup książkę Poleć książkę

Page 18: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

18 SPIS TRECI

Dodatek D Instalowanie biblioteki FLTK 1047

D.1. Wprowadzenie 1048D.2. Pobieranie biblioteki FLTK z internetu 1048D.3. Instalowanie biblioteki FLTK 1048D.4. Korzystanie z biblioteki FLTK w Visual Studio 1049D.5. Sprawdzanie, czy wszystko dzia�a 1050

Dodatek E Implementacja GUI 1051

E.1. Implementacja wywo�a� zwrotnych 1052E.2. Implementacja klasy Widget 1053E.3. Implementacja klasy Window 1054E.4. Klasa Vector_ref 1055E.5. Przyk�ad — widgety 1056

S�owniczek 1059

Bibliografia 1065

Skorowidz 1069

Zdj�cia 1095

Kup książkę Poleć książkę

Page 19: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6

175

Pisanie programu

Pisa� program, znaczy rozumie�.— Kristen Nygaard

isanie programu polega na stopniowym modyfikowaniu swojego wyobra�e-nia na temat tego, co si� chce zrobi� i jak si� chce to wyrazi�. W tym i nast�p-

nym rozdziale zbudujemy program. Zaczniemy od pierwszego mglistego pomy-s�u, przejdziemy etapy analizy, projektowania, implementacji, testowania, po-nownego projektowania, na ponownej implementacji ko�cz�c. Chcemy pokaza�proces my�lowy, który ma miejsce podczas tworzenia oprogramowania. W mi�-dzyczasie omówimy organizacj� programu, typy definiowane przez u�ytkownikaoraz techniki przetwarzania danych wej�ciowych.

6.1. Problem

6.2. Przemy�lenie problemu

6.2.1. Etapy rozwoju oprogramowania

6.2.2. Strategia

6.3. Wracaj�c do kalkulatora

6.3.1. Pierwsza próba

6.3.2. Tokeny

6.3.3. Implementowanie tokenów

6.3.4. U�ywanie tokenów

6.3.5. Powrót do tablicy

6.4. Gramatyki

6.4.1. Dygresja — gramatyka j�zyka angielskiego

6.4.2. Pisanie gramatyki

6.5. Zamiana gramatyki w kod

6.5.1. Implementowanie zasad gramatyki

6.5.2. Wyra�enia

6.5.3. Sk�adniki

6.5.4. Podstawowe elementy wyra�e�

6.6. Wypróbowywanie pierwszej wersji

6.7. Wypróbowywanie drugiej wersji

6.8. Strumienie tokenów

6.8.1. Implementacja typu Token_stream

6.8.2. Wczytywanie tokenów

6.8.3. Wczytywanie liczb

6.9. Struktura programu

P

Kup książkę Poleć książkę

Page 20: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

176 ROZDZIA 6 • PISANIE PROGRAMU

6.1. ProblemPisanie programu zaczyna si� od postawienia problemu. To znaczy, jest problem, do rozwi�zaniaktórego chcemy napisa� program. Aby ten program by� dobry, nale�y dok�adnie zrozumie�problem. Je�li program b�dzie rozwi�zywa� nie ten problem, co trzeba, to nie b�dzie przydatnybez wzgl�du na to, jak mo�e by� elegancki. Czasami zdarzaj� si� szcz��liwe przypadki, �e programspe�nia jakie� przypadkowe po�yteczne zadanie, mimo �e zosta� napisany w ca�kiem innym celu.Lepiej jednak nie liczy� na takie szcz��cie. My chcemy napisa� taki program, który b�dzie w pro-sty i jasny sposób rozwi�zywa� dok�adnie ten problem, dla którego zosta� napisany.

Jaki program by�oby najlepiej napisa� na tym etapie nauki? Taki, który:

� Ilustruje techniki projektowania i pisania programów.

� Umo�liwia zapoznanie si� z charakterem decyzji, które programista musi podejmo-wa�, oraz implikacjami, które te decyzje poci�gaj�.

� Nie wymaga zastosowania zbyt wielu nowych konstrukcji programistycznych.

� Jest wystarczaj�co skomplikowany, aby zmusi� nas do przemy�lenia jego projektu.

� Mo�na napisa� na kilka sposobów.

� Rozwi�zuje �atwy do zrozumienia problem.

� Rozwi�zuje problem wart uwagi.

� Jest na tyle ma�y, �e mo�na go w ca�o�ci przedstawi� i zrozumie�.

Wybór pad� na program „zmuszaj�cy komputer do wykonywania typowych dzia�a� arytme-tycznych na wyra�eniach, które mu podamy” — tzn. chcemy napisa� prosty kalkulator. Pro-gramy tego typu s� u�yteczne. Mo�na je znale � w ka�dym komputerze biurkowym, a nawetmo�na znale � takie komputery, które pozwalaj� uruchamia� tylko tego typu programy —kalkulatory kieszonkowe.

Je�li np. wpiszemy

2+3.1*4

b�dziemy oczekiwa�, �e program zwróci wynik

14.4

Niestety kalkulator taki nie b�dzie mia� �adnych funkcji, których ju� nie spe�nia nasz kom-puter, ale to by by�o zbyt wysokie wymaganie wobec pierwszego programu.

6.2. Przemy�lenie problemuOd czego wi�c zacz��? Pomy�l o postawionym problemie i tym, jak go rozwi�za�. Po pierwszezdecyduj si�, co program ma robi� i w jaki sposób b�dziesz si� z nim komunikowa�. Pó niejb�dziesz móg� zastanowi� si� nad tym, jak napisa� odpowiedni kod. Opisz wst�pn� wersj�swojego rozwi�zania i zastanów si�, co nale�y poprawi�. Mo�esz spróbowa� przedyskutowa�problem i jego rozwi�zanie z koleg� lub kole�ank�. Próba przedstawienia komu� w�asnychmy�li jest doskona�ym sposobem na znalezienie s�abych punktów w�asnego rozumowania,

Kup książkę Poleć książkę

Page 21: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .2 . PRZEMYLENIE PROBLEMU 177

nawet lepszym ni� napisanie ich. Papier (lub komputer) nie b�dzie z Tob� dyskutowa� i kry-tycznie ocenia� Twoich pogl�dów. Idealny etap projektowania to taki, który przeprowadza si�w towarzystwie.

Niestety nie ma takiej ogólnej strategii rozwi�zywania problemów, która odpowiada�abywszystkim ludziom i pozwala�a rozwi�za� ka�dy problem. Istnieje mnóstwo ksi��ek, którychautorzy twierdz�, �e pomog� Ci efektywniej rozwi�zywa� problemy, oraz ca�a masa publikacjina temat projektowania programów. Nasza droga nie wiedzie poprzez nie. W zamian opiszemygar�� ogólnych wskazówek, które mog� by� pomocne w rozwi�zywaniu mniejszych problemów.Nast�pnie szybko przejdziemy do wypróbowywania tych sugestii na naszym ma�ym kalkula-torze.

Czytaj�c tre�� naszych rozwa�a� na temat kalkulatora, oceniaj to, co widzisz, bardzo scep-tycznym okiem. Aby zachowa� realizm, przedstawimy ewolucj� naszego programu poprzezszereg wersji. Opiszemy argumenty, które doprowadzi�y nas do powstania ka�dej z nich. Oczy-wi�cie znaczna cz��� tej argumentacji musi by� niekompletna lub b��dna, inaczej szybko by�mysko�czyli ten rozdzia�. Naszym celem jest pokazanie przyk�adowych problemów i procesówmy�lowych charakterystycznych dla procesu projektowania i implementowania programu.Wersja, z której jeste�my ostatecznie zadowoleni, zostanie przedstawiona dopiero na ko�cunast�pnego rozdzia�u.

Pami�taj, �e w tym i nast�pnym rozdziale proces dochodzenia do finalnej wersji progra-mu — droga wiod�ca przez niepe�ne rozwi�zania, pomys�y i b��dy — jest co najmniej taksamo wa�ny, jak wersja ostateczna i wa�niejszy ni� narz�dzia techniczne j�zyka programowania,których b�dziemy u�ywa� (wrócimy do nich pó niej).

6.2.1. Etapy rozwoju oprogramowaniaPoni�ej przedstawimy nieco terminologii zwi�zanej z tworzeniem oprogramowania. Pracuj�cnad rozwi�zaniem problemu, wielokrotnie powtarza si� nast�puj�ce fazy:

� Analiza — przemy�l, co masz zrobi�, i opisz, jak to aktualnie rozumiesz. Taki opis nazywasi� zestawem wymaga� lub specyfikacj�. Nie b�dziemy szczegó�owo opisywa� technikopracowywania i opisywania takich wymogów. Temat tej ksi��ki tego nie obejmuje, alenale�y pami�ta�, �e w miar� zwi�kszania si� rozmiaru problemu techniki te nabieraj�wagi.

� Projektowanie — utworzenie ogólnej struktury systemu i podj�cie decyzji, na jakiecz��ci podzieli� implementacj� oraz jak powinny si� one ze sob� komunikowa�. W ramachprojektowania zastanów si� jakie narz�dzia — np. biblioteki — mo�esz wykorzysta�do opracowania struktury programu.

� Implementacja — napisz kod, usu� b��dy oraz sprawd za pomoc� testów, czy robi to,co powinien.

6.2.2. StrategiaOto gar�� wskazówek, które — je�li zostan� zastosowane z rozwag� i wyobra ni� — b�d� po-mocne w wielu projektach programistycznych:

� Jaki problem jest do rozwi�zania? Przede wszystkim nale�y stara� si� dok�adnie opisa�,co chce si� zrobi�. Najcz��ciej oznacza to sporz�dzenie opisu problemu lub, je�li kto�

Kup książkę Poleć książkę

Page 22: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

178 ROZDZIA 6 • PISANIE PROGRAMU

inny da� nam zadanie do wykonania, prób� odszyfrowania, co dok�adnie to oznacza.W tym momencie nale�y przyj�� punkt widzenia u�ytkownika (nie programisty czyimplementatora). To znaczy, zamiast zastanawia� si�, jak rozwi�za� problem, pomy�l, coprogram ma w ogóle robi�. Zadawaj pytania typu: „Co ten program mo�e dla mnie zro-bi�?” albo „W jaki sposób chcia�bym komunikowa� si� z tym programem?”. Pami�taj, �ewi�kszo�� z nas mo�e korzysta� z w�asnego bogatego do�wiadczenia jako u�ytkownikakomputerów.

� Czy problem zosta� jasno nakre�lony? W realnym �wiecie nigdy nie jest. Nawetw takim �wiczeniu trudno jest opisa� go wystarczaj�co precyzyjnie. Dlatego staramy si�wszystko wyja�ni�. Szkoda by by�o, gdyby�my rozwi�zali nie ten problem, co trzeba.Inna pu�apka to wygórowane wymagania. Obmy�laj�c, co by�my chcieli, �atwo mo�e-my ulec chciwo�ci lub nadmiernym ambicjom. Zawsze lepiej jest obni�y� wymagania,aby u�atwi� napisanie specyfikacji programu, jego zrozumienie, u�ytkowanie oraz(tak� trzeba mie� nadziej�) implementacj�. Gdy zadzia�a, zawsze mo�na napisa�wzbogacon� wersj� 2.0.

� Czy problem wydaje si� mo�liwy do rozwi�zania w przewidzianym czasie oraz przyokre�lonym zasobie umiej�tno�ci i dost�pnych narz�dziach? Nie ma sensu rozpo-czyna� projektu, którego nie mamy szans uko�czy�. Je�li jest za ma�o czasu na im-plementacj� (w��cznie z testowaniem) wszystkich wymaganych funkcji programu,zazwyczaj lepiej jest go w ogóle nie zaczyna�. Lepiej zamiast tego zdoby� wi�cejzasobów (zw�aszcza czasu) lub (idealnie) zmieni� wymagania, aby u�atwi� zadanie.

� Spróbuj podzieli� program na daj�ce si� ogarn�� my�lami cz��ci. Nawet najmniejszyprogram rozwi�zuj�cy realny problem mo�na podzieli� na cz��ci.

� Znasz jakie� narz�dzia, biblioteki itp., które mog� by� pomocne? Odpowied pra-wie zawsze brzmi: tak. Od samego pocz�tku nauki programowania masz do dys-pozycji zawarto�� standardowej biblioteki C++. Pó niej poznasz znaczn� jej cz���i dowiesz si�, jak poszukiwa� jeszcze wi�cej. B�dziesz korzysta� z bibliotek graficz-nych, macierzy itp. Maj�c odrobin� do�wiadczenia, b�dziesz w stanie znale � tysi�-ce bibliotek w internecie. Pami�taj — nie ma sensu wywa�a� otwartych drzwi, je�litworzy si� oprogramowanie do realnego u�ytku. Co innego w czasie nauki pro-gramowania. Wówczas takie dzia�ania w celu sprawdzenia, jak to zrobili inni, maj�g��boki sens. Ca�y czas, który oszcz�dzisz dzi�ki wykorzystaniu istniej�cych bi-bliotek, mo�esz po�wi�ci� na prac� nad innymi cz��ciami problemu albo na odpo-czynek. Sk�d wiadomo, czy dana biblioteka spe�nia nasze wymagania i prezentujeodpowiedni� jako��? To trudne pytanie. Mo�na spyta� znajomych, popyta� nagrupach dyskusyjnych i wypróbowa� kilka krótkich przyk�adów, zanim si� zdecy-dujemy.

� Wyodr�bnij takie cz��ci rozwi�zania, które mo�na opisa� oddzielnie od reszty (i po-tencjalnie wykorzysta� w kilku miejscach programu, a nawet w innych programach).Umiej�tno�� znajdowania takich cz��ci przychodzi z do�wiadczeniem, dlatego w ksi��cetej przedstawiamy wiele takich przyk�adów. U�ywali�my ju� wektorów, �a�cuchówi strumieni (cin i cout). W tym rozdziale po raz pierwszy przedstawimy przyk�adyprojektów, implementacji i wykorzystania cz��ci programów dost�pnych jako typy

Kup książkę Poleć książkę

Page 23: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .3 . WRACAJ�C DO KALKULATORA 179

zdefiniowane przez u�ytkownika (Token i Token_stream). Jeszcze wi�cej takich przy-k�adów znajduje si� w rozdzia�ach 8. oraz 13. – 15., w których zostan� opisane tech-niki ich tworzenia. Na razie zastanów si� nad tak� analogi� — gdyby�my projektowalisamochód, zacz�liby�my od opisu jego podzespo�ów, takich jak ko�a, silnik, fotele,klamki do drzwi itp. Ka�d� z nich wyprodukowaliby�my osobno, aby nast�pnieu�y� jej do z�o�enia ca�ego pojazdu. W nowoczesnym samochodzie wykorzystujesi� dziesi�tki tysi�cy takich cz��ci. Realne programy nie ró�ni� si� w niczym odsamochodów pod tym wzgl�dem (poza tym, �e cz��ciami s� fragmenty kodu). Nieprzysz�o by nam do g�owy budowa� samochodu z surowych materia�ów, jak �elazo,plastik i drewno. Analogicznie nie tworzymy powa�nych programów, bezpo�redniou�ywaj�c wyra�e�, instrukcji typów wbudowanych w j�zyk. Projektowanie i imple-mentowanie takich cz��ci jest najwa�niejszym tematem tej ksi��ki, a nawet w ogólneprogramowania. Zajrzyj te� do rozdzia�ów 9. (typy definiowane przez u�ytkownika),14. (hierarchie klas) oraz 20. (typy ogólne).

� Zbuduj niewielk� wersj� programu z ograniczon� funkcjonalno�ci�, która rozwi�zujenajwa�niejsz� cz��� problemu. Rzadko si� zdarza, aby�my od samego pocz�tku dok�ad-nie znali charakter problemu. Cz�sto nam si� tak wydaje (chyba wiadomo, co to jest pro-gram kalkulator?), ale w rzeczywisto�ci jest inaczej. Tylko dzi�ki wyt��onemu my�le-niu o problemie (analiza) i eksperymentowaniu (projekt i implementacja) mo�na na tyledok�adnie zrozumie� problem, aby napisa� dobry program. Dlatego tworzymy ograni-czon� wersj�, aby:

� Odkry� w�asne braki w rozumowaniu, pojmowaniu problemu oraz narz�dziach.

� Sprawdzi�, czy nie trzeba zmieni� niektórych szczegó�ów w specyfikacji problemu,aby zadanie by�o wykonalne. Rzadko si� zdarza, aby w czasie analizy i we wst�pnejfazie projektowania uda�o si� przewidzie� wszystkie mo�liwe trudno�ci. Nale�yskorzysta� z informacji, które zyskujemy podczas pisania i testowania kodu.

Tak� wst�pn� wersj� o ograniczonej funkcjonalno�ci czasami nazywa si� prototypem.Je�li (co jest prawdopodobne) ta pierwsza wersja nie dzia�a lub jest tak brzydka, �e niemamy ochoty si� ni� d�u�ej zajmowa�, wyrzucamy j� i tworzymy nowy prototyp, tym ra-zem wzbogaceni o nowe do�wiadczenia. Powtarzamy ten proces a� do uzyskania zadowa-laj�cego wyniku. Nie kontynuuj pracy w ba�aganie, który z czasem tylko si� pogorszy.

� Zbuduj pe�n� wersj�, najlepiej wykorzystuj�c w tym celu cz��ci z wersji wst�pnej.Chodzi o to, aby program tworzy� z dzia�aj�cych cz��ci, a nie pisa� ca�y kod na raz.Mo�na oczywi�cie mie� nadziej�, �e jakim� cudem nieprzetestowane fragmenty kodub�d� dzia�a� i na dodatek robi� to, co zaplanowano.

6.3. Wracaj�c do kalkulatoraW jaki sposób b�dziemy komunikowa� si� z kalkulatorem? To �atwe — wiemy ju�, jak pos�u-giwa� si� strumieniami cin i cout, a graficzne interfejsy u�ytkownika (GUI) zostan� opisanedopiero w rozdziale 16. W zwi�zku z tym wybór pad� na okno konsoli. Program b�dzie po-biera� z klawiatury wyra�enia, oblicza� ich warto�� i drukowa� wynik na ekranie. Na przyk�ad:

Kup książkę Poleć książkę

Page 24: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

180 ROZDZIA 6 • PISANIE PROGRAMU

Wyraenie: 2+2Wynik: 4Wyraenie: 2+2*3Wynik: 8Wyraenie: 2+3–25/5Wynik: 0

Wyra�enia, tzn. 2+2 i 2+2*3, powinien wpisywa� u�ytkownik. Reszta nale�y do programu. Wy-�wietlenie s�owa Wyraenie: b�dzie zach�t� dla u�ytkownika do wpisania wyra�enia. Mogliby-�my napisa� Prosz� wpisa� wyraenie i znak nowego wiersza:, ale to wydawa�o nam si� zbyt roz-wlek�e. Z drugiej strony taki przyjemny znaczek > by�by chyba za bardzo tajemniczy. Takieszkicowanie przyk�adów u�ycia we wczesnej fazie pracy jest bardzo wa�ne. Dzi�ki temumo�na si� dowiedzie�, jaki jest minimalny zestaw funkcji programu. W projektowaniu i analizieprzyk�ady takie nazywaj� si� przypadkami u�ycia.

Wi�kszo�� ludzi, którzy po raz pierwszy stykaj� si� z problemem kalkulatora, wpada nanast�puj�cy pomys�, je�li chodzi o g�ówn� logik� programu:

wczytaj_wierszoblicz // wykonuje prac�wydrukuj_wynik

Takie zapiski to oczywi�cie nie jest prawdziwy kod, tylko tzw. pseudokod. Stosuje si� go wewczesnych fazach projektowania, gdy nie ma jeszcze pewno�ci co do tego, jak� zastosowa� no-tacj�. Np., czy obliczenia ma by� wywo�aniem funkcji? Je�li tak, to jakie b�dzie przyjmowa�argumenty? Jest po prostu za wcze�nie na zadawanie takich pyta�.

6.3.1. Pierwsza próbaNa tym etapie nie jeste�my jeszcze gotowi napisa� programu kalkulatora. Nie przemy�leli-�my jeszcze wszystkiego, ale my�lenie to ci��ka praca i — jak wi�kszo�� programistów — niemo�emy si� doczeka�, �eby ju� co� napisa�. Spróbujemy wi�c swoich si� i napiszemy prosty kal-kulator, aby zobaczy�, do czego nas to doprowadzi. Nasz pierwszy pomys� wygl�da tak:

#include "std_lib_facilities.h"int main(){ cout << "Wpisz wyraenie (obs�ugujemy operatory + i –): "; int lval = 0; int rval; char op; int res; cin>>lval>>op>>rval; // Wczytuje co� w rodzaju 1 + 3. if (op=='+') res = lval + rval; // dodawanie else if (op=='–') res = lval – rval; // odejmowanie cout << "Wynik: " << res << '\n'; keep_window_open(); return 0;}

Kup książkę Poleć książkę

Page 25: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .3 . WRACAJ�C DO KALKULATORA 181

Wczytujemy par� warto�ci oddzielonych operatorem, np. 2+2, obliczamy wynik (tu 4) i druku-jemy go na ekranie. Zmienn� przechowuj�c� warto�� z lewej strony operatora nazwali�mylval, a z prawej strony rval.

To nawet dzia�a! Co z tego, �e program nie jest uko�czony? To wspania�e uczucie zrobi�co�, co dzia�a! Mo�e to programowanie i informatyka s� �atwiejsze, ni� g�osz� plotki? Mo�liwe,ale nie dajmy si� ponie�� emocjom z powodu tego pierwszego sukcesu. Oto lista czynno�ci:

1. Oczy�ci� kod.

2. Doda� obs�ug� dzielenia i mno�enia (np. 2*3).

3. Doda� obs�ug� wyra�e� zawieraj�cych wi�cej ni� jeden operand (np. 1+2+3).

W szczególno�ci pami�tamy, �e zawsze nale�y sprawdza�, czy u�ytkownik poda� sensownedane (zapomnieli�my z po�piechu wcze�niej), oraz �e porównywanie jednej warto�ci z wielomasta�ymi lepiej wykona� za pomoc� instrukcji switch ni� if.

�czenie dzia�a� w �a�cuchy, np. 1+2+3+4, obs�u�ymy, sumuj�c warto�ci w czasie wczyty-wania. Tzn. wczytujemy 1, widzimy +2, wi�c dodajemy 2 do 1 (uzyskuj�c w ten sposób wy-nik 3). Dalej widzimy +3, a wi�c dodajemy 3 do poprzedniego wyniku itd. Po kilku falstartachi poprawieniu kilku b��dów sk�adni uzyskali�my nast�puj�cy rezultat:

#include "std_lib_facilities.h"int main(){ cout << "Wpisz wyraenie (obs�ugujemy operatory +, –, * oraz /): "; int lval = 0; int rval; char op; cin>>lval; // Wczytywanie pierwszego argumentu wyraenia z lewej. if (!cin) error("Na pocz�tku nie ma argumentu wyraenia."); while (cin>>op) { // Wczytywanie operatora i prawego argumentu wyraenia na zmian�. cin>>rval; if (!cin) error("Nie ma drugiego argumentu wyraenia."); switch(op) { case '+': lval += rval; // Dodawanie: lval = lval + rval break; case '–': lval –= rval; // Odejmowanie: lval = lval – rval break; case '*': lval *= rval; // Mnoenie: lval = lval · rval break; case '/': lval /= rval; // Dzielenie: lval = lval / rval break; default: // Koniec operatorów — drukowanie wyniku. cout << "Wynik: " << lval << '\n'; keep_window_open(); return 0; }

Kup książkę Poleć książkę

Page 26: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

182 ROZDZIA 6 • PISANIE PROGRAMU

} error("Nieprawid�owe wyraenie.");}

Wygl�da nie le, ale gdy wpiszemy wyra�enie 1+2*3, to ujrzymy wynik 9 zamiast 7, któregospodziewaliby�my si� na podstawie wiedzy zdobytej w szkole podstawowej. Analogiczniewynikiem wyra�enia 1-2*3 b�dzie -3 zamiast spodziewanego -5. Kalkulator wykonuje dzia�aniaw z�ej kolejno�ci — wyra�enie 1+2*3 jest liczone jako (1+2)*3 zamiast 1+(2*3). Analogicznie1-2*3 jest liczone jako (1-2)*3 zamiast 1-(2*3). Lipa! Mogliby�my uzna�, �e zasada, i� „mno�e-nie wi��e mocniej ni� dodawanie” jest g�upi� i przestarza�� konwencj�, ale nie mo�emy zi-gnorowa� wielowiekowej tradycji, aby u�atwi� sobie programowanie.

6.3.2. TokenyMusimy zatem znale � sposób na wczytywanie cz��ci wiersza „na zapas”, aby sprawdzi�, czynie ma tam gdzie� operatora * (albo /). Je�li jest, musimy zmieni� kolejno�� wykonywania dzia�a�.Niestety próbuj�c wczyta� nieco danych z wyprzedzeniem, napotkamy kilka trudno�ci:

1. Nie wymagamy, aby wyra�enie znajdowa�o si� w jednym wierszu. Na przyk�ad po-ni�sze te� jest poprawne:

1+2

2. Jak znale � znaki * i / w�ród cyfr, plusów, minusów i nawiasów w kilku wierszach danychwej�ciowych?

3. Jak zapami�ta�, gdzie znajdowa� si� znaleziony znak *?

4. Jak wykona� obliczenia, które nie s� �ci�le typu „od lewej do prawej”?

Postanowili�my by� wielkimi optymistami i zaj�� si� tylko punktami 1 – 3. Ostatnim zaj-miemy si� troch� pó niej.

Poszukamy pomocy. Przecie� kto� na pewno zna typowy sposób wczytywania danych typuliczby i operatory i zapisywania ich w taki sposób, aby mo�na je by�o �atwo wykorzysta� w obli-czeniach. Ta konwencjonalna i przydatna technika nazywa si� rozbiorem na sk�adniki, czylitokeny (ang. tokenize) — wczytuje si� dane i dzieli je na tokeny. Na przyk�ad wyra�enie

45+11.5/7

zosta�oby roz�o�one na tokeny

45+11.5/7

Token to sekwencja znaków, która reprezentuje pewn� ca�o��, np. liczb� lub operator. Kompila-tor C++ dzieli na tokeny kod ród�owy. W istocie ró�ne formy rozk�adu na czynniki s�podstaw� analizy wi�kszo�ci rodzajów tekstów. W wyra�eniach matematycznych w j�zykuC++ potrzebujemy trzech rodzajów tokenów:

Kup książkę Poleć książkę

Page 27: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .3 . WRACAJ�C DO KALKULATORA 183

� litera�y zmiennoprzecinkowe — zgodnie z definicj� w C++, np. 3.14, 0.274e2 i 42;

� operatory — +, -, *, / oraz %;

� nawiasy — ( i ).

Wydaje si�, �e trudno�ci mog� nastr�cza� litera�y zmiennoprzecinkowe. Wczytanie liczby 12wydaje si� znacznie �atwiejsze ni� 12.3e-3. Ale kalkulatory zazwyczaj wykonuj� dzia�ania naliczbach zmiennoprzecinkowych. Analogicznie podejrzewamy, �e aby nasz kalkulator by� przy-datny, musi obs�ugiwa� nawiasy.

W jaki sposób reprezentuje si� takie tokeny w programie? Mo�na spróbowa� zapami�ty-wa�, gdzie ka�dy token si� zaczyna, a gdzie ko�czy, ale to mo�e by� uci��liwe (zw�aszcza je�lipozwolimy na wpisywanie wyra�e� obejmuj�cych wi�cej ni� jeden wiersz). Dodatkowo, je�lib�dziemy zapisywa� warto�ci jako sekwencje znaków, b�dziemy musieli pó niej znale �sposób na odczytanie tych warto�ci. To znaczy, je�li liczb� 42 zapiszemy jako znaki 4 i 2, pó niejb�dziemy musieli odgadn��, �e te dwa znaki reprezentuj� liczb� 42 (tzn. 4*10+2). Oczywi-stym i konwencjonalnym rozwi�zaniem tego problemu jest przedstawienie ka�dego tokenujako pary (rodzaj, warto��). Pierwszy element informuje o rodzaju tokenu — liczba, operator,nawias. Drugi natomiast np. w przypadku liczb okre�la dok�adn� warto��.

Jak wi�c wykorzysta� pomys� par (rodzaj, warto��) w kodzie? Zdefiniujemy typ Tokendo reprezentowania tokenów. Po co? Przypomnij sobie, po co u�ywamy typów: przechowuj�potrzebne nam dane i pozwalaj� wykonywa� na nich ró�ne operacje. Na przyk�ad typ int pozwalaprzechowywa� liczby ca�kowite i umo�liwia dodawanie, odejmowanie, mno�enie oraz dzielenietych liczb. Natomiast typ string przechowuje �a�cuchy znaków i pozwala je np. ��czy�. W j�-zyku C++ i jego bibliotece standardowej dost�pnych jest wiele typów, np. char, int, double,string, vector i ostream. Nie ma jednak typu Token. W istocie mo�na wymieni� mnóstwo ty-pów — tysi�ce, a nawet dziesi�tki tysi�cy — które chcieliby�my mie� do dyspozycji, a któ-rych nie ma w j�zyku ani jego bibliotece standardowej. Do naszych ulubionych typów, którenie s� standardowo dost�pne, nale�� Matrix (zobacz rozdzia� 24.), Date (zobacz rozdzia� 9.) orazreprezentuj�ce go liczby ca�kowite niesko�czonej precyzji (poszukaj w internecie informacji natemat typu Bignum). Je�li przemy�lisz to, dojdziesz do wniosku, �e j�zyk nie mo�e standardo-wo obs�ugiwa� dziesi�tek tysi�cy typów — kto by je zdefiniowa� i zaimplementowa�, kto byje potem znalaz�, nie mówi�c ju� o tym, jak gruby musia�by by� podr�cznik do nauki takiegoj�zyka. J�zyk C++ wzorem innych nowoczesnych j�zyków programowania rozwi�zuje tenproblem, pozwalaj�c u�ytkownikowi definiowa� w�asne (niestandardowe) typy (ang. user-definedtype — typ zdefiniowany przez u�ytkownika).

6.3.3. Implementowanie tokenówJak powinien wygl�da� token? To znaczy, jakie w�a�ciwo�ci powinien mie� nasz typ Token?Musi nadawa� si� do reprezentowania operatorów (np. + i -) i warto�ci liczbowych (np. 42 i 3.14).Oczywistym rozwi�zaniem jest zaimplementowanie czego� takiego, co mo�e zawiera� informacj�na temat rodzaju tokenu i w razie potrzeby jego warto��:

Kup książkę Poleć książkę

Page 28: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

184 ROZDZIA 6 • PISANIE PROGRAMU

Pomys� ten mo�na zaimplementowa� w j�zyku C++ na wiele sposobów. Przedstawiamynajprostszy, który wydaje nam si� u�yteczny:

class Token { // Bardzo prosty typ zdefiniowany przez uytkownika.public: char kind; double value;};

Token to typ (tak samo jak int czy char), a wi�c mo�na go u�ywa� do definiowania zmiennychi przechowywania warto�ci. Sk�ada si� z dwóch cz��ci (nazywanych sk�adowymi) — kind(rodzaj) oraz value (warto��). S�owo kluczowe class oznacza „typ zdefiniowany przez u�yt-kownika”. Wskazuje definicj� typu z zerem lub wi�ksz� liczb� sk�adowych. Pierwsza sk�adowao nazwie kind jest znakiem char, a wi�c mo�na jej u�y� do przechowywania znaków '+' i '*',które b�d� reprezentowa�y operatory. Przy u�yciu tego typu mo�na tworzy� nast�puj�ce in-strukcje:

Token t; // Zmienna t jest typu Token.t.kind = '+'; // Zmienna t reprezentuje znak +.Token t2; // Zmienna t2 jest innym obiektem typu Token.t2.kind = '8'; // Cyfra 8 oznacza rodzaj (kind) tokenu b�d�cy liczb�.t2.value = 3.14;

Aby uzyska� dost�p do sk�adowej, pos�ugujemy si� odpowiedni� notacj� — nazwa_obiektu.�nazwa_sk�adowej. Tekst t.kind mo�na przeczyta� jako „rodzaj obiektu t”, a t2.value jako„warto�� obiektu t2”. Obiekty typu Token mo�na kopiowa� tak samo jak typu int:

Token tt = t; // Inicjacja kopiiif (tt.kind != t.kind) error("To niemoliwe!");t = t2; // przypisaniecout << t.value; // wydrukuje 3.14

Maj�c typ Token, wyra�enie (1.5+4)*11 mo�na przedstawi� za pomoc� siedmiu tokenów:

Nale�y zauwa�y�, �e proste tokeny, jak +, nie maj� warto�ci, a wi�c do ich reprezentowanianiepotrzebna jest sk�adowa value. Potrzebowali�my znaku, który oznacza�by liczb�. Wybórpad� na '8', poniewa� nie jest to operator ani znak interpunkcyjny. Wykorzystanie '8' w takisposób jest dosy� tajemnicze, ale na razie mo�e by�.

Token jest przyk�adem typu zdefiniowanego przez u�ytkownika w j�zyku C++. Typy takiepoza danymi sk�adowymi mog� te� zawiera� funkcje (operacje) sk�adowe. Istnieje wiele po-wodów, dla których si� je definiuje. My zdefiniujemy tylko dwie, aby u�atwi� sobie inicjowanieobiektów typu Token:

class Token {public: char kind; // Rodzaj tokenu double value; // Dla liczb: warto��.

Kup książkę Poleć książkę

Page 29: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .3 . WRACAJ�C DO KALKULATORA 185

Token(char ch) // Tworzy Token ze znaku. :kind(ch), value(0) { } Token(char ch, double val) // Tworzy Token ze znaku i warto�ci typu double. :kind(ch), value(val) { }};

Nie s� to zwyk�e funkcje sk�adowe, tylko tzw. konstruktory. Maj� tak� sam� nazw� jak ichtyp i s�u�� do inicjalizowania (tworzenia) obiektów typu Token. Na przyk�ad:

Token t1('+'); // Inicjacja zmiennej t1 — t1.kind = '+'.Token t2('8',11.5); // Inicjacja zmiennej t2 — t2.kind = '8' i t2.value = 11.5.

Tekst :kind(ch), value(0) w pierwszym konstruktorze oznacza: „Zainicjuj sk�adow� kind war-to�ci� ch, a value ustaw na 0”. W drugim konstruktorze znajduje si� tekst :kind(ch), value(val),który oznacza: „Zainicjuj sk�adow� kind warto�ci� ch, a value ustaw na val”.W obu przypadkachnie trzeba robi� nic wi�cej, aby utworzy� obiekt typu Token, dlatego tre�� funkcji jest pusta —{ }. Specjalna sk�adnia inicjuj�ca (ang. member initializer list — lista warto�ci inicjuj�cychsk�adowe), która zaczyna si� dwukropkiem, jest u�ywana tylko w konstruktorach.

Zauwa�, �e konstruktor nie zwraca warto�ci. Dlatego nie trzeba (a nawet nie mo�na) de-finiowa� typu zwrotnego konstruktora. Wi�cej na temat konstruktorów napiszemy w roz-dzia�ach 9.4.2 i 9.7.

6.3.4. U�ywanie tokenówMo�e spróbujemy doko�czy� nasz kalkulator! Chocia� warto by by�o najpierw opracowa� jaki�plan dzia�ania. Jak b�dziemy wykorzystywa� obiekty typu Token w programie? Mo�emy wczyta� da-ne wej�ciowe do wektora takich obiektów:

Token get_token(); // Wczytuje token ze strumienia cin.vector<Token> tok; // Tutaj b�dziemy zapisywa� tokeny.int main(){ while (cin) { Token t = get_token(); tok.push_back(t); } // …}

Teraz mo�emy wczyta� wyra�enie w ca�o�ci i dopiero po tym obliczy� jego warto��. W przy-padku 11*12 otrzymamy co� takiego:

W strukturze tej mo�emy znale � operator i jego operandy. Gdy to zrobimy, z �atwo�ci� wyko-namy dzia�anie mno�enia, poniewa� liczby 11 i 12 zosta�y zapisane jako warto�ci liczbowe, a nie�a�cuchy.

Teraz przeanalizujemy bardziej skomplikowane wyra�enie. Dla wyra�enia 1+2*3 tok b�dziezawiera� pi�� obiektów typu Token:

Kup książkę Poleć książkę

Page 30: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

186 ROZDZIA 6 • PISANIE PROGRAMU

W tym przypadku operator mno�enia mo�na znale � za pomoc� prostej p�tli:

for (int i = 0; i<tok.size(); ++i) { if (tok[i].kind=='*') { // Znale�li�my operator mnoenia! double d = tok[i–1].value*tok[i+1].value; // Co teraz? }}

No dobrze, ale co teraz? Co zrobimy z iloczynem d? Jak okre�li� kolejno�� wykonywaniadzia�a� w wyra�eniu? Operator + znajduje si� przed *, a wi�c nie mo�emy po prostu wykona�wszystkich dzia�a� od lewej do prawej. Mo�emy spróbowa� od prawej do lewej! To by si�sprawdzi�o w przypadku wyra�enia 1+2*3, ale ju� nie dla wyra�enia 1*2+3. Nie wspominaj�c ju�o takim czym�, jak 1+2*3+4. To wyra�enie trzeba obliczy� „od �rodka” — 1+(2*3)+4. Jak pora-dzimy sobie z nawiasami? Wydaje si�, �e utkn�li�my. Musimy si� wycofa�, przesta� na chwil�programowa� i pomy�le� nad wczytywaniem oraz tym, jak rozumiemy �a�cuch wej�ciowy i jakobliczamy jego warto�� jako wyra�enia.

Pierwsza entuzjastyczna próba rozwi�zania problemu (napisania kalkulatora) zako�czy�a si�klap�. Pierwsze podej�cia cz�sto tak si� ko�cz� i sytuacje takie s� nam potrzebne, poniewa�dzi�ki nim mo�emy lepiej zrozumie� natur� problemu. W tym przypadku nawet poznali�myprzydatne poj�cie tokenu, które samo jest przyk�adem poj�cia pary (nazwa,warto��), z którymb�dziemy jeszcze wielokrotnie si� spotyka�. Musisz jednak pami�ta�, �e takie bezmy�lne i nie-planowane pisanie kodu nie powinno zajmowa� zbyt du�o czasu. Przed dokonaniem analizy(prób� zrozumienia problemu) i opracowaniem projektu (opracowaniem ogólnej strukturyrozwi�zania) powinno si� napisa� bardzo ma�o kodu.

WYPRÓBUJ

Z drugiej strony, czemu nie mogliby�my znale � prostego rozwi�zania tego problemu?Nie wydaje si� a� taki trudny. Podj�cie próby rozwi�zania problemu, nawet zako�-czone fiaskiem, mo�e doprowadzi� nas do lepszego zrozumienia problemu i opra-cowania rozwi�zania. Pomy�l, co mo�esz zrobi� od razu. Jako przyk�ad niech pos�u�ywyra�enie 12.5+2. Mo�emy rozbi� je na tokeny, doj�� do wniosku, �e to bardzo pro-ste wyra�enie i obliczy� wynik. Mo�e by�oby troch� ba�aganu, ale rozwi�zanie jestproste, wi�c mo�e warto pod��y� w tym kierunku i znale � co�, co wystarczy! Po-my�l, co by� zrobi�, gdyby� znalaz� operatory + i * w wierszu 2+3*4. To tak�e mo�naobliczy� „na piechot�”. Jak by�my sobie poradzili ze skomplikowanym wyra�eniemtypu 1+2*3/4%5+(6-7*(8))? Jak by�my radzili sobie z b��dami, np. 2+*3 albo 2&3?Pomy�l nad tym przez chwil�. Mo�esz zrobi� sobie notatki na kartce, nakre�l mo�-liwe rozwi�zania oraz wypisz interesuj�ce lub wa�ne wyra�enia.

6.3.5. Powrót do tablicyJeszcze raz przeanalizujemy problem, tym razem staraj�c si� nie wyrywa� z nieprzemy�lany-mi pomys�ami. Jedyne, co odkryli�my, to fakt, �e obliczenie przez program tylko jednego

Kup książkę Poleć książkę

Page 31: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .3 . WRACAJ�C DO KALKULATORA 187

wyra�enia sprawia nam trudno�ci. Chcieliby�my mie� mo�liwo�� obliczenia wielu wyra�e�w jednym uruchomieniu programu. W zwi�zku z tym wzbogacamy nasz pseudokod w na-st�puj�cy sposób:

while (nie_sko�czone) { wczytaj_wiersz oblicz // wykonaj prac� wydrukuj_wynik}

To z pewno�ci� komplikuje spraw�, ale musimy wzi�� pod uwag� fakt, �e kalkulatorów zazwy-czaj u�ywa si� do wykonywania kilku oblicze� po kolei. Czy mamy kaza� u�ytkownikowi uru-chamia� nasz program ponownie, aby wykona� ka�de obliczenie? Mogliby�my, ale w wielunowoczesnych systemach operacyjnych uruchamianie programów trwa za d�ugo, a wi�c lepiejtego nie robi�.

Kiedy patrzymy na nasz pseudokod, nasze pocz�tkowe próby rozwi�zania problemu i przy-k�ady u�ycia, nasuwa si� nam kilka pyta� (i kilka nie�mia�ych odpowiedzi):

1. Je�li u�ytkownik wpisze 45+5/7, jak znajdziemy poszczególne elementy — 45, 5, / i 7?Odpowied : podzielimy na tokeny!

2. W jaki sposób oznaczymy koniec wyra�enia? Oczywi�cie znakiem nowego wiersza (zaw-sze podejrzliwie traktuj zwroty typu „oczywi�cie” — „oczywi�cie” to nie �aden powód!

3. Jak zaprezentujemy wyra�enie 45+5/7 jako dane, aby mo�na by�o obliczy� wynik? Przedwykonaniem dodawania musimy w jaki� sposób zamieni� znaki 4 i 5 w liczb� ca�kowit�45 (tj. 4*10+5). Zatem podzia� na tokeny jest cz��ci� rozwi�zania.

4. Jak sprawi�, aby wyra�enie 45+5/7 by�o obliczane jako 45+(5/7), a nie (45+5)/7?

5. Ile wynosi 5/7? Oko�o .71, a wi�c to nie jest liczba ca�kowita. Z do�wiadczenia wiemy,�e u�ytkownicy kalkulatorów oczekuj� wyników zmiennoprzecinkowych. Czy po-winni�my pozwoli� na wpisywanie liczb zmiennoprzecinkowych? Oczywi�cie!

6. Czy mo�emy pozwoli� na u�ywanie zmiennych? Mogliby�my na przyk�ad napisa�:v=7m=9v*m

Dobry pomys�, ale zostawimy to na pó niej. Na razie zajmiemy si� podstawow� funk-cjonalno�ci�.

Najwa�niejsza decyzja to prawdopodobnie odpowied na pytanie w punkcie 6. W rozdziale 7.8zobaczysz, �e odpowied ta poci�gnie za sob� prawie podwojenie rozmiaru wst�pnej wersji pro-jektu. To podwoi�oby czas potrzebny na uruchomienie wst�pnej wersji programu. Podejrze-wamy, �e pocz�tkuj�cy potrzebowa�by nawet cztery razy wi�cej czasu i niewykluczone, �e stra-ci�by w ko�cu cierpliwo��. We wczesnych fazach prac nad projektem nale�y zawsze unika�przesady z liczb� funkcji. Wst�pna wersja zawsze powinna by� prosta i zawiera� tylko najwa�-niejsze funkcje. Kiedy uda Ci si� zmusi� co� do dzia�ania, mo�esz postawi� sobie bardziej am-bitne wymagania. Budowa programu etapami jest znacznie �atwiejsza ni� wszystkiego na raz.Odpowied „tak” na pytanie 6. mia�aby jeszcze jeden z�y wynik: mog�oby by� trudno oprze�

Kup książkę Poleć książkę

Page 32: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

188 ROZDZIA 6 • PISANIE PROGRAMU

si� pokusie dodania jeszcze innych funkcji. Mo�e warto pomy�le� o funkcjach matematycznychalbo o p�tlach? Gdy zacznie si� dodawa� kolejne „fajne” funkcje, trudno przesta�.

Z programistycznego punktu widzenia najbardziej k�opotliwe s� punkty 1, 3 i 4. Ponadtos� ze sob� powi�zane, poniewa� gdy znajdziemy ju� 45 i +, co mamy z nimi zrobi�? Tzn., jakzapisa� je w programie? Oczywi�cie cz��ciowym rozwi�zaniem tego problemu jest podzia� natokeny, ale tylko cz��ciowym.

Co zrobi�by do�wiadczony programista? Gdy mamy do rozwi�zania jaki� trudny technicznyproblem, cz�sto mo�na znale � jakie� standardowe rozwi�zanie. Wiemy, �e ludzie pisz� kalku-latory, przynajmniej od kiedy istniej� komputery przyjmuj�ce dane symboliczne z klawiatury,a wi�c od 50 lat. Musi by� jakie� standardowe rozwi�zanie! W takiej sytuacji do�wiadczonyprogramista konsultuje si� z kolegami i przeszukuje dost�pn� literatur�. By�oby g�upstwemmy�le�, �e w jeden dzie� uda si� wymy�le� co� lepszego, ni� inni wymy�lili przez 50 lat.

6.4. GramatykiIstnieje standardowa odpowied na pytanie, jak rozszyfrowa� znaczenie wyra�enia: najpierwwprowadzone znaki nale�y zebra� i podzieli� na tokeny (to ju� sami odkryli�my). Je�li u�yt-kownik wpisze:

45+11.5/7

program powinien utworzy� nast�puj�c� list� tokenów:

45+11.5/7

Token to sekwencja znaków, któr� uwa�amy za jak�� jednostk�, np. operator lub liczb�.Po utworzeniu tokenów program musi upewnia� si�, �e ca�e wyra�enie jest poprawnie

rozumiane. Na przyk�ad wiemy, �e wyra�enie 45+11.5/7 oznacza 45+(11.5/7), a nie(45+11.5)/7. S�k w tym, jak nauczy� program tej przydatnej zasady (dzielenie „wi��e mocniej”ni� dodawanie)? Standardowa odpowied jest taka, �e piszemy gramatyk� definiuj�c� sk�adni�naszych danych wej�ciowych, a nast�pnie piszemy program, w którym implementujemy zasadytej gramatyki. Na przyk�ad:

// Prosta gramatyka wyrae�:

Expression: Term Expression "+" Term // dodawanie Expression "–" Term // odejmowanieTerm: Primary Term "*" Primary // mnoenie Term "/" Primary // dzielenie Term "%" Primary // reszta z dzielenia (modulo)Primary: Number

Kup książkę Poleć książkę

Page 33: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .4 . GRAMATYKI 189

"(" Expression ")" // grupowanieNumber: floating-point-literal

Jest to zestaw prostych zasad. Ostatni� nale�y czyta� nast�puj�co: „Number (liczba) to litera�zmiennoprzecinkowy”. Natomiast tre�� przedostatniej jest taka: „Primary (czynnik) jest liczb�lub znakiem '(', po którym jest wyra�enie i znak ')'”. Regu�y dla Expression (wyra�enia) i Term(sk�adnika) s� podobne. Ka�da z nich jest zdefiniowana z uwzgl�dnieniem jednej z regu�,które znajduj� si� dalej.

Jak pami�tamy z podrozdzia�u 6.3.2, nasze tokeny — zgodnie z definicj� w j�zyku C++— to:

� litera� zmiennoprzecinkowy (zgodny z definicj� w j�zyku C++, np. 3.14, 0.274e2lub 42);

� +, -, *, / oraz % — operatory;

� ( i ) — nawiasy.

U�ywaj�c gramatyki i tokenów, zrobili�my bardzo du�y poj�ciowy skok w stosunku do naszegopocz�tkowego pseudokodu. Tego rodzaju post�py chcieliby�my robi� zawsze, ale rzadko si�to udaje bez pomocy. Do tego w�a�nie s�u�� do�wiadczenie, literatura i mentorzy.

Na pierwszy rzut oka gramatyka ta wydaje si� bezsensowna. Cz�sto tak jest z notacj�techniczn�. Pami�taj jednak, �e jest to ogólna i elegancka (co w ko�cu docenisz) notacja doopisu czego�, co potrafisz robi� przynajmniej od czasów szko�y podstawowej. Nie masz pro-blemu z obliczeniem wyra�enia 1-2*3 albo 1+2-3 lub 3*2+4/2. Potrafisz jednak wyja�ni�, jakto robisz? Umiesz to tak wyja�ni�, aby zrozumia� to nawet kto�, kto nigdy nie mia� styczno�ciz konwencjonaln� arytmetyk�? Czy Twoje wyja�nienia b�d� mia�y zastosowanie dla wszyst-kich kombinacji operatorów i argumentów? Aby wystarczaj�co szczegó�owo i precyzyjnieobja�ni� co� komputerowi, potrzebna jest odpowiednia notacja — a gramatyka nale�y donajlepszych konwencjonalnych narz�dzi do jej tworzenia.

Jak czyta si� gramatyk�? Maj�c pewne dane wej�ciowe, zaczyna si� od pierwszej regu�y,Expression (wyra�enie), i przeszukuje kolejne, znajduj�c te, które pasuj� do tokenów w miar�ich wczytywania. Wczytywanie strumienia tokenów zgodnie z zasadami gramatyki nazywa si�parsowaniem (analiz� sk�adniow�), a program, który to robi, nazywamy parserem (ang.parser) lub analizatorem sk�adni (ang. syntax analyzer). Nasz analizator odczytuje tokeny odlewej do prawej, dok�adnie w takiej kolejno�ci, jak je wpisujemy i czytamy. Wypróbujemy jaki�bardzo prosty przyk�ad: czy 2 jest wyra�eniem?

1. Wyra�enie (Expression) musi by� sk�adnikiem (Term) lub ko�czy� si� sk�adnikiem.Sk�adnik musi by� czynnikiem (Primary) lub ko�czy� si� czynnikiem. Ten czynnikmusi zaczyna� si� znakiem ( lub by� liczb� (Number). Oczywi�cie 2 nie jest znakiem (,tylko litera�em zmiennoprzecinkowym, a wi�c liczb�, która jest czynnikiem.

2. Przed tym czynnikiem (liczba 2) nie ma znaku /, * ani %, a wi�c jest to kompletnysk�adnik (a nie zako�czenie wyra�enia z operatorem /, * lub %).

3. Przed sk�adnikiem tym (Primary 2) nie ma znaku + ani -, a wi�c jest to pe�ne wyra�enie(Expression), a nie zako�czenie wyra�enia z operatorem + lub -.

Kup książkę Poleć książkę

Page 34: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

190 ROZDZIA 6 • PISANIE PROGRAMU

W zwi�zku z tym zgodnie z nasz� gramatyk� 2 jest wyra�eniem. Przegl�d gramatyki mo�naprzedstawi� graficznie:

Na rysunku zosta�a przedstawiona �cie�ka, któr� przemierzyli�my przez definicje. Odwracaj�cnasze rozumowanie, mo�emy powiedzie�, �e 2 jest wyra�eniem, poniewa� jest litera�em zmien-noprzecinkowym, który jest liczb�, liczba jest czynnikiem, czynnik jest sk�adnikiem, a sk�ad-nik wyra�eniem.

Spróbujmy czego� bardziej skomplikowanego. Czy 2+3 jest wyra�eniem? Naturalnieznaczna cz��� rozumowania b�dzie taka sam jak dla 2:

1. Wyra�enie musi by� sk�adnikiem lub mie� go na ko�cu. Sk�adnik musi by� czynnikiemlub ko�czy� si� czynnikiem, który z kolei musi zaczyna� si� od znaku ( lub by� liczb�.Oczywi�cie 2 nie jest znakiem (, ale jest litera�em zmiennoprzecinkowym, który jestliczb�, ta z kolei jest czynnikiem.

2. Przed tym czynnikiem (liczba 2) nie ma znaku /, * ani %, a wi�c jest to kompletnysk�adnik (a nie zako�czenie wyra�enia z operatorem /, * lub %).

3. Za sk�adnikiem tym (Primary 2) jest znak +, a wi�c jest to koniec pierwszej cz��ci wy-ra�enia i musimy poszuka� sk�adnika za tym znakiem. Dok�adnie w taki sam sposób,jak w przypadku 2 dowiadujemy si�, �e 3 jest sk�adnikiem. Poniewa� za 3 nie ma znaku +ani -, uznajemy, �e jest to pe�ny sk�adnik, a nie pierwsza cz��� wyra�enia z operatorem +lub -. W zwi�zku z tym 2+3 spe�nia zasad� Expression+Term, a wi�c jest wyra�eniem.

Znowu nasz tok rozumowania mo�emy przedstawi� graficznie (pomijamy zasad� litera�uzmiennoprzecinkowego jako liczby dla uproszczenia):

Kup książkę Poleć książkę

Page 35: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .4 . GRAMATYKI 191

Na rysunku przedstawili�my �cie�k�, któr� przemierzyli�my przez definicje. Odwracaj�c na-sze rozumowanie, mo�emy powiedzie�, �e 2+3 jest wyra�eniem, poniewa� 2 jest sk�adnikiem,który jest wyra�eniem, 3 jest sk�adnikiem oraz wyra�enie ze znakiem + i sk�adnikiem równie�jest wyra�eniem.

Prawdziwym powodem, dla którego zainteresowali�my si� gramatykami, jest fakt, �e mog�one nam pomóc w rozwi�zaniu problemu poprawnego przetwarzania wyra�e� z operatorami *i +. Spróbujemy zatem przeanalizowa� wyra�enie 45+11.5*7. Zabawa w komputer szczegó-�owo sprawdzaj�cy wszystkie regu�y by�aby �mudna. Dlatego pominiemy niektóre po�rednieetapy, które opisali�my ju� przy analizie 2 i 2+3. Oczywi�cie 45, 11.5 i 7 to litera�y zmienno-przecinkowe, które s� liczbami, liczby za� s� czynnikami, a wi�c mo�emy zignorowa�wszystkie regu�y poni�ej czynnika (Primary). Otrzymujemy:

1. 45 jest wyra�eniem, po którym znajduje si� znak +, a wi�c szukamy wyrazu zamykaj�-cego regu�� Expression+Term.

2. 11.5 jest sk�adnikiem, po którym znajduje si� znak *, a wi�c szukamy czynnika ko�-cz�cego regu�� Term*Primary.

3. 7 jest czynnikiem, a wi�c 11.5*7 jest sk�adnikiem zgodnie z regu�� Term*Primary. Te-raz widzimy, �e 45+11.5*7 jest wyra�eniem zgodnie z regu�� Expression+Term. Mówi�cdok�adniej, jest to wyra�enie, w którym najpierw jest wykonywane mno�enie 11.5*7,a potem dodawanie 45+11.5*7, dok�adnie tak, jak gdyby�my napisali 45+(11.5*7).

Na nast�pnej stronie przedstawiamy graficzn� ilustracj� naszego rozumowania (znowu pomijamyzasad� litera�u zmiennoprzecinkowego jako liczby dla uproszczenia).

Kup książkę Poleć książkę

Page 36: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

192 ROZDZIA 6 • PISANIE PROGRAMU

Powy�szy rysunek obrazuje nasz tok rozumowania. Zauwa�, jak regu�a Term*Primary zapewnia,�e 11.5 zostanie pomno�one przez 7 zamiast dodane do 45.

Pocz�tkowo mo�e wydawa� Ci si� to trudne do zrozumienia, ale ludzie czytaj� gramatyki,a te prostsze �atwo zrozumie�. Naszym celem nie by�o jednak nauczy� Ci� rozumie� wyra�e�2+2 czy 45+11.5*7. To ju� ka�dy potrafi. Szukali�my sposobu na obja�nienie komputerowi, cooznacza wyra�enie 45+11.5*7 i wiele innych skomplikowanych wyra�e�, które mog� zosta�mu podsuni�te do obliczenia. Skomplikowane gramatyki nie nadaj� si� do odczytu przezcz�owieka, ale komputery radz� sobie z nimi doskonale. Analizuj� ich regu�y szybko i prawi-d�owo, a przychodzi im to z �atwo�ci�. W tym w�a�nie komputery s� dobre — w dok�adnymwykonywaniu polece�.

6.4.1. Dygresja — gramatyka j�zyka angielskiegoJe�li nigdy dot�d nie mia�e� do czynienia z gramatykami, to pewnie czujesz si� oszo�omiony.W istocie mo�esz czu� si� niepewnie, nawet je�li ju� si� z czym� takim spotka�e� wcze�niej.Spójrz na poni�szy fragment gramatyki j�zyka angielskiego:

Sentence : Noun Verb // np. C++ rules Sentence Conjunction Sentence // np. Birds fly but fish swimConjunction : "and" "or" "but"Noun : "birds" "fish" "C++"Verb : "rules" "fly" "swim"

Kup książkę Poleć książkę

Page 37: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .4 . GRAMATYKI 193

Zdania s� zbudowane z cz��ci mowy (np. rzeczowników, czasowników i ��czników). Mo�na jeprzeanalizowa� pod k�tem tych regu�, aby sprawdzi�, które s�owa s� rzeczownikami, czasowni-kami itd. Ta prosta gramatyka zawiera tak�e semantycznie bezsensowne zdania, tj. „C++ flyand birds rules”, ale poprawienie tego to ca�kiem inna kwestia, któr� nale�a�oby si� zaj�� w znacz-nie bardziej zaawansowanej ksi��ce.

Wiele osób uczono tych podstawowych zasad na zaj�ciach z j�zyka angielskiego w szkole.Istniej� nawet powa�ne dowody neurologiczne potwierdzaj�ce, �e takie zasady s� zakodowanew naszych mózgach.

Spójrz na podobne do wcze�niejszych drzewo parsowania, ale tym razem przedstawiaj�ceproste angielskie zdanie:

To nie jest takie skomplikowane. Je�li mia�e� problemy ze zrozumieniem podrozdzia�u 6.4,wró� do niego teraz i przeczytaj go ponownie. Za drugim razem mo�e by� o wiele bardziejzrozumia�y!

6.4.2. Pisanie gramatykiSk�d wzi�li�my te zasady gramatyki wyra�e�? Trzeba przyzna�, �e pomog�o nam w tymdo�wiadczenie. Robimy to w taki sposób, w jaki ludzie zazwyczaj pisz� gramatyki wyra�e�.Napisanie prostej gramatyki jest �atwe. Wystarczy wiedzie�, jak:

1. Odró�ni� zasad� od tokenu.

2. Wstawi� jedn� zasad� za drug� (sekwencja).

3. Wyrazi� alternatywne wzorce (alternacja).

4. Wyra�a� powtarzaj�ce si� wzorce (repetycja).

5. Rozpozna� pierwsz� zasad� gramatyki.

Kup książkę Poleć książkę

Page 38: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

194 ROZDZIA 6 • PISANIE PROGRAMU

W ró�nych ksi��kach i ró�nych systemach parsowania stosuje si� ró�ne notacje i terminologi�.Na przyk�ad niektórzy nazywaj� tokeny znakami terminalnymi, a zasady znakami nieter-minalnymi lub produkcjami. My umieszczamy tokeny w podwójnych cudzys�owach i za-czynamy od pierwszej zasady. Alternatywy znajduj� si� w osobnych wierszach, np.:

List: "{" Sequence "}"Sequence: Element Element " ," SequenceElement: "A" "B"

Zatem sekwencja (Sequence) jest elementem (Element) lub elementem i sekwencj� oddzielo-nymi od siebie przecinkiem. Element to litera A lub B. Lista (List) to sekwencja w nawiasachklamrowych. Mo�emy generowa� te listy (jak?):

{ A }{ B }{ A,B }{A,A,A,A,B }

Poni�sze natomiast nie s� listami (dlaczego?):

{ }A{ A,A,A,A,B{A,A,C,A,B }{ A B C }{A,A,A,A,B, }

Tej sekwencji nie nauczy�e� si� w przedszkolu ani nie zakodowa�e� w mózgu, chocia� nadalnie jest to nauka najwy�szych lotów. W rozdzia�ach 7.4 i 7.8.1 obja�nimy sposoby wyra�aniazasad syntaktycznych za pomoc� gramatyk.

6.5. Zamiana gramatyki w kodIstnieje wiele sposobów na zmuszenie komputera do respektowania zasad gramatyki. U�yje-my najprostszego — napiszemy po jednej funkcji dla ka�dej zasady i wykorzystamy nasz typToken do reprezentowania tokenów. Program implementuj�cy gramatyk� cz�sto nazywa si�parserem.

6.5.1. Implementowanie zasad gramatykiDo zaimplementowania naszego kalkulatora potrzebujemy czterech funkcji — jednej dowczytywania tokenów i po jednej dla ka�dej zasady w gramatyce:

get_token() // Wczytuje znaki i tworzy tokeny. // Wykorzystuje strumie� cin.expression() // Obs�uguje operatory + i –.

Kup książkę Poleć książkę

Page 39: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .5 . ZAMIANA GRAMATYKI W KOD 195

// Wywo�uje funkcje term() i get_token().term() // Obs�uguje operatory *, /, i %. // Wywo�uje funkcje primary() i get_token().primary() // Obs�uguje liczby i nawiasy. // Wywo�uje funkcje expression() i get_token().

Uwaga: ka�da funkcja zajmuje si� okre�lon� cz��ci� wyra�enia i reszt� zostawia pozosta�ymfunkcjom. To radykalnie upraszcza kod funkcji. Metod� t� mo�na porówna� ze wspó�prac� grupyludzi, gdzie ka�dy wykonuje swoje zadanie, a problemy znajduj�ce si� poza jego specjalno�ci�przekazuje do rozwi�zania innym.

Co powinny te funkcje robi�? Ka�da funkcja powinna wywo�ywa� inne funkcje gramatykizgodnie z zasad�, któr� implementuje, oraz funkcj� get_token(), je�li wymagany jest token.Je�li na przyk�ad funkcja primary() ma post�pi� zgodnie ze swoj� zasad� (Expression), musiwywo�a�:

get_token() // Do obs�ugi znaków ( i ).expression() // Do obs�ugi wyraenia.

Co powinny takie funkcje zwraca�? Co z odpowiedzi�, której w rzeczywisto�ci oczekujemy?Dla wyra�enia 2+3 funkcja expression() mog�aby zwróci� 5. Istotnie, wszystkie potrzebneinformacje s� dost�pne. Tego spróbujemy! Dzi�ki temu unikniemy odpowiedzi na jedno z na-szych najtrudniejszych pyta�: „Jak zaprezentowa� wyra�enie 45+5/7 w postaci danych, aby mo�naby�o obliczy� jego warto��?”. Zamiast zapisywa� reprezentacj� 45+5/7 w pami�ci, obliczamywarto�� tego wyra�enia przy wczytywaniu. Ten ma�y pomys� stanowi prawdziwy prze�om!Dzi�ki temu czterokrotnie zmniejszy si� obj�to�� kodu w stosunku do tego, co uzyskaliby�my,gdyby funkcja expression() zwraca�a co� skomplikowanego do obliczenia pó niej. W�a�niezaoszcz�dzili�my sobie oko�o 80 procent pracy.

Do towarzystwa nie pasuje funkcja get_token() — poniewa� obs�uguje tokeny, a nie wy-ra�enia, nie mo�e zwraca� warto�ci podwyra�e�. Na przyk�ad znaki ( i + nie s� wyra�eniami.Musi zatem zwraca� typ Token. Dochodzimy do wniosku, �e potrzebujemy nast�puj�cychfunkcji:

// Funkcje realizuj�ce zasady gramatyczne:Token get_token() // Wczytuje znaki i tworzy tokeny.double expression() // Obs�uguje znaki + i –.double term() // Obs�uguje znaki *, / i %.double primary() // Obs�uguje liczby i nawiasy.

6.5.2. Wyra�eniaNajpierw napiszemy funkcj� expression(). Gramatyka dla niej jest nast�puj�ca:

Expression: Term Expression '+' Term Expression '–' Term

Poniewa� to jest nasza pierwsza próba zamiany zasad gramatyki na kod, przedstawimy kilkab��dnych rozwi�za�. Tak to zazwyczaj wygl�da przy stosowaniu nowych technik, a poza tymjest to dobry sposób na nauczenie si� wielu rzeczy. W szczególno�ci pocz�tkuj�cy programista

Kup książkę Poleć książkę

Page 40: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

196 ROZDZIA 6 • PISANIE PROGRAMU

mo�e nauczy� si� bardzo du�o, patrz�c na dramatycznie ró�ne zachowania podobnych frag-mentów kodu. Czytanie kodu to przydatna umiej�tno��, któr� nale�y piel�gnowa�.

6.5.2.1. Wyra�enia — pierwsza próbaPatrz�c na zasad� Expression'+' Term, najpierw próbujemy wywo�a� funkcj� expression(),nast�pnie znale � znak + (i -) oraz wywo�a� funkcj� term():

double expression(){ double left = expression(); // Wczytuje i oblicza warto�� wyraenia. Token t = get_token(); // nast�pny token switch (t.kind) { // Sprawdza, jaki to jest rodzaj tokenu. case '+': return left + term(); // Wczytuje i sprawdza warto�� sk�adnika, // nast�pnie wykonuje dodawanie. case '–': return left – term(); // Wczytuje i sprawdza warto�� sk�adnika, // nast�pnie wykonuje odejmowanie. default: return left; // Zwraca warto�� wyraenia. }}

Wygl�da dobrze. To jest prawie naiwna transkrypcja gramatyki. Jest do�� prosta — najpierwwczytuje wyra�enie, a nast�pnie sprawdza, czy za nim znajduje si� znak + lub - i je�li tak,wczytuje sk�adnik (Term).

Niestety w rzeczywisto�ci to jest bez sensu. Sk�d wiadomo, gdzie ko�czy si� wyra�enie,dzi�ki czemu mo�na poszuka� znaków + i -? Przypominam, �e nasz program czyta od lewejdo prawej i nie mo�e wybiec do przodu, aby sprawdzi�, czy nie ma dalej znaku +. W istocie tawersja funkcji expression() nigdy nie wyjdzie poza pierwszy wiersz — zaczyna od wywo�aniafunkcji expression(), która zaczyna od wywo�ania funkcji expression() itd. w niesko�czono��.Nazywa si� to niesko�czon� rekurencj� (ang. infinite recursion), która jednak b�dzie mia�akoniec — gdy sko�czy si� w komputerze pami�� do przechowywania nigdy nieko�cz�cychsi� wywo�a� funkcji expression(). Poj�cie rekurencji oznacza wywo�ywanie funkcji przezsiebie sam�. Nie wszystkie rekurencje s� niesko�czone, poza tym technika ta jest bardzoprzydatna w programowaniu (zobacz rozdzia� 8.5.8).

6.5.2.2. Wyra�enia — druga próbaCo w takim razie robimy? Ka�dy sk�adnik jest wyra�eniem, ale nie ka�de wyra�enie jest sk�ad-nikiem. Mo�emy wi�c zacz�� od szukania sk�adnika i przej�� do szukania pe�nego wyra�eniatylko wówczas, gdy znajdziemy znak + lub -. Na przyk�ad:

double expression(){ double left = term(); // Wczytuje sk�adnik i oblicza jego warto��. Token t = get_token(); // nast�pny token switch (t.kind) { // Sprawdza, jaki to rodzaj tokenu. case '+':

Kup książkę Poleć książkę

Page 41: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .5 . ZAMIANA GRAMATYKI W KOD 197

return left + expression(); // Wczytuje wyraenie i sprawdza jego warto��, // a nast�pnie wykonuje dodawanie. case '–': return left – expression(); // Wczytuje wyraenie i oblicza jego warto��, // a nast�pnie wykonuje odejmowanie. default: return left; // Zwraca warto�� sk�adnika. }}

To jako� dzia�a. Wypróbowali�my ten kod w uko�czonym programie i stwierdzili�my, �e prze-twarza wszystkie poprawne wyra�enia (i ani jednego niepoprawnego). W wi�kszo�ci przypadkównawet zwraca prawid�owe wyniki. Na przyk�ad wyra�enie 1+2 jest wczytywane jako sk�adnik(o warto�ci 1), po którym jest znak + i wyra�enie (które w tym przypadku jest sk�adnikiemo warto�ci 2) — zwracany wynik to 3. Analogicznie dla wyra�enia 1+2+3 zwracana jest warto�� 6.Mo�emy d�ugo ci�gn�� list� przypadków, w których kod ten zwraca prawid�owe wyniki, aledo rzeczy — co stanie si� z wyra�eniem 1-2-3? Funkcja expression() wczyta 1 jako sk�adniki przejdzie do 2-3 jako wyra�enia (sk�adaj�cego si� ze sk�adnika 2 i wyra�enia 3). Nast�pnieodejmie warto�� wyra�enia 2-3 od 1. Innymi s�owy obliczy warto�� wyra�enia 1-(2-3), którawynosi 2 (liczba dodatnia). Nas jednak w szkole uczono (a mo�e i wcze�niej), �e 1-2-3 oznaczatyle, co (1-2)-3, a wi�c wynik powinien by� -4 (liczba ujemna).

W ten sposób utworzyli�my bardzo fajny program, który nie robi tego, co trzeba. Sytuacj�pogarsza fakt, �e w wielu przypadkach zwraca prawid�owy wynik. Na przyk�ad dla wyra�enia1+2+3 zostanie zwrócony wynik 6, poniewa� 1+(2+3) jest równowa�ne z (1+2)+3. Jaki by� naszpodstawowy z programistycznego punktu widzenia b��d? Zawsze nale�y zada� sobie to pytanie,gdy znajdzie si� b��d. Dzi�ki temu b�dzie mo�na unikn�� powtórzenia go innym razem.

Naszym problemem jest to, �e popatrzyli�my na kod i postanowili�my zgadywa�. To rzadkowystarcza! Musimy rozumie�, co robi nasz kod, i umie� wyja�ni�, czemu robi to, co trzeba.

Ponadto analizowanie b��dów jest cz�sto najlepszym sposobem na znalezienie poprawnegorozwi�zania. Nasza funkcja expression() szuka najpierw sk�adnika, a nast�pnie, je�li znajduje si�za nim znak + lub -, wyra�enia. Jest to w rzeczywisto�ci implementacja nieco innej gramatyki:

Expression: Term Term '+' Expression // dodawanie Term '–' Expression // odejmowanie

Ró�nica mi�dzy t� a nasz� gramatyk� polega na tym, �e my chcieli�my, aby wyra�enie 1-2-3 by�otraktowane jako wyra�enie 1-2, po którym jest znak - i sk�adnik 3. Natomiast uzyskali�mysk�adnik 1, po którym znajduje si� znak - i wyra�enie 2-3. Innymi s�owy chcieli�my, aby 1-2-3oznacza�o (1-2)-3, a nie 1-(2-3).

Tak, debugowanie bywa �mudne, trudne i czasoch�onne, ale w tym przypadku pracujemynad zasadami wyuczonymi w podstawówce. S�k w tym, �e musimy „wpoi�” je komputerowi,który uczy si� znacznie wolniej od nas.

Zauwa�, �e mogliby�my zdefiniowa� 1-2-3 jako 1-(2-3) zamiast (1-2)-3 i unikn�� ca�ejtej dyskusji. Cz�sto najtrudniejszymi problemami w programowaniu s� zasady, które zosta�yustalone dla ludzi wiele lat przed tym, jak zacz�li�my u�ywa� komputerów.

Kup książkę Poleć książkę

Page 42: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

198 ROZDZIA 6 • PISANIE PROGRAMU

6.5.2.3. Wyra�enia — do trzech razy sztukaCo teraz? Spójrz jeszcze raz na gramatyk� (t� poprawn� w podrozdziale 6.5.2) — ka�de wyra-�enie zaczyna si� sk�adnikiem, po którym mo�e znajdowa� si� znak + lub -. Musimy wi�cposzuka� sk�adnika, sprawdzi�, czy znajduje si� za nim jeden z tych znaków, i robi� tak a� dowyczerpania plusów i minusów. Na przyk�ad:

double expression(){ double left = term(); // Wczytuje sk�adnik i oblicza jego warto��. Token t = get_token(); // nast�pny token while ( t.kind=='+' || t.kind=='–') { // Szuka znaków + i –. if (t.kind == '+') left += term(); // Oblicza warto�� sk�adnika i wykonuje dodawanie. else left –= term(); // Oblicza warto�� sk�adnika i wykonuje odejmowanie. t = get_token(); } return left; // Je�li nie ma wi�cej znaków + lub –, zwraca odpowied�.}

Ten kod jest nieco bardziej skomplikowany, poniewa� musieli�my wprowadzi� p�tl�, abymóc wyszuka� wszystkie plusy i minusy. Ponadto powtarzamy si� troch� — dwa razy sprawdza-my znaki + i - oraz dwa razy wywo�ujemy funkcj� get_token(). Poniewa� to tylko zaciemniakod, pozb�dziemy si� nadmiarowego testu znaków + i -:

double expression(){ double left = term(); // Wczytuje sk�adnik i oblicza jego warto��. Token t = get_token(); // nast�pny token while(true) { switch(t.kind) { case '+': left += term(); // Oblicza warto�� sk�adnika i wykonuje dodawanie. t = get_token(); break; case '–': left –= term(); // Oblicza warto�� sk�adnika i wykonuje odejmowanie. t = get_token(); break; default: return left; // Je�li nie ma wi�cej znaków + lub –, zwraca odpowied�. } }}

Warto zauwa�y�, �e pomijaj�c p�tl�, ta wersja kodu jest podobna do pierwszej próby (pod-rozdzia� 6.5.2.1). Usun�li�my wywo�anie funkcji expression() wewn�trz funkcji expression()i zast�pili�my je p�tl�. Innymi s�owy przekonwertowali�my wyra�enie z zasad gramatyki nap�tl� szukaj�c� sk�adnika ze znakiem + lub -.

Kup książkę Poleć książkę

Page 43: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .5 . ZAMIANA GRAMATYKI W KOD 199

6.5.3. Sk�adnikiZasada dotycz�ca sk�adnika (Term) w gramatyce jest bardzo podobna do zasady wyra�enia(Expression):

Term: Primary Term '*' Primary Term '/' Primary Term '%' Primary

W konsekwencji kod równie� powinien by� bardzo podobny. Oto pierwsza wersja:

double term(){ double left = primary(); Token t = get_token(); while(true) { switch (t.kind) { case '*': left *= primary(); t = get_token(); break; case '/': left /= primary(); t = get_token(); break; case '%': left %= primary(); t = get_token(); break; default: return left; } }}

Niestety ten kod nie da si� skompilowa� — operator reszty z dzielenia (%) nie jest zdefiniowanydla liczb zmiennoprzecinkowych. Zostaniemy o tym uprzejmie poinformowani. Odpowiadaj�cwcze�niej „oczywi�cie” na pytanie dotycz�ce tego, czy pozwoli� te� na wpisywanie liczb zmien-noprzecinkowych, nie przemy�leli�my sprawy dok�adnie i padli�my ofiar� w�asnej zach�an-no�ci na funkcje. Tak jest zawsze! Co z tym zrobimy? Mo�emy sprawdza�, czy argumentyoperatora % s� liczbami ca�kowitymi i je�li nie, zg�asza� b��d. Mo�emy te� usun�� ten operatorz kalkulatora. Wybierzemy najprostsze rozwi�zanie. Dodamy ten operator pó niej (rozdzia� 7.5).

Po usuni�ciu operatora % funkcja dzia�a — tzn. prawid�owo analizuje sk�adniki i oblicza ichwarto�ci. Jednak do�wiadczony programista zauwa�y pewien niepo��dany szczegó�, który spra-wia, �e funkcja term() jest nie do przyj�cia. Co si� stanie, je�li kto� wpisze 2/0? Nie mo�nadzieli� przez zero. Je�li do tego dopu�cimy, komputer wykryje to i zamknie program, wy�wie-tlaj�c raczej ma�o pomocny komunikat o b��dzie. Niedo�wiadczony programista przekona si�o tym na w�asnej skórze. Dlatego lepiej doda� odpowiedni test i wy�wietli� lepszy komunikato b��dzie:

Kup książkę Poleć książkę

Page 44: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

200 ROZDZIA 6 • PISANIE PROGRAMU

double term(){ double left = primary(); Token t = get_token(); while(true) { switch (t.kind) { case '*': left *= primary(); t = get_token(); break; case '/': { double d = primary(); if (d == 0) error("Dzielenie przez zero."); left /= d; t = get_token(); break; } default: return left; } }}

Dlaczego umie�cili�my instrukcje obs�uguj�ce operator / w bloku? Poniewa� kompilator nale-ga�. Je�li chcesz definiowa� i inicjowa� zmienne w instrukcjach switch, musisz umie�ci� jew blokach.

6.5.4. Podstawowe elementy wyra�e�Zasada gramatyczna definiuj�ca podstawowe czynniki wyra�e� równie� jest prosta:

Primary: Number '(' Expression ')'

Kod s�u��cy do jej implementacji jest nieco zagmatwany, poniewa� jest tu wi�cej okazji dopope�nienia b��du sk�adni:

double primary(){ Token t = get_token(); switch (t.kind) { case '(': // Obs�uga regu�y '(' expression ')'. { double d = expression(); t = get_token(); if (t.kind != ')') error("Oczekiwano ')'."); return d; } case '8': // Za pomoc� znaku '8' reprezentujemy liczby. return t.value; // Zwraca warto�� liczby. default: error("Oczekwiano czynnika."); }}

Kup książkę Poleć książkę

Page 45: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .6 . WYPRÓBOWYWANIE PIERWSZEJ WERSJI 201

W zasadzie nie ma tu nic nowego, czego nie ma w funkcjach expression() i term().U�yli�mytych samych narz�dzi j�zykowych, zastosowali�my t� sam� technik� wyodr�bniania tokenóworaz te same techniki programistyczne.

6.6. Wypróbowywanie pierwszej wersjiAby sprawdzi� dzia�anie tych funkcji, musimy zaimplementowa� funkcj� get_token() i utworzy�funkcj� main(). To drugie zadanie jest banalne — b�dziemy wywo�ywa� funkcj� expression()i drukowa� zwracany przez ni� wynik:

int main()try { while (cin) cout << expression() << '\n'; keep_window_open();}catch (exception& e) { cerr << e.what() << endl; keep_window_open (); return 1;}catch (...) { cerr << "Wyj�tek \n"; keep_window_open (); return 2;}

B��dy zostan� obs�u�one w typowy sposób (rozdzia� 5.6.3). Opis implementacji funkcji get_token()od�o�ymy do podrozdzia�u 6.8, a teraz przetestujemy pierwsz� wersj� naszego kalkulatora.

WYPRÓBUJ

Pierwsza wersja kalkulatora (z funkcj� get_token()) znajduje si� w pliku o nazwiecalculator00.cpp. Pobierz go i uruchom.

Wcale nie jeste�my zaskoczeni tym, �e program nie dzia�a dok�adnie tak, jak oczekiwali�my.Wzruszamy tylko ramionami i pytamy sami siebie: „Czemu nie?” albo lepiej: „Dlaczegodzia�a tak, a nie inaczej?”. Wpisz liczb� 2 i znak nowego wiersza. Brak jakiejkolwiek reakcji.Daj jeszcze jeden znak nowego wiersza, aby sprawdzi�, czy mo�e zasn��. Nadal nic. Wpisz 3i znak nowego wiersza. Zero reakcji! Wpisz 4 i znak nowego wiersza. Jest odpowied — 2!Teraz ekran wygl�da tak:

2

342

Kup książkę Poleć książkę

Page 46: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

202 ROZDZIA 6 • PISANIE PROGRAMU

Kontynuujemy, wpisuj�c 5+6. Program zwraca w odpowiedzi 5, a wi�c na ekranie widzimy:

2

3425+65

Je�li nie masz do�wiadczenia programistycznego, pewnie jeste� bardzo skonsternowany!W istocie nawet do�wiadczony programista móg�by os�upie�. Co tam si� dzieje? W tym mo-mencie chcemy zamkn�� program. Jak to zrobi�? Zapomnieli�my zaprogramowa� poleceniezamykaj�ce program, ale mo�na go zmusi� do zamkni�cia za pomoc� b��du. Wpisujemy wi�c xi program zako�czy dzia�anie komunikatem Nieprawid�owy token. W ko�cu co� zadzia�a�o zgodniez planem!

Zapomnieli�my odró�ni� na ekranie dane wej�ciowe od wyj�ciowych. Zanim przejdziemydo rozwi�zywania zagadki, poprawimy to niedoci�gni�cie, aby lepiej widzie�, co si� dzieje.Na razie wystarczy dodanie do danych wyj�ciowych znaku =:

while (cin) cout << "= " << expression() << '\n'; // Wersja 1

Teraz po wprowadzeniu dok�adnie takiej samej sekwencji znaków, jak wcze�niej otrzymamynast�puj�cy wynik:

2

34= 25+6= 5xNieprawid�owy token

Dziwne! Spróbuj odgadn��, co zrobi� program. My wypróbowali�my jeszcze kilka innychliczb, ale poprzesta�my na tych, które mamy. To jest zagadka:

Dlaczego program nie zareagowa� na pierwsze liczby 2 i 3 i znaki nowego wiersza?

Dlaczego program zwróci� wynik 2 zamiast 4, gdy wpisali�my 4?

Dlaczego program zwróci� wynik 5 zamiast 11, gdy wpisali�my 5+6?

Jest wiele procedur post�powania w takich tajemniczych sytuacjach. Opiszemy je szczegó�owow nast�pnym rozdziale, a na razie tylko pomy�limy. Czy mo�liwe, �eby program wykonywa�nieprawid�owe dzia�ania arytmetyczne? To bardzo ma�o prawdopodobne. Warto�� 4 to nie 2,a wyra�enia 5+6 to 11, a nie 5. Sprawd my, co si� stanie, gdy wpiszemy 1 2 3 4+5 6+7 8+9 10 11 12i nowy wiersz:

Kup książkę Poleć książkę

Page 47: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .6 . WYPRÓBOWYWANIE PIERWSZEJ WERSJI 203

1 2 3 4+5 6+7 8+9 10 11 12= 1= 4= 6= 8= 10

Co takiego? Nie 2 ani 3? Czemu 4, a nie 9 (bo 4+5)? Czemu 6, a nie 13 (bo 6+7)? Przyjrzyj si�uwa�nie — program zwraca co trzeci token! Mo�e „po�era” cz��� wprowadzonych danychbez obliczania ich warto�ci? Tak w�a�nie robi. Spójrz na funkcj� expression():

double expression(){ double left = term(); // Wczytuje sk�adnik i oblicza jego warto��. Token t = get_token(); // nast�pny token while(true) { switch(t.kind) { case '+': left += term(); // Oblicza warto�� sk�adnika i wykonuje dodawanie. t = get_token(); break; case '–': left –= term(); // Oblicza warto�� sk�adnika i wykonuje odejmowanie. t = get_token(); break; default: return left; // Je�li nie ma wi�cej znaków + lub –, zwraca odpowied�. } }}

Gdy funkcja get_token() zwróci inny Token ni� + lub -, po prostu zwracamy warto��. Nie u�y-wamy tego tokenu i nie zapisujemy go do u�ytku przez inn� funkcj�. To nie by�o zbyt m�dre.Odrzucanie danych wej�ciowych bez sprawdzenia nawet, co to dok�adnie jest, to niezbyt do-bry pomys�. atwo mo�na si� przekona�, �e ten sam defekt ma funkcja term(). To wyja�nia,dlaczego nasz kalkulator zjada� dwa tokeny na trzy.

Poprawimy funkcj� expression(), aby nie zjada�a tokenów. Gdzie mo�emy zapisa� nast�p-ny token (t), je�li program go nie potrzebuje? Mogliby�my opracowa� wiele ró�nych skom-plikowanych rozwi�za�, ale zastosujemy najbardziej oczywiste (wydaje si� oczywiste, gdy si�je ju� zobaczy) — ten token zostanie wykorzystany przez jak�� inn� funkcj�, a wi�c umie�cimygo z powrotem w strumieniu wej�ciowym, aby móg� zosta� stamt�d ponownie wczytany! W isto-cie mo�na by by�o wstawia� znaki do strumienia istream, ale nie o to nam chodzi. My chcemymie� tokeny, a nie bawi� si� ze znakami. Potrzebujemy strumienia wej�ciowego, w którymb�dzie mo�na zapisywa� tokeny.

Za�ó�my wi�c, �e mamy strumie� tokenów — Token_stream — o nazwie ts. Przyjmijmyte�, �e ma on funkcj� sk�adow� o nazwie get(), która zwraca nast�pny token i funkcj� sk�adow�putback(t), ta za� wstawia token t z powrotem do strumienia. Implementacj� strumieniaToken_stream przedstawimy w podrozdziale 6.8, gdy b�dziemy ju� wiedzieli, jak go u�y�.

Kup książkę Poleć książkę

Page 48: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

204 ROZDZIA 6 • PISANIE PROGRAMU

Maj�c strumie� Token_stream, mo�emy zmodyfikowa� funkcj� expression() w taki sposób,�eby niepotrzebne tokeny zapisywa�a w�a�nie w nim:

double expression(){ double left = term(); // Wczytuje sk�adnik i oblicza jego warto��. Token t = ts.get(); // Pobiera nast�pny token ze strumienia tokenów. while(true) { switch(t.kind) { case '+': left += term(); // Oblicza warto�� sk�adnika i wykonuje dodawanie. t = ts.get(); break; case '–': left –= term(); // Oblicza warto�� sk�adnika i wykonuje odejmowanie. t = ts.get(); break; default: ts.putback(t); // Wstawia token t z powrotem do strumienia tokenów. return left; // Je�li nie ma wi�cej znaków + lub –, zwraca odpowied�. } }}

Takie same zmiany musz� zosta� wprowadzone w funkcji term():

double term(){ double left = primary(); Token t = ts.get(); // Pobiera nast�pny token ze strumienia tokenów.

while(true) { switch (t.kind) { case '*': left *= primary(); t = ts.get(); break; case '/': { double d = primary(); if (d == 0) error("Dzielenie przez zero."); left /= d; t = ts.get(); break; } default: ts.putback(t); // Wstawia token t z powrotem do strumienia tokenów. return left; } }}

W ostatniej funkcji naszego parsera, primary(), musimy tylko zmieni� get_token() na ts.get().Funkcja ta u�ywa ka�dego wczytanego przez siebie tokenu.

Kup książkę Poleć książkę

Page 49: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .7 . WYPRÓBOWYWANIE DRUGIEJ WERSJI 205

6.7. Wypróbowywanie drugiej wersjiMo�emy przetestowa� nasz� drug� wersj� programu. Wpisz 2 i znak nowego wiersza. Brak re-akcji. Wpisz jeszcze jeden znak nowego wiersza, aby sprawdzi�, czy program nie zasn��. Nadalnic. Wpisz 3 i znak nowego wiersza. Jest odpowied — 2. Spróbuj wyra�enia 2+2 ze znakiemnowego wiersza. Odpowied brzmi 3. Teraz na ekranie znajduj� si� nast�puj�ce dane:

2

3=22+2=3

Hmm. Mo�e wprowadzenie funkcji putback() i u�ycie jej w funkcjach expression() i term()nie pomog�o w rozwi�zaniu problemu? Spróbujmy czego� innego:

2 3 4 2+3 2*3=2=3=4=5

Tak, to s� poprawne odpowiedzi! Ale brakuje ostatniej (6). Wci�� mamy problem z tokenami,ale tym razem nie chodzi o ich zjadanie, lecz o to, �e wynik jest zwracany dopiero po wpisaniukolejnego wyra�enia. Program nie drukuje od razu wyniku. Opó nia to do momentu wczytaniapierwszego tokenu nast�pnego wyra�enia. Niestety nie widzi go, dopóki nie naci�niemy kla-wisza Enter po wpisaniu nast�pnego wyra�enia. Wniosek taki, �e program nie dzia�a le, tylkoodpowiada z opó nieniem.

Jak to poprawi�? Jednym z oczywistych rozwi�za� jest wprowadzenie „polecenia druko-wania”. Rol� t� niech pe�ni �rednik, którego pojawienie si� b�dzie oznacza�o koniec wyra�eniai wymusza�o wydruk wyniku. Przy okazji dodamy polecenie zamkni�cia programu. Do tegocelu doskonale nada si� znak k (od s�owa koniec). Obecnie w funkcji main() mamy taki kod:

while (cin) cout << "=" << expression() << '\n'; // wersja 1

Mo�emy zamieni� ten na bardziej zagmatwany, ale bardziej u�yteczny kod:

double val = 0;while (cin) { Token t = ts.get();

if (t.kind == 'k') break; // 'k' = koniec if (t.kind == ';') // ';' = drukuj teraz cout << "=" << val << '\n'; else ts.putback(t); val = expression();}

Teraz kalkulator nadaje si� do u�ytku. Zwróci na przyk�ad nast�puj�ce wyniki:

Kup książkę Poleć książkę

Page 50: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

206 ROZDZIA 6 • PISANIE PROGRAMU

2;= 22+3;= 53+4*5;= 23k

W tym momencie mamy ju� dobr� wst�pn� wersj� programu. Nie jest to jeszcze to, czegochcieli�my, ale stanowi dobr� baz� do rozszerzania. Co wa�niejsze, mo�emy poprawia� b��dyi dodawa� nowe funkcje, pracuj�c ju� z dzia�aj�cym programem.

6.8. Strumienie tokenówZanim przejdziemy do dalszego opisu kalkulatora, przedstawimy implementacj� strumieniaToken_stream. Je�li nie dostarczymy poprawnych danych do programu, to nic nam si� nie uda.Strumie� ten zaimplementowali�my ju� na samym pocz�tku, ale najpierw chcieli�my skupi�si� na problemach oblicze� w minimalnym rozwi�zaniu.

Nasz kalkulator przyjmuje na wej�ciu sekwencj� tokenów, np. (1.5+4)*11 z podrozdzia�u6.3.3. Potrzebujemy czego� takiego, co b�dzie wczytywa� znaki ze standardowego strumieniawej�ciowego i podawa� programowi kolejne tokeny, gdy ten o to poprosi. Poza tym zauwa-�yli�my, �e program cz�sto wczytuje o jeden token za du�o, a wi�c musimy wygospodarowa�jakie� miejsce, aby przechowa� go do pó niejszego u�ytku. Jest to ca�kowicie normalne. Je�liwczytujemy wyra�enie 1.5+4 od lewej do prawej, sk�d mamy wiedzie�, �e liczba 1.5 to ju�ca�a liczba, je�li nie wczytamy znajduj�cego si� za ni� znaku +? Dopóki go nie zobaczymy,równie dobrze mo�emy podejrzewa�, �e jeste�my w trakcie wczytywania liczby 1.55555.Dlatego potrzebujemy „strumienia”, który zwraca token, gdy go za��damy za pomoc� funkcjiget(), i w którym mo�emy przechowywa� nadmiarowe tokeny, zapisuj�c je tam za pomoc�funkcji putback(). Wszystko w j�zyku C++ ma okre�lony typ, dlatego musimy zacz�� odzdefiniowania typu Token_stream.

Pewnie zauwa�y�e� s�owo public w definicji typu Token. Tam nie mia�o to �adnego widoczne-go znaczenia. Natomiast w typie Token_stream, o którym teraz mowa, s�owo to b�dzie mia�owa�ne zastosowanie. W j�zyku C++ typy zdefiniowane przez u�ytkownika cz�sto sk�adaj�si� z dwóch cz��ci — interfejsu publicznego (oznaczonego etykiet� public:) i prywatnego(oznaczonego etykiet� private:). Chodzi o oddzielenie tego, co jest potrzebne u�ytkowni-kowi do wygodnego korzystania z typu, od implementacji typu, w której u�ytkownik nie po-winien mie� mo�liwo�ci grzebania:

class Token_stream {public: // interfejs uytkownikaprivate: // szczegó�y implementacyjne // (bezpo�rednio niedost�pne uytkownikom typu Token_stream)};

Oczywi�cie u�ytkownik i implementator to cz�sto jedna i ta sama osoba odgrywaj�ca ró�nerole. Nale�y jednak zaznaczy�, �e rozró�nienie mi�dzy interfejsem publicznym przeznaczonym

Kup książkę Poleć książkę

Page 51: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .8 . STRUMIENIE TOKENÓW 207

dla u�ytkowników i prywatnym dla implementatorów jest doskona�ym narz�dziem wspoma-gaj�cym strukturalizacj� kodu. Interfejs publiczny powinien zawiera� wy��cznie to, co jestu�ytkownikowi potrzebne, a wi�c najcz��ciej zestaw funkcji, tak�e konstruktorów s�u��cychdo inicjowania obiektów. Implementacj� prywatn� stanowi kod tych publicznych funkcji.Najcz��ciej s� to dane i funkcje wykonuj�ce skomplikowane dzia�ania, o których u�ytkowniknie musi wiedzie� i których nie musi bezpo�rednio u�ywa�.

Rozszerzymy troch� nasz typ Token_stream. Jakie wymagania powinien spe�nia�? Bezw�tpienia potrzebujemy funkcji get() i putback(), poniewa� to one by�y powodem, dla któregow ogóle wymy�lili�my co� takiego jak strumie� tokenów. Zadaniem typu Token_stream jest wy-twarzanie tokenów ze znaków wczytywanych na wej�ciu. Zatem nasz strumie� musi wczytywa�dane ze strumienia cin. Oto najprostsza mo�liwa wersja typu Token_stream:

class Token_stream {public: Token_stream(); // Tworzy obiekt typu Token_stream, który wczytuje dane ze strumieniacin. Token get(); // Daje token (obiekt typu Token). void putback(Token t); // Wk�ada token z powrotem.private: // szczegó�y implementacyjne};

To wszystko, czego u�ytkownik potrzebuje do korzystania z typu Token_stream. Do�wiadczonyprogramista móg�by si� zastanawia�, dlaczego cin jest jedynym mo�liwym ród�em znaków— przypominamy, �e zdecydowali�my si� na razie pobiera� dane tylko z klawiatury. Zrewidu-jemy t� decyzj� w rozdziale 7.

Dlaczego zastosowali�my d�ugaw� nazw� putback() zamiast krótszej put()? Chcieli�mypodkre�li� asymetri� mi�dzy funkcjami get() i putback() — to jest strumie� wej�ciowy, a nieco�, co mo�na wykorzysta� tak�e do ogólnych celów zwi�zanych z wysy�aniem danych na wyj�cie.Poza tym w bibliotece istream tak�e znajduje si� funkcja putback(), a spójno�� nazw jest jedn�z po��danych cech ka�dego systemu. Dzi�ki temu �atwiej jest zapami�tywa� te nazwy i unika�b��dów.

Po tym wst�pie mo�emy ju� utworzy� typ Token_stream i u�y� go:

Token_stream ts; // Obiekt typu Token_stream o nazwie ts.Token t = ts.get(); // Daje nast�pny token ze strumienia ts.// …ts.putback(t); // Wk�ada token t z powrotem do strumienia ts.

Mamy ju� wszystko, czego potrzebujemy do napisania pozosta�ej cz��ci kalkulatora.

6.8.1. Implementacja typu Token_streamZaimplementujemy trzy wymienione funkcje strumienia Token_stream. Jak b�dzie si� tenstrumie� prezentowa�? Tzn., jakie dane musz� by� w nim przechowywane, aby spe�nia� swojezadanie? Potrzebujemy miejsca do przechowywania tokenów, które w�o�ymy do niego. Dlauproszczenia za�ó�my, �e mo�na w nim przechowywa� tylko jeden token na raz. Na potrzebynaszego programu to wystarczy (i na potrzeby wielu innych te�). W zwi�zku z tym potrzebujemy

Kup książkę Poleć książkę

Page 52: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

208 ROZDZIA 6 • PISANIE PROGRAMU

miejsca do przechowania jednego tokenu i wska nika oznaczaj�cego, czy to miejsce jest wolneczy zaj�te:

class Token_stream {public: Token_stream(); // Tworzy obiekt typu Token_stream, który wczytuje dane ze strumieniacin. Token get(); // Daje token (funkcja get() zosta�a zdefiniowana w innym miejscu). void putback(Token t); // Wk�ada token z powrotem.private: bool full; // Informuje, czy w buforze jest token. Token buffer; // Miejsce do przechowywania tokenu zapisanego w strumieniu za pomoc� funkcji //putback().};

Teraz mo�emy zdefiniowa� (napisa�) nasze trzy funkcje sk�adowe. Konstruktor i funkcjaputback() b�d� �atwe, poniewa� maj� ma�o do zrobienia. Dlatego zajmiemy si� nimi na pocz�tku.

Konstruktor ustawia tylko zmienn� full na warto�� oznaczaj�c�, �e bufor jest pusty:

Token_stream::Token_stream() :full(false), buffer(0) // Bufor jest pusty.{}

Je�li definicja sk�adowej znajduje si� poza definicj� klasy, nale�y wskaza�, do której klasy manale�e�. S�u�y do tego nast�puj�ca notacja:

nazwa_klasy::nazwa_sk�adowej

Tutaj definiujemy konstruktor klasy Token_stream. Konstruktor to funkcja sk�adowa o takiejsamej nazwie, jak klasa, do której nale�y.

Po co definiowa� sk�adow� poza klas�? Przede wszystkim dla zachowania przejrzysto�ci— w definicji klasy mo�na znale � g�ównie informacje o tym, co klasa potrafi „robi�”. Defi-nicje funkcji sk�adowych to implementacje okre�laj�ce sposób, w jaki s� robione ró�ne rzeczy.Wolimy umie�ci� je gdzie� indziej, aby nie przeszkadza�y. Idea�em, do którego d��ymy, jest,aby ka�da jednostka logiczna programu mie�ci�a si� w ca�o�ci na ekranie. Definicje klas zazwy-czaj spe�niaj� ten wymóg, ale tylko je�li definicje ich funkcji sk�adowych przeniesie si� gdzie�indziej, poza klas�.

Sk�adowe klasy inicjuje si� w li�cie inicjatorów sk�adowych (podrozdzia� 6.3.3). Instrukcjafull(false) ustawia sk�adow� full na false, a buffer(0) inicjuje sk�adow� buffer „udawanymtokenem”, który wymy�lili�my na poczekaniu. Z definicji typu Token (podrozdzia� 6.3.3) wynika, �eka�dy token musi zosta� zainicjowany, dlatego nie mogli�my zignorowa� Token_stream::buffer.

Funkcja sk�adowa putback() zapisuje swój argument w buforze strumienia Token_stream:

void Token_stream::putback(Token t){ buffer = t; // Kopiuje t do bufora. full = true; // Bufor jest pe�ny.}

Kup książkę Poleć książkę

Page 53: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .8 . STRUMIENIE TOKENÓW 209

S�owo kluczowe void (oznaczaj�ce „nic”) wskazuje, �e funkcja putback() nie zwraca �adnejwarto�ci. Aby upewni� si�, �e funkcja ta nie zostanie wywo�ana dwa razy bez odczytania (zapomoc� funkcji get()) tego, co zosta�o zapisane w strumieniu mi�dzy tymi wywo�aniami,mo�na doda� specjalny test:

void Token_stream::putback(Token t){ if (full) error("Wywo�anie funkcji putback(), gdy bufor jest pe�ny."); buffer = t; // Kopiuje t do bufora. full = true; // Bufor jest pe�ny.}

Test sk�adowej full polega na sprawdzeniu warunku wst�pnego: „Nie ma �adnego tokenuw buforze”.

6.8.2. Wczytywanie tokenów

Ca�� prawdziw� prac� wykonuje funkcja get(). Je�li w zmiennej Token_stream::buffer nie matokenu, funkcja ta musi wczyta� znaki ze strumienia cin i z�o�y� z nich tokeny:

Token Token_stream::get(){ if (full) { // Sprawdzenie, czy jest gotowy token. // Usuni�cie tokenu z bufora. full=false; return buffer; }

char ch; cin >> ch; // Uwaga: >> pomija bia�e znaki (spacje, nowe wiersze, tabulatory itp.).

switch (ch) { case ';': // drukowanie case 'k': // koniec case '(': case ')': case '+': case '–': case '*': case '/': case '%': return Token(ch); // Kady znak reprezentuje sam siebie. case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { cin.putback(ch); // Wstawia cyfr� z powrotem do strumienia wej�ciowego. double val; cin >> val; // Wczytuje liczb� zmiennoprzecinkow�. return Token('8',val); // '8' reprezentuje „liczb�”. } default: error("Nieprawid�owy token."); }}

Kup książkę Poleć książkę

Page 54: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

210 ROZDZIA 6 • PISANIE PROGRAMU

Przeanalizujemy szczegó�owo funkcj� get(). Najpierw sprawdza, czy w buforze jest token.Je�li tak, zwraca go:

if (full) { // Sprawdzenie, czy jest gotowy token. // Usuni�cie tokenu z bufora. full=false; return buffer; }

Znakami musimy zajmowa� si� tylko wówczas, gdy full ma warto�� false (tzn. nie ma tokenuw buforze). W takim przypadku wczytujemy znak i post�pujemy z nim odpowiednio do potrzeb.Szukamy nawiasów, operatorów i liczb. Jakikolwiek inny znak powoduje wywo�anie funkcjierror(), która zamyka program:

default: error("Nieprawid�owy token.");}

Funkcja error() zosta�a opisana w rozdziale 5.6.3 i jest dost�pna w pliku nag�ówkowymstd_lib_facilities.h.

Musieli�my zdecydowa� si� na jaki� sposób reprezentowania ka�dego rodzaju tokenu, tzn.trzeba by�o dobra� warto�ci dla sk�adowej kind. Dla uproszczenia i u�atwienia debugowaniazdecydowali�my si�, �e nawiasy i operatory same b�d� reprezentowa� swój rodzaj tokenu.Dzi�ki temu ich przetwarzanie jest bardzo �atwe:

case '(': case ')': case '+': case '–': case '*': case '/': return Token(ch); // Kady znak reprezentuje sam siebie.

Mówi�c szczerze, w pierwszej wersji programu zapomnieli�my o znakach: ';' oznaczaj�cymdrukowanie i 'k' oznaczaj�cym koniec programu. Dodali�my je, dopiero gdy by�y potrzebnew drugiej wersji.

6.8.3. Wczytywanie liczbZosta�y nam jeszcze liczby, z którymi wcale tak �atwo nie pójdzie. Jak dowiedzie� si�, jaka jestwarto�� 123? To tyle samo, co 100+20+3, ale co zrobi� z 12.34? Jest te� pytanie, czy zezwala�na stosowanie notacji naukowej, np. 12.34e5. Aby poradzi� sobie z tym wszystkim, mogliby�mypotrzebowa� wielu godzin, a nawet dni. Na szcz��cie nie jest tak le. Strumienie w C++„wiedz�”, jak wygl�daj� litera�y, i potrafi� zamienia� je na warto�ci typu double. Musimy tylkoznale � sposób na zmuszenie strumienia cin do robienia tego w funkcji get():

case '.':case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7':case '8':case '9': { cin.putback(ch); // Wstawia cyfr� z powrotem do strumienia wej�ciowego. double val; cin >> val; // Wczytuje liczb� zmiennoprzecinkow�. return Token('8',val); // '8' reprezentuje „liczb�”. }

Decyzja o wyborze znaku '8' do reprezentowania „liczb” w tokenach zosta�a podj�ta arbitralnie.

Kup książkę Poleć książkę

Page 55: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

6 .9 . STRUKTURA PROGRAMU 211

Sk�d wiadomo, �e ma pojawi� si� liczba? Zgaduj�c na podstawie w�asnych do�wiadcze�lub zagl�daj�c do podr�cznika j�zyka C++ (np. w dodatku A), mo�na stwierdzi�, �e litera� licz-bowy musi zaczyna� si� od cyfry lub znaku . (kropki dziesi�tnej). Sprawdzamy wi�c, czy takjest. Nast�pnie chcemy, aby liczb� t� wczyta� strumie� cin, ale wczytali�my ju� pierwszy znak(cyfr� lub kropk�), a wi�c pozwalaj�c temu strumieniowi zaj�� si� reszt�, uzyskaliby�my niepra-wid�owe wyniki. Mogliby�my spróbowa� po��czy� warto�� pierwszego znaku z „reszt�” wczytan�przez cin. To znaczy, je�li wpisano by 123, otrzymaliby�my 1 i strumie� cin wczyta�by 23. Wów-czas trzeba by by�o doda� 100 do 23. A fuj! A to tylko banalny przyk�ad. Na szcz��cie (i nieprzypadkowo) cin dzia�a bardzo podobnie do Token_stream pod tym wzgl�dem, �e tak�e po-zwala wstawi� odczytany znak z powrotem. Zamiast wi�c wykonywa� zagmatwane obliczeniaarytmetyczne, wstawiamy pierwsz� cyfr� z powrotem do cin i odczytujemy z niego ca�� liczb�.

Zauwa�, �e ca�y czas unikamy skomplikowanej pracy i znajdujemy prostsze rozwi�zania— cz�sto w tym celu wykorzystuj�c zawarto�� biblioteki. To jest istota programowania —nieustanne poszukiwanie jak najprostszych rozwi�za�. Niektórzy — nie zawsze s�usznie —wyra�aj� to s�owami: „Dobry programista to leniwy programista”. W tym, i tylko w tym, sensierzeczywi�cie powinni�my by� leniwi. Po co pisa� du�o kodu, skoro mo�na to samo zrobi�, pisz�cgo mniej?

6.9. Struktura programuJest takie przys�owie, które g�osi, �e czasami trudno zauwa�y� las, poniewa� zas�aniaj� go drzewa.W analogiczny sposób mo�na straci� z oczu program, patrz�c na te jego wszystkie funkcje, klasyitp. Spójrzmy zatem na nasz program, pomijaj�c chwilowo szczegó�y:

#include "std_lib_facilities.h"

class Token { /* … */ };class Token_stream { /* … */ };

Token_stream::Token_stream() :full(false), buffer(0) { /* … */ }void Token_stream::putback(Token t) { /* … */ }Token Token_stream::get() { /* … */ }

Token_stream ts; // Udost�pnia funkcje get() i putback().double expression(); // Deklaracja umoliwiaj�ca funkcji primary() wywo�ywanie funkcji expression().

double primary() { /* … */ } // Obs�uga nawiasów i liczb.double term() { /* … */ } // Obs�uga operatorów *, / i %.double expression() { /* … */ } // Obs�uga operatorów + i –.

int main() { /* … */ } // G�ówna p�tla i obs�uga b��dów.

Kolejno�� deklaracji ma znaczenie. Nie mo�na u�y� nazwy, zanim zostanie zadeklarowana. Dla-tego ts musi zosta� zadeklarowana, zanim zostanie u�yta w ts.get(), a funkcja error() musi zo-sta� zadeklarowana przed funkcjami parsera, poniewa� wszystkie z niej korzystaj�. Na sche-macie wywo�a� mo�na zauwa�y� ciekawe zap�tlenie: funkcja expression() wywo�uje term(),która wywo�uje primary(), a ta z kolei wywo�uje expression().

Kup książkę Poleć książkę

Page 56: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

212 ROZDZIA 6 • PISANIE PROGRAMU

Mo�na to przedstawi� graficznie (wywo�ania funkcji error() odk�adamy na bok, poniewa�wszystkie funkcje j� wywo�uj�):

To oznacza, �e nie mo�emy po prostu zdefiniowa� tych trzech funkcji — nie da si� ustali� ta-kiej kolejno�ci, w której ka�da z nich zosta�aby zdefiniowana przed pierwszym u�yciem. Po-trzebujemy przynajmniej jednej deklaracji, która nie jest równocze�nie definicj�. Zdecydo-wali�my si� zadeklarowa� z wyprzedzeniem funkcj� expression().

Czy to dzia�a? Je�li odpowiednio zdefiniuje si� s�owo „dzia�a”, mo�na powiedzie�, �e tak.Przechodzi kompilacj�, da si� uruchomi�, poprawnie oblicza wyniki wyra�e� i zg�asza sen-sowne komunikaty o b��dach. Ale czy dzia�a tak, jak sobie tego �yczymy? Nie b�dzie zasko-czeniem, gdy powiem „nie za bardzo”. Pierwsz� wersj� wypróbowali�my w podrozdziale 6.6.Wówczas usun�li�my powa�ny b��d. Druga wersja (podrozdzia� 6.7) nie jest o wiele lepsza.Ale w porz�dku, tego si� spodziewali�my. Program zadowalaj�co spe�nia swoje g�ówne zada-nie, czyli pozwala zweryfikowa� nasze podstawowe pomys�y i zorientowa� si�, co robi� dalej.Pod tym wzgl�dem odnie�li�my sukces, ale spróbuj z niego skorzysta� — bez problemu do-prowadzi Ci� do sza�u!

WYPRÓBUJ

Uruchom powy�sz� wersj� kalkulatora i sprawd , co robi. Spróbuj doj��, dlaczego takdzia�a.

w i c z e n i a

wiczeniaCelem tego zestawu �wicze� jest poprawienie b��dów w programie, aby zamieni� go w co�u�ytecznego.

1. We kalkulator z pliku calculator02buggy.cpp. Spraw, �eby da� si� skompilowa�. Musiszznale � i poprawi� kilka b��dów. Nie ma ich w tek�cie ksi��ki.

2. Zmie� znak polecenia zamkni�cia programu na x.

Kup książkę Poleć książkę

Page 57: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

�WICZENIA 213

3. Zmie� znak polecenia drukowania na =.

4. Dodaj do funkcji main() komunikat powitalny:

„Witaj w naszym prostym kalkulatorze.W wyraeniach stosuj liczby zmiennoprzecinkowe.”

5. Dodaj do komunikatu powitalnego informacj� o tym, jakie operatory s� obs�ugiwane orazjak drukowa� wynik i zako�czy� dzia�anie programu.

6. Znajd trzy b��dy logiczne w programie, które zosta�y tam przemy�lnie ukryte, i poprawje, aby kalkulator zwraca� prawid�owe wyniki.

Powtórzenie

1. Co rozumiemy pod poj�ciem „Programowa� to zrozumie�”? Wymie� trzy g�ówne fazyprodukcji oprogramowania.

2. W rozdziale tym zosta� szczegó�owo opisany proces tworzenia kalkulatora. Napisz krótk�specyfikacj� wymaga� dla takiego programu.

3. W jaki sposób dzieli si� problem na mniejsze, �atwiejsze do ogarni�cia cz��ci?

4. Dlaczego utworzenie ograniczonej wersji programu jest dobrym pomys�em?

5. Co jest z�ego w mno�eniu wymaga� dotycz�cych funkcjonalno�ci na pocz�tku pracy nadprogramem?

6. Co to jest „przypadek u�ycia”?

7. Jaki jest cel przeprowadzania testów?

8. Posi�kuj�c si� informacjami zawartymi w rozdziale, opisz ró�nic� mi�dzy sk�adnikiem(Term), wyra�eniem (Expression), liczb� (Number) i czynnikiem (Primary).

9. Dane wej�ciowe kalkulatora rozk�adali�my na nast�puj�ce elementy: sk�adnik, wyra�enie,czynnik i liczba. Roz�ó� w ten sposób wyra�enie (17+4)/(5–1).

10. Dlaczego w programie nie ma funkcji o nazwie number()?

11. Co to jest token?

12. Co to jest gramatyka? Co to jest regu�a gramatyki?

13. Co to jest klasa? Do czego s�u�� klasy?

14. Co to jest konstruktor?

15. Dlaczego w funkcji expression() klauzula default instrukcji switch wstawia token z po-wrotem do strumienia?

16. Co to znaczy „wczyta� z wyprzedzeniem”?

17. Co robi funkcja putback() i dlaczego jest przydatna?

18. Co nastr�cza trudno�ci w implementacji operatora % (modulo) w funkcji term()?

19. Do czego s�u�� dwie zmienne sk�adowe klasy Token?

20. Dlaczego czasami sk�adowe klasy dzieli si� na publiczne i prywatne?

21. Co dzieje si� w klasie Token_stream, gdy w buforze jest token i zostanie wywo�ana funkcjaget()?

22. Po co zosta�y dodane znaki ';' i 'k' do instrukcji switch w funkcji get() w klasie Token_�stream?

Kup książkę Poleć książkę

Page 58: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

214 ROZDZIA 6 • PISANIE PROGRAMU

23. Kiedy powinno si� zacz�� testowanie programu?

24. Co to jest „typ zdefiniowany przez u�ytkownika”? Do czego mo�e si� przyda�?

25. Co to jest interfejs do „typu zdefiniowanego przez u�ytkownika” w j�zyku C++?

26. Dlaczego powinno si� u�ywa� kodu z bibliotek?

Terminologia

analiza implementacja przypadek u�ycia

analizator sk�adniowy interfejs pseudokodclass parser public

dzielenie przez zero private sk�adowa klasy

funkcja sk�adowa projekt token

gramatyka prototyp zmienna sk�adowa klasy

Praca domowa

1. Je�li jeszcze tego nie zrobi�e�, rozwi�� wszystkie �wiczenia Wypróbuj. 2. Dodaj mo�liwo�� u�ywania w programie zarówno nawiasów okr�g�ych (), jak i klamro-wych {}, aby mo�na by�o pisa� wyra�enia typu {(4+5)*6}/(3+4).

3. Dodaj operator silni ! jako operator przyrostkowy. Na przyk�ad 7! oznacza 7*6*5*4*3*2*1.Niech operator ten wi��e mocniej ni� * i /. To znaczy, 7*8! powinno oznacza� 7*(8!) ,a nie (7*8)!. Zacznij od dodania operatora wy�szego poziomu do gramatyki. Aby pozo-sta� w zgodzie ze standardow� matematyczn� definicj� silni, niech 0! wynosi 1.

4. Zdefiniuj klas� Name_value przechowuj�c� �a�cuch i warto��. Utwórz konstruktor (podobnyjak w klasie Token). Zmodyfikuj �wiczenie 19. z rozdzia�u 4., u�ywaj�c vector<Name_value>zamiast dwóch wektorów.

5. Dodaj do gramatyki j�zyka angielskiego z podrozdzia�u 6.4.1 przedimek the, aby mo�naby�o za jej pomoc� opisywa� zdania typu „The birds fly but the Fish swim”.

6. Napisz program sprawdzaj�cy poprawno�� zdania zgodnie z gramatyk� z podrozdzia�u6.4.1. Przyjmij za�o�enie, �e ka�de zdanie ko�czy si� kropk� otoczon� bia�ymi znakami, np.birds fly but the fish swim . jest zdaniem, a birds fly but the fish swim (brak kropkina ko�cu) i birds fly but the fish swim. (brak spacji przed kropk�) nie. Dla ka�degowpisanego zdania program niech zwraca tylko prost� odpowied Dobrze lub �le. Wskazówka:nie zawracaj sobie g�owy tokenami, wystarczy wczyta� dane do �a�cucha za pomoc� ope-ratora >>.

7. Napisz gramatyk� dla wyra�e� logicznych. S� one podobne do arytmetycznych, tylko po-s�uguj� si� operatorami ! (nie), ~ (uzupe�nienie), & (i), | (lub) oraz ^ (lub wy��czaj�ce).Operatory ! i ~ s� jednoargumentowe i prefiksowe. Operator ^ ma pierwsze�stwo przed |(podobnie jak * przed +), a wi�c x|y^z oznacza x|(y^z), a nie (x|y)^z. Operator & mapierwsze�stwo przed ^, a wi�c x^y&z oznacza x^(y&z).

8. Przerób gr� „Byki i krowy” z �wiczenia 12. w rozdziale 5., u�ywaj�c liter zamiast cyfr.

9. Napisz program wczytuj�cy cyfry i sk�adaj�cy z nich liczby ca�kowite. Na przyk�ad 123zostanie wczytane jako znaki 1, 2 i 3. Odpowied programu powinna by� nast�puj�ca:

Kup książkę Poleć książkę

Page 59: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

�WICZENIA 215

Dekompozycja liczby 123: liczba setek: 1; liczba dziesi�tek: 2; liczba jednostek: 3. Liczba ma by�wysy�ana na wyj�cie jako typ int. Obs�u� liczby jedno-, dwu-, trzy- i czterocyfrowe.Wskazówka: aby uzyska� ca�kowitoliczbow� warto�� 5 znaku '5', odejmij od niego '0',tzn. '5'-'0'==5.

10. Permutacja to uporz�dkowany podzbiór pewnego zbioru. Wyobra sobie na przyk�ad, �echcesz zdoby� szyfr do sejfu. Jest 60 mo�liwych liczb, a kombinacja, której potrzebujesz,sk�ada si� z trzech ró�nych liczb. Jest P(60,3) permutacji dla tej kombinacji, gdzie P defi-niuje nast�puj�cy wzór:

We wzorze tym ! oznacza przyrostkowy operator silni. Na przyk�ad 4! wynosi 4*3*2*1.Kombinacje s� podobne do permutacji, z t� ró�nic�, �e nie jest w nich wa�na kolejno��elementów. Gdyby� na przyk�ad robi� sobie deser lodowy, chc�c u�y� trzech ró�nychsmaków lodów z pi�ciu dost�pnych, nie zale�a�oby Ci, czy bananowy znajdzie si� nawierzchu czy na samym dole, oby gdzie� by�. Wzór kombinacji jest nast�puj�cy:

Zaprojektuj program prosz�cy u�ytkownika o podanie dwóch liczb, pytaj�cy, czy ma obli-czy� permutacje czy kombinacje i drukuj�cy wynik. To b�dzie wymaga�o podzielenia gona kilka cz��ci. Wykonaj analiz� opisanych wy�ej wymaga�. Napisz, co dok�adnie pro-gram ma robi�. Napisz pseudokod i podziel go na cz��ci. Ten program powinien mie�wbudowany mechanizm sprawdzania b��dów. Spraw, aby dla ka�dego rodzaju b��dnychdanych by�y zwracane odpowiednie komunikaty o b��dzie.

PodsumowanieJedn� z podstawowych czynno�ci programistycznych jest odpowiednie rozpoznanie danychwej�ciowych. W taki czy inny sposób musi poradzi� sobie z tym problemem ka�dy program.Do najtrudniejszych zada� nale�y rozszyfrowanie tego, co wytworzy� bezpo�rednio cz�owiek.Na przyk�ad ci�g�e problemy sprawia wiele aspektów technologii rozpoznawania g�osu. Pro-ste wersje tego problemu, jak nasz kalkulator, mo�na rozwi�za� za pomoc� gramatyk definiu-j�cych wprowadzane dane.

w i c z e n i a

Kup książkę Poleć książkę

Page 60: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

216 ROZDZIA 6 • PISANIE PROGRAMU

Kup książkę Poleć książkę

Page 61: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1069

Skorowidz

-, 109, 110--, 109!, 109!=, 110#define, 928, 930, 989#else, 931#endif, 931#ifdef, 931#include, 66, 78, 249, 255, 931,

989#undef, 930%, 110, 225%=, 89&, 529, 549, 836, 956, 960&&, 110, 956, 961(), 674*, 108, 110, 534*=, 89*this, 601/, 110/* */, 232, 904, 946//, 65, 904, 946/=, 89::, 280, 296, 973:alpha, 769? :, 258, 957[], 534, 614^, 836, 956, 960|, 836, 956, 960||, 110, 956, 961~, 836, 977+, 108, 110++, 89, 90, 109+=, 89<, 110<<, 68, 110, 293, 338, 747,

750, 836<=, 110<algorithm>, 1008<cctype>, 1024<complex>, 803, 1030

<float.h>, 783<limits.h>, 783<limits>, 783, 835<numeric>, 1031<studio.h>, 924=, 85-=, 89==, 110>, 110->, 546, 973>=, 110>>, 79, 81, 88, 110, 129, 356,

367, 372, 750, 836, 1021

AA Mathematical Programming

Language, 735abort(), 1040abs(), 258, 802, 804, 1029, 1031abstract, 450abstrakcja, 33, 106, 464, 712abstrakcja danych, 714, 715abstrakcyjna klasa bazowa, 464accumulate(), 668, 677, 1031

uogólnienie, 678accumulator, 677acos(), 802, 1029action, 721Ada, 729Ada Joint Program Office, 729adaptery kontenerów, 1002,

1017add(), 446adjacent_difference(), 677, 1031adjacent_find(), 1008adres, 529, 825advance(), 651, 999AJPO, 729akcja, 721akumulacja, 677

akumulator, 677Algol, 724Algol W, 728Algol60, 724Algol68, 727algorithm, 605ALGOrithmic Language, 724algorytmy, 132, 605, 667, 1008

accumulate(), 668, 677, 1031adjacent_difference(), 677,

1031adjacent_find(), 1008akumulacja, 677binary_search(), 1012copy(), 668, 693, 1009copy_backward(), 1009copy_if(), 693, 696count(), 668, 1009count_if(), 668, 1009dzia�aj�ce na zbiorach, 1013equal(), 668, 1008equal_range(), 668, 698,

1013fill(), 1011fill_n(), 1011find(), 668, 669, 698, 1008find_end(), 1009find_first_of(), 1008find_if(), 668, 671, 1008for_each(), 1008generate(), 1011generate_n(), 1011iloczyn skalarny, 679includes(), 1014inner_product(), 668, 677,

680, 1031inplace_merge(), 1013iter_swap(), 1011kopiowanie, 693lexicographical_compare(),

1015lower_bound(), 1012

Kup książkę Poleć książkę

Page 62: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1070 SKOROWIDZ

algorytmymake_heap(), 1014max(), 1015max_element(), 1015merge(), 668, 1013min(), 1015min_element(), 1015mismatch(), 1008modyfikuj�ce sekwencje,

1009next_permutation(), 1015niemodyfikuj�ce sekwencje,

1008nth_element(), 1012numeryczne, 676, 1031operacje sterty, 1014pair(), 1013partial_sort(), 1012partial_sort_copy(), 1012partial_sum(), 677, 1031partition(), 1013permutacje, 1015pomocnicze algorytmy, 1011pop_heap(), 1014prev_permutation(), 1015push_heap(), 1014remove(), 1010remove_copy(), 1010remove_copy_if(), 1010replace(), 1010replace_copy(), 1010reverse(), 1010reverse_copy(), 1010rotate(), 1010search(), 1008, 1009search_n(), 1009serach(), 698set_difference(), 1014set_intersection(), 1014set_symmetric_difference(),

1014set_union(), 1014sort(), 668, 697, 1012sort_heap(), 1014sortowanie, 697, 1012stable_partition(), 1013stable_sort(), 1012swap(), 1011swap_ranges(), 1011TEA, 847transform(), 1009uninitialized_copy(), 1011

uninitialized_fill(), 1011unique(), 1009, 1010unique_copy(), 668, 693,

695, 1010upper_bound(), 1012wyszukiwanie, 669, 671,

697, 1012algorytmy ogólne, 634aliasy, 988allocator, 611allocator_type, 1004alnum, 769, 1027alokacja obiektów w pami�ci

wolnej, 533alokacja pami�ci, 819, 918, 961alokacja zmiennych w pami�ci,

531alokator, 612alpha, 1027alternacja, 193AMPL, 735analiza, 55, 177analiza sk�adniowa, 189analiza tekstu, 746analizator sk�adni, 189AND, 110, 956ANFOR, 944ANSI, 730aparaty cyfrowe, 810aplikacje, 1044append(), 747, 1025application operator, 674arg(), 804, 1031argumenty, 105, 123, 141, 261

domy�lne argumenty, 477,970

formalne argumenty, 123konwersja, 271main(), 945przekazywanie

przez referencj�, 267przekazywanie przez sta��

referencj�, 265przekazywanie

przez warto��, 264szablony, 157, 610, 984

array, 577, 660, 738, 784, 1001Array_ref, 830artifical intelligence, 724arytmetyczny if, 258arytmetyka modularna, 842arytmetyka wska ników, 579

as_bytes(), 364as_int(), 416ASCII, 354, 948asctime(), 1039asembler, 718asercje, 165, 817asin(), 802, 1029aspect-based programming, 714assert, 165assert(), 933assertion, 165associative container, 681AT&T Bell Labs, 735AT&T Labs, 735at(), 1005atan(), 802, 1030atof(), 1037atoi(), 1037atol(), 1037attach(), 393, 437, 446auto_ptr, 621, 622autokod, 718automatic garbate collection, 539automatic storage, 532automatyczne usuwanie

nieu�ytków, 539auxiliary function, 311awaria, 816AWK, 735, 759Axis, 389, 392, 408, 475, 479

BBabbage Charles, 729back(), 662, 1005back_inserter(), 1016back_substitution(), 798Backus John, 721Backus-Naur Form, 721bad(), 330, 1020bad_alloc, 961, 996bad_cast, 996bad_expression, 769bad_from_string, 749Bad_image, 438Bad_size, 986bad_typeid, 996bajt, 834Basic CPL, 735basic guarantee, 621BCPL, 735

Kup książkę Poleć książkę

Page 63: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1071

begin, 638begin(), 130, 746, 752, 998,

1005, 1025Bell Labs, 735, 900Bentley John, 816bezpo�rednie wyra�anie my�li,

711bia�a skrzynka, 868bia�e znaki, 81, 374biblioteka standardowa C, 904

czas, 1038daty, 1038funkcje, 1032�a�cuchy, 1036pami��, 1037pliki, 1032printf(), 1033

biblioteka standardowa C++,323, 525, 992

algorytmy, 668, 993, 1008algorytmy ogólne, 634erase(), 654insert(), 654iteratory, 637, 993, 997kontenery, 526, 634, 660,

993, 1001list, 653listy powi�zane, 641obliczenia, 1028obs�uga b��dów, 995operowanie na danych, 634pliki nag�ówkowe, 993przetwarzanie �a�cuchów,

994, 1024sekwencje, 637s�owniki, 681string, 653strumienie, 1018strumienie wej�cia i wyj�cia,

993tablice, 658vector, 653wektor, 656wyj�tki, 996

biblioteka STL, 1016adaptery, 1017dzia�ania arytmetyczne, 1017obiekty funkcyjne, 1016pair, 1017predykaty, 1016wstawianie, 1016

biblioteki, 70, 178, 852FLTK, 387, 1047graficzne, 383GUI, 383, 384, 387Matrix, 786wej�cie i wyj�cie, 354

bidirectional iterator, 661, 663binarne drzewa

zrównowa�one, 684binarne operacje wej�cia

i wyj�cia, 363binary balanced tree, 684binary_search(), 698, 869, 1012bind1st(g,x), 1017bind2nd(g,y), 1017bit, 94, 834

bitset, 839flagi, 844manipulowanie, 844operacje, 835

bit znaku, 840bitowe operacje logiczne, 960bitset, 838, 839black-box testing, 868blank, 769, 1027bloki, 121, 163, 279

zagnie�d�one bloki, 260b��dy, 71, 140

asercje, 165debugowanie, 161komunikaty, 163obs�uga, 151, 220podej�cia wytwarzania

oprogramowania, 141pomy�ka o jeden, 153raportowanie, 149, 299specyfikacja, 141szacowanie, 159testowanie, 168usuwanie, 161warto�ci brzegowe, 153warunki ko�cowe, 167warunki wst�pne, 165wyj�tki, 151zaw��anie zakresu, 156 ród�a b��dów, 141

b��dy czasu wykonania, 70, 146raportowanie b��dów, 149rozwi�zywanie problemu

przez wywo�uj�cego, 147

rozwi�zywanie problemuprzez wywo�ywanego, 148

b��dy dzia�ania, 140b��dy kompilacji, 70, 140, 142b��dy konsolidacji, 70, 140, 145b��dy logiczne, 70, 140, 142,

157przyk�ady, 157

b��dy przej�ciowe, 535, 817b��dy sk�adni, 140, 142b��dy typów, 140, 143b��dy zakresu, 152, 153b��kitna ksi�ga, 45BNF, 721bool, 80, 83, 93, 835, 903, 965boolalpha, 1022boost::regex, 759, 762bounds error, 153break, 116, 118, 963broadcast function, 791bsearch(), 1040BSI, 944budowa, 47budowanie programu

wykonywalnego, 1046bufor, 324buforowanie, 324, 376bug, 161, 722Build Solution, 1046Burroughs Corporation, 726Button, 409, 505, 506, 1057bzip2, 719

CC, 20, 733, 899

<studio.h>, 924biblioteka standardowa, 904const, 922definicje, 914deklaracje, 914enum, 917funkcje, 905komentarze, 904kompilacja warunkowa, 931kontenery intruzyjne, 932konwersja typu void*, 916�a�cuchy, 919, 922makra, 927, 928makra sk�adniowe, 930operacje bajtowe, 922

Kup książkę Poleć książkę

Page 64: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1072 SKOROWIDZ

Cpami�� wolna, 918pliki, 927przeci��anie funkcji, 906przestrzenie nazw, 917przestrze� znaczników

struktur, 912rzutowanie, 915s�owa kluczowe, 913sprawdzanie typów

argumentów funkcji, 906sta�e, 927stdio, 924struktury, 912styl, 923styl definiowania, 908wej�cie, 925wska niki, 923wska niki na funkcje, 911wyj�cie, 924wywo�anie C++, 909zgodno�� z j�zykiem C++,

901C#, 20, 728, 739c_str(), 363, 366, 746, 1025C++, 20, 736, 737, 900C++0x, 737, 738C++98, 737C89, 900, 903, 914C99, 900calc(), 538callback, 497, 501calloc(), 1038Cambridge University, 717canvas, 388capacity(), 598, 1006case, 116, 227, 963cast, 547CAT, 810catch, 151, 156, 234, 963cb_next(), 502, 503, 510, 1052cb_quit(), 510CCA, 846cechy iteratorów, 890ceil(), 802, 1029center(), 430centrale telefoniczne, 810cerr, 1019char, 80, 83, 93, 835, 965CHAR_BIT, 1029CHAR_MAX, 1029

CHAR_MIN, 1029chronione sk�adowe, 458cin, 79, 129, 132, 1019cin.clear(), 334cin.unsetf(), 357cipher(), 851Circle, 56, 400, 408, 430, 431,

452, 459draw_lines(), 460

class, 184, 289, 857, 971, 976class template, 605classical_elimination(), 798clear(), 331, 1006clock(), 894, 1039clock_t, 1038CLOCKS_PER_SEC, 894close(), 327, 328Closed_polyline, 408, 419Cmp_by_addr, 676Cmp_by_name, 676cntrl, 769, 1027COBOL, 161, 721, 739CODASYL, 722code storage, 532Color, 56, 389, 408, 414, 415, 444Common Business-Oriented

Language, 721compacting garbage collection,

821complex, 803Complex, 56complex<double>, 1030complex<float>, 1030complex<long double>, 1030complex<Scalar>, 1030computer science, 725computing, 725conforming, 944conj(), 804, 1031const, 109, 228, 253, 903, 927,

960, 965const_cast, 547, 548, 903, 954,

962CONST_CAST, 916const_iterator, 661, 1004const_pointer, 1004const_reference, 1004const_reverse_iterator, 1004constant expression, 960constraints-based

programming, 714

constructor, 294continue, 963convenience function, 311copy constructor, 566copy(), 566, 668, 693, 905, 1009copy_backward(), 1009copy_if(), 693, 696cos(), 802, 1029cosh(), 802, 1030count(), 668, 1009count_if(), 668, 1009cout, 65, 78, 79, 132, 1019CPL, 735Cricle, 429ctime(), 1039czarna skrzynka, 868czas, 1038czas trwania, 950, 952cz��� rzeczywista, 803, 804,

1031cz��� urojona, 803, 804, 1031czyste funkcje wirtualne, 450,

464czyste interfejsy, 465czytniki kodów kreskowych,

810

Dd, 1027Dahl Ole-Johan, 731dane, 78, 342

przetwarzanie, 630sk�adowe, 289wej�ciowe, 56, 78, 104, 876wyj�ciowe, 354, 876

datalogi, 725Date, 292, 312daty, 1038DBL_EPSILON, 1029DBL_MAX, 1029DBL_MIN, 1029dealokacja pami�ci wolnej, 538debugging, 71, 161debugowanie, 71, 161, 891

destruktory, 573kod GUI, 517konstruktory, 573zalecenia, 162

dec, 355, 356, 357, 1023decipher(), 851

Kup książkę Poleć książkę

Page 65: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1073

dedukcja argumentówszablonu, 610

dedukcja zakresu, 954default, 963definicja, 79, 80, 92, 236, 249,

250, 964funkcje, 122, 123, 907klasy, 289struktury, 291

definiowaniefunkcje sk�adowe, 296funkcje wirtualne, 461makra, 990operatory, 958operatory wej�ciowe, 339operatory wyj�ciowe, 338sk�adowe klas, 975

deklaracja, 70, 92, 112, 249, 250,964

funkcje, 125, 126, 968sta�e, 252using, 280zmienne, 252

delete, 538, 539, 545, 618, 815,819, 820, 903, 953, 955, 961

delete(), 655delete[], 539, 541, 955deque, 660, 1001dereference operator, 530dereferencja, 530, 534, 966derywacja, 458destroy(), 934destructor, 541destruktory, 540, 541, 571, 961,

977debugowanie, 573generowanie, 542pami�� wolna, 542wirtualne, 451, 543

deszyfrowanie, 847device register, 846Dialog_box, 56difference(), 999difference_type, 1003difftime(), 1039digit, 769, 1027Dijkstra Edsger, 725, 726Distribution, 487divides<T>(), 1017do, 962dodawanie, 446

dokumenty HTML, 383do��czanie plików, 66, 989domy�lna inicjacja, 254domy�lne argumenty, 970domy�lne konstruktory, 307dopasowanie wyra�e�

regularnych, 1025dope�nienie, 836dostawa na czas, 709dost�p do danych, 631dost�p do elementów

kontenera, 1005dost�p do elementów wektora,

544, 575dost�p do nazw z przestrzeni,

280dost�p do nazwanych tablic,

578dost�p do sk�adowych, 184,

292, 463, 546, 955, 973dost�p poprzez wska niki, 534dost�pno�� nazw, 258double, 80, 83, 84, 93, 526, 780,

948, 965double precision floating point

number, 80doubly-linked list, 551, 641Dow Jones Industrial, 680draw(), 454, 481, 606draw_lines(), 414, 421, 426,

429, 434, 454, 460, 462drzewa

czerwono-czarne, 681, 684niezrównowa�one, 685zrównowa�one, 685

du�e zadania obliczeniowe, 106dynamic dispatch, 458dynamic_cast, 621, 815, 954,

961dyrektywa using, 280dyrektywy, 989

#define, 989#include, 66, 67, 989

dzia�ania arytmetyczne, 84, 132dzia�ania na liczbach, 779dziedziczenie, 458, 550, 716,

832, 979kontenery, 607referencje, 550wielokrotne, 979wska niki, 550

dziedziczenie implementacji,465

dziedziczenie interfejsu, 465dziel i rz�d , 106

EECMAScript, 764edytor tekstu, 647

iteracja, 650wiersze, 649

efekt przekroczenia zakresuliczby, 781

efekt sta�o�ci rozmiaru liczbca�kowitych, 781

efektywno��, 709ekran, 388, 1019elementy wyliczenia, 300elementy wyra�e�, 200elim_with_partial_pivot(), 799eliminacja Gaussa, 797elipsa, 431Ellipse, 400, 408, 431, 432else, 113else if, 115empty(), 1006encapsulation, 458end, 638end of file, 88end(), 130, 746, 752, 998, 1005,

1025endl, 1023ends, 1023enum, 300, 917, 972EOF, 927, 1035eof(), 330, 332, 366, 375, 1020equal(), 668, 1008equal_range(), 668, 698, 699,

755, 1007, 1013equal_to<T>(), 1016erase(), 654, 655, 656, 662, 747,

1006, 1025errno, 802error(), 147, 154, 332, 341, 927estimation, 160etapy rozwoju

oprogramowania, 177Euler, 728exit(), 1040exp(), 802, 1030explicit, 572

Kup książkę Poleć książkę

Page 66: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1074 SKOROWIDZ

explicit type conversion, 547expN(), 482extern, 251extern "C", 909, 971

Ffac(), 482fail(), 330, 331, 332, 344, 1020Fast Light Tool Kit, 387, 1048fclose(), 927, 1032field, 360figury geometryczne, 388FILE, 927, 1032fill(), 1011fill_n(), 1011filozofie j�zyków

programowania, 706find(), 668, 669, 689, 698, 715,

747, 905, 1007, 1008, 1025find_end(), 1009find_first_of(), 1008find_from_addr(), 754, 756find_if(), 668, 671, 1008find_subject(), 756fixed, 358, 359, 1023Fl::wait(), 504fl_arc(), 431Fl_Color, 416Fl_GIF_Image, 438Fl_JPEG_Image, 438fl_line(), 420Fl_linestyle, 417flagi, 844float, 780, 782, 948, 965floatfield, 358floor(), 802, 1029FLOW-MATIC, 722FLT_DIG, 1029FLT_MAX, 1029FLT_MAX_10_EXP, 1029FLT_MIN, 1029FLTK, 387, 401, 886, 1048

instalacja, 1048pobieranie biblioteki

z internetu, 1048Visual Studio, 1049

flush, 1023FMA, 792fmtflags(), 358fopen(), 1032

for, 121, 903, 962for_each(), 1008formalna specyfikacja, 869format pliku, 325formatowane wstawianie, 1021formatowanie danych

wyj�ciowych, 354, 366formaty liczb

zmiennoprzecinkowych, 358Fortran, 20, 720, 739Fortran77, 720Fortran90, 720forward iterator, 663ForwardIterator, 869fprintf(), 925, 1033fragmentacja pami�ci, 819, 820free(), 903, 918, 1038friend, 463, 975from_string(), 748, 749front(), 662, 1005front_inserter(), 1016fstream(), 1020Function, 408, 476, 482function activation record, 273function call operator, 674function template, 605functional programming, 714funkcje, 122, 229, 291, 857, 968

argumenty, 123, 261biblioteka standardowa C,

1032C, 905czysto wirtualne, 981definicja, 122, 123, 907deklaracja, 125, 968deklaracja argumentów, 261error(), 147inline, 298lista parametrów, 123lokalne funkcje, 260main(), 66matematyczne, 802, 1029parametry, 123, 262parametryzowane, 605pomocnicze, 310prototyp, 907przekazywanie argumentów

przez referencj�, 267przekazywanie

argumentów przez sta��referencj�, 265

przekazywanie argumentówprzez warto��, 264

rekord aktywacji, 273rekurencja, 275return, 263rozg�oszeniowe, 791sort(), 130sprawdzanie argumentów,

271sprawdzanie typów

argumentów, 906stos rekordów aktywacji,

275szablony, 605szablonowe, 716tre��, 123typ zwrotny, 261void, 262wynik dzia�ania, 123wywo�anie, 128, 261, 272,

968zagnie�d�one funkcje, 260zastosowanie, 124zwracanie warto�ci, 123, 263

funkcje przeci��one, 969argumenty domy�lne, 970dok�adne dopasowanie, 969dopasowanie przy u�yciu

konwersji zdefiniowanychprzez u�ytkownika, 969

dopasowanie przy u�yciupromocji, 969

dopasowanie przy u�yciustandardowych konwersji,969

dopasowanie przy u�yciuwielokropka, 969

niepodawanie listyargumentów, 970

rozpoznawanie, 969wielokropek, 970wywo�anie, 969

funkcje sk�adowe, 259, 293definiowanie, 296, 297konstruktory, 294sta�e funkcje sk�adowe, 309

funkcje wirtualne, 450, 456,458, 460, 716, 980

wywo�anie, 459funkcje zwrotne, 501

Kup książkę Poleć książkę

Page 67: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1075

Gg++, 34garbage collection, 539GB, 51GCC, 909gcount(), 1021general, 358, 359generalizacja, 464generate(), 1011generate_n(), 1011generator typów, 604generowanie

destruktory, 542typy, 604

get(), 750, 1021get_encoding(), 439get_int(), 749get_string(), 507getc(), 925, 1036getchar(), 925, 926, 1036getline(), 373, 747, 750, 1021gets(), 880, 925, 926GIF, 438gigabajt, 51Gill D. J., 718globalna inicjacja, 277gmtime(), 1039GNU C++, 34good(), 330, 332, 1020Google, 51goto, 963graficzne przedstawianie

danych, 471Axis, 479Distribution, 487etykiety, 491Function, 476odczytywanie danych

z pliku, 487osie, 479rysowanie wykresów

funkcji, 472skalowanie danych, 489tworzenie wykresu, 490uk�ad ogólny, 488warto�� przybli�ona funkcji

wyk�adniczej, 481wykresy, 486

graficzny interfejs u�ytkownika,179, 382, 497

grafika, 382, 400Axis, 392biblioteka GUI, 387elipsa, 431figury geometryczne, 388Image, 399kanwa rysunku, 388klasy figur geometrycznych,

389klasy graficzne, 407kolory, 414linia, 410obrazy, 399, 436okr�g, 430operacje, 445piksel, 388Polygon, 389prezentacja danych, 394projektowanie klas, 444prostok�ty, 395, 422punkt, 410Rectangle, 396rysowanie figur, 454rysowanie wykresu funkcji,

394Shape, 389, 448tekst, 398, 428wielok�ty, 394, 420wspó�rz�dne, 388wype�nianie kolorem, 397

gramatyka, 188, 191elementy wyra�e�, 200implementacja zasad

gramatyki, 194j�zyk angielski, 192niesko�czona rekurencja,

196parser, 194pisanie, 193podstawowe czynniki

wyra�e�, 200produkcja, 194sk�adniki, 199wyra�enia, 195, 196zamiana w kod, 194znaki nieterminalne, 194znaki terminalne, 194

graph, 769, 1027Graph_lib, 384, 390

Window, 500greater_equal<T>(), 1017

greater<T>(), 1016grep, 759GUI, 179, 382, 497, 498

Axis, 392biblioteka, 387Button, 505, 506debugowanie kodu, 517figury geometryczne, 388FLTK, 387funkcje zwrotne, 501Graph_lib, 384, 390Image, 399implementacja wywo�a�

zwrotnych, 1052In_box, 507inwersja kontroli, 511kanwa rysunku, 388klasy figur geometrycznych,

389klasy graficzne, 408kontrolki, 505Lines_window, 509, 510menu, 507, 513Menu, 507nag�ówki graficzne, 390obrazy, 399okno, 385, 390, 500Out_box, 507p�tla oczekuj�ca, 504piksel, 388pliki ród�owe, 402Point, 384Polygon, 385, 389, 394prostok�ty, 395przycisk Next, 499przyciski, 506punkt, 384Rectangle, 396Shape, 389Simple_window, 390, 500tekst, 398testowanie, 883uruchamianie programu,

401Vector_ref, 1055wait_for_button(), 390Widget, 505, 1053widgety, 505, 1056wielok�ty, 394Window, 1054wspó�rz�dne, 388

Kup książkę Poleć książkę

Page 68: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1076 SKOROWIDZ

GUIwype�nianie kolorem, 397wy�wietlanie obiektów

na ekranie, 386gwarancja niezg�aszania

wyj�tku, 621gwarancje, 620

Hhash table, 681, 689hash value, 689hash_map, 691haszowanie, 690header, 66header file, 66heap, 1014Hejlsberg Anders, 728helper function, 311hermetyzacja, 458hex, 355, 356, 357, 947, 1023hide(), 505hierarchia klas, 464hierarchia strumieni wej�cia

i wyj�cia, 1019high(), 715historia j�zyków

programowania, 717History of Programming

Languages, 717Hopper Grace, 161, 722HTML, 383

II/O, 105Ichbiah Jean, 729IDE, 34, 70, 1044idea�y programistyczne, 54, 708

bezpo�rednie wyra�aniemy�li, 711

minimalizm, 713modu�owo��, 712poziom abstrakcji, 712spójno��, 713

identyfikatory, 950s�owa kluczowe, 950

if, 113, 880, 962else, 113else if, 115

IFIP, 724ifstream, 326, 329iloczyn logiczny, 110iloczyn skalarny, 679iloczyn wewn�trzny, 679imag(), 803, 804, 1031Image, 399, 408, 436implementacja, 55, 177, 289implementacja GUI, 1051implementacja tokenów, 183implementacja wywo�a�

funkcji, 272implementacja wywo�a�

zwrotnych, 1052implementacja zasad gramatyki,

194implementation defined, 944importowanie obrazów

z plików, 399In_box, 409, 507INCITS, 944includes(), 1014indeksowanie, 534, 966infinite recursion, 196informacja zwrotna, 55informacje, 51informacje o stanie strumienia,

331informatyka, 35, 45, 725inicjacja, 85, 87, 536

obiekty, 294sk�adowe, 979tablice, 582warto�ci domy�lne, 254wska niki, 536

inicjatory sk�adowych, 979inkrementacja, 89, 110inline function, 903, 905inner product, 680inner_product(), 668, 677, 680,

1031uogólnienie, 681

inplace_merge(), 1013input iterator, 663insert(), 654, 655, 656, 662, 686,

687, 746, 747, 1006, 1025inserter(), 1016instalacja

FLTK, 1047, 1048Visual Studio, 1044

instrukcje, 66, 67, 69, 112, 962if, 113porz�dek wykonywania, 276pusta instrukcja, 113wyra�eniowe, 112z�o�one, 121

instrukcje dla konsolidatora,971

instrukcje maszynowe, 718int, 66, 68, 78, 80, 82, 83, 84,

92, 780, 782, 835, 965INT_MAX, 1029INT_MIN, 1029integrated development

environment, 34, 70inteligentne karty, 810interactive development

environment, 70interaktywne �rodowisko

programistyczne, 70, 1044interfejs, 289interfejs klasy, 303interfejs prywatny, 206interfejs publiczny, 206, 289interfejs u�ytkownika, 498

GUI, 498konsola, 498przegl�darki internetowe,

498internal, 1023intersect(), 421intrusive container, 932invalid_argument, 996invariant, 295inwersja kontroli, 511in�ynieria oprogramowania, 33ios_base, 331ios_base::app, 361, 1020ios_base::ate, 361, 1020ios_base::badbit, 332ios_base::binary, 361, 363, 1020ios_base::failure, 332, 996ios_base::in, 361, 1020ios_base::out, 361, 1020ios_base::trunc, 361, 1020iostream, 332, 370, 750, 765is_open(), 1020is_palindrome(), 587, 588is_whitespace(), 373isalnum(), 369, 1024isalpha(), 240, 369, 758, 1024

Kup książkę Poleć książkę

Page 69: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1077

iscntrl(), 369, 1024isdigit(), 369, 758, 1024isgraph(), 369, 1024islower(), 369, 1024isprint(), 369, 1024ispunct(), 369, 1024isspace(), 369, 1024istream, 323, 324, 325, 329, 370,

750, 1019istream_iterator, 694istream_iterator<>, 694istringstream, 365, 371isupper(), 369, 1024isxdigit(), 369, 1024iter_swap(), 1011iteracja, 119, 132iteration, 119iterator, 646, 661, 1003iterator traits, 890iteratory, 637, 638, 997, 1004

begin, 638const_iterator, 661dost�p swobodny, 661, 663,

1000dwukierunkowe, 661, 663,

1000end, 638istream_iterator, 694, 695istream_iterator<T>, 694iterator, 661kategorie, 662, 1000operacje, 638, 999ostream_iterator, 694ostream_iterator<T>, 694post�puj�ce, 1000przechodz�ce do przodu,

663string, 662strumienie, 694valarray, 662wbudowane tablice, 662wej�ciowe, 663, 1000wstawiaj�ce, 1016wyj�ciowe, 663, 1000

ITU, 40

JJava, 20, 739jawna konwersja typów, 547jednolity rozk�ad, 801

jednostki translacji, 69, 145j�zyk programowania, 34, 64,

706, 852Ada, 729Algol, 724Algol60, 724Algol68, 727BCPL, 735C, 733, 735, 899C++, 20, 736cechy, 706COBOL, 161, 721do celów ogólnych, 724FLOW-MATIC, 722Fortran, 720Lisp, 721, 723Pascal, 727PERL, 759Simula, 715, 731Simula 67, 731Turbo Pascal, 728

j�zyk angielski, 192JPEG, 438

KK&R, 900kalkulator, 179, 180kanwa rysunku, 388karty kredytowe, 810kategorie iteratorów, 662Keep It Simple, Stupid, 714Kernighan Brian, 734, 900key_comp(), 1007key_compare, 1004key_type, 1004KISS, 714klasa pami�ci, 950klasy, 184, 289, 731, 857, 972

Axis, 392bazowe, 410, 458, 979bitset, 839Date, 312definicja, 289definiowanie funkcji

sk�adowych, 296definiowanie sk�adowych,

975derywacja, 458destruktory, 540, 542, 977dost�p do sk�adowych, 184,

292, 973

dziedziczenie, 979funkcje pomocnicze, 310funkcje sk�adowe, 293funkcje wirtualne, 458, 980hermetyzacja, 458hierarchia, 464implementacja, 289inicjacja sk�adowych, 979inicjatory sk�adowych, 979interfejs, 289, 303konkretne, 450konstruktory, 185, 293, 976konstruktory domy�lne, 306konstruktory jawne, 571kontrola dost�pu, 451lista warto�ci inicjuj�cych

sk�adowe, 185lokalne klasy, 260model dost�pu do

sk�adowych, 463nadklasy, 458operacje generowane, 981parametryzowane, 605pochodne, 458, 979podklasy, 458predykaty sk�adowych, 675przeci��anie operatorów, 302przes�anianie, 455, 461przyjaciele, 974raportowanie b��dów, 299sk�adowe, 289, 290, 972sta�e funkcje sk�adowe, 309szablony, 605, 983testowanie, 886this, 974tworzenie, 291typy argumentów, 304ukrywanie szczegó�ów, 294unie, 983vector, 128Vector_ref, 1055Widget, 1053widoczno�� sk�adowych, 290Window, 1054wirtualny destruktor, 543wywo�anie funkcji

sk�adowej, 128zagnie�d�one klasy, 260

klasy abstrakcyjne, 450, 981czyste funkcje wirtualne,

464

Kup książkę Poleć książkę

Page 70: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1078 SKOROWIDZ

klasy graficzne, 407Axis, 408, 479Circle, 408, 430Closed_polyline, 408, 419Color, 414Ellipse, 408, 431figury geometryczne, 389Function, 408, 476Image, 408, 436Line, 408, 410Line_style, 408, 416Lines, 408, 412Mark, 408, 435Marked_polyline, 408, 433Marks, 408, 434Open_polyline, 408, 418Point, 408, 410Polygon, 408, 420Rectangle, 408, 422Shape, 410, 448Simple_window, 500Text, 408, 428

klasy sk�adowe, 260klasy znaków, 768, 769, 1027klasyczna eliminacja Gaussa,

797klasyfikacja znaków, 368, 1024klawiatura, 1019klucze, 685kod, 67kod maszynowy, 67kod obiektowy, 67kod ogólny, 446kod pocztowy, 757kod wykonywalny, 67kod ród�owy, 44, 67kolejki, 1005kolekcje danych, 152, 630kolizja nazw, 257kolor tekstu, 399kolory, 414komentarze, 65, 162, 231, 904,

945kompilacja, 67, 161

warunkowa kompilacja, 931kompilator, 34, 67, 71, 909komputer, 39, 41, 46, 104komunikaty o b��dach, 163konflikt nazw, 257koniec pliku, 88, 927konkatenacja �a�cuchów, 85

konkretyzacja szablonu, 604, 985konsola, 498konsolidacja, 161

b��dy, 145konsolidacja pami�ci, 821konsolidator, 70, 909, 971konstruktory, 185, 293, 294,

571, 976debugowanie, 573domy�lny konstruktor, 254,

306, 308jawne, 571kopiuj�ce, 456, 566

kontenery, 152, 525, 526, 595,596, 629, 634, 660, 661, 1001

adaptery, 1002allocator_type, 1004array, 660, 1001asocjacyjne, 681, 1001, 1002const_iterator, 1004const_pointer, 1004const_reference, 1004const_reverse_iterator, 1004deque, 660, 1001destruktory, 1004difference_type, 1003dost�p do elementów, 1005dziedziczenie, 607, 832intruzyjne, 932iterator, 1003iteratory, 1004key_compare, 1004key_type, 1004kolejki, 1005konstruktory, 1004list, 660, 1001listy, 1006map, 660, 681, 684, 1001mapped_type, 1004multimap, 660, 681, 1001multiset, 660, 681, 1001nieintruzyjne, 932operacje kolejek, 1005operacje kontenerów

asocjacyjnych, 1007operacje listowe, 1006operacje stosowe, 1005pointer, 1004pojemno��, 598, 1006porównywanie, 1006priority_queue, 1002

przypisania, 1004queue, 1002reference, 1004reverse_iterator, 1004rozmiar, 1006sekwencyjne, 1001set, 660, 681, 696, 1001size_type, 1003s�owniki, 682stack, 1002stos, 1005string, 1002typy sk�adowych, 1003unordered_map, 660, 681,

689, 1001unordered_multimap, 660,

681, 1001unordered_multiset, 660,

681, 1002unordered_set, 660, 681,

1002unsorted_map, 690valarray, 1002value_type, 1003vector, 660, 1001wbudowana tablica, 1002wektor, 526zamienianie, 1006, 1007zbiory, 691

kontrola dost�pu, 451kontrola typów, 94kontrolki, 505konwersje argumentów, 271konwersje typów, 111, 958, 961

arytmetyczne, 959bezpieczne dla typów, 95ca�kowitoliczbowe, 958const_cast, 962dynamic_cast, 961niebezpieczne dla typów, 96operatory, 961pomi�dzy typami

zmiennoprzecinkowymii ca�kowitoliczbowymi,959

referencje, 959reinterpret_cast, 961static_cast, 961void*, 916warto�ci logiczne, 959wska niki, 959

Kup książkę Poleć książkę

Page 71: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1079

zaw��aj�ce, 96zdefiniowane przez

u�ytkownika, 960zmiennoprzecinkowe, 959

kopiowanie, 306, 456, 564, 693,976, 978

g��bokie, 569konstruktory kopiuj�ce, 566p�ytkie, 569przez konstruowanie, 567przypisywanie z

kopiowaniem, 567korze�, 685krój pisma, 399kryterium porównywania, 866kursor, 65

Llabel.set_color(), 393laptop, 41leak detector, 574left, 1023legal, 944length(), 369, 746, 1025length_error, 996less_equal<T>(), 1017less<T>(), 1017lexicographical order, 920lexicographical_compare(),

1015liczby, 78, 93, 779

bez znaku, 840binarne, 94, 947ca�kowite, 81, 780float, 782funkcje matematyczne, 802int, 782limity, 1028macierze, 784, 786mantysa, 782Matrix, 786obliczenia, 782ograniczenia typów

liczbowych, 783ósemkowe, 355precyzja, 358, 780przekroczenie zakresu, 780,

781rozmiar, 780rzeczywiste, 780

systemy liczbowe, 946szesnastkowe, 355, 947tablice, 784ujemne, 224wyk�adnik, 782ze znakiem, 840zmiennoprzecinkowe, 358,

780, 781, 948zmiennoprzecinkowe

podwójnej precyzji, 80liczby losowe, 800

rand(), 801RAND_MAX, 801

liczby zespolone, 803, 1030complex, 803cz��� rzeczywista, 1031cz��� urojona, 1031funkcje matematyczne, 803operacje, 1030operatory, 804sprz��enie, 1031typy, 1030

limity typów liczbowych, 1028Line, 389, 408, 410, 411, 444Line_style, 389, 408, 416, 417Lines, 389, 408, 412, 452

draw_lines(), 414Lines_window, 509, 510, 515linia, 410

styl, 416Link, 551, 552, 557, 641

insert(), 556linkage specification, 971linked list, 641linker, 70lint, 733, 906Lisp, 721, 723list, 642, 653, 660, 1001lista parametrów, 66, 123lista warto�ci inicjuj�cych

sk�adowe, 185listy, 551, 596, 653

add(), 553advance(), 553dwukierunkowe, 551, 932erase(), 553, 554find(), 553, 554insert(), 554jednokierunkowe, 551Link, 551, 552ogniwo, 551

operacje, 552zastosowanie, 554

listy powi�zane, 641dwustronnie, 641iteracja, 643iterator, 643jednostronnie, 641list, 642operacje, 642, 647usuwanie elementów, 647wstawianie elementów, 647

litera�y, 946liczby ca�kowite, 946liczby

zmiennoprzecinkowe, 948logiczne, 948�a�cuchowe, 949wska nikowe, 949znakowe, 948

locale, 376localtime(), 1039log(), 802, 1030log10(), 802, 1030logic programming, 714logical_and<T>(), 1017logical_not<T>(), 1017logical_or<T>(), 1017lokalne obiekty statyczne, 953Lola, 728long, 780, 965long double, 948long int, 835LONG_MAX, 1029LONG_MIN, 1029losowo��, 800lower, 769, 1027lower_bound(), 699, 1007, 1012lub wykluczaj�ce, 956Lucent Bell Labs, 733, 735ludzie, 42l-warto��, 107

�agodne ograniczenia czasowe,

814�a�cuchy, 84, 130, 586, 746,

949, 1024dopasowanie wyra�e�

regularnych, 1025klasyfikacja znaków, 1024

Kup książkę Poleć książkę

Page 72: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1080 SKOROWIDZ

�a�cuchykonkatenacja, 85ma�e litery, 1024operacje, 746, 1025przetwarzanie, 1024strumienie, 365styl j�zyka C, 582, 919, 1036wielkie litery, 1024

�atwo�� utrzymania, 709��czenie, 69

Mmacierze, 56, 596, 715, 784, 786

b��dy zakresu, 788dost�p, 787dwuwymiarowe, 792FMA, 792indeksowanie, 788jednowymiarowe, 789kopiowanie danych, 792liczba elementów, 789Matrix, 787Matrix_error, 788metoda eliminacji Gaussa,

797mno�enie przez wektor, 800operacje, 793operatory przypisania, 791rozwi�zywanie równa�

liniowych, 796trójwymiarowe, 795wej�cie, 794wybór elementu

centralnego, 798wycinki, 790wyj�cie, 794wymiary, 787zamiana kolumn miejscami,

793zamiana wierszy miejscami,

793macro substitution, 989Maddock John, 759magiczne sta�e, 109Mail_file, 752, 755main(), 66, 78, 229, 945

argumenty, 945make_heap(), 1014make_pair(), 686, 687, 1018make_vec(), 620, 621

makra, 615, 904, 927, 928, 989definiowanie, 990podobie�stwo do funkcji,

929zastosowanie, 928

makra sk�adniowe, 930malloc(), 903, 918, 1038manager pami�ci wolnej, 539manipulatory, 355, 1022manipulowanie bitami, 844mantysa, 782map, 596, 660, 681, 682, 684,

822, 904, 1001mapped_type, 1004Mark, 400, 408, 435Marked_polyline, 408, 433Marks, 408, 434, 452maskowanie, 845matches.size(), 762matrix, 784Matrix, 56, 786, 787Matrix_error, 788MAX, 928max(), 258, 1015max_element(), 1015max_size(), 1006max_x(), 410max_y(), 410McCarthy John, 723McIlroy Doug, 734, 908mechanizm wy�wietlaj�cy, 383mechanizm wywo�a�

wirtualnych, 543medycyna, 50mem_fun(mf), 1017mem_fun_ref(mf), 1017member, 289member access operator, 546member function, 293member initializer list, 185memchr(), 923, 1038memcmp(), 922, 1038memcpy(), 922, 1037memmove(), 922, 1037memory exhaustion, 560memset(), 923, 1038menu, 507, 513

tworzenie, 513Menu, 409, 507merge(), 668, 1013metoda eliminacji Gaussa, 797

metody, 294random_shuffle(), 1010rotate_copy(), 1010

metody nauczania, 32Microsoft Visual C++, 71Microsoft Visual Studio, 34miejsce na dane, 78miejsce rozpocz�cia programu,

66mierzenie czasu dzia�ania

funkcji, 1039mieszanie, 690min(), 1015min_element(), 1015minimalizm, 713minus<T>(), 1017mismatch(), 1008MIT McCarthy, 724mit samotnie pracuj�cego

programisty, 43mktime(), 1039mno�enie macierzy przez

wektor, 800model dost�pu do sk�adowych,

463model graficzny, 383model iteratorów, 998model strumieni wej�cia

i wyj�cia, 323Modula, 728Modula-2, 728modular arithmetic, 842modulus<T>(), 1017modu�owo��, 712modyfikacja wyj�ciowych

liczb ca�kowitych, 356monitorowanie, 48monitorowanie podsystemów,

818monitory jako�ci linii

produkcyjnych, 810monitory medyczne, 810move(), 424, 506MSC++, 909multimap, 660, 681, 1001multi-paradigm programming,

717multiple inheritance, 979multiplies<T>(), 1017multiset, 660, 681, 1001

Kup książkę Poleć książkę

Page 73: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1081

Nnadklasy, 458nadmiernie inteligentni

programi�ci, 852nag�ówki, 66, 254namespace, 261, 279, 988narz�dzia, 178NASA, 52natychmiastowe reagowanie,

812nauczanie, 29Naur Peter, 725nawiasy, 108, 163nazwy, 80, 90, 162, 164, 240,

446, 855, 988makra, 928predefiniowane, 242przestrze� nazw, 261s�owa kluczowe, 91styl oddzielania wyrazów, 92symboliczne, 718wielko�� liter, 91zakres dost�pno�ci, 258

nazwy w pe�ni kwalifikowane,280

negate<T>(), 1017new, 533, 545, 612, 621, 815,

819, 820, 903, 952, 955, 961Next, 499next(), 503, 504next_permutation(), 1015niechlujny kod, 710niedouczeni programi�ci, 852nieformatowane wstawianie,

1021niejawna konwersja typów, 958niekompletne programy, 141niekontrolowane konwersje,

825nieoczekiwane argumenty, 141nieodpowiednie standardy

kodowania, 852nieokre�lony, 945nieprawid�owe argumenty, 151nieprawid�owe dane

wej�ciowe, 154nieprzerwana praca, 813niesko�czona rekurencja, 196niespodziewane dane

wej�ciowe, 142

niespodziewany stan, 142niestandardowe separatory, 370niezdefiniowane, 945niezgodne, ale niewymagaj�ce

diagnostyki, 945niezmiennik, 295noboolalpha, 1022non-intrusive container, 932norm(), 804noshowbase, 356, 1022noshowpoint, 1022noshowpos, 1022noskipws, 1022NOT, 110not conforming but not requiring

diagnostic, 945not_equal_to<T>(), 1016not1(g), 1017not2(g), 1017notacja *this, 601notacja Backusa-Naura, 721nouppercase, 1023nowoczesne j�zyki

programowania, 719nth_element(), 1012null pointer, 537number_of_points(), 414numeric_limits<T>, 1028Nygaard Kristen, 731

OOberon, 728Oberon-2, 728obiektowo��, 33obiekty, 78, 92

auto_ptr, 621automatyczne, 953czas trwania, 952destruktory, 540, 977dost�p do sk�adowych, 184funkcje sk�adowe, 293inicjalizacja, 294konstruktory, 185, 293, 976konstruktory domy�lne, 306kopiowanie, 306, 456, 976,

978kopiowanie g��bokie, 569kopiowanie p�ytkie, 569lista warto�ci inicjuj�cych

sk�adowe, 185

lokalne, 953lokalne statyczne, 953nazwy, 80odwo�anie do bie��cego

obiektu, 298poprawny stan, 295przestrze� nazw, 953przyjaciele, 974referencje, 968stan, 295this, 555, 974tworzenie, 961, 976tymczasowe, 270, 953usuwanie, 953, 976w pami�ci wolnej, 953wska niki, 545wykorzystanie obiektów

bez nazw, 426obiekty funkcyjne, 673, 674,

1016object-oriented programming,

458obliczanie warto�ci skrótu, 690obliczenia, 104, 105, 159, 782,

1028szacowanie, 159

obrazy, 399, 436obs�uga b��dów, 151, 220

operacje wej�cia i wyj�cia,330

strumienie, 1020testowanie, 221

obs�uga wyj�tków, 151oct, 355, 356, 357, 1023oczyszczanie kodu, 227

funkcje, 229komentarze, 231sta�e symboliczne, 227uk�ad kodu, 230

od do�u do góry, 32, 710od góry do do�u, 33, 710odczytywanie

dane z pliku, 326, 328, 487sekwencje znaków, 757struktury warto�ci, 344

oddzielanie warstwykomunikacyjnejod funkcji, 337

odporno�� na b��dy, 813odtwarzacze MP3, 810

Kup książkę Poleć książkę

Page 74: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1082 SKOROWIDZ

odwo�anie do bie��cegoobiektu, 298

odzyskiwanie sprawno�cipo wyst�pieniu b��du, 233

off-by-one error, 153ofstream, 326, 329ogniwo, 551ogólny kod, 446ograniczenia, 615ograniczenia czasowe, 814ograniczenia typów liczbowych,

783okno, 385, 390, 425, 500okr�g, 430opcjonalne sprawdzanie, 614,

615open(), 327, 328, 1019, 1020Open_polyline, 408, 418, 429,

452draw_lines(), 434

operacje, 82, 84, 570bajtowe, 922bitowe, 835, 836generowane, 981liczby zespolone, 1030�a�cuchowe, 746, 1025na iteratorach, 638, 999na zbiorach danych, 634tablicowe, 786

operandy, 107operator, 303, 958operator overloading, 302operator[], 575, 614operator=, 600operatory, 82, 84, 109

!=, 110%, 225&, 529, 549&&, 110(), 674*, 534[], 534||, 110++, 89, 90, 109<, 110<<, 68, 110<=, 110=, 85==, 110>, 110->, 546, 973

>=, 110>>, 79, 81, 110addytywne, 955adres, 529aplikacji, 674const_cast, 547definiowanie przez

u�ytkownika, 958delete, 538, 545, 573, 953,

961dereferencja, 530, 534dost�p do sk�adowych, 546indeksowanie, 534inkrementacja, 89konwersja typów, 961liczby zespolone, 804logiczne, 960new, 533, 545, 961porównania, 956przeci��anie, 302, 971przesuni�cie, 955przypisanie, 85, 957reinterpret_cast, 531, 547relacyjne, 956sizeof, 364, 531, 960static_cast, 547tryby otwierania, 1032typedef, 646wej�ciowe, 339wielokrotno��, 955wyj�cie, 68wyj�ciowe, 338wy�uskanie, 530wywo�anie funkcji, 674zasi�g, 973zawarto��, 530z�o�one operatory

przypisania, 89oprogramowanie, 40or, 956OR, 110ostre ograniczenia czasowe, 814ostream, 288, 323, 325, 354,

750, 1018, 1019ostream_iterator, 694ostream_iterator<>, 694ostringstream, 365, 366otwieranie plików, 326, 361,

927, 1032tryby otwierania, 361

otwieranie strumienia, 1019

Out_box, 409, 507out_of_range, 153, 154, 615,

996output iterator, 663overflow_error, 996overload resolution, 969overriding, 455, 460

Ppair, 1017pair(), 1013pair<>, 686paleta kolorów, 415palindrom, 586

wykorzystanie �a�cuchów,586

wykorzystanie tablic, 587wykorzystanie wska ników,

588pami��, 342, 526, 529, 950, 951,

1037automatyczna, 532, 818, 951dynamiczna, 818kod, 532statyczna, 532, 818, 952tekst, 532

pami�� wolna, 532, 819, 918,952

alokacja obiektów, 533dealokacja, 538destruktory, 542rezerwowanie pami�ci, 533

paradygmaty programowania,714, 715

parametric polymorphism, 605parametrized class, 605parametrized function, 605parametrized type, 605parametry, 123, 262

referencje, 549szablony, 603wska niki, 549

PARC, 708parser, 194parsowanie, 189partial_sort(), 1012partial_sort_copy(), 1012partial_sum(), 677, 1031partition(), 1013Pascal, 726, 727, 728

Kup książkę Poleć książkę

Page 75: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1083

PC, 40PDA, 810pe�na gwarancja, 621PERL, 739, 759permutacje, 1015Petersen „Pete” Lawrence, 38p�tla oczekuj�ca, 504p�tle, 88, 119, 132, 879

for, 121przepe�nienie bufora, 880tre��, 120while, 88, 119zmienna iteracyjna, 119zmienna kontrolna, 119

PFN, 846PHP, 739, 759piksel, 388pisanie gramatyki, 193pisanie kodu, 44pisanie programu, 175, 176

biblioteki, 178etapy rozwoju

oprogramowania, 177gramatyka, 188implementacja tokenów, 183narz�dzia, 178obs�uga b��dów, 220oczyszczanie kodu, 227odzyskiwanie sprawno�ci

po wyst�pieniu b��du, 233parsowanie, 189problem, 176prototyp, 179przypadki u�ycia, 180pseudokod, 180, 187rozwi�zanie problemu, 177strategia, 177struktura programu, 211strumienie tokenów, 206szczegó�y techniczne, 248testowanie, 221tokeny, 182u�ywanie tokenów, 185wczytywanie liczb, 210wczytywanie tokenów, 209wersja „1.0”, 224wersja z ograniczon�

funkcjonalno�ci�, 179wypróbowywanie drugiej

wersji, 205wypróbowywanie pierwszej

wersji, 201

zamiana gramatykiw kod, 194

zestaw zasad, 189PL/360, 728planowanie rejsów, 47pliki, 325, 1032

C, 927cpp, 67EOF, 927FILE, 927format, 325h, 67ifstream, 326, 329koniec, 88odczytywanie danych, 326,

328ofstream, 326, 329otwieranie, 326, 361, 927,

1032pozycjonowanie, 361, 365strukturalne, 341strumienie, 326tryby otwierania, 361zamykanie, 327, 927, 1032zapisywanie danych, 326,

328pliki binarne, 362

odczytywanie, 363operacje wej�cia i wyj�cia,

363otwieranie, 363zapisywanie, 363

pliki nag�ówkowe, 66, 254plus<T>(), 1017pobieranie danych

wej�ciowych, 79poddopasowanie, 762podej�cie do pisania

poprawnegooprogramowania, 710

od do�u, 710od góry, 710

podklasy, 458podstawowa gwarancja, 621podstawowe czynniki wyra�e�,

200Point, 384, 389, 397, 408, 410,

444point(), 414pointer, 459, 528, 529, 1004pointer arithmetic, 579

pointer semantics, 570pojemno�� kontenera, 598poj�cie abstrakcyjne, 464pola, 360pola bitowe, 846, 982polar(), 804, 1031polimorfizm, 606

ad hoc, 605czasu dzia�ania programu,

458parametryczny, 605

Polygon, 385, 389, 394, 408,420, 452

add(), 422pomy�ka o jeden, 153pool, 823pop_back(), 662, 1005pop_front(), 1005pop_heap(), 1014pope�nianie b��dów, 141poprawno��, 709, 813poprawny stan obiektu, 295porównania, 956porz�dek leksykograficzny, 920porz�dek wykonywania

instrukcji, 276globalna inicjacja, 277warto�ciowanie wyra�e�,

277porz�dkowanie �a�cuchów, 697POSIX, 764postdekrementacja, 109postinkrementacja, 109powa�ne b��dy, 870powi�kszanie wektora, 127powtarzaj�ce si� s�owa, 87powtarzanie, 119poziom abstrakcji, 712pozycjonowanie, 361, 365prawa optymalizacji, 816prawdopodobne b��dy, 870prawie kontenery, 1002pre-condition, 166precyzja liczb

zmiennoprzecinkowych, 358,359

precyzja oblicze�, 780predefiniowane nazwy, 242predekrementacja, 109predykaty, 1016predykaty sk�adowych klas, 675

Kup książkę Poleć książkę

Page 76: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1084 SKOROWIDZ

preinkrementacja, 109preprocesor, 855, 989

dyrektywy, 989preprocessing, 255prev_permutation(), 1015prezentacja danych, 394Princeton University, 723, 735print, 769, 1027print(), 843, 906printf(), 376, 924, 925, 926,

1033specyfikatory konwersji,

1033priority_queue, 1002private, 206, 289, 463, 973problem, 176problem sta�ych wektorów,

576problem zaw��aj�cych

konwersji, 98problemy z pami�ci� woln�,

819problemy z wyj�tkami, 619proces tworzenia programu, 55produkcje, 194profesjonalizm, 706program, 34, 63, 64, 944

cena, 54dobrze zaprojektowany, 54g�ówny program, 883kompilacja, 67��czenie, 69niezawodno��, 54pisanie, 176poprawno��, 54proces tworzenia, 55projekt, 1044punkt startowy, 66struktura, 211szkielet, 229tworzenie, 1044uruchamianie, 945, 1044utrzymanie, 54Witaj, �wiecie, 64zamykanie, 945zgodny program, 944

programista, 43programowanie, 19, 30, 34, 39,

40, 44, 55, 56, 64aspektowe, 714funkcyjne, 714, 721

grafika, 382logiczne, 714obiektowe, 458, 465, 606,

714, 715ogólne, 605, 606, 670, 714,

715ograniczeniowe, 714proceduralne, 714, 715regu�owe, 714systemy, 736systemy wbudowane, 809wieloparadygmatowe, 717

projekt, 47, 1044dodawanie pliku

ród�owego C++, 1045tworzenie, 1044

projektowanie, 55, 177projektowanie klas, 444

abstrakcyjna klasa bazowa,464

chronione sk�adowe, 458czyste funkcje wirtualne,

464definiowanie funkcji

wirtualnych, 461dost�p do danych, 448dost�p do sk�adowych, 463dziedziczenie

implementacji, 465dziedziczenie interfejsu, 465hermetyzacja, 458hierarchia klas, 464klasy bazowe, 458klasy graficzne, 384, 443klasy pochodne, 458kontrola dost�pu, 451kopiowanie, 456nazewnictwo, 446operacje, 445prywatne sk�adowe, 458przes�anianie, 455, 461Shape, 448tworzenie podklas, 461typy, 444uk�ad obiektu, 459zmienno��, 448, 456

projektowanie pod k�temtestowania, 890

promocje, 958promotion, 958prostok�ty, 395, 422

protected, 450, 463, 973, 979prototyp, 179prototyp funkcji, 907prywatne sk�adowe, 458przechowywanie

dane, 630sekwencje znaków, 653zmienne, 240

przechwytywanie wyj�tków,151

przeci��aniefunkcje, 903, 906operatory, 302, 971

przecinek, 957przedstawianie danych

na wykresach, 486przekazywanie argumentów

przez referencj�, 267, 269przez sta�� referencj�, 265przez warto��, 264, 269

przekroczenie zakresu liczby,780, 781

przeno�no�� kodu, 34przepe�nienie bufora, 880przes�anianie, 455, 460, 461przestrze� nazw, 261, 279, 917,

988fully qualified name, 280nazwa w pe�ni

kwalifikowana, 280std, 995using, 280zakres, 951

przestrze� znacznikówstruktur, 912

przesuni�cie, 845przesuni�cie bitowe, 836, 955przeszukiwanie binarne, 698przetwarzanie danych, 52, 630,

634przetwarzanie tekstu, 745, 1024

from_string(), 748isalpha(), 758isdigit(), 758�a�cuchy, 746operacje na �a�cuchach, 746s�owniki, 750string, 746stringstream, 747strumienie wej�cia i wyj�cia,

750

Kup książkę Poleć książkę

Page 77: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1085

to_string(), 748Unicode, 747wyra�enia regularne, 758,

759wyszukiwanie, 761

przetwarzanie wst�pne, 255przewidywalno��, 814, 815

awaria, 816b��dy przej�ciowe, 817idea�y, 815

przyciski, 506Next, 499

przyjaciele, 974przyjmowanie na wej�ciu

liczb ca�kowitych, 356przypadki testowe, 168, 873przypadki u�ycia, 180przypisanie, 85, 107, 110, 957przypisanie kopiuj�ce, 567, 568,

570przypisanie wektorów, 600pseudokod, 180, 187public, 206, 289, 463, 973pula, 822, 823punct, 769, 1027punkt, 384, 410punkt startowy programu, 66pure virtual function, 450push_back(), 127, 128, 526, 528,

595, 599, 655, 662, 1005, 1025push_front(), 644, 1005push_heap(), 1014pusta instrukcje, 113put_on_top(), 425putback(), 332putc(), 1036putchar(), 1036

Qqsort(), 1040queue, 1002

Rradius(), 430RAII, 586, 620, 622, 879, 987rand(), 801, 1040RAND_MAX, 801random_matrix(), 800random_shuffle(), 1010

random_vector(), 800, 801random-access iterator, 661, 663range error, 153Range_error, 616raport o b��dzie, 869raport techniczny, 658raportowanie b��dów, 149, 299,

869rbegin(), 1005read(), 364, 1021Reading, 344real(), 803, 804, 1031realloc(), 919, 1038Rectangle, 389, 396, 408, 422,

427, 452red-black tree, 681, 684reference, 1004reference semantics, 570reference_to(), 1052referencje, 265, 267, 270, 548,

903, 968dziedziczenie, 550parametry, 549przekazywanie argumentów,

267, 269zasady stosowania, 270

regex, 762, 905regex_error, 996regex_match(), 771, 1026regex_search(), 762, 770, 1026regexps, 764regexs, 764regression testing, 868regular expressions, 758, 764regulatory pomp, 810regulatory zapór wodnych, 810reinterpret_cast, 531, 547, 825,

903, 954, 961REINTERPRET_CAST, 916rejestry, 718rejestry urz�dzenia, 846rekord aktywacji funkcji, 273rekurencja, 196, 275remove(), 1010remove_copy(), 1010remove_copy_if(), 1010rend(), 1005repetition, 119repetycja, 193replace(), 1010replace_copy(), 1010

replikacja, 817reprezentacja, 597reprezentacja danych

w pami�ci, 342reserve(), 598, 599, 658, 1006resetiosflags(), 1023resize(), 595, 596, 599, 1006Resource Acquisition Is

Initialization, 586, 620, 879reszta z dzielenia, 225return, 64, 123, 126, 263, 963return(), 622reverse(), 1010reverse_copy(), 1010reverse_iterator, 1004rezerwacja pami�ci, 533, 598RFC2822, 751right, 1023Ritchie Dennis, 733, 900roboty sk�adaj�ce samochody,

810roboty spawaj�ce, 810root node, 685rotate(), 1010rotate_copy(), 1010rozga��zianie, 880rozmiar znaków, 399rozpoznawanie funkcji

przeci��onych, 969rozwi�zywanie problemów, 35rozwi�zywanie równa�

liniowych, 796rozwijanie stosu, 987rozwój oprogramowania, 177równania liniowe, 796równoleg�y program, 815rule-based programming, 714run-time dispatch, 458run-time polymorphism, 458runtime_error, 154, 155, 332r-warto��, 107rysowanie

figury, 454wykresy funkcji, 394, 472

rzutowanie, 546, 547, 904, 961const_cast, 547, 548nowy styl, 915reinterpret_cast, 547static_cast, 547styl j�zyka C, 915styl szablonowy, 915

Kup książkę Poleć książkę

Page 78: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1086 SKOROWIDZ

Ss, 1027samochody, 810samokontrola, 817samoloty, 810samoprzypisanie, 601samotnie pracuj�cy

programista, 43scale_and_add(), 792scanf(), 376, 880, 925, 926scientific, 358, 359, 1023scope resolution operator, 973search(), 1008, 1009search_n(), 1009seekg(), 365seekp(), 365see-out, 65sekwencje, 193, 637sekwencje losowe, 874selekcja, 113

if, 113switch, 115

semantykareferencyjna, 570warto�ciowa, 570wska nikowa, 570

serach(), 698set, 660, 681, 691, 696, 905,

1001set_color(), 386, 393, 414, 418set_difference(), 1014set_fill_color(), 397, 423set_font(), 399set_font_size(), 399set_intersection(), 1014set_label(), 393set_major(), 432set_mask(), 437set_minor(), 432set_point(), 452set_radius(), 430set_style(), 397, 416, 417set_symmetric_difference(),

1014set_union(), 1014setbase(), 1023setf(), 851setfill(), 1023setiosflags(), 1023setprecision(), 1023

setw(), 360, 1023Shape, 56, 389, 410, 444, 448,

449, 461, 715, 887draw(), 454draw_lines, 454klasa abstrakcyjna, 450kontrola dost�pu, 451rysowanie figur, 454uk�ad obiektu, 459

short, 835, 965show(), 505showbase, 356, 1022showpoint, 1022showpos, 1022signed, 843, 965silnik, 47Simple_window, 385, 389, 390,

409, 500, 835Simula, 715, 731Simula 67, 726, 731sin(), 394, 802, 1029singly-linked list, 551, 641sinh(), 802, 1030size(), 130, 526, 565, 662, 746,

1006, 1025size_type, 646, 841, 1003sizeof, 364, 531, 580, 904, 954,

960, 976skalowanie, 786skalowanie danych, 489skanery medyczne, 810skipws, 1022sk�adnia, 142sk�adniki, 199sk�adowe, 184, 289, 972

chronione, 463dost�p do warto�ci, 292funkcje pomocnicze, 310inicjacja, 979prywatne, 463publiczne, 463static const, 976typy, 289widoczno��, 290

sk�adowe sk�adowych, 290skrót, 690s�abe projektowanie, 893s�owa kluczowe, 66, 91, 950

break, 116, 118C, 913case, 116, 227

catch, 151, 156class, 184, 289, 857const, 109, 253, 927, 960else, 113enum, 300explicit, 572extern, 251for, 121friend, 975if, 113int, 66namespace, 261, 279, 988operator, 303private, 463protected, 979return, 123, 126, 263signed, 843static, 502struct, 290, 291, 912switch, 115template, 608, 983throw, 151, 986try, 151unsigned, 837using, 280, 988virtual, 451, 456, 980, 981void, 262while, 119

s�owniki, 596, 667, 681, 682binarne drzewa

zrównowa�one, 684map, 682, 684nieuporz�dkowane, 691przetwarzanie tekstu, 750zastosowanie, 687

s�owo, 834smatch, 762solve_random_system(), 799sort(), 130, 132, 526, 668, 697,

711, 715, 905, 1012sort_heap(), 1014sortowanie, 130, 675, 697, 1012space, 769, 1027specialization, 604specjalizacja, 604, 985specjalne przypadki, 871specyfikacja, 141, 177sposoby przechowywania

sekwencji znaków, 653spójno��, 713

Kup książkę Poleć książkę

Page 79: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1087

sprawdzanieargumenty, 149, 271bia�e znaki, 374przeci�cia, 422typy argumentów funkcji,

906zakres, 613

sprintf(), 1033, 1036sprz�t, 813sprz��enie, 804, 1031sqrt(), 802, 1029srand(), 801, 1040stable_partition(), 1013stable_sort(), 1012stack, 824, 1002Stack, 824stack storage, 532stack unwinding, 987sta�e, 108, 960

C, 927deklaracja, 252

sta�e funkcje sk�adowe, 309sta�e magiczne, 109sta�e symboliczne, 108, 227sta�e wektory, 576sta�e wyra�e�, 109stan, 104, 288, 295stan strumienia, 330standard template library, 634standardowa p�tla wej�ciowa,

340standardowe funkcje

matematyczne, 1029standardowy strumie�

wej�ciowy, 79, 1019standardowy strumie�

wyj�ciowy, 65, 1019standardowy strumie�

wyj�ciowy b��dów, 1019standardy kodowania, 851, 852,

859funkcje, 857klasy, 857nazwy, 855preprocesor, 855systemy o krytycznym

znaczeniu, 858systemy o ostrych

ograniczeniachczasowych, 858

�cis�e zasady, 854

uk�ad, 855wyra�enia, 857zalecenia, 854zasady dobrego stylu

kodowania, 852zasady ogólne, 855

Start Without Debugging, 1046stary styl definiowania, 908statement, 67static, 502, 952static storage, 532static_cast, 364, 547, 903, 954,

961statyczne sk�adowe klas, 953statyczny system typów, 733std, 995std::bitset, 835std::cout, 280std::out_of_range, 615std::set, 835std::string, 280std::vector, 835std_lib_facilities.h, 1045stdin, 924stdio, 1036stdout, 924sterowniki urz�dze�, 322

drukarki, 810nap�dy dyskowe, 810

sterta, 532, 818, 952, 1014STL, 525, 634, 721stopie� abstrakcji, 712storage class, 950stos, 275, 532, 818, 822, 824,

1005stos rekordów aktywacji, 275str(), 366, 373str_to_double(), 366strategia testowania, 870strcat(), 920, 921, 1037strchr(), 920, 922, 1037strcmp(), 920, 921, 1037strcpy(), 920, 921, 923, 1037stream state, 330streambuf, 376string, 80, 82, 83, 93, 288, 367,

527, 564, 653, 662, 746, 765,905, 1002

stringstream, 747, 749, 750,1019

strlen(), 581, 583, 920, 1037

strncat(), 920, 921, 1037strncmp(), 920, 921, 1037strncpy(), 920, 921, 1037strong guarantee, 621Stroustrup Bjarne, 37, 725, 736strpbrk(), 1037strrchr(), 1037strstr(), 920, 1037strtod(), 1037strtol(), 1037strtoul(), 1037struct, 290, 291, 344, 912, 971,

982struct tag, 912struktura kodu, 710struktura programu, 211struktury, 290, 291, 912struktury danych, 104, 551, 596strumienie, 321, 1018

bufor, 324buforowanie, 324, 376cerr, 1019cin, 1019cout, 65, 1019definiowanie operatorów

wej�ciowych, 339definiowanie operatorów

wyj�ciowych, 338formatowane wstawianie,

1021formatowanie, 1022hierarchia strumieni, 1019ifstream, 326istream, 323, 324, 1019istringstream, 365iteratory, 694manipulatory, 1022nieformatowane wstawianie,

1021obs�uga b��dów, 1020obs�uga b��dów wej�cia

i wyj�cia, 330ofstream, 326operacje wej�ciowe, 1021operacje wyj�ciowe, 1022operatory wej�ciowe, 339ostream, 323, 325, 1018,

1019ostringstream, 365otwieranie, 1019plikowe, 326

Kup książkę Poleć książkę

Page 80: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1088 SKOROWIDZ

strumienieseparatory, 370stan, 330standardowa p�tla

wej�ciowa, 340standardowe manipulatory,

1022streambuf, 376stringstream, 747tekst, 750tryby, 1020wczytywanie pliku

strukturalnego, 341wczytywanie pojedynczej

warto�ci, 333wej�cie, 79, 322, 1021wyj�cie, 65, 322, 323, 1022znak ko�cz�cy, 341

strumienie �a�cuchowe, 365formatowanie danych

wyj�ciowych, 366odczytywanie danych, 366

strumienie tokenów, 206styl linii, 395, 397, 416style programowania, 714, 715

programowanie obiektowe,606

subclass, 458suma logiczna, 110superclass, 458swap(), 1007, 1011swap_columns(), 794swap_ranges(), 1011swap_rows(), 793switch, 115, 116, 880, 962

break, 116, 118case, 116etykiety, 116

sync_with_stdio(), 924, 1035syntax analyzer, 189system nazw, 242system testing, 868system(), 1040systematyczne wyszukiwanie

b��dów, 867systemy liczbowe, 355, 946systemy nag�a�niaj�ce, 810systemy o krytycznym

znaczeniu, 858systemy o ostrych ograniczeniach

czasowych, 858

systemy wbudowane, 810adresy, 825alokacja pami�ci, 819Array_ref, 830bezpo�rednia konserwacja,

812bitset, 839dziedziczenie, 832interfejsy, 826klasa interfejsu, 829kontenery, 832�agodne ograniczenia

czasowe, 814manipulowanie bitami, 844natychmiastowe

reagowanie, 812niekontrolowane konwersje,

825nieprzerwana praca, 813niezawodno��, 811odporno�� na b��dy, 813ograniczenia czasowe, 814operacje bitowe, 835ostre ograniczenia czasowe,

814pami�� dynamiczna, 819pami�� statyczna, 818pami�� stosowa, 818pola bitowe, 846poprawno��, 813przewidywalno��, 814, 815rejestry urz�dzenia, 846sprz�t, 813standardy kodowania, 851tablice, 825wska niki, 825wspó�bie�no��, 815zarz�dzanie pami�ci�, 818zasoby, 812zasoby fizyczne, 825 le dzia�aj�ce interfejsy, 826

szablony, 602, 607, 983algorytmy, 605alokator, 612argumenty, 610, 984dedukcja argumentów, 610dziedziczenie, 607funkcje, 605generowanie typów, 604klasy, 605kompilacja kodu, 607konkretyzacja, 604, 985

liczby ca�kowite jakoparametry, 608

parametry, 603polimorfizm parametryczny,

605programowanie ogólne, 605specjalizacja, 604, 985tworzenie specjalizacji, 985typy jako parametry, 603typy sk�adowe, 985uogólnianie wektora, 610

szacowanie, 159szczegó�y techniczne, 248szkielet programu, 229szkieletowy system

telekomunikacyjny, 49sztuczna inteligencja, 724szyfr TEA, 848szyfrowanie, 847

��cis�e zasady kodowania, 854�rednik, 69, 112�rodowisko programistyczne,

70

Ttablica skrótów, 689tablica symboli, 240tablice, 563, 577, 587, 784, 825,

904, 967dost�p do elementów, 578dostosowywanie do

biblioteki STL, 658elementy, 577, 967inicjowanie, 582numeracja elementów, 577,

967problemy ze wska nikami,

583wska niki, 580wska niki na elementy, 578zakres, 967

tablice asocjacyjne, 681, 750tablice mieszaj�ce, 660, 690tablice skrótów, 681, 750tablice wbudowane, 784tablice wielowymiarowe, 784

styl j�zyka C, 785

Kup książkę Poleć książkę

Page 81: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1089

tan(), 802, 1029tanh(), 802, 1030TB, 51TEA, 719, 847Technical Report, 658, 691technika RAII, 622technika wielokrotnego

wykorzystania, 712techniki obliczeniowe, 780techniki programowania, 34techniki tworzenia obiektów,

526Technische Hogeschool

Eindhoven, 726tekst, 130, 398, 428, 746

Unicode, 747zestawy znaków, 747

tekst programu, 67telefony, 48, 810telekomunikacja, 48template, 603, 608, 983template argument, 157template instantiation, 604, 985terabajt, 51term(), 482test case, 168testowanie, 55, 168, 221, 711,

799, 865, 867algorytmy, 875bia�a skrzynka, 868czarna skrzynka, 868dane wej�ciowe, 876dane wyj�ciowe, 876debugowanie, 891dowody, 867GUI, 883jednostkowe, 868, 869, 886kategorie testów, 872klasy, 886nie-algorytmy, 875p�tle, 879powa�ne b��dy, 870prawdopodobne b��dy, 870program g�ówny, 883projektowanie pod k�tem

testowania, 890przypadki testowe, 168, 873raport o b��dzie, 869regresyjne, 868rozga��zianie, 880sekwencje losowe, 874

specjalne przypadki, 871strategia, 870systemowe, 868, 882wydajno��, 891wykrywanie przypadków

�amania wymaga�interfejsu, 889

zale�no�ci, 877zarz�dzanie zasobami, 878zasoby, 876zastrze�enie, 867znajdowanie za�o�e�, które

si� nie potwierdzaj�, 889testy prawdopodobie�stwa, 817testy systemowe, 868, 882TeX, 383Text, 389, 408, 428

draw_lines(), 429text storage, 532Text_iterator, 650THE, 726this, 555, 974throw, 151, 619, 621, 957, 986,

987time(), 1039time_t, 1038Tiny Encryption Algorithm,

847tm, 1038to_string(), 748, 749Token_stream, 207tokenize, 182tokeny, 182

implementacja, 183stosowanie, 185wczytywanie, 209

tolower(), 369, 1024toupper(), 369, 1024transform(), 1009transformata

Burrowsa-Wheelera, 719transient bug, 535transmisja sygna�ów, 53transmutacja, 922Transparency, 416transport, 47tre�� funkcji, 66, 123Troff, 383try, 151, 234, 962tryby otwierania plików, 361,

1032

tryby strumieni, 1020try-catch, 987turbiny wiatrowe, 810Turbo Pascal, 728tworzenie

klasy, 291menu, 513obiekty, 961, 976podklasy, 461program, 55, 1044projekt, 1044

type generator, 604typedef, 646, 656, 904, 918typeid, 954typy argumentów, 304typy danych, 78, 80, 81, 92

bool, 80char, 80, 93double, 80, 93enum, 300int, 78, 80, 92klasy, 972kontrola typów, 94konwersje, 111konwersje bezpieczne

dla typów, 95konwersje niebezpieczne

dla typów, 96rzutowanie, 546string, 80, 93tablice, 967unie, 983valarray, 1031void*, 546wbudowane, 965wska niki, 965wyliczenia, 972zmiennoprzecinkowe, 965

typy parametryzowane, 605typy sk�adowe szablonów, 985typy strumieniowe, 1019typy wbudowane, 288typy zdefiniowane przez

u�ytkownika, 183, 288, 971

Uuczenie si�, 29UDT, 288uk�ad kodu, 163, 230, 855

Kup książkę Poleć książkę

Page 82: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1090 SKOROWIDZ

uk�ad obiektu, 459uk�ad równa� liniowych, 796ukrywanie danych, 716ukrywanie szczegó�ów, 294umiej�tno�ci programistyczne,

44undefined, 945unget(), 331ungetc(), 1036Unicode, 354, 747unie, 983uninitialized_copy(), 1011uninitialized_fill(), 1011union, 971unique(), 1009, 1010unique_copy(), 668, 693, 695,

1010unit testing, 868University of California, 728University of Cambridge

Computer Laboratory, 718University of Texas, 726Unix, 733unordered_map, 660, 681, 689,

690, 738, 1001unordered_multimap, 660, 681,

1001unordered_multiset, 660, 681,

1002unordered_set, 660, 681, 1002unsetf(), 357unsigned, 837, 965unsigned int, 839unsorted_map, 690unspecified, 945uogólnianie kodu, 631uogólnianie wektora, 610, 645uogólnienie, 464upper, 769, 1027upper_bound(), 699, 1007,

1012uppercase, 1022uruchamianie programu, 945,

1044, 1046urz�dzenia, 104

kuchenne, 810PDA, 810steruj�ce wirówkami, 810

user-defined type, 183, 288using, 280, 988

deklaracja, 280dyrektywa, 280, 281, 988

usuwanie, 653obiekty, 953, 976, 977powtarzaj�ce si� s�owa, 87

usuwanie b��dów, 71, 161usuwanie nieu�ytków, 539

usuwanie z konsolidacj�pami�ci, 821

utrzymanie, 54utrzymywanie porz�dku, 696

Vvalarray, 662, 1002, 1031valid, 944value semantics, 570value_comp(), 1007value_type, 646, 659, 661, 1003vector, 30, 126, 127, 132, 288,

526, 527, 543, 564, 593, 601,653, 660, 784, 822, 904, 1001

capacity(), 598dost�p do elementów, 544elementy, 528kopiowanie, 564operator(), 576operator[], 575push_back(), 127, 528, 599reserve(), 598resize(), 596rozmiar, 528size(), 130

Vector, 616Vector_ref, 409, 427, 1055virtual, 451, 456, 980, 981virtual function table, 459virtual pointer, 459virtual table, 459Visual Studio, 1044

Add New Item, 1045Application Settings, 1045budowanie programu

wykonywalnego, 1046Build Solution, 1046Debug, 1046dodawanie pliku

ród�owego C++do projektu, 1045

FLTK, 1049instalacja, 1044kreator aplikacji Win32,

1045

New, 1044Start Without Debugging,

1046std_lib_facilities.h, 1045tworzenie programu, 1044tworzenie projektu, 1044uruchamianie programu,

1044, 1046Win32 Console Application,

1045wprowadzanie kodu

ród�owego, 1045zapisywanie programu, 1046

void, 262void*, 546, 965vptr, 459vtbl, 459, 460

Ww, 1027wait(), 504, 512wait_for_button(), 386, 390,

393, 499warstwa oprogramowania, 382warstwowa technika budowy

aplikacji, 755warstwy, 755warto�ci, 80, 92warto�ci brzegowe, 153warto�ciowanie wyra�e�, 277warto�� mieszaj�ca, 689warto�� obiektu, 295warto�� przybli�ona funkcji

wyk�adniczej, 481warto�� skrótu, 689warto�� zwrotna funkcji, 261warunki ko�cowe, 167warunki wst�pne, 165, 167wczytywanie

dane, 333liczby, 128, 210pliki strukturalne, 341pojedyncze warto�ci, 333tokeny, 209

wej�cie, 66, 218, 322, 925, 1019,1021

przyjmowanie na liczbca�kowitych, 356

wej�cie macierzy, 794wej�cie-wyj�cie, 105

Kup książkę Poleć książkę

Page 83: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1091

wektor, 126, 153, 427, 526, 594,653, 784

destruktory, 540dost�p do elementów, 526,

544, 575dostosowanie do biblioteki

STL, 656get(), 544konstruktor kopiuj�cy, 566kopiowanie, 565liczba elementów, 595operacje, 570pami��, 526powi�kszanie, 127, 526problem sta�ych wektorów,

576push_back(), 127, 526rozmiar, 526set(), 544size(), 526technika RAII, 622techniki tworzenia

obiektów, 526tworzenie, 127typ elementów, 127uogólnianie, 610, 645vector, 127, 527wyciek pami�ci, 540zmiana rozmiaru, 595, 596zmienno��, 594

wersja „1.0”, 224w�ze�, 685WG21, 759Wheeler David, 718, 847while, 88, 119, 234, 962white-box testing, 868wiadomo�ci e-mail, 751wi�zanie, 446Widget, 502, 505, 1053widgety, 1056

In_box, 507menu, 507Out_box, 507przyciski, 506

wielko�� liter, 91wielok�ty, 385, 394, 420wielokropek, 970wielokrotne dziedziczenie, 979wielokrotne wykorzystanie, 712wiersze, 649Wilkes Maurice, 718

Win32 Console Application,1045

Window, 389, 409, 425, 444,1054

put_on_top(), 425windy, 810Wirth Niklaus, 727wirtualny destruktor, 543Witaj, �wiecie, 64wizualizacja danych, 472w�a�ciwo�ci j�zyka, 132Word, 383wprowadzanie

dane wierszami, 367kod ród�owy, 1045nazwy, 240

write(), 364ws, 1023wska nik wirtualny, 459wska nik zerowy, 584wska niki, 459, 528, 529, 588,

825, 904, 949, 965arytmetyka, 579auto_ptr, 621, 622C, 923dereferencja, 966dost�p poprzez do

obiektów, 534dost�p poprzez usuni�ty

wska nik, 585dziedziczenie, 550elementy tablicy, 578indeksowanie, 966inicjowanie, 584na funkcje, 911na obiekty, 545operacje, 966parametry, 549problemy, 583referencje, 548tablice, 580this, 555, 974zakres, 535zerowy wska nik, 537zmienne lokalne, 585

wspó�bie�no��, 815wspó�bie�ny program, 815wspó�rz�dne, 388, 410wstawianie, 653, 1016wycieki pami�ci, 538, 539, 540wyczerpanie pami�ci, 560

wydajno��, 614, 615, 709, 891kontrola czasu, 893

wyj�tki, 151, 613, 617, 903, 986biblioteka standardowa

C++, 996b��dy zakresu, 152b��dy zaw��ania zakresu,

156catch, 151, 156nieprawid�owe argumenty,

151nieprawid�owe dane

wej�ciowe, 154obs�uga, 151out_of_range, 153, 154przechwytywanie, 151rozwijanie stosu, 987runtime_error, 154, 155throw, 151, 987try, 151zasoby, 617zg�aszanie, 151, 617, 986

wyj�cie, 66, 218, 322, 924, 1019,1022

wysy�anie liczbzmiennoprzecinkowych,357

wyj�cie macierzy, 794wyj�cie ze le dzia�aj�cego

kodu, 817wykluczaj�ce lub, 836wyk�adnik, 782wykonywanie oblicze�, 104,

105, 634wykorzystanie obiektów bez

nazw, 426wykres funkcji, 394wykresy, 472, 486wykrywacz wycieków, 574wykrywanie przypadków

�amania wymaga� interfejsu,889

wyliczenia, 300, 972definicja, 300tre��, 300zastosowanie, 301

wy�uskanie, 530wymiar, 785, 787wynik dzia�ania funkcji, 123wyniki, 105wype�nianie kolorem, 397

Kup książkę Poleć książkę

Page 84: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1092 SKOROWIDZ

wypróbowywanie drugiejwersji, 205

wypróbowywanie pierwszejwersji, 201

wyra�anie my�li, 711wyra�anie oblicze�, 105wyra�enia, 107, 195, 196, 857,

953jednoargumentowe, 954logiczne, 960przecinek, 957przyrostkowe, 954

wyra�enia regularne, 758, 759,764

alnum, 768alternatywa, 767bad_expression, 769b��dy, 769dopasowywanie, 770, 771,

1025grupowanie, 760, 767klasy znaków, 768, 769,

1027matches.size(), 762notacje, 764poddopasowanie, 762powtórzenia, 766, 1027przedzia�y znaków, 768regex, 762regex_match(), 771, 1026regex_replace(), 1026regex_search(), 762, 770,

1026rodzaje znaków, 765sk�adnia, 764skróty klas znaków, 1027smatch, 762symbol wieloznaczny, 1026wyszukiwanie, 761, 770wzorce, 759zbiory znaków, 768znaki, 764znaki specjalne, 764, 1026

wyra�enia sta�e, 108, 960wyra�enie warunkowe, 258wysy�anie na wyj�cie liczb

ca�kowitych, 355wysy�anie na wyj�cie liczb

zmiennoprzecinkowych, 357

wyszukiwanie, 653, 669, 671, 689,690, 697, 1012

binarne, 698, 866wzorce, 761

wyszukiwanie b��dów, 867wy�wietlanie obiektów na

ekranie, 386wywo�anie C z poziomu C++,

909wywo�anie C++ z poziomu C,

909wywo�anie funkcji, 261, 272,

674, 968funkcje przeci��one, 969funkcje sk�adowe, 128funkcje wirtualne, 459

wywo�anie zwrotne, 497, 1052

Xxdigit, 769, 1027Xerox Palo Alto Research, 708XML, 383xor, 956xscale, 490

Yyscale, 490

Zzach�ta, 78zach�anno�� na funkcje, 199Zachowaj prostot�, g�upku, 714zagnie�d�one bloki, 260zajmowanie pami�ci, 617zajmowanie zasobów jest

inicjacj�, 619, 620zakres, 256, 950, 951

globalny, 257, 258, 951instrukcje, 257, 951klasy, 257, 951lokalny, 257, 951przestrze� nazw, 257, 951

zalecenia, 854zale�no�ci, 877zamiana dopasowanych ci�gów,

1026zamiana gramatyki w kod, 194

zamykaniepliki, 327, 927, 1032program, 945

zapisywaniedane w pliku, 326, 328sekwencje znaków, 757

zapobieganie wyciekompami�ci, 539

zapobieganie wyciekomzasobów, 817

zaprzyja nianie, 463zarezerwowane identyfikatory,

950zarz�dca zasobów, 617zarz�dzanie, 47zarz�dzanie pami�ci�, 818

alokacja, 819alternatywy dla ogólnej

pami�ci wolnej, 822dealokacja, 819fragmentacja, 819, 820konsolidacja pami�ci, 821problemy z pami�ci� woln�,

819przewidywalno��, 819pula, 822, 823stos, 822, 824usuwanie nieu�ytków z

konsolidacj� pami�ci, 821zarz�dzanie zasobami, 541, 617,

878zasada RAII, 586zasady dobrego stylu

kodowania, 852zasady kolejno�ci wykonywania

dzia�a�, 108zasoby, 538, 541, 542, 617, 818,

876fizyczne, 825wyj�tki, 617

zast�powanie przez makro, 989zaw��aj�ce konwersje, 96, 98zaw��anie zakresu, 156zbiory, 691

zastosowanie, 692zbiór bitów, 838zbiór linii, 412zdefiniowany w implementacji,

944zestaw wymaga�, 177zestawy znaków, 747

Kup książkę Poleć książkę

Page 85: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

SKOROWIDZ 1093

zg�aszanie wyj�tków, 151, 617,986

zgodno��, 614zgodny, 944zintegrowane �rodowisko

programistyczne, 34, 70ZIP, 1048zliczanie powtarzaj�cych si�

s�ów, 89z�o�one operatory przypisania,

89zmiana rozmiaru, 595, 596, 599

dodawanie przestrzeni dlanowych elementów, 598

ilo�� dost�pnej wolnejprzestrzeni, 598

przypisywanie, 600push_back(), 599reprezentacja, 597rezerwacja dodatkowych

miejsc, 598

zmiana stylu programowania,852

zmiana wielko�ci znaków, 369zmienna iteracyjna, 119zmienna kontrolna, 119zmienne, 78, 80, 92, 236

alokacja w pami�ci, 531definicja, 79, 80deklaracja, 252domy�lna inicjacja, 254globalne, 277kontrola typów, 94nazwy, 90przypisanie warto�ci, 86typ danych, 80warto�� pocz�tkowa, 80

znacznik struktury, 912znajdowanie elementu

o najwi�kszej warto�ci, 639znak ko�cz�cy, 341

znaki, 368, 948, 1024ASCII, 354nieterminalne, 194nowy wiersz, 79specjalne, 949terminalne, 194

zrównowa�one drzewouporz�dkowane, 660

zwalnianie pami�ci, 618, 918zwracanie pami�ci do obszaru

wolnego, 538zwracanie warto�ci z funkcji,

263

� le dzia�aj�ce interfejsy, 826 ród�a b��dów, 141 ród�o danych, 322

Kup książkę Poleć książkę

Page 86: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli

1094 SKOROWIDZ

Kup książkę Poleć książkę

Page 88: Tytuł oryginału: Programming: Principles and Practice Using ...kaczus.zrzeda.pl/files/Programowanie_Teoria_i_praktyka_z...3 Spis treci Wstp 19 Sowo do studentów 21 Sowo do nauczycieli