background image

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

background image

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

background image

np. 

nazwa, Andrzej, 

funkcja, funkcja_X, X1, x1 

różne identyfikatory:

ANDRZEJ,   Andrzej,    
AndrzeJ

background image

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

 

background image

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

background image

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 

background image

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”)

background image

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``;

background image

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

background image

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(); 

background image

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;

background image

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 

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; 

background image

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>

background image

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++;

background image

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

background image

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

background image

Np. 
c=a*b;
d=a/b;
e=a+b;
f=a-b;
g=a%b;    // (13%2   
wynik 1)

background image

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ą 

background image

Np.

 

int m=3, n=1,r;
r=(m++)+(++n);   // zmienna r 
=5
//dla
 r=(++m)+(++n);  // zmienna r 
=6

background image

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

background image

Np. 
int a,b,xx;
a=10;
b=3;
xx=a>=b; // xx zostanie przypisana 
wartość 1 (prawda) 

background image

OPERATORY LOGICZNE

OPERATO

OPERATO

R

R

ZNACZENIE

ZNACZENIE

!

!

Negacja

Negacja

&&

&&

Koniunkcja

Koniunkcja

||

||

Alternatywa

Alternatywa

background image

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” 

background image

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

przesunię

przesunię

cia

cia

background image

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

background image

Np.

int a=5,b=10,c=2;

a+=b; // zmienna 
a=15
c*=b; // zmienna 
c=20

background image

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 

instrukcji 

przypisania  musi  być  ujęte  w 
nawiasy.

background image

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

background image

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.

background image

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

,

background image

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

background image

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

background image

char a, b=’F’;

int x, y=2;

       long k;

                                         

inicjowanie

składnia

typ całkowity identyfikator[=wartość zainicjowana

Deklaracje 

inicjacja 

zmiennych całkowitych

background image

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

background image

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

background image

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

background image

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)

background image

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ę

background image

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

background image

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

background image

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ę 

background image

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

background image

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

background image

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ą 

background image

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++) …

background image

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

background image

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

background image

Deklaracja tablic 
dwuwymiarowych 

float tab2 [5]
[6]; 

nazwa – 

identyfikator 

tablicy

typ danych 

każdego 

elementu 

tablicy

liczba kolumn 

tablicy

liczba wierszy 

tablicy

background image

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

background image

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};

background image

// 

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 

odwrotnej 

kolejnosci”<<endl;

for (i=n-1; i>=0; i--)

cout<<tab[i]<<endl;

}

background image

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];

background image

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

background image

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ę

background image

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

),

background image

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ą.

background image

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

,

background image

- typ 
wyliczeniowy

Służy 

do 

deklarowania 

grupy 

stałych 

całkowitych 

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.  

background image

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

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.

background image

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

background image

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, 

ByteBool

WordBool

LongBool

). Powinno używać się właśnie typu Boolean, pozostałe trzy 

zapewniają kompatybilność z innymi językami i bibliotekami systemu operacyjnego.

    

background image

- 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 

do

 

wskazywania  na 

obiekt nieznanego typu

void  funkcja  (  )    ;       

deklaracja  mówi,  że 

funkcja nie będzie zwracać żadnej wartości 

background image

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

background image

Typ wskaźnikowy

(wskaźnik)

Wskaźnik  (

zmienna  wskazująca

to 

zmienna 

zawierająca 

adres 

początku 

obszaru 

pamięci, 

którym  zapamiętane  są  wskazywane 

dane

czyli

wartością 

wskaźnika jest

 adres 

zmiennej

 

background image

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

background image

Deklarowanie 

zmiennej wskaźnikowej

(deklarowanie wskaźnika)

int 

*numer;

Została zadeklarowana zmienna 

numer

, która wskazuje 

dane typu 

int

* operator wskazania 

(wyłuskania)

background image

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)

background image

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)

background image

Napisz 

program, 

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)

background image

#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

background image

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

background image

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ą

background image

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 

background image

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

 

 

background image

Typ referencyjny - 

ograniczenia

Nie wolno konstruować:

 

- referencji do referencji 

float 

&&rx;

- wskaźników zmiennych referencyjnych

int 

&*wsk_ref;

- tablic referencji

double 

&_ref[100];

background image

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

  

background image

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

 

(int)

background image

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

background image

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;

}

background image

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' 

background image

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;

}

background image

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;

}


Document Outline