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.
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
.
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
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
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
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
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.
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.
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
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
.
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
}
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.
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.
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
.
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
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.
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;
}
18
Wynik działania programu:
Wartosci pierwotne zmiennych wskazywanych:
y, 113, 13077000000000000800000.000000
Nowe wartosci zmiennych wskazywanych:
A, 251, -1111.000000