1. Proste typy danych- ciąg dalszy 2. Typy złożone danych : TABLICE Wykład 3
ZMIENNE PROSTE: TYPY WBUDOWANE Typy zmiennoprzecinkowe: float double long double Różne rozmiary bajtowe. W konsekwencji różne wielkości i maksymalnych liczb i rożne dokładności Notacja naukowa: Opcjonalnie znak + lub - mantysa wykładnik +5.37E+16 Żadnych spacji! Opcjonalnie kropka dziesiętna Może być E lub e Może być + lub -, można też pominąć 2
Liczby zmiennoprzecinkowe różnią się od liczb całkowitych : sposobem przechowywania w pamięci komputera (znak, wykładnik, mantysa) sposobem realizacji obliczeń (: przy tej samej WIĘKSZEJ wartości cechy) IEEE standard Odczytywanie pamięci wykładnik Część ułamkowa S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF 0 1.8 9 31 wartość = (-1) S * 2 (E -127 ) *1.(F) przy czym: ZMIENNE PROSTE: TYPY WBUDOWANE bit1 bit2 bit 1.( F ) = 1+ + +... + 1 2 2 2 2 Do pamięci: 0.15625= (-1) 0 * 2 (-3 +127) * 1.01 = (0 01111100 0100000000000000000000) -0.15625= (-1) 1 * 2 (-3 +127) * 1.01 = (0 01111100 0100000000000000000000) 23 23 Z pamięci: 0 10000000 00000000000000000000000= (-1) 0 * 2 (128-127) * 1.0 = 2 0 10000001 10100000000000000000000= (-1) 0 * 2 (129-127) * 1.101 = 6.5 1 10000001 10100000000000000000000= (-1) 1 * 2 (129-127) * 1.101 = -6.5 0 00000001 00000000000000000000000= (-1) 0 * 2 (1-127) * 1.0 = 2-126 3
ZMIENNE PROSTE: TYPY WBUDOWANE int 2 : ( 0000 0000 0000 0000 0000 0000 0000 0010) float 2.0 : ( 0100 0000 0000 0000 0000 0000 0000 0000) Standard C++ przewiduje wyświetlanie 6 wartości liczby zmiennoprzecinkowej pomijanie końcowych zer 4
Klasa numeric_limits #include <iostream> #include <limits> using namespace std; main(){ cout <<"najwiekszy float = "<< numeric_limits<float>::max()<<'\n'; cout <<"namniejszy float = "<< numeric_limits<float>::min() <<'\n'; return;} cout <<"min eksponent binarnie float = << numeric_limits<float>::min_exponent <<'\n'; cout <<"min eksponent dziesietnie float = << numeric_limits<float>::min_exponent10 <<'\n'; cout <<"max eksponent binarnie float = << numeric_limits<float>::max_exponent <<'\n'; cout <<"max eksponent dziesietnie float = << numeric_limits<float>::max_exponent10 <<'\n'; cout <<"ilosc cyfr mantysy binarnie float = << numeric_limits<float>::digits <<'\n'; cout <<"ilosc cyfr mantysy dziesietnie float = << numeric_limits<float>::digits10 <<'\n'; cout <<"nieskonczonosc w float = "<< numeric_limits<float>::infinity() <<'\n'; cout <<"epsilon dla float = "<< numeric_limits<float>::epsilon() <<'\n'; cout <<"blad zaokraglania dla float = "<< numeric_limits<float>::round_error() ; cout <<"styl zaokraglania dla float = "<< numeric_limits<float>::round_style \n'; epsilon 5
ZMIENNE zmiennoprzecinkowe Liczby zmiennoprzecinkowe rozmieszczone są niejednorodnie małe gęściej duże rzadziej duże rzadziej 6
PODSUMOWANIE W języku C++ mamy wbudowane dwa podstawowe typy arytmetyczne: całkowite i zmiennoprzecinkowe. Są one dostępne przez słowa kluczowe języka: typy całkowite : bool, char, short, int, long, unsigned wchar_t różnią się ilością zajmowanej pamięci oraz obecnością lub nieobecnością znaku typy zmiennoprzecinkowe : float, double, long double różnią się ilością zajmowanej pamięci Arytmetyka zależy od typu Arytmetyka całkowitoliczbowa to obcinanie ułamków: int i=2, j=3; int k=i/j; /* k==0 */ Arytmetyka zmiennoprzecinkowa to zaokrąglanie wyników. Wynik może nie należeć do zbioru liczb reprezentowanych Jak się zaokrągla zależy od kompilatora. 7
C++ automatyczne konwertuje: (1)wartości w chwili przypisywania wartości jednego typu arytmetycznego zmiennej innego typu arytmetycznego int i=3.12234; // zmiennej i przypisana zostanie liczba 3 (2) wartości, jeżeli w wyrażeniu użyto rożnych typów KONWERSJA TYPU int i=3; float x=5.0; double suma= x+i; //zmienne x oraz i są konwertowane //do double przed operacją argumenty obliczeń są domyślnie poszerzane do najobszerniejszego typu ( do int dla całkowitych i do double dla zmiennoprzecinkowych) (3) wartości przekazywane funkcjom jako parametry Można wymusić zmiany rzutowanie : jak w C : (nazwa_typu) wartość jak funkcja: nazwa_typu (wartość) operator rzutowania: static_cast<nazwa_typu> (wartość) 8
OBLICZENIA w C++ Obliczenia prowadzimy korzystając z funkcji bibliotecznych (tutaj: z biblioteki cmath) lub własnych 9
OBLICZENIA w C++ Prototypy funkcji pojawić się muszą przed użyciem. Definicje funkcji pojawiają się Kolejno w pliku. 10
NAZWY ZMIENNYCH Co może być nazwą w C++ Dowolnie długi ciąg : liter, cyfr, i znaku podkreślenia _ Ale: nazwa nie może zaczynać się od cyfry nazwa nie może być identyczna z żadnym ze słów kluczowych Literały, czyli stałe wartości w programie: Zapis Zapis Zapis 10 8 16 znak łańcuch znakowy 11
SŁOWA KLUCZOWE 12
TABLICA ZNAKÓW: TRADYCYJNIE 0 1 2 3 4 5 6 7 8 9 10 11 12 13 A l a m a k o a t \0 char Napis[14]; Mamy przydzieloną pamięć na 14 zmiennych znakowych numerowanych od 0 do 13 Napis[0]= A ; Napis[1]= l ; Napis[2]= a ; Napis[3]= ; Napis[4]= m ; Napis[5]= a ; Napis[6]= ; Napis[7]= k ; Napis[8]= o ; Napis[9]= t ; Napis[10]= a ; char Napis [14]={ A, l, a,, m, a,, k, o, t, a }; char Napis [14]= Ala ma kota ; char Napis []= Ala ma kota ; W tablicy jest umieszczany znak końca łańcucha Tablica ma rozmiar taki jak literał +1 13
TABLICA : STRUKTURA WIELU IDENTYCZNYCH DANYCH Typ danych Nazwa tablicy Nawias klamrowy z rozmiarem tablicy int tabela [ 23] rozmiar tablicy musi być wielkością stałą: literał albo zmienna const Elementy tablicy numerujemy od ZERA!!!!! Inicjowanie tablicy tylko przy definicji: int karty[4]= {3,4,5,6}; float cos[3]={2.5, -0.1}; double duza[2222]={0}; 14
TABLICA ZNAKÓW: WPROWADZANIE DANYCH Zadanie: Poproś klienta o podanie imienia oraz nazwy jego ulubionego deseru Dane: zapytanie_1 = Podaj imię zapytanie_2 = Podaj ulubiony deser Wynik: tablice znakowe imie[] i deser[] Pomocnicza: komunikat_ok wyświetl zapytanie_1 pobierz imie wyświetl zapytanie_2 pobierz deser wyświetl komunikat_ok 15
TABLICA ZNAKÓW: WPROWADZANIE DANYCH #include <iostream> // odczyt danych z konsoli int main(){ using namespace std; system("chcp 1250"); const int rozmiar = 20; char imie[rozmiar]; char deser[rozmiar]; Polska strona kodowa, ale z Lucida UWAGA: cin każdy biały znak: spacja, tabulator, znak nowej linii odczytuje jako separator łańcuchów. cout << "Podaj swoje imię : \n "; cin >> imie; cout << "Podaj swój ulubiony deser : \n "; cin >> deser; cout << " Mamy dla Ciebie " << deser << ", " << imie <<endl; cin.ignore(1000,'\n'); cin.get(); return 0; } Pomija 1000 znaków aż następnego \n 16
TABLICA ZNAKÓW: WPROWADZANIE DANYCH int ile_porcji; liczby.cpp cout << "Ile porcji chcesz? \n" ; while (! (cin >> ile_porcji) ){ cout<< "podaj liczbę, proszę \n"; cin.clear(); cin.ignore(10000,'\n'); } Obsługa błędu w cin 1. Likwiduje flagę błędu w cin 2. Pomija 1000 znaków aż następnego \n cout << "Twój wzrost : \n "; Można połączyć operacje: (cin >> wzrost).get(); cin << wzrost i cin.get(); cout << "Podaj swoje imię : \n "; cin.getline(imie, rozmiar); cout << imie<< ", Twój wzrost to "<< wzrost<< endl; 17