Wstęp do programowania Dariusz Wardecki, wyk. III
Funkcje w C++ Funkcja (ang. function) Wyróøniona czíúê kodu üród owego, stanowiπca odríbnπ ca oúê, sk adajπca sií z treúci (ang. body) oraz nag ówka (ang. header). TreúÊ funkcji (ang. function body) Blok, którego sposób wykonywania w ogólnoúci zaleøy od pewnej liczby wartoúci, zwanych parametrami lub argumentami funkcji, pochodzπcych z innych czíúci programu i koòczy sií wygenerowaniem wyniku (ang. result), przeznaczonego do wykorzystania w innych czíúciach programu. Nag ówek funkcji (ang. function header) CzÍúÊ definicji funkcji okreúlajπca typ danych dla wyniku, nazwí funkcji oraz listí jej argumentów.
Funkcje w C++ Przyk ad definicji funkcji int main() { cout << "Napis" << endl; return 0; // Instrukcja. } // Instrukcja. Ta funkcja ma nastípujπce w asnoúci: 1 Generowany (zwracany) przez niπ wynik jest typu int. 2 Jej nazwπ jest main. 3 Lista jej argumentów jest pusta. 4 Zawsze zwraca wynik 0.
Funkcje w C++ 1 Kaøda funkcja wykorzystywana w programie musi byê zdefiniowana lub dostípna w pewnej bibliotece (ang. library). 2 Dla funkcji z bibliotek w programie umieszcza sií same nag ówki. Plik nag ówkowy (ang. header file) Plik zawierajπcy nag ówki funkcji dostípnych w bibliotekach oraz deklaracje sta ych i zmiennych, a takøe definicje z oøonych typów danych. W πczanie plików nag ówkowych do kodu üród owego Do tego celu s uøy dyrektywa#include, np.#include <iostream> (nawiasy < oraz > oznaczajπ, øe plikpowinienznajdowaê sií wjednymz systemowych katalogów z plikami nag ówkowymi).
Funkcje w C++ #include<iostream> #define PI 3.141592 using namespace std; double pole(double x) { double P; P = PI*x*x; return P; } int main() { double r; cout << Podaj promień: << endl; cin >> r; cout << Pole wynosi: << pole(r) << endl; return 0; }
#include<iostream> #define PI 3.141592 using namespace std; double pole(double x); Funkcje w C++ int main() { double r; cout << Podaj promień: << endl; cin >> r; cout << Pole wynosi: << pole(r) << endl; return 0; } double pole(double x) { double P; P = PI*x*x; return P; }
Funkcje w C++ #include<iostream> #define PI 3.141592 #include pole.h //Wazna kolejnosc! using namespace std; int main() { double r; cout << Podaj promień: << endl; cin >> r; cout << Pole wynosi: << pole(r) << endl; return 0; }
Typy danych Dla s owa N-bitowego 1 1 011010...010111 0 b N 1 b N 2 b 1 1 b j bit (cyfra binarna) na pozycji j = 0, 1,...,N 1 Waga bitu odpowiada jego pozycji w s owie: b 0 najmniej znaczπcy (najm odszy) bit. b N 1 najbardziej znaczπcy (najstarszy) bit. b 0 Typ danych (ang. data type) Okreúla rozmiary danych (np. jaka liczba bitów ma byê wykorzystywana do zapisania znaku) oraz interpretacjí zapisu binarnego (tzn. jakie ma byê znaczenie poszczególnych bitów).
Reprezentacja bezznakowa liczb całkowitych b nieujemna liczba ca kowita b = N 1 ÿ j=0 b j 2 j = b N 1 2 N 1 + b N 2 2 N 2 +...+ b 1 2 1 + b 0 2 0 Typy danych dla reprezentacji bezznakowej N = 8 : od 0 do 255 = 2 8 1 N = 16 : od 0 do 65535 = 2 16 1 N = 32 :od0do2 32 1 N = 64 :od0do2 64 1 N = 128 :od0do2 128 1
Liczby całkowite ujemne Propozycja: 00111001 (+57) + 10001101 (-13) ---------- 11000110 (-69)
Liczby całkowite ujemne Propozycja: 00001110 00111001 (+14) (+57) + 1xxxxxxx 10001101 (-14) (-13) ---------- 00000000 ( 0)
Reprezentacja uzupełnień do 2 Uzupełnieniem dwójkowym liczby x zapisanej za pomocą n bitów nazywamy liczbę: x u2 =2 n x Przykłady x = 0101,x u2 =2 4 0101 = 10000 0101 = 1011 x = 1011,x u2 =2 4 1011 = 10000 1011 = 0101
Liczby całkowite ujemne Rozwiązanie: 00001110 00111001 (+14) (+57) + 11110010 10001101 (-14) (-13) ---------- 00000000 ( 0) DEC ZNAK-MOD Rep. U2 +7 0111 0111 +6 0110 0110 +5 0101 0101 +4 0100 0100 +3 0011 0011 +2 0010 0010 +1 0001 0001 +0 0000 0000-0 1000 -- -1 1001 1111-2 1010 1110-3 1011 1101-4 1100 1100-5 1101 1011-6 1110 1010-7 1111 1001-8 -- 1000
Liczby całkowite ÿujemne Typy danych dla reprezentacji uzupe nienia do 2 N = 8 :od 2 7 = 128 do 127 = 2 7 1 N = 16 :od 2 15 = 32768 do 32767 = 2 15 1 N = 32 :od 2 31 do 2 31 1 N = 64 :od 2 63 do 2 63 1 N = 128 :od 2 127 do 2 127 1
Własności reprezentacji uzupełnienia do 2 Tylko liczby ca kowite (mogπ byê ujemne). Dodawanie i odejmowanie jak dla reprezentacji bezznakowej. MoøliwoúÊ wystπpienia przepe nienia (w innych okolicznoúciach, niø dla reprezentacji bezznakowej). Przy danej liczbie bitów najwiíksza wartoúê jest o po owí mniejsza od najwiíkszej wartoúci dla analogicznego typu danych w reprezentacji bezznakowej.
Reprezentacja liczb rzeczywistych Notacja naukowa 4.56 10 14 = 456 10 16 =0.456 10 13 Reprezentacja zmiennoprzecinkowa (ang. floating point)
Reprezentacja liczb rzeczywistych z m M B Z cc gdzie: M - mantysa, C - wykładnik (cecha), B - podstawa, z - znak mantysy i podstawy. z m M 2 Z cc W sys. binarnym z m M 2 C K c Kc - stała
Reprezentacja liczb rzeczywistych Ułamki w systemie binarnym 65.872 (dec) 6 10 1 +5 10 0 +8 10 1 +7 10 2 +2 10 3 5.25 (dec) = 101.01 (bin) 1 2 2 +0 2 1 +1 2 0 +0 2 1 +1 2 2
Reprezentacja liczb rzeczywistych 65 10 =? 2 65%2 = 1 32%2 = 0 16%2 = 0 8%2 = 0 4%2 = 0 2%2 = 0 65.40625 10 =? 2 0.40625*2 = 0.8125 0.8125*2 = 1.625 0.625*2 = 1.25 0.25*2 = 0.5 0.5*2 = 1.0 1%2 = 1 65.40625 (dec) = 1000001.01101 (bin)
Reprezentacja liczb Normowanie mentysy rzeczywistych 1.0 apple M apple 2.0 1.b n...b 0 Przykład - 8 bitów, Kc = 7 Z C C C C M M M 00000000 = 1.0000*2e-7 = 0.0078125 01111111 = 1.8750*2e+8 = 480
Reprezentacja liczb rzeczywistych Dostępne zakresy: niedomiar dodatni przepełnienie dodatnie -480-0.0078125 0 +0.0078125 +480 przepełnienie ujemne niedomiar ujemny
Reprezentacja liczb rzeczywistych Istnieje wiele reprezentacji dla tej samej d ugoúci s owa 1 Dok adnoúê zaleøy odd ugoúci (liczby bitów) mantysy. 2 Zakres wartoúci zaleøy odd ugoúci (liczby bitów) wyk adnika. 3 Przy przeprowadzaniu operacji wyniki zaokrπgla sií tak, aby moøna je by o zapisaê z pomocπ wybranej liczby bitów mantysy i wyk adnika. Problem niezgodnoúci miídzy róønymi reprezentacjami zosta rozwiπzany poprzez wprowadzenie miídzynarodowej normy standard IEEE 754.
Standard IEEE 754 Reprezentacja 32 bitowa Kc = 127
Standard IEEE 754 Pojedyńcza precyzja (ang. single precision) r = ±S r 2 W r 1 S owo 32-bitowe. 2 b 31 =znak. 3 b 30...b 23 = W r (od 126 do 127). 4 PostaÊ znormalizowana: S r = 1 + 23 ÿ j=1 b 23 j 2 j
Standard IEEE 754 Podwójna precyzja (ang. double precision) r = ±S r 2 W r 1 S owo 64-bitowe. 2 b 63 =znak. 3 b 62...b 52 = W r (od 1022 do 1023). 4 PostaÊ znormalizowana: S r = 1 + 52 ÿ j=1 b 52 j 2 j
Standard IEEE 754 Wartości specjalne Reprezentacje 0 i Œ 1 Liczba 0 jest reprezentowana przez s owo, w którym wszystkie bity mantysy i wyk adnika sπ zerami (dwie reprezentacje liczby 0). 2 ±Œ jest reprezentowana przez s owo, w którym wszystkie bity wyk adnika sπ jednykami a wszystkie bity mantysy zerami. NaN (ang. Not a Number) Dla reprezentacji zmiennoprzecinkowej ciπg bitów nie reprezentujπcy liczby (W r zawiera ciπg jedynek,s r zawiera co najmniej jednπ jedynkí).
ÿ Typy danych Typy danych dla reprezentacji bezznakowej N = 8 : unsigned char (od 0 do 255 = 2 8 1) N = 16 : unsigned short int (od 0 do 65535 = 2 16 1) N = 32 : unsigned int (od 0 do 2 32 1) N = 64 : unsigned ÿ long long int (od 0 do 2 64 1), dla procesorów 64-bitowych równowaøny unsigned long int. Typy danych dla reprezentacji uzupe nienia do 2 N = 8 : char (od 2 7 = 128 do 127 = 2 7 1) N = 16 : short int (od 2 15 = 32768 do 32767 = 2 15 1) N = 32 : int (od 2 31 do 2 31 1) N = 64 : long int lub long long int (od 2 63 do 2 63 1) Dla procesorów 32-bitowych z rodziny x86 typ long int jest równowaøny typowi int.
Typ bool owski bool Typ danych reprezentujπcy wartoúci wyraøeò, w których wystípujπ spójniki logiczne i operacje porównania. Zmienne tego typu mogπ przyjmowaê dwie wartoúci, true oraz false. Zwiπzek typu bool ztypamiliczbowymi WartoúÊ o dowolnym liczbowym typie danych moøe zastípowaê wartoúê typu bool. Wówczas wartoúê liczbowa 0 odpowiada wartoúci false typu bool, natomiast kaøda liczbowa wartoúê róøna od 0 odpowiada wartoúci true typu bool.
Wyrażenia Wyraøenia reprezentujπ obliczenia Zawierajπ one: 1 Symbole reprezentujπce wartoúci do wykorzystania w obliczeniach. Litera y. Zmienne (nazwy zmiennych). Sta e (nazwysta ych). 2 Wywo ania funkcji, z których pochodzπ wartoúci do wykorzystania w obliczeniach, np. s = sin(x); 3 Operatory. Okreúlonπ kolejnoúê przeprowadzania obliczeò moøna wymusiê stosujπc nawiasy okrπg e (tzn. nawiasy okrπg e s uøπ do grupowania sk adników wyraøenia). Innych rodzajów nawiasów nie uøywa sií do tego celu.
Zapis liczb całkowitych 1 System dziesiítny. Pierwsza cyfra nie moøe byê zerem! 2 System szesnastkowy. 0x jako prefiks. Cyfry 0... 9 i litery A... F (lub a... f) reprezentujπ wagi 0... 9 i 10... 15, odpowiednio. Np. zapis 0x1FF oznacza liczbí 511. 3 System ósemkowy. 0 jako prefiks. Cyfry 0... 7 reprezentujπ wagi 0... 7, odpowiednio. Np. zapis 0111 oznacza liczbí 73.
Zapis liczb niecałkowitych 1 Notacja z kropkπ dziesiítnπ. Jeúli zapis zaczyna sií od kropki, to czíúê ca kowita jest równa 0 (np..5). Jeúli zapis koòczy sií kropkπ, toczíúê u amkowa jest równa 0 (np. 1.). 2 Notacja naukowa. Liczba w notacji z kropkπ, literae lub e, liczbaca kowita. E lub e oznacza mnoøenie przez 10 do pewnej ca kowitej potígi. Liczba ca kowita jest wyk adnikiem. Np. 1.0e3 oznacza liczbí 1000. Np. 1.0e-2 oznacza liczbí 0,01.
Operatory Operator Symbol reprezentujπcy operacjí do przeprowadzenia. Rodzaje operatorów w C++ Arytmetyczne. Bitowe (ang. bit pattern). Porównania. Logiczne (ang. boolean). Operator trójargumentowy. Wskaünikowe (ang. pointer).
Operatory arytmetyczne Jednoargumentowy operator arytmetyczny - :zmiana znaku wartoúci (po prawej stronie). Dwuargumentowe operatory arytmetyczne + :dodawanie. - :odejmowanie. * :mnoøenie. / : dzielenie(jeúli argumenty sπ ca kowite, reszta z dzielenia jest odrzucana). % :resztazdzielenia.
Operatory bitowe Argumenty operatora sπ traktowane jako wzory bitowe (ang. bit pattern). Jednoargumentowy operator bitowy ~ : negacja wszystkich bitów argumentu (po prawej stronie). Np. jeúli zmienna jest typu, to po wykonaniu instrukcji Dwuargumentowe operatory bitowe :sumabitowa(or). & :iloczynbitowy(and). ^ :róønica symetryczna (XOR). << :przesuniície bitowe w lewo. >> :przesuniície bitowe w prawo.
Operatory bitowe OR, suma bitowa n = 12 10; // 1100 1010 = 1110 AND, iloczyn bitowy m = 12 & 10; // 1100 & 1010 = 1000 XOR, róønica symetryczna k = 12 ^ 10; // 1100 ^ 1010 = 0110
Operatory bitowe PrzesuniÍcie bitowe w lewo (ang. left shift) y = x << k; 1 Dla wszystkich pozycji bitowych j = N 1, N 2,...,k skopiuj na tí pozycjí bit z pozycji (j k). 2 Na pozycje bitowe 0, 1,...,k 1 wstaw zera. k PrzesuniÍcie bitowe w prawo (ang. right shift) y = x >> k; 1 Dla wszystkich pozycji bitowych j = 0, 1,...,N k 1 skopiuj na tí pozycjí bit z pozycji (j + k). 2 Na pozycje bitowe N 1, N 2,...,N k wstaw zera. k
Operatory porównania == :testrównoúci argumentów.!= :testnierównoúci argumentów. < :mniejsze. <= :mniejszelubrówne. > :wiíksze. >= :wiíksze lub równe. Dla operatorów porównania wynik operacji jest zawsze typu bool.