background image

1

Wykład 2

• Typy i zmienne całkowite, reprezentacja danych  

całkowitych,  stałe całkowite

• Typy rzeczywiste, inicjacja zmiennych

rzeczywistych

• Typy i zmienne wskaźnikowe

Typ danej

to inaczej zbiór wartości jakie może przyjmować.

Typ danej determinuje również sposób jej przechowywania w
pamięci komputera i obszar jaki zajmuje (liczbę jednostek pamięci -
bajtów).
W języku C++ dostępne są

typy proste

i

strukturalne

.

Typy proste wykorzystuje się do tworzenia typów strukturalnych.

background image

2

Do kategorii prostych w języku C++ należą typy:

-

arytmetyczne całkowite i rzeczywiste,

-

wskaźnikowe,

W języku C++ występuje ponadto typ 

referencyjny

Typy strukturalne mogą składać się z typów prostych i innych
typów strukturalnych. Typami strukturalnymi w języku C++ są:

-

tablice

,

-

struktury

,

-

unie

,

-

klasy

.

Typ danej jest pojęciem logicznym. Reprezentantem fizycznym 
typu danej jest 

zmienna 

lub 

obiekt

.

background image

3

Typy i zmienne całkowite

.

Typy całkowite w C++ są skończonymi, przeliczalnymi
podzbiorami zbioru liczb całkowitych. Zmienne typów
całkowitych

deklaruje

się w programach za pomocą słów

kluczowych (lub ich kombinacji):

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

4

Wymienione słowa kluczowe łączy się dla oznaczenia różnych

kombinacji cech zmiennych.

Przykłady:
char a

;

signed char a

;

- zmienna znakowa a reprezentuje liczbę ze

znakiem plus lub minus

short k, m, n

;

short int k, m, n

;

short signed k, m, n

;

short signed int k, m, n

;

- zmienne k, m, n są liczbami

całkowitymi

krótkimi

ze znakiem

unsigned short q, ilosc

;

unsigned short int q, ilosc

; - zmienne q, ilosc są liczbami

całkowitymi

krótkimi

bez

znaku

int K[20]
signed int K[20]

; - tablica K zawiera liczby całkowite ze

znakiem

background image

5

unsigned _jakosc

;

unsigned int _jakosc

;

- zmienna 

_jakosc

jest liczbą

całkowitą bez znaku

long dlugosc, kat

;

long int dlugosc, kat

;

signed long int dlugosc, kat

;

- zmienne 

dlugosc, 

kat

są liczbami całkowitymi 

długimi

ze znakiem 

unsigned long szerokosc, x, y;

unsigned long int szerokosc, x, y

;

- zmienne 

szerokosc, x, y

są liczbami całkowitymi 

długimi

bez znaku

background image

6

Obszar zajmowany w pamięci oraz zakres wartości
zmiennych całkowitych zależą od sprzętu, systemu
operacyjnego, kompilatora, wreszcie typu wartości.

Przykładowo – w systemie programowania Borland C++

unsigned char

8 bitów

0

255

signed char

8 bitów

-128

127

unsigned int

16 bitów

0

65535

short signed int

16 bitów -32768

32767

signed int

16 bitów -32768

32767

long unsigned int

32 bity             0

4.294.967.295

long signed int

32 bity    -2.147.483.  648

2.147.483.647

background image

7

Inicjowanie

zmiennych polega na przypisaniu im początkowej

wartości.

Kompilator podczas tłumaczenia programu źródłowego nadaje
zmiennym wartości nieokreślone (przypadkowe). Sytuacja ta często
prowadzi do trudnych do wykrycia błędów wykonania. Zapobiec
temu może

inicjowanie zmiennych

przed ich pierwszym użyciem.

W języku C++ można tego dokonać wraz z

deklaracją

zmiennej.

Ma ona następującą postać ogólną:

typ-całkowity identyfikator [=stała-odpowiedniego-typu]

(2.1)

Uwaga ! Dalej w wyrażeniach przedstawiających postać ogólną
składni będziemy używać "metasymbolu" [ ] dla oznaczenia części
zdania, która może, ale nie musi wystąpić. Metasymbol { } będzie
oznaczać część definicji, która może wystąpić wiele razy.

background image

8

Przykłady deklaracji i inicjacji zmiennych znakowych:

char litera_A=65;

wartość dziesiętna kodu znaku A

char bubel=‘B’;

znak B

char Nowa_Linia=‘\n’;

znak sterujący - przejście do

następnej linii

char odstep16=‘\x20’;

znak o kodzie szesnastkowym 20 -

odstęp (spacja)

char odstep10=‘\32’;

znak o kodzie dziesiętnym 32 –

spacja

Zmiennym typu znakowego (char) nadaje się wartości (również

początkowe) podając wartość dziesiętną kodu znaku lub znak ujęty w
apostrofy.

Znaki sterujące

oraz znaki wykorzystywane przez język

C/C++ są kodowane w postaci \litera-lub-znak. Można również podać
wartość szesnastkową lub ósemkową kodu ASCII znaku.

background image

9

Znaki sterujące w C++

Sekwencja

Wartość 

hex

Nazwa 

znaku

Funkcja

\a

07

BEL

sygnał  dźwiękowy

\b

08

BS

cofnięcie  kursora  i usunięcie  znaku

\f

0C

FF

wysunięcie  strony  (ang.  Form Feed)

\n

0A

LF

przesunięcie  o 1 wiersz w dół  (ang.  Line 
Feed
)

\r

0D

CR

przesunięcie  kursora  na poczatek  linii  (ang.  
Carriage Return
)

\t

09

HT

tabulator  poziomy

\v

0B

VT

tabulator  pionowy

\\

5C

lewy ukośnik

\'

27

apostrof

\"

22

cudzysłów

\?

3F

znak zapytania

background image

10

Aby zainicjować zmienne typów int i long int należy

po znaku równości podać

liczbową stałą całkowitą

.

Może nią być:
· stała dziesiętna,
· stała ósemkowa (rozpoczynająca się od cyfry 0),
· stała szesnastkowa (rozpoczynająca się znakami 0x).

W podanym dalej przykładzie programu występują

deklaracje zmiennych całkowitych, ich inicjacje oraz
wywołania funkcji wyprowadzania do standardowego
urządzenia wyjściowego - monitora

.

background image

11

/* Przyklad programu, w ktorym wystepuja inicjacje zmiennych 

calkowitych i wyswietlanie ich wartosci */

#include <conio.h>

//Wiersze nr 3 i 4

#include <stdio.h>
int main
(void)       

// 5

{                                                                                          

char xA=65, mY='y';               

// 7

unsigned int x=12101, y=0121, z=0xfa;

// 8

short signed int q=-23409, r=11206; 

// 9

unsigned long dluga=234UL;                     

// 10

signed long int po_co=-567L;                   

// 11

clrscr();                                      

// 12

printf("\n Liczby: \n wartosc xA = %c  \n wartosc mY = %c", 

xA, mY);

// 13 i 14

printf("\n wartosc x = %u \n wartosc y = %o \n wartosc z = %x", 

x, y, z);         

// 15 i 16

printf("\n wartosc q = %d \n wartosc r = %d", q, r); 

// 17

printf("\n wartosc dluga = %lu \n po_co = %ld", dluga, po_co); 

// 18

getch(); 

// 19

clrscr();                                                                                
return 0;                                      

// 21

}

background image

12

Pierwsze 2 wiersze tekstu stanowią komentarz (łańcuch znaków pomiędzy /* i */ ).
Wiersze 3 i 4 - dyrektywy

include

preprocesora (poprzedza je znak #); polecają one

dołączyć w tym miejscu do tekstu programu pliki nagłówkowe

conio.h

oraz

stdio.h

. W

plikach tych znajdują

się

definicje

stałych

i symboli oraz

prototypy funkcji

odpowiedzialnych za obsługę konsoli (plik

conio.h

) oraz standardowego wejścia-wyjścia

(plik

stdio.h

). Znaki

< >

ograniczające nazwy tych plików oznaczają, że kompilator

powinien szukać tych zbiorów w specjalnym katalogu o nazwie INCLUDE stanowiącym
podkatalog katalogu, gdzie zlokalizowane są wszystkie elementy języka C/C++.
Ograniczniki

" "

nazw plików nagłówkowych polecają kompilatorowi szukać tych zbiorów

w bieżącej kartotece (tzw. katalogu roboczym).
Wiersz 5 zawiera deklarację (nagłówek) funkcji głównej

main

.

W wierszu 7 znajdują się deklaracje i inicjacje zmiennych całkowitych typu

char

.

Zmienną

xA

zainicjowano wartością dziesiętną kodu dużej litery A (wartość 65), a zmienną

mY

- znakiem y (wewnątrz maszyny jest on przechowywany jako liczba o wartości

dziesiętnej 121).
W wierszu 8 zadeklarowano i nadano wartości początkowe zmiennym

x

,

y

,

z

typu

całkowitego bez znaku; zmiennej x nadano wartość dziesiętna 12101, zmiennej

y

- wartość

81 zapisaną w postaci ósemkowej jako 0121; zmienna

z

będzie mieć wartość

odpowiadającą liczbie dziesiętnej 250; w wyrażeniu inicjującym wartość tą zapisano w
postaci szesnastkowej jako 0xfa.

background image

13

Wiersz 9 - deklaracja i inicjacja zmiennych

q

oraz

r

typu całkowitego krótkiego ze

znakiem. Nadano im wartości początkowe właściwe dla ich typów.

W wierszu 10 znajduje się deklaracja i inicjator zmiennej całkowitej długiej bez znaku

dluga

- nadano jej wartość początkową 234. Litery UL sygnalizują kompilatorowi, że

powinien on zapisać tą daną w pamięci w postaci właściwej dla typu

unsigned long

.

Zapobiega to ewentualnej zmianie sposobu zapisu w czasie wykonywania programu

.

W wierszu 11 zadeklarowano i zainicjowano zmienną całkowitą

po_co

typu

signed long

int

.

W wierszu 12 znajduje się

wywołanie funkcji standardowej clrscr()

; jej

prototyp

znajduje się w pliku nagłówkowym

conio.h

, a jej zadaniem jest oczyszczenie ekranu

monitora ze zbędnych napisów (pochodzacych np.

z poprzednio wykonywanego

programu) i ustawienie kursora w lewym górnym rogu.

Wiersze 13 - 18 zawierają wywołania funkcji standardowej

printf

odpowiedzialnej za

obsługę wyjścia z programu.

Funkcja

printf

obsługuje tzw.

wyjście formatowane

. Jest to funkcja o zmiennej liczbie

argumentów. Pierwszym jej argumentem musi być

łańcuch znaków

zawierający znaki

wyświetlane na ekranie oraz tzw.

kody formatujące

, które określają sposób

przedstawiania

danych

(sposób

tłumaczenia

wyświetlanych

danych

z

zapisu

wewnętrznego, zero-jedynkowego, na postać czytelną dla człowieka). Kolejne argumenty
tej funkcji to nazwy zmiennych wyprowadzanych.

background image

14

Wywołanie  funkcji 

printf

w wierszu 13 i 14 spowoduje wyświetlenie  napisu 

Liczby:.

W

następnym  wierszu pojawią się nazwy zmiennych 

xA

oraz  

mY

i ich  wartości (znaki  A  

oraz  y). Kody formatujące  są zastępowane  wartościami  zmiennych  użytych  jako 
kolejne  argumenty  funkcji.  Kod formatujący

%c

jest właściwy dla danych typu 

char

Kod

%u

oznacza konwersję na postać zewnętrzną liczby  całkowitej  bez znaku. 

Kod

%o

jest właściwy dla wartości  w postaci  ósemkowej,  a kod 

%x

odpowiada 

zmiennym  o wartościach  w postaci  szesnastkowej  (wiersz numer  15). 

Ciąg znaków 

%d

wykonuje konwersję na postać zewnętrzną liczb  dziesiętnych  (w tym 

przypadku  chodzi  o liczby  całkowite  krótkie  ze znakiem).

Wiersz 18 wyświetla wartości zmiennych 

dluga

oraz 

po_co

;  na ekranie  będą

poprzedzone  napisami  odpowiednio   

wartosc   dluga  =

oraz   

po_co =

. Kod 

formatujący   

%lu

odpowiada  konwersji  liczby  całkowitej  długiej  bez znaku, a łańcuch   

%ld

oznacza  polecenie  konwersji liczby  całkowitej  ze znakiem

W wierszu 19 wywołano funkcję

getch

, która "czeka"  na wpisanie  do bufora  klawiatury 

dowolnego znaku,  a następnie  odczytuje  i zwraca wartość jego kodu. Efektem  jest 
"zatrzymanie"  działania komputera  do momentu  naciśnięcia  dowolnego  klawisza.  W ten 
sposób możemy  odczytać z ekranu  wyniki  działania  programu. 

Instrukcja 

return  0

kończy  działanie  programu  i powoduje powrót do systemu 

operacyjnego  z kodem  błędu  o wartości 0.

Prototyp

funkcji 

printf

znajduje  się w pliku  nagłówkowym 

stdio.h

background image

15

Typy rzeczywiste  są nieciągłymi  podzbiorami  zbioru  liczb  rzeczywistych.  Ich rodzaje  i 
zakresy  wartości są następujące

:

Typ/słowo kluczowe

Rozmiar  w 

bitach

Zakres  od

Zakres  do

float

32

3,4*10

-

-38

3,4*10

38

double

64

1,7*10

-308

1,7*10

308

long double

80

3,4*10

-4932

1,1*10

4932

Kilka przykładów deklaracji i inicjacji zmiennych rzeczywistych:

float blad = -12.3e-2;

zmienna  blad ma wartość początkową
0,123

double x, y = 18., z = .11e11;

x

- nieokreślona,  y - wartość 18, z -

wartość 0,11*10

11

long double r_dluga = -0.304e-607L;

r_dluga

- wartość -0,304*10

-607

typu 

long double

float xc = 16.099e+32F;

xc

- wartość 16,099*10

32

background image

16

Wartości zmiennych rzeczywistych są standardowo przechowywane w

postaci właściwej dla typu

double

- podobnie jak w przypadku liczb

całkowitych, litery

F

,

f

,

L

,

l

umieszczane po liczbie w miejscu jej inicjacji

zapobiegają wykonywaniu konwersji.

W języku C/C++ można deklarować i używać zmienne, które zamiast

właściwej danej zawierają adres obszaru pamięci, najczęściej miejsca
przechowywania właściwej danej. Obszar ten może być interpretowany jako
zmienna określonego typu. Zmienna zawierająca adres innej zmiennej nosi
nazwę

zmiennej wskaźnikowej

lub krócej

wskaźnika

.

Zmienna, której adres zapisany jest w zmiennej wskaźnikowej to

zmienna

wskazywana

.

Wskaźniki w języku C++ są wygodnym i często używanym mechanizmem;

umożliwiają:
• tworzenie i przetwarzanie tzw.

dynamicznych struktur danych

,

• zarządzanie blokami pamięci, łańcuchami znaków i tablicami,
• przekazywanie parametrów do i z funkcji.

background image

17

/* Przyklad uzycia i dzialania zmiennych wskaznikowych */

#include <stdio.h>
#include <conio.h>
int main
(void)
{

char znak = 'y', *w_znak = &znak;

// w_znak - wskaznik, adres zmiennej znak

int numer = 113, *w_numer = &numer;

// w_numer - adres zmiennej numer

double rzecz = 13.077e21, *w_rzecz = &rzecz;

// w_rzecz - adres zmiennej rzecz

clrscr();
printf
("\n Wartosci zmiennych wskazywanych: \n %c, %d, %f",

znak, numer, rzecz);

*w_znak = 'A';
*w_numer = 251;
*w_rzecz = -11.11e2;

printf("\nNowe wartosci zmiennych wskazywanych:\n %c, %d, %f",

znak, numer, rzecz);

getch();
clrscr
();
return 0;

}

background image

18

Wynik działania programu:

Wartosci pierwotne zmiennych wskazywanych:

y, 113, 13077000000000000800000.000000
Nowe wartosci zmiennych wskazywanych:
A, 251, -1111.000000