Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1
Plan wykładu Typy danych języka Java Operacje arytmetyczne oraz tekstowe Konwersja typów danych Zmienne Instrukcja przypisania Wczytywanie danych z klawiatury Obsługa sytuacji wyjątkowych 2
Pojęcie typu danych Algorytmy operują na danych różnych typów: tekstowe, liczbowe, znakowe, itp. Program jest komputerową realizacją algorytmu więc powinien umieć przechowywać oraz przetwarzać te dane Typ danych = kategoria obiektu Typ danych określa m. innymi: Rodzaj przechowywanych wartości Operacje dozwolone dla danych tego typu 3
Podstawowe typy danych W większości języków programowania występują dane następujących typów: Liczba (całkowite, rzeczywiste, etc.) Tekst Znak Data i godzina Wartość logiczna Plik 4
Wszystko jest liczbą! Obszar pamięci w komputerze 0 1 0 0 0 0 0 1 Zapis binarny 65 Jako liczba całkowita 'A' Jako znak 8,125 fałsz prawda fałsz Jako liczba rzeczywista (przy założeniu że 3 ostatnie bity stanowią część ułamkową) Jako tablica wartości logicznych Typ danych określa sposób interpretacji danych zapisanych w pamięci komputera 5
Podstawowe typy danych Java Typ danych Opis Przykładowe wartości int, short, byte Liczba całkowita 10, -2, 0 double, float Liczba rzeczywista -13.5, 2.009, 0.0 char Pojedynczy znak 'a', '1', '\t' boolean Wartość boolowska (logiczna) true, false String Tekst (łańcuch znaków) "Witam", "10", "" Typ danych String jest typem złożonym (z elementów char), pozostałe typy danych są proste (niepodzielne) 6
Liczby całkowite Typ danych: int, short, long, byte (proste, niepodzielne) Klasa: Integer, Short, Long, Byte (metody pomocnicze) Znak: dodatnie, ujemne Rozmiar w pamięci: od 1 do 8 bajtów Wartość domyślna: 0 Wartości minimalne / maksymalne: Integer.MAX_VALUE, Short.MIN_VALUE, etc. znak Bajt 3 Bajt 2 Bajt 1 Bajt 0 Przykładowa reprezentacja INT w pamięci komputera 7
Liczby rzeczywiste Typ danych: float / double (prosty, niepodzielny) Klasa: Float / Double Znak: dodatnie, ujemnie Struktura danych: 4 bajty / 8 bajtów Wartość domyślna: 0.0 Wartości minimalne / maksymalne: Float.MAX_VALUE, Double.MIN_VALUE z Bajt 7 Bajt 1 Bajt 0 Przykładowa struktura typu danych double 8
Znakowy typ danych Nazwa typu danych: char Reprezentuje pojedynczy znak (liczba, cyfra, znak specjalny etc.) Klasa: Char Nie ma wartości pustej (!) Wartości są zapisywane w apostrofach: np. '$' Operacje: Porównanie (wg kodu znaku) Wartości minimalne / maksymalne: nie dotyczy 65 (dec) A 0100 0001 9
Wybrane kody znaków ASCII Kod Znak Kod Znak 9 TAB 97 a 10 Line Feed 98 b 13 Carriage Return 32 SPACE 48 0 (zero) 49 1 65 A 66 B 10
Operacje na liczbach Operacja Znak Przykład dodawanie + 1 + 3 odejmowanie - 2-5 mnożenie * 3 * 4.5 dzielenie / 10 / 3 reszta z dzielenia % 10 % 3 Typ wyniku operacji arytmetycznej zależy od typów jej argumentów: - Jeśli typy są jednakowe, typ wyniku jest taki sam - Jeśli typy są różne, typ wyniku z reguły jest bardziej ogólny 11
Łańcuchy tekstowe Typ danych: String (złożony) Struktura danych: tablica znaków Char Wartość domyślna: null Wartości minimalne / maksymalne: n. d. Rozmiar w pamięci: zmienny W i t a m 4 3 2 1 0 Bajt 12
Operacje na łańcuchach tekstowych Operacja konkatenacji (złączenia) A = B + C gdzie A, B, C reprezentują typ danych String Operacje zdefiniowane w klasie String: wyszukiwanie, skracanie, wycinanie segmentu, etc. startswith, charat, substring, etc. 13
Typ danych boolean Boolowski ( logiczny ) typ danych Składa się z dwóch wartości TRUE FALSE Wartość boolowska może być generowana w procesie wykonania operacji porównania Np. wyrażenie 2 > 4 ma wartość false 14
Operacje porównania Operacja A < B A > B A <= B A >= B A == B A!= B Opis czy A jest mniejsze od B czy A jest większe od B czy A jest mniejsze lub równe B czy A jest większe lub równe B czy A jest równe B czy A jest różne od B 15
Operacje typu danych boolean Zapis Operacja Opis A B A && B LUB (OR) ORAZ (AND) Suma boolowska Iloczyn boolowski! A NIE (NOT) Negacja (zaprzeczenie) 16
Tablica wartości operacji boolowskich X Operacja Y Wynik false ORAZ (AND) false false false ORAZ (AND) true false true ORAZ (AND) true true false OR (LUB) false false false OR (LUB) true true true OR (LUB) true true NOT (NIE) false true NOT (NIE) true false 17
Algebra Boole a Dla wartości boolowskich X, Y, Z poprawne są stwierdzenia X AND true = X X OR true = true X OR ( X AND Y ) = X X AND ( X OR Y ) = X X AND ( NOT X ) = 0 X OR ( NOT X ) = 1 18
Prawa De Morgana NOT ( X OR Y ) = (NOT X) AND (NOT Y) NOT ( X AND Y ) = (NOT X) OR (NOT Y) Przykład: czemu równa się wartość wyrażenia boolowskiego X = ( true AND (false OR false) ) OR ( false OR (NOT true) ) 19
Wyrażenia arytmetyczne Wyrażenia arytmetyczne są zapisywane w formie podobnej do matematycznej: 10 * (2 + 6 / (5 3)) Należy uwzględniać priorytety operacji (standardowo) oraz korzystać z nawiasów okrągłych w celu zmiany domyślnej kolejności wykonania obliczeń Złożone operacje matematyczne są realizowane poprzez funkcje z biblioteki Math (np. Math.sqrt) 20
Zmienne Zmienna obiekt w programie przeznaczony do tymczasowego przechowywania wartości określonego typu Nazwa zmiennej umożliwia jej wykorzystanie w programie Typ danych określa rodzaj przechowywanej wartości Zasięg zmiennej miejsce w programie gdzie zmienna jest widoczna dla pozostałych instrukcji 21
Zmienna double k = 10.25; // deklaracja zmiennej w programie k Nazwa zmiennej Obszar w pamięci komputera 10.25 Typ danych (double) Wartość bieżąca typu double 22
Deklaracja zmiennej Każda zmienna w programie powinna być zadeklarowana przed jej użyciem Deklaracja zmiennej polega na wskazaniu: Nazwy zmiennej Typu danych oraz opcjonalnie wartości początkowej Jednocześnie można deklarować kilka zmiennych tego samego typu 23
Deklaracja zmiennej, Typ danych Nazwa zmiennej ; = Wartość 24
Przykłady deklaracji zmiennej int a; double b, c; float d = 0.5f; boolean e, f = false; 25
Operacja przypisania wartości Wyrażenie A = B w programowaniu Java oznacza kopiowanie wartości obiektu B do zmiennej A Obiektem po prawej stronie może być: Wartość stała Wyrażenie arytmetyczne Zmienna Metoda zwracająca wartość itp. Obiektem po lewej stronie może być tylko zmienna Oba obiekty muszą reprezentować identyczne lub kompatybilne typy danych (typ B musi się konwertować na typ A) 26
Operacja przypisania wartości Zmienna A Zmienna B 10 6 Przed wykonaniem instrukcji A = B Po wykonaniu instrukcji A = B Kopiowanie wartości 6 6 10 Utracona dotychczasowa wartość 27
Przykłady przypisania wartości Oblicz wartości zmiennych x, y po wykonaniu fragmentu kodu: int x = 10, y = 15; y = x + 5; x = y 10; 28
Skrócony zapis operacji Skrócony zapis A ++ A -- ++A -- A A += B A-=B A *= B A /= B Pełny zapis A = A + 1 A = A 1 A = A + 1 A = A - 1 A = A + B A = A B A = A * B A = A / B Operacje ++A oraz A++ różnią się wyłącznie wtedy gdy są częścią większego wyrażenia: operacja ++A w momencie obliczenia już ma wartość A+1, zaś operacja A++ ma wartość A i dopiero po ukończeniu obliczeń zostanie zwiększona o 1 29
Zasięg zmiennej Zasięg obszar w programie, na którym zmienna jest widoczna dla innych obiektów Nie można korzystać ze zmiennej będącej poza zasięgiem Zasięg zmiennej określa miejsce jej definicji: Klasa zmienna dostępna dla całej klasy (zmienna globalna klasy) Metoda zmienna dostępna tylko w funkcji (zmienna lokalna metody) Blok instrukcji zmienna dostępna tylko wewnątrz bloku nawiasów {. } (zmienna lokalna) 30
Zasięg zmiennej (c.d.) Zmienna zadeklarowana w klasie, jest dostępna dla wszystkich metod klasy Zmienna zadeklarowana w metodzie jest dostępna dla wszystkich następnych instrukcji metody oraz konstrukcji { } włożonych Zmienna zadeklarowana w bloku instrukcji { } jest widoczna w jego obszarze oraz dla włożonych konstrukcji blokowych {. } 31
Przesłanianie nazwy zmiennej Zmienna zadeklarowana lokalnie zawsze przesłania zmienną o tej samej nazwie zadeklarowaną wyżej w hierarchii Może prowadzić do poważnych komplikacji w czasie wykonania Na jednym poziomie hierarchii programu nie można zadeklarować dwóch zmiennych o tej samej nazwie 32
Zasięg zmiennej (c.d.) int A; void Fn { // poziom klasy float B=5; if(a<b){ // poziom metody A B C } } double C; C = A * B; // poziom bloku instrukcji B = A / 2; B = C / 2; A = Math.sqrt( 25 ); A = B + 3.0; 33
Konwersja typów danych Operacja przypisania wartości A = B zakłada że obiekty A i B mają identyczny lub kompatybilny typ danych Czasem zachodzi jednak konieczność wykonania takiej operacji na obiektach odmiennych typów Mówimy wówczas o konwersji typu danych B na typ danych A Zmienna typu A Wartość typu B Konwersja A<-B 34
Metody konwersji typów danych 1) Automatyczna konwersja 2) Jawna (wymuszona) konwersja 3) Konwersja z użyciem metody konwersji Konwersja typów może nie być możliwa wcale! 35
Automatyczna konwersja typów Możliwa, jeśli typ B jest podzbiorem typu A Przykłady: int -> double char -> string Nie wymaga udziału programisty // konwersja domyślna automatyczna int i = 10; double d = i; 36
Jawna konwersja typów Tzw. rzutowanie typów danych Odbywa się na wyraźne żądanie programisty Przykład: int X = (int) D; // D jest typu double Może prowadzić do częściowej utraty danych // konwersja jawna (wymuszona) // z potencjalną utratą danych float f = 3.3333f; int k = (int) f; 37
Konwersja z użyciem metody W przypadku, gdy automatyczna oraz jawna konwersje nie są możliwe (lub nie zalecane), można skorzystać z metod konwersji typów Przykład: Double.parseDouble(string) // konwersja za pomocą metody String s1 = Float.toString(f); double m = Integer.parseInt("10.25"); 38
Wczytywanie danych z klawiatury Dane wprowadzane przez użytkownika mogą być wczytane ze strumienia wejściowego reprezentowanego przez obiekt System.in Klasy pomocnicze: InputStreamReader BufferedReader Dane są wczytywane w postaci obiektu typu String Klawiatura System.in InputStream Reader BufferedRea der Zmienna 39
Sytuacje wyjątkowe Wyjątek (ang. Exception) sytuacja awaryjna zaistniała w trakcie wykonania programu, która wymaga przerwania normalnego ciągu instrukcji Dzielenie przez zero Awaria sieci Brak pliku lub miejsca na dysku Niewłaściwy format danych wejściowych Brak danych wejściowych itp. 40
Obsługa wyjątków W sekcji try umieszczamy instrukcje realizujące główny algorytm programu W sekcji catch umieszczamy informacje o wystąpieniu błędów try catch Kod niebezpieczny który należy monitorować Kod który zostanie wykonany w razie wystąpienia awarii 41
Diagram konstrukcji try - catch try { Kod kontrolowany } Typ Nazwa catch ( ) wyjątku zmiennej Kod { } obsługi 42