Učebné texty k maturitnej skúšky z Informatiky
(časť – Algoritmy a programovanie)
Algoritmizácia a programovanie – učebné texty
Učebné texty – Algoritmizácia a programovanie ............................................................7
1.1. Základné pojmy .......................................................................................................7
1.2. Premenná .................................................................................................................8
1.3. Priraďovací príkaz ...................................................................................................9
1.4. Príkaz vstupu..........................................................................................................11
1.5. Príkaz výstupu........................................................................................................12
1.6. Údajový typ............................................................................................................13
1.6.1. Typ INTEGER ....................................................................................................13
1.6.2. Typ REAL...........................................................................................................14
1.7. Deklarácia premenných .........................................................................................14
1.8. Aritmetické operácie ..............................................................................................14
1.9. Číselné funkcie ......................................................................................................16
1.10. Stavba programu ....................................................................................................16
1.10.1. Formáty zápisu reálnych čísiel ...........................................................................18
1.11. Podmienený príkaz ................................................................................................19
1.12. Zložená podmienka ...............................................................................................21
1.13. Cyklus FOR ...........................................................................................................22
1.14. Spracovanie postupnosti ........................................................................................24
1.15. Hľadanie maxima (minima) postupnosti ...............................................................26
1.16. Cyklus WHILE ......................................................................................................27
1.16.1. Zacyklenie ...........................................................................................................28
1.17. Typ CHAR ............................................................................................................29
1.18. Cyklus REPEAT ...................................................................................................30
1.18.1. Rozdiely medzi cyklom REPEAT a WHILE .....................................................31
1.19. Typ BOOLEAN ....................................................................................................32
1.19.1. Zisťovanie vlastnosti postupností .......................................................................33
1.20. Príkaz CASE .........................................................................................................34
1.21. Vnorené cykly .......................................................................................................35
1.22. Výstup na textovú obrazovku ................................................................................37
1.23. Unit CRT ...............................................................................................................38
1.24. Vstup z klávesnice.................................................................................................39
1.25. Knižnica CRT – vstup z klávesnice ......................................................................41
1.26. Kontrolovaný vstup ...............................................................................................44
1.27. Podprogram ...........................................................................................................45
1
Algoritmizácia a programovanie – učebné texty
1.27.1. Lokálne a globálne premenné .............................................................................47
1.27.2. Používanie premenných a podprogramov...........................................................48
1.28. Ponukový program ................................................................................................48
1.29. Typ pole.................................................................................................................50
1.30. Deklarácia konštánt ...............................................................................................54
1.31. Deklarácia typu .....................................................................................................56
1.32. Vymenovaný typ ...................................................................................................57
1.33. Typ interval ...........................................................................................................58
1.34. Typ reťazec ...........................................................................................................61
1.35. Vyhľadávanie ........................................................................................................63
1.36. Textový súbor ........................................................................................................65
1.36.1. Chybové hlásenia pri práci s textovým súborom ................................................69
1.37. Generovanie náhodných údajov ............................................................................71
1.38. Štandardné procedúry a funkcie pre typ STRING ................................................73
1.38.1. Príklady ...............................................................................................................75
1.39. Procedúry s parametrami .......................................................................................76
1.39.1. Parameter ............................................................................................................78
1.40. Funkcia ..................................................................................................................81
1.41. Triedenie................................................................................................................82
1.41.1. Triedenie cez maximum – MAXSORT ..............................................................83
1.41.2. Triedenie prebublávaním – BUBBLESORT ......................................................84
2
Algoritmizácia a programovanie – učebné texty
3
Učebné texty – Algoritmizácia a programovanie
1 .1 . Z á k l a d n é p o jm y
Algoritmus
je
postup
riešenia
nejakého
problému
(postupnosť
p r í k a z o v , k t o r é p r o c e s o r d o k á ž e z r e a l i z o v a ť a k t o r é v e d ú k v yr i e š e n i u
daného problému).
Algoritmus
je
postup
transformácie
v s t u p n ýc h
dát
na
v ýs t u p n é
( v s t u p n é d á t a s ú t i e , k t o r é p r o c e s o r u n a z a č i a t k u z a d á v a m e , v ýs t u p n é
s ú v ýs l e d k y, k t o r é v yp o č í t a . )
Vlastnosti algoritmu:
1. hromadnosť - algoritmus rieši nie jeden konkrétny problém,
ale
celú
skupinu
úloh
podobného
charakteru.
Napr.
nemá
v ýz n a m v yr á b a ť a l g o r i t m u s p r e r i e š e n i e k o n k r é t n e j k v a d r a t i c k e j
r o v n i c e x 2 + 5 x + 6 = 0 , a l e m ô ž e m e v yr o b i ť a l g o r i t m u s p r e r i e š e n i e
k v a d r a t i c k e j r o v n i c e s ľ u b o v o ľ n ým i k o e f i c i e n t a m i a x 2 + b x + c = 0 ,
kde koeficienty a, b , c sa zadajú ako vstupné dáta.
2. deterministickosť (podmienenosť) - v každom okamihu výpočtu
j e p r e s n e u r č e n á o p e r á c i a , k t o r á s a m á v yk o n a ť ( n i č n i e j e
p o n e c h a n é n a n á h o d u , v a l g o r i t m e s a n e v ys k yt u j ú n á h o d n é
operácie).
3. rezultatívnosť
(konečnosť)
-
v ýp o č e t
podľa
algoritmu
sa
skončí po konečnom počte krokov.
P r o g r a m j e a l g o r i t m u s z a p í s a n ý v p r o g r a m o v a c o m j a z yk u . J e t o
p o s t u p n o s ť d e k l a r á c i í a p r í k a z o v v yj a d r u j ú c a p o s t u p t r a n s f o r m á c i e
v s t u p n ýc h d á t n a v ý s t u p n é .
P r o g r a m o v a c í j a z y k - j a z yk , k t o r é m u p o č í t a č r o z u m i e ( t . j . j a z yk ,
ktorému rozumie sám procesor, alebo ktorému rozumie počítač len
v t e d y,
ak
prekladač).
má
k
dispozícii
príslušné
programové
v yb a v e n i e
-
Algoritmizácia a programovanie – učebné texty
4
Programovací jazyk, ktorému rozumie priamo procesor sa nazýva strojový kód.
Program v tomto jazyku tvo rí postupnosť elektrických signálov kódovaných
pomocou jednotiek a núl. Zápis programu je neprehľadný a rozsiahly. Vyššie
programovacie
programu
potrebný
je
jazyky
sú
stručnejší.
prekladač,
bližšie
jazyku
Procesor
ale
program,
človeka,
tomuto
ktorý
zrozumiteľnejšie
jazyku
preloží
nerozumie,
program
a
zápis
preto
z
je
vyššieho
programovacieho jazyka do strojového.
Gramatika programovacieho jazyka: tvorí ju
1 . m n o ž i n a s y m b o l o v p r í p u s t n ýc h p r e z á p i s p r o g r a m u ( n a p r . v
P a s c a l e s ú p r í p u s t n é s ym b o l y: b e g i n , * , : = , A , B , C , . . . )
2 . m n o ž i n a p r a v i d i e l s p á j a n i a t ýc h t o s ym b o l o v d o j a z y k o v ýc h
konštrukcií,
tzv.
konštrukcia
A:=begin
syntax
programovacieho
jazyka .
(Napr.
j e z l o ž e n á z p r í p u s t n ýc h s y m b o l o v ,
a l e n i e j e v yt v o r e n á p o d ľ a s yn t a k t i c k ý c h p r a v i d i e l . )
S é m a n t i k a p r o g r a m o v a c i e h o j a z y k a j e l o g i c k ý v ýz n a m j a z yk o v e j
konštrukcie
vytvorenej
N a p r . s yn t a k t i c k é p r a v i d l o
podľa
s yn t a k t i c k é h o
pravidla.
<premenná>:=<výraz>
má logický
v ýz n a m ( s é m a n t i k u ) : v ýr a z n a p r a v e j s t r a n e s a v yh o d n o t í a v ýs l e d o k
sa priradí premennej na ľavej strane.
1 .2 . P r em e n n á
P o č í t a č s p r a c o v á v a d á t a ( n a p r . č í s l a , z n a k y, . . . ) , k t o r é s ú u l o ž e n é v
p a m ä t i v t z v . p r e m e n n ýc h .
Premenná je objekt označený menom (identifikátorom), ktorý má
u r č i t ú h o d n o t u . H o d n o t a p r e m e n n e j s a m ô ž e v p r i e b e h u v ýp o č t u
meniť.
Identifikátor (meno, názov) je reťazec (postupnosť znakov) zložený
z p í s m e n , č í s l i c a p o d č i a r k o v n í k a ( _ ) . P r v ý z n a k n e s m i e b yť č í s l i c a .
Malé a veľké písmená sa nerozlišujú.
Algoritmizácia a programovanie – učebné texty
Identifikátorom
sa
označujú
nielen
5
premenné,
ale
aj
ostatné
objekty
v
programe, o ktorých sa budeme učiť neskôr: konštanty, typy, podprogramy i
samotný program.
Príklady
p r í p u s t n ýc h
identifikátorov:
A,
SUMA,
CISLO3,
NOVY_CLEN
Príklady
n e p r í p u s t n ýc h
identifikátorov:
3CISLO,
A -BOD,
C*
Doporučenie: Názov premennej volíme tak, aby napove dal, čo daná premenná
obsahuje. Ak chcem mat v premennej uložené napr. číslo poschodia, nazvem ju
CISLO_POSCH, alebo C_POSCH, alebo CP.
1 .3 . P r i r a ď o v a c í p r í k a z
Slúži na priradenie hodnoty premennej.
Syntax: <premenná> := <výraz>
Zátvorky < > sú len pomocné znaky označujúce, že miesto symbolu v týchto
zátvorkách budeme písať to, čo daný symbol vyjadruje. Napr. miesto symbolu
<premenná> napíšeme konkrétnu premennú, napr. X. Všetko, čo je mimo týchto
ostrých zátvoriek musí byť v príkaze napísané presne tak, ako v syntaktickom
pravidle.
< v ýr a z >
môže
byť
aritmetický
matematiky
zložený
z
+(sčítanie),
-(odčítanie),
v ýr a z ,
konštánt
a
tak
ako
ho
p r e m e n n ýc h ,
*(násobenie),
/(delenie),
poznáme
z
operátorov:
o k r ú h l yc h
zátvoriek,... .
< v ýr a z > t e d a m ô ž e b yť :

konštanta (3, -25, 4.51)

premenná (I, CISLO5)

z l o ž i t e j š í a r i t m e t i c k ý v ýr a z ( I + 1 , A * B + 5 )
S é m a n t i k a : h o d n o t a v ýr a z u n a p r a v e j s t r a n e s a u l o ž í d o p r e m e n n e j n a
ľavej strane.
Algoritmizácia a programovanie – učebné texty
6
Zatiaľ budeme do premenných priraďovať len číselné hodnoty, neskôr budeme
pracovať aj s inými typmi údajov.
Príklady priraďovacích príkazov :
A := 5
do premennej A sa uloží hodnota 5
A := B + 3
do premennej A sa uloží hodnota o 3 väčšia než je v
premennej B
A := A + 1
h o d n o t a p r e m e n n e j A s a z v ýš i o 1
A := A * 2
hodnota premennej A sa zdvojnásob í
Príklady:
1. V premennej A je uložená dĺžka strany štvorca. Do premennej
OBV chceme priradiť číselnú hodnotu obvodu štvorca a do
premennej OBS číselnú hodnotu obsahu štvorca. Použijeme
p r í k a z y:
OBV := 4 * A;
OBS := A * A;
Ak máme viac príkazov v postupn osti, oddeľujeme ich bodkočiarkou.
Do zložených zátvoriek zapíšeme začiatočný a konečný stav premenných.
2. {A, B sú rozmery obdĺžnikovej záhrady}
P := A * B;
{P je plocha záhrady}
Ú l o h y p r e v á s - d o p l ň t e p r i r a ď o v a c i e p r í k a z y:
1. {R .. polomer kruhu}
?????
{OBV .. obvod kruhu, OBS .. obsah kruhu}
Algoritmizácia a programovanie – učebné texty
7
2. {T1, T2, T3 .. tri teploty namerané ráno, na obed a večer}
?????
{PRIEM_TEPL .. priemerná denná teplota}
3. {A =  }
Tento zápis znamená, že v premennej A je nejaká číselná hodnota, vo
všeobecnosti sme ju označili 
}
?????
?????
{A = 3 * , B = 12 * }
4. Miško
má
M
jabĺk
a
Janko
J
jabĺk.
Zapíšte
pomocou
priraďovacích príkazov:
o
Janko dostal o 5 jabĺk viac ako Miško
o
Miško zjedol všetky jablká
o
Janko dal 3 jablká Miškovi
o
Janko dal Miškovi toľko jabĺk, aby mali rovnako
5. * {A = , B = }
?????
{A = , B = }
1 .4 . P r í k a z v s t u p u
slúži na priradenie hodnoty premennej zo vstupného zariadenia (napr.
z klávesnice).
Syntax: readln ( <zoznam premenných> )
< z o z n a m p r e m e n n ý c h > j e p o s t u p n o s ť p r e m e n n ýc h o d d e l e n ýc h
čiarkami.
Sémantika:
do
p r e m e n n ýc h
uvedených
v
príkaze
uloží
hodnoty
z a d a n é z k l á v e s n i c e . ( A k s ú t o č í s e l n é h o d n o t y, m ô ž u b y ť z a d a n é v
jednom vstupnom riadku oddelené medzerami.)
Algoritmizácia a programovanie – učebné texty
Napríklad: príkaz
readln(A,B,X3)
8
znamená, že počítač čaká na
zadanie troch hodnôt z klávesnice. P rvú uloží do premennej A, druhú
do premennej B a tretiu do premennej X3.
1 .5 . P r í k a z v ý s t u p u
s l ú ž i n a v yp í s a n i e h o d n ô t n a o b r a z o v k u .
Syntax: writeln ( <zoznam parametrov> )
<zoznam parametrov> je postupnosť parametrov oddelených čiarkami.
Parametrom môže byť :
1. číslo (5, 4.3)
2. premenná (A, B4)
3 . a r i t m e t i c k ý v ýr a z ( A + 4 , B + C * 7 )
4. text v apostrofách ('MAMA MA EMU')
S é m a n t i k a : p o č í t a č v yp í š e d o j e d n é h o r i a d k u n a o b r a z o v k e :
1. dané číslo
2. hodnotu danej premennej
3 . v ýs l e d n ú h o d n o t u d a n é h o v ýr a z u
4. daný text bez apostrof
Napríklad príkaz:
writeln( 'Kruh s polomerom ' , R , ' ma plochu ' , 3.14*R*R) má 4
parametre: text, premennú, text a výraz. Za predpokladu že premenná
P má hodnotu 10 vypíše na obrazovku nasledovné:
Kruh s polomerom 10 ma plochu 314
Algoritmizácia a programovanie – učebné texty
9
Príklad:
Č o v yp í š u n a o b r a z o v k u n a s l e d o v n é p r í k a z y, a k j e v p r e m e n n e j M
hodnota 5?
{ M=5 }
writeln('Misko ma M jablk.');
writeln('Misko ma ',M,'jablk.');
writeln('Misko ma M', jablk.)
1 .6 . Ú d a j o v ý t y p
Ú d a j o v ý t yp u r č u j e :

m n o ž i n u p r í p u s t n ýc h h o d n ô t

m n o ž i n u p r í p u s t n ýc h o p e r á c i í
Každá premenná použitá v programe musí mať určený typ. Typ určuje, aké
hodnoty
môžeme
do
premennej
priraďovať
a
aké
operácie
s
ňou
môžeme
vykonávať. Pre začiatok sa zoznámime s dvoma číselnými typmi - integer a real.
1.6.1.
Typ INTEGER
Množina hodnôt: celé čísla z intervalu -32 768 .. +32 767
Prípustné operácie: aritmetické ( + - * / div mod ) a relačné
( <
>
=
<>
<=
>= )
Div a mod sú operátory celočíselného delenia. Operácia div vráti
c e l o č í s e l n ý p o d i e l a o p e r á c i a m o d v r á t i z v yš o k p o c e l o č í s e l n o m
delení.
V matematike zapíšeme operáciu celočíselného delenia takto:
2 7 : 6 = 4 z v yš o k 3
A v Pascale takto:
27 div 6 = 4
Algoritmizácia a programovanie – učebné texty
10
27 mod 6 = 3
1.6.2.
Typ REAL
Množina hodnôt: reálne čísla
Prípustné operácie: aritmetické ( + - * / ) a relačné ( <
=
<>
<=
>
>= )
1 .7 . D e k l a r á c i a p r em e n n ý c h
D e k l a r o v a ť p r e m e n n ú z n a m e n á u r č i ť j e j t yp .
Syntax deklarácie: var <premenné> : <typ>
Napríklad:
var A:integer;
Prípustné
Neprípustné
B,C,D:real;
priradenia:
priradenia:
E:integer
A:=-10;
A:=1000000;
E:=20000;
E:=2.5
B:=7;
C:=4.345
1 .8 . A r i tm e ti c k é o p e rá c i e
V o v ýr a z e A + B n a z ýv a m e j e d n o t l i v é p r v k y t a k t o : A , B s ú o p e r a n d y
a + j e o p e r á t o r . A k s ú o b a o p e r a n d y t yp u i n t e g e r ( c e l é č í s l o ) ,
v ýs l e d o k v ýr a z u j e t i e ž t yp u i n t e g e r ( c e l é č í s l o ) . A k é h o t yp u b u d e
v ýs l e d o k p r e o s t a t n é o p e r á c i e a t yp y o p e r a n d o v u k a z u j e n a s l e d u j ú c a
tabuľka:
Algoritmizácia a programovanie – učebné texty
V ýr a z :
11
T yp o p e r a n d u A : T yp o p e r a n d u B : T yp v ýs l e d k u :
A + B
A – B
A * B
A / B
A div B
A mod B
integer
integer
integer
integer
real
real
real
integer
real
real
real
real
integer,real
integer,real
r e a l ( v ž d y)
integer
integer
integer
Z l o ž i t e j š í v ýr a z o b s a h u j ú c i v i a c o p e r á t o r o v s a v yh o d n o c u j e t a k , ž e
operácie
*
/
div
mod
majú
v yš š i u
prioritu
ako
+
-.
ľ u b o v o ľ n e j o p e r á c i e z v ýš i m e p o m o c o u o k r ú h l yc h z á t v o r i e k .
Príklad č. 1:
Máme zadeklarované premenné:
var A,B,C:integer;
D,E:real
U r č t e t yp y t ý c h t o v ý r a z o v :
a) A + D
b) (A + B) * C
c) (A + B) / C
d) (A - C) * (C + E)
e) B div 5 + E
f) B div (5 + E)
g) A / B div C
Príklad č. 2: Máme zadeklarované premenné:
var A,B,C:integer;
D,E:real
Určte, ktoré priraďovacie príkazy sú neprípustné:
a) D := A / B
b) D := A div B
c) A := C / D
d) A := C div D
e) E := C / D
Prioritu
Algoritmizácia a programovanie – učebné texty
12
1 .9 . Č í s e l n é f u n k c i e
Ak chceme číslo A umocniť na druhú, v matematike to zapíšeme: A2.
V P a s c a l e t o z a p í š e m e p o m o c o u f u n k c i e S Q R ( A ) . A s a n a z ýv a
parametrom
funkcie.
Ak
je
parametrom
tejto
funkcie
číslo
4,
d o s t a n e m e a k o v ýs l e d o k 1 6 . A k j e p a r a m e t e r t yp u i n t e g e r , v ýs l e d o k
j e t i e ž t yp u i n t e g e r . P o u ž i t i e n i e k t o r ý c h f u n c k i í , t yp i c h a r g u m e n t o v
a v ýs l e d k o v p o p i s u j e t á t o t a b u ľ k a :
Typ
Typ
parametra:
výsledku:
Príklad:
Popis:
Funkcia:
celá časť čísla
TRUNC(A)
real, integer integer
TRUNC(2.7)=2
zaokrúhlenie
ROUND(A)
real, integer integer
ROUND(2.7)=3
ABS(A)
real, integer
SQR(A)
real, integer
SQRT(A)
real, integer real
SQRT(16)=4
sínus
SIN(A)
real, integer real
SIN(0)=0
cosínus
COS(A)
real, integer real
COS(0)=1
arcustangens
ARCTAN(A) real, integer real
absolútna
hodnota
druhá mocnina
druhá
odmocnina
1 .1 0 .
real,
integer
real,
integer
S t a v b a p r o g r am u
program <meno>
hlavička programu
<deklarácie>;
deklaračná časť
begin
<príkaz>;
<príkaz>;
...
<príkaz>
end.
príkazová časť
ABS(-7.1)=7.1
SQR(4)=16
ARCTAN(0)=0
Algoritmizácia a programovanie – učebné texty
13
Meno programu je identifikátor, ako sme si ho opísali v časti
"Premenná".
Názov
programu
volíme
podľa
toho,
aký
problém
p r o g r a m r i e š i . P r o g r a m n a v ýp o č e t m i e z d m ô ž e m e n a p r . n a z v a ť
MZDY, alebo VYPOCET_MIEZD
Ten istý identifikátor nemôžeme použiť na označenie dvoch rôznych objektov,
napr.
programu
i
premennej.
V
opačnom
prípade
zahlási
počítač
chybu:
„Duplicate identifier“ (duplikovaný identifikátor).
V d e k l a r a č n e j č a s t i z a p i s u j e m e d e k l a r á c i e p r e m e n n ýc h ( n e s k ô r i
i n ýc h o b j e k t o v ) , k t o r é b u d ú p o u ž i t é v p r í k a z o v e j č a s t i . A k b y s m e v
príkazovej časti použili preme nnú, ktorú sme zabudli zadeklarovať,
p o č í t a č b u d e h l á s i ť c h yb u : „ U n k n o w n
identifier“ (neznámy
identifikátor).
P r í k l a d : M i š k o k r á č a l d o š k o l y r o v n o m e r n o u r ýc h l o s ť o u V m e t r o v z a
sekundu. Ako dlho mu trvala cesta, ak je škola vzdialená S metrov?
Úlohou programu je pre dané vstupné hodnoty V a S vypočítať výstupnú hodnotu
T - čas trvania cesty do školy. Vstupné a výstupné hodnoty je dobré zapísať si
už na začiatku riešenia problému. Vstupné hodnoty program načíta, výstupné
vypíše ako výsledok.
{ V S T : V . . r ýc h l o s ť p o h yb u ( r e á l n e č í s l o ) , S . . d r á h a ( r e á l n e č í s l o ) }
{ V Ý S : T . . č a s t r v a n i a p o h yb u ( r e á l n e č í s l o ) }
program CESTA_DO_SKOLY;
var V,S,T:real;
begin
readln(V,S);
T:=S/V;
writeln('Miskovi trvala cesta ',T,' sekund.')
end.
T a k t o z a p í s a n ý p r o g r a m j e s p r á v n y. K e ď s i h o v š a k s p u s t í m e n a
počítači, zistíme, že má určité chybičky krásy:
1. Keď
program
spustíme,
počítač
najskôr
čaká
na
zadanie
v s t u p n ýc h h o d n ô t V a S . N e z a i n t e r e s o v a n ý u ž í v a t e ľ v š a k n e t u š í ,
Algoritmizácia a programovanie – učebné texty
14
prečo sa program hneď na začiatku "zasekol". Preto je vhodné
p r e d k a ž d ým p r í k a z o m r e a d l n v yp í s a ť n a o b r a z o v k u v ý z v u p r e
užívateľa, čo má zadať, napr.:
writeln('Zadaj rychlost a drahu!');
readln(V,S);
alebo krajšie:
writeln('Zadaj rychlost!');
readln(V);
writeln('Zadaj drahu!');
readln(S);
2 . K e ď v ýp o č e t s k o n č í , p o č í t a č v yp í š e v ýs l e d o k n a o b r a z o v k u ,
nestihneme si ho ani prečítať a hneď sa obrazovka prepne do
e d i t o v a c i e h o r e ž i m u . A k c h c e m e , a b y p o v yp í s a n í v ýs l e d k u
počítač počkal, musíme ho k tomu prinútiť. Ako posledný
p r í k a z p r o g r a m u d á m e " p r á z d n y" r e a d l n . T e n t o p r í k a z n e b u d e
nič načítavať, len počká, až užívateľ stlačí Enter.
3 . P o s p u s t e n í p r o g r a m u z i s t í m e , ž e n á m p o č í t a č v yp í s a l v ýs l e d o k
asi
v
takomto
tvare:
2.1234560000E+02
.
Pre
bežného
p o u ž í v a t e ľ a j e m o ž n o t a k ýt o t v a r n e z r o z u m i t e ľ n ý, p r e t o b y s m e
h o m a l i p r e f o r m á t o v a ť . O f o r m á t o v a n o m v ýs t u p e s a d o č í t a t e
ďalej.
1 . 1 0 . 1 . F o r má t y z á p i s u r e á l n y c h č í s e l
Reálne číslo môžeme zapísať dvoma spôsobmi:

b e ž n ý t v a r ( a k o h o p o z n á m e z m a t e m a t i k y) , n a p r . : 0 . 0 0 1 2 3

s e m i l o g a r i t m i c k ý t v a r ( a k o h o p o z n á m e z k a l k u l a č k y) , n a p r . :
1.23E-3
Algoritmizácia a programovanie – učebné texty
15
Hodnota takto zapísaného čísla je: 1.23E -3 = 1,23 . 10-3 =
0,00123
A k p o u ž í v a m e v p r o g r a m e p r e m e n n ú t y p u r e a l a n e c h á m e j u v yp í s a ť
n a o b r a z o v k u , p o č í t a č j u v yp í š e v s e m i l o g a r i t m i c k o m t v a r e . A k j u
n e c h á m e v yp í s a ť v p r e d p í s a n o m f o r m á t e , v yp í š e j u v b e ž n o m t v a r e .
Formátovaný výstup: v príkaze writeln zapíšeme za príslušný výraz
d v o j b o d k u a c e l k o v ý p o č e t m i e s t p r e v ýp i s , r e s p . ď a l š i u d v o j b o d k u a
p o č e t d e s a t i n n ýc h m i e s t .
var A:integer;
B:real;
begin
A:=-25;
B:=8.4E-2;
writeln('Cisla su', A:7 , B:10:4)
end.
P r o g r a m v yp í š e č í s l o - 2 5 n a s e d e m m i e s t , t . z n . d o p l n í š t yr i m e d z e r y
zľava a číslo 0.084 na desať miest, z toho budú 4 desatinné, t.zn.
d o p l n í j e d n u n u l u s p r a v a a š t yr i m e d z e r y z ľ a v a :
Cisla su
1 .1 1 .
-25
0.0840
P o dm i e n e n ý p r í ka z
- p r í k a z , k t o r é h o v y k o n a n i e j e v i a z a n é n a s p l n e n i e u r č i t e j p o d m i e n k y.
Podmienený príkaz je štruktúrovaný príkaz, to znamená že je zložený
z i n ýc h j e d n o d u c h š í c h p r í k a z o v .
Syntax:
if <logický výraz>
then <príkaz>
else <príkaz>
< l o g i c k ý v ý r a z > j e v ýr a z , k t o r é h o v ýs l e d n á h o d n o t a j e ' p r a v d a ' a l e b o
' n e p r a v d a ' . M ô ž e t o b yť p o d m i e n k a z a p í s a n á v t v a r e : A < B a l e b o
C*10 <= D
a pod.
Algoritmizácia a programovanie – učebné texty
16
< p r í k a z > j e ľ u b o v o ľ n ý p r í k a z ( p r i r a ď o v a c í , p r í k a z v s t u p u , v ýs t u p u ,
podmienený príkaz,...)
S é m a n t i k a : A k j e l o g i c k ý v ý r a z ( p o d m i e n k a ) p r a v d i v ý, v yk o n á
p r í k a z n a v e t v e ' t h e n ' , a k j e n e p r a v d i v ý, v yk o n á p r í k a z n a v e t v e
'else'.
Príklad:
if A mod 2 = 0
then writeln('Cislo ',A,' je parne.')
else writeln('Cislo ',A,' je neparne.')
Tento príkaz podľa hodnoty zvyšku po delení čísla A dvoma vypíše, že číslo A je
párne, resp. nepárne.
Neúplný podmienený príkaz - bez vetvy else:
if <logický výraz>
then <príkaz>
Ak podmienka platí, vykoná sa uvedený príkaz, ak podmienka neplatí, príkaz sa
nevykoná.
M ô ž e s a s t a ť , ž e a k p o d m i e n k a p l a t í , c h c e m e a b y s a v yk o n a l n i e
jeden, ale viac príkazov. Ale na vetvu then (to isté platí pre else)
môžeme dať len jeden príkaz. V tomto prípade musíme všetky
p r í k a z y, k t o r é c h c e m e m a ť n a j e d n e j v e t v e , z j e d n o t i ť d o j e d n é h o
z l o ž e n é h o p r í k a z u - s e k v e n c i e - o z n a č e n e j s ym b o l m i b e g i n a e n d :
begin
<príkaz>;
<príkaz>;
...
<príkaz>
end
Príklad:
{A=20, B=10}
if A<=B
then begin A:=A+1;
B:=B-A
end
else begin B:=B+1;
Algoritmizácia a programovanie – učebné texty
17
A:=A-B
end
{A=?, B=?}
Riešenie: podmienka A<=B sa vyhodnotí ako nepravdivá, pretože 20 ni e je
menšie ani rovné ako 10, preto sa vykonajú príkazy na vetve else. Konečné
hodnoty premenných budú A=9, B=11.
Príklady pre vás:
1. Janko má záhradu s rozmermi A x B metrov, Miško má záhradu
s r o z m e r m i C x D m e t r o v . P r o g r a m n a č í t a A , B , C , D a v yp í š e , k t o
má väčšiu záhradu (s väčšou plochou).
2 . P r o g r a m n a č í t a č í s l o a v yp í š e n a o b r a z o v k u j e h o v l a s t n o s t i : č i
je celé/má desatinnú časť, kladné/záporné/nula. Napr. číslo
25.31 je kladné s desatinnou časťou, -8 je záporné celé, a pod.
3 . M i š k o s J a n k o m s ú ť a ž i l i v h o d e g u ľ o u . K a ž d ý m a l d v a p o k u s y,
z k t o r ýc h s a p o č í t a l t e n l e p š í . V yt v o r t e p r o g r a m , k t o r ý n a č í t a
h o d n o t y p o k u s o v o b o c h p r e t e k á r o v a v yp í š e , k t o r ý z n i c h
v yh r a l .
Z l o ž e n á p o dm i e n k a
1 .1 2 .
je
zložená
z
jednoduchších
podmienok
s
použitím
l o g i c k ýc h
operátorov AND (konjunk cia), OR (disjunkcia, alternatíva), NOT
(negácia).
Spôsob
v yh o d n o c o v a n i a
z l o ž e n ýc h
podmienok
ukazujú
nasledovné tabuľky:
Podmienka1 Podmienka2 Podmienka1 AND Podmienka2
pravda
pravda
pravda
pravda
nepravda
nepravda
nepravda
pravda
nepravda
nepravda
nepravda
nepravda
Podmienka1 NOT Podmienka1
pravda
nepravda
nepravda
pravda
Algoritmizácia a programovanie – učebné texty
18
Podmienka1 Podmienka2 Podmienka1 OR Podmienka2
pravda
pravda
pravda
pravda
nepravda
pravda
nepravda
pravda
pravda
nepravda
nepravda
nepravda
P r i z l o ž e n ýc h p o d m i e n k a c h s i m u s í m e d a ť p o z o r n a p r i o r i t u o p e r á c i í .
Ak chceme zapísať podmienku, že číslo A je z intervalu <10;100>,
m u s í m e p o u ž i ť o k r ú h l e z á t v o r k y:
(C>=10)AND(C<=100)
pretože priorita operácií je nasledovná:
1. NOT
2. AND
3. OR
4. < > =
Príklady pre vás:
1 . P r o g r a m n a č í t a r o k R a v yp í š e , č i v ň o m b o l a l e t n á o l y m p i á d a ,
zimná
o l ym p i á d a
alebo
nič.
Letná
o l ym p i á d a
je
v
roku
d e l i t e ľ n o m š t yr m i , z i m n á j e d v a r o k y p o l e t n e j .
2 . P r o g r a m n a č í t a t r i p r i r o d z e n é č í s l a A , B , C a z i s t í , č i m ô ž u b yť
stranami
trojuholníka.
Ak
áno,
v yp í š e
vlas tnosti
tohto
t r o j u h o l n í k a - r o v n o r a m e n n ý, r o v n o s t r a n n ý, p r a v o u h l ý.
1 .1 3 .
Cyklus FOR
- c yk l u s s o z n á m y m p o č t o m o p a k o v a n í .
C yk l u s j e p r í k a z , k t o r ý s a v yk o n á o p a k o v a n e , n i e k o ľ k o k r á t . A k s a d á
počet opakovaní presne určiť, použijeme príkaz FOR. Ak presný
Algoritmizácia a programovanie – učebné texty
19
počet nevieme, ale vieme, dokedy sa má opakovať, použijeme príkaz
WHILE a l e b o REPEAT.
Syntax:
for <premenná> := <výraz> to <výraz>
do <príkaz>
O b a v ýr a z y i p r e m e n n á m u s i a b yť t y p u i n t e g e r . P r í k a z v c yk l e m ô ž e
b yť l e n j e d e n , a k p o t r e b u j e m e z o p a k o v a ť v i a c p r í k a z o v , m u s í m e z
n i c h v yt v o r i ť s e k v e n c i u p o m o c o u ' b e g i n ' a ' e n d ' . P r e m e n n á s a n a z ýv a
r i a d i a c a p r e m e n n á c yk l u f o r - z j e d n o d u š e n e p o č í t a d l o .
Neskôr, keď sa zoznámime aj s inými typmi, budeme ich môcť použiť pre
premennú v cykle for, ale len ordinálne typy (celočíselné, char, vymenovaný
typ).
Sémantika: Na začiatku sa do premennej priradí hodnota prvého
v ýr a z u ( š t a r t o v a c i a h o d n o t a ) a p o k a ž d o m p r e c h o d e c y k l o m s a j e j
h o d n o t a z v ýš i o 1 . K e ď d o s i a h n e h o d n o t u d r u h é h o v ýr a z u ( k o n e č n ú
h o d n o t u ) , c yk l u s k o n č í . P r í k a z v c y k l e s a v yk o n á o p a k o v a n e p r e
v š e t k y c e l o č í s e l n é h o d n o t y p r e m e n n e j z i n t e r v a l u u r č e n é h o v ýr a z m i .
Príklad:
{ N=5 }
for i:=1 to N+5
do writeln(I)
Príkaz
writeln(I)
sa
v yk o n á
pre všetky hodnoty premennej
I z
i n t e r v a l u < 1 ; 1 0 > , t . z n . v ýs l e d o k b u d e t e n i s t ý, a k o k e b y s m e 1 0 - k r á t
zapísali príkaz writeln:
writeln(1);
writeln(2);
writeln(3);
writeln(4);
writeln(5);
writeln(6);
writeln(7);
writeln(8);
writeln(9);
writeln(10);
Algoritmizácia a programovanie – učebné texty
20
A k v c yk l e F O R p o u ž i j e m e m i e s t o s y m b o l u t o s ym b o l d o w n t o , b u d e
s a r i a d i a c a p r e m e n n á p o k a ž d o m p r e c h o d e c yk l o m z m e n š o v a ť o 1 :
for I:=5 downto 1
do writeln(I)
T e n t o p r í k a z v yp í š e p o d s e b a č í s l a 5 , 4 , 3 , 2 , 1 .
Počet opakovaní cyklu:
for I:=D to H
do ...
P o č e t o p a k o v a n í z á v i s í o d h r a n i č n ýc h h o d n ô t D a H a d á s a v yj a d r i ť
v ýr a z o m : H - D + 1 . A k s ú h r a n i č n é h o d n o t y D a H r o v n a k é , p r í k a z s a
zopakuje len raz. Ak je dolná hranica D väčšia ako horná hranica H,
p r í k a z v c yk l e s a n e v yk o n á a n i r a z .
Príklady:
1. Program načíta prirodzené číslo C a vypíše jeho malú násobilku
v tvare:
1 x C = ...
2 x C = ...
...
10 x C = ...
2. Program načíta prirodzené číslo C a vypíše všetky jeho delitele.
3 . P r o g r a m n a č í t a p r i r o d z e n é č í s l a A , N a v yp o č í t a h o d n o t u
mocniny AN.
4 . P r o g r a m n a č í t a p r i r o d z e n é č í s l o N a v yp í š e v š e t k y m o c n i n y
čísla 2 od nultej po N-tú.
1 .1 4 .
Spracovanie postupnosti
P o s t u p n o s ť j e s k u p i n a p r v k o v u s p o r i a d a n ýc h v r a d e z a s e b o u . K a ž d ý
prvok, okrem prvého, má svojho predchodcu a každý prvok, okrem
posledného, má svojho nasledovníka. Mô žeme mať napr.:

postupnosť čísel: 5, -8, 2, 0, 20
Algoritmizácia a programovanie – učebné texty
21

postupnosť mien: Jano, Jožo, Mišo, Kubo

postupnosť farieb: modrá, zelená, červená
P o č e t p r v k o v p o s t u p n o s t i n a z ýv a m e d ĺ ž k o u p o s t u p n o s t i . K a ž d ý
p r v o k m á s v o j e p o r a d o v é č í s l o a p o s t u p n o s ť s ym b o l i c k y z a p í š e m e
takto:
a1, a2, a3, ..., aN
kde N je dĺžka postupnosti.
My budeme zatiaľ pracovať s číselnými postupnosťami. V praxi sa
často stretneme s problémom zistiť súčet alebo priemer prvkov
postupnosti, zistiť počet prvkov danej vlastnosti, nájsť najväčší
prvok a pod.
N a v yr i e š e n i e t ýc h t o ú l o h p o t r e b u j e m e p o z n a ť :
- počet prvkov postupnosti (uložíme ho do jednej premennej, napr. N)
- h o d n o t y j e d n o t l i v ý c h p r v k o v ( t ýc h j e v i a c , p o t r e b o v a l i b y s m e n a t o
v i a c p r e m e n n ýc h , a l e n e v i e m e v o p r e d , k o ľ k o ) .
My však nepotrebujeme
poznať naraz všetky prvky postupnosti.
Môžeme si ich načítavať postupne po jednom do jednej premennej,
napr. A, a priebežne ich spracovávať.
Schéma
algoritmu ,
ktorý
pracuje
s
N-prvkovou
postupnosťou
r e á l n yc h č í s e l :
var N:integer;
A:real;
begin
writeln('Zadaj dlzku postupnosti:');
readln(N);
for I:=1 to N
do begin
writeln('Zadaj ',I,'. cislo postupnosti:');
readln(A);
<spracuj cislo A>
end;
<vypis vysledok>
end.
Príklady:
Algoritmizácia a programovanie – učebné texty
1. Program
načíta
počet
detí
22
N
a
N -prvkovú
postupnosť
n e z á p o r n ýc h č í s e l a 1 , a 2 , a 3 , . . . , a N , k d e a i s ú ú s p o r y I - t e h o
dieťaťa. Zistite:
a. celkovú hodnotu úspor detí
b. priemernú hodnotu úspor na dieťa
c . p o č e t " c h u d o b n ýc h " d e t í ( k t o r é m a j ú n u l o v é ú s p o r y)
2. Miško pracoval na brigáde N dní. Prvý deň zarobil K korún.
Každý ďalší deň zarobil dvakrát toľko ako v predchádzajúci deň
a ešte 1 korunu navyše.
a. Koľko zarobil v posledný deň?
b. Koľko si zarobil celkovo?
H ľ a d a n i e m a x im a (m i n im a ) p o s t up n o s t i
1 .1 5 .
Maximum
(minimum)
postupnosti
je
hodnota
najväčšieho
(najmenšieho) prvku v postupnosti.
Napr. postupnosť 5, 10, 1, 10, 2, 7 má maximum 10 a minimum 1.
Postup
hľadania
maxima:
Postupne
prejdeme
postupnosťou
od
prvého po posledný prvok a budeme si pamätať v pomocnej premennej
MAX zatiaľ nájdený najväčší prvok. T. zn. zob erieme prvý prvok a
prehlásime ho za dočasné maximum. Uložíme ho do premennej MAX
a skontrolujeme ostatné prvky postupnosti, či nie sú náhodnou väčšie
ako naše MAX. Ak taký prvok nájdeme, musíme ho uložiť do MAX
ako nové maximum.
Príklady:
1. Daný je počet pokusov pretekára vo vrhu guľou a hodnoty
j e d n o t l i v ýc h
pokusu.
hodov.
Program
v yp í š e
hodnotu
najlepšieho
Algoritmizácia a programovanie – učebné texty
23
2. Daný je počet prvkov N a jednotlivé prvky postupnosti a 1, a2,
a3,
...,
aN.
Nájdite
hodnotu
najväčšieho
prvku
a
zistite,
koľkokrát sa v postupnosti nachádza.
3. Opravte
predchádzajúci
program
tak,
aby
hľadal
najmenší
prvok.
1 .1 6 .
C y k l u s W H I LE
- c yk l u s s p o d m i e n k o u n a z a č i a t k u
Syntax:
while <logický výraz>
do <príkaz>
S é m a n t i k a : k ým j e l o g i c k ý v ý r a z ( p o d m i e n k a ) p r a v d i v ý , o p a k o v a n e
v yk o n á v a d a n ý p r í k a z . A k p o d m i e n k a n e p l a t í , c yk l u s k o n č í . A k
c h c e m e m a ť v c yk l e v i a c p r í k a z o v , m u s í m e z n i c h v yr o b i ť s e k v e n c i u
pomocou 'begin' a 'end'.
Príklad:
{A=13, B=4}
while A>=B
do A:=A-B
A k ý b u d e s t a v p r e m e n n ýc h p o s k o n č e n í c yk l u ?
Začiatočný stav premenných je: A=13, B=4.
Pred vstupom do cyklu sa podmienka vyhodnotí ako pravdivá (13>=4). Vojde do
cyklu a vykoná príkaz, zníži hodnotu premennej A o 4. Stav premenných po 1.
prechode cyklom: A=9, B=4.
Podmienka stále platí (9>=4), preto znova zopakuje príkaz, zníži hodnotu
premennej A o 4. Stav premenných po 2. prechode cyklom: A=5, B=4.
Podmienka ešte stále platí (5>=4), znova zopakuje príkaz, zníži hodnotu
premennej A o 4. Stav premenných po 3. prechode cyklom: A=1, B=4.
Podmienka (1>=4) je nepravdivá, cyklus sa končí. Konečný s tav premenných je:
A=1, B=4.
Algoritmizácia a programovanie – učebné texty
Na
čo
slúži
uvedený
algoritmus
24
a
aká
bude
konečná
hodnota
premennej A, ak na začiatku platí A=103, B=5?
Príklady:
1. Dané je prirodzené číslo C. Zistite počet cifier v tomto čísle.
2. Dané je prirodzené číslo C. Zistite jeho cif erný súčet.
3. Miško vhodil do pokladničky 1 korunu. Druhý deň tam vhodil 2
k o r u n y, t r e t í d e ň 3 k o r u n y, a t ď . Z a k o ľ k o d n í s i n a s p o r í n a
autíčko, ktoré stojí K korún?
4. Daná
je
postupnosť
c e l ýc h
čísel
predstavujúcich
platy
zamestnancov (ich počet nepoznáme). A ko posledný je zadaný
plat riaditeľa, ktorý jediný je väčší než 50000, - Sk. Zistite
koľko zamestnancov má podnik a aký je ich priemerný plat.
5. V banke je K korún. Postupne prichádzajú požiadavky na
p o s k yt n u t i e ú v e r u - t . z n . p o s t u p n e s a z a d á v a j ú s u m y, k t o r é s i
chcú klienti od banky požičať. Po načítaní každej sumy program
v yp í š e , č i j e ž i a d o s ť o p ô ž i č k u v yb a v e n á k l a d n e , a l e b o s a j e j
n e d á v yh o v i e ť z d ô v o d u n e d o s t a t k u p e ň a z í v b a n k o v o m t r e z o r e .
Program končí, ak v banke nezostane ani koruna.
1.16.1. Zacyklenie
- opakovanie príkazu donekonečna.
A k j e p o d m i e n k a c y k l u W H I L E s t á l e p r a v d i v á , c yk l u s n i k d y n e s k o n č í .
S t á v a s a t o v t e d y, a k p r o g r a m á t o r c h y b n e z a p í š e p o d m i e n k u , n a p r . :
{A=10}
while A>=0
do A:=A+1
Takto zapísaný cyklus nikdy neskončí, pretože premenná A bude mať
stále hodnotu väčšiu ako nula. Ak sa nám v programe podarí niečo
podobné, musíme spustený program násilne ukončiť pomocou kláves
C t r l + B r e a k . N i e k e d y v š a k s ú s t ým p r o b l é m y a m u s í m e u k o n č i ť c e l ý
Algoritmizácia a programovanie – učebné texty
25
Pascal (Ctrl+Alt+Del) alebo reštartovať počítač. Pre tento pr ípad
treba
mať
poslednú
verziu
programu
uloženú
na
disku.
PRED
KAŽDÝM SPUSTENÍM PROGRAMU SI TREBA PROGRAM ULOŽIŤ
NA DISK!!!
1 .1 7 .
Typ CHAR
Množina hodnôt: znaky (zapisujeme ich v apostrofách, napr. 'A', '5',
'@', '!', ' ' atď.)
Prípustné operácie: porovnávanie ( < > = )
V š e t k ýc h z n a k o v j e 2 5 6 , u s p o r i a d a n é s ú v t z v . A S C I I t a b u ľ k e a
každému je priradené poradové číslo od 0 po 255. Toto číslo sa
n a z ýv a
kód
znaku,
resp.
ordinálne
číslo.
Jednotlivé
znaky
porovnávajú podľa ich kódu.
Príklady kódov:
'A' má kód 65 'a' má kód 97
'0' má kód 48
'B'
66 'b'
98
'1'
49
'C'
67 'c'
99
'2'
50
...
...
...
'Z'
90 'z'
122 '9'
57
Preto platí, že:
'A'<'a'
'A'<'B'
'9'<'A'
Š t a n d a r d n é fu n k ci e
Popis:
Funkcia: Typ parametra: Typ výsledku: Príklad:
ordinálne číslo znaku
ORD(C)
znak prislúchajúci kódu CHR(I)
znak
celé číslo
ORD('A')=65
celé číslo
znak
CHR(65)='A'
predchodca znaku
PRED(C) znak
znak
PRED('B')='A'
nasledovník znaku
SUCC(C) znak
znak
SUCC('A')='B'
sa
Algoritmizácia a programovanie – učebné texty
26
Príklady:
1 . P r o g r a m v yp í š e n a o b r a z o v k u v e ľ k ú a b e c e d u : A , B , C , . . . , Z
2 . P r o g r a m n a č í t a v a p o j e d n o m z n a k u a v yp i s u j e j e h o k ó d , p o k i a ľ
nebude zadaná bodka.
3 . P r o g r a m v yp í š e v š e t k y z n a k y A S C I I t a b u ľ k y o d 0 - t é h o p o 2 5 5 t y.
4 . P r o g r a m n a č í t a v e ľ k é p í s m e n o a b e c e d y a v yp í š e t o i s t é m a l é
písmeno.
Pozn.: Typ char možno použiť pre riadiacu premennú cyklu FOR. Ak chcete
vypisovať na obrazovku údaje do riadku za sebou, požite miesto príkazu
WRITELN len WRITE.
1 .1 8 .
C y k l u s R E PE A T
- c yk l u s s p o d m i e n k o u n a k o n c i
Syntax:
repeat
<príkazy>
until <logický výraz>
P r í k a z o v v c yk l e m ô ž e b yť v i a c a n e m u s í m e p o u ž i ť k o n š t r u k c i u
'begin..end'.
S é m a n t i k a : p r í k a z y v c yk l e s a v yk o n á v a j ú o p a k o v a n e , p o k i a ľ n e b u d e
logický
výraz
p r a v d i v ý.
Príklad:
S:=0;
repeat
readln(A);
S:=S+A
until A=0;
writeln(S)
Ak
je
n e p r a v d i v ý,
c yk l u s
pokračuje.
Algoritmizácia a programovanie – učebné texty
27
Č o s a v yp í š e n a o b r a z o v k u , a k u ž í v a t e ľ p o s t u p n e z a d á v a n a v s t u p
tieto čísla: 2,5,3,0,7,0 ?
Pri každom prechode cyklom sa načíta jedno číslo zo vstupu (readln(A)) a
pripočíta
sa k celkovému súčtu (S:=S+A).
Tieto dve
operácie sa opakujú
dovtedy, kým číslo zadané na vstupe nebude rovné nule (A=0). Vtedy cyklus
končí. Pre horeuvedenú vstupnú postupnosť nám program vypočíta 2+5+3, čiže
10.
Príklady:
1 . D a n á j e p o s t u p n o s ť k l a d n ýc h a z á p o r n ýc h č í s e l ( p r í j m y a
v ýd a j e ) u k o n č e n á n u l o u . Z i s t i t e c e l k o v ý p r í j e m , c e l k o v ý v ý d a j
a konečnú bilanciu (zisk alebo strata).
2. Daná je postupnosť známok žiaka (1..5) ukončená nulou. Zistite
p o č t y j e d n o t l i v ýc h z n á m o k ( p o č e t j e d n o t i e k , p o č e t d v o j o k , . . . ) a
priemernú známku.
3 . D a n é j e p r i r o d z e n é č í s l o A . V yt v o r t e a v yp í š t e č í s l o B , k t o r é
má tie isté cifry ako A, ale v opačnom poradí.
1.18.1.
Rozdiely medzi cyklom WHILE a REPEAT
o
v y h o d n o t e n i e p o d m i e n k y - a k p o d m i e n k a p l a t í , c yk l u s
while pokračuje, repeat
končí.
Ak podmienka neplatí
c yk l u s w h i l e k o n č í , a l e r e p e a t p o k r a č u j e .
o
u m i e s t n e n i e p o d m i e n k y - v c yk l e w h i l e j e p o d m i e n k a n a
z a č i a t k u , v yh o d n o c u j e s a s k ô r , n e ž s a v yk o n á p r í k a z v
c yk l e , p r e t o s a m ô ž e s t a ť , ž e s a p r í k a z v c yk l e n e v yk o n á
ani raz, ak je podmienka hneď na začiatku nepravdivá. V
c yk l e r e p e a t j e p o d m i e n k a n a k o n c i , t . z n . n a j s k ô r s a
v yk o n a j ú
príkazy
v
c yk l e ,
až
potom
sa
v yh o d n o c u j e
Algoritmizácia a programovanie – učebné texty
28
p o d m i e n k a . P r í k a z y v c yk l e r e p e a t s a s t e d a v yk o n a j ú
aspoň raz.
p o č e t p r í k a z o v v c y k l e - v c yk l e w h i l e m ô ž e b yť l e n
o
j e d i n ý p r í k a z , v c y k l e r e p e a t i c h m ô ž e b yť v i a c .
Úloha:
Prepíšte
ukončenej
horeuvedený
nulou) pomocou
príklad
c yk l u
(súčet
while,
tak
postupnosti
aby dával
čísel
rovnaké
v ýs l e d k y.
1 .1 9 .
T y p B OO L E A N
Množina
hodnôt:
logické
hodnoty
FALSE
(nepravda)
a
TRUE
(pravda)
Tieto hodnoty majú tiež svoje kódy, ktoré sa dajú zistiť funciou ORD. False má
kód 0 a true 1.
Prípustné operácie: porovnávanie ( <>= ) a logické operácie (NOT,
AND, OR) opísané v časti podmienený príkaz
L o g i c k ý v ý r a z - v ýr a z , k t o r é h o v ýs l e d n á h o d n o t a j e p r a v d a a l e b o
nepravda. Napr.
A > B
(A<3) and (B <>0)
Premenná typu boolean a jej použitie:
Deklarácia:
var B:boolean
Použitie v príkazoch:
B:=true;
B:= 4<7;
B:= (4<7) and B;
if B then ...;
while not B do ...
Algoritmizácia a programovanie – učebné texty
1.19.1.
29
Zisťovanie vlastností postupnosti
V praxi niekedy potrebujeme zistiť vlastnosť postupnosti (či
je
p o s t u p n o s ť k l a d n á , r a s t ú c a , . . . ) . A b y s m e v yr i e š i l i ú l o h u , p o t r e b u j e m e
skontrolovať každý prvok postupnosti, či spĺňa určitú podmienku.
N a p r . p o s t u p n o s ť j e k l a d n á v t e d y, a k j e k a ž d ý j e j p r v o k k l a d n ý.
Ú l o h y t o h t o t yp u r i e š i m e t a k , ž e p r e d p o k l a d á m e , ž e p o s t u p n o s ť d a n ú
vlastnosť má. Potom postupne prekontrolujeme jednotlivé prvky a ak
nájdeme
čo
len
j e d i n ý,
ktorý
požadovanú
vlastnosť
nemá,
náš
"predpoklad" opravíme. Ak sú všetky prvky v poriadku, nič sa
nemení.
P r i ú l o h á c h t o h t o t y p u j e v h o d n é p o u ž i ť s i g n a l i z a č n ú p r e m e n n ú t yp u
boolean, ktorá nám signalizuje, aká je postupnosť. Napr. premenná
JEKLADNA:boolean bude obsahovať true, ak je postupnosť kladná,
ak nie je kladná, bude obsahovať false.
Na začiatku predpokladáme, že postupnosť je kladná, t.zn. prem ennú
inicializujeme
nasledovne:
JEKLADNA:=true
.
Potom
v
c yk l e
postupne načítavame jednotlivé prvky postupnosti a kontrolujeme ich.
A k b u d e z a d a n ý p r v o k n e k l a d n ý, n á š p r e d p o k l a d s a n a r u š i l a m ô ž e m e
ho zmeniť: JEKLADNA:=false. Na konci programu podľa obsahu
p r e m e n n e j J E K L A D N A v yp í š e m e v ýs l e d o k .
Príklady:
1 . D a n ý j e p o č e t p r v k o v N a N - p r v k o v á p o s t u p n o s ť c e l ýc h č í s e l .
Zistite, či je postupnosť kladná, t.zn. či sú všetky jej prvky
kladné.
2 . D a n ý j e p o č e t p r v k o v N a N - p r v k o v á p o s t u p n o s ť c e l ýc h č í s e l .
Zistite, či je postupnosť rastúca, t.zn. či je každý jej prvok
v ä č š í n e ž p r e d c h á d z a j ú c i ( s v ýn i m k o u p r v é h o ) .
3. Dané je prirodzené číslo C. Zistite, či je to prvočíslo.
Algoritmizácia a programovanie – učebné texty
30
Príkaz CASE
1 .2 0 .
- viacnásobné vetvenie
Syntax:
case <výraz> of
<hodnoty>:<príkaz>;
<hodnoty>:<príkaz>;
...
<hodnoty>:<príkaz>;
else <príkaz>
end
< v ýr a z > j e v ýr a z o r d i n á l n e h o t yp u ( i n t e g e r , c h a r , b o o l e a n , . . . ) .
<príkaz> je ľubovoľný príkaz, ak potrebujeme uviesť ja jednej vetve
viac príkazov, použijeme konštrukciu 'begin...end'.
< h o d n o t y> j e z o z n a m h o d n ô t t a k é h o i s t é h o t yp u , a k o j e < v ýr a z > .
H o d n o t y s ú o d d e l e n é č i a r k a m i a m ô ž u b yť z a p í s a n é a k o i n t e r v a l
'od..do'.
Vetva 'else' je nepovinná.
S é m a n t i k a : V yp o č í t a s a h o d n o t a d a n é h o v ýr a z u a p o r o v n á s a s
h o d n o t a m i n a j e d n o t l i v ýc h v e t v á c h . A k j e v ýr a z r o v n ý h o d n o t e n a
niektorej vetve, vykoná sa príkaz na tejto vetve. Ak je rovný
h o d n o t á m n a v i a c e r ýc h v e t v á c h , v y k o n á s a t e n p r í k a z , k t o r ý j e
uvedený skôr.
P r í k l a d : M á m e p r e m e n n ú A t yp u i n t e g e r . Č o s a v yp í š e n a o b r a z o v k u
p o v yk o n a n í n a s l e d o v n é h o p r í k a z u ?
case A of
3:writeln(4);
5,10,15,20:writeln(A div 5);
16..22:writeln(A+2);
-2..2,4,6..9:writeln(A-1)
else writeln(A)
end
A k j e A = 3 , v yk o n á s a p r v ý p r í k a z a v y p í š e : 4
Algoritmizácia a programovanie – učebné texty
31
A k j e A = 1 7 , v yk o n á s a t r e t í p r í k a z ( 1 7 j e z i n t e r v a l u < 1 6 , 2 2 > ) a
v yp í š e : 1 9
A k j e A = 2 0 , t e o r e t i c k y b y v yh o v o v a l a a j d r u h á a j t r e t i a v e t v a , a l e
v yk o n á s a l e n d r u h ý p r í k a z a v yp í š e : 4
A k j e A = 9 , v yk o n á s a š t v r t ý p r í k a z a v y p í š e : 8
A k j e A = 1 4 , v yk o n á s a p o s l e d n ý p r í k a z n a v e t v e e l s e a v y p í š e : 1 4
A k o s a z m e n í v ý s t u p v h o r e u v e d e n ý c h p r í p a d o c h , a k v ýr a z A v
p r í k a z e ' c a s e ' z m e n í m e n a v ýr a z A + 1 ?
Príklady:
1. Dané
je
prirodzené
číslo
z
intervalu
<1,5>
predstavujúce
z n á m k u ž i a k a . P r o g r a m n a č í t a č í s l o z n á m k y a v yp í š e j u s l o v n e .
2 . P r o g r a m n a č í t a v e k o s o b y, j e j v ýš k u v c e n t i m e t r o c h a v y p o č í t a
i d e á l n u h m o t n o s ť p o d ľ a t a b u ľ k y:
Vek
Hmotnosť
0 - 15 vek*3.5
1 6 - 3 0 v ýš k a - 1 1 0
3 1 - 5 0 v ýš k a - 1 0 0
51 -
v ýš k a - 9 0
3. Doplňte program tak, aby sa zopakoval pre N osôb (N je dané).
4 . P r o g r a m n a č í t a z n a k a v yp í š e , č i j e t o v e ľ k é p í s m e n o , m a l é
písmeno, číslica, interpunkčné znamienko (.?!,) alebo niečo iné.
1 .2 1 .
Vn o r e n é c y k l y
Príkaz v tele cyklu môže byť ľubovoľný (priraďovací príkaz, príkaz vstupu, príkaz
výstupu, príkaz vetvenia, príkaz cyklu, ...). To znamená, že príkaz, ktorý necháme
vykonávať opakovane, môže byť opäť cyklus. Vznikne nám príkazová konštrukcia, ktorú
nazývame vnorené cykly.
Algoritmizácia a programovanie – učebné texty
32
for I:=1 to 10
do for J:=1 to 20
do writeln('*')
P r v ý c yk l u s s a n a z ý v a v o n k a j š í , v yp í s a n ý t u č n ým j e v n ú t o r n ý.
Samotný príkaz...
for J:=1 to 20
do writeln('*')
. . . v yp í š e n a o b r a z o v k u 2 0 h v i e z d i č i e k . A k h o n e c h á m e z o p a k o v a ť 1 0 k r á t , v yp í š e 1 0 - k r á t v i a c h v i e z d i č i e k , č i ž e 2 0 0 .
Úlohy:
1 . K o ľ k o h v i e z d i č i e k s a v yp í š e n a o b r a z o v k u ?
for I:=1 to 5
do for J:=I to 10
do writeln('*')
2 . K o ľ k o h v i e z d i č i e k s a v yp í š e n a o b r a z o v k u ?
for I:=5 downto 1
do for J:=3 to I
do writeln('*')
3 . Č o s a v yp í š e n a o b r a z o v k u ?
for I:=1 to 5
do for J:=1 to 5
do writeln(I,J)
4 . Č o s a v yp í š e n a o b r a z o v k u ?
for I:=1 to 3
do for J:=1 to 3
do for K:=1 to 3
do writeln(I,J,K)
Príklady:
1 . V yp í š t e n a o b r a z o v k u v š e t k y m o ž n é u s p o r i a d a n é d v o j i c e z n a k o v
z množiny { A, B, C, D, E }.
Algoritmizácia a programovanie – učebné texty
2 . V yp í š t e
na
obrazovku
všetky
33
možné
kombinácie
znakov
z
množiny { A, B, C, D, E }.
3 . D a n ý j e p o č e t ž i a k o v N a p o č e t z n á m o k n a v ys v e d č e n í P . P r e
k a ž d é h o ž i a k a p r o g r a m n a č í t a P z n á m o k , v yp o č í t a p r i e m e r n ú
známku
a
v yp í š e , č i
prospel
veľmi
dobre
bol
v yz n a m e n a n ý ( p r i e m e r
(priemer
do
2.00)
alebo
do 1.50),
prospel
(v
o s t a t n ýc h p r í p a d o c h ) .
4 . N á j d i t e v š e t k y t r o j i c e p r i r o d z e n ýc h č í s e l A , B , C z i n t e r v a l u
<1,100>, ktoré sú stranami pravouhlého trojuholníka.
5. Nájdite
všetky
riešenia
k r yp t o g r a m u
reprezentujú znaky A,B,C):
(zistite,
ktoré
číslice
BA * AB = ACA
Vý s t u p n a t e x t o v ú o b r a z o v k u
1 .2 2 .
Textová obrazovka má 25 riadkov a 80 stĺpcov. Je rozdelené na 80x25
p o l í č o k , v k a ž d o m p o l í č k u m ô ž e b yť n a p í s a n ý p r á v e 1 z n a k . A k t í v n e
políčko
označuje
kurzor
(blikajúci
podčiarkovník),
ktorý sa
pri
v ýp i s e n a o b r a z o v k u p o s ú v a ď a l e j . ( K u r z o r o z n a č u j e m i e s t o , k d e
z a č n e v yp i s o v a ť n a j b l i ž š í p r í k a z w r i t e / w r i t e l n . P o z á p i s e z n a k u n a
aktívne políčko sa kurzor posunie o 1 políčko vpravo, ak je na konci
riadku, posunie sa na prvé políčko v nasledujúcom riadku. Ak je
kurzor v poslednom políčku posledného riadku, obsah obrazovky sa
roluje
o 1
riadok
v yš š i e
a kurzor
sa nastaví
na prvé políčko
posledného riadku.
Príkazy na výpis:
write(<parametre>)
- v yp í š e ú d a j e a n a s t a v í k u r z o r z a p o s l e d n ý v yp í s a n ý z n a k
writeln(<parametre>)
- v yp í š e ú d a j e a n a s t a v í k u r z o r n a z a č i a t o k n a s l e d u j ú c e h o
riadku
writeln
- n e v yp í š e n i č , k u r z o r n a s t a v í n a z a č i a t o k n a s l e d u j ú c e h o r i a d k u
Algoritmizácia a programovanie – učebné texty
34
Príklady:
1. Dané
je
prirodzené
číslo
N.
Zapíšte
do
riadku
za
sebou
f a k t o r i á l y: 1 ! , 2 ! , 3 ! , . . . N ! o d d e l e n é č i a r k a m i . K - f a k t o r i á l j e
s ú č i n p r i r o d z e n ýc h č í s e l o d 1 p o K : K ! = 1 . 2 . 3 . . . . K
2 . D a n é j e p r i r o d z e n é č í s l o N . P r o g r a m v yp í š e N r i a d k o v s N
hviezdičkami. ("Nakreslí" hviezdičkový štvorec.)
3 . P r o g r a m v yp í š e d o r i a d k o v 1 . . 2 4 , t o ľ k o h v i e z d i č i e k , k o ľ k o
určuje funkcia f(i)=(i -12)2/2 po zaokrúhlení (i je číslo riadku).
P r i v ýs t u p e n a o b r a z o v k u m ô ž e m e v y u ž í v a ť p r í k a z y z u n i t u C R T . V
takomto prípade musíme za hlavičku programu doplniť: uses Crt;
1 .2 3 .
Unit CRT
gotoxy(x,y)
- presunie kurzor do x -tého stĺpca a y-tého riadku. Stĺpce sú
číslované 1..80, riadky 1..25.
textcolor(F)
- nastaví farbu písma F. F je celé číslo z intervalu <0,15>.
Č í s l a v ä č š i e a k o 1 5 p r e d s t a v u j ú b l i k a j ú c e f a r b y.
textbackground(F)
- nastaví farbu pozadia F. F je celé číslo z intervalu <0,7>.
window(xl,yh,xp,yd)
- o t v o r í o k n o s o s ú r a d n i c a m i [ x l , yh ] v ľ a v o m h o r n o m r o h u a
[ x p , yd ] v p r a v o m d o l n o m r o h u . O k n o j e a k t í v n a č a s ť o b r a z o v k y
v ktorom platia relatívne súradnice vzhľadom na jeho ľavý
horný roh [0,0]. Mimo okna sa nedajú robiť žiadne zmeny
(písať, zotierať).
clrscr
- zotrie obrazovku, resp. okno, farbou pozadia.
wherex, wherey
- funkcie, ktoré vrátia prirodzené číslo - číslo stĺpca, riadku, v
ktorom sa nachádza kurzor.
delay(t)
Algoritmizácia a programovanie – učebné texty
35
- procesor "čaká" t milisekúnd (keď potrebujeme spomaliť
program).
Príklady:
1 . V yb e r t e s i z o s v o j i c h o d l a d e n ýc h p r o g r a m o v j e d e n a d o p l ň t e h o
o f a r b y: n a z a č i a t k u p r o g r a m u b u d e p r á z d n a o b r a z o v k a z e l e n e j
f a r b y. P r i n a č í t a v a n í v s t u p n ýc h d á t b u d ú o z n a m y v yp i s o v a n é n a
o b r a z o v k u b i e l o u f a r b o u , v ýs l e d k y s a b u d ú v yp i s o v a ť ž l t o u
farbou. (Pri nastavovaní farieb môžete používať aj anglické
o z n a č e n i a : g r e e n , w h i t e , ye l l o w ) .
2. "Nakreslite" na bielej obrazovke uprost red červený obdĺžnik a
rozmermi 40x15 políčok.
3. Presúvajte pomaly po hornom okraji obrazovky nápis "AHOJ".
4 . V yt v o r t e n a c e l e j o b r a z o v k e f a r e b n ú r e k l a m u n a n e j a k ý p r o d u k t .
( S t a č í s t a t i c k á , m ô ž e b yť a j p o h yb l i v á . )
Vs t u p z k l á v e s n i c e
1 .2 4 .
U ž í v a t e ľ z a d á v a v s t u p n é ú d a j e v n i e k o ľ k ýc h r i a d k o c h u k o n č e n ýc h
e n t e r o m  . V j e d n o m r i a d k u m ô ž e b y ť z a p í s a n ýc h v i a c ú d a j o v ( a k s ú
t o č í s l a , o d d e ľ u j e m e i c h m e d z e r a m i ) . M ys l e n ý u k a z o v a t e ľ ( n i e č o a k o
kurzor) označuje znak zo vstupného riadku, ktorý sa bude najbližšie
čítať. Pri čítaní sa posúva ďalej.
Príkazy na čítanie:
read(<premenné>)
- p r e č í t a ú d a j e z o v s t u p n é h o r i a d k u d o d a n ýc h p r e m e n n ýc h a
posunie ukazovateľ za posledný prečítaný znak
readln(<premenné>)
- p r e č í t a ú d a j e z o v s t u p n é h o r i a d k u d o d a n ýc h p r e m e n n ýc h a
posunie ukazovateľ na ďalší vstupný riadok (ak ho užívateľ ešte
nezadal, tak čaká)
readln
Algoritmizácia a programovanie – učebné texty
36
- posunie ukazovateľ na ďalší vstupný riadok (ak ho užívateľ
e š t e n e z a d a l , t a k č a k á ) . V s t u p n ý r i a d o k m ô ž e b yť a j p r á z d n y
(užívateľ stlačí len enter).
Príklad:
U ž í v a t e ľ z a d a l n a k l á v e s n i c i t i e t o v s t u p n é r i a d k y:
12 34
5
A k ý b u d e o b s a h p r e m e n n ýc h v a r A , B : i n t e g e r ; C : c h a r p o v yk o n a n í
t ýc h t o p r í k a z o v ?
read(A);
readln(C);
read(B)
{ A=
, B=
, C=
}
Funkcia EOLN : je to logická funkcia, ktorá nám signalizuje pozíciu
m ys l e n é h o
ukazovateľa
pri
čítaní
zo
vstupného
riadku.
Ak
je
ukazovateľ na konci vstupného riadku (prečítal sa posledný znak),
funkcia vráti TRUE, inak vráti FALSE.
T ú t o f u n k c i u m ô ž e m e v yu ž i ť p r i č í t a n í p o s t u p n o s t i ú d a j o v , k t o r á j e
daná
v
jednom
vstupnom
riadku,
p ričom
počet
prvkov
vopred
nepoznáme. Použijeme túto schému programu:
while not eoln
do begin read(prvok);
<spracuj prvok>;
end
Príklad: Daná je postupnosť znakov v jednom vstupnom riadku. Pri
zadávaní sú na obrazovke štandardné farby - čierne pozadie, biele
p í s m o . V yp í š t e t ú i s t ú p o s t u p n o s ť d o d r u h é h o r i a d k u ž l t o u f a r b o u .
uses crt;
var znak:char;
begin
textbackground(black);
textcolor(white);
writeln('Zadaj postupnost znakov:');
while not eoln
do begin read(znak);
Algoritmizácia a programovanie – učebné texty
37
textcolor(yellow);
write(znak)
end
end.
Príklady:
1. Daná je postupnosť znakov v jednom vstupnom riadku. Program
v yp í š e , k o ľ k o j e v p o s t u p n o s t i
a ) p í s m e n b ) č í s l i c c ) a r i t m e t i c k ýc h z n a m i e n o k
2 . D a n á j e p o s t u p n o s ť z n a k o v v j e d n o m v s t u p n o m r i a d k u . V yp í š t e
tú istú postupnosť do druhého riadku tak, že:
a ) k a ž d é ' y ' z m e n í t e n a ' i b ) z a k a ž d é ' x ' v l o ž í t e ' y'
3. Dané je prirodzené číslo A. Bez použitia číselnej premennej
a) zistite, či je deliteľné 5 b) zistite, či je deliteľné 100
c ) v yp í š t e j e h o d e s a ť n á s o b o k .
4. Daná je postupnosť znakov. Zistite, či je to identifikátor.
Knižnica CRT - vstup z klávesnice
1 .2 5 .
readkey
- znaková funkcia, ktorá čaká na stlačenie klávesy a vráti znak
tejto
k l á v e s y.
Po
stlačení
klávesy
sa
znak
n e v yp i s u j e
na
obrazovku.
keypressed
- logická funkcia, ktorá vráti TRUE, ak bola stlačená klávesa,
inak vráti FALSE
Algoritmizácia a programovanie – učebné texty
38
Príklady:
1. Do
stredu
obrazovky
v yp í š t e
text
AHOJ
a
opakovane
ho
prekresľujte farbami od 1 do 15 pokiaľ užívateľ nestlačí nejakú
klávesu.
2. Do stredu obrazovky vypíšte text AHOJ. P rogram opakovane
n a č í t a v a z n a k s t l a č e n e j k l á v e s y. A k u ž í v a t e ľ s t l a č í ' C ' , n á p i s s a
prepíše červenou farbou, ak stlačí 'M' - modrou, 'Z' - zelenou,
... 'K' - program končí.
Klávesy môžeme rozdeliť na:

znakové ( A, @ , + , 3 , medzera , ...) - ich stlačením užívateľ
zadáva zobraziteľný znak

f u n k č n é ( E n t e r , E s c , š í p k y, F 1 , I n s e r t , . . . ) - i c h s t l a č e n í m s a
v yv o l á v a n e j a k á f u n k c i a ( n a p r . E s c m á v ä č š i n o u f u n k c i u s t o r n o ,
F1 - help, ...)

prepínacie (Alt, Shift, Ctrl) - používajú sa v kombinácii s inou
klávesou a menia jej funkciu, resp. znak
Iné rozdelenie kláves:

jednobajtové - ich stlačením sa zadáva jeden znak ( A, 3, + ,
Enter, Esc, ...)

d v o j b a j t o v é - i c h s t l a č e n í m s a z a d á v a j ú d v a z n a k y, z k t o r ýc h
p r v ý j e z n a k s k ó d o m 0 ( š í p k y, F 1 , . . . )
Znaky môžeme zapisovať (okrem bežného spôsobu s apostrofami,
napr. 'A') aj pomocou ich kódov: #<kód> (napr. #65). Tento spôsob
sa používa hlavne pre nezobraziteľné znaky (napr. klávesa Esc
zadáva znak #27).
Algoritmizácia a programovanie – učebné texty
39
Prehľad znakov niektorých kláves:
Esc
jednobajtová
#27
Enter
jednobajtová
#13
šípka hore
dvojbajtová
#0 #72
šípka vľavo
dvojbajtová
#0 #75
šípka vpravo
šípka dole
Home
End
PgUp
PgDn
Insert
Delete
F1
Ctrl F1
P r í k l a d : P r o g r a m o p a k o v a n e n a č í t a v a s t l a č e n ú k l á v e s u a v yp i s u j e , č i
j e j e d n o b a j t o v á a l e b o d v o j b a j t o v á a v yp í š e j e j k ó d , r e s p . k ó d y. S
pomocou
tohto
programu
doplňte
horeuvedenú
tabuľku.
Program
k o n č í p o s t l a č e n í E s c . D o p l ň t e c h ýb a j ú c e č a s t i o z n a č e n é " . . . . . "
uses Crt;
var ZN1, ZN2:char;
begin
repeat
ZN1:=readkey;
if ZN1=.....
then begin ZN2:=readkey;
writeln('Klavesa
je
dvojbajtova,
jej
kody
su: 0 a ',.....)
end
else
writeln('Klavesa
',.....)
until ZN1=.....
end.
je
jednobajtova,
jej
kod
je:
Algoritmizácia a programovanie – učebné texty
40
Príklady:
1 . V yp í š t e d o s t r e d u o b r a z o v k y t e x t A H O J . P r o g r a m o p a k o v a n e
načítava stlačené klávesy a podľa šípok posúva text o riadok
v yš š i e / n i ž š i e , o s t ĺ p e c d o ľ a v a / d o p r a v a . P o s t l a č e n í E s c p r o g r a m
končí.
Kontrolovaný vstup
1 .2 6 .
Vstupná podmienka algoritmu určuje, aké vlastnosti majú mať
údaje, ktoré dostane algoritmus na vstupe. Napr: "Dané je prirodzené
číslo N väčšie ako 1.", "Daná je postupnosť kladných reálnych čísel
ukončená nulou." Pre užívateľa to znamená, že ak chce, aby mu
a l g o r i t m u s d a l n a z á v e r s p r á v n e v ýs l e d k y, m u s í m u n a v s t u p e z a d a ť
ú d a j e v yh o v u j ú c e v s t u p n e j p o d m i e n k e . Z a d a n i e n e s p r á v n e h o ú d a j u n a
v s t u p e m ô ž e s p ô s o b i ť , ž e p r o g r a m s k o n č í p r e d č a s n e s c h yb o v ým
h l á s e n í m ( p r o g r a m " s p a d n e " ) a l e b o n á m d á n a v ýs t u p e z l é v ýs l e d k y.
D o b r ý p r o g r a m b y m a l b yť z a b e z p e č e n ý p r o t i c h yb á m u ž í v a t e ľ a a
kontrolovať
každý
údaj
zadaný
na
vstupe.
V
prípade
zadania
nesprávneho údaju sa musí vstup zopakovať.
Chyba vstupného údaju môže byť:
- v t yp e ( n a p r . u ž í v a t e ľ m a l z a d a ť c e l é č í s l o a z a d a l z n a k )
- v hodnote (napr. užívateľ mal zadať číslo z interval u <1,10> a
zadal 20)
Schéma kontrolovaného vstupu:
repeat
writeln('Zadaj...');
readln(U);
if <údaj U je zlý>)
then writeln('Zle - zadaj znova')
until <údaj U je je dobrý>
Zatiaľ budeme kontrolovať len správnosť hodnoty.
Algoritmizácia a programovanie – učebné texty
41
Príklad:
Naprogramujte kontrolovaný vstup celého čísla z intervalu < -10,10>.
1 .2 7 .
P o d p r o g r am
Podprogram je logicky ucelená časť programu - postupnosť príkazov,
ktorá
rieši
nejaký
podproblém
a
je
označená
v l a s t n ým
menom
(identifikátorom).
Napr.:
Našou
úlohou
je
v yt v o r i ť
progr am,
ktorý
nakreslí
na
obrazovku obdĺžnikovú dúhu, v hornej časti v strede vypíše "PRŠÍ
P R Š Í " a v s t r e d n e j č a s t i n e c h á r o l o v a ť r i a d k y, v k t o r ýc h s ú s t r i e d a v o
v yp í s a n é
bodky
a
medzery
podľa
vzoru:
T ú t o ú l o h u m ô ž e m e r o z d e l i ť n a č i a s t k o v é ú l o h y ( p o d p r o b l é m y) :
nakresliť
dúhu,
bodkami
a
urobiť
nápis
medzerami).
podprogram,
nazvime
a
Každý
ich:
urobiť
dážď
podproblém
DUHA,
NAPIS,
(rolujúce
bude
DAZD.
riadky s
riešiť
Ak
nejaký
by
tieto
" p r í k a z y" p o č í t a č p o z n a l , n á š p r o g r a m b y b o l v e ľ m i j e d n o d u c h ý:
begin
DUHA;
NAPIS;
DAZD;
end.
P r í k a z y,
ktoré
sme
v
použili,
nie
sú
súčasťou
Pascal,
preto
ich
musíme
presne
programe
j a z yk a
počítaču
" v ys v e t l i ť " ,
musíme
Deklarácia podprogramu (procedúry):
procedure <identifikátor>;
<deklaračná časť>;
begin
<príkazy>;
end
ich
zadeklarovať.
Algoritmizácia a programovanie – učebné texty
Podprogram
má
rovnakú
stavbu
ako
42
program,
rozdiel
je
len
v
hlavičke (miesto 'program' píšeme 'procedure'). Za symbolom 'end'
nedávame bodku, ale bodkočiarku, ktorá slúži ako oddeľovač od
ďalšej časti.
Umiestnenie deklarácie podprogramu: v deklaračnej časti hlavného
p r o g r a m u ( t a m , k d e j e u m i e s t n e n á d e k l a r á c i a p r e m e n n ýc h ) . Z a u ž í v a n é
p o r a d i e j e , ž e n a j s k ô r d e k l a r u j e m e p r e m e n n é a p o n i c h p o d p r o g r a m y,
a l e m ô ž e t o b yť a j n a o p a k .
Volanie podprogramu: v hlavnom programe, tam, kde chceme, aby
s a v yk o n a l i p r í k a z y p o d p r o g r a m u , n a p í š e m e l e n j e h o m e n o . T a k ýt o
zápis sa berie ako jeden príkaz.
N á š p r o g r a m b u d e n a k o n i e c v yz e r a ť t a k t o :
program APRIL;
procedure DUHA;
begin
...
end;
procedure NAPIS;
begin
...
end;
procedure DAZD;
begin
window(20,7,60,19); {súradnice okna treba prispôsobiť}
textbackground(lightgray);
textcolor(black);
clrscr;
repeat
write('. ');
until keypressed
end;
Algoritmizácia a programovanie – učebné texty
43
Begin
DUHA;
NAPIS;
DAZD
end.
Ú l o h a p r e v á s : D o p l ň t e c h ýb a j ú c e p r í k a z o v é č a s t i p o d p r o g r a m o v .
Výhody použitia podprogramov:

prehľadnejší program

možnosť ladiť program postupne po častiach

stručnejší zápis programu (ak sa nejaká postupnosť príkazov
opakuje na viacerých miestach progra mu, stačí ju zapísať len
raz - zadeklarovať podprogram - a volať potrebný počet krát)
Lokálne a globálne premenné
1.27.1.
Aj podprogram môže mať svoje vlastné premenné deklarované v jeho
d e k l a r a č n e j č a s t i . T i e t o p r e m e n n é s a n a z ýv a j ú l o k á l n e a m ô ž e i c h
používať
len
tento
podprogram.
Okrem
nich
môže
používať
aj
premenné z hlavného programu - globálne. Ak existuje lokálna aj
g l o b á l n a p r e m e n n á s t ým i s t ým m e n o m , s ú t o d v e r ô z n e p r e m e n n é a v
podprograme je použiteľná len lokálna (globálna je
Napríklad:
program HLAVNY;
var A,B:integer;
procedure PROC;
var B,C:integer;
begin
A:=1; B:=2; C:=3
end;
begin
A:=4; B:=5;
PROC;
writeln(A,B)
end.
zatienená).
Algoritmizácia a programovanie – učebné texty
44
A k é h o d n o t y v y p í š e t e n t o p r o g r a m ? Č o v yp í š e , a k p o s l e d n ý p r í k a z
zmeníme na writeln(A,B,C) ?
Príklady:
1 . D a n é j e p r i r o d z e n é č í s l o N . " V yk r e s l i t e " n a o b r a z o v k u š t v o r e c
so stranou N, po obvode ktorého budú hviezdičky a vnútri
m e d z e r y.
V yt v o r t e
hviezdičiek
a
podprogram,
druhý
ktorý
podprogram,
vypíše
ktorý
do
v yp í š e
riadku
do
N
riadku
hviezdičku, z a ňou (N-2) medzier a na koniec hviezdičku. S
p o m o c o u t ýc h t o p o d p r o g r a m o v v yt v o r t e h l a v n ý p r o g r a m .
1.27.2.
Používanie premenných a podprogramov
P r e k a ž d ý o b j e k t v p r o g r a m e ( p r e m e n n é i p o d p r o g r a m y) p l a t í , ž e
musí byť deklarovaný skôr, ako je použitý . T. zn. ak chceme
premennú z hlavného programu použiť v nejakom podprograme, musí
b yť d e k l a r o v a n á s k ô r n e ž t e n t o p o d p r o g r a m . A k c h c e m e , a b y j e d e n
podprogram
mohol
volať
iný
podprogram,
musí
b yť
volaný
deklarovaný skôr ako volajúci.
1 .2 8 .
P o n u k o v ý p r o g r am
J e t o p r o g r a m , k t o r ý v yp í š e p o n u k u n i e k o ľ k ýc h s l u ž i e b , u ž í v a t e ľ s i
n i e k t o r ú z n i c h v yb e r i e a p r o g r a m j u z r e a l i z u j e . T o t o v š e t k o o p a k u j e ,
k ým
užívateľ
nezadá
p o k yn
na
ukončenie.
Schéma ponukového programu:
repeat
writeln('1. sluzba');
writeln('2. sluzba');
...
writeln('N. sluzba');
writeln('0. koniec');
writeln('Zadaj
vybral:');
readln(VYBER);
cislo
sluzby,
ktoru
si
si
Algoritmizácia a programovanie – učebné texty
45
case VYBER of
1:<volaj procedúru 1>;
2:<volaj procedúru 2>;
...
N:<volaj procedúru N>
end;
until VYBER=0
Kvôli
prehľadnosti
programu
je
dobré
každú
službu
realizovať
z v l á š t n ym p o d p r o g r a m o m .
Postup ladenia ponukového programu:
Ponukový program je rozsiahlejší a je dobré ladiť ho po častiach - po
j e d n o t l i v ýc h p r o c e d ú r a c h . T . z n . n a j s k ô r v yr o b í m e h l a v n ý p r o g r a m s
prázdnou ponukou služieb. Doplníme doň prvú službu a procedúru,
ktorá ju realizuje. Program spustíme, odskúšame, či pracuje tak, ako
t r e b a , p r í p . o p r a v í m e c h yb y . D o p l n í m e ď a l š i u s l u ž b u a j e j p r o c e d ú r u
atď.
Príklady:
1 . V yt v o r t e p o n u k o v ý p r o g r a m , k t o r ý o p a k o v a n e n a č í t a v a c e l é
č í s l o . A k u ž í v a t e ľ z a d á 1 , " v yk r e s l í " s l o v e n s k ú z á s t a v u , 2 francúzsku, 3 - maďarskú, atď., ak zadá 0 - skončí. (Zástavy
kreslite ako farebné pruhy - obdĺžniky.)
2. Ponukový
užívateľovi
program
načíta
nakres lenie
prirodzené
t ýc h t o
číslo
N
g e o m e t r i c k ýc h
a
ponúkne
útvarov
z
hviezdičiek: 1. štvorec so stranou N, 2. pravouhlý trojuholník s
o d v e s n a m i d ĺ ž k y N , 3 . r o v n o r a m e n n ý t r o j u h o l n í k s v ýš k o u N , 4 .
kosoštvorec so stranou N.
*****
*
*****
**
*****
***
*****
****
*****
*****
*
*****
***
*****
********
**********
*****
*****
*****
*****
Algoritmizácia a programovanie – učebné texty
1 .2 9 .
46
Typ pole
Pole je dátová štruktúra - obsahuje viacero dát nejakým spôsobom
u s p o r i a d a n ýc h . P o l e p o z o s t á v a z n i e k o ľ k ýc h p r v k o v r o v n a k é h o t yp u
u s p o r i a d a n ýc h
v
rade
za
sebou.
Ich
počet
je
pevne
určený
v
d e k l a r á c i i . Z u v e d e n é h o v yp l ýv a , ž e p o l e a k o d á t o v á š t r u k t ú r a m á
tieto vlastnosti:
- lineárna (prvky sú usporiadané v rade za sebou)
- h o m o g é n n a ( v š e t k y p r v k y s ú r o v n a k é h o t yp u )
- s t a t i c k á ( p o č e t p r v k o v j e s t á l y, n e m e n n ý)
Pole si môžeme graficky znázorniť takto:
1234 1240 1265 1220 1270 1301 1400 1350 1360 1386 1420 1421
V takejto dátovej štruktúre môžeme mať uloženú informáciu o stave
účtu v banke počas 12 mesiacov roka. (V prvom prvku je stav účtu v
januári, v druhom prvku stav účtu vo februári atď.) Toto by bolo pole
čísel.
O k r e m p o ľ a č í s e l s i m ô ž e m e v yt v o r i ť n a p r . p o l e m i e n d e t í :
Michal Zuzka Andrej Vilma
Alebo pole znakov, v ktorom môžu byť zapísané správne odpovede na
testové otázky (A, B, C, D):
A C B A D A
Prvý prvok poľa obsahuje správnu odpoveď na prvú testovú otázku,
druhý prvok - na druhú... atď.
Celé pole je jedna premenná označená jedným identifikátorom.
Jednotlivé prvky poľa sú rozlíšené indexami. Index si môžeme
predstaviť ako poradové číslo.
1 2 3 4 5 6
A C B A D A
Algoritmizácia a programovanie – učebné texty
47
Deklarácia premennej typu pole:
var <premenná>:array [<typ indexu>] of <typ prvkov>
Typ indexu je ordinálny (celočíselný, char, boolean,...) a zvyčajne sa zapisuje
ako interval od..do. Typ prvkov je ľubovoľný.
N a z v i m e p o l i a , k t o r é s m e s i g r a f i c k y z n á z o r n i l i v yš š i e , U C E T , D E T I ,
T E S T . I c h d e k l a r á c i a b u d e v yz e r a ť n a s l e d o v n e :
var UCET:array[1..12]of real;
DETI:array[1..4]of string;
TEST:array[1..6]of char
Typ string sa naučíme neskôr. V premennej typu string môže byť uložené celé
meno (postupnosť znakov).
Index y nemusia byť vždy len celé čísla a nemusia vždy začínať od
čísla 1. Napr.:
var A:array[-5..5] of integer;
B:array['a'..'z'] of boolean
Sprístupnenie prvku poľa: <premenná>[<index>]
Napr.: UCET[1] je prvý prvok poľa U CET, DETI[4] je posledn ý
prvok poľa DETI.
Ak by sme ako index použili hodnotu mimo intervalu určeného v
d e k l a r á c i i , n a p r . U C E T [ 0 ] a l e b o D E T I [ 5 ] , p o č í t a č b y v y h l á s i l c h yb u :
„Range check error“.
Ak vám aj napriek chybe v programe počítač nevypísal chybové hl ásenie, treba
si hlavnom menu Pascalu, v položke Options - Compiler zapnúť voľbu "Runtime
errors: [X] Range checking ."
P r á c a s p r v k a m i p o ľ a : s j e d n o t l i v ým i p r v k a m i p r a c u j e m e a k o s
p r e m e n n ým i p r í s l u š n é h o t yp u . ( S p r v k o m U C E T [ 1 ] p r a c u j e m e a k o s
p r e m e n n o u t y p u r e a l , s p r v k o m T E S T [ 2 ] a k o s p r e m e n n o u t yp u c h a r . )
UCET[1]:=123.50;
UCET[2]:=UCET[1]*2;
I:=3;
writeln(DETI[I]);
if TEST[1]='A' then P:=P+1
P O Z O R : p r e m e n n ú t yp u p o l e n e m ô ž e m e n a č í t a v a ť a n i v yp i s o v a ť :
readln(UCET); writeln(UCET)
Algoritmizácia a programovanie – učebné texty
48
P o l e n a č í t a v a m e a j v yp i s u j e m e p o j e d n o t l i v ýc h p r v k o c h :
readln(UCET[1]);
readln(UCET[2]);
alebo jednoduchšie:
readln(UCET[3]); for I:=1 to 12
...
do readln(UCET[I])
readln(UCET[12])
Príklad:
1 . D a n á j e p o s t u p n o s ť d e s i a t i c h c e l ýc h č í s e l . V yp í š t e t ú i s t ú
postupnosť:
a) odzadu (prvky v opačnom poradí)
b ) b e z n u l o v ýc h p r v k o v
c) najskôr záporné a potom nezáporné prvky
V praxi väčšinou dopredu nevieme, aké veľké pole budeme
p o t r e b o v a ť . Ú l o h a m ô ž e b yť z a d a n á t a k t o : D a n é j e p r i r o d z e n é č í s l o N
a N-prvková postupnosť reálny ch čísel... . Hodnota N sa načíta až po
z a h á j e n í p r o g r a m u , a l e p o l e m u s í b yť d e k l a r o v a n é s k ô r . A k b y s m e
pole deklarovali takto: var A:array[1..N]of real; počítač by nám
p r i p r e m e n n e j N v y h l á s i l c h yb u : „ C a n n o t e v a l u a t e t h i s e x p r e s s i o n “ .
( N e m ô ž e m v yh o d n o t i ť t e n t o v ýr a z - n e p o z n á m j e h o h o d n o t u . ) R o z s a h
i n d e x o v m u s í b yť v d e k l a r á c i i u r č e n ý k o n š t a n t o u .
Riešime to tak, že odhadneme maximálnu hodnotu N a dĺžku
poľa určíme podľa tohto odhadu. Napr.: Daný je počet žiakov v triede
N
a
N-prvková
postupnosť
reálnych
čísel,
predstavujúca
ich
priemerné známky... Odhadneme, že v triede nebude viac ako 40
žiakov a pole zadeklarujeme nasledovne:
var A:array[1..40]of real
A l e b o j e h o r n á h r a n i c a v s t u p n ýc h h o d n ô t u r č e n á p r i a m o v z a d a n í :
Dané
je
prirodzené
číslo
N
(N<=100)
reálnych čísel.... Deklarácia teda bude:
var A:array[1..100]of real.
Ak by sme to s dĺžkou poľa prehnali, napr.:
var A:array[1..20000]of real;
a
N -prvková
postupnosť
Algoritmizácia a programovanie – učebné texty
49
p o č í t a č v yh l á s i c h y b u : „ S t r u c t u r e t o o l a r g e “ . ( P r í l i š v e ľ k á d á t o v á
š t r u k t ú r a - n e z m e s t í s a d o v yh r a d e n e j č a s t i p a m ä t e . )
Príklady:
1. Daný
je
počet
postupnosť
zamestnancov
p r i r o d z e n ýc h
N
(N<=100)
čísel,
a
N -prvková
predstavujúcich
platy
zamestnancov. Zistite ich priemerný plat a počet zamestnancov,
ktorí majú podpriemerný plat.
2 . D a n ý j e p o č e t d n í v m e s i a c i N a N - p r v k o v á p o s t u p n o s ť c e l ýc h
č í s e l p r e d s t a v u j ú c a t e p l o t y n a m e r a n é v j e d n o t l i v ýc h d ň o c h o
12,00 hod. Nájdite hodnotu najnižšej teploty v danom období a
v yp í š t e č í s l a d n í , v k t o r ýc h b o l a n a m e r a n á ( m ô ž e i c h b yť v i a c ) .
3. Daná je veta - postupnosť znakov - v jednom riadku. Zistite, či
je
to
palindróm
(po
v yn e c h a n í
medzier
a
i n t e r p u n k č n ýc h
z n a m i e n o k , s i g n o r o v a n í m r o z d i e l u m e d z i m a l ým i a v e ľ k ým i
p í s m e n a m i , j e s ym e t r i c k á , t . z n . o d p r e d u i o d z a d u z n i e r o v n a k o ) .
N a p r . " K o b yl a m a m a l y b o k . " j e p a l i n d r ó m .
4 . D a n ý j e p o č e t d e t í N ( N < = 5 0 ) a p o s t u p n o s ť N r e á l n yc h č í s e l
predstavujúcich
úspory
vstupné
a
dáta
j e d n o t l i v ýc h
realizuje
detí.
nasledovnú
Program
ponuku
načíta
služieb:
a ) v ýp i s s t a v u ú s p o r v t v a r e :
1. dieťa:
12,50 Sk
2. dieťa:
8,10 Sk
...
N. dieťa:
222,00 Sk
-------------------Spolu:
xxx,xx Sk
b ) z v ýš i ť k a ž d é m u d i e ť a ť u h o d n o t u ú s p o r o K k o r ú n ( K j e d a n é )
c) uskutočniť zbierku po K korún (K je dané): každé dieťa dá
d o z b i e r k y K k o r ú n , a k m á m e n e j , t a k d á v š e t k o , č o m á . V yp í š e
s a h o d n o t a v yz b i e r a n e j s u m y.
Algoritmizácia a programovanie – učebné texty
50
d) zúročiť úspory - pripočítať každému dieťaťu k jeho sume
ú r o k y, k t o r ýc h p e r c e n t o j e u r č e n é t a b u ľ k o u :
suma do 10,- Sk: 1%
suma do 50,- Sk: 2%
suma nad 50,-Sk: 3%
e) zaevidovať nové dieťa (načíta sa jeho suma, ktorú vkladá do
banky a zaradí sa na koniec poľa)
f ) v yl ú č i ť I - t e d i e ť a z e v i d e n c i e ( I j e d a n é )
g) zaevidovať protekčné dieťa (načíta sa jeho suma, ktorú
vkladá do banky a zaradí sa na začiatok poľa)
1 .3 0 .
Deklarácia konštánt
Konštanta
je
konkrétna
hodnota
v
programe
na
v ys k yt o v a ť
určitého
r ô z n yc h
t yp u ,
miestach.
ktorá
Napr.
sa
môže
celočíselná
k o n š t a n t a 2 0 s a m ô ž e v ys k yt o v a ť v d e k l a r á c i i p o ľ a , v p r i r a ď o v a c o m
príkaze, v podmienke a pod.:
var A:array[1..20]of integer;
begin
...
I:=I+20;
...
if N>20 then writeln('POZOR!');
...
end.
P o d o b n e z n a k ' . ' a k o k o n š t a n t a t yp u c h a r :
begin
...
repeat
read(znak);
if znak<>'.' then ...;
until znak='.';
...
end.
Algoritmizácia a programovanie – učebné texty
51
Ak sa rozhodnem napr. v prvej ukážke zväčšiť rozsah poľa na 100,
musím opraviť v programe všetky konštanty s hodnotou 20, súvisiace
s r o z s a h o m p o ľ a , n a 1 0 0 . V r o z s i a h l e j š o m p r o g r a m e t o m ô ž e b yť
problém.
ROZSAH
Preto
a
je
v
v ýh o d n e j š i e
programe
túto
konštantu
používať
len
pomenovať,
tento
napr.
indentifikátor.
Samozrejme, skôr než ho použijeme, musíme ho zadekl arovať: const
ROZSAH=20. Deklaráciu umiestnime do deklaračnej časti programu,
z v yč a j n e p r e d d e k l a r á c i u p r e m e n n ýc h , a l e n i e j e t o p o d m i e n k o u .
Podobne
si
môžeme
zadeklarovať
konštantu
t yp u
char:
const
K O N C O V Y _ Z N A K = ' . ' . N a š e u k á ž k y p r o g r a m o v b u d ú p o t o m v yz e r a ť
takto:
const ROZSAH=20;
var A:array[1..ROZSAH]of integer;
begin
...
I:=I+ROZSAH;
...
if N>ROZSAH then writeln('POZOR!');
...
end.
P o d o b n e z n a k ' . ' a k o k o n š t a n t a t yp u c h a r :
const KONCOVY_ZNAK='.'
begin
...
repeat
read(znak);
if znak<>KONCOVY_ZNAK then ...;
until znak=KONCOVY_ZNAK;
...
end.
Ak sa teraz rozhodneme zväčšiť rozsah poľa na 100, zmenu stačí
u r o b i ť l e n n a j e d n o m m i e s t e p r o g r a m u , v d e k l a r á c i i k o n š t a n t y: c o n s t
ROZSAH=100 .
Syntax deklarácie konštanty:
const <identifikátor>=<konštanta>
Algoritmizácia a programovanie – učebné texty
52
T a k t o d e k l a r u j e m e k o n š t a n t y j e d n o d u c h ýc h t yp o v ( i n t e g e r , r e a l , c h a r ,
boolean, ...).
Niektoré konštanty sú súčasťou Pascalu, nemusíme ich deklarovať,
môžeme ich len používať. Jednou z nich je konštanta PI (Ludolfovo
číslo 3,14...).
Deklarácia typu
1 .3 1 .
A k p o u ž í v a m e v p r o g r a m e š t r u k t u r o v a n ý t yp ( z a t i a ľ p o z n á m e l e n t yp
pole),
z v yk n e m e
ho
pomenovať
a
v
programe
pri
deklarácii
p r e m e n n ýc h p o u ž í v a ť l e n j e h o i d e n t i f i k á t o r .
Syntax deklarácie typu:
t yp e < i d e n t i f i k á t o r > = < d e f i n í c i a t yp u >
Napríklad:
type TPOLE=array[1..100]of real
Takýto typ môžeme použiť pri deklarácii
premennej typu pole:
Je to to isté ako keby sme priamo
deklarovali:
var A:array[1..100]of real
var A:TPOLE
V ýh o d o u d e k l a r o v a n i a t yp u j e , ž e h o z a d e k l a r u j e m e l e n r a z a m ô ž m e
h o p o u ž i ť n a r ô z n y c h m i e s t a c h p r o g r a m u p r i d e k l a r á c i i p r e m e n n ýc h g l o b á l n yc h
i
podprogramy
l o k á l n yc h .
s
Keď
parametrami,
sa
neskôr
deklarácia
naučíme
t yp o v
bude
používať
dokonca
n e v yh n u t n á .
Doporučenie:
T a k a k o n á z v y p r e m e n n ýc h v o l í m e p o d ľ a t o h o , č o o b s a h u j ú , a j n á z v y
t yp o v b y m a l i k o r e š p o n d o v a ť s p r e m e n n ým i , p r i d e k l a r á c i i k t o r ýc h
b u d ú p o u ž i t é . Z v yč a j n e s a n á z o v t yp u z a č í n a p í s m e n o m T . N a p r í k l a d ,
v programe zadeklarujeme premennú typu pole, v ktorej budú uložené
p o č t y b o d o v , k t o r é z í s k a l ž i a k v p í s o m k e z a j e d n o t l i v e o t á z k y:
Algoritmizácia a programovanie – učebné texty
53
const POCET_OTAZOK=20;
t yp e T B O D Y = a r r a y [ 1 . . P O C E T _ O T A Z O K ] o f i n t e g e r ;
var BODY:TBODY
Úloha na premýšľanie:
A k m á m e v p r o g r a m e d v e p r e m e n n é r o v n a k é h o t yp u ( n a p r . A , B ) ,
m ô ž e m e p r i r a d i ť o b s a h j e d n e j p r e m e n n e j d o d r u h e j ( n a p r . A : = B ) . T yp
p r e m e n n ýc h m ô ž e b y ť ľ u b o v o ľ n ý ( a j p o l e ) . N a p r . :
v a r A , B : a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
begin A:=B end.
A k p o u ž i j e m e i n ý s p ô s o b d e k l a r á c i e p r e m e n n ýc h , m ô ž e n á m p o č í t a č
p r i p r í k a z e A : = B h l á s i ť c h yb u " T yp e m i s m a t c h " ( N e z h o d a t yp o v ) . V
k t o r e j z t ýc h t o u k á ž o k k t o m u d ô j d e a p r e č o ?
a ) v a r A : a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
B : a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
begin A:=B end.
b ) t yp e p o l e = a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
var A:pole;
B:pole;
begin A:=B end.
c ) t yp e p o l e = a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
var A,B:pole;
begin A:=B end.
d ) t yp e p o l e = a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
var A:pole;
B : a r r a y[ 1 . . 1 0 0 ] o f r e a l ;
begin A:=B end.
1 .3 2 .
Vy m e n o v a n ý t y p
N i e k e d y p o t r e b u j e m e p r a c o v a ť v p r o g r a m e s i n ým i h o d n o t a m i n e ž s ú
č í s l a , z n a k y, l o g i c k é h o d n o t y a p o d . S k r á t k a , ž i a d e n z o š t a n d a r d n ý c h
Algoritmizácia a programovanie – učebné texty
54
t yp o v s a n á m n e h o d í . M ô ž e m e s i v y t v o r i ť v l a s t n ý t y p s v l a s t n o u
m n o ž i n o u h o d n ô t . K a ž d ú h o d n o t u o z n a č í m e n e j a k ým i d e n t i f i k á t o r o m
a v ym e n u j e m e i c h v d e k l a r á c i i t yp u .
Syntax deklarácie vymenovaného typu:
type
<identifikátor
typu>=(<zoznam
identifikátorov
hodnôt
oddelených čiarkami>)
Napríklad
potrebujeme
v
programe
pracovať
s
hodnotami
p r e d s t a v u j ú c i m i d n i v t ýž d n i . O z n a č í m e i c h P O N D E L O K , U T O R O K ,
S T R E D A , S T V R T O K , P I A T O K , S O B O T A a N E D E L A . T yp s t o u t o
množinou hodnôt nazveme TDEN a zadeklarujeme ho:
type
TDEN=(PONDELOK,
UTOROK,
STREDA,
STVRTOK,
PIATOK,
do
môžeme
SOBOTA, NEDELA);
var DEN:TDEN
Zároveň
sme
zadeklarovali
premennú
DEN,
ktorej
p r i r a ď o v a ť h o d n o t y z o s e d e m p r v k o v e j m n o ž i n y h o d n ô t t yp u T D E N ,
napr. DEN:=STREDA.
Každá hodnota v množine má pridelený kód (celé číslo) počnúc od
n u l y. N a p r . k ó d h o d n o t y S T R E D A j e 2 . P r e h o d n o t y t o h t o t yp u
môžeme používať funkcie ORD, SUCC, PRED, tak ako sme ich
používali
pre
t yp
char.
Hodnoty
v ym e n o v a n é h o
t yp u
nemôžeme
n a č í t a ť a n i v yp í s a ť : r e a d l n ( D E N ) ; w r i t e l n ( D E N ) P o u ž í v a m e i c h k v ô l i
lepšej čitateľnosti programu.
1 .3 3 .
Typ interval
M n o ž i n a h o d n ô t t o h t o t yp u j e p o d m n o ž i n o u i n é h o o r d i n á l n e h o t yp u
( c h a r , b o o l e a n , c e l o č í s e l n ý a v ym e n o v a n ý t yp ) a j e u r č e n á d o l n o u a
hornou hranicou.
Syntax deklarácie typu interval:
type <identifikátor typu>=<dolná hranica>..<horná hranica>
Príklady
deklarácií
p r e m e n n ýc h :
intervalov
a
ich
použitie
pri
deklarácii
Algoritmizácia a programovanie – učebné texty
type
TDEN=(PONDELOK,
UTOROK,
55
STREDA,
STVRTOK,
PIATOK,
SOBOTA, NEDELA);
TZNAMKY=1..5;
TABECEDA='a'..'z';
TPRAC_DNI=PONDELOK..PIATOK;
var Z:TZNAMKY;
ZNAK:TABECEDA;
DEN:TPRAC_DNI
T yp T Z N A M K Y j e p o d m n o ž i n o u t y p u I N T E G E R . S p r e m e n n o u Z
p r a c u j e m e a k o s p r e m e n n o u t yp u I N T E G E R , a l e p r i r a ď o v a ť d o n e j
môžeme len hodnoty od 1 do 5. Podobne TABECEDA je podmnožinou
t yp u C H A R a T P R A C _ D N I j e p o d m n o ž i n o u t yp u T D E N .
Interval sa používa hlavne pri deklarácii poľa:
const MAX=100;
type TINDEX=1..MAX;
TPOLE=array[TINDEX] of integer;
var A:TPOLE
Príklad:
1. Naprogramujte
h o d i n o v ýc h
obeh
ručičiek,
h viezdičky
pokiaľ
okolo
užívateľ
obrazovky
nestlačí
v
smere
ľubovoľnú
klávesu. (Pracujte s riadkami 1..25 a stĺpcami 1..79, posledný
stĺpec ignorujte.)
Riešenie:
V c yk l e b u d e m e o p a k o v a n e v yp i s o v a ť a z o t i e r a ť h v i e z d i č k u , p r i č o m
jej súradnice sa budú po každom kroku meniť. Aktuálnu pozíciu
h v i e z d i č k y s i b u d e m e p a m ä t a ť v p r e m e n n ýc h X , Y , p r e d s t a v u j ú c i c h
súradnice
h v i e z d i č k y.
Hrubá
nasledovne:
repeat
<vypíš hviezdičku>;
<počkaj>;
<zotri hviezdičku>;
<zmeň súradnice>
until keypressed
schéma
programu
bude
v yz e r a ť
Algoritmizácia a programovanie – učebné texty
56
Ako sa budú meniť súradnice? Raz sa bude meniť x -ová, raz y-ová
súradnica - raz sa bude zväčšovať o 1 a raz zmenšovať, podľa toho,
a k ý m á h v i e z d i č k a p r á v e s m e r ( v ýc h o d , j u h , z á p a d , s e v e r ) . A b y s m e
vedeli, ktorú súradnicu treba zmeniť a ako, budeme si ešte pamätať
a k t u á l n y s m e r v p r e m e n n e j t yp u T S M E R :
type TSMER = (VYCHOD,JUH,ZAPAD,SEVER);
var S:TSMER;
X,Y:integer;
P r o g r a m b u d e v yz e r a ť n a s l e d o v n e - d o p l ň t e c h ýb a j ú c e č a s t i :
begin
{inicializácia premenných - doplňte ďalšie}
X:=1; Y:=1;
repeat
{vypíšeme
hviezdičku
na
pozíciu
[X,Y]
-
doplňte
príkazy}
delay(50);
{zotrieme hviezdičku}
gotoxy(X,Y);
write(' ');
{zmeníme súradnice}
if S=VYCHOD then if X<79 then X:=X+1 el se S:=JUH;
if S=JUH
then
until keypressed
end.
{doplňte}
Algoritmizácia a programovanie – učebné texty
57
T y p r e ťa z e c
1 .3 4 .
R e ť a z e c j e p o s t u p n o s ť z n a k o v , k t o r ú z a p i s u j e m e m e d z i a p o s t r o f y.
Počet znakov určuje dĺžku reťazca.
Napr.: 'FERO' je reťazec dĺžky 4
'PD 123AB' je reťazec dĺžky 8 (počít a sa aj medzera)
'@' je reťazec dĺžky 1
'' je reťazec dĺžky 0 - prázdny reťazec
Deklarácia premennej typu reťazec:
var <premenná>:string[<maximálna dĺžka reťazca>]
M a x i m á l n a d ĺ ž k a r e ť a z c a u r č u j e , a k ý n a j d l h š í r e ť a z e c m ô ž e b yť v
premennej uložený. Je to c elé číslo z intervalu <0,255>. Táto časť
d e k l a r á c i e j e n e p o v i n n á , a k j u v yn e c h á m e , p o č í t a č j u a u t o m a t i c k y
doplní na 255:
var <premenná>:string
Napr.:
var R:string[10];
S:string[2];
T:string;
Operácie s reťazcami:
a. priradenie
R:='ABCD';
S:=R
{ak
sa
priraďovaný
reťazec
nezmestí
do
premennej, skracuje sa sprava}
b. porovnanie
Dva
pomocou
reťazce
sa
operátorov
porovnávajú
<
podľa
>
=
p r v ýc h
<>
<=
znakov,
>=
napr.:
'ABDF'<'BBC', pretože 'A'<'B'.
c. Ak sú prvé znaky zhodné, porovnáva sa podľa najbližše j dvojice
znakov,
ktoré
sú
rôzne,
napr.:
'ABC DE'<'ABCE',
pretože
'D'<'E'.
d . A k j e j e d e n z r e ť a z c o v k r a t š í a c h ýb a m u ď a l š í z n a k n a
porovnanie, považuje sa žiadny znak za menší než ľubovoľný
Algoritmizácia a programovanie – učebné texty
58
iný znak, napr.: 'ABC'<'ABCD', pretože ľavý reťazec nemá
štvrtý znak.
e. zreťazenie pomocou operátora +. Zreťazenie je spojenie dvoch
reťazcov do jedného. Napr.: 'SKODA ' + 'FABIA' = 'SKODA
FABIA'
f. načítanie - reťazce môžeme načítavať pomocou príkazov read,
readln, ale zatiaľ budeme používať len readln.
g . v ý p i s - r e ť a z c e m ô ž e m e v yp i s o v a ť n a o b r a z o v k u p o m o c o u
príkazov write, writeln.
Príklady:
var R,S,T:string[6];
begin R:='MYŠ';
S:='LIENKA';
if S<R
then T:=R+S
else T:=S+R;
writeln(T)
end.
Čo vypíše tento program na obrazovku ?
1. Dané je prirodzené číslo N a N-prvková postupnosť mien.
N a č í t a j t e v s t u p n é ú d a j e a v yp í š t e n a o b r a z o v k u m e n á , k t o r é s a
začínajú na 'A'.
2. Daný je reťazec Z predstavujúci slovný základ, prirodzené číslo
N a N - p r v k o v á p o s t u p n o s ť r e ť a z c o v , p r e d s t a v u j ú c i c h p r e d p o n y.
V yp í š t e v š e t k y m o ž n é s l o v á , k t o r é v z n i k n ú z p r e d p ô n a z á k l a d u .
Doplnok:
Napočítajte
aj
prirodzené
číslo
M
a
M -prvkovú
p o s t u p n o s ť r e ť a z c o v - p r í p o n . V yp í š t e v š e t k y m o ž n é s l o v á ,
k t o r é v z n i k n ú z o z á k l a d u , p r e d p ô n a p r í p o n . N a p r . : 3 p r e d p o n y:
' O ' , ' Z Á ' , ' V Ý ' , 2 p r í p o n y: ' A ' , ' N Í K ' , z á k l a d : ' H R A D ' v z n i k n u t é
slová:
'OHRADA', 'ZÁHRADA',
'ZÁHRADNÍK', 'VÝHRADNÍK'
'VÝHRADA',
'OHRADNÍK',
Algoritmizácia a programovanie – učebné texty
59
3. Dané je prirodzené číslo N. Uložte do premennej S:string
r e ť a z e c z l o ž e n ý z N v ýk r i č n í k o v .
4. Daný je reťazec predstavujúci číslo v semilogaritmickom t vare,
ktorého formát je <celé číslo>E<prir.číslo> (napr.: -123E5).
P r o g r a m v yp í š e t o t o č í s l o v b e ž n o m t v a r e ( n a p r . : - 1 2 3 0 0 0 0 0 ) .
Vy h ľ a d á v a n i e
1 .3 5 .
Pri práci s dátovými štruktúrami sa často stretneme s potrebou
v yh ľ a d a ť
jeden
postupnosti
alebo
žiakov
viac
chceme
prvkov
v yp í s a ť
danej
v š e t k ýc h
vlastnosti.
Napr.
z
v yz n a m e n a n ýc h ,
v
p o s t u p n o s t i e v i d e n č n ýc h z á z n a m o v c h c e m e n á j s ť z á z n a m o o s o b e s
m e n o m ' C yr i l ' , v r o d o k m e n i k r á ľ o v s k é h o r o d u c h c e m e n á j s ť v š e t k ýc h
súrodencov Ľudovíta XIV., v policajnom registri chceme náj sť osobu
s o t l a č k a m i p r s t o v z h o d n ým i s o t l a č k a m i z m i e s t a č i n u , v s l o v n í k u
chceme nájsť preklad slova.
A l g o r i t m u s , k t o r ý p o u ž i j e m e p r i v yh ľ a d á v a n í z á v i s í h l a v n e o d t yp u
d á t o v e j š t r u k t ú r u , v k t o r e j m á m u r č e n ý p r v o k v yh ľ a d a ť .
P r i v yh ľ a d á v a n í p r v k o v s d a n o u v l a s t n o s ť o u v l i n e á r n e j d á t o v e j
š t r u k t ú r e ( p o s t u p n o s t i ) m ô ž e m p o u ž i ť t i e t o z á k l a d n é a l g o r i t m y:
1. lineárny výber - postupne skontrolujem všetky prvky od prvého
p o p o s l e d n ý, s k o n č í m p r i p o s l e d n o m p r v k u , a l e b o a j s k ô r , k e ď
nájdem prvok s požadovanou vlastnosťou :
<nastav sa na prvý prvok>;
while
<nie
si
na
konci
postupnosti>and<nie
je
to
hľadaný prvok>
do <posuň sa na ďalší prvok>
Koľko
z á k l a d n ýc h
operácií
(porovnaní)
musíme
pri
tomto
p o s t u p e v yk o n a ť v n a j h o r š o m p r í p a d e ( t . z n . k e ď m u s í m e p r e j s ť
celú postupnosť)? Skúste tento postup naprogramovať pomocou
c yk l u r e p e a t .
Algoritmizácia a programovanie – učebné texty
60
2. binárny výber - pri tomto postupe využijeme, že postupnosť je
usporiadaná vzostupne (od najmenšieho po najväčší) podľa
d a n e j v l a s t n o s t i . V ž d y s i v yb e r i e m e n a j s k ô r s t r e d n ý p r v o k z
úseku, v ktorom hľadáme. Zistíme, či to nie je ten, ktorý
hľadáme. Ak nie je a náš hľadaný prvok je od stredného menší,
v yb e r i e m e s i z p o ľ a l e n j e h o ľ a v ú p o l o v i c u ( t . j . p r v k y v ľ a v o o d
stredného)
hľadaný
a
opakujeme
prvok.
Ak
rovnaký
bol
náš
postup,
prvok
k ým
väčší
nenájdeme
od
stredného
postupujeme ďalej v pravej polovici. Ak sa hľadaný prvok v
postupnosti vôbec nenachádza, bude sa úsek, v ktorom hľadáme
stále zmenšovať na polovicu, až zostane prázdny (nulovej
d ĺ ž k y) :
<úsek, v ktorom hľadám je najskôr celá postupnosť>;
repeat
<vyber stredný prvok úseku>;
if <hľadaný prvok> < <stredný prvok>
then <vezmi ľavý úsek>
else if <hľadaný prvok> > <stredný prvok>
then <vezmi pravý úsek>
until
(<hľadaný
prvok>=<stredný
prvok>)
or
<zostal
prázdny úsek>
K o ľ k o p o r o v n a n í m u s í m e v yk o n a ť v n a j h o r š o m p r í p a d e ?
Príklad:
D a n é j e p r i r o d z e n é č í s l o N a N - p r v k o v á p o s t u p n o s ť c e l ýc h č í s e l
usporiadaná
vzostupne.
postupnosti,
príp.
v yp í š t e
Zistite
oznam,
pozíciu
že
danej
hodnota
hodnoty
sa
v
H
v
postupnosti
n e n a c h á d z a . P o u ž i t e l i n e á r n y a j b i n á r n y v ýb e r a p r e o b a p o s t u p y
v yp í š t e , k o ľ k o p o r o v n a n í s a m u s e l o v y k o n a ť p r i v yh ľ a d á v a n í .
<načítaj N>;
<načítaj usporiadanú postupnosť>;
<načítaj hodnotu H>;
<vyhľadaj pozíciu hodnoty H v postupnosti lineárne>;
writeln(H,'sa nachádza na ',I,' pozícii. ');
Algoritmizácia a programovanie – učebné texty
writeln('Pri
lineárnom
61
postupe
som
vykonal
',POCL,'
porovnaní.');
<vyhľadaj pozíciu hodnoty H v postupnosti binárne>;
writeln(H,'sa nachádza na ',J,' pozícii.');
writeln('Pri
binárnom
postupe
som
vykonal
',POCB,'
porovnaní.');
Rozšírte program tak, že sa nebude zadávať jedna hodnota H na
v yh ľ a d a n i e , a l e v i a c z a s e b o u , p r i č o m p o s l e d n á b u d e n u l a .
Textový súbor
1 .3 6 .
S ú b o r j e p o s t u p n o s ť d á t u l o ž e n á n a d i s k u p o d v l a s t n ým m e n o m ,
napr.: list.txt. Úplné meno súboru obsahuje aj názov disku, na ktorom
j e u l o ž e n ý, a j s a d r e s á r o v o u c e s t o u , n a p r . :
c:\dokumenty\posta\list.txt.
Textový
súbor
obsahuje
dáta
vo
forme
textu,
t.zn.
z n a k y,
u s p o r i a d a n é v r i a d k o c h r ô z n e j d ĺ ž k y. V e ľ k o s ť s ú b o r u j e t i e ž r ô z n a ,
závisí od počtu znakov, ktoré
Milý Jožko!
Úvodom môjho listu Ťa čo najsrdečnejšie
pozdravujem.
Máš niečo nové?
Ja mám veľkú novinku, konečne som
sa naučil programovať.
obsahuje.
Textový
súbor
môžeme
predstaviť
ako
papiera,
ktorý je
si
list
ohraničený
len zľava a zhora. Môžeme naň
p í s a ť r i a d k y ľ u b o v o ľ n e j d ĺ ž k y, p o č e t r i a d k o v j e t i e ž ľ u b o v o ľ n ý,
obmedzený len kapacitou disku.
T a k ýt o t e x t o v ý s ú b o r s i m ô ž e m e p r e z e r a ť a e d i t o v a ť v n e j a k o m
textovom
editore,
napr.
Poznámkový
blok
(Notepad),
Windows
Commander alebo Volkov Commander (služba F3 View, F4 Edit),
textový editor v nejakom programovacom jazyku (napr. Borland
Pascal),..
Na konci každého riadku je v súbore neviditeľný znak konca
riadku.
Môžeme
ho
znázorniť
ako
.
Textový
editor
nám
ho
Algoritmizácia a programovanie – učebné texty
62
nezobrazuje, ale v súbore je zapísaný ako dva znaky (#13#10), ktoré
označujú koniec riadku. Na konci celého súboru je tiež neviditeľný
znak konca súboru (#26).
S t e x t o v ým s ú b o r o m m ô ž e m e p r a c o v a ť a j v p r o g r a m e . V ý s l e d k y
programu
( v ýs t u p )
nemusíme
v yp i s o v a ť
len
na
obrazovku,
ale
môžeme ich zapísať do súboru, kde zostanú trvalo uchované. Podobne
vstup programu nemusíme realizovať len z klávesnice, ale vstupné
d á t a m ô ž e m e n a č í t a ť z t e x t o v é h o s ú b o r u . V yu ž i j e m e t o n a p r í k l a d
v t e d y, k e ď j e v s t u p n ýc h d á t v ä č š i e m n o ž s t v o . P r i l a d e n í p r o g r a m
spúšťame niekoľkokrát za sebou a je dosť pracné opakovane zadávať
m n o ž s t v o v s t u p n ýc h d á t .
A k c h c e m e v p r o g r a m e p r a c o v a ť s t e x t o v ým s ú b o r o m , m u s í m e s i
zadeklarovať premennú, ktorá ho bude reprezentovať.
Deklarácia premennej typu textový súbor:
var <premenná>:text
napr.: var T:text
Príkazy pre prácu s textovým súborom:
Assign(<premenná typu textový súbor>,<meno súboru>)
napr.: assign(T, 'c:\dokumenty\posta\list.txt')
- t ým t o p r í k a z o m p r i d e l í m e
premennej
t yp u t e x t o v ý s ú b o r
konkrétny súbor z disku. Meno súboru je reťazec. Tento súbor
b u d e p r e m e n n á r e p r e z e n t o v a ť v o v š e t k ýc h o s t a t n ýc h p r í k a z o c h .
Rewrite(<premenná typu textový súbor>)
napr.: Rewrite(T)
- otvorenie súboru pre zápis. Tento príkaz vytvorí nový prázdny
súbor na disku, do ktorého môžeme následne zapisovať. Ak
daný súbor predtým existoval, jeho obsah sa zmaže.
Append(<premenná typu textový súbor>)
napr.: Append(T)
- otvorenie súboru pre zápis. Tento príkaz môžeme použiť len
pre existujúci súbor, do ktorého môžeme následne zapisovať na
k o n i e c . A k d a n ý s ú b o r p r e d t ým n e e x i s t o v a l , o b j a v í s a c h yb o v é
hlásenie.
Reset(<premenná typu textový súbor>)
napr.: Reset(T)
- otvorenie súboru pre čítanie. Tento príkaz môžeme použiť len
pre existujúci súbor, z ktorého môžeme následne čítať. Ak daný
s ú b o r p r e d t ým n e e x i s t o v a l , o b j a v í s a c h yb o v é h l á s e n i e .
Algoritmizácia a programovanie – učebné texty
write/writeln(<premenná
63
typu
textový
súbor>,<zoznam
zapisovaných údajov>)
napr.: write(T,'Pocet deti je ', CH+D,'.')
- z á p i s ú d a j o v d o t e x t o v é h o s ú b o r u . Ú d a j e m ô ž u b yť t yp u z n a k ,
reťazec, číslo a oddeľujeme ich čiarkami. Príkazy používame
r o v n a k o a k o p r i v ý p i s e n a o b r a z o v k u s t ým r o z d i e l o m , ž e p r v ý
p a r a m e t e r p r í k a z u j e p r e m e n n á t yp u t e x t o v ý s ú b o r .
read/readln(<premenná
typu
textový
súbor>,<zoznam
premenných>)
napr.: readln(T,A,B,C)
- č í t a n i e ú d a j o v z t e x t o v é h o s ú b o r u . P r e m e n n é m ô ž u b y ť t yp u
znak,
reťazec,
číslo
a
oddeľujeme
ich
čiarkami.
Príkazy
p o u ž í v a m e r o v n a k o a k o p r i č í t a n í z k l á v e s n i c e s t ým r o z d i e l o m ,
ž e p r v ý p a r a m e t e r p r í k a z u j e p r e m e n n á t yp u t e x t o v ý s ú b o r .
close(<premenná typu textový súbor>
napr.: close(T)
- zatvorenie textového súboru. Na konci práce so súborom,
musíme súbor zatvoriť. Ak do súboru zapisujeme a zabudneme
ho na konci programu zatvoriť, pravdepodobne v súbore budú
c h ýb a ť p o s l e d n é ú d a j e , k t o r é s m e d o ň z a p i s o v a l i . J e t o z t o h o
dôvodu, že príkaz write/writeln nezapisuje dáta do súboru
okamžite, dáta sa do súboru prenášajú po väčších blokoch.
Príkazom close sa prenesie na disk aj posledný blok dát.
Funkcie pre prácu s textovým súb orom:
eoln(<premenná typu textový súbor>)
napr.: eoln(T)
- logická funckia. Vráti TRUE/FALSE, ak smerník pre čítanie
je/nie je na konci aktuálneho riadku súboru.
eof(<premenná typu textový súbor>)
napr.: eof(T)
- logická funckia. Vráti TRUE/FALSE, ak smerník pre čítanie
je/nie je na konci súboru.
OBE FUNKCIE SA POUŽÍVAJ Ú LEN PRI Č ÍTANÍ.
Príklad:
D a n ý j e p o č e t p r v k o v N a N - p r v k o v á p o s t u p n o s ť p r i r o d z e n ýc h č í s e l .
Z i s t i t e a v yp í š t e p o č e t v ýs k yt o v j e d n o t l i v ýc h č í s e l v p o s t u p n o s t i .
Algoritmizácia a programovanie – učebné texty
64
Nasledujúce dva programy riešia danú úlohu, pričom prvý realizuje
vstup z klávesnice a výstup na obrazovku, druhý program číta vstupné
dáta zo súboru DATA.IN a výsledky zapisuje do súboru DATA.OUT.
type TPOLE=array[1..100]of integer;
type TPOLE=array[1..100]of integer;
var A:TPOLE;
var A:TPOLE;
N,POCET,I,J:integer;
N,POCET,I,J:integer;
VST,VYS:text;
begin
begin
assign(VST,'DATA.IN');
assign(VYS,'DATA.OUT');
write('Zadaj
pocet
prvkov:
');
reset(VST); rewrite(VYS);
readln(N);
writeln('Zadaj hodnoty prvkov: ');
readln(VST, N);
for I:=1 to N
for I:=1 to N
do read(A[I]);
do read(VST, A[I]);
for I:=1 to N
for I:=1 to N
do if A[I]>0
do if A[I]>0
then begin
then begin
POCET:=0;
POCET:=0;
for J:=I to N
for J:=I to N
do if .....
do if .....
then POCET:=POCET+1;
writeln(A[I],'
vyskytuje ',POCET,'-krat.');
then POCET:=POCET+1;
sa
writeln(VYS,
A[I],'
vyskytuje ',POCET,'-krat.');
A[I]:=.....
A[I]:=.....
end
end;
close(VST); close(VYS)
end.
end.
D o p l ň t e v p r o g r a m e c h ýb a j ú c e č a s t i . K o ľ k o p o r o v n a n í s a v yk o n á p r e
N-prvkovú postupnosť v najhoršom prípade?
V s t u p n ý s ú b o r b y m o h o l v yz e r a ť V ýs t u p n ý s ú b o r p o t o m b u d e :
takto:
10
1 s a v ys k yt u j e 3 - k r a t .
1 7 1 1 10 7 10 7 7 3 3
7 s a v ys k yt u j e 4 - k r a t .
1 0 s a v ys k yt u j e 2 - k r a t .
3 s a v ys k yt u j e 1 - k r a t .
P r e č o s a h o d n o t a 3 v ys k yt u j e v d a n e j p o s t u p n o s t l e n 1 - k r a t ?
sa
Algoritmizácia a programovanie – učebné texty
65
1.36.1. Chybové hlásenia pri práci s textovým súborom
File not found
Pri otváraní (Reset, Append) nenašiel daný súbor. Buď súbor
neexistuje, alebo je zle zadaná adresárová cesta k súboru.
Path not found
Pri otváraní súboru bola zle zadaná adresárová cesta, daný
adresár neexistuje.
File not open for input
Súbor nie je otvorený pre čítanie. Súbor sme otvorili príkazom
rewrite/append a chceme z neho čítať.
File not open for output
Súbor nie otvorený pre zápis. Súbor sme otvorili príkazom reset
a chceme doň zapisovať , alebo použiť funkciu eoln/eof.
Príklady:
1. Dan ý je textový súbor TEXT.IN. Zistite, koľko obsahuje a)
znakov,
b)
riadkov,
c)
viet
(veta
je
ukončená
bodkou,
v ýk r i č n í k o m , a l e b o o t á z n i k o m ) .
2. Daný je textový súbor MAJETOK.IN, obsahujúci majetkové
priznanie
obsahujúce
niekoľko
položiek.
Každá
položka
je
zapísaná v jednom riadku v tvare: názov majetku, medzera,
hodnota v Sk. Zistite celkovú hodnotu majetku.
auto 500000
dom 1500000
zahrada 50000
3. Dan ý je textový súbor CIS LA. IN obsahujúci postupnosť čísel.
V yt v o r t e t e x t o v ý s ú b o r H V I E Z D Y . O U T , d o k t o r é h o z a p í š e t e
p o s t u p n o s ť " h v i e z d i č k o v ýc h " r i a d k o v , k d e d ĺ ž k y r i a d k o v s ú
určené číslami z danej postupnosti.
Algoritmizácia a programovanie – učebné texty
66
CIS LA. IN HVIEZDY.OUT
5
*****
1
*
2
**
8
********
4. Milionár: V textovom súbore OTAZKY.IN sú zapísané znenia
o t á z o k o d d e l e n é p r á z d n ym i r i a d k a m i . Z a t e x t o m k a ž d e j o t á z k y
nasledujú 4 možnosti odpovedí (A,B,C,D). V textovom súbore
ODPOVEDE.IN je zapísaná postupnosť znakov, predstavujúcich
s p r á v n e o d p o v e d e k o t á z k a m v p r v o m s ú b o r e . V yt v o r t e p r o g r a m ,
ktorý
bude
postupne
po
jednej
otázke
čítať
zo
súb oru,
v yp i s o v a ť j u n a o b r a z o v k u a č í t a ť z k l á v e s n i c e u ž í v a t e ľ o v e
odpovede. Za správnu odpoveď získa užívateľ bod.
Doplnok: užívateľ môže pri každej otázke použiť žolíka '50:50',
p r i o d p o v e d i b e z ž o l í k a s a m u z a p o č í t a j ú 2 b o d y, s o ž o l í k o m 1
bod.
OTAZKY.IN
ODPOVEDE.IN
Ako sa volá hlavné mesto Talianska? B
A. Talian
B. Rím
D
C. Vatikán D. Pelikán
Čo je to tritical?
A. chemická zlúčenina B. hmyz
C. praveký jašter
D. obilnina
Algoritmizácia a programovanie – učebné texty
67
Generovanie náhodných údajov
1 .3 7 .
Vygenerovať náhodný údaj z nejake j množiny znamená náhodne
v yb r a ť j e d n u h o d n o t u z d a n e j m n o ž i n y. V j a z yk u P a s c a l m á m e t i e t o
n á s t r o j e n a g e n e r o v a n i e n á h o d n ýc h č í s e l :
random(<celé číslo>)
- funkcia, ktorá vráti náhodné celé číslo z intervalu <0,<celé
číslo>-1>. Napr. random(10) vráti celé číslo z intervalu <0,9>.
Celé číslo, ktoré je parametrom funkcie random, predstavuje
"dĺžku"
intervalu
(počet
c e l ýc h
čísel),
z
ktorého
v yb e r á
náhodné číslo, pričom dolná hranica intervalu je vždy 0.
randomize
- procedúra, ktorú stačí použiť len raz na z ačiatku programu,
a l e b o p r e d p r v ým p o u ž i t í m f u n k c i e r a n d o m . J e t o v l a s t n e
" n a š t a r t o v a n i e " g e n e r á t o r a n á h o d n ýc h č í s e l a s p ô s o b í , ž e p r i
každom ďalšom spustení programu bude generovať iné čísla.
random
- funkcia použitá bez parametra vráti náhodné reálne č íslo z
intervalu <0,1)
Príklad použitia:
Užívateľ
zadá
prirodzené
číslo
N
predstavujúce
počet
prvkov
p o s t u p n o s t i n á h o d n ý c h č í s e l , k t o r é m á p o č í t a č v yg e n e r o v a ť . P r o g r a m
s a s p ýt a u ž í v a t e ľ a , č i c h c e p o s t u p n o s ť c e l ýc h a l e b o r e á l n yc h č í s e l a
vygeneruje ju.
uses Crt;
var N:integer;
VYBER:char;
procedure CELE;
var I:integer;
begin
for I:=1 to N
do write(random(100),' ')
end;
Algoritmizácia a programovanie – učebné texty
68
procedure REALNE;
var I:integer;
begin
for I:=1 to N
do writeln(random:0:10)
end;
BEGIN
write('Zadaj, kolko cisel chces: '); readln(N);
writeln('Zadaj, ake chces cisla:');
writeln('a) cele z intervalu <0,99>');
writeln('b) realne z intervalu <0,1)');
VYBER:=upcase(readkey);
case VYBER of
'A':CELE;
'B':REALNE;
end;
readln
END.
Úloha pre vás: rozšírte ponuku programu o možnosti generovať
- celé čísla z intervalu <100,150>
- reálne čísla z intervalu <0,10)
- reálne čísla z intervalu <5,15)
- znaky z intervalu 'a'..'z'
- logické hodnoty
- farby z množiny {biela, žltá, oranžová, če rvená, zelená, modrá,
fialová}
Ak chceme vygenerovať náhodné celé číslo z intervalu <A,B> a
uložiť ho do premennej C:integer, použijeme príkaz
C:=......................................... (doplňte).
Ak chceme vygenerovať náhodné reálne číslo z intervalu <A ,B) a
uložiť ho do premennej C:real, použijeme príkaz
C:=......................................... (doplňte).
Algoritmizácia a programovanie – učebné texty
69
Ak chceme vygenerovať náhodný nečíselný údaj, spravíme to tak, že
...............................
Príklady:
1 . V yt v o r t e
program,
obdĺžničky po
ktorý
obrazovke,
súradnice
X,
Y
a
u r č e n ým i
súradnicami
náhodne
t.j.
náhodnú
"rozh adzuje"
opakovane
farbu
určenou
a
generuje náhodné
v yk r e s ľ u j e
farbou.
farebné
Program
políčko
končí,
s
ak
užívateľ stlačí ľubovoľnú klávesu.
2 . D o s t r e d u o b r a z o v k y v y p i s u j t e v u r č i t ý c h č a s o v ýc h i n t e r v a l o c h
náhodné čísla z intervalu <0,9> (stále na rovnaké políčko),
pokiaľ užívateľ nestlačí ľubovoľnú klávesu. (Na obrazovke sa
točia čísla podobne, ako keď sa žrebuje.)
3. Doplnok: Úlohou užívateľa je zastaviť generovanie, keď je na
o b r a z o v k e č í s l o 0 . A k b o l ú s p e š n ý, z a p o č í t a s a m u b o d . P o 1 0
p o k u s o c h s a v yh o d n o t í j e h o ú s p e š n o s ť .
4. P r o g r a m v y g e n e r u j e d v e c e l é č í s l a - o p e r a n d y a a r i t m e t i c k ú
o p e r á c i u ( + - * / ) . V yp í š e n a o b r a z o v k u v yg e n e r o v a n ý v ýr a z v
tvare <operand><operátor><operand>= a od uží vateľa načíta
č í s l o p r e d s t a v u j ú c e v ýs l e d o k v ýr a z u . A k j e u ž í v a t e ľ o v v ý s l e d o k
s p r á v n y,
započíta
sa
mu
bod.
Po
10
príkladoch
program
v yh o d n o t í ú s p e š n o s ť u ž í v a t e ľ a a o z n á m k u j e h o .
1 .3 8 .
Š t a n d a r d n é p r o c e d ú r y a f u n k c i e p r e t y p S TR I NG
length(<reťazec>)
- funkcia, ktorá vráti celé číslo predstavujúce dĺžku reťazca
pos(<podreťazec>,<reťazec>)
- f u n k c i a v r á t i p o z í c i u p r v é h o v ýs k y t u p o d r e ť a z c a v r e ť a z c i ,
príp. nulu, ak sa podreťazec v reťazci nenachádza
copy(<reťazec>,<pozícia>,<počet znakov>)
- f u n k c i a v r á t i p o d r e ť a z e c , k t o r ý v z n i k n e v ýb e r o m d a n é h o p o č t u
znakov z daného reťazca od danej pozície
insert(<podreťazec>,<reťazec>,<pozícia>)
Algoritmizácia a programovanie – učebné texty
70
- vloží do reťazca daný podreťazec na danú pozíciu
delete(<reťazec>,<pozícia>,<počet znakov>)
- v danom reťazci zmaže od danej poz ície daný počet znakov
str(<číslo>,<reťazec>)
- procedúra zmení číslo na reťazec
val(<reťazec>,<číslo>,<kód chyby>)
- p r o c e d ú r a z m e n í r e ť a z e c n a č í s l o a v k ó d e c h yb y v r á t i n u l u ; v
prípade že reťazec nepredstavuje zápis čísla, bude výsledné
číslo
nula
a
v
kóde
c h yb y
bude
uložená
pozícia
prvého
c h yb n é h o z n a k u v r e ť a z c i
Príklady použitia:
var I,K:integer;
C:real;
S,R:string
Stav premenných pred
Príkaz
Stav premenných po Poznámka
S='dva'
I:=length(S)
I=3
S='vodovod'
I:=pos('od',S)
I=2
S='BYSTROZRAKÝ'
I:=pos('rak',S)
I=0
S='straka'
R:=copy(S,2,4)
R='trak'
S='konár'
insert('mi',S,3)
S='kominár'
S='slovák'
delete(S,3,2)
S='slák'
I=72
str(I,S)
S='72'
C=2.34
str(C:6:3,S)
S=' 2.340'
S='-45.6'
val(S,C,K)
C=-45.6, K=0
S='-45.6'
val(S,I,K)
I=0, K=4
S='-45'
val(S,I,K)
I=-45, K=0
length(S) je to isté ako
ord(S[0])
podreťazec
nenašiel
kvôli rozdielu medzi
malými
a
veľkými
písmenami
čísla premieňané na
reťazec
môžeme
formátovať ako pri
výpise na obrazovku
reťazec sa podarilo
premeniť na číslo
reťazec
nemožno
premeniť na celé číslo
kvôli 4. znaku
reťazec sa podarilo
premeniť na číslo
Algoritmizácia a programovanie – učebné texty
71
1.38.1. Príklady
( v z á t v o r k á c h s ú u v e d e n é f u n k c i e a p r o c e d ú r y, k t o r é b y s t e m o h l i v
p r í k l a d e v yu ž i ť )
1 . V yt v o r t e p r o g r a m , k t o r ý n a č í t a r e ť a z e c ,
n a s l e d o v n é ú p r a v y a p o k a ž d e j h o v yp í š e :
v yk o n á
s
ním
- každú čiarku zmení na bodkočiarku
- každú za sebou idúcu dvojicu znakov 'xx' zmení na '2x'
- každý začiatok slova (slová sú oddelené medzerami, t.zn. pred
k a ž d ým s l o v o m s v ý n i m k o u p r v é h o j e m e d z e r a ) z m e n í n a v e ľ k é
písmeno.
(length)
2 . Z d a n é h o r e ť a z c a S o d s t r á ň t e v š e t k y m e d z e r y a v yp í š t e h o .
(length, delete)
3 . D o d a n é h o r e ť a z c a v l o ž t e z a k a ž d ý z n a k m e d z e r u a v yp í š t e h o .
(length, insert)
4. V danom reťazci S je uložené meno a priezvisko oddelené
medzerou. Do reťazca M uložte zvlášť meno a do reťazca P
p r i e z v i s k o . N a p r . z r e ť a z c a S = ' K u b o Z a j a c ' v yt v o r t e r e ť a z c e
M = ' K u b o ' a P = ' Z a j a c ' . ( p o s , c o p y, l e n g t h )
5 . V yr i e š t e b e z
požitia
t yp u
real:
Načítajte
reálne
číslo
(do
r e ť a z c o v e j p r e m e n n e j ) , z i s t i t e a v yp í š t e , k o ľ k o m á d e s a t i n n ýc h
miest.
(pos,
len gth)
V yp í š t e j e h o d e s a ť n á s o b o k . ( d e l e t e , i n s e r t )
6. Vygenerujte
náhodný
reťazec
zložený
z
písmen
abecedy
náhodnej dĺžky max. 80.
7. Vygenerujte náhodný text a zapíšte ho do súboru
- počet
riadkov bude náhodné číslo z intervalu 1..20, dĺžka každého
riadku bude náhodné číslo z intervalu 1..50, v riadkoch budú
n á h o d n é a b e c e d n é z n a k y.
Algoritmizácia a programovanie – učebné texty
72
8 . B e z p o u ž i t i a p o č í t a č a u r č t e v ýs t u p p r o g r a m u :
var S,R:string;
begin
S:='REKLAMA';
R:=copy(S,3,5);
S:=S+R;
insert(' ',S,8);
S[13]:='E';
S[14]:='!';
writeln(S)
end.
9. V premennej S:string je uložený reťazec. Zapíšte príkaz y,
k t o r ým i :
- zmažete posledné 3 znaky
- prvý znak presuniete na koniec
– do stredu vložíte znak '-'
1 .3 9 .
P r o c e d ú r y s p a r am et r am i
P r í k l a d č . 1 : D a n ý j e p o č e t p r v k o v N a N - p r v k o v á p o s t u p n o s ť c e l ýc h
č í s e l A [ 1 . . N ] . V yt v o r t e n o v é p o l e B , u l o ž t e d o ň h o v š e t k y h o d n o t y z
p o ľ a A t a k , a b y s a k a ž d á v ys k yt o v a l a l e n r a z a i c h p o č e t u l o ž t e d o
p r e m e n n e j P . O b e p o l i a v yp í š t e .
Napr.: ak N=7 a A=(2,1,5,1,5,5,4), potom P=4 a B=(2,1,5,4).
R i e š e n i e : Ú l o h u s i r o z d e l í m e n a p o d ú l o h y, k t o r é b u d ú r i e š i ť t i e t o
p o d p r o g r a m y: C I T A J _ A ( n a č í t a N a p o l e A ) , V Y R O B _ B ( n a p l n í p o l e
B a p r e m e n n ú P ) , V Y P I S _ A ( v yp í š e N - p r v k o v é p o l e A ) a V Y P I S _ A
( v yp í š e P - p r v k o v é p o l e B ) . H l a v n ý p r o g r a m p o t o m b u d e v yz e r a ť
takto:
Algoritmizácia a programovanie – učebné texty
73
begin
CITAJ_A;
VYROB_B;
VYPIS_A;
VYPIS_B
end.
P o s l e d n é d v e p r o c e d ú r y b u d ú v yz e r a ť t a k t o :
procedure VYPIS_A;
procedure VYPIS_B;
var I:integer;
var I:integer;
begin for I:=1 to N
begin for I:=1 to P
do write(A[I]:5);
do write(B[I]:5);
writeln
writeln
end
end
Keď obe procedúry porovnáme, zistíme, že sa líšia len názvami
p r e m e n n ýc h . O b e v yj a d r u j ú t e n i s t ý p o s t u p s p r a c o v a n i a , a l e k a ž d á
pracuje
s
i n ým i
hodnotami.
V
tomto
prípade
je
v ýh o d n e j š i e
z a d e k l a r o v a ť m i e s t o t ýc h t o d v o c h p r o c e d ú r j e d n u " u n i v e r z á l n u " ,
k t o r á b u d e p r a c o v a ť s " n e z n á m ym " p o ľ o m X a n e z n á m o u p r e m e n n o u
Y v yj a d r u j ú c o u p o č e t p r v k o v . Z a " n e z n á m e " X , Y d o s a d í m e p r i v o l a n í
procedúry premenné A,N a potom B,P.
Deklarácia bude vyzerať takto:
procedure VYPIS(X:POLE;Y:integer);
var I:integer;
begin for I:=1 to Y
do write(X[I]:5);
writeln
end
Volania procedúry v hlavnom programe budú vyzerať takto:
begin
CITAJ_A;
VYROB_B;
VYPIS(A,N);
VYPIS(B,P)
end.
Úloha pre vás: Vypracujte ostatné deklarácie.
Algoritmizácia a programovanie – učebné texty
74
1 . 3 9 . 1 . P a r a me t e r
j e p r e m e n n á c e z k t o r ú s a o d o v z d á v a j ú v s t u p n é a v ýs t u p n é h o d n o t y
podprogramu.
Parametre rozdeľujeme na:

formálne - uvedené sú v hlavičke deklarovaného podprogramu.
Používajú
sa
ako
lokálne
premenné
vznikajú
-
pri
volaní
podprogramu, zanikajú po jeho skončení, mimo podprogramu sú
nepoužiteľné.
Slúžia
na
uloženie
hodnôt,
s
k t o r ým i
bude
podprogram pracovať.

skutočné - uvedené sú pri volaní podprogramu, sú to skutočné
h o d n o t y, s k t o r ým i b u d e p o d p r o g r a m p r a c o v a ť .
Deklarácia podprogramu s parametrami:
procedure <meno> (<zoznam parametrov a ich typov
oddelených bodkočiarkami>);
<lokálne deklarácie>;
begin
<príkazy>
end
Volanie podprogramu s parametrami:
<meno>(<zoznam parametrov oddelených čiarkami>)
POZOR!

t yp
parametra
identifikátor.
v
hlavičke
Napr.
XYZ(A:array[1..10]of
procedure
podprogramu
n esmieme
char),
XYZ(A:POLE),
kde
ale
type
musí
byť
zapísať
musíme
jeden
procedure
to
zapísať:
POLE=array[1..10]of
char

skutočné a formálne parametre sa musia zhodovať v počte,
p o r a d í a t yp e .
Príklad
č.2:
Zadeklarujte
procedúru
s
parametram i
P I S _ Z N A K Y ( C : c h a r ; P : i n t e g e r ) , k t o r á v yp í š e z a s e b o u d o r i a d k u P
Algoritmizácia a programovanie – učebné texty
75
z n a k o v C a k u r z o r n e c h á z a p o s l e d n ý m v yp í s a n ým z n a k o m . V yt v o r t e
n a j s k ô r s k ú š o b n ý h l a v n ý p r o g r a m , k t o r ým o d s k ú š a t e j e j f u n k č n o s ť s
volaniami napr. PIS_ZNAKY('@',5); PIS_ZNAKY('.',10).
Potom v ytvorte nov ý hlavný program, ktorý načíta prirodzené číslo N
a s pomocou tejto procedúry vypíše na obrazovku tieto útvary s
r o z m e r o m N ( n e p o u ž í v a j t e g o t o x y! ) :
****!
****
***!!
*******
****
**!!!
*****
****
*!!!!
***
****
*
Parametre rozdeľujeme na:

vstupné (volané hodnotou) - do podprogramu sa odovzdáva len
hodnota
premennej,
s
ktorou
sa
pracuje.
Po
skončení
podprogramu hodnota premennej zostáva nezmenená.

vstupno-výstupné
(volané
adresou,
referenciou)
-
do
podprogramu sa odovzdáva celá premenná, podprogram s ňou
pracuje a môže ju zmeniť. V hlavičke podprogramu sú odlíšené
slovkom var. Napríklad:

var X,Y:integer;

procedure SKUSKA(A:integer; var B:integer);

begin

B:=B+A


A:=A+2;
end;
BEGIN
X:=5; Y:=8;

SKUSKA(X,Y);

writeln(X,' ',Y)

END.
Pri volaní podprogramu sa hodnota skutočného parametra X vloží do
formálneho parametra A. Keďže je to len vstupný parameter, po
skončení podprogramu sa jeho nová hodnota neposiela naspäť. Ale,
parameter B dostane na začiatku vstupnú hodnotu Y a na konci pošle
naspäť
premennej
program
vypíše?
Y
novú
Čo
( v ýs t u p n ú )
vypíše
tento
hodnotu.
Čo
program,
nám
ak
tento
volanie
Algoritmizácia a programovanie – učebné texty
SKUSKA(X,Y)
SKUSKA(X+3,Y)
nahradíme
c)
volaním
SKUSKA(X,3)
76
a)
SKUSKA(3,Y)
d)
b)
SKUSKA(X,Y+3)?
Využitie parametrov:

a k s a v p r o g r a m e o p a k u j e t á i s t á p o s t u p n o s ť p r í k a z o v s r ô z n ym i
p r e m e n n ým i

ak pri deklarácii podprogramu ešte neviem názov premennej s
ktorou bude program pracovať
Príklady:
1. Program načíta prirodzené čísla M,N, potom M známok žiaka A
a N z n á m o k ž i a k a B . V yp í š e , k t o r ý z n i c h m á l e p š í p r i e m e r .
2. Zadeklarujte procedúru NSD(A,B:integer; var C:integer), ktorá
pre dané čísla A,B nájde ich najväčšieho spoločného deliteľa C
pomocou Euklidovho algoritmu.
3. Do
predchádzajúceho
programu
zadeklarujte
procedúru
NSN(A,B:integer; var C:integer), ktorá pre dané čísla A,B
n á j d e i c h n a j m e n š í s p o l o č n ý n á s o b o k C , t a k , ž e i c h s ú č i n v yd e l í
i c h n a j v ä č š í m s p o l o č n ým d e l i t e ľ o m .
4. Program načíta zlomok - 2 celé čísla predstavujúce čitateľa a
m e n o v a t e ľ a . Z l o m o k u p r a v í n a z á k l a d n ý t v a r a v ýs l e d o k v yp í š e .
V yu ž i t e v yš š i e u v e d e n é p r o c e d ú r y.
Algoritmizácia a programovanie – učebné texty
1 .4 0 .
77
Funkcia
F u n k c i a j e p o d p r o g r a m , k t o r ý v r á t i j e d n u v ýs t u p n ú h o d n o t u c e z s v o j e
m e n o . M ô ž e b yť s p a r a m e t r a m i a j b e z p a r a m e t r o v .
Deklarácia:
function <meno> (<parametre>):<typ výstupnej hodnoty>;
<lokálne deklarácie>;
begin
<príkazy>
end
Parametre
funkcie
sa
deklarujú
aj
používajú
rovnako
ako
pri
p r o c e d ú r e . T yp v ý s t u p n e j h o d n o t y m ô ž e b yť j e d n o d u c h ý ( č í s e l n ý,
z n a k o v ý, l o g i c k ý, v ym e n o v a n ý, i n t e r v a l ) a l e b o s t r i n g . N e s m i e t o b yť
š t r u k t ú r o v a n ý t yp . V p r í k a z o v e j č a s t i s a d o m e n a f u n k c i e p r i r a d í
v ýs t u p n á h o d n o t a .
Príklad:
function VACSI(A,B:integer):integer;
begin
if A>B
then VACSI:=A
else VACSI:=B
end
Volanie funkcie:
<meno>(<parametre>)
Meno funkcie je nositeľom hodnoty, preto funkciu používame ako
h o d n o t u p r í s l u š n é h o t yp u ( m ô ž e m e j u n i e k a m
p r i r a d i ť , v yp í s a ť ,
p o u ž i ť v o v ýr a z e ) n a p r . :
X:=VACSI(3,5); Y:=VACSI(X-4,4); Z:=VACSI(Y,VACSI(X,2));
writeln(Z)
Príklady.
1.
Z a d e k l a r u j t e p r o c e d ú r u s v h o d n ým i p a r a m e t r a m i n a v ýp o č e t N f a k t o r i á l u N ! = 1 . 2 . 3 . . . . N . V yt v o r t e h l a v n ý p r o g r a m , k t o r ý s
p o m o c o u p o d p r o g r a m u v yp o č í t a p r e d a n é p r i r o d z e n é č í s l a N , K
Algoritmizácia a programovanie – učebné texty
78
v ýr a z : N ! / K ! / ( N - K ) ! V yr i e š t e t e n t o i s t ý p r í k l a d s p o u ž i t í m
f u n k c i e a o b a p r o g r a m y p o r o v n a j t e . Č o v yp í š e p o s l e d n ý p r í k a z ?
2 . Z a d e k l a r u j t e f u n k c i u s v h o d n ým i p a r a m e t r a m i , k t o r á z i s t í , č i s a
dané dva reťazce rýmujú (zhodujú dvojznakovou koncovkou).
3. Zadeklarujte funkciu, ktorá premení teplotu danú v °C na
jednotky
Fahrenheita
podľa
vzťahu
F=9/5*C+32.
V yt v o r t e
h l a v n ý p r o g r a m , k t o r ý n a č í t a p r i r o d z e n é č í s l o D a v yp í š e 2 0 riadkovú tabuľku, v ktorej prvom stĺpci sú teploty v °C počnúc
od nuly s krokom D a v druhom stĺpci príslušné teploty v
stupňoch Fahrenheita. (Ak bude D=5, v prvom stĺpci budú čísla
0,5,10,15,...)
4 . Z a d e k l a r u j t e f u n k c i u , k t o r á v d a n ýc h d v o c h r e ť a z c o c h n á j d e i c h
najdlhší
spoločný
začiatočný
podreťazec,
napr.
SP_ZAC('pero','perina')='per'
5. Daný
je
reťazec
DATUM
predstavujúci
dátum
v
tvare
' d e ň . m e s i a c . r o k ' . D e ň i m e s i a c m ô ž u b yť j e d n o - i d v o j c i f e r n é .
V yt v o r t e f u n k c i e : * D E N ( D A T U M : s t r i n g ) : i n t e g e r . . . z d a n é h o
dátumu vráti číslo dňa * MESIAC(DATUM:string):integer ... z
daného
dátumu
vráti
číslo
mesiaca*
ROK(DATUM:string):integer ... z daného dátumu vráti číslo
roka
1 .4 1 .
Triedenie
A k p o t r e b u j e m e č a s t o v yh ľ a d á v a ť p r v k y v s k u p i n e d á t p o d ľ a n e j a k e j
vlastnosti,
je
dobré
mať
skupinu
dát
usporiadanú
podľa
danej
vlastnosti. Napr. ak čitateľ v knižnici chce nájsť knižku od nejakého
spisovateľa,
v yu ž i j e
na
v yh ľ a d a n i e
menný
katalóg,
kde
sú
usporiadané záznamy o knihách podľa mien autorov. Ak c hce nájsť
knižku
podľa
usporiadané
názvu,
podľa
v yu ž i j e
názvov
názvový katalóg,
kníh.
V yh ľ a d á v a n i e
kde
v
sú
záznamy
usporiadanej
p o s t u p n o s t i j e n e p o r o v n a t e ľ n e r ýc h l e j š i e a k o v n e u s p o r i a d a n e j .
Algoritmizácia a programovanie – učebné texty
79
P o s t u p n o s ť a 1 , a 2 , a 3 , . . . , a n m ô ž e b yť u s p o r i a d a n á :

vzostupne (od najmenšieho po najväčší prvok): a 1 <= a2 <= a3
<= ... <= an

zostupne (od najväčšieho po najmenší prvok): a 1 >= a2 >= a3 >=
... >= an
Napr. postupnosť čísel 2,8,5,2,9,1,8 môžem usporiadať vzostupne:
1,2,2,5,8,8,9
alebo
zostupne:
9,8,8,5,2,2,1.
Usporiadaním
postupnosti počet prvkov zostáva nezmenený, takisto hodnoty
prvkov sa nemenia, len majú iné poradie.
Ú l o h a : V yt v o r t e p r o g r a m , k t o r ý d a n ú p o s t u p n o s ť č í s e l u s p o r i a d a
vzostupne.
j e d n o t l i v ýc h
Postupnosť
prvkov.
je
daná
počtom
Sformulu jeme
najskôr
prvkov
vstupnú
a
hodnotami
a
v ýs t u p n ú
podmienku, t.zn. presne určíme, čo je dané a čo chceme dostať:
{ V S T : D a n é j e p r i r o d z e n é č í s l o N a N - p r v k o v á p o s t u p n o s ť c e l ýc h
čísel a1, a2, a3, ..., an}
{ V Ý S : U s p o r i a d a n á p o s t u p n o s ť t ýc h i s t ýc h č í s e l , k d e p l a t í : a 1 < = a 2
<= a3 <= ... <= an}
Keďže hodnoty prvkov postupnosti sa nesmú zmeniť, jediné operácie,
ktoré s nimi budeme môcť robiť sú porovnanie (menší, väčší) a
v z á j o m n é v ým e n y. Z o p a k u j m e s i a l g o r i t m u s v ým e n y o b s a h u d v o c h
p r e m e n n ýc h X a Y . P o u ž i j e m e t r e t i u p o m o c n ú p r e m e n n ú Z , r o v n a k é h o
t yp u a k o p r e m e n n é X , Y . V ým e n u u s k u t o č n í m e t r o m i p r i r a d e n i a m i :
Z:=X; X:=Y; Y:=Z
E x i s t u j ú v i a c e r é t y p y a l g o r i t m o v n a v yr i e š e n i e t e j t o ú l o h y, m y s a
zoznámime s dvoma najjednoduchšími.
1 . 4 1 . 1 . T r i e d e n i e c e z m a x i mu m - M A X S OR T
Postup: Nájdem najväčší prvok v postupnosti A[1..N]. Ten patrí na
p o s l e d n é m i e s t o , p r e t o h o v ym e n í m s p o s l e d n ým p r v k o m . T e n t o p r v o k
j e u ž t a m , k d e m á b yť , p r e t o s i h o u ž ď a l e j n e b u d e m v š í m a ť .
Zopakujem tento postup pre "skrátenú" postupnosť A[1..N -1]. Ďalším
Algoritmizácia a programovanie – učebné texty
opakovaním
nakoniec
dostanem
80
usporiadanú
postupnosť.
Hrubá
schéma algoritmu:
for I:=N downto .....
do begin <nájdi maximum v úseku postupnosti A[1..
<vymeň ho s prvkom A[
]>;
]>
end
D o p l ň t e c h ýb a j ú c e č a s t i . P r i t r i e d e n í n á m v š a k n e s t a č í n á j s ť l e n
h o d n o t u m a x i m a , a l e k v ô l i n á s l e d n e j v ým e n e p r v k o v v p o s t u p n o s t i
potrebujeme poznať aj jeho pozíciu - index. Preto pri jeho nájdení
musíme odložiť do nejakej pomocnej premennej aj jeho index.
1.41.2. Triedenie prebublávaním - BUBBLESORT
Keďže chceme postupnosť čísel vzostupne us poriadať, budeme sa
snažiť
dostať
menšie
prvky
vľavo
a
väčšie
vpravo.
Princíp
p r e b u b l á v a n i a s p o č í v a v p o r o v n á v a n í d v o j í c s u s e d n ýc h p r v k o v a i c h
n á s l e d n e j v ým e n e :
if A[I] > A[I+1]
then <vymeň prvky A[I], A[I+1]>
S a m o z r e j m e , t a k ýc h t o p o r o v n a n í a p r í p a d n ýc h v ým e n m u s í m e u r o b i ť
v i a c . J e d n o z n a č n e m u s í m e p o r o v n a ť v š e t k y d v o j i c e s u s e d n ýc h p r v k o v
- n a j l e p š i e s ys t e m a t i c k y z ľ a v a d o p r a v a :
for I:=1 to .....
do if A[I] > A[I+1]
then <vymeň prvky A[I], A[I+1]>
Ú l o h a : D o p l ň t e h o r n ú h r a n i c u c yk l u f o r .
Napíš,
ako
bude
v yz e r a ť
postupnosť
2,8,5,2,9,1,8
po
aplikácii
horeuvedeného algoritmu: ............................. Čo treba do algoritmu
d o p l n i ť , a b y t r i e d i l c e l ú N - p r v k o v ú p o s t u p n o s ť ? N a v r h n i v yl e p š e n i a
algoritmu,
aby sa
počítač
pri
triedení
postupnosti
čo
naj menej
"narobil".
Porovnaj obe metódy triedenia.
Príklad:
V yt v o r t e p o n u k o v ý p r o g r a m , k t o r ý n a z a č i a t k u v yg e n e r u j e n á h o d n ú
Algoritmizácia a programovanie – učebné texty
81
postupnosť čísel z intervalu <1,20>. (Pred generovaním si vždy
v yp ýt a
počet
prvkov
postupnosti.)
Potom
opakovane
realizuje
nasledovnú ponuku:
1 . V ýp i s a k t u á l n e j p o s t u p n o s t i
2. Vygenerovanie novej postupnosti
3. Vzostupné utriedenie postupnosti MAXSORTom
4. Vzostupné utriedenie postupnosti BUBBLESORTom
5. Vzostupné utriedenie postupnosti MINSORTom
6 . Z o s t u p n é u t r i e d e n i e p o s t u p n o s t i ľ u b o v o ľ n ým s p ô s o b o m
7. Koniec
MINSORT je triedenie cez minimum, ktoré je v princípe rovnaké, ako
t r i e d e n i e c e z m a x i m u m . O p a k o v a n e v yh ľ a d á v a m e n a j m e n š í p r v o k v
ú s e k u a v ym i e ň a m e h o s o z a č i a t o č n ým p r v k o m . P o č a s b e h u p r o g r a m u
nezotierajte
obrazovku,
aby
bolo
možné
porovnať
pôv odnú
p o s t u p n o s ť s u s p o r i a d a n o u . S k ú s t e v ym ys l i e ť v l a s t n ý a l g o r i t m u s
triedenia.
Algoritmizácia a programovanie – učebné texty
82
Literatúra
1.
Andrejková, G. – Kucka, M.: Zbierka úloh z programovania, Prírodovedecká fakulta
UPJŠ, Košice 1991
2.
Blaho, A. – Kalaš, I.: Comenius Logo: tvorivá informatika, Bratislava CL Group 1998
3.
Drlík, P. – Hvorecký, J.: Informatika – náčrt didaktiky, PF v Nitre 1992
4.
Dvořák, S.: Dekompozice a rekursívne programy, Grada, Praha 1992
5.
Dvořák, S.: Turbo Pascal 6 v príkladech, Grada, Praha 1991
6.
Fabián, P. a kol.: Počítače a programovanie, VŠDS v Žiline 1990
7.
Fikár, I a kol.: Programátorský Babylon, Grada, Praha 1992
8.
Grošek, O. – Porubský, Š.: Šifrovanie – algoritmy, metódy, prax, Grada, Praha 1992
9.
Gvozdjak, L a kol.: Počítače a programovanie, Alfa, Bratislava 1985
10. Hruška, T. : Pascal pro začátečniky, SNTL, Praha 1989
11. Hvorecký,J. – Kelemen,L.: Algoritmizácia, Alfa, Bratislava 1983
12. Hvorecký, J – Gabčo, P.: Informatika a výpočtová technika pre I. ročník gymnázia,
SPN, Bratislava 1988
13. Jinoch, J. a kol.: Programovaní v jazyku Pascal, SNTL, Praha 1985
14. Kryl, R. – Drózd, J.: Začínáme s programovaním, Grada,Praha 1992
15. Kukal, J: Myšlením k algoritmům, Grada, Praha 1992
16. Kulacs, D. – Petlák, E.: Didaktika. PF v Nitre 1985
17. Mikula, P. a kol.: Turbo Pascal 7.0 – kompletní pruvodce, Grada, Praha 1993
18. Wirth,N: Algoritmy a štruktúry údajov, Alfa, Bratislava 1987
Download

Kniha Algoritmizacia pre maturantov