Podstawy programowania w języku Józef Zieliński
o ri t ze ie i ki Recenzent: dr inż. Robert Dąbrowski Korekta: Joanna Kosturek raco anie t o ra iczne: Józef Zieliński Projekt okładki: Andrzej Augustyński ic na da nicza Krak rniejo a te a : i o ic na co e ai : i i o ic na co danie Krak
Spis treści Rozdział 1. Elementy języka C++ 7 Rozdział 2. Proste obliczenia 17 2.1.Wprowadzenie... 17 2.2.Ćwiczenia... 24 Rozdział 3. Instrukcja warunkowa if 25 3.1.Wprowadzenie... 25 3.2.Przykładoweprogramy... 27 3.3.Ćwiczenia... 32 Rozdział 4. Instrukcje iteracyjne 33 4.1.Wprowadzenie... 33 4.2.Przykładoweprogramy... 34 4.3.Ćwiczenia... 38 Rozdział 5. Instrukcja iteracyjna for 39 5.1.Wprowadzenie... 39 5.2.Przykładoweprogramy... 41 5.3.Ćwiczenia... 46 Rozdział 6. Instrukcja wyboru switch 47 6.1.Wprowadzenie... 47 6.2.Przykładoweprogramy... 50 6.3.Ćwiczenia... 52 Rozdział 7. Funkcje 53 7.1.Wprowadzenie... 53 7.2.Przykładoweprogramy... 56 7.3.Ćwiczenia... 60
4 Spis treści Rozdział 8. Tablice 61 8.1.Wprowadzenie... 61 8.2.Przykładoweprogramy... 62 8.3.Ćwiczenia... 64 Rozdział 9. Funkcje i tablice 65 9.1.Wprowadzenie... 65 9.2.Przykładoweprogramy... 66 9.3.Ćwiczenia... 68 Rozdział 10. Wskaźniki 69 10.1.Wprowadzenie... 69 10.2.Przykładoweprogramy... 76 10.3.Ćwiczenia... 78 Rozdział 11. Referencja, tablice znakowe 79 11.1.Wprowadzenie... 79 11.2.Przykładoweprogramy... 87 11.3.Ćwiczenia... 94 Rozdział 12. Operacje wejścia i wyjścia 95 12.1.Wprowadzenie... 95 12.2. Przykładowe programy....................... 106 12.3.Ćwiczenia... 111 Rozdział 13. Struktury 113 13.1.Wprowadzenie... 113 13.2. Przykładowe programy....................... 118 13.3.Ćwiczenia... 128 Rozdział 14. Unie 129 14.1.Wprowadzenie... 129 14.2. Przykładowe programy....................... 131 Rozdział 15. Tablice dwuwymiarowe 135 15.1.Wprowadzenie... 135 15.2. Przykładowe programy....................... 136 15.3.Ćwiczenia... 137
Spis treści 5 Rozdział 16. Zadania algorytmiczne 139 16.1.Algorytmzachłanny... 139 16.2. Algorytm z powrotami....................... 141 16.3. Algorytm dynamiczny....................... 145 16.4.Kwiaciarnia... 150 16.5. Sortowanie przez zliczanie..................... 154 16.6.Sortowaniepozycyjne... 156 16.7.Unikalnaliczba... 159 Rozwiązania zadań 161 Bibliografia 191
Rozdział 1 Elementy języka C++ Translacja programu napisanego w języku wysokiego poziomu (do którego należy też język C++) polega na utworzeniu kodu wynikowego na podstawie kodu źródłowego. Translacja składa się z etapu kompilacji kodu źródłowego oraz etapu konsolidacji, czyli łączenia. Kompilacja polega na tłumaczeniu kodu źródłowego programu na wewnętrzny język język maszynowy i utworzeniu tzw. kodu obiektowego: analizy syntaktycznej (składniowej) polegającej na grupowaniu symboli leksykalnych w wyrażenia gramatyczne, analizy semantycznej polegającej na kontroli poprawności programu źródłowego i zbieraniu informacji do fazy tworzenia kodu wynikowego. Konsolidacja polega na łączeniu kodu obiektowego z dodatkowym kodem startowym, kodem z bibliotek i utworzeniu pliku końcowego z kodem wykonywalnym. W języku C++ wyróżnia się cztery podstawowe rodzaje jednostek leksykalnych (leksemów)[5]: 1. Identyfikatory, czyli nazwy zmiennych (np. x, x1, alfa), nazwy typów (np. int, double), nazwy funkcji (np. main, NWD, silnia), nazwy klas (np. complex, iostream), nazwy obiektów (np. cin, cout). Identyfikatory w języku C++ składają się tylko z sekwencji liter alfabetu angielskiego, cyfr i znaku podkreślenia _. Identyfikator nie może się rozpoczynać od cyfry. Identyfikatory rozpoczynające się znakiem podkreślenia są często rezerwowane dla bibliotek. Rozróżnia się małe i wielkie litery! 2. Słowa kluczowe zastrzeżone identyfikatory, których można używać tylko w ściśle określonym znaczeniu, np. float, long, if itd.
8 Rozdział 1. Elementy języka C++ 3. Operatory: jednoznakowe, np. +, -; dwuznakowe, np. >>, ==, +=; trójznakowe, np. >>=, <<=; operatory dodatkowo pełnią rolę znaków przestankowych. 4. Literały (stałe): całkowite: dziesiętne, np. 13; ósemkowe, np. 015 (rozpoczynają się od 0, zawierają cyfry 0 7); szesnastkowe, np. 0xF, 0Xf (rozpoczynają się od 0x lub 0X i zawierają cyfry oraz litery z przedziałów a f, A F); zmiennopozycyjne: w notacji dziesiętnej z kropką, np. 6.0, 2.,.5, -17.05; w notacji wykładniczej, np. 2.7e10, -75E-20, 10e10; znakowe składają się z jednego lub kilku znaków ujętych w apostrofy, np. x, A, \n ; stałe znakowe mogą zawierać sekwencje specjalne rozpoczynające się od lewego ukośnika \, oznaczające niektóre znaki niegraficzne lub znaki specjalne np. ", \,?, ; dowolne, pojedyncze znaki mogą też być podane za pomocą liczby kodowej tego znaku, przedstawionej w systemie ósemkowym lub szesnastkowym; w tablicy 1.1 na stronie 9 umieszczono sekwencje specjalne, nazywane również sekwencjami ucieczki; łańcuchowe będące ciągiem znaków ujętym w cudzysłów, np. "abcd", "Pole = ", "koniec\n", "c:\\folder\\plik"; separatory np. spacje, tabulacje, znaki nowego wiersza, oraz komentarze, gdzie znaki // oznaczają komentarz do końca wiersza, znaki /* oznaczają początek komentarza, natomiast znaki */ oznaczają koniec komentarza. Wszystkie zmienne występujące w programie muszą być przed wystąpieniem (zastosowaniem) zdefiniowane, co powoduje przydzielenie im miejsca w pamięci. Każda zmienna musi mieć określony typ, który określa zbiór wartości tej zmiennej, sposób kodowania wartości tej zmiennej, ilość bajtów zajmowanej pamięci oraz zbiór możliwych do wykonania operacji na tej zmiennej. W języku C++ wyróżnia się typy zmiennych podstawowe (wbudowane) oraz pochodne (definiowane przez programistę). W obliczeniach stosowane są typy arytmetyczne, w których wyróżnia się typy całkowite i zmiennopozycyjne. W grupie typów całkowitych, ze wzgledu na rozmiar, wyróżnia się cztery typy deklarowane jako short int, int, long int, long long int. Kody
Rozdział 1. Elementy języka C++ 9 Nazwa sekwencji Tablica 1.1. Sekwencje ucieczki Nazwa angielska Symbol Sekwencja nowy wiersz new line NL(LF) \n tabulacja pozioma horizontal tab HT \t tabulacja pionowa vertical tab VT \v cofnięcie o jeden znak backspace BS \b powrót karetki carriage return CR \r nowa strona form feed FF \f dzwonek alert BEL \a lewy ukośnik backslash \ \\ znak zapytania question mark? \? apostrof single quote \ cudzysłów double quote " \" zero całkowite integer 0 NUL \0 liczba ósemkowa octal number ooo \ooo liczba szesnastkowa hex number hhh \xhhh Źródło: W. Porębski, Programowanie w języku C++, Warszawa: Komputerowa Oficyna Wydawnicza Help, 1995. liczb typów dłuższych zajmują nie mniej pamięci niż krótszych. Najczęściej zmienne typu short int zajmują dwa bajty, typ int dwa lub cztery bajty, zależnie od kompilatora, typ long int cztery bajty, a typ long long int osiem bajtów. Liczby całkowite bez znaku (dodatnie) są kodowane w naturalnym kodzie dwójkowym. Nazwa typu całkowitego bez znaku poprzedzana jest specyfikatorem unsigned. Stąd nazwy typów: unsigned short int lub krócej: unsigned short; unsigned int lub krócej: unsigned; unsigned long int lub krócej: unsigned long; unsigned long long int lub krócej: unsigned long long. Liczby całkowite bez znaku kodowane są w zakresie od 0 do 2 b 1, gdzie b jest liczbą bitów przeznaczonych do reprezentacji liczby. Przy dwubajtowej reprezentacji maksymalna liczba całkowita to 2 16 1, czyli 65 535, przy reprezentacji czterobajtowej to 2 32 1, czyli 4 294 967 295, przy ośmiobajtowej reprezentacji maksymalna liczba całkowita to 2 64 1.
10 Rozdział 1. Elementy języka C++ Przykładowo liczba 40000, przy zastosowaniu 2-bajtowego (16-bitowego) typu unsigned short int jest kodowana jako 10011100 01000000, natomiast przy zastosowaniu typu 4-bajtowego (32-bitowego) unsigned long int jest kodowana jako 00000000 00000000 10011100 01000000. Gdy występują liczby całkowite ujemne, stosowane są typy całkowite ze znakiem. Liczby ujemne w typie całkowitym ze znakiem są kodowane w kodzie dwójkowym uzupełnieniowym do dwóch. Najstarszy bit ma wartość 0, gdy liczba jest dodatnia, 1 gdy liczba jest ujemna. Nazwa typu całkowitego ze znakiem może być poprzedzona specyfikatorem signed. Zazwyczaj specyfikator ten jest pomijany, gdyż typ całkowity ze znakiem jest domyślnym typem całkowitym. Stąd nazwy tych typów: signed short int lub krócej short, signed int lub krócej int, signed long int lub krócej long, signed long long int lub krócej long long. Liczby całkowite ze znakiem są kodowane w zakresie od 2 b 1 do 2 b 1 1, gdzie b jest liczbą bitów przeznaczoną do reprezentacji liczby. Przy reprezentacji dwubajtowej jest to zakres od 2 15 (-32768) do 2 15 1 (32767), przy reprezentacji czterobajtowej od 2 31 (-2147483648) do 2 31 1 (2147483647). Natomiast przy reprezentacji ośmiobajtowej od 2 63 (-9223372036854775808) do 2 63 1 (9223372036854775807). Przykładowo liczba -1 jest kodowana przy zastosowaniu typu 2-bajtowego (16-bitowego), signed short int jako 11111111 11111111, natomiast przy zastosowaniu typu 4-bajtowego (32-bitowego), signed long int, jest kodowana jako 11111111 11111111 111111111 11111111. Typy zmiennopozycyjne służą do reprezentacji liczb rzeczywistych wymiernych. Ich kod składa się z trzech części: bitu znaku, cechy i mantysy, kodowanych dwójkowo. Oto identyfikatory typów zmiennopozycyjnych: float, 4-bajtowy, double, 8-bajtowy, long double, 10-bajtowy. Najczęściej używany typ zmiennopozycyjny to 8-bajtowy, 64-bitowy typ double, znaczenie poszczególnych bitów zmiennej tego typu przedstawiono poniżej.
Rozdział 1. Elementy języka C++ 11 8 bajtów { }} { 1 bit 11 bitów 52 bity {}}{ { }} { { }} { }{{} s c 10 c 9 c 1 c } {{ 0 m } 51 m 50 m 1 m } {{ 0 } znak cecha mantysa Wartość liczby w jest określona następująco: w = ( 1) s 2 (c 1023) (1.m), gdy 0 <c<2047, ( 1) s 2 1022 (0.m), gdy c =0im 0, ( 1) s 0, gdy c =0im =0, ( 1) s INF (przekroczenie zakresu), gdy c = 2047 i m =0, ( 1) s NAN (postać nienumeryczna), gdy c = 2047 i m 0 Obliczenia zmiennopozycyjne wykonywane są za pomocą koprocesora arytmetycznego, IN F oznacza stan koprocesora nieskończoność, a N AN postać zmiennej niearytmetyczna. Przykładowo liczba 0 jest zakodowana w następujący sposób (typ double): 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000, gdzie bit znaku s = 0, c = 0, m = 0, zatem w = 0. Kod binarny liczby całkowitej 1, ale typu double ma postać: 00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000. W tym przykładzie znak ma kod 0 (liczba dodatnia), 0111111 1111 to kod cechy, czyli c = 1023, natomiast wartość mantysy to 0, stąd w =( 1) 0 2 1023 1023 (1, 0) = 1 Kod liczby 0.25 (typ double) jest następujący: 00111111 11010000 00000000 00000000 00000000 00000000 00000000 00000000, gdzie kod znaku 0, więc liczba dodatnia, cecha ma kod 0111111 1101, czyli c = 1021, wartość mantysy 0, stąd w =( 1) 0 2 1021 1023 (1, 0) = 2 2 = 1 4 = 0, 25 Kod liczby 4, 625 (typ double) 11000000 00010010 10000000 00000000 00000000 00000000 00000000 00000000 zawiera pierwszy bit znaku (1), oznaczający liczbę ujemną, cechę o kodzie 1000000 0001, więc c = 10025, natomiast kod mantysy to 0010 10000000 00000000 00000000 00000000 00000000 00000000, co po odkodowaniu daje m = 5 32 =0, 15625, stąd w =( 1) 1 2 1025 1023 (1, 15625) = 2 2 1, 15625 = 4, 625
12 Rozdział 1. Elementy języka C++ Kod liczby 0,2 (typ double), składający się z 64 bitów, ma postać: 00111111 11001001 10011001 10011001 10011001 10011001 10011001 10011010, pierwszy bit (0) będący bitem znaku oznacza liczbę dodatnią, cechę koduje następne 11 bitów, 0111111 1100, więc c = 10025, natomiast 52 bity mantysy to 1001 10011001 10011001 10011001 10011001 10011001 10011010. Po zamianie ułamka z systemu dziesiętnego 2 10 = 1 5 na ułamek w systemie dwójkowym powstaje ułamek okresowy o okresie (1001) 2. Mantysa zawiera ograniczoną liczbę bitów, stąd jej wartość jest zaokrąglona, z dokładnością do 52 bitów. Ostatnia uwzględniona czwórka bitów ułamka okresowego została zaokrąglona w górę do (1010) 2. Stąd ułamek 0,2 jest zakodowany w sposób przybliżony z zaokrągleniem w górę. Przy obliczeniach zachodzą zaokrąglenia w górę lub w dół, które wzajemnie się kompensują i często są mało zauważalne. W niektórych przypadkach jednak błędy tych zaokrągleń kumulują się. Przykładowo wynik działania (0.6 3 0.2), wynoszący 0, wykonany z zastosowaniem typu double daje następujący wynik niezerowy (wynik w postaci zakodowanej): 10111100 10100000 00000000 00000000 00000000 00000000 00000000 00000000. W tym przykładzie s = 1, c = 970, m = 0, stąd w =( 1) 1 2 970 1023 1, 0, w = 2 53, w = 1, 11022 16. Wskutek zaokrąglenia w górę kodu liczby 0.2 otrzymujemy wartość obliczanego wyrażenia ujemną, bardzo małą, ale jednak różną od 0. Zmienne typu float zajmują 4 bajty pamięci, gdzie kolejno są: 1 bit znaku, 8 bitów cechy, oraz 23 bity mantysy. 4 bajty { }} { 1 bit 8 bitów 23 bity {}}{ { }} { { }} { }{{} s c 7 c 6 c 1 c } {{ 0 m } 22 m 21 m 1 m } {{ 0 } znak cecha mantysa Wartość liczby w jest tu określona następująco: w = ( 1) s 2 (c 127) (1.m), gdy 0 <c<255, ( 1) s 2 126 (0.m), gdy c =0im = 0, ( 1) s 0, gdy c =0im =0, ( 1) s INF (przekroczenie zakresu), gdy c = 255 i m =0, ( 1) s NAN (postać nienumeryczna), gdy c = 255 i m = 0 Przykładowo kod zmiennej typu float o wartości 7 jest następujący: 01000000 111000000 00000000 00000000. Zatem s = 0, liczba dodatnia, kod cechy to 10000001, c = 129, kod mantysy to 1100000 00000000 00000000, czyli m =2 1 +2 2 =0, 75. Stąd w =( 1) 0 2 129 127 1, 75, w =2 2 1, 75, w = 7.
Rozdział 1. Elementy języka C++ 13 Zmienne typu long double zajmują 10 bajtów pamięci, gdzie kolejne bity to: 1 bit znaku, 15 bitów cechy, 1 specjalny bit (i) oraz 63 bity mantysy. 10 bajtów { }} { 1 bit 15 bitów 1 bit 63 bity {}}{ { }} { {}}{ { }} { }{{} s c 14 c 13 c 1 c } {{ 0 i } }{{} m 62 m 61 m 1 m } {{ 0 } znak cecha bit specjalny mantysa Wartość liczby w jest tu określona następująco: w = ( 1) s 2 (c 16383) (i.m), gdy 0 <c<32767, ( 1) s 0, gdy c =0im =0, ( 1) s INF (przekroczenie zakresu), gdy c = 32767 i m =0, ( 1) s NAN (postać nienumeryczna), gdy c = 32767 i m 0 Przykładowy kod zmiennej typu long double o wartości 0, 15625 to: 10100000 111111100 10100000 00000000 00000000 00000000 00000000 00000000 00000000 00000000. Zatem s = 1, czyli jest to liczba ujemna, kod cechy to 0100000 111111100, czyli c = 16380, bit specjalny i = 1, kod mantysy to: 0100000 00000000 00000000 00000000 00000000 00000000 00000000 00000000, czyli m =2 2 =0, 25. Stąd w =( 1) 1 2 16380 1383 1, 25, w = 2 3 1, 25, w = 1 8 1, 25, w = 0, 15625. Do typów arytmetycznych należy też typ znakowy char, który jest typem całkowitym jednobajtowym, zawierającym numer kodowy znaku w tablicy znaków. Przykładowo wartość 65 zmiennej znakowej odpowiada w tablicy kodu ASCII znakowi A. Typy pochodne są konstruowane z typów podstawowych, jak również z pochodnych. Najważniejsze typy pochodne to: tablice, wskaźniki, referencje, struktury, unie, klasy. Operatory w języku C++ można podzielić na 17 grup, charakteryzujących się poziomem priorytetu i łącznością lewostronną lub prawostronną. Operatory
14 Rozdział 1. Elementy języka C++ ze względu na liczbę operandów dzieli się na unarne (np. -, ++, *), binarne (np. -, /, %, *) oraz trynarne (? :). W tablicy 1.2 przedstawiono operatory w języku C++. Wyrażenia w kodzie źródłowym przedstawiają pewne działania i zawierają sekwencje operatorów i operandów (argumentów). Operandami mogą być stałe (literały) lub zmienne reprezentowane przez identyfikatory. Wyrażenia proste składają się najczęściej z jednego binarnego operatora i dwóch operandów, lewego i prawego. W wyrażeniu prostym może występować unarny operator, związany z jednym operandem, lewym lub prawym. Przykłady wyrażeń prostych: b=5, b+=x, b++, --b. Wyrażenia złożone zawierają kilka operatorów. Oto przykłady wyrażeń złożonych: x=(-b-p_delta)/(2*a), a=b=c=0. Operator - (minus) w zależności od liczby operandów ma dwa znaczenia. Z jednym operandem, np. -b=5, oznacza wartość przeciwną zmiennej b, natomiast z dwoma operandami, przykładowo x-y, oznacza odejmowanie. Unarny operator inkrementacji ++ może występować w dwóch wersjach, przedrostkowej, np. ++i, lub przyrostkowej, np. i++. Poziomy priorytetu zapewniają odpowiednią kolejność wykonywania operacji. Przykładowo w wyrażeniu x-y+z występują operatory addytywne z poziomu 12 o łączności lewostronnej, stąd najpierw będzie wykonane odejmowanie, później dodawanie. W wyrażeniu a+3*b najpierw będzie wykonane mnożenie (poziom 13), później dodawanie z poziomu niższego, 12. W wyrażeniu b=5*x będzie najpierw wykonane mnożenie (poziom 13), a poźniej przypisanie (podstawienie) iloczynu do zmiennej b, poziom 2. W wyrażeniu a=b=0 występuje tylko operator przypisania, z poziomu 2, o łączności prawostronnej, stąd pierwsza będzie wykonana operacja od prawej strony, czyli podstawienie za b wartości 0, a później podstawienie za a wartości zmiennej b, czyli zera. Wyrażenia zakończone średnikiem są w języku C++ instrukcjami wyrażeniowymi. Program jest strukturą składającą się z podprogramów, którymi
Rozdział 1. Elementy języka C++ 15 Tablica 1.2. Priorytety i łączność operatorów Poziom Operator Łączność Działanie 17 :: L zasięg globalny :: P zasięg klasy () L grupowanie 16. L bezpośredni dostęp do składowej obiektu -> L pośredni dostęp do składowej obiektu [] L indeks tablicy () L wywołanie funkcji () L konstrukcja obiektu sizeof L rozmiar obiektu lub typu 15! P negacja logiczna ~ P negacja bitowa + P unarny plus - P unarny minus (liczba przeciwna) ++ P inkrementacja przedrostkowa ++ P inkrementacja przyrostkowa -- P dekrementacja przedrostkowa -- P dekrementacja przyrostkowa & P adres argumentu (referencja) * P wyłuskanie (wartość pośrednia) new P dynamiczna alokacja obiektu w pamięci new[] P dynamiczna alokacja tablicy w pamięci delete P dynamiczne zwalnianie pamięci dla obiektu delete[] P dynamiczne zwalnianie pamięci dla tablicy () P konwersja typu (rzutowanie) 14.* L wyłuskanie wartości składowej ->* L pośrednie wyłuskanie wartości składowej 13 * L mnożenie / L dzielenie % L modulo (reszta z dzielenia całkowitego) 12 + L dodawanie - L odejmowanie 11 << L bitowe przesuwanie w lewo >> L bitowe przesuwanie w prawo 10 < L mniejsze niż <= L mniejsze lub równe > L wieksze niż >= L większe lub równe
16 Rozdział 1. Elementy języka C++ Tablica 1.2. Priorytety i łączność operatorów (cd.) Poziom Operator Łączność Działanie 9 == L równe!= L nierówne 8 & L koniunkcja bitowa 7 ^ L bitowa różnica symetryczna 6 L alternatywa bitowa 5 && L koniunkcja logiczna 4 L alternatywa logiczna 3? : L wyrażenie warunkowe 2 = P przypisanie *= P mnożenie i przypisanie /= P dzielenie i przypisanie %= P reszta z dzielenia i przypisanie += P dodawanie i przypisanie -= P odejmowanie i przypisanie <<= P przesunięcie w lewo i przypisanie >>= P przesunięcie w prawo i przypisanie &= P koniunkcja bitowa i przypisanie ^= P bitowa różnica symetryczna i przypisanie = P alternatywa bitowa i przypisanie 1, L połączenie kilku wyrażeń w jedno wyrażenie Źródło: W. Porębski, Programowanie w języku C++, Warszawa: Komputerowa Oficyna Wydawnicza Help, 1995. są w języku C++ funkcje. Program musi zawierać przynajmniej jedną funkcję, zwaną funkcją główną, main. Bardziej złożony program w programowaniu strukturalnym składa się z szeregu funkcji, które mogą być wzajemnie zagnieżdżone. Niekiedy funkcje mogą wywoływać same siebie, tworząc funkcje rekurencyjne. Poszczególne funkcje mogą się znajdować w jednym pliku lub w kilku plikach dołączanych do pliku wykonywalnego w procesie konsolidacji. Język C++ umożliwia realizację paradygmatu programowania obiektowego, polegającego na tworzeniu nowych typów i definiowaniu operatorów na zmiennych tak utworzonego typu [6]. Tworzenie nowych typów odbywa się za pomocą definiowania klas, co będzie wyjaśnione w kolejnej pracy. W tej pracy korzysta się głównie z gotowych obiektów klas bibliotecznych. Przykładem tych obiektów są cin i cout oraz na nich działające operatory strumieniowe <<, >>.
Bibliografia [1] Cormen Th.H., Leiserson Ch.E., Rivest R.L., Stein C., Introduction to Algorithms. Third Edition, Massachusetts: Massachusetts Institute of Technology, 2009. [2] Kernighan B.W., Ritchie D., Język ANSI C, Warszawa: Wydawnictwa Naukowo-Techniczne, 2004. [3] Kisilewicz J., Język C w środowisku Borland C++, Wrocław: Oficyna Wydawnicza Politechniki Wrocławskiej, 2003. [4] Langer A., Kreft K., C++ Biblioteka IOStreams i lokalizacja programów, Gliwice: Helion, 2005. [5] Porębski W., Programowanie w języku C++, Warszawa: Komputerowa Oficyna Wydawnicza Help, 1995. [6] Prata S., Szkoła programowania. Język C++, Wrocław: Robomatic, 2002. [7] Stroustrup B., Język C++, Warszawa: Wydawnictwa Naukowo-Techniczne, 1995. [8] Stroustrup B., Programowanie. Teoria i praktyka z wykorzystaniem C++, Gliwice: Helion, 2010. [9] Sutter H., Alexandrescu A., Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk, Gliwice: Helion, 2005. [10] Wirth N., Algorytmy + struktury danych = programy, Warszawa: Wydawnictwa Naukowo-Techniczne, 2000. [11] Zieliński J., Programowanie w języku Logo, Kraków: Impuls, 2009. [12] I XIV Olimpiada Informatyczna, Warszawa: OEIiZK, 1994 2008.