Typy standardowe Typ Boolean Typ Integer Typ Float Typ Character Operacje wejścia-wyjścia
Typ standardowy Boolean 1 Definicja type Boolean is (False, True); Operatory relacyjne takie same jak dla typów wyliczeniowych = /= >= Operatory logiczne Jednoargumentowy (unarny - unary) - not Dwuargumentowe (binarne – binary) – and, or, xor Priorytety (priorities) operatorów logicznych Priorytet(not) > Priorytet(and)=Priorytet(or)=Priorytet(xor) Zalecenie. Stosuj nawiasy jeżeli masz wątpliwości jak będzie obliczone wyrażenie
Typ standardowy Boolean 2 Dodatkowe operatory logiczne dwuargumentowe: or else (odpowiada or ), and then (odpowiada and ) W przypadku tych operatorów najpierw obliczany jest lewy argument i jeżeli wartość operacji może być wyznaczona na tej podstawie, prawy argument nie jest obliczany. Priorytet taki sam jak pozostałych operatorów logicznych dwuargumentowych Operatory przynależności: in not in służą do sprawdzania czy dana typu skalarnego należy do pewnego zakresu Liczba not in not (Liczba in )
Typ standardowy Boolean 3 Przykłady PP_003_Operatory_Logiczne, PP_004_Nand_Nor
Typ standardowy Integer 1 Zbiór do którego należą dane tego typu zależy od implementacji języka. Liczby z tego zbioru reprezentowane są dokładnie. Atrybuty First Last Size Przykład PP_005_Atrybuty_Typu_Integer Operatory relacyjne = /= >= Operatory algebraiczne (algebraic operators) jednoargumentowe + - abs dwuargumentowe + - * / rem mod ** Przykład PP_006_Operacje_Calkowite Definicja Stosowanie tych samych oznaczeń do różnych operatorów nazywamy przeciążaniem operatorów (operator overloading)
Typ standardowy Integer 2 Priorytety operatorów działających na argumentach typu Integer ** abs * / mod rem + - jednoargumentowe + - dwuargumentowe = /= >= relacyjne Zalecenie Stosuj nawiasy jeżeli masz wątpliwości jak będzie obliczone wyrażenie. Nawiasy kosztują mniej niż błędy (Van Tassel, 1982) Uwaga Operacja ** nie jest operacją wewnętrzną ponieważ drugi argument (wykładnik) jest typu Natural, a nie Integer.
Typ standardowy Integer 3 Zdefiniowane wstępnie (predefined) podtypy utworzone na bazie typu Integer subtype Natural is Integer range 0..IntegerLast subtype Positive is Integer range 1..IntegerLast Dzielenie całkowite 1 Przy dzieleniu dwóch liczb całkowitych - dzielnej A przez dzielnik B /= 0 otrzymuje się iloraz Q i resztę R, a więc liczby te spełniają równanie A = Q*B + R W Adzie mamy operatory dwuargumentowe / i rem takie, że Q = A/B i R = A rem B
Typ standardowy Integer 4 Należy zwrócić uwagę na to, że jeżeli A i B nie dzielą się bez reszty, to iloraz jest zawsze liczbą bliższą zera. Przykład 5 / 2 = 2, 5 rem 2 = 1 5 / (-2) = -2, 5 rem (-2) = 1, (-5) / 2 = -2, (-5) rem 2 = -1, (-5) / (-2) = 2,(-5) rem (-2) = -1. W przypadku operatorów /, rem mamy I.Wartość bezwzględna ilorazu jest równa ilorazowi wartości bezwzględnych argumentów, II.Znak reszty jest zawsze równy znakowi dzielnej.
Typ standardowy Integer 5 Dzielenie całkowite 2 Drugim operatorem obliczającym resztę jest dwuargumentowy operator wewnętrzny mod. Jeżeli B > 0, to A mod B in 0..B-1 i jeżeli B < 0, to A mod B in B+1..0 Możemy zinterpretować operator mod jako operator obliczający resztę z dzielenia całkowitego, gdy iloraz jest obliczany przy pomocy funkcji nazywanej częścią całkowitą – funkcją podłoga (floor). Funkcja ta oznaczana jest symbolem. (Ross, Wright, 1999, 188) i określona jest następująco: x = największej liczbie całkowitej takiej, że jest mniejsza lub równa x
Typ standardowy Integer 6 Przykład 4.5 = 4, -4.5 = -5. Jeżeli A = Q m *B + R m, to Q m = A/B. Przykład 7/3 = 2, 7 mod 3 = 1, -7/3 = -3, -7 mod 3 = 2, 7/-3 = -3, 7 mod -3 = -2, -7/-3 = 2, -7 mod -3 = -1. W przypadku operatora mod mamy: 1.O znaku wyniku decyduje zawsze znak drugiego argumentu, czyli dzielnika 2.W przypadku, gdy znaki argumentów są różne, wyniki operacji A rem B i A mod B różnią się.
Typ standardowy Integer 7 Operacja mod służy do implementacji arytmetyki modulo (modular arithmetic). W arytmetyce tej mamy m.in. (A + B) mod N = (A mod N + B mod N) mod N Przykład Wykresy funkcji k k mod 5, k k/5, k in –10..10, k k rem 5, k k/5, k in – pokazano na kolejnych dwóch rysunkach.
Typ standardowy Integer 8
Typ standardowy Integer 9
Typ standardowy Float 1 Ogólnie, liczby rzeczywiste są reprezentowane w sposób przybliżony. Reprezentacja typu standardowego Float zależy od implementacji języka. Inne typy zdefiniowane wstępnie: Short_Float, Long_Float, Long_Long_Float Wybrane atrybuty First, Last, Size, Digits, Model_Epsilon, Safe_First, Safe_Last Przykład PP_007_Zakresy_Typow_Float Przykład PP_008_ Atrybuty_Typu_Float
Typ standardowy Float 2 Operatory relacyjne = /= >= algebraiczne jednoargumentowe + - abs dwuargumentowe + - * / ** Priorytety takie jak dla typu Integer Uwaga Wykładnik czyli drugi argument operatora potęgowania jest typu Integer Przykład PP_009_Operacje_Rzeczywiste Konwersja liczb rzeczywistych na całkowite i odwrotnie Float(67 = 67.0, Integer(67.4 = 67
Typ standardowy Float 3 Przy konwersji liczb rzeczywistych na całkowite wynik jest liczbą całkowitą najbliższą liczbie rzeczywistej W przypadku, gdy liczba rzeczywista jest w równej odległości od dwóch liczb całkowitych wynik konwersji jest liczbą całkowitą dalszą od zera Integer(3.5) = 4, Integer(-3.5) = -4 Przykład PP_010_Konwersja Częste stosowanie konwersji jawnej może wskazywać na to, że przyjęto nieodpowiednie typy danych Przykład PP_011_Konwersja_Jednostek
Typ rzeczywisty ogólny Przykład PP_012_Moje_Liczby_Rzeczywiste Można jednak to zrobić ogólniej, co zapewni nam przenośność programów Przykład Pakiet definicyjny My_Reals Przykład PP_013_ Atrybuty_Typu_Real Przykład PP_014_ Test_Reals
Wybrane operacje wejścia-wyjścia 1 subtype Field is Integer range ; subtype Number_Base is Integer range ; Liczby rzeczywiste type Num is digits <>; Default_Fore : Field := 2; Default_Aft : Field := Num'Digits - 1; Default_Exp : Field := 3; procedure Put (Item : in Num; Fore : in Field := Default_Fore; Aft : in Field := Default_Aft; Exp : in Field := Default_Exp);
Wybrane operacje wejścia-wyjścia 2 Liczby całkowite package Ada.Text_IO.Integer_IO is Default_Width : Field := Num'Width; Default_Base : Number_Base := 10; type Num is range <>; procedure Put (Item : in Num; Width : in Field := Default_Width; Base : in Number_Base := Default_Base);
Wybrane operacje wejścia-wyjścia 3 Przykład PP_015_Formatowanie Przykład PP_016_Read_Boolean Przykład PP_017_Czytaj_Typ_Wyliczeniowy Przykład PP_018_Czytaj_Dowolny_Napis Przykład Pakiet definicyjny My_Robust_Input.ads, Pakiet implementacyjny My_Robust_Input.adb Przykład PP_019_Test_My_Robust_Input
Zadania. Literatura podstawowa Zadania Ada_Zadania_04_Typy_Standardowe.pdf Literatura podstawowa Morawski, M., Zajączkowski, A.M. (2003). Wstęp do programowania w języku Ada95. Rozdziały