PROGRAMOWANIE I JZYK C++
DR INÅ». MAAGORZATA JANKOWSKA
POLITECHNIKA POZNACSKA
WYDZIAA BUDOWY MASZYN I ZARZDZANIA
INSTYTUT MECHANIKI STOSOWANEJ
POK. 446, TEL. +48 61 665-20-69
e-mail: malgorzata.jankowska@put.poznan.pl
www.icpnet.pl/~mjank
1
LITERATURA
JEZYK C/C++
H. M. Deitel, P. J. Deitel, Arkana C++ Programowanie, Wydawnictwo RM,
Warszawa 1998.
S. Prata, Szkoła Programowania Język C++, Wydawnictwo Helion, Gliwice 2006.
B. Stroustrup, Język C++, Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
J. Grębosz, Symfonia C++. Programowanie w języku C++ orientowane
obiektowo, Tom 1,2,3, Oficyna Kallimach, Kraków 1999.
A. Zalewski, Programowanie w językach C i C++ z wykorzystaniem pakietu
Borland C++, Wydawnictwo Nakom, Poznań 1996.
VISUAL STUDIO
P. Besta, Visual Studio 2005. Programowanie z Windows API w języku C++,
Wydawnictwo Helion, Gliwice 2008.
2
1
LITERATURA
ALGORYTMY / PROGRAMOWANIE
D. E. Knuth, Sztuka programowania. Tom1 Algorytmy podstawowe,
Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
D. E. Knuth, Sztuka programowania. Tom2 Algorytmy seminumeryczne,
Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
D. E. Knuth, Sztuka programowania. Tom3 Sortowanie i wyszukiwanie,
Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
D. E. Knuth, Sztuka programowania. Tom4 Generowanie wszystkich krotek
i permutacji, Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
N. Wirth, Algorytmy + struktury danych = programy, Wydawnictwa
Naukowo-Techniczne, Warszawa 2004.
INNE CIEKAWE POZYCJE LITERATUROWE
W. Duch, Fascynujący świat programów komputerowych,
Wydawnictwo Nakom, Poznań 1997.
3
WYKAAD 1/2
PROGRAMOWANIE W JZYKU C/C++
WPROWADZENIE
4
2
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
JZYKI PROGRAMOWANIA
Język programowania zbiór zasad określających ciąg symboli tworzących
program. Język programowania pozwala na precyzyjny
zapis zadań, które mają być wykonane przez komputer.
Podział języków programowania:
" języki maszynowe (kod maszynowy)
Dowolny komputer (ściśle mówiąc procesor komputera) bezpośrednio rozumie
jedynie swój własny język maszynowy, który zdefiniowany jest przez projekt
sprzętu tego komputera.
Każdy typ procesora ma swój własny język maszynowy. Mówi się więc, że języki
te są maszynowo zależne. Z tego właśnie powodu przenośność kodu
maszynowego jest bardzo mała.
Zapis programu w języku maszynowym wymaga użycia rozkazów danych
w postaci łańcuchów cyfr (ostatecznie sprowadzanych do 0 i 1). Instruują one
komputer w przeprowadzaniu najbardziej elementarnych działań.
Kod maszynowy może być również tworzony w procesie kompilacji (w przypadku
języków wysokiego poziomu) oraz asemblacji (w przypadku asemblera).
5
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
" języki asemblera
Języki asemblera należą do języków programowania niskiego poziomu.
Utworzone zostały na bazie języków maszynowych danego procesora. Każda
instrukcja programu napisanego w języku asemblera odpowiada jednej instrukcji
wykonywanej przez mikroprocesor.
Składnia języka asemblera zależy nie tylko od architektury procesora, ale
również od używanego asemblera (czyli programu, który tłumaczy program
napisany w języku asemblera na język maszynowy).
" języki wysokiego poziomu
Celem twórców języków wysokiego poziomu było przyśpieszenie oraz
ułatwienie procesu programowania.
Pojedyncze instrukcje programu realizują teraz konkretne zadania, a składnia
i słowa kluczowe mają maksymalnie ułatwić rozumienie kodu programu
zwiększając jednocześnie poziom abstrakcji.
Kod napisany w języku wysokiego poziomu nie jest bezpośrednio rozumiany
przez komputer. Program trzeba tłumaczyć bezpośrednio na język maszynowy za
pomocą kompilatora lub etapami najpierw na język asemblera przy pomocy
kompilatora, a następnie na język maszynowy przy pomocy asemblera.
Do języków wysokiego poziomu zaliczamy Fortran, C, C++, Pascal.
6
3
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
HISTORIA C / C++
Język C
Dlaczego powstał ... ?
Dennis Ritchie z Bell Laboratories (początek lat 70. XX wieku) pracował nad
stworzeniem systemu operacyjnego Unix.
Zadanie wymagało użycia języka programowania, który umożliwiłby szybkie
tworzenie zwartych programów pozwalających na dobrą komunikację ze sprzętem.
Do tej pory wykorzystywano do podobnych celów język asembler, który jednak będąc
językiem niskiego poziomu powiązany jest ściśle z określonym typem procesora.
Chcąc uniezależnić tworzony system od konkretnego komputera Ritchie postanowił
opracować nowy język programowania wysokiego poziomu.
Jakie ma zalety ... ?
" Język C łączy wydajność i łatwość dostępu do sprzętu komputerowego
(cecha charakterystyczna dla języków niskiego poziomu) z ogólnością
i przenośnością oprogramowania (co charakteryzuje języki wysokiego
poziomu).
7
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Zalet ciÄ…g dalszy ...
" Jest to język proceduralny, czyli taki w którym kładziemy nacisk na budowę
algorytmu potrzebnego do wykonania określonego zadania (np. danych obliczeń).
Program dzielimy na mniejsze fragmenty (procedury) wykonujÄ…ce dane zadanie.
Język C wspiera wspomniany paradygmat (model, wzorzec) programowania
poprzez dostarczenie odpowiednich mechanizmów do przekazywania
argumentów do funkcji oraz wyników z funkcji.
" Pozwala programować strukturalnie.
Programowanie strukturalne jest pewnym wzorcem programowania wymagajÄ…cym
hierarchicznego dzielenia kodu na określone bloki. Założone funkcje realizowane
są począwszy od zadań początkowych i kontynuowane w logicznej kolejności.
Do zalecanych struktur należą instrukcje warunkowe (if, if ... else), pętle
(for, while, do while). Za wyjątkiem przypadków, w których jest to konieczne,
powinno się unikać instrukcji takich jak break, continue, swich.
" Udostępnia instrukcje, które odwołują się bezpośrednio do bitowej reprezentacji
danych w jednostce centralnej (CPU) co sprawia, że programy skompilowane
w języku C działają szybciej niż programy napisane w innych językach wysokiego
poziomu.
" Programy napisane w języku C mogą być z łatwością przeniesione na inne
platformy. Konieczna jest jedynie ponowna kompilacja. 8
4
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Język C++
Dlaczego powstał ... ?
Język C++ został stworzony przez Bjarne Stroustrup a w Bell Laboratories (na
początku lat 80. XX wieku) jako rozszerzenie języka C głównie o abstrakcję
danych, programowanie obiektowe oraz programowanie ogólne.
Jak powiedział sam Stroustrup:
C++ został stworzony głownie po to, abym wraz ze swoimi przyjaciółmi nie musiał
programować w asemblerze, C i innych współczesnych językach wysokiego poziomu.
Chodziło głównie o to, aby pisanie programów stało się łatwiejsze i przyjemniejsze.
(zob. B. Stroustrup Język C++, WNT)
Nazwa języka C++ pochodzi od istniejącego w już C operatora inkrementacji ++.
W ten sposób ma się ona kojarzyć z rozszerzoną wersją języka C.
Jakie ma zalety ... ?
" Język C++ został utworzony w oparciu o język C (za nielicznymi wyjątkami C++
jest nadzbiorem języka C).
Dzięki temu programiści mają możliwość wyboru preferowanego dla danego
zadania sposobu programowania wliczając w to również wszystkie możliwości
jakie daje język C.
9
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Zalet ciÄ…g dalszy ...
" Pozwala programować modularnie.
W wyniku wzrostu rozmiarów programu w procesie programowania większy
nacisk zaczęto kłaść na organizację danych, a nie projektowanie procedur
(algorytmów), jak to miało miejsce w przypadku programowania proceduralnego.
Pojawiło się pojęcie modułu, jako zbioru powiązanych ze sobą procedur wraz
z danymi, na których procedury te działają.
W ten sposób powstał nowy paradygmat programowania (zwany także zasadą
ukrywania danych), według którego program dzielimy na moduły, w których
ukrywany odpowiednie dane.
Mechanizmem wspierającym programowanie modularne jest tzw. przestrzeń
nazw (ang. namespace).
W jej obrębie możemy grupować zarówno związane ze sobą dane jak również
pewne informacje, czyli nazwy funkcji czy typów danych, które w ten sposób
stają się lokalne dla modułu.
W ogólności możemy powiedzieć, że język C++ pozwala na umieszczenie
w przestrzeni nazw dowolnej deklaracji.
10
5
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Zalet ciÄ…g dalszy ...
" Jest to język obiektowy dostarcza mechanizmów wspierających programowa-
nie obiektowe (ang. object-oriented programming).
Inaczej niż w przypadku programowania proceduralnego, w którym staramy się
dopasować problem do metod proceduralnych, teraz próbujemy dostosować
język do problemu. Projektujemy taką postać danych, która najlepiej odpowiada-
Å‚aby realizowanemu zadaniu.
W języku obiektowym największy nacisk kładziemy na dane (a nie na algoryt-
my, jak to miało miejsce w przypadku programowania proceduralnego).
W programowaniu obiektowym tworzymy tzw. klasy, będące typami użytkownika
zawierającymi deklaracje zarówno danych (definiujących przedmiot) jak i funkcji
składowych (metod) określających właściwości przedmiotu.
Program oparty jest na zbiorze obiektów (będących egzemplarzami
zdefiniowanych klas), które komunikują się ze sobą w celu wykonania określonych
zadań.
" Pozwala na programowania uogólnione (ang. generic programming).
Jest to paradygmat programowania pozwalający na pisanie kodu algorytmów
sparametryzowanych w taki sposób, aby możliwe było ich użycie bez
wcześniejszej znajomości typów danych, na których będą działały.
11
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Standard języka C++ ...
1990 r. Amerykański Narodowy Urząd Standaryzacyjny (ANSI, ang. American
National Standards Institute) tworzy komitet ANSI X3J16 jego zadaniem
jest opracowanie standardu języka C++.
Do projektu tego Międzynarodowa Organizacja Standaryzacyjna
(ISO, ang. International Organization for Standarization) dołączyła swój
komitet ISO-WG-21.
1998 r. ISO, ANSI oraz Międzynarodowa Komisja Elektrotechniki (IEC,
ang. International Electrotechnical Commission) przyjmujÄ… ostateczny
standard międzynarodowy:
ISO/IEC 14882:1998 (Standard for the C++ Programming Language)
2003 r. publikacja drugiej (poprawionej) edycji standardu ISO/IEC 14882:2003
Obecnie trwajÄ… prace nad nowym standardem, tzw. C++ 0x.
12
6
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
MICROSOFT VISUAL STUDIO
Visual Studio zintegrowane środowisko programistyczne (IDE, ang. Integrated
Development Environment), w skład którego wchodzi:
" Microsoft Visual C++,
" Microsoft Visual C#,
" Microsoft Visual Basic,
" Microsoft Visual J#,
" Microsoft Web Developer ASP.NET.
Microsoft Visual Studio pozwala na tworzenie zarówno samodzielnych aplikacji, jak
też aplikacji i usług sieciowych oraz serwisów internetowych.
13
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Tworzenie prostego projektu działającego w konsoli:
KROK 1: Po uruchomieniu środowiska programistycznego Microsoft Visual Studio
2008 na ekranie monitora widzimy okno główne postaci.
KROK 2:
Wybieramy
z menu File
polecenie New,
a następnie
Project.
14
7
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
KROK 3: W oknie New Project wybieramy kolejno:
1. Typ projektu
Visual C++ Win32
2. Szablon projektu
... a następnie podajemy:
(ang. Templates)
Win32 Console Application
3. NazwÄ™ projektu (pole Name),
np. Pierwszy
4. LokalizacjÄ™ katalogu
z projektem na dysku
5. NazwÄ™ rozwiÄ…zania (pole
Solution Name),
np. MojeRozwiazanie
15
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
KROK 4: W dialogowym Win32 Application Wizard Overview możemy:
a) zakończyć tworzenie projektu klikając przycisk Finish, lub
b) przejść do kolejnego okna,
w którym zmieniamy ustawienia
projektu klikajÄ…c przycisk Next.
16
8
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
W wyniku wcześniejszych operacji utworzone zostało Rozwiązanie (ang. Solution)
o nazwie MojeRozwiazanie, Projekt (ang. Project) o nazwie Pierwszy, zbiór plików
nagłówkowych o rozszerzeniu .h oraz zbiór plików zródłowych o rozszerzeniu .cpp.
W oknie edycji widzimy kod
zródłowy pliku Pierwszy.cpp
17
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
SYSTEMY LICZBOWE
System liczbowy zbiór reguł określających jednolity zapis i nazywanie liczb.
Liczby w danym systemie liczbowym zapisujemy używając określonego zbioru znaków
(symboli) nazywanych cyframi.
Do najbardziej znanych cyfr należą:
" cyfry arabskie : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
" cyfry rzymskie : I, V, X, L, C, D, M
Cyfra I V X L C D M
Wartość 1 5 10 50 100 500 1000
Podział systemów liczbowych ...
" systemy addytywne wartość liczby jest sumą wartości jej cyfr,
np. rzymski system liczbowy, gdzie
IV = 4, XII = 12
" systemy pozycyjne liczbę przedstawia się jako ciąg cyfr, a wartość
poszczególnych znaków cyfrowych zależy od ich położenia (pozycji)
względem sąsiednich znaków cyfrowych.
18
9
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
W pozycyjnym systemie liczbowym dana jest:
" ustalona podstawa b,
{c0,c1,K,cb-1 }
" skończony zbiór cyfr ,
o wartościach w0, w1,K, wb-1 równych odpowiednio 0,1,K,b -1 .
Liczba zapisana ma wartość liczbową
ak ak -1Ka1 a0 , a a Ka
-1 -2 -k
w postaci
część całkowita część ułamkowa
k k -1 -k
akb + ak -1b +K+ a1b + a0b0 + a b-1 +K+ a b ,
-1 -k
gdzie a ,K,a ,a0,a1,K,ak -1 ,ak "{0,1,K,b -1}.
-k -1
Najważniejsze pozycyjne systemy liczbowe ...
" Jedynkowy system liczbowy do zapisu liczby w tym systemie wykorzystuje siÄ™
wyłącznie jeden znak 1 , który oznacza liczbę 1.
Mamy podstawę b = 1 oraz zbiór cyfr postaci { 1 }.
Np. "11111" = 5, gdyż
1Å"14 +1Å"13 +1Å"12 +1Å"11 +1Å"10 = 5.
19
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Najważniejsze pozycyjne systemy liczbowe ciąg dalszy ...
" Dwójkowy (binarny) system liczbowy do zapisu liczby w tym systemie
wykorzystuje siÄ™ dwa znaki 0 i 1 .
Mamy podstawę b = 2 oraz zbiór cyfr postaci { 0, 1 }.
Np. "1010" = 10, gdyż
1Å" 23 + 0Å" 22 +1Å" 21 + 0Å" 20 = 8 + 0 + 2 + 0 = 10.
Stosujemy oznaczenie
(1010)2 = (10)10 .
liczba zapisana liczba zapisana
w systemie binarnym w systemie dziesiętnym
" Dziesiętny (decymalny, arabski) system liczbowy do zapisu liczby
w tym systemie wykorzystuje się dziesięć znaków.
Mamy podstawę b = 10 oraz zbiór cyfr postaci { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }.
Np. "125" = 125, gdyż
1Å"102 + 2 Å"101 + 5Å"100 = 100 + 20 + 5 = 125.
20
10
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Najważniejsze pozycyjne systemy liczbowe ciąg dalszy ...
" Szesnastkowy (heksadecymalny) system liczbowy do zapisu liczby
w tym systemie wykorzystuje się szesnaście znaków.
Mamy podstawę b = 16 oraz zbiór cyfr postaci
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F },
wartości odpowiednich cyfr wynoszą odpowiednio
Cyfra 0 1 2 3 4 5 6 7 8 9 A B C D E F
Wartość 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Np. A4F" = 2639, gdyż
10Å"162 + 4 Å"161 +15Å"160 = 2560 + 64 +15 = 2639.
UWAGA System szesnastkowy jest powszechnie używany w naukach
informatycznych, gdyż wartość jednego bajtu można zapisać wykorzystu-
jÄ…c jedynie dwie cyfry szesnastkowe.
E 1 2
)16= ( )10 .
Np. ( F 1 )2= ( 3
1 9
0
21
1
1
1
1
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
STANDARDY REPREZENTOWANIA (KODOWANIA)
CYFR, LITER I ZNAKÓW SPECJALNYCH
Kod alfanumeryczny kod pozwalający zapisać cyfry, litery oraz znaki
specjalne.
ASCII (ang. American Standard Code for Information Interchange)
jest to 7-bitowy kod, w którym liczbom z zakresu 0 127
przyporzÄ…dkowywane sÄ…:
" małe i duże litery (alfabetu angielskiego): A, B, ... ,Y, Z, a, b, ... , y, z,
" cyfry: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
" znaki przestankowe: kropka, przecinek, dwukropek, średnik, wykrzyknik,
znak zapytania, myślnik, nawiasy, cudzysłowy,
" znaki sterujące (służące do sterowania urządzeniami, np. drukarką),
" inne symbole (@, &, %, itp.).
Rozszerzony kod ASCII
jest to 8-bitowy kod, w którym liczba możliwych do zakodowania znaków
zwiększyła się do 256.
UWAGA
Istnieje wiele różnych rozszerzeń kodu ASCII. Należą do nich przykładowo:
zestawy ISO /IEC 8859, Windows 1250 (CP-1250), Unicode.
22
22
11
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Rozszerzony
kod ASCII ...
... ...
23
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
TYPY DANYCH I ZMIENNE
Typy danych dostępne w języku C możemy podzielić na:
" typy proste (nazywane również skalarnymi lub po prostu skalarami), które są
niepodzielne i niejednokrotnie stosowane do tworzenia typów
strukturalnych,
" typy strukturalne (złożone), które mogą składać się zarówno z elementów typów
prostych, jak też z innych typów złożonych.
Typy proste dzielimy na typy: Do typów złożonych zaliczamy:
" arytmetyczne (całkowitoliczbowe " tablice,
i rzeczywiste), " struktury,
" wskaznikowe, " unie ,
" referencyjne (język C++). " klasy (język C++).
UWAGI
Typ danych to pojęcie logiczne nie stanowi on bowiem obiektu, który możemy
wykorzystać w programie.
W programie reprezentantami typów danych są zmienne.
Zmienne zajmują pewien obszar w pamięci operacyjnej komputera. Rozmiar
i interpretacja tego obszaru zależą od typu zmiennej. W przeciwieństwie do typów
danych, zmienne są więc pojęciami fizycznymi.
24
12
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
TYPY PROSTE (SKALARNE)
TYPY CAAKOWITOLICZBOWE
Do typów całkowitoliczbowych zaliczamy typy całkowitoliczbowe ze znakiem
(reprezentują liczby ujemne i dodatnie z zerem) oraz typy całkowitoliczbowe bez
znaku (reprezentujÄ… liczby dodatnie z zerem).
Nazwy Rozmiar Wartość Wartość
Nazwa typu
równoważne [bajty (bity)] minimalna Maksymalna
char signed char 1 (8) 128 127
short int
short 2 (16) 32 768 32 767
signed short int
int signed int 4 (32) 2 147 483 648 2 147 483 647
long int
long 4 (32) 2 147 483 648 2 147 483 647
signed long int
Nazwy Rozmiar Wartość Wartość
Nazwa typu
równoważne [bajty (bity)] minimalna Maksymalna
unsigned char char (z opcjÄ… /J) 1 (8) 0 255
unsigned short unsigned short int 2 (16) 0 65 535
unsigned int unsigned 4 (32) 0 4 294 967 295
unsigned long unsigned long int 4 (32) 0 4 294 967 295
Tabela 1 / Tabela 2. Typy całkowitoliczbowe ze znakiem / bez znaku udostępnione przez kompilator
Microsoft C++ dla procesorów 32-bitowych. Uwaga: Typ char może być równoważny typowi signed
25
char (domyślnie) albo typowi unsigned char (po włączeniu opcji kompilatora /J).
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
TYPY ZMIENNOPOZYCYJNE (RZECZYWISTE)
Do typów zmiennopozycyjnych zaliczmy typ float (pojedyncza precyzja) zazwyczaj
o rozmiarze 4 bajtów, typ double (podwójna precyzja) zazwyczaj o rozmiarze 8
bajtów oraz long double (rozszerzona precyzja) zajmująca od 8 do 16 bajtów.
Rozmiar typów zmiennopozycyjnych zależy od konkretnej implementacji języka C++.
Długość słowa procesora [bity] 16 32 64
Microsoft 10 8 8
Intel (Windows) - 16 16
Kompilator Intel (Linux) - 12 16
Borland 10 10 -
Gnu - 12 16
Tabela 3. Liczba bajtów zajmowanych przez zmienne typu long double w zależności od długości
słowa procesora oraz rodzaju kompilatora. Liczba zapisywana jest na pierwszych 10 bajtach (lub 8
bajtach w przypadku kompilatorów Microsoft C++ dla procesorów 32-bitowych i 64-bitowych),
pozostałe bajty nie są wykorzystywane.
Nazwa Rozmiar Znak Wykładnik Mantysa
Przybliżony zakres wartości
typu [bajty (bity)] [bity] [bity] [bity]
float 4 (32) 1 8 23 (+/-) 3.4 · 10 38 do 3.4 · 10+38
double 8 (64) 1 11 52 (+/-) 1.7 · 10 308 do 1.7 · 10+308
long double 8 (64) 1 11 52 (+/-) 1.7 · 10 308 do 1.7 · 10+308
Tabela 4. Typy rzeczywiste udostępnione przez kompilator Microsoft C++ dla procesorów
26
32-bitowych i 64-bitowych.
13
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
TYP LOGICZNY (ANG. BOOLEAN)
Typ logiczny bool służy do reprezentowania dwóch wartości logicznych true
(prawdy) oraz false (fałszu). Może być wykorzystany do wyrażania wyników
operacji logicznych lub jako typ wyniku funkcji sprawdzajÄ…cej dany warunek.
PRZYKAAD
Pod zmiennÄ… wynik typu logicznego bool zostanie
main ()
podstawiony (przypisanie =) wynik porównania (operator
{
==) dwóch liczb całkowitych a oraz b.
int a = 3; int b = 5;
Wartości są różne więc w danym przykładzie wynik będzie
bool wynik = a==b;
miał wartość false.
}
bool CzyWiekszy (int a, int b) { return a>b; };
Wynikiem funkcji będzie wartość logiczna true lub false odpowiadająca wynikowi
porównania (a > b) dwóch wartości a oraz b.
UWAGI
Wartości całkowite niezerowe przekształcane są do wartości logicznej true, a
wartość 0 do wartości logicznej false.
Zapis bool w = 7; jest równoważny zapisowi bool w = bool(7);
Po konwersji bool(7)otrzymujemy wartość true, więc w jest równe true.
Wartość logiczna true po przekształceniu do wartości całkowitej jest równa 1,
natomiast wartość logiczna false równa jest 0.
Zapis int i = true;jest równoważny zapisowi int i = int(true);
Po konwersji int(true)otrzymujemy wartość 1, więc i jest równe 1.
27
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
AACCUCHY W JZYKU C++
TYP ZNAKOWY
Typ znakowy char służy do przechowywania pojedynczego znaku ze zbioru znaków
implementacji.
Język C++ zamiast przechowywać znaki przechowuje ich kody (czyli jednobajtowe
liczby całkowite ze znakiem signed char, lub bez znaku unsigned char).
Stąd typ char zaliczany jest w języku C++ do typów liczbowych.
Zmiennym typu znakowego możemy nadać wartość przez podanie:
" stałej dziesiętnej,
" znaku ujętego w apostrofy.
PRZYKAAD 1
main ()
Pod zmiennÄ… z typu znakowego char podstawiony zostanie kod o
{ wartości 65 (odpowiadający znakowi litery A).
char z = 65;
Pod zmiennÄ… w typu znakowego char podstawiony zostanie znak
char w = B ;
litery B (o kodzie równym 66).
}
28
14
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
PRZYKAAD 2
/* ... */
char z;
int kod;
for (int i=65; i<=90; i++)
{
z = i;
kod = z;
cout << "Znak " << z << " ma kod ASCII = " << kod;
cout << endl;
}
UWAGI DO PROGRAMU
Program wyświetla na ekranie znaki odpowiadające wielkim literom alfabetu
angielskiego tj. znak A o kodzie 65, znak B o kodzie 66, aż do znaku Z
o kodzie 90.
O sposobie działania obiektu cout decyduje typ zmiennej, która ma być
wyświetlona. W zmiennej z typu char przechowywany jest kod znaku, który
przed wypisaniem na ekran zamieniany jest na odpowiadajÄ…cy mu znak.
Podobnie kod znaku, jako liczbę całkowitą, możemy wyświetlić po podstawieniu
wartości całkowitej przechowywanej w zmiennej z typu char do zmiennej
kod typu int.
29
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Rozszerzony
kod ASCII ...
... ...
30
15
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
JEDNOSTKI LEKSYKALNE JZYKA C++
Podstawowe jednostki leksykalne języka C++
" słowa kluczowe (ang. key words) specjalne identyfikatory zastrzeżone do
użytku przez sam język dla ściśle określonych celów.
Mogą być one wykorzystywane tylko zgodnie z ich przeznaczeniem ustalonym przez
definicję języka C/C++. Słów kluczowych nie można używać do innych celów, takich
jak np. nazywanie zmiennych.
SAOWA KLUCZOWE JZYKÓW C/C++
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
SAOWA KLUCZOWE JZYKA C++
asm bool catch class const_cast delete dynamic_cast explicit
false friend inline mutable namespace new operator private
protected public reinterpreted_cast static_cast template this throw true
try typeid typename using virtual wchar_t
UWAGA Słowa kluczowe udostępnione dla programisty zależą od implementacji języka C++.
Przykładowo język C++ firmy Microsoft rezerwuje dla zachowania zgodności z innymi imple-
mentacjami słowo kluczowe asm ale nie implementuje go. Zamiast niego proponuje __asm. 31
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Podstawowe jednostki leksykalne języka C++ / ciąg dalszy:
" identyfikatory (ang. identifiers) jednostki leksykalne tworzone przez
programistę zgodnie ze składnią języka programowania
umożliwiające identyfikację oraz odwołanie się do określonego
elementu kodu zródłowego programu.
Przy pomocy identyfikatorów możemy nazywać i identyfikować takie elementy
programu jak zmienne, stałe, typy, etykiety, pola struktur i klas, parametry,
podprogramy (procedury, funkcje, metody), klasy, moduły, pakiety, biblioteki,
programy.
Identyfikator w języku C/C++ może się składać z małych i wielkich liter, cyfr oraz
znaku podkreślenia. Należy przy tym pamiętać, że prawidłowo zdefiniowany
identyfikator zaczyna się od litery lub znaku podkreślenia. Standardowo kompilatory
języka C++ biorą pod uwagę maksymalnie 32 znaki. Kompilator języka C++ firmy
Microsoft pozwala na używanie identyfikatory o długości 2048.
PRZYKAAD
main ()
main identyfikator nazwy funkcji
{
double a,b,result;
result = a + b;
a,b,result identyfikatory zmiennych typu double
}
32
16
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Podstawowe jednostki leksykalne języka C++ / ciąg dalszy:
" literały (ang. literals) jednostki leksykalne reprezentujące wartości wpisane
bezpośrednio w kod programu.
" literały znakowe (stałe znakowe) literały reprezentujące w kodzie zródłowym
konkretną wartość typu znakowego.
Sposoby użycia (zapisu) literału znakowego:
bezpośrednio za pomocą znaku ujętego w apostrofy, np. 'A', '7';
za pomocą znaku sterującego kodowanego w języku C/C++ jako ciąg znaków
poprzedzonych przez \, np. '\n oznacza przejście do następnego wiersza,
za pomocÄ… kodu liczbowego:
- dziesiętnego liczby dziesiętnej, np. kod 65 odpowiada dla znaku 'A',
- ósemkowego liczby ósemkowej poprzedzonej przez \,
np. '\107' odpowiada dla znaku G',
- szesnastkowo w postaci liczby szesnastkowej poprzedzonej przez \x,
np. '\x47' odpowiada dla znaku 'G'.
UWAGI
Każdemu znakowi odpowiada w danym zestawie znaków wartość numeryczna
(kod znaku), czyli pewna jednobajtowa liczba całkowita.
Ten sam znak może mieć różne wartości (kody) w różnych zbiorach znaków
(w powszechnym użyciu jest wiele różnych zestawów znaków).
Ponadto nie każdy zbiór znaków ma wartości dla każdego znaku.
Dostępny zestaw znaków zależy od systemu komputerowego oraz ustawień. 33
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
" literały łańcuchowe (napisy, stałe łańcuchowe) (ang. string constants) lite-
rały reprezentujące wartości składające się z ciągu znaków
(łańcucha znaków) wpisanego bezpośrednio w kod programu.
Wartość, która ma reprezentować w kodzie zródłowym określony ciąg znaków,
należy jednoznacznie od kodu programu wyodrębnić. W językach C/C++ ogranicz-
nikiem takim jest cudzysłów.
Literał łańcuchowy zawiera o jeden znak więcej, gdyż wszystkie napisy kończą się
znakiem '/0' o wartości 0.
PRZYKAAD
char s1[10];
deklaracja łańcucha s1 o rozmiarze 10 znaków
char s2[21] = Oto stala lancuchowa ;
char * s3 = Oto drugi napis ;
połączenie deklaracji łańcuchów s2 i s3 z ich inicjacją
stałymi łańcuchowymi podanymi w cudzysłowach
" literały liczbowe (stałe liczbowe) literały reprezentujące konkretne wartości
liczbowe wpisane bezpośrednio w kod programu. Wartości te
znane są już na etapie tworzenia programu.
Literały liczbowe dzielimy ze względu na sposób zapisu wartości liczbowej na
całkowitoliczbowe i zmiennopozycyjne. Podział ze względu na podstawę systemu
liczbowego wyróżnia literały ósemkowe, dziesiętne i szesnastkowe.
34
17
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
LITERAAY CAAKOWITOLICZBOWE (LITERAAY CAAKOWITE)
Do literałów całkowitoliczbowych zaliczamy:
" literały dziesiętne reprezentowane przez cyfry arabskie 0,1,2,3,4,5,6,7,8,9.
" literały ósemkowe reprezentowane przez zbiór cyfr 0,1,2,3,4,5,6,7.
Literały ósemkowe zaczynają się cyfrą 0, po której podajemy
liczbę w systemie ósemkowym.
" literały szesnastkowe reprezentowane są przez cyfry 0,1,2,3,4,5,6,7,8,9 oraz
znaki A, B, C, D, E, F (wraz z ich małymi odpowiednikami).
Literały szesnastkowe zaczynają się znakami 0x, po których
podajemy liczbÄ™ w systemie szesnastkowym.
Stałe ujemne rozpoczynają się od znaku (minus), stałe dodatnie mogą (nie muszą)
rozpoczynać się od znaku + (plus).
PRZYKAAD
deklaracja zmiennych Lit1, Lit2, Lit3 typu int oraz ich
int Lit1 = 63;
inicjalizacja literałami o wartości dziesiętnej równiej 63
int Lit2 = 077; (zapisanej w systemach dziesiętnym, ósemkowym
i szesnastkowym)
int Lit3 = 0x3F;
UWAGA
Do zaznaczenia, że dany literał ma być liczbą całkowitą bez znaku, należy na
jego końcu umieścić przyrostek u lub U.
Literał, którego wartość ma być typu long powinien mieć na końcu dodany
przyrostek l lub L.
Przyrostki mogą być używane łączenie, a ich kolejność nie ma znaczenia. 35
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
UWAGI
Typ literału całkowitego zależy od jego postaci, wartości i przyrostka. Obowiązują
przy tym następujące zasady (zob. B. Stroustrup, Język C++, Wydawnictwa
Naukowo-Techniczne, Warszawa 2002 ):
Jeżeli dany jest literał dziesiętny i nie ma przyrostka, wówczas jego typem jest
pierwszy spośród podanych typów, w którym można reprezentować jego wartość:
int, long int, unsigned long int.
Jeżeli dany jest literał ósemkowy lub szesnastkowy i nie ma przyrostka, wówczas
jego typem jest pierwszy spośród podanych typów, w którym można
reprezentować jego wartość: int, unsigned int, long int, unsigned long int.
Jeżeli literał ma przyrostek u lub U, to jego typem jest pierwszy spośród
podanych typów, w którym można reprezentować jego wartość: unsigned int,
unsigned long int.
Jeżeli literał ma przyrostek l lub L, to jego typem jest pierwszy spośród podanych
typów, w którym można reprezentować jego wartość: long int,
unsigned long int.
PRZYKAAD
za typ literału przyjęty zostanie
unsigned long int w = 12UL;
typ unsigned long int
long int u = -1256L;
za typ literału przyjęty zostanie typ long int
36
18
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Podstawowe jednostki leksykalne języka C++ / ciąg dalszy:
" stała (ang. constant) jednostka leksykalna reprezentująca wartość (liczbową,
tekstową, itp.) zapamiętaną pod pewną nazwą, którą
możemy w kodzie używać wielokrotnie (w przeciwieństwie
do literału, który jest jedynie zapisem pewnej wielkości
w określonym miejscu w programie).
Stała może być wartością:
" znaną już na etapie kompilacji, której nie możemy już nigdy zmienić (C/C++),
" ustawianą jednorazowo, której wartości nie możemy już pózniej zmienić (C++).
deklaracja stałej o nazwie a typu double oraz jej
PRZYKAAD
const double a = 12.5; inicjalizacja literałem zmiennopozycyjnym o wartości
12.5 (danej w systemie dziesiętnym)
UWAGA
Wartości zmiennych zadeklarowanych z atrybutem stałości const nie mogą być
zmieniane w trakcie działania programu.
Deklaracja stałej jest zawsze połączona z inicjacją.
W następujących fragmentach programu występują błędy, które zostaną zasygnali-
zowane na etapie kompilacji programu.
const int b;
stała b musi zostać zainicjowana na etapie deklaracji
b = 9;
wartość stałej a nadana na etapie deklaracji nie
const int a = 1;
może być zmieniona w dalszej części programu
a = 4; 37
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
OPERATORY
Operator konstrukcja językowa jedno- lub wieloargumentowa.
Do operatorów języka C/C++ zaliczamy między innymi operatory arytmetyczne,
operatory logiczne, operatory przypisania, operatory bitowe.
Podstawowe pojęcia niezbędne do opisu operatorów:
" priorytet operatorów ustala kolejność wykonywania działań określonych
przez operatory,
" wiązanie sposób łączenia operatora z operandami,
" operator unarny (operator jednoargumentowy) jest on wiÄ…zany tylko
z jednym operandem),
" operator binarny (operator dwuargumentowy) jest on wiÄ…zany z dwoma
operandami,
" l-wartość jest to wyrażenie identyfikujące pewien obszar w pamięci,
" modyfikowalna l-wartość wyrażenie identyfikujące obszar w pamięci,
którego wartość może być zmieniana.
a i b są zmiennymi reprezentują l-wartości
PRZYKAAD
c jest stałą (identyfikuje obszar w pamięci) jest więc
int a,b = 7;
l-wartością, nie jest jednak modyfikowalną l-wartością
double const c = 3.5;
(gdyż wartości stałych nie mogą być w programie zmieniane)
38
19
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
OPERATORY ARYTMETYCZNE
Operatory addytywne (dodawania + oraz odejmowania )
Liczba
Operator Opis WiÄ…zanie
operandów
+ dodawanie od lewej do prawej 2
odejmowanie od lewej do prawej 2
POSTAĆ WYRAŻENIA
operand1 + operand2
Dozwolone przypadki majÄ… miejsce gdy:
operand1 oraz operand2 sÄ… typu arytmetycznego,
operand1 jest typu całkowitego, operand2 jest typu wskaznikowego,
operand1 jest typu wskaznikowego, operand2 jest typu całkowitego.
operand1 operand2
Dozwolone przypadki majÄ… miejsce gdy:
operand1 oraz operand2 sÄ… typu arytmetycznego,
operand1 oraz operand2 sÄ… wskaznikami tego samego typu,
operand1 jest typu wskaznikowego, operand2 jest typu całkowitego.
39
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Operatory multiplikatywne (mnożenie ·, dzielenie / oraz reszta z dzielenia % )
Liczba
Operator Opis WiÄ…zanie
operandów
· mnożenie od lewej do prawej 2
/ dzielenie od lewej do prawej 2
% reszta z dzielenia od lewej do prawej 2
POSTAĆ WYRAŻENIA
operand1 · operand2
operand1 / operand2
operand1 % operand2
W przypadku operatorów · oraz / operand1 oraz operand2 sÄ… typu arytmetycz-
nego, a w przypadku operatora % typu całkowitoliczbowego. We wszystkich
wyrażeniach, w których występują operatory / lub % operand2 nie może być
równy 0.
W przypadku operacji dzielenia (/) dwóch liczb całkowitych reprezentowanych
przez operand1 i operand2 otrzymana wartość jest równa:
" największej liczbie całkowitej mniejszej niż rzeczywisty iloraz operand1/operand2
w przypadku, gdy operandy majÄ… te same znaki, np. 13/5 daje w wyniku 2,
" najmniejszej liczbie całkowitej większej niż rzeczywisty iloraz operand1/operand2
w przypadku, gdy operandy mają różne znaki, np. -13/5 daje w wyniku -2.
W przypadku operacji reszty z dzielenia (%) otrzymana wartość ma znak zgodny
ze znakiem operand1.
40
20
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Operatory inkrementacji (++) oraz dekrementacji ( )
Liczba
Operator Opis WiÄ…zanie
operandów
+ + inkrementacja od prawej do lewej 1
dekrementacja od prawej do lewej 1
Operacja inkrementacji (++) powoduje zwiększenie danej wartości o jeden, podobnie
operacja dekrementacji ( ) powoduje zmniejszenie danej wartości o jeden.
POSTAĆ WYRAŻENIA
Dla operatorów przedrostkowych
+ + operand1
operand1
Dla operatorów przyrostkowych
operand1 + +
operand1
Dozwolone przypadki majÄ… miejsce, gdy:
operand1 jest typu arytmetycznego lub typu wskaznikowego,
operand1 jest modyfikowalną l-wartością (zmieniamy bowiem wartość zmiennej).
41
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
UWAGA
Operatory przedrostkowe i przyrostkowe odpowiednio inkrementacji i dekrementacji
zwiększają oraz zmniejszają wartość operandu jednak sposób ich działania jest inny.
Kolejne kroki obliczeń:
PRZYKAAD 1
/* ... */
1. Liczba b zostania powiększona o 1, czyli będzie
int a = 3, b = 1, c;
miała wartość 2.
c = (a++) + (++b);
2. Do liczby a = 3 zostanie dodana liczba b = 2, czyli
c będzie miało wartość 5.
3. Wartość wyrażenia znajdującego się po prawej
W wyniku dostaniemy:
stronie równości została obliczona, więc teraz
a = 4, b = 2, c = 5;
zadziała operator przyrostkowy zwiększając wartość
liczby a o jeden, czyli a będzie miało wartość 4.
PRZYKAAD 2
/* ... */
Operator przedrostkowy działa przed
int a = 3, b = 1, c;
obliczeniem wartości całego wyrażenia.
c = (++a) + (++b);
Operator przyrostkowy działa po obliczeniu
wartości całego wyrażenia.
W wyniku dostaniemy:
a = 4, b = 2, c = 6;
42
21
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Operatory logiczne koniunkcji (&&), alternatywy (||) oraz negacji (!)
Liczba
Operator Opis WiÄ…zanie
operandów
&& koniunkcja od lewej do prawej 2
|| alternatywa od lewej do prawej 2
! negacja od prawej do lewej 1
POSTAĆ WYRAŻENIA
operand1 && operand2
operand1 || operand2
! operand1
Operandy operand1 oraz operand2 muszą być skalarami. Wartość wyrażenia
logicznego jest zawsze typu całkowitoliczbowego int.
WARTOŚCI WYRAŻEC LOGICZNYCH
operand1 operand2 operand1 && operand2 operand1 || operand2 !operand1
false false false false true
false true false true true
true false false true false
true true true true false
43
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Operatory przypisania: prosty operator przypisania (=), oraz złożone operatory
przypisania (+=, =, ·=, /=, %=)
Liczba
Operator Opis WiÄ…zanie
operandów
= przypisanie od prawej do lewej 2
+= przypisanie po wykonaniu działania + na operandach od prawej do lewej 2
-= przypisanie po wykonaniu działania - na operandach od prawej do lewej 2
·= przypisanie po wykonaniu dziaÅ‚ania · na operandach od prawej do lewej 2
/= przypisanie po wykonaniu działania / na operandach od prawej do lewej 2
%= przypisanie po wykonaniu działania % na operandach od prawej do lewej 2
POSTAĆ WYRAŻENIA
operand1 = operand2
Najważniejsze założenia:
operand1 musi być modyfikowalną l-wartością,
przed podstawieniem wykonywana jest konwersja operand2 do typu operand1;
wartość operand2 jest następnie zapamiętana w operand1,
operand1 i operand2 sÄ… typu arytmetycznego,
operand1 jest strukturÄ… lub uniÄ… zgodnÄ… z typem operand2,
operand1 i operand2 są wskaznikami zgodnych typów, co więcej operand1 ma
takie same atrybuty jak operand2.
44
22
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
POSTAĆ WYRAŻENIA
ZAOŻONY OPERATOR PRZYPISANIA WYRAŻENIE RÓWNOWAŻNE
operand1 += operand2 operand1 = operand1 + operand2
operand1 -= operand operand1 = operand1 - operand2
operand1 ·= operand2 operand1 = operand1 · operand2
operand1 /= operand2 operand1 = operand1 / operand2
operand1 %= operand2 operand1 = operand1 % operand2
Operandy operand1 i operand2 muszą spełniać te same warunki, co w przypadku
prostego operatora przypisania.
Za wartość wyrażenia przyjmuje się wartość przypisaną dla operand1.
45
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Operatory porównania (>, <, <=, >=, ==, !=)
Liczba
Operator Opis WiÄ…zanie
operandów
> operand1 jest większy niż operand2 od lewej do prawej 2
< operand1 jest mniejszy niż operand2 od lewej do prawej 2
>= operand1 jest większy równy operand2 od lewej do prawej 2
<= operand1 jest mniejszy równy operand2 od lewej do prawej 2
== operand1 jest równy operand2 od lewej do prawej 2
!= operand1 jest różny od operand2 od lewej do prawej 2
POSTAĆ WYRAŻENIA
operand1 < operand2
&
operand1 != operand2
Operandy operand1 i operand2 muszą być oba typu arytmetycznego, lub oba
wskaznikami zgodnych typów.
Wynik wyrażenia jest typu int jeżeli relacja pomiędzy operandami określona
przez operator jest spełniona, wówczas wartością wyrażenia jest 1,
w przeciwnym razie 0.
46
23
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
Operator warunkowy (?:)
Liczba
Operator Opis WiÄ…zanie
operandów
? : operacja warunkowa od prawej do lewej 3
POSTAĆ WYRAŻENIA
operand1 ? operand2 : operand3
Operand operand1 musi być skalarem, natomiast operand2 i operand3 muszą
spełniać jedną z wybranych poniższych zasad:
oba sÄ… typu arytmetycznego,
oba sÄ… zgodnymi strukturami lub uniami,
oba są wskaznikami zgodnych typów.
SPOSÓB DZIAAANIA OPERATORA
1. Obliczana jest wartość operand1.
2. W przypadku, gdy jest ona niezerowa (true), obliczana jest wartość operand2
(operand3 natomiast jest ignorowane).
3. W przeciwnym wypadku, gdy operand1 jest równe zero (false) obliczana jest
wartość operand3 (operand2 jest pomijane).
4. Obliczona wartość operand2 lub operand3 staje się wartością wyrażenia
warunkowego.
47
24
Wyszukiwarka
Podobne podstrony:
CPP WYKLAD 1CPP WYKLAD 7CPP WYKLAD 6CPP WYKLADY ANALIZA 2CPP WYKLAD 3CPP WYKLAD 4 5CPP WYKLADY ANALIZA 1Wyklad CPP 6Wyklad CPP 1Wyklad CPP 2Wyklad CPP 7Wyklad CPP 3Wyklad CPP 5Sieci komputerowe wyklady dr FurtakWykład 05 Opadanie i fluidyzacjawięcej podobnych podstron