Podstawowe informacje o języku C++
1.
Języki programowania
Przykłady języków: język polski, język suahili, język esperanto, „język muzyczny”, „język matematyczny”, język migowy, języki programowania.
Pięć generacji języków programowania:
I generacja: kod maszynowy
II generacja: język niskiego poziomu
III generacja: języki wysokiego poziomu, np. C++
IV generacja: generatory aplikacji
V generacja: języki sztucznej inteligencji
2.
Składniki języka C++
a) alfabet: cyfry od 0 do 9, litery alfabetu łacińskiego (wielkie i małe rozróżnialne między sobą), znaki +, -, ), (, *, &, ^, %, #, !, |, /, {, }, <, >, =, ”, spacja, .; b) poprawne słowa (reguły ortograficzne): tzw. słowa kluczowe (np. include, main, for, break, ...), dowolny ciąg znaków alfabetu rozpoczynający i kończący się znakiem cudzysłowu;
c) reguły gramatyczne: np. po nazwie funkcji muszą pojawić się nawiasy okrągłe, istnieje dowolność we wstawianiu spacji przed i po nawiasach, każda instrukcja musi być zakończona średnikiem, ...
3.
Schemat prostego programu w języku C++
1) #include<iostream>
2) using namespace std;
3) int main()
4) {
5) //miejsce na instrukcje realizujące zadanie stawiane przed programem; 6) cout<<”\nNacisnij Enter aby zakonczyc program”;
7) cin.get();
8) return 0;
9) }
Znaczenie wierszy 1) – 9)
1), 2) – wiersze zawierają informację dla preprocesora, że w plikach iostream oraz std znajdują się pewne definicje potrzebne do prawidłowego działania programu. Dzięki temu zrozumiałe są słowa cout, cin.get() występujące w programie;
3) – nagłówek metody main. Każdy program w języku C++ musi zawierać metodę main o takim samym nagłówku. Puste nawiasy oznaczają, że jest to funkcja bezparametrowa (funkcja stała), a słowo int oznacza, że ostatecznym wynikiem działania tej funkcji jest liczba całkowita;
4), 9) – oznaczają odpowiednio początek i koniec bloku (ciała, zawartości) funkcji main; 5) – polecenia (instrukcje), odpowiedzialne za poprawne działanie funkcji main w różnych programach;
6) – instrukcja wypisująca na konsoli, w nowym wierszu komunikat: Nacisnij Enter aby zakonczyc program;
7) – instrukcja zamykająca okno konsoli po wciśnięciu klawisza Enter; 8) instrukcja wskazująca liczbę 0 jako wartość funkcji main.
4.
Instrukcje
Instrukcje to polecenia wykonania elementarnych czynności przez program, np.
- zarezerwuj w pamięci obszar 4B na zapis liczby całkowitej,
- wpisz do wskazanego obszaru pamięci (wcześniej zarezerwowanego) podaną wartość,
- wykonaj wskazane działania arytmetyczne;
- określ wartość logiczną zdania logicznego...
5.
Funkcje
Funkcje to grupy powiązanych ze sobą poleceń, realizujące pewne zadania. Są wykorzystywane do realizacji celów stawianych przed programem, np. obliczenia wartości wyrażenia arytmetycznego. W każdym programie musi wystąpić przynajmniej jedna metoda main o następującej składni:
using namespace std;
int main()
{
//miejsce na instrukcje realizujące zadanie stawiane przed programem; return 0;
}
6.
Znaki specjalne w stringach
\n – przejście do nowego wiersza,
\t – znak tabulacji,
\b – backspace,
\r – powrót karetki,
\\ - ukośnik w tył,
\” – cudzysłów,
\a lub \007 - alarm
7. Zmienne, typy podstawowe
W języku C++ występują 3 rodzaje zmiennych: zmienne obiektowe, zmienne statyczne (globalne klasy) oraz zmienne lokalne.
Zmienne lokalne są używane wewnątrz definicji funkcji lub nawet w mniejszych blokach instrukcji wewnątrz ciała funkcji. Są dostępne jedynie podczas wykonywania odpowiednio kodu metody lub kodu bloku instrukcji i natychmiast przestają istnieć po tym czasie.
Deklarowanie zmiennej ma postać:
typ_zmiennej nazwaZmiennej;
Nazwa zmiennej musi spełniać następujące reguły:
• może składać się jedynie z liter, cyfr oraz znaku podkreślenia,
• nie może zaczynać się od cyfry (najlepiej aby nie zaczynała się od znaku podkreślenia),
• duże litery są odróżnialne od małych,
• nazwa zmiennej nie może być słowem kluczowym,
Typem zmiennej może być typ podstawowy, typ pochodny od podstawowego, nazwa klasy bądź tablica.
Typy podstawowe: znak, liczba całkowita, liczba zmiennopozycyjna, liczba zmiennopozycyjna podwójnej precyzji, wartość logiczna
typy przeznaczone do przechowywania liczb całkowitych
nazwa typu
typowy rozmiar
zakres przechowywanych wartości
char (podstawowy)
1 bajt
od -128 do 127
unsigned char
1 bajt
od 0 do 255
short int,
2 bajty
od -32.768 do 32.767
short
unsigned short int,
2 bajty
od 0 do 65535
unsigned short
int (podstawowy)
2, 4 lub 8 bajtów
dla 4B: od -2.147.438.648 do 2.147.438.647
unsigned int
2, 4 lub 8 bajtów
dla 4B: od 0 do 4.294.967.295
long int,
4 lub 8 bajtów
dla 8B: od -9.223.372.036.854.775.808 do
long
9.223.372.036.854.775.807
unsigned long int,
4 lub 8 bajtów
dla 8B: od 0 do 18.446.744.073.709.551.615
unsigned long
przeznaczone do przechowywania liczb wymiernych
nazwa typu
rozmiar
zakres przechowywanych wartości
float (podstawowy)
4 bajty
od -3,4*1038 do 3,4*1038 z dokładnością do 6-ciu cyfr
double (podstawowy)
8 bajtów
od -1,7*10308 do1,7*10308 z dokładnością 10-ciu cyfr
long double
12 bajtów
od -1,2*104932 do1,7*104932 z dokładnością 10-ciu cyfr
przeznaczone do przechowywania pojedynczych znaków
nazwa typu rozmiar
zakres przechowywanych wartości
char
1 bajt
znaki kodu ASCII
przeznaczone do przechowywania jednej z dwóch wartości: prawdy lub fałszu nazwa typu
rozmiar
zakres przechowywanych wartości
bool (podstawowy) 1 bajt
true lub false
np.
int n = 23;
char znak = ‘k’;
bool czyPrawda = true;
bool b = -24; //zmienna przybiera wartość true gdy jest różna od 0, a wartość false w p.p.
float x = 6.523;
float z = -1.43e+2; //tutaj e = 10
double w = 2E9; //to samo co 2.0E+9, E oznacza to samo co e;
Operatory
8.1.
Operatory arytmetyczne – wykonywane są od lewej strony do prawej zgodnie z regułami matematyki (*, /, % w pierwszej kolejności), chyba że nawiasy okrągłe wskazują inaczej
symbol
znaczenie
przykłady, uwagi
operatora
*
mnożenie
np. 9.1 * 8 zwróci wartość 72.8
/
dzielenie całkowite,
np. 25 / 10 zwróci wartość 2 gdyż dzielna
i dzielnik są liczbami całkowitymi
dzielenie
25.0 / 10 zwróci wartość 2.5 gdyż choć
jedna spośród dwu liczb nie jest całkowita
%
reszta z dzielenia liczb całkowitych
np. 5 % 2 zwróci wartość 1
+
dodawanie
np. 4.2 + 13.9 zwróci wynik 18.1
-
odejmowanie
np. 2.9 – 4.5 zwróci wynik -1.6
-
wzięcie liczby przeciwnej
8.2.
Operatory przypisania
symbol operatora znaczenie
przykłady, uwagi
=
przypisz zmiennej wartość
np. x = ‘9’
+=
dodaj, a następnie przypisz
np. x += y zastępuje x = x+y
-=
odejmij, a następnie przypisz
np. x -= y zastępuje x = x - y
*=
pomnóż, a następnie przypisz
np. a *= b zastępuje a = a * b
/=
podziel, a następnie przypisz
np. a /= b zastępuje a = a / b
Uwaga, operatory arytmetyczne są wykonywane przed operatorami przypisania, dlatego x /= y + 5 oznacza: x = x / (y + 5)
8.3 Opery inkrementacji i dekrementacji
symbol operatora znaczenie
przykłady, uwagi
++
inkrementuj, czyli zwiększ o 1
np. x++ lub ++x zastępuje x = x + 1
--
dekrementuj, czyli zmniejsz o 1
np. x—lub—x zastępuje x = x -1
Uwaga, zapis y = x++ zastępuje następujące dwie instrukcje y = x; x++; natomiast zapis y = ++x zastępuje następujące dwie instrukcje x++; y = x; podobnie jest dla operatora dekrementacji
8.4 Operatory porównania
symbol operatora znaczenie
przykłady, uwagi
= =
równe
np. x = = 3
!=
różne
np. ‘a’ != ‘A’
<
mniejsze
np. x < y
>
większe
np. 3 > 5
<=
niewiększe
np. boolean z; z = 5 <= 1;
>=
niemniejsze
np. y >=x
8.5
Operatory logiczne
symbol operatora znaczenie
przykłady, uwagi
&&
koniunkcja
np. (5>1) && (4<=6) ma wartość true
| |
alternatywa
np. (5>1) || (8<=6) ma wartość true
= =
równoważność
np. x = = x++ ma wartość false
!
zaprzeczenie
np. !(4<0) ma wartość true
W języku C++ obowiązują następujące priorytety pomiędzy operatorami różnego rodzaju:
• nawiasy okrągłe;
• inkrementacja przyrostkowa, dekrementacja przyrostkowa,
• operatory jednoargumentowe (unarne), np. zaprzeczenie, wzięcie liczby przeciwnej oraz inkrementacja przedrostkowa i dekrementacja przedrostkowa;
• operatory dwuargumentowe (binarne) związane z mnożenie lub dzieleniem, np.: *, /,
%;
• operatory arytmetyczne dodawania i odejmowania +, -;
• porównania >, >=, <, <=;
• porównania !=, = =;
• operatory logiczne &&, ||;
• operatory przypisania =, +=, *=, -=, /=; %=;
• operator warunkowy ?: .
9 Podstawowe instrukcje złożone
9.1 Instrukcje warunkowe
Instrukcje te pozwalają na warunkowe wykonywanie określonych operacji, powodują
„rozgałęzienie” działania programu.
9.1.1 Instrukcja warunkowa if W najprostszej wersji ma ona postać:
if (wyrażenie_testowe)
{
// blok instrukcji wykonywanych, jeśli wartość logiczna warunku wyrażenie_testowe
//jest prawdą lub jest wartością liczbową niezerową
}
Jeżeli blok instrukcji występujący po nagłówku if ( wyrażenie_testowe) instrukcji jest pojedynczą instrukcją, to można opuścić nawiasy klamrowe.
W postaci rozszerzonej instrukcja warunkowa if ma formę:
if (wyażenie_testowe )
{
//blok instrukcji wykonywanych, jeśli wartość logiczna warunku wyrażenie_testowe
// jest prawdą lub jest wartością liczbową niezerową
}
else
{
//blok instrukcji wykonywanych w przeciwnym przypadku
}
9.1.2 Operator warunkowy ?:
Operator ten może zastępować instrukcję warunkową if. Ma on następującą postać: wyrażenie_testowe ? wyrażenie1 : wyrażenie2;
Operator ten zwraca pojedynczą wartość – albo wyrażenie1, o ile wartość logiczna wyrażenia_testowego jest prawdą, albo wyrażenie2, w przeciwnym przypadku.
Instrukcja switch
Ma ona postać następującą:
switch (zmienna_całkowita)
{
case wartość1 : intrukcje1;
break; //opcjonalnie
case wartość2 : intrukcje2;
break; //opcjonalnie
…
default : instrukcje_inne;
}
Gdy zmienna _ całkowita ma wartość1, wtedy instrukcja switch wykona instrukcje1 i tylko te instrukcje o ile po nich znajduje się słowo break. Brak w tym miejscu słowa break oznacza, że switch wykona wszystkie instrukcje począwszy od tych, które odpowiadają wartości1, aż do napotkania słowa break.
Instrukcje te pozwalają na wielokrotne powtarzanie określonych instrukcji 9.2.1
Pętla while
Ma ona postać:
while (wyrażenie-testowe)
{
//ciało pętli
}
Jeśli wyrażenie-testowe ma wartość logiczną prawdy lub ma wartość różną od 0, to następuje wykonanie instrukcji z ciała pętli i ponowne sprawdzenie wartości wyrażenia-testowego.
Czynności te są powtarzane, aż do momentu, gdy wyrażenie-testowe osiąga wartość logiczną fałszu lub wartość 0. Wówczas instrukcje z ciała pętli są pomijane, a wykonywane, te znajdujące się pod ciałem pętli.
Uwaga, działanie pętli while zmieniają instrukcje continue oraz break (patrz rozdział 9.3) 9.2.2
Pętla do while
Ma ona postać:
do
{
//ciało pętli
}
while (wyrażenie-testowe);
Pętla rozpoczyna się od wykonania instrukcji tworzących ciało pętli. Następnie sprawdzana jest wartość logiczna wyrażenia wyrażenie-testowe. Jeśli jest ona prawdą lub wartością różną od 0, to następuje powrót do ciała pętli i ponowne sprawdzenie wartości wyrażenia wyrażenie-testowe. Czynności te powatrzają się aż do momentu, gdy wyrażenie-testowe okaże się fałszywe lub równe 0. Wtedy program wykona instrukcje znajdujące pod pętlą.
Uwaga, działanie pętli do while zmieniają instrukcje continue oraz break (patrz rozdział 9.3) 9.2.3
Pętla for
Ma ona postać:
for (inicjacja_pętli ; warunek_trwania_pętli ; aktualizacja)
{
//ciało pętli
}
Pętla rozpoczyna się od wykonania instrukcji inicjacja_pętli. Następnie sprawdzana jest wartość wyrażenia warunek_trwania_pętli. Jeśli ma on wartość prawdy lub jest różna od 0, to wykonywane są instrukcje z ciała pętli. Po nich następuje wykonanie instrukcji aktualizacja i powtórne sprawdzenie wartości wyrażenia warunek_trwania_pętli. Te trzy rodzaje czynności:
- sprawdzenie wartości wyrażenia warunek_trwania_pętli,
- instrukcje z ciała pętli
- aktualizacja
powtarzane są dopóki wartość wyrażenia warunek_trwania_pętli nie osiągnie wartości logicznej fałszu lub wartości 0. Wtedy program przechodzi do wykonania instrukcji znajdujących się pod ciałem pętli.
Część inicjacja_pętli oraz aktualizacja nie muszą być pojedynczymi instrukcjami. Wtedy wchodzącę w ich skład instrukcje należy oddzielić przecinkiem. W nagłówku pętli for nie muszą wystąpić wszystkie trzy elementy: inicjacja_pętli, warunek_trwania_pętli, aktualizacja. Muszą za to wystąpić dwa średniki. Wyrażenie
for( ; ; )
{
// ciało pętli
}
jest poprawne, a pusty warunek_trwania_pętli uznawany jest za prawdziwy. Dlatego taka pętla w nieskończoność będzie wykonywać instrukcje z ciała.
Uwaga, działanie pętli for zmieniają instrukcje continue oraz break (patrz rozdział 9.3) 9.3 Instrukcje continue i break
Instrukcja continue umieszczona w ciele pętli powoduje, że instrukcje znajdujące się pod nią nie są wykonywane, a program powraca do nagłówka bieżącej pętli (tak jakby wszystkie instrukcje z ciała pętli zostały wykonane).
Instrukcja break, umieszczona w ciele pętli powoduje zaniechanie wykonywania instrukcji z ciała bieżącej pętli znajdujących się pod nią i wyjście poza tę pętlę. W przypadku pętli zagnieżdżonych instrukcja break nie pozwala na wyjście poza wszystkie pętle. W tym celu można wykorzystać instrukcję goto.
9.4 Instrukcja goto
Powinna być wykorzystywana tylko w jednym przypadku – gdy chcemy wyjść jednocześnie z kilku pętli zagnieżdżonych. Aby tak się stało musi posiadać specjalną etykietę, informującą, w którym miejscu programu należy wznowić wykonywanie instrukcji, po przejściu przez instrukcję goto. Etykieta musi pojawić się w dwóch miejscach: w ciele pętli, tuż to słowie goto oraz w miejscu do którego chcemy aby realizacja programu została przeniesiona. Po etykiecie umieszczonej w miejscu gdzie ma zostać przeniesiona realizacja programu musi wystąpić dwukropek.
Np.
//etykieta umieszczona przed pętlą w której ciele występuje instrukcja for ( int i = 0; i < 40; i++ )
// break lub continue z etykietą
{
while ( x < 50 )
{
if ( warunek ) break out;
else instrukcja1;
}
instrukcja2;
}
out:
10. Stałe i funkcje matematyczne w pliku nagłówkowym math.h Plik math.h zawiera definicje następujących stałych:
nazwa stałej
wartość
opis
M_E
2.7182818284590452354
e - stała Eulera
M_LOG2E
1.4426950408889634074
log e
2
M_LOG10E
0.43429448190325182765
log e
10
M_LN2
0.69314718055994530942
log 2
e
= ln 2
M_LN10
2.30258509299404568402
log 10
e
= ln10
M_PI
3.14159265358979323846
π - stosunek długości obwodu okręgu do średnicy
M_PI_2
1.57079632679489661923
π/2
M_PI_4
0.78539816339744830962
π/4
M_1_PI
0.31830988618379067154
1/π
M_2_PI
0.63661977236758134308
2/π
M_2_SQRTPI
1.12837916709551257390
2
π
M_SQRT2
1.41421356237309504880
2
M_SQRT1_2
0.70710678118654752440
1/ 2
Plik math.h zawiera prototypy następujących funkcji matematycznych:
prototyp funkcji
opis funkcji
double sin (double)
sinus zmiennej rzeczywistej
double cos (double)
cosinus zmiennej rzeczywistej
double tan (double)
tangens zmiennej rzeczywistej
double sinh (double)
sinus hiperboliczny
double cosh (double)
cosinus hiperboliczny
double tanh (double)
tangens hiperboliczny
double asin (double)
arcus sinus
double acos (double)
arcus cosinus
double atan (double)
arcus tangens
double exp (double)
x
e , gdzie x jest argumentem funkcji exp
double log (double)
log x = ln x , gdzie x jest argumentem funkcji log e
double log10 (double)
log
x = log x , gdzie x jest argumentem funkcji log10
10
double pow (double, double)
b
a , gdzie a jest pierwszym, zaś b drugim argumentem funkcji pow double sqrt (double)
x , gdzie x jest argumentem funkcji sqrt
double ceil (double)
funkcja zaokrągla argument zawsze w górę
double floor (double)
funkcja zaokrągla argument zawsze w dół
double fabs (double)
wartość bezwzględna z liczby x, gdzie x jest argumentem funkcji fabs
Plik stdlib.h zawiera prototyp funkcji generującej liczby całkowite w sposób pseudolosowy
prototyp funkcji
opis funkcji
int rand(void)
funkcja zwraca całkowitą liczbę
pseudolosową z przedziału [0; 32767]