Wykłady 3-5 Typy danych w Pascalu Typy skalarne Typy strukturalne Skalarne Strukturalne Wskaźnikowe Typy danych w Pascalu Typy skalarne - uporządkowane i skończone zbiory wartości. Typ skalarny w Pascalu to typ prosty albo typ real Typy proste: 1. Typy elementarne - integer, char, Boolean, wyliczeniowy 2. Typy okrojone - ograniczenie zakresu typu elementarnego Skalarne typy danych typy numeryczne całkowite (integer, word, longint, short, byte) rzeczywiste (real, single, double, extended) typ znakowy (char) typ logiczny (boolean) Działania na typach skalarnych typ całkowity (integer, word, longint, short, byte) 12-21 + * div mod = <> < <= > >= typ rzeczywisty (real, single, double, extended) 12.3 2e-23 + * / = <> < <= > >= typ znakowy (char) a b #123 = <> < <= > >= typ logiczny (boolean) true false not or and = <> Funkcje standardowe abs(x) integer integer sqr(x) real real sin(x) cos(x) arctan(x) real real exp(x) ln(x) sqrt(x) Funkcje standardowe odd(i) true dla nieparzystych trunc(x) trunc(2.7)=2 trunc(-2.7)=-2 round(x) ord(z) char integer chr(i) integer char succ(i) pred(i) trunc(x+0.5) dla x>=0 trunc(x-0.5) dla x<0 1
Turbo Pascal Java Liczby całkowite typ zakres rozmiar shortint -128..127 1 integer -32768..32767 2 longint -2147483648..214748647 4 byte 0..255 1 word 0..65535 2 typ zakres rozmiar byte -128..127 1 short -32768..32767 2 int -2147483648..214748647 4 long -2^63..2^63-1 8 Turbo Pascal Java Liczby rzeczywiste typ zakres dokładność rozmiar real 2.9E-39.. 1.7E38 11-12 6 single 1.5E-45.. 3.4E38 7-8 4 double 5.0E-324.. 1.7E308 15-16 8 extended 3.4E-4932.. 1.1E4932 19-20 10 comp -9.2E18.. 9.2E18 19-20 8 typ zakres dokładność rozmiar float 1.5E-45.. 3.4E38 7-8 4 double 5.0E-324.. 1.7E308 15-16 8 Kod ASCII Kod Znak Kod Znak Kod Znak Kod Znak 0 Null 32 (spacja) 64 @ 96 ` 1 Start Of Heading 33! 65 A 97 a 2 Start of Text 34 66 B 98 b 3 End of Text 35 # 67 C 99 c 4 End Of Transmission 36 $ 68 D 100 d 5 Enquiry 37 % 69 E 101 e 6 Acknowledge 38 & 70 F 102 f 7 Bell 39 71 G 103 g 8 Backspace 40 ( 72 H 104 h 9 Horizontal Tab 41 ) 73 I 105 i 10 Line Feed 42 * 74 J 106 j 11 Vertical Tab 43 + 75 K 107 k 12 Form Feed 44, 76 L 108 l 13 Carriage Return 45-77 M 109 m 14 Shift Out 46. 78 N 110 n 15 Shift In 47 / 79 O 111 o 16 Data Link Escape 48 0 80 P 112 p 17 Device Control 1 (XON) 49 1 81 Q 113 q 18 Device Control 2 50 2 82 R 114 r 19 Device Control 3 (XOFF) 51 3 83 S 115 s 20 Device Control 4 52 4 84 T 116 t 21 Negative Acknowledge 53 5 85 U 117 u 22 Synchronous Idle 54 6 86 V 118 v 23 End of Transmission Block 55 7 87 W 119 w 24 Cancel 56 8 88 X 120 x 25 End of Medium 57 9 89 Y 121 y 26 Substitute 58 : 90 Z 122 z 27 Escape 59 ; 91 [ 123 { 28 File Separator 60 < 92 \ 124 29 Group Separator 61 = 93 ] 125 } 30 Record Separator 62 > 94 ^ 126 ~ 31 Unit Separator 63? 95 _ 127 (delete) Standard ISO-8859 Strona J zyki kodowa iso-8859-1 afrykanerski, alba ski, angielski, baskijski, du ski, fareski, fi ski, francuski, galicyjski, hiszpa ski, irlandzki, islandzki, katalo ski, niderlandzki, niemiecki, norweski, portugalski, szkocki, szwedzki, włoski iso-8859-2 chorwacki, czeski, polski, rumu ski, serbski, słowacki, słowe ski, w gierski iso-8859-3 esperanto, malta ski iso-8859-4 esto ski, grenlandzki, lapo ski, litewski, łotewski iso-8859-5 białoruski, bułgarski, macedo ski, rosyjski, serbski, ukrai ski iso-8859-6 arabski iso-8859-7 grecki iso-8859-8 hebrajski iso-8859-9 turecki iso-8859-10 eskimoski, lapo ski iso-8859-11 tajski iso-8859-13 litewski, łotewski iso-8859-14 breto ski, gaelicki, szkocki, walijski Unicode Jak wyświetlić tekst wielojęzyczny? Jak wyświetlić różne alfabety? (cyrylica, alfabety: hebrajski, chiński, japoński, koreański czy tajlandzki) Unicode - wspólny dla całego świata zestaw znaków. Unicode UTF-8 128 znaków (ASCII) kodowanych jest za pomocą 1 bajta. 1920 znaków (alfabety łaciński, grecki, armeński, hebrajski, arabski, koptyjski i cyrylica) kodowanych jest za pomocą 2 bajtów. 63488 znaków (m.in. alfabety chiński i japoński) kodowanych jest za pomocą 3 bajtów. Pozostałe 2147418112 znaki (jeszcze nie przypisane) można zakodować za pomocą 4, 5 lub 6 bajtów. UCS-2 Wszystkie znaki zapisywane są za pomocą 2 bajtów. Kodowanie to pozwala na zapisanie tylko 65536 początkowych znaków Unikodu. UCS-4 Wszystkie znaki zapisywane są za pomocą 4 bajtów. 2
Unicode (UTF-8) Kodowanie polskich znaków 00000000 0000007F: 0xxxxxxx 00000080 000007FF: 110xxxxx 10xxxxxx 00000800 0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 00010000 001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 00200000 03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 04000000 7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx Znak ISO 8859-2 CP-1250 Unicode UTF-8 161 165 261 196 133 198 198 263 196 135 202 202 281 196 153 ł 163 163 322 197 130 209 209 324 197 132 ó 211 211 211 195 179 166 140 347 197 155 172 143 378 197 186 175 175 380 197 188 177 185 260 196 132 230 230 262 196 134 234 234 280 196 152 Ł 179 179 321 197 129 241 241 323 197 131 Ó 243 243 243 195 147 182 156 346 197 154 188 159 377 197 185 191 191 379 197 187 Typy strukturalne w Pascalu tablice (array) łańcuchy znaków (string) rekordy (record) pliki (file) zbiory (set) Typ tablicowy w Pascalu Definiowanie typów: type tab1=array[min..max] of T; tab2=array[1..max1] of array[1..max2] of T; tab3=array[1..max1] of tab1; tab4=array[1..max1,1..max2] of T; Deklarowanie zmiennych: t1,t2 : tab1; Odwołanie do elementów: t1[a+3]:=t1[a+4]; Cechy: statyczny rozmiar możliwość podstawiania zmiennych tablicowych Łańcuch znaków write( to jest tekst ); Pascal printf( to jest tekst ); Język C string; string[80]; string[255]; Przykład: string[10]; długość 1 2 3 4 5 6 7 8 9 10 Operacje na łańcuchach a,b : string[10]; Składanie: a:= jeden ; b:= dwa ; a:=b+b; Wczytywanie i wypisywanie: write(a); dwadwa write(b[2]); w read(a); Porównywanie: if a<>b then write( różne ); 3
Operacje na łańcuchach c.d. Przykładowe funkcje: length(s:string):integer pos(sub:string; s:string):byte concat(s1, [s2..sn]:string):string copy(s:string; ind:integer; count:integer):string Przykładowe procedury: insert(s1:string; s:string; ind:integer) delete( s:string; ind:integer; count:integer) Rekordy type zespolona=record re:real; im:real; z1,z2:zespolona; Nadawanie wartości: z1.re:=5; z1.im:=6; Podstawianie rekordów: z2:=z1; Definicje i deklaracje: Rekordy - przykład type data = record dzien : 1..31; miesiac : 1..12; rok : 0..3000; type osoba = record imie : string[20]; nazwisko : string[20]; urodziny : data; kobieta : boolean; rob : osoba; tab : array[1..100] of osoba; 1/2 Przypisania: Podstawienie rekordów: Dostęp: Rekordy - przykład rob.imie := Jola ; rob.urodziny.dzien := 7; rob.urodziny.miesiac := 6; rob.kobieta := true; tab[1] := rob; if tab[1].kobieta then write(tab[1].imie); 2/2 Pliki Operacje wykonywane na plikach Dostęp do pliku: sekwencyjny (taśmy) swobodny (dyski) file of T; file of integer; file of osoba; file of char; (text) Struktura o elementach tego samego typu eof Deklarowanie f : file of T; Procedury i funkcje: assign(f, nazwa); reset(f); rewrite(f); read(f, zm); write(f, zm); close(f); eof(f); seek(f, pos); (open, fopen) 4
Pliki tekstowe Kopiowanie pliku tekstowego Deklarownie: f : text; Procedury i funkcje: readln( ) writeln( ) eoln( ) Znak końca linii: DOS CR LF UNIX LF MacOS CR {file of char} assign(f1, plik1.txt ); assign(f2, plik2.txt ); reset(f1); rewrite(f2); while not eof(f1) do while not eoln(f1) do read(f1,ch); write(f2,ch) readln(f1); writeln(f2) close(f1); close(f2); Zbiory Zastosowanie zbiorów f : set of T; set of char; set of integer; T - typ prosty if (a<=3)and(a>=0)or(a>=10)and(a<=12) then... if a in [0..3, 10..12] then... Operacje na zbiorach: + - * suma, różnica, iloczyn in przynależność elementu do zbioru = <> równość, różność <= >= zawieranie się zbiorów := podstawianie sam : set of char; sam := [ a, e, i, o, u, y ]; if not (zn in sam) then write( spółgłoska ); Przykład wykorzystania zbiorów: Eratostenes (ur. 276 p.n.e. w Cyrenie, zm. 194 p.n.e.) Sito Eratostenesa 2 3 4 5 6 7 8 9 10 11 12 13 14 2 3 5 7 9 11 13 2 3 5 7 11 13 Sito Eratostenesa const n = 1000; sito,pierwsze : set of 2..n; next,j : integer; sito:=[2..n]; pierwsze:=[ ]; next:=2; repeat while not (next in sito) do next:=succ(next); pierwsze:=pierwsze+[next]; j:=next; while j<=n do sito:=sito-[j]; j:=j+next; until sito=[ ]; end. 5