Podstawy programowania w języku C++

Transkrypt

Podstawy programowania w języku C++
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++
Rozdział 2. Proste obliczenia
2.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 3. Instrukcja warunkowa if
3.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
3.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 4. Instrukcje iteracyjne
4.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
4.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 5. Instrukcja iteracyjna for
5.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
5.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 6. Instrukcja wyboru switch
6.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
6.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 7. Funkcje
7.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
7.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
17
17
24
25
25
27
32
33
33
34
38
39
39
41
46
47
47
50
52
53
53
56
60
4
Spis treści
Rozdział 8. Tablice
8.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
8.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 9. Funkcje i tablice
9.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
9.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 10. Wskaźniki
10.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
10.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 11. Referencja, tablice znakowe
11.1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . .
11.2. Przykładowe programy . . . . . . . . . . . . . . . . . . . . . . .
11.3. Ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rozdział 12. Operacje wejścia i wyjścia
61
61
62
64
65
65
66
68
69
69
76
78
79
79
87
94
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
16.1.
16.2.
16.3.
16.4.
16.5.
16.6.
16.7.
Algorytm zachłanny . . .
Algorytm z powrotami . .
Algorytm dynamiczny . .
Kwiaciarnia . . . . . . . .
Sortowanie przez zliczanie
Sortowanie pozycyjne . .
Unikalna liczba . . . . . .
139
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
139
141
145
150
154
156
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
Tablica 1.1. Sekwencje ucieczki
Nazwa sekwencji
nowy wiersz
tabulacja pozioma
tabulacja pionowa
cofnięcie o jeden znak
powrót karetki
nowa strona
dzwonek
lewy ukośnik
znak zapytania
apostrof
cudzysłów
zero całkowite
liczba ósemkowa
liczba szesnastkowa
Nazwa angielska
new line
horizontal tab
vertical tab
backspace
carriage return
form feed
alert
backslash
question mark
single quote
double quote
integer 0
octal number
hex number
Symbol
NL(LF)
HT
VT
BS
CR
FF
BEL
\
?
’
"
NUL
ooo
hhh
Sekwencja
\n
\t
\v
\b
\r
\f
\a
\\
\?
\’
\"
\0
\ooo
\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 2b − 1, gdzie
b jest liczbą bitów przeznaczonych do reprezentacji liczby. Przy dwubajtowej
reprezentacji maksymalna liczba całkowita to 216 −1, czyli 65 535, przy reprezentacji czterobajtowej to 232 − 1, czyli 4 294 967 295, przy ośmiobajtowej
reprezentacji maksymalna liczba całkowita to 264 − 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 −2b−1 do 2b−1 − 1,
gdzie b jest liczbą bitów przeznaczoną do reprezentacji liczby. Przy reprezentacji dwubajtowej jest to zakres od −215 (-32768) do 215 − 1 (32767), przy
reprezentacji czterobajtowej od −231 (-2147483648) do 231 −1 (2147483647).
Natomiast przy reprezentacji ośmiobajtowej od −263 (-9223372036854775808)
do 263 − 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
znak
cecha
52 bity
s c10 c9 · · · c1 c0 m51 m50 · · · m1 m0
mantysa
Wartość liczby w jest określona następująco:

(−1)s 2(c−1023) (1.m),




s −1022 (0.m),

 (−1) 2
gdy
gdy
w =
(−1)s 0,
gdy


s INF (przekroczenie zakresu),

(−1)
gdy



(−1)s NAN (postać nienumeryczna), gdy
0 < c < 2047,
c = 0 i m = 0,
c = 0 i m = 0,
c = 2047 i m = 0,
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 ∗ 21023−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 ∗ 21021−1023 ∗ (1, 0) = 2−2 =
1
= 0, 25
4
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,
5
co po odkodowaniu daje m = 32
= 0, 15625, stąd
w = (−1)1 ∗ 21025−1023 ∗ (1, 15625) = −22 ∗ 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.
2
= 15 na ułamek w systemie
Po zamianie ułamka z systemu dziesiętnego 10
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 ∗ 2970−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
znak
cecha
23 bity
s c7 c6 · · · c1 c0 m22 m21 · · · m1 m0
mantysa
Wartość liczby w jest tu określona następująco:

(−1)s 2(c−127) (1.m),




s −126 (0.m),

 (−1) 2
gdy
gdy
w =
(−1)s 0,
gdy


s

(−1) INF (przekroczenie zakresu),
gdy



(−1)s NAN (postać nienumeryczna), gdy
0 < c < 255,
c = 0 i m = 0,
c = 0 i m = 0,
c = 255 i m = 0,
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 ∗ 2129−127 ∗ 1, 75, w = 22 ∗ 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
znak
cecha
s c14 c13 · · · c1 c0
1 bit
i
bit specjalny
63 bity
m62 m61 · · · m1 m0
mantysa
Wartość liczby w jest tu określona następująco:


(−1)s 2(c−16383) (i.m),



s
gdy 0 < c < 32767,
(−1) 0,
gdy c = 0 i m = 0,
w =
 (−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 ∗ 216380−1383 ∗ 1, 25, w = −2−3 ∗ 1, 25,
w = − 18 ∗ 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++
Tablica 1.2. Priorytety i łączność operatorów
Poziom Operator Łączność
17
::
L
::
P
()
L
16
.
L
->
L
[]
L
()
L
()
L
sizeof
L
15
!
P
~
P
+
P
P
++
P
++
P
-P
-P
&
P
*
P
new
P
new[]
P
delete
P
delete[] P
()
P
14
.*
L
->*
L
13
*
L
/
L
%
L
12
+
L
L
11
<<
L
>>
L
10
<
L
<=
L
>
L
>=
L
Działanie
zasięg globalny
zasięg klasy
grupowanie
bezpośredni dostęp do składowej obiektu
pośredni dostęp do składowej obiektu
indeks tablicy
wywołanie funkcji
konstrukcja obiektu
rozmiar obiektu lub typu
negacja logiczna
negacja bitowa
unarny plus
unarny minus (liczba przeciwna)
inkrementacja przedrostkowa
inkrementacja przyrostkowa
dekrementacja przedrostkowa
dekrementacja przyrostkowa
adres argumentu (referencja)
wyłuskanie (wartość pośrednia)
dynamiczna alokacja obiektu w pamięci
dynamiczna alokacja tablicy w pamięci
dynamiczne zwalnianie pamięci dla obiektu
dynamiczne zwalnianie pamięci dla tablicy
konwersja typu (rzutowanie)
wyłuskanie wartości składowej
pośrednie wyłuskanie wartości składowej
mnożenie
dzielenie
modulo (reszta z dzielenia całkowitego)
dodawanie
odejmowanie
bitowe przesuwanie w lewo
bitowe przesuwanie w prawo
mniejsze niż
mniejsze lub równe
wieksze niż
większe lub równe
15
16
Rozdział 1. Elementy języka C++
Tablica 1.2. Priorytety i łączność operatorów (cd.)
Poziom Operator Łączność
9
==
L
!=
L
8
&
L
7
^
L
6
|
L
5
&&
L
4
||
L
3
? :
L
2
=
P
*=
P
/=
P
%=
P
+=
P
-=
P
<<=
P
>>=
P
&=
P
^=
P
|=
P
1
,
L
Działanie
równe
nierówne
koniunkcja bitowa
bitowa różnica symetryczna
alternatywa bitowa
koniunkcja logiczna
alternatywa logiczna
wyrażenie warunkowe
przypisanie
mnożenie i przypisanie
dzielenie i przypisanie
reszta z dzielenia i przypisanie
dodawanie i przypisanie
odejmowanie i przypisanie
przesunięcie w lewo i przypisanie
przesunięcie w prawo i przypisanie
koniunkcja bitowa i przypisanie
bitowa różnica symetryczna i przypisanie
alternatywa bitowa i przypisanie
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.