C++ Wykład III 2006 2007 M Ch

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

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;

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

y

y

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

w

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

i

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

w

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

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.

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

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.

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

p

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,

w

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,

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)

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

n

(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


Wyszukiwarka

Podobne podstrony:
C++ Wykład IV 2006 2007 M Ch
Wyklad z ekonomiki 2006-2007, WZ-stuff, semestr 2, nauka o przedsiębiorstwie
Wstęp do socjologii - Wykłady Motak - 2006-2007, Religioznawstwo, Wstęp do socjologii
samorzad, WSB - III semestr - zaoczne - Administracja - lista studentów - 2006/2007 - prawo samorząd
zestawy-labC++-kolokwium 2 2006-2007, Politechnika Śląska MT MiBM, Semestr III, Języki programowania
Wykład 3.10.2006, studia, semestr III, prawo cywilne
C Wykład III 2005 2006 s
A Charakterystyka hodow bud etu 2006 pop, Finanse Publiczne, Wykład III
KPA wyklady 2006-2007, Historia sądownictwa administracyjnego
Wykłady 2006-2007 dr Brygida Kuźniak, PRAWO, ROK 3, Prawo ROK II - semestr I, ORGANIZACJE MIĘDZYNARO
III lek zagadnienia 2006 2007
III lek zagadnienia 2006 2007
Wykład III;28.10.2007, Uczelnia - notatki, dr Dorota Piontek

więcej podobnych podstron