Jednostki
Jednostki
leksykalne C++
leksykalne C++
(służą do budowania instrukcji
(służą do budowania instrukcji
języka)
języka)
1.identyfikatory,
2.słowa kluczowe,
3.stałe,
4.literały
łańcuchowe,
5.znaki
przestankowe
6.operatory.
LEKSYKA - słownictwo, ogół wyrazów
języka
IDENTYFIKATORY
IDENTYFIKATORY
nazwy
nazwy
Małe i wielkie litery, cyfry,
znak podkreślenia.
Uwagi:
•pierwszy znak musi być literą lub
podkreśleniem,
•standardowo kompilatory C++
biorą pod uwagę pierwsze 32
znaki
•rozróżniane są małe i duże litery
np.
nazwa, Andrzej,
funkcja, funkcja_X, X1, x1
różne identyfikatory:
ANDRZEJ, Andrzej,
AndrzeJ
SŁOWA KLUCZOWE
SŁOWA KLUCZOWE
Specjalne identyfikatory
(
niepodzielny ciąg znaków
)
zarezerwowane
dla
ściśle
określonych celów i mogą być
wykorzystywane tylko zgodnie
z ich przeznaczeniem
asm
auto
break
case
cdeal
_cdeal
__cdeal
char
class
const
continue
_cs
__cs
default
delete
do
double
_ds
__ds
else
enum
_es
_export
__export
extern
far
_far
__far
_fastcall
__fastcal
l
float
for
friend
goto
huge
_huge
__huge
if
inline
int
interrrup
t
_interrup
t
__interru
pt
_loadds
__loadds
long
near
_near
__near
new
operator
pascal
_pascal
private
protecte
d
public
register
return
_savearg
s
__
savearg
s
_seg
__seg
short
signed
sizeof
_ss
__ss
static
struct
switch
templat
e
this
typedef
union
unsigne
d
virtual
void
volatile
while
STAŁE
Literały typu:
ich
ich wartości
nie ulegają
nie ulegają
zmianie
zmianie
Stałe znakowe
(literały) – ciąg złożony
z jednego
’x’ ’R’
lub więcej znaków ujęty w pojedyncze
apostrofy
\n \t \b (tzn. sekwencje ucieczki)
cha
r
int
Stałe zmiennopozycyjne
– należą do podzbioru
liczb rzeczywistych
0.0 .26 2. -84.17 notacja dziesiętna z
kropką
1.18e12 -5.6789E-3 4e6 notacja
wykładnicza
Długość domyślna literału zmiennoprzecinkowego to
double; long duble – trzeba dopisać l, L;
Dokładność wymuszona -84.17f .89F
3.14165e-8L
float .
..
Stałe całkowite
– liczba
całkowita
87 037 0x12 0X7
int
...
dziesiątkowy; ósemkowy; szesnastkowy typ
unsignet – u
128 u 1024UL 1L 8Lu
nowy wiersz (newline)
nowy wiersz (newline)
\n
\n
tabulacja pozioma (horizontal tab)
tabulacja pozioma (horizontal tab)
\t
\t
tabulacja pionowa (vertical tab)
tabulacja pionowa (vertical tab)
\v
\v
cofnięcie (backspace)
cofnięcie (backspace)
\b
\b
przesunięcie do początku wiersza (carriage return)
przesunięcie do początku wiersza (carriage return)
\r
\r
nowa srona (tormfeed)
nowa srona (tormfeed)
\f
\f
sygnał dźwiękowy (alert)
sygnał dźwiękowy (alert)
\a
\a
ukośnik (backslash)
ukośnik (backslash)
\\
\\
znak zaputania (question mark)
znak zaputania (question mark)
\?
\?
pojedynczy cudzysłów (single quote)
pojedynczy cudzysłów (single quote)
\’
\’
Podwójny cudzysłów (double quote)
Podwójny cudzysłów (double quote)
\”
\”
Sekwencja pozwalająca zapisać dowolny znak
Sekwencja pozwalająca zapisać dowolny znak
\ooo
\ooo
ooo
ooo
– oznacza zapis w systemie ósemkowym liczby co
– oznacza zapis w systemie ósemkowym liczby co
najwyżej trzycyfrowej, przedstawiającej wartość znaku w
najwyżej trzycyfrowej, przedstawiającej wartość znaku w
kodzie ACII; przykłady:
kodzie ACII; przykłady:
\7
\7
(sygnał dźwiękowy
(sygnał dźwiękowy
\0
\0
(znak pusty, null)
(znak pusty, null)
\14
\14
(nowy wiersz)
(nowy wiersz)
\062
\062
(„2”)
(„2”)
STAŁE -
deklaracje
stałych
#define identyfikator
ciąg_znaków
#define stala 9.81
#define nazwa ``Politechnika``
Definiujemy: stałą, funkcję, słowo kluczowe potem
podmieniane na wartość lub użyte w instrukcjach
warunkowych dla preprocesora
const typ_stałej
identyfikator=ciąg_znaków;
const float stala=9.81;
const char *nazwa=``Politechnika``;
LITERAŁY
ŁAŃCUCHOWE
Ciąg o długości zero lub więcej znaków
ujęty w podwójne apostrofy (cudzysłów)
zakończony znakiem o kodzie zero `\0`
``abcd`` - reprezentacja wewnętrzna to 5
znaków a b c d 0
ZNAKI
PRZESTANKOWE
[ ] ( ) { } , ; : ...
* = #
Nawiasy kwadratowe
[ ]
– do definiowania tablic lub
wskazywania ich elementów
np.
char str[20];
double tab[10][20][1];
Tab[1][5][4]=25;
Nawiasy okrągłe
( )
– m.in. do grupowania wyrażeń,
wskazywania wywołań funkcji i listy parametrów
np.
p=0.5*(a+b)*h;
funkcja();
Nawiasy klamrowe
{ }
– nawiasy logiczne
podobnie jak BEGIN END, wskazują tzw. instrukcję
złożoną.
np.
if (x!=y)
{
p=x;
q=x*y;
}
Przecinek
,
- służy m.in. do oddzielenia
argumentów funkcji
np.
funkcja(x,y,z);
funkcja1(a,b,cd,x1);
Średnik
;
- oznacza zakończenie instrukcji.
np.
a=c/y;
d=a*c;
ZNAKI
PRZESTANKOWE
cd
Dwukropek
:
- wskazuje, że poprzedzający go ciąg
znaków powinien zostać potraktowany jako etykieta
np.
start:
y=x++;
z=y++;
Wielokropek
...
– znajduje zastosowanie przy
deklarowaniu
funkcji
o
zmiennej
liczbie
parametrów
np.
funkcja(int x, ...);
funkcja1(int y, char z, ...);
Znak gwiazdki
*
- mnożenie, do deklarowania
zmiennych wskaźnikowych
np.
int *wl;
char **wznaki;
Znak równości
=
- do oddzielania deklaracji
zmiennej od części inicjującej tę zmienną.
np.
int tab[3]={1,2,3};
Znak
#
- oznacza dyrektywę preprocesora
np.
#include <math.h>
OPERATORY
• OPERATORY ARYTMETYCZNE
(addytywne, multiplikatywne, in- i dekrementacji),
• OPERATORY LOGICZNE,
• OPERATORY BITOWE,
• OPERATORY RELACYJNE,
• OPERATORY PRZYPISANIA,
• OPERATOR WARUNKOWY,
((a++)+b)--;
((a++)+b)--;
c=(a, b+a, b*b)%(a>>4,
c=(a, b+a, b*b)%(a>>4,
b<<2);
b<<2);
++c*=(a!=0)?a:b++;
++c*=(a!=0)?a:b++;
•OPERATOR WYLICZENIOWY,
• OPERATORY WYBORU SKŁADOWYCH,
• OPERATORY POBRANIA ADRESU ZMIENNEJ
ORAZ DOSTĘPU DO ZMIENNEJ WSKAZYWANEJ,
• OPERATOR POBRANIA ROZMIARU,
• OPERATORY DOSTĘPU DO SKŁADOWYCH KLASY,
• OPERATORY DYNAMICZNEGO PRZYDZIAŁU PAMIĘCI,
• OPERATORY INDEKSOWANIA I WYWOŁANIA FUNKCJA,
• OPERATOR KONWERSJI.
OPERATORY
cd
OPERATORY ARYTMETYCZNE
OPERATOR
OPERATOR
ZNACZENIE
ZNACZENIE
Operatory
Operatory
addytywne
addytywne
+
+
Dodawanie
Dodawanie
-
-
Odejmowanie
Odejmowanie
Operatory
Operatory
multiplikatywn
multiplikatywn
e
e
*
*
Mnożenie
Mnożenie
/
/
Dzielenie
Dzielenie
%
%
Reszta z
Reszta z
dzielenia
dzielenia
Np.
c=a*b;
d=a/b;
e=a+b;
f=a-b;
g=a%b; // (13%2
wynik 1)
OPERATORY ARYTMETYCZNE
cd
Operatory zwiększania
(inkrementacji) i zmniejszania
(dekrementacji)
Dekrement
Dekrement
acja
acja
Inkrementa
Inkrementa
cja
cja
Przedrostk
Przedrostk
owy
owy
--
--
x
x
++
++
x
x
Przyrostko
Przyrostko
wy
wy
x
x
--
--
x
x
++
++
Operatory przedrostkowe najpierw
zwiększają (++) lub zmniejszają
(--) wartość zmiennej o 1 a
następnie ją przypisują
Np.
int m=3, n=1,r;
r=(m++)+(++n); // zmienna r
=5
//dla
r=(++m)+(++n); // zmienna r
=6
OPERATORY RELACYJNE
OPERATO
OPERATO
R
R
ZNACZENIE
ZNACZENIE
<
<
Mniejszy
Mniejszy
<=
<=
Mniejszy lub równy
Mniejszy lub równy
>
>
Większy
Większy
>=
>=
Większy lub równy
Większy lub równy
==
==
Równy
Równy
!=
!=
Nierówny
Nierówny
Np.
int a,b,xx;
a=10;
b=3;
xx=a>=b; // xx zostanie przypisana
wartość 1 (prawda)
OPERATORY LOGICZNE
OPERATO
OPERATO
R
R
ZNACZENIE
ZNACZENIE
!
!
Negacja
Negacja
&&
&&
Koniunkcja
Koniunkcja
||
||
Alternatywa
Alternatywa
Np.
int a,b,c,d;
a=1;
b=0;
c=a&&b; // c zostanie przypisana
wartość 0
d=a||b; // d zostanie przypisana
wartość 1
„0”
„1”
„0
”
„1”
koniunkcja
&&
(&)
alternatywa
||
(|)
Iloczyn
logiczny
„i”
Suma
logiczna
„lub”
OPERATORY BITOWE
OPERATO
OPERATO
R
R
ZNACZENIE
ZNACZENIE
&
&
Bitowa koniunkcja
Bitowa koniunkcja
|
|
Bitowa alternatywa
Bitowa alternatywa
^
^
Bitowa różnica
Bitowa różnica
symetryczna
symetryczna
~
~
Bitowa negacja
Bitowa negacja
<<
<<
Przesunięcie w lewo
Przesunięcie w lewo
>>
>>
Przesuniecie w prawo
Przesuniecie w prawo
Działają na uporządkowanym ciągu bitów, które
jak wiadomo przyjmują wartości 1 lub 0
Operator
Operator
y
y
przesunię
przesunię
cia
cia
OPERATORY PRZYPISANIA
OPERATOR
OPERATOR
ZASTOSOWANI
ZASTOSOWANI
E
E
ZNACZENIE
ZNACZENIE
=
=
a=b
a=b
a=b
a=b
+=
+=
a+=b
a+=b
a=a+b
a=a+b
-=
-=
a-=b
a-=b
a=a-b
a=a-b
*=
*=
a*=b
a*=b
a=a*b
a=a*b
/=
/=
a/=b
a/=b
a=a/b
a=a/b
%=
%=
a%=b
a%=b
a=a%b
a=a%b
<<=
<<=
a<<=b
a<<=b
a=a<<b
a=a<<b
>>=
>>=
a>>=b
a>>=b
a=a>>b
a=a>>b
&=
&=
a&=b
a&=b
a=a&b
a=a&b
|=
|=
a|=b
a|=b
a=a|b
a=a|b
^=
^=
a^=b
a^=b
a=a^b
a=a^b
Np.
int a=5,b=10,c=2;
a+=b; // zmienna
a=15
c*=b; // zmienna
c=20
OPERATOR WYLICZENIOWY
PRZECINKOWY
Operator
wyliczeniowy
(przecinkowy)
–
służy
do
utworzenia wyrażenia złożonego z
ciągu
wyrażeń
składowych
oddzielonych
przecinkami
(wyrażenia składowe oblicza się
od lewej do prawej). Wyrażenie
złożone
użyte
w
instrukcji
przypisania musi być ujęte w
nawiasy.
Np.
int a=1, b;
a+=10;
b=(a++,a+=10,a/2); //
zmienna b=11
Np.
int n=10, i=2, k=4, wynik;
wynik=(n-=i, k+=2, i*=5, i++); //
zmienne n=8, k=6 i=10, wynik=11
Typy danych w
C++
Typ danych
definiuje
zakres lub zbiór
dopuszczalnych wartości
dla stałej, zmiennej,
wyrażenia, funkcji oraz
zbiór dopuszczalnych
operacji wykonywanych na
tych wartościach. Określa
też format zapisu w
pamięci.
1.
Typy proste
(skalary)
-
arytmetyczne (całkowite i
rzeczywiste)
,
- wskaźnikowe,
- referencyjne.
Typy danych w
C++
2.
Typy
strukturalne
(złożone)
- tablice
,
- struktury,
- unie,
- klasy.
-
typ wyliczeniowy
,
-
typ void
,
Typy całkowite
(skończone , przeliczalne podzbiory zbioru liczb
całkowitych)
Słowa kluczowe określające typy całkowite
char
typ znakowy
int
typ całkowity
long
typ tzw.długich liczb
całkowitych
signed
liczby ze znakiem
short
typ tzw.krótkich
liczb całkowitych
unsigned
liczby bez znaku
Typy całkowite
(skończone , przeliczalne podzbiory zbioru liczb
całkowitych)
Typ
Typ
Rozmiar
Rozmiar
w bitach
w bitach
min
min
max
max
unsigned
unsigned
char
char
8, jeden
8, jeden
znak
znak
0
0
255
255
char,
char,
signed
signed
char
char
8, jeden
8, jeden
znak
znak
-128
-128
127
127
int, signed
int, signed
int
int
16
16
-32768
-32768
32767
32767
unsigned
unsigned
int
int
16
16
0
0
65535
65535
long
long
unsigned
unsigned
int
int
32
32
0
0
4294967
4294967
295
295
long
long
signed int
signed int
32
32
-
-
2147483
2147483
648
648
2147483
2147483
647
647
char a, b=’F’;
int x, y=2;
long k;
inicjowanie
składnia
typ całkowity identyfikator[=wartość zainicjowana
Deklaracje
i
inicjacja
zmiennych całkowitych
Typy rzeczywiste
(skończone , przeliczalne
podzbiory zbioru liczb
rzeczywistych)
Typ
Typ
Rozmi
Rozmi
ar w
ar w
bitach
bitach
min
min
max
max
Liczba
Liczba
znaczący
znaczący
ch cyfr
ch cyfr
float
float
32
32
3.4E-38
3.4E-38
3.4E38
3.4E38
6
6
double
double
64
64
1.7E-
1.7E-
308
308
1.7E30
1.7E30
8
8
15
15
long
long
double
double
80
80
3.4E-
3.4E-
4932
4932
1.1E49
1.1E49
32
32
18
18
Typy rzeczywiste
(skończone , przeliczalne podzbiory zbioru liczb
rzeczywistych)
Pojęcie znaczących cyfr
Pojęcie znaczących cyfr
Liczbę rzeczywistą w pamięci komputera
Liczbę rzeczywistą w pamięci komputera
zapisuje się w postaci dwóch liczb (mantysa,
zapisuje się w postaci dwóch liczb (mantysa,
cecha)
cecha)
L=mantysa*10
L=mantysa*10
cecha
cecha
Dla
Dla
float
float
liczba 1254986719873674.678
liczba 1254986719873674.678
zostanie zapisana w 0.125498 E16
zostanie zapisana w 0.125498 E16
A więc zostanie zaokrąglona do
A więc zostanie zaokrąglona do
wartości: 1254980000000000
wartości: 1254980000000000
float a, b=123.16e10;
double x, y=-145.67;
long double k;
inicjowanie
składnia
typ rzeczywisty identyfikator[=wartość
zainicjowana
Deklaracje i inicjacja zmiennych
rzeczywistych
Typy strukturalne
to uporządkowane,
wspólne zbiory
obiektów tego
samego lub różnego
typu
2.
Typy
strukturalne
(złożone)
-
tablice
- struktury
- unie
- klasy
Zmienne zdolne do przechowywania
więcej niż jednej wartości
jednocześnie nazwano zmiennymi
strukturalnymi (agregatami danych)
Tablica to ciąg obiektów (grupa zmiennych) tego
Tablica to ciąg obiektów (grupa zmiennych) tego
samego typu, które zajmują ciągły obszar w pamięci
samego typu, które zajmują ciągły obszar w pamięci
Korzyść – zamiast nazywania każdej zmiennej
Korzyść – zamiast nazywania każdej zmiennej
osobno wystarczy powiedzieć odnoszę się do n-
osobno wystarczy powiedzieć odnoszę się do n-
tego elementu tablicy
tego elementu tablicy
Jeśli chcesz mieć 20 zmiennych typu int, to
Jeśli chcesz mieć 20 zmiennych typu int, to
zbuduj tablicę:
zbuduj tablicę:
int a[20] ;
int a[20] ;
Definicja rezerwuje w pamięci miejsce dla 20 liczb
Definicja rezerwuje w pamięci miejsce dla 20 liczb
typu int
typu int
Rozmiar tak definiowanej tablicy musi być stałą,
Rozmiar tak definiowanej tablicy musi być stałą,
znaną już w trakcie kompilacji. Kompilator musi
znaną już w trakcie kompilacji. Kompilator musi
już wtedy wiedzieć ile miejsca ma zarezerwować
już wtedy wiedzieć ile miejsca ma zarezerwować
na tablicę
na tablicę
Rozmiar tablicy nie może być ustalony w
Rozmiar tablicy nie może być ustalony w
trakcie pracy programu (dynamiczna alokacja
trakcie pracy programu (dynamiczna alokacja
tablicy)
tablicy)
cout << ”Jaki chcesz rozmiar tablicy?” ;
cout << ”Jaki chcesz rozmiar tablicy?” ;
int rrr ;
int rrr ;
cin >>rrr ;
cin >>rrr ;
int a[rrr] ;
int a[rrr] ;
//Błąd !!!
//Błąd !!!
Jak należy rozumieć deklarację tablicy - definicja w komentarzu
char zdanie [80] ;
//zdanie jest
tablicą 80
//elementów typu char
float numer [9] ;
//numer jest tablicą
//9 elementów typu float
int *wskaz [20] ;
//wskaz jest tablicą 20 elementów
//będących wskaźnikami (adresami)
//jakichś obiektów typu int
Wartość rrr jest jeszcze - w czasie kompilacji
nieznana
Tablice można tworzyć
Tablice można tworzyć
z:
z:
Typów fundamentalnych (z wyjątkiem void)
Typów fundamentalnych (z wyjątkiem void)
Typów wyliczeniowych (enum)
Typów wyliczeniowych (enum)
Wskaźników
Wskaźników
Innych tablic
Innych tablic
oraz, o czym później
oraz, o czym później
Z obiektów typu definiowanego (czyli
Z obiektów typu definiowanego (czyli
klasy)
klasy)
Ze wskaźników do pokazywania na
Ze wskaźników do pokazywania na
składniki klasy
składniki klasy
Typy tablicowe
Struktura danych zawierająca uporządkowany
zbiór obiektów tego samego typu - odpowiada
matematycznemu pojęciu wektora, macierzy
itd.
Zasady tworzenia tablic:
- każdy element tablicy ma przydzieloną
swoją „skrzynkę” pamięci o unikalnym
numerze (indeksie) od 0 - n
- wszystkie elementy tablicy muszą być
tego samego typu
- tablica ma jedną wspólną dla wszystkich
elementów nazwę
Tablica jednowymiarowa -
wektor
1
1
2
2
3
3
4
4
5
5
6
6
7
7
23
23
4
4
25
25
1
1
67
67
8
8
5
5
34
34
0
0
1
1
2
2
3
3
4
4
5
5
6
6
Numer elementu
tablicy
Wartości
poszczególnych
elementów tablicy
Indeks elementu
tablicy
1
1
2
2
3
3
4
4
5
5
6
6
7
7
D
D
o
o
r
r
o
o
t
t
k
k
a
a
0
0
1
1
2
2
3
3
4
4
5
5
6
6
1
1
2
2
3
3
4
4
5
5
12.1
12.1
0.78
0.78
2.3
2.3
2.0
2.0
12.7
12.7
8
8
0
0
1
1
2
2
3
3
4
4
Indeks
elementu tablicy określa jak daleko,
licząc od początku tablicy jest
przesunięty dany element
Zasady indeksowania elementów tablic
-elementy tablicy wskazujemy za pomocą
indeksów,
-indeksy numerujemy od 0,
-numer elementu tablicy nie odpowiada
jego indeksowi
C++
domyślnie
liczy
zaczynając
od 0
Deklaracja tablic
jednowymiarowych
float
tablica1
[5]
;
Nazwa –
identyfikator
tablicy
Typ danych
każdego
elementu
tablicy
Rozmiar tablicy–
liczba elementów
tablicy
1
1
2
2
3
3
4
4
5
5
12.1
12.1
0.78
0.78
2.3
2.3
2.0
2.0
12.7
12.7
8
8
0
0
1
1
2
2
3
3
4
4
Elementy tablicy:
tablica1[0] tablica1 [1] tablica1 [2] tablica1 [3]
tablica1 [4]
element
tablica1 [5] – nie istnieje
wpisanie czegoś
do tego elementu nie jest sygnalizowane jako błąd – nie jest to
sprawdzane, następuje zniszczenie czegoś co jest w pamięci
bezpośrednio za tablicą
float tablica1 [5] ;
int z ;
podczas próby zapisu czegoś do elementu
tablica1 [5]
tablica1 [5]
= 15
= 15
zostanie zniszczona treść zmiennej z, bo akurat została
zostanie zniszczona treść zmiennej z, bo akurat została
umieszczona w pamięci bezpośrednio za tablicą
umieszczona w pamięci bezpośrednio za tablicą
tablica1
w pętlach wyczytywania lub wpisywania najlepiej stosować zapis z
miękką nierównością
:
for (i=0 ; i<rozmiar ; i++) ...
zamiast z
zamiast z
twardą nierównością
twardą nierównością
for (i=0 ; i<=rozmiar-1 ; i++) …
for (i=0 ; i<=rozmiar-1 ; i++) …
Dostęp, wprowadzanie i
wyprowadzanie elementów
tablicy jednowymiarowej
for (int i=0; i<10; i++)
{
cout<<„podaj kolejny element
tablicy”;
cin>>tab1[i];
}
Wprowadzenie
elementów
tablicy tab1
for (int i=0; i<10; i++)
{
cout<<„tab1[„<<i<<„]=”<<tab1[i
]<<endl;
}
Wyprowadzenie
elementów
tablicy tab1
tab1[2];
Dostęp do 3 elementu tablicy
tab1
0
0
23
23
34
34
45
45
5
5
4
4
0
0
4
4
0
0
6
6
34
34
4
4
45
45
1
1
34
34
45
45
0
0
56
56
8
8
8
8
2
2
34
34
6
6
7
7
0
0
0
0
8
8
3
3
23
23
4
4
25
25
1
1
67
67
8
8
5
5
4
4
0
0
1
1
2
2
3
3
4
4
5
5
Tablica dwuwymiarowa -
macierz
Indeks wiersza
tablicy
Wartości
poszczególnych
elementów tablicy
Indeks kolumny
tablicy
Deklaracja tablic
dwuwymiarowych
float tab2 [5]
[6];
nazwa –
identyfikator
tablicy
typ danych
każdego
elementu
tablicy
liczba kolumn
tablicy
liczba wierszy
tablicy
Dostęp, wprowadzanie i
wyprowadzanie elementów
tablicy dwuwymiarowej
for (int i=0; i<5; i++)
for (int j=0; j<6; j+
+)
cin>>tab2[i]
[j];
Wprowadzenie
elementów
tablicy tab2
for (int i=0; i<10; i++)
for (int j=0; j<6; j++)
cout<<tab2[i]
[j]<<endl;
Wyprowadzenie
elementów
tablicy tab2
tab2[0]
[0];
Dostęp do 1 elementu tablicy
tab2
o indeksie 00
Inicjowanie wartości
początkowych elementów
tablic
int
tab[4]={45,56,5,8};
lub
int tab[]={45,56,5,8};
int tabela[2][4]={
{45,56,5,8}
{4,6,78,6}
};
lub
int tabela[2]
[4]={45,56,5,8,4,6,78,6};
//
Wyprowadzenie liczb w odwrotnej kolejności
#include <iostream.h>
#define nmax 10
main()
{
int tab[nmax], n,i;
cout<<”podaj
liczbe
elementow
tablicy”<<endl;
cin>>n;
cout<<”Podaj liczby”<<endl;
for (i=0; i<n; i++)
cin>>tab[i];
cout<<”Liczby
w
odwrotnej
kolejnosci”<<endl;
for (i=n-1; i>=0; i--)
cout<<tab[i]<<endl;
}
Rzeczywistość jest co najmniej
trójwymiarowa a nawet
n-
wymiarowa
0
0
23
23
34
34
45
45
5
5
4
4
0
0
4
4
0
0
6
6
34
34
4
4
45
45
1
1
34
34
45
45
0
0
56
56
8
8
8
8
2
2
34
34
6
6
7
7
0
0
0
0
8
8
3
3
23
23
4
4
25
25
1
1
67
67
8
8
5
5
4
4
0
0
1
1
2
2
3
3
4
4
5
5
2
2
45
45
3
3
4
4
40
40
0
0
4
4
0
0
4
4
0
0
6
6
34
34
4
4
45
45
1
1
34
34
45
45
0
0
56
56
8
8
8
8
2
2
34
34
6
6
7
7
0
0
0
0
8
8
3
3
23
23
4
4
25
25
1
1
67
67
8
8
5
5
4
4
0
0
1
1
2
2
3
3
4
4
5
5
1
1
0
0
23
23
34
34
45
45
5
5
4
4
0
0
4
4
0
0
6
6
34
34
4
4
45
45
1
1
34
34
45
45
0
0
56
56
8
8
8
8
2
2
34
34
6
6
7
7
0
0
0
0
8
8
3
3
23
23
4
4
25
25
1
1
67
67
8
8
5
5
4
4
0
0
1
1
2
2
3
3
4
4
5
5
0
0
int lib[5][6][3]
[10];
int book[5]
[6][3];
Tablice znakowe
Każdy znak alfanumeryczny ma swą
Każdy znak alfanumeryczny ma swą
reprezentację liczbową w kodzie
reprezentację liczbową w kodzie
ASCII
ASCII
Aby odróżnić ciąg znaków (liter) od
Aby odróżnić ciąg znaków (liter) od
innych kończy się go znakiem o
innych kończy się go znakiem o
kodzie \0 - NULL i wtedy mówimy, że
kodzie \0 - NULL i wtedy mówimy, że
jest to
jest to
string
string
Rozmiar stringu jest zawsze większy o 1 (długość
Rozmiar stringu jest zawsze większy o 1 (długość
– liczba liter+
– liczba liter+
\0
\0
- znak pusty, null
- znak pusty, null
w C++ teksty (łańcuchy znaków)
przechowuje się w tablicach typu char
char tekst
[101];
char *tekst="Dowolny";
zadeklarowano
„wskaźnik(*) tekst”
wskazujący na początek podanego tekstu
Deklaracja tablicy na tekst
składający się z maksymalnie
100 znaków
char tekst [ ]
="Dowolny";
char tekst [8]="Dowolny";
Inicjowanie tablic znaków
char tekst [ ]
={'D','o','w','o','l','n','y','\0'};
Przykład:
Przykład:
char t1[1] = { ”a” } ; //
char t1[1] = { ”a” } ; //
błąd string (\0) to drugi element
błąd string (\0) to drugi element
char t2[1] = { ’a’ } ; //ok. wpisujemy tylko 1 literę
char t2[1] = { ’a’ } ; //ok. wpisujemy tylko 1 literę
Warto zapamiętać
Tablica składa się z elementów tego
samego typu,
Tablica dwuwymiarowa ma wiersze i
kolumny,
Tablica trójwymiarowa ma wiersze
(wysokość), kolumny (szerokość) i
stronice (głębokość),
Tablice deklarujemy jak zwykłe
zmienne proste (long tablica[3][5][4];),
Wymiary tablicy powinny być
zdefiniowane jako stałe,
Do elementu tablicy odwołujemy się
za pomocą współrzędnych (
indeksów
),
Warto zapamiętać
Można inicjować elementy tablicy
podczas deklaracji tej tablicy (int
t[2]={4,6};),
Przy wprowadzaniu (cin) i
wyprowadzaniu (cout) elementów tablic
wykorzystujemy tyle pętli „for” ile
wymiarów posiada dana tablica,
W C++ tablica znakowa jest
interpretowana jako łańcuch znaków,
czyli string,
Teoretycznie możemy tworzyć tablice
o dowolnie dużej ilości niezależnych
(ortogonalnych) wymiarów. Dla każdego
dodatkowego wymiaru musimy
zastosować kolejną współrzędną.
1.
Typy proste
(skalary)
-
arytmetyczne (całkowite i
rzeczywiste),
- wskaźnikowe,
- referencyjne.
Typy danych w
C++
2.
Typy
strukturalne
(złożone)
- tablice,
- struktury,
- unie,
- klasy.
-
typ wyliczeniowy
,
-
typ void
,
- typ
wyliczeniowy
Służy
do
deklarowania
grupy
stałych
całkowitych
w
zwarty
sposób
(chcemy
przechować nie tyle liczbę co informację
liczbową)
Stałe otrzymują domyślnie kolejne wartości
całkowite poczynając od 0
Składnia
enum {stała1, stała2, stała3, ..., stałan};
wartość=
0
1 2
n
np. enum {ford, fiat, opel, mercedes};
enum {stała1=10, stała2, stała3, ...,
stałan};
Kolejne przyjmą wartości 11 12 itd.
Chcemy za pomocą liczb określać jakieś działanie układu
Chcemy za pomocą liczb określać jakieś działanie układu
pomiarowego
pomiarowego
Zmienna o nazwie
Zmienna o nazwie
co_robic.
co_robic.
Do niej będziemy wstawiali liczbę
Do niej będziemy wstawiali liczbę
określająca żądaną
określająca żądaną
akcję
akcję
.
.
0
0
start_pomiaru
start_pomiaru
1
1
odczyt_pomiaru
odczyt_pomiaru
54
54
zmiana_probki
zmiana_probki
55
55
zniszczenie_probki
zniszczenie_probki
Typ wyliczeniowy
definiuje się wg schematu:
enum akcja {
start_pomiaru = 0
odczyt_pomiaru = 1
zmiana_probki = 54
zniszczenie_probki = 55 } ;
Zdefiniowaliśmy nowy typ o nazwie
Zdefiniowaliśmy nowy typ o nazwie
akcja.
akcja.
A oto definicja zmiennej tego
A oto definicja zmiennej tego
typu:
typu:
akcja co_robic ;
akcja co_robic ;
(
(
co_robic
co_robic
jest zmienną, do której można podstawić
jest zmienną, do której można podstawić
tylko
tylko
tę, jedną
tę, jedną
z wartości określonych w liście wyliczeniowej)
z wartości określonych w liście wyliczeniowej)
operacje legalne:
operacje legalne:
operacje nielegalne:
operacje nielegalne:
co_robic = zmiana_probki ;
co_robic = zmiana_probki ;
co_robic = 1 ;
co_robic = 1 ;
co_robic = start_pomiaru ;
co_robic = start_pomiaru ;
co_robic = 4 ;
co_robic = 4 ;
Dzięki temu nawet przez nieuwagę nie wpiszemy do
Dzięki temu nawet przez nieuwagę nie wpiszemy do
zmiennej czegoś innego, niż z listy, nawet jeśliby by coś
zmiennej czegoś innego, niż z listy, nawet jeśliby by coś
pasowało jako wartość liczbowa
pasowało jako wartość liczbowa
-
typ wyliczeniowy i
zmienne
Składnia (definicja nowego typu i jego zmiennych)
enum
nowy_typ
{stała1, stała2, ..., stałan} zm_1,
zm_2=stała2;
nazwa
nowy typ
lista stałych wyliczeniowych
zmienne
nowego typu
z inicjacją
Np.
enum miesiac {styczen, luty, marzec, kwiecień, maj, czerwiec,
lipiec};
miesiac x=luty;
enum boolean {falsz, prawda} nie=fałsz, tak=prawda;
boolean
- typ zmiennej przechowujący wartość logiczną True (prawda) lub False (fałsz).
Jest to jeden z czterech predefiniowanych typów boolowskich (Boolean,
,
,
). Powinno używać się właśnie typu Boolean, pozostałe trzy
zapewniają kompatybilność z innymi językami i bibliotekami systemu operacyjnego.
- typ void
(próżny)
Słowo to stoi w miejscu gdzie normalnie stawia się
nazwę typu
Typ, który posiada pusty zbiór wartości
Użyteczny szczególnie w zastosowaniu do
funkcji, które nie zwracają żadnej wartości
void *p ;
wskaźnik
p
do
wskazywania na
obiekt nieznanego typu
void funkcja ( ) ;
deklaracja mówi, że
funkcja nie będzie zwracać żadnej wartości
1.
Typy proste
(skalary)
- arytmetyczne (całkowite i
rzeczywiste)
- wskaźnikowe,
- referencyjne.
Typy danych w
C++
2.
Typy
strukturalne
(złożone)
- tablice,
- struktury,
- unie,
- klasy.
- typ wyliczeniowy,
- typ void
Typ wskaźnikowy
(wskaźnik)
Wskaźnik (
zmienna wskazująca
)
to
zmienna
zawierająca
adres
początku
obszaru
pamięci,
w
którym zapamiętane są wskazywane
dane
czyli
wartością
wskaźnika jest
adres
zmiennej
FF00
wskaźnik i
jego
wartość
(zawartość)
Typ wskaźnikowy
(wskaźnik)
wartością wskaźnika jest adres zmiennej
dane
F
F
0
0
miejsce w pamięci
począwszy od
bajtu o nr FF00
zawierające dane
Deklarowanie
zmiennej wskaźnikowej
(deklarowanie wskaźnika)
int
*numer;
Została zadeklarowana zmienna
numer
, która wskazuje
dane typu
int
* operator wskazania
(wyłuskania)
Deklarowanie zmiennej
wskaźnikowej
(deklarowanie wskaźnika)
Aby zmienna wskazująca podawała
adres konkretnej zmiennej, na którą
ma on wskazywać należy użyć
operatora adresowego (referencji) &,
który przypisze odpowiedni adres
zmiennej
numer=&zmien
na;
& operator adresu
(referencji)
A tak wygląda przypisanie adresu zmiennej znakowej a,
A tak wygląda przypisanie adresu zmiennej znakowej a,
do wskaźnika znakowego b:
do wskaźnika znakowego b:
char a ;
char a ;
char* b ;
char* b ;
b = &a
b = &a
;
;
//
//
ustawienie wskaźnika na obiekt a
ustawienie wskaźnika na obiekt a
Operator & oznacza adres zmiennej obok niej stojącej (po prawej
Operator & oznacza adres zmiennej obok niej stojącej (po prawej
stronie). Od teraz gdy zmienimy wartość b, zmienimy automatycznie
stronie). Od teraz gdy zmienimy wartość b, zmienimy automatycznie
wartość a, i odwrotnie
wartość a, i odwrotnie
Ważne:
Ważne:
Do wartości wskaźnika odnosimy się poprzedzając go gwiazdką
Do wartości wskaźnika odnosimy się poprzedzając go gwiazdką
Do adresu wskaźnika odnosimy się samą nazwą (bez gwiazdki)
Do adresu wskaźnika odnosimy się samą nazwą (bez gwiazdki)
nie powinniśmy się nim (wskaźnikiem) posługiwać, jeżeli nie
nie powinniśmy się nim (wskaźnikiem) posługiwać, jeżeli nie
przypiszemy mu żadnego adresu, lub adres NULL (czyli zerowy),
przypiszemy mu żadnego adresu, lub adres NULL (czyli zerowy),
gdyż może się to skończyć błędem, którego nie zasygnalizuje
gdyż może się to skończyć błędem, którego nie zasygnalizuje
nam kompilator
nam kompilator
Wskaźnik służący do pokazywania na obiekty jednego typu nie
Wskaźnik służący do pokazywania na obiekty jednego typu nie
nadaje się do pokazywania na obiekty innego typu
nadaje się do pokazywania na obiekty innego typu
(wyjątek od tej reguły przy dziedziczeniu)
(wyjątek od tej reguły przy dziedziczeniu)
Napisz
program,
w
którym
zadeklarujesz wskaźnik do pewnej
zmiennej oraz przypiszesz mu
odpowiedni adres.
Następnie
spraw,
aby
wartość
zmiennej
została
wypisana
na
ekranie na dwa sposoby:
1. poprzez bezpośrednie odniesienie
do zmiennej
2. poprzez wskaźnik
Spraw również, aby na ekranie
został wypisany adres zmiennej (na
dwa sposoby)
#include <iostream.h>
#include <conio.h>
int ala=155; //
deklaracja i inicjacja zwykłej zmiennej
ala
int *zyga; //
deklaracja wskaźnika
main()
{
clrscr();
zyga=&ala; //
inicjacja wskaźnika by wskazywał adres
zmiennej ala
cout<<"Wzrost Ali="<<ala<<endl;
cout<<"Wzrost Ali wg Zygi: "<<*zyga<<endl;
cout<<"Adres Ali="<<&ala<<endl;
cout<<"Adres Ali wg Zygi: "<<zyga<<endl;
getch();
return 0;
}
Wzrost Ali=155
Wzrost Ali wg Zygi=155
Adres Ali: 0x8f9304ce
Adres Ali wg Zygi: 0x8f9304ce
0x…-heksadecymalny
0…-oktalny
Typ referencyjny (odniesienie)
Typ referencyjny określany czasem jako
odniesienie, służy do wprowadzenia dodatkowej
nazwy dla obiektu użytego w definicji jako wartość
początkowa
Zmienne typu referencyjnego służą do reprezentacji
innych zmiennych w programie
czyli
wartością zmiennej typu referencyjnego jest inna
zmienna
Zmienne typu referencyjnego w praktyce
służą do przekazywania parametrów do
funkcji oraz zwracania wartości funkcji
Deklarowanie zmiennej
referencyjnej
int x,
&rx=x;
typ zmiennej referencyjnej i zmiennej
nazwa zmiennej
operator i nazwa zmiennej referencyjnej
inicjacja
zmiennej referencyjnej
Deklaracja zmiennej referencyjnej
musi być połączona z jej inicjacją
Deklarowanie zmiennej
referencyjnej
double pos=56, &r_pos=pos;
zmienna referencyjna r_pos związana
ze zmienną pos
int i, n=10, &ri=n;
ri=n;
zmienna referencyjna ri związana ze zmienną i
przyjmuje wartość 10
float x=10f;
int &r_licz=x;
zmienna referencyjna r_licz jest zmienną typu
całkowitego
Ważne:
Ważne:
Przed nazwą zmiennej typu referencyjnego znak &
Przed nazwą zmiennej typu referencyjnego znak &
Gdyby opuścić &, powstałaby zwykła zmienna
Gdyby opuścić &, powstałaby zwykła zmienna
Zmienna typu referencyjnego musi być natychmiast
Zmienna typu referencyjnego musi być natychmiast
inicjowana
inicjowana
Wartość zmiennej i wartość referencji do tej zmiennej
Wartość zmiennej i wartość referencji do tej zmiennej
jest taka sama
jest taka sama
Jeśli w trakcie działania programu zmienimy wartość
Jeśli w trakcie działania programu zmienimy wartość
zmiennej? - Wtedy wartość referencji będzie
zmiennej? - Wtedy wartość referencji będzie
odpowiadała nowej wartości zmiennej
odpowiadała nowej wartości zmiennej
Jeśli zmienimy wartość referencji, wówczas zostanie
Jeśli zmienimy wartość referencji, wówczas zostanie
zmieniona wartość zmiennej, do której odnosi się
zmieniona wartość zmiennej, do której odnosi się
referencja a także wartość wszystkich innych
referencja a także wartość wszystkich innych
referencji
referencji
Typ referencyjny -
ograniczenia
Nie wolno konstruować:
- referencji do referencji
float
&℞
- wskaźników zmiennych referencyjnych
int
&*wsk_ref;
- tablic referencji
double
&_ref[100];
Wskaźniki i tablice
W języku C++ istnieje ścisła zależność pomiędzy
wskaźnikami i tablicami
Każda operacja na zmiennej indeksowanej może być
wykonana za pomocą wskaźników (za pomocą wskaźników
operacje są wykonywane szybciej)
Podczas kompilacji nazwa tablicy jest automatycznie
przekształcana na wskaźnik jej pierwszego elementu
(nazwa tablicy jest równocześnie adresem jej początku)
Ale także:
wskaźniki w funkcjach mogą zmieniać wartość
przysyłanych do nich argumentów
Dają dostęp do specjalnych komórek pamięci
Rezerwują obszary pamięci
tab[ ]
kompilacja
wtab=tab
równoważne
wtab=&tab[0]
stała wskaźnikowa (nazwa tablicy)
zmienna wskaźnikowa
Zmienna wskaźnikowa może ulegać zmianie :
działanie
wtab=wtab+1
zmienia wskazanie na
wtab=&tab[1]
„Mechanika ruchu wskaźnika”
Mamy definicje:
int *wskaznik ;
//def. wskaznika
int tablica [10] ;
//def.tablicy
To instrukcja
wskaznik = & tablica [n] ;
//ustawienie
wskaznika
-wskaźnik ustawia się na elemencie tablicy o
indeksie
n
(int)
Wydruk tablicy
tab
przy użyciu wskaźników
#include <iostream.h>
#include <conio.h>
main()
{
clrscr();
int tab[]={0,1,2,3,4,5,6,7,8,9},*wtab;
wtab=tab;
//
lub wtab=&tab[0] poniewaz
tab==&tab[0];
for (int i=0;i<10;i++)
cout<<"tab["<<i<<"]="<<*wtab++<<endl;
getch();
return 0;
}
tab[0]=
0
tab[1]=
1
tab[2]=
2
tab[3]=
3
tab[4]=
4
tab[5]=
5
tab[6]=
6
tab[7]=
7
tab[8]=
8
tab[9]=
9
Kopiowanie tablicy tab1 do tab2 przy użyciu
wskaźników
#include <iostream.h>
#include <conio.h>
main()
{
clrscr();
int tab1[]={0,1,2,3,4,5,6,7,8,9},*wtab1,tab2[10],*wtab2;
wtab1=tab1;
//lub wtab1=&tab1[0] poniewaz
tab1==&tab1[0];
wtab2=tab2;
//lub wtab2=&tab2[0] poniewaz
tab2==&tab2[0];
while (wtab2<&tab2[9])
*wtab2++=*wtab1++;
for (int i=0;i<10;i++)
cout<<"tab2["<<i<<"]="<<*wtab2++<<endl;
getch();
return 0;
}
Wskaźniki i tablice znaków
(łańcuchy)
W języku C++ wszystkie operacje na łańcuchach
są wykonywane za pomocą wskaźników do znaków
łańcucha
Przypomnienie:
łańcuch jest ciągiem znaków zakończonych
znakiem '\0'
z tych powodów należy deklarować łańcuchy
char *tekst="ZABAWA";
char tekst[ ]="ZABAWA";
char *tekst="ZABAWA";
wtekst=&tekst[0];
//wtekst=tekst;
wtekst=wtekst+1;
//wtekst=&tekst[1]; czyli
*wtekst == 'A'
Kopiowanie łańcucha ze zmiennymi
indeksowanymi
#include <iostream.h>
#include <conio.h>
#include <string.h>
main()
{
clrscr();
char start[]="ABCD1111", cel[]="EFGH2222";
int i=0;
cout<<"Lancuch cel przed kopiowaniem: "<<cel<<endl;
for (i=0;i<strlen(start);i++)
//while ((cel[i]=start[i])!='\0')
cel[i]=start[i];
//i++;
cout<<"Lancuch cel po kopiowaniu: "<<cel<<endl;
getch();
return 0;
}
Kopiowanie łańcucha przy użyciu wskaźników
#include <iostream.h>
#include <conio.h>
main()
{
clrscr();
char *start="ABCD1111", *cel="EFGH2222", *pomoc=cel;
cout<<"Lancuch cel przed kopiowaniem: "<<cel<<endl;
while (*cel++=*start++)
;
//cel=cel-9;
cout<<"Lancuch cel po kopiowaniu: "<<pomoc<<endl;
//<<cel<<
getch();
return 0;
}