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á>:=
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á> := 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 ( ) < 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 ( ) 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é> : 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 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 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á> := to 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; 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 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
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 of :<príkaz>; :<príkaz>; ... :<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: # (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 ; <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:; 2:; ... 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 [] of 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á>[] 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 =
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
typu>=(
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 =<dolná 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 ; <počkaj>; ; 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
Č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 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 : ; while
si
na
konci
postupnosti>and
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 ; if < <stredný prvok> then else if > <stredný prvok> then until
(
prvok>=<stredný
prvok>)
or
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 í . ; ; ; ; 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í.'); ; 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>,
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>,
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() - funkcia, ktorá vráti náhodné celé číslo z intervalu <0,-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 uložiť ho do premennej C:integer, použijeme príkaz C:=......................................... (doplňte). Ak chceme vygenerovať náhodné reálne číslo z intervalu
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 = 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() - funkcia, ktorá vráti celé číslo predstavujúce dĺžku reťazca pos(<podreť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(,<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>,,<pozícia>)
Algoritmizácia a programovanie – učebné texty
70
- vloží do reťazca daný podreťazec na danú pozíciu delete(,<pozícia>,<počet znakov>) - v danom reťazci zmaže od danej poz ície daný počet znakov str(<číslo>,) - procedúra zmení číslo na reťazec val(,<číslo>,) - 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> (); ; begin <príkazy> end
Volanie podprogramu s parametrami: <meno>()
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>):; ; 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
]>;
]>
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
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
Ú 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