1. Proste typy danych 1. Proste typy danych
Transkrypt
1. Proste typy danych 1. Proste typy danych
1. Proste typy danychdanychciąg dalszy 2. Typy złożone danych : TABLICE Wykład 3 ZMIENNE PROSTE: TYPY WBUDOWANE Typy zmiennoprzecinkowe: Różne rozmiary bajtowe. W konsekwencji różne wielkości i maksymalnych liczb i rożne dokładności •float •double •long double Notacja naukowa: mantysa wykładnik Żadnych spacji! Opcjonalnie znak + lub - +5.37E+16 Opcjonalnie kropka dziesiętna Może być E lub e Może być + lub - , można też pominąć 2 D. Makowiec: Programowanie dla I BioInf 2013-03-04 ZMIENNE PROSTE: TYPY WBUDOWANE 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) Część ułamkowa wykładnik IEEE standard S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF 0 1………….8 9……………………………………31 Odczytywanie pamięci wartość = (-1)S * 2 przy czym: (E -127 ) 1.( F ) = 1 + *1.(F) bit1 bit 2 bit 23 + + .... + 21 22 2 23 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) Z pamięci: 0 10000000 0 10000001 1 10000001 0 00000001 00000000000000000000000= 10100000000000000000000= 10100000000000000000000= 00000000000000000000000= (-1)0 (-1)0 (-1)1 (-1)0 * * * * 2(128-127) * 1.0 = 2 2(129-127) * 1.101 = 6.5 2(129-127) * 1.101 = -6.5 2(1-127) * 1.0 = 2-126 3 D. Makowiec: Programowanie dla I BioInf 2013-03-04 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 D. Makowiec: Programowanie dla I BioInf 2013-03-04 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'; 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'; return;} 5 epsilon D. Makowiec: Programowanie dla I BioInf 2013-03-04 ZMIENNE zmiennoprzecinkowe Liczby zmiennoprzecinkowe rozmieszczone są niejednorodnie małe gęściej duże rzadziej duże rzadziej 6 D. Makowiec: Programowanie dla I BioInf 2013-03-04 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 typy zmiennoprzecinkowe : float, double, long double wchar_t różnią się ilością zajmowanej pamięci oraz obecnością lub nieobecnością znaku 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 D. Makowiec: Programowanie dla I BioInf 2013-03-04 KONWERSJA TYPU 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 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 D. Makowiec: Programowanie dla I BioInf 2013-03-04 OBLICZENIA w C++ Obliczenia prowadzimy korzystając z funkcji bibliotecznych (tutaj: z biblioteki cmath) lub własnych 9 D. Makowiec: Programowanie dla I BioInf 2013-03-04 OBLICZENIA w C++ Prototypy funkcji pojawić się muszą przed użyciem. Definicje funkcji pojawiają się Kolejno w pliku. 10 D. Makowiec: Programowanie dla I BioInf 2013-03-04 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 10 Zapis 8 znak łańcuch znakowy D. Makowiec: Programowanie dla I BioInf Zapis 16 11 2013-03-04 SŁOWA KLUCZOWE 12 D. Makowiec: Programowanie dla I BioInf 2013-03-04 TABLICA ZNAKÓW: TRADYCYJNIE 0 A 1 l 2 3 a char Napis[14]; 4 m 5 a Mamy przydzieloną pamięć na 14 zmiennych znakowych numerowanych od 0 do 13 6 7 k 8 o 9 t 10 a 11 12 13 \0 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”; D. Makowiec: Programowanie dla I BioInf W tablicy jest umieszczany znak końca łańcucha Tablica ma rozmiar taki jak literał +1 13 2013-03-04 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 D. Makowiec: Programowanie dla I BioInf 2013-03-04 TABLICA ZNAKÓW: WPROWADZANIE DANYCH Zadanie: Poproś klienta o podanie imienia oraz nazwy jego ulubionego deseru Dane: Wynik: zapytanie_1 = „Podaj imię” zapytanie_2 =„Podaj ulubiony deser” 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 D. Makowiec: Programowanie dla I BioInf 2013-03-04 TABLICA ZNAKÓW: WPROWADZANIE DANYCH #include <iostream> // odczyt danych z konsoli int main(){ using namespace std; system("chcp 1250"); Polska strona kodowa, ale z Lucida const int rozmiar = 20; char imie[rozmiar]; char deser[rozmiar]; 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 D. Makowiec: Programowanie dla I BioInf 2013-03-04 TABLICA ZNAKÓW: WPROWADZANIE DANYCH Obsługa błędu w cin 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'); 1. Likwiduje flagę błędu w cin 2. Pomija 1000 znaków aż następnego ‘\n’ } Można połączyć operacje: cout << "Twój wzrost : \n "; cin << wzrost i cin.get(); (cin >> wzrost).get(); cout << "Podaj swoje imię : \n "; cin.getline(imie, rozmiar); cout << imie<< ", Twój wzrost to "<< wzrost<< endl; 17 D. Makowiec: Programowanie dla I BioInf 2013-03-04