370 likes | 506 Views
Informatika I 4 . přednáška. RNDr. Jiří Dvořák, CSc. dvorak @uai.fme.vutbr.cz. Obsah přednášky. Datové typy real, integer, boolean, char Výčtový typ a typ interval Typ řetězec Upřesnění k příkazům přiřazení, vstupu a výstupu Datové struktury Typ pole. Datové typy.
E N D
Informatika I4. přednáška RNDr. Jiří Dvořák, CSc. dvorak@uai.fme.vutbr.cz
Obsah přednášky • Datové typy real, integer, boolean, char • Výčtový typ a typ interval • Typ řetězec • Upřesnění k příkazům přiřazení, vstupu a výstupu • Datové struktury • Typ pole Informatika I: přednáška 4
Datové typy Datový typ je určen množinou hodnot a množinou operací. Datové typy můžeme členit např. podle těchto hledisek: • Hledisko strukturovanosti: • jednoduché typy (jejich hodnoty jsou dále nedělitelné) • strukturované typy, • Hledisko vztahu k programovacímu jazyku: • typy v jazyku předdefinované (jsou pro ně definovány množiny hodnot i operací) • typy definované uživatelem (součástí jazyka jsou některé operace a dále nástroje pro definici množin hodnot) • abstraktní typy (v jazyku pro ně neexistují žádné explicitní nástroje) Informatika I: přednáška 4
Datové typy v jazyku Pascal • Jednoduché typy: real, integer, boolean, char, výčet, interval, řetězec (má i některé rysy strukturovaného typu), ukazatel • Strukturované typy: pole, množina záznam, soubor • Předdefinované typy: real, integer, boolean, char • Typy definované uživatelem: výčet, interval, řetězec, pole, množina záznam, soubor, ukazatel Informatika I: přednáška 4
Typ integer • Množina hodnot: celá čísla z intervalu [ maxint1, maxint]; maxint = 2n1 1 kde n je počet bitů pro uložení hodnoty • Aritmetické operátory: + , , * , div… celočíselné dělení, mod … získání zbytku po celočíselném dělení • Relační operátory: = , <>, < , <= , > , >= • Příklady funkcí: abs… absolutní hodnota, sqr… druhá mocnina, odd… test, zda číslo je liché Informatika I: přednáška 4
Příklady k typu integer Příklady konstant: 123, -12, +17 Příklady výsledků některých operací: 7 div 2 = 3 7 mod 2 = 1 Příklady hodnot některých funkcí (I je typu integer): ord(I) = I pred(I)= I-1 succ(I)= I+1 odd(17)= true odd(24)= false Informatika I: přednáška 4
Celočíselné typy v Delphi 6 Typ rozsah počet bytů Integer –2147483648 .. 2147483647 4 Cardinal 0 .. 4294967295 4 Shortint –128 .. 127 1 Smallint –32768 .. 32767 2 Longint –2147483648..2147483647 4 Int64 –263.. 263–1 8 Byte 0 .. 255 1 Word 0 .. 65535 2 Longword 0 .. 4294967295 4 Informatika I: přednáška 4
Typ real • Množina hodnot: konečná množina racionálních čísel; její rozsah je dán počtem bytů použitých pro reprezentaci • Aritmetické operátory: + , , * , / • Relační operátory: = , <> , < , <= , > , >= • Příklady funkcí: sqrt… druhá odmocnina sqr, abs, sin, cos, arctan, exp, ln Funkce pro převod na typ integer: trunc… odseknutí desetinné části, round… zaokrouhlení Informatika I: přednáška 4
Příklady k typu real Příklady konstant: 1.23, -0.12, +1.7, 1E6, 0.25E-4 Příklady hodnot konverzních funkcí: trunc(25.31)= 25 trunc(48.95)= 48 round(25.31)= 25 round(48.95)= 49 Informatika I: přednáška 4
Reálné typy v Delphi 6 Typ Real Real48 Single Double Extended Comp Currency rozsah 5.0 × 10–324 .. 1.7 × 10308 2.9 × 10–39 .. 1.7 × 1038 1.5 × 10–45 .. 3.4 × 1038 5.0 × 10–324 .. 1.7 × 10308 3.6 × 10–4951 .. 1.1 × 104932 –263+1 .. 263 –1 –922337203685477.5808 .. 922337203685477.5807 počet bytů 8 6 4 8 10 8 8 Informatika I: přednáška 4
Typ boolean • Množina hodnot: true … pravda, false … nepravda • Relační operátory: = , <> , < , <= , > , >= platí vztah false<true • Logické operátory: not … negace, and … konjunkce (logický součin), or … disjunkce (logický součet) Informatika I: přednáška 4
Příklady k typu boolean Příklady výsledků logických operací: not false = true true and false = false true or false = true Příklady hodnot některých funkcí: ord(false) = 0 pred(true) = false succ(false)= true Informatika I: přednáška 4
Typ char • Množina hodnot: 256 znaků kódu ASCII (American Standard Code for Information Interchange); znaky jsou očíslovány od 0 do 255. Číslice, velká písmena, malá písmena zaujímají souvislé intervaly a mají přirozené uspořádání. • Zápisy konstant: 'znak',#pořadové_číslo_znaku • Relační operátory: Výsledek srovnání znaků je stejný, jako kdybychom srovnávali jejich ordinální čísla. • Příklady funkcí: ord, pred, succ chr … inverzní funkce k funkci ord Informatika I: přednáška 4
Příklady k typu char Příklady konstant: 'A', '5', '+', #65 Výrazy 'A' a #65 reprezentují stejnou hodnotu. Příklady výsledků relačních operací: 'A' > 'B' = false 'P' < 'Q' = true Příklady hodnot některých funkcí: ord('1')= 49, ord('A')= 65, ord('a')= 97, pred('Q')= 'P', succ('A')= 'B', chr(49)= '1', chr(65)= 'A', chr(ord('H')+ord('a')-ord('A'))='h' Informatika I: přednáška 4
Příklady výrazů s typem char Podmínka pro test, zda hodnotou proměnné Zn je velké písmeno: ('A'<=Zn) and (Zn<='Z') Převod velkého písmene na malé (předpokládáme, že proměnná Zn obsahuje velké písmeno): chr(ord(Zn)+ord('a')-ord('A')) Informatika I: přednáška 4
Možnosti deklarace proměnných pro uživatelsky definované typy a) Pomocí pojmenovaných typů: type ident_typu = typ; var ident_prom : ident_typu; b) Pomocí nepojmenovaných typů: var ident_prom : typ; Informatika I: přednáška 4
Výčtový typ • Definice: (hodnota1, hodnota2, … ) • Vlastnosti: Typ výčet je ordinální typ a jeho hodnotami jsou identifikátory. Každá hodnota v seznamu má určené pořadí, počínaje nulou. Jsou definovány relační operace a funkce ord, pred, succ. Hodnoty výčtového typu nemohou být použity při čtení/zápisu z/do textového souboru. • Využití: • konstrukce množiny, • indexování pole, • hodnoty selektoru větvení v příkazu case Informatika I: přednáška 4
Příklady pro výčtový typ Definice typů a deklarace proměnných: type TDen = (Po,Ut,St,Ct,Pa,So,Ne); TBarva =(cervena,zluta,modra,fialova); var Den:TDen; B1,B2:TBarva; Teplota:(nizka,stredni,vysoka); Výsledky relačních operací: Po < So = true cervena > modra = false Hodnoty některých funkcí: ord(Po)=0, ord(zluta)=1, pred(Ne)=So, succ(modra)=fialova Informatika I: přednáška 4
Typ interval • Definice: konstanta1 .. konstanta2 • Vlastnosti: Typ interval vymezuje interval hodnot v množině hodnot nějakého ordinálního typu a jsou pro něj definovány tytéž operace jako pro hostitelský typ. • Využití: • konstrukce množiny • indexování pole • hodnoty selektoru větvení v příkazu case Informatika I: přednáška 4
Příklady pro typ interval Definice typů a deklarace proměnných: type TDen = (Po,Ut,St,Ct,Pa,So,Ne); TPracDen = Po..Pa; TVelkaPismena = 'A'..'Z'; TRozsahIndexu = 1..100; var PD: TPracDen; VP1,VP2: TVelkaPismena; i,j: TRozsahIndexu; Cfr: '0'..'9'; Informatika I: přednáška 4
Typ řetězec • Definice: string[max_délka] • Vlastnosti: Max_délka je celé číslo z intervalu [1, 255]. Řetězec je vlastně jednorozměrné pole znaků. • Reprezentace: Řetězec je uložen v (max_délka + 1) bytech. Nultý byte obsahuje znak, jehož ordinální číslo určuje skutečnou délku řetězce. • Konstanta: 'posloupnost znaků' Posloupnost znaků může být i prázdná. Pozn.: Typ string bez uvedení délky je standardní typ, který je v Turbo Pascalu totožný s typem string[255]. Od verze Delphi 2 tento typ umožňuje pracovat s delšími řetězci, které jsou reprezentovány jinak, než je uvedeno výše. Informatika I: přednáška 4
Operace nad typem řetězec • Přístup ke složce: ProměnnáTypuŘetězec[index] Index je výraz celočíselného typu. • Relační operace: Řetězce se porovnávají lexikograficky (porovnávají se znaky na 1.pozici, v případě jejich shody znaky na 2.pozici, atd.) • Spojení řetězců: Ke spojování řetězců slouží operátor +. • Přiřazení: Proměnné typu řetězec je možno přiřadit výraz typu znak nebo výraz libovolného typu řetězec. • Určení délky řetězce: length(výraz typu řetězec) Informatika I: přednáška 4
Příklady pro typ řetězec Definice typů a deklarace proměnných: type TRetezec = string[20]; var R1,R2:TRetezec; S1,S2:string[50]; S:string; Výsledky relačních operací: 'ABB'<'ABBA'= true, 'ABA'<'ABBA'= true 'ABBA'<'BA'= true Spojování řetězců a hodnoty funkce length: S:=''; {pak length(S)=0} S:=S + 'ALFA'; {pak length(S)=4} S:=S + 'BETA'; {pak length(S)=8} writeln(S);` {vypise se text ALFABETA} Informatika I: přednáška 4
Příklady pro typ řetězec var Zn,Zn1,Zn2:char; S:string[100]; i,Pocet:integer; {Urceni poctu vyskytu znaku Zn v retezci S} Pocet:=0; for i:=1 to length(S) do if Zn=S[i] then Pocet:=Pocet+1; {Nahrada znaku Zn1 znakem Zn2 v retezci S} for i:=1 to length(S) do if S[i]=Zn1 then S[i]:=Zn2; Informatika I: přednáška 4
Příklady pro typ řetězec Otočení řetězců S a Str: var S,OS:string[100]; Str,OStr:string; i,N:integer; ... N:=ord(S[0]); {ord(S[0])=length(S)} OS[0]:=S[0]; {nastaveni delky retezce OS} for i:=1 to N do OS[i]:=S[N-i+1]; {Pro typ string se to v Delphi musi udelat takto:} N:=length(Str); SetLength(OStr,N); {nastaveni delky retezce OStr} for i:=1 to N do OStr[i]:=Str[N-i+1]; Informatika I: přednáška 4
Přiřazovací příkaz a)proměnná:=výraz Výraz na pravé straně se vyhodnotí a jeho hodnota se přiřadí proměnné. b)identifikátor_funkce:=výraz Tento příkaz se musí objevit v těle funkce definované uživatelem. Zajistí, že funkce vrátí vypočtenou hodnotu do příkazu, z něhož byla volána. Typy levé a pravé strany přiřazovacího příkazu musejí být kompatibilní vzhledem k přiřazení. Zjednodušeně řečeno to znamená, že oba typy jsou identické (přitom to nesmějí být typy soubor), nebo že množina hodnot typu pravé strany je podmnožinou hodnot typu levé strany. Informatika I: přednáška 4
Příkazy vstupu Vstup z klávesnice (v Turbo Pascalu nebo v konzolové aplikaci Delphi): read(proměnná) readln(proměnná)příkazy procedur readln eoln… funkce testující konec řádku eof … funkce testující konec souboru Příkazy vstupu mohou obsahovat několik proměnných, oddělených čárkami. Proměnné mohou být typu integer, real, char a řetězec. V normální aplikaci Delphi je vstup z klávesnice zajištěn např. pomocí komponenty Edit. Informatika I: přednáška 4
Příkazy výstupu Výstup na obrazovku (v Turbo Pascalu nebo v konzolové aplikaci Delphi): write(parametr) writeln(parametr)příkazy procedur writeln Příkazy výstupu mohou obsahovat několik parametrů oddělených čárkami. Možné tvary parametru: výrazceločíselné výrazy výraz:PočetZnaků výraz:PočetZnaků:PočDesMíst Výraz může být typu integer, real, boolean, char a řetězec. V normální aplikaci Delphi je výstup na obrazovku zajištěn např. pomocí komponenty Edit. Informatika I: přednáška 4
Příklady klasifikace datových struktur • Hledisko 1 (typ složek): • homogenní(složky stejného typu) • heterogenní (složky různého typu) • Hledisko 2 (proměnnost struktury): • statické (rozsah struktury, tj. rozsah přidělené paměti se během výpočtu nemění) • dynamické (během výpočtu se mění rozsah přidělené paměti a případně také vztahy mezi složkami struktury a jejich rozmístění v paměti) Informatika I: přednáška 4
Datové struktury v Pascalu množina pole záznam soubor homogenní statické heterogenní dynamická Informatika I: přednáška 4
Typ pole • Definice: array[TypIndexu] ofTypSložky array[TypIndexu1,TypIndexu2, … ] ofTypSložky • Vlastnosti: Typ indexu je ordinální typ. Informatika I: přednáška 4
Operace nad typem pole • Přístup ke složce: ProměnnáTypuPole[index] ProměnnáTypuPole[index1, index2, … ] Index je výraz ordinálního typu. • Přiřazení: Proměnná1TypuPole := Proměnná2TypuPole Musí se jednat o proměnné téhož typu pole. Informatika I: přednáška 4
Příklady pro typ pole Definice typů a deklarace proměnných: type TVektor = array[1..100] of real; TMatice = array[1..20,1..50] of integer; var X,Y:TVektor; A,B,C:TMatice; Cetnost:array['a'..'z'] of integer; Příklady přístupu ke složce pole: {i a j jsou typu integer, Zn je typu char} X[i], Y[2i], A[1,1], B[i,j+1], Cetnost['q'], Cetnost[Zn] Informatika I: přednáška 4
Příklady pro typ pole Výpočet součtu prvků pole: var X:array[1..200] of real; i,N:integer; {N je skutecny počet prvku} Suma:real; ... Suma:=0; for i:=1 to N do Suma:=Suma+X[i]; Informatika I: přednáška 4
Příklady pro typ pole Načtení matice typu (M,N): const MaxM=100; MaxN=100; type TMatice = array[1..MaxM,1..MaxN] of integer; var M,N,i,j:integer; A,B,C:TMatice; ... for i:=1 to M do for j:=1 to N do begin write('Zadej prvek ',i,',',j,': '); readln(A[i,j]); end; Informatika I: přednáška 4
Příklady pro typ pole Určení počtu odpracovaných hodin za týden: type TDen = (Po,Ut,St,Ct,Pa,So,Ne); var Den:TDen; OdpracZaTyden:real; Odpracovano:array[TDen] of real; ... OdpracZaTyden:=0; for Den:= Po to Ne do OdpracZaTyden:= OdpracZaTyden+Odpracovano[Den]; Informatika I: přednáška 4
Příklady pro typ pole Výpis tabulky četností malých písmen: var mp:'a'..'z'; Cetnost:array['a'..'z'] of integer; ... writeln('Tabulka cetnosti'); writeln; writeln('pismeno cetnost'); writeln('---------------'); for mp:= 'a' to 'z' do writeln(mp:4,Cetnost[mp]:9); Informatika I: přednáška 4