Informatika I 4 . přednáška
description
Transcript of Informatika I 4 . přednáška
Informatika I: přednáška 4 2
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 3
Datové typyDatový 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 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 5
Typ integerMnožina hodnot:
celá čísla z intervalu [ maxint 1, 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 6
Příklady k typu integerPříklady konstant:
123, -12, +17
Příklady výsledků některých operací:7 div 2 = 37 mod 2 = 1
Příklady hodnot některých funkcí (I je typu integer):ord(I) = I pred(I)= I-1succ(I)= I+1odd(17)= trueodd(24)= false
Informatika I: přednáška 4 7
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 8
Typ realMnož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 9
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)= 48round(25.31)= 25 round(48.95)= 49
Informatika I: přednáška 4 10
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 11
Typ booleanMnož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 12
Příklady k typu boolean
Příklady výsledků logických operací:
not false = truetrue and false = falsetrue or false = true
Příklady hodnot některých funkcí:
ord(false) = 0 pred(true) = falsesucc(false)= true
Informatika I: přednáška 4 13
Typ charMnož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_znakuRelační operátory:
Výsledek srovnání znaků je stejný, jako kdybychom srovnávali jejich ordinální čísla.
Příklady funkcí:ord, pred, succchr … inverzní funkce k funkci ord
Informatika I: přednáška 4 14
Příklady k typu charPříklady konstant:
'A', '5', '+', #65Vý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 15
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 16
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 17
Výčtový typDefinice:
(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 18
Příklady pro výčtový typDefinice 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 = truecervena > 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 19
Typ intervalDefinice:
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 20
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 21
Typ řetězecDefinice:
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 22
Operace nad typem řetězecPří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 23
Příklady pro typ řetězecDefinice 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 24
Příklady pro typ řetězecvar 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 25
Příklady pro typ řetězecOtoč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 26
Přiřazovací příkaza) 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 27
Příkazy vstupuVstup 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 28
Příkazy výstupuVýstup na obrazovku (v Turbo Pascalu nebo v konzolové aplikaci
Delphi):
write(parametr)writeln(parametr) příkazy procedurwriteln
Příkazy výstupu mohou obsahovat několik parametrů oddělených čárkami. Možné tvary parametru:
výraz celočí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 29
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 30
Datové struktury v Pascalu
množina
pole
záznam
soubor
homogenní statické
dynamická
heterogenní
Informatika I: přednáška 4 31
Typ pole
Definice:
array[TypIndexu] of TypSložky
array[TypIndexu1,TypIndexu2, … ]
of TypSložky
Vlastnosti:Typ indexu je ordinální typ.
Informatika I: přednáška 4 32
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 33
Příklady pro typ poleDefinice 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 34
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 35
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 36
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 37
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);