A.vidziunas Programavimo Teorija

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 73

Kauno technologijos universitetas Jaunj kompiuterinink mokykla

PRADIN PAINTIS SU TURBO PASKALIU

Jonas Blonskis, Antanas Vidinas, Jolanda Ziberkien.

Kaunas 1996.

Anotacija
Metodin priemon sudaro vadins teorins ir praktins inios apie programavimo kalb ir programavimo technik. Kalbos elementai, algoritmavimo ir programavimo klausimai apraomi nuosekliai po truput vedant sudtingesnius elementus. Mediaga suskirstyta 12 tem. Tai nebtinai vieno usimimo mediaga. Kiekvienas pagal savo sugebjimus ir galimybes skyrelio mediag gali sisavinti per jam tinkam laikotarp. Kiekvienos temos tikslas yra paaikinti tam tikr kalbos element grup, nauj algoritm. Temos apima bazinius duomen tipus. Supaindinama su viena paprasiausi struktrini duomen forma masyvais. Duomen ir skaiiavimo rezultat isaugojimiu naudojami tekstiniai failai. Analizuojamos Turbo Paskalio kalbos priemons, skirtos ekrano valdymui (biblioteka Crt), klaviatros apklausai, garsams. Susipaindinama su pagrindinmis Turbo Paskalio aplinkos paprogrammis, program sudarymo pagrindiniu elementu procedra. Teoriniai elementai iliustruojami programomis, kuriose siloma besimokaniajam nedideliais pakeitimais bei papildymais patobulinti program ir padaryti j patrauklesn. Kiekvienos temos pabaigoje pateikiama: analizuojamos mediagos santrauka, klausimai, kontrolins uduotys. Smalsesniam ir darbtesniam mokiniui yra pasiloma savarankiko darbo uduotis. Atskirai pateikiama algoritm iraikos priemoni santrauka bei samprata apie programavimo kultr.

TURINYS 1 tema. Turbo Paskalio kalba ir aplinka. 2 tema. Slygos sakiniai ir ciklai 3 tema. Sumos kaupimo udaviniai. Skaii srautai. 4 tema. Didiausios ir maiausios reikms paieka skaii sraute. 5 tema. Skaii sraut analizs udaviniai. 6 tema. Tekstiniai failai. 7 tema. Atsitiktini situacij modeliavimas. 8 tema. Ekrano valdymo pradmenys. 9 tema. Ciklas for. Simbolinis duomen tipas 10 tema. Garsai. Ciklas repeat...until. Uduotys savarankikam darbui. Struktrogram elementai ( Nassi-Schneiderman diagrams ) Programavimo kultra. 4 11 16 29 23 26 31 37 42 48 54 56 60

1 tema. Turbo Paskalio kalba ir aplinka


1.1. Programos struktra
Programos tekstas Turbo Paskalio kalba: program < Programos pavadinimas >; < Apraai > begin < Pagrindin dalis > end. Simboliai < > aprayme nurodo paaikinimus ne Paskalio kalba. Programoje galima rayti veiksmus aikinant tekst. Jis skiriamas mogui ir vadinamas komentarais. Programos darbui komentarai neturi takos ir yra ignoruojami. Jie raomi tarp speciali simboli: { <Komentarai> } (* <Komentarai> *)

1.2. Programos tekstas


Programos kompiuteriui nurodo, kaip reikia sprsti j apraom udavin. Jos yra raomos programavimo kalbos sakiniais. Surinkite Turbo Paskalio aplinkos redaktoriaus lange program Pirmoji. Rinkdami programos tekst komentarus galite praleisti. Pradia Pirmoji x, y reals skaiiai vesti x reikm y := x2 Ivesti y reikm Pabaiga

program Pirmoji; { Antrat var x, y : real; { Kintamj apraai begin { Pagrindins dalies pradia } { Duomen ivedimo ekran sakinys } WriteLn('Jus sveikina Turbo Paskalio aplinka'); WriteLn('vesk skaii:');{ Uklausa vedimui } ReadLn (x); { vedimas } y:= x*x; { Skaiiavim apraymas } WriteLn('Kvadratas: ', y:10:2); { Rezultat ivedimas ReadLn; { Laukti kl. Enter paspaudimo end. { Pabaigos sakinys

} }

} } }

1.3. Programos darbo patikrinimas 4

Norint ibandyti redaktoriaus lange esanios programos darb, reikia kartu paspausti klavi por Ctrl ir F9 (sutrumpintai tai yra ymima urau Ctrl+F9). iais klaviais parenkama aplinkos komanda Run, kuri nurodo, kad redaktoriaus lange esani program reikia transliuoti ir vykdyti. vykdiusi program, Turbo Paskalio aplinka i karto grina valdym savo redaktoriui, kuriam skirtas ekrano langas udengia programos darbo rezultatus. Todl program gale danai yra raomas sakinys ReadLn, kuris stabdo programos darb ir laukia, kol bus paspaustas klavias Enter. rezultat lang taip pat galima pereiti naudojant ekrano lang perjungimo komand - Alt+F5. Atgal redaktoriaus lang sugrtama paspaudus bet kur klavi.

1.4. Pagrindins program sudarymo taisykls


Programos raomos Turbo Paskalio kalbos sakiniais. Reikalavimai program tekstui: kiekviena programa pradedama antrats sakiniu, kurio sintaks (raymo taisykls): program <Programos vardas>; visi veiksmai apraomi pagrindinje programos dalyje, kurios ribos nurodomos baziniais kalbos odiais begin ir end (operatoriniais skliaustais); bet kurioje programos vietoje, kur gali bti tarpai, galima terpti jokios takos programos darbui neturinius komentarus; komentar ribos ymimos simboli grupmis (* *) arba skliaustais { }; visi sakiniai, iskyrus komentarus, vienas nuo kito atskiriami kabliatakiais.

1.5. Skaiiavim apraymas


Skaiiavimai apraomi priskyrimo sakiniais, kuri struktra: <Kintamasis>:=<Aritmetin iraika>; Aritmetinse iraikose yra nurodoma, kokius veiksmus, kokia tvarka ir su kokiais argumentais reikia atlikti. J argumentai gali bti kintamieji, konstantos ir funkcijos. Kintamieji nurodomi vardais, kurie sudaromi tik i lotynik raidi ir skaitmen, bet btinai turi prasidti raide (raidms taip pat priklauso pabraukimo simbolis "_"). Vard pavyzdiai: x, y, s1, prad_suma, PradSuma. Visi programoje vartojami kintamieji privalo bti aprayti baziniu odiu var paymtoje apra dalyje. Kintamj apra sintaks: <Vard sraas>: <Tipas>. 5

Kintamj tipai nurodomi programavimo kalbos baziniais odiais. Pavyzdiui, skaitmeniniams duomenims, kurie gali turti trupmenin dal, yra skirtas tipas real. Trupmenin dalis nuo sveikosios programavimo kalbose atskiriama deimtainiu taku. Vard srao elementai atskiriami kableliais. Pagrindini operacij simboliai: + (sudtis), (atimtis), * (daugyba ), * + /, . / (dalyba). Jie suskirstyti dvi prioritet (pirmumo) grupes: pirma grup antra grup

Aritmetins operacijos vykdomos pirmumo tvarka, o vienodo pirmumo veiksmai - i kairs. Veiksm tvark galima pakeisti skliaustais. Priskyrimo sakinio pavyzdys: y:= x*(5/2) - 7.14*(x/2); Iraik argumentais gali bti tik tokie kintamieji, kuri reikms jau yra inomos, apibrtos anksiau. Kintamj reikms apibriamos priskyrimo arba vedimo sakiniais. Skyrelio 1.2 programoje tai padaryta vedimo sakiniu ReadLn.

1.6. Programos ryys su iore


Kiekviena programa turi palaikyti ry su iore, iorine aplinka: gauti i ten duomenis ir pateikti rezultatus. Personaliniuose kompiuteriuose labai populiari dialoginio ryio su iore forma, kai programa rao ekrane praneim apie savo pageidavimus, stabdo savo darb ir laukia, kol vartotojas klaviatroje surinks atsakym. Ekrane raomi programos pageidavimai yra vadinami uklausomis. Jos formuojamos raymo sakiniais: WriteLn ('<Uklausos tekstas>'); Sakiniu WriteLn ekran siuniamus tekstus btina rayti tarp pavieni kabui (apostrof). Taip sudaryta struktra vadinama tekstiniais duomenimis, simboli eilutmis arba tiesiog eilutmis. Jose gali bti visi kompiuterio alfabeto simboliai. Sutarta, kad apostrofo simbolis tekste raomas dvigubas. Kintamj, pai program ir kit programos objekt vardus galima rayti tik lotynikomis raidmis. U uklausos sakinio programoje turi bti raomas skaitymo i klaviatros sakinys, kuris stabdo kompiuterio darb ir laukia surinkt duomen. Skaitymo sakinio sintaks: ReadLn(<Kintamj sraas>); Sraas nurodo, kiek reikmi klaviatroje reikia surinkti ir kokiems kintamiesiems jas suteikti. Reikmes galima surinkti vienoje ekrano eilutje, atskiriant tarpais, arba galima jas rayti atskirose eilutse. Labai svarbi yra reikmi surinkimo tvarka. Klaviatroje surinktos eiluts pabaiga yra ymima klaviu Enter. Uklausos pavyzdys:

WriteLn('vesk x:'); ReadLn(x);

{ Programa lauks x reikms }

1.7. Rezultat pateikimas


Programos darbo rezultatai siuniami ekran raymo sakiniu WriteLn, kurio atskiras atvejis buvo apraytas anksiau. Bendru atveju, jo sintaks yra tokia: WriteLn(< ekran siuniam duomen sraas>); Srao elementais gali bti kintamieji, iraikos ir vairi tip konstantos. Sakinys nuosekliai rao ekrane vis savo argument srao element reikmes. Pavyzdiui, sakiniai y:= 2; WriteLn('y= ', y:10:2); urays ekrane y= 2.00, nes sakinio WriteLn argument srae yra du elementai: eiluts tipo konstanta 'y= ' ir kintamasis y. Eiluts tipo konstant ir kintamj vard komponavimas raymo srauose yra labai patogi ir vaizdi programos darbo rezultat apraymo priemon. Nurodant ivedimo srauose real tipo reikmes, rekomenduojama jas rayti kartu su ivedimo ablonais, kurie aprao reikmms skiriamus ekrano laukus: <Duomen elementas>: <Lauko ilgis>: <Trupmenin dalis> ablonas aprao, kokio dydio ekrano laukas yra skiriamas visam skaiiui (Lauko ilgis) ir trupmenins dalies vaizdavimo tikslum (Trupmenin dalis). Pavyzdiui, sakinys WriteLn (x:10:2); nurodo, kad x reikmei ekrane skiriamas 10 simboli laukas, kuriame turi bti raoma dviej enkl po kablelio tikslumu.

1.8. Programos modifikavimas


Sudaryt program visuomet galima modifikuoti, pritaikyti gimining udavini sprendimui. Pavyzdiui, 1.2 skyrelyje pateikt program galima lengvai pritaikyti skaiiavimams pagal vairias formules. Tam tereikia pakeisti kintamojo y skaiiavimui skirt iraik ir praneimo apie rezultatus paaikinimus. Pakeiskite 1.1 skyrelio program taip, kad ji galt skaiiuoti vesto skaiiaus kub ir vairi 1.1 lentelje pateikt funkcij (pavyzdiui, Sin(x), Sqrt(x)) reikmes. x - klaviatra vedama reikm. Kreipiniai funkcijas gali bti iraik argumentais. Paios iraikos taip pat gali bti funkcij argumentais. Pertvarkykite 1.1 skyrelio program, kad ji skaiiuot pagal formul y:= Sqrt(1+x*x*x). 7

1.1 lentel. Pagrindins aritmetins funkcijos Tradicin forma Paskalyje Pastaba arctg x Arctan(x) Rezultatas radianais cos x Cos(x) Argumentas radianais sin x Sin(x) Argumentas radianais ex Exp(x) Sqrt(x) x ln x Ln(x) Frac(x) Trupmenin argumento dalis Int(x) Sveikoji argumento dalis |x| Abs(x)

1.9. Programos su keliais argumentais


Jei programos darbui yra reikalinga grup argument, galima rayti uklausas kiekvienam argumentui atskirai arba vien bendr uklaus visiems argumentams. Pavyzdiui, tarkime, kad reikia sudaryti program trij skaii x, y, z aritmetinio vidurkio av ir t skaii sandaugos tredalio gv skaiiavimui. Uklausa argumentams gali bti uraoma taip: WriteLn(' veskite tris skaiius:'); av:= (x + y + z) / 3; ReadLn(x, y, z); Skaiiavimo sakiniai uraomi atitinkamai: gv:= (x * y * z) / 3; Sudarykite av ir gv skaiiavimo program su bendra vis argument uklausa ir jos modifikacij su atskiromis uklausomis kiekvienam argumentui.

1.10. Uduotis savarankikam darbui


Sudaryti staiakampio gretasienio trio skaiiavimo program. Argumentai - kratini ilgiai. Programoje turi bti uklausa argumentams, skaiiavimus ir rezultat pateikim apraantys sakiniai, isams komentarai.

1.11. K turjau imokti?


Programos tekst Turbo Paskalio kalboje sudaro trys dalys: programos antrat, apraai ir pagrindin dalis. Komentaras raomas, bet kurioje programos vietoje, kur galima rayti tarpo simbol, specialiuose simboliuose { } arba (* *) ir neturi takos programos vykdymui.

Surinkus programos tekst, programos darb galima patikrinti, nuspaudus klavi kombinacij Ctrl+F9, arba komand RUN ir nuspaudus Enter klavi. Norint patekti TP rezultat lang, spaudiame klavi kombinacij Alt+F5. Programos antrats struktra: program <Programos vardas>; Programos vardas gali bti sudarytas tik i lotynik raidi ir skaitmen. Simbolis _ (pabraukimo) priskiriamas prie raidi. Pirmas simbolis btinai turi bti raid. Pagrindin dalis prasideda odiu begin, o baigiasi end., kur begin ir end vadinami operatoriniais skliaustais. Visi sakiniai vienas nuo kito skiriami kabliatakiais. Skaiiavimai programoje uraomi priskyrimo sakiniais, kuri bendra struktra yra: <Kintamasis> := <Aritmetin iraika>; . Kintamieji yra ymimi vardais, kurie sudaromi taip pat kaip programos vardai. Aritmetinse iraikose gali bti kintamieji, konstantos, funkcijos, sujungtos aritmetini operacij enklais bei skliaustais. Visi programos pagrindinje dalyje naudojami kintamieji, turi bti aprayti apra dalyje var tokio tipo sakiniais: <Vard sraas> : <Tipas>; Kintamj tipai nurodomi Paskalio kalbos baziniais odiais. Pvz.: reals kintamieji - apraomi odiu real. (Reals kintamieji tai tokie, kuri reikms gali gyti trupmenines reikmes. Sveikoji dalis nuo trupmenins skiriama deimtainiu taku.) Skaitymo sakinio sintaks: ReadLn(<Kintamj sraas>). Kintamj srao elementus vien nuo kito Paskalio kalboje atskiriame kableliais. Raymo sakinys naudojamas rezultatams sisti ekran. Jo struktra: WriteLn(<Siuniam duomen sraas>). Srao elementais gali bti kintamieji, tekstas, iraikos, konstantos. Raymo sakinyje gali bti naudojami ivedimo ablonai, kurie aprao reikmms skiriam ekrano lauk dydius. ablonai raomi prie duomen elemento taip: <Duomen elementas>:<Bendras lauko ilgis>; Atskiru atveju, kai ekran siuniami reals skaiiai, dar yra nurodomas ir trupmenins dalies ilgis: <Duomen elementas>:<Bendras lauko ilgis>:<Trupmenins dalies lauko dydis>; 9

vedant pradinius duomenis kompiuterio atmint, yra formuojamos uklausos. Joms sudaryti naudojamas raymo ir skaitymo sakinys: WriteLn(<Uklausos tekstas>); ReadLn(<Kintamojo vardas>);. Uklausos tekste gali bti panaudoti, bet kokie klaviatros simboliai. Jeigu programos darbui reikalinga grup argument, tai uklausos gali bti raomos kiekvienam atskirai arba visiems bendrai.

1.12. Kontroliniai klausimai


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. I koki dali susideda programa Turbo Paskalio kalboje? Kas bdinga programos apra daliai? Kaip sudaromi vardai? Kur ir kaip raomi komentarai? Kaip pamatyti skaiiavimo rezultatus, jei programos tekstas udengia rezultat lang? Kaip vykdyti program? K vadiname operatoriniais skliaustais? Kaip uraomi skaiiavimo sakiniai? Kaip apraomi kintamieji? I koki element sudaromos aritmetins iraikos? Kokia yra veiksm tvarka aritmetinje iraikoje? Kaip pakeisti veiksm tvark aritmetinje iraikoje? Kokia yra raymo sakinio bendra struktra? Kas yra duomen ivedimo ablonas? Kokia yra skaitymo sakinio struktra? Kokius inote variantus vesti kompiuterio atmint keli kintamj reikmes? Kam reikalingos programose uklausos?

1.13. Kontrolins uduotys


1. Kurie i emiau pateikt programos antrats sakini yra teisingi? a) b) c) d) e) f) program Suma. Program suma_S1; Program S1; program a program a 1; program bendrdiddalik;

2. Rasti klaidas programos tekste. program antroji { programos pradia};

10

(* testo uduotis} var sk : real begin WriteLn(Jus sveikina kompiuteris!); WriteLn(veskite savo skaii ) ReadLn(sk); WriteLn( Js vedte: , sk:5:0); WriteLn(Ai, kad bendravote.) end. 3. Kuri aritmetini iraik reikms bus vienodos? a) x := 3*a*b-4*a*c; b) x := a*(4*c - 3*b); c) x := 3*(a*b) - 4*(a*c); d) x := 12*(a*b - a*c); e) x := a*(3*b - 4*c);

2 tema. Slygos sakiniai ir ciklai (valdanios struktros)


2.1. Slygos sakinys
Valdanios struktros leidia aprayti pageidaujam veiksm tvark, alternatyv parinkim ir veiksm kartojim. Populiariausia valdanti struktra yra alternatyv parinkim apraantis slygos sakinys, kurio sintaks: if <Slyga> then <V1> [else Slyga <V2>] t V2 n

V1 Paprasiausios slygos yra apraomos santykiais, kuri sintaks: <i1> <Santykio operacija> <i2>

ia i1 ir i2 - aritmetins iraikos, o santykio operacija gali bti ymima tokiais simboliais: = <> lygu nelygu < > maiau daugiau <= >= maiau arba lygu daugiau arba lygu

Jei iraik reikms tenkina santykio operacij, santykiui suteikiama login reikm True (tiesa), o jei ne - False (melas). Jeigu slygos reikm yra true (slyga tenkinama), sakinyje parenkama vykdymui alternatyva V1, jeigu reikm false - V2. Taigi sakinys if aprao, kaip parinkti vykdymui vien i dviej galim alternatyv - V1 arba V2 (alternatyvos apraomos sakiniais). Jeigu sakinyje if aka else praleista, jis aprao vieno sakinio (V1) vykdymo slygas.

11

2.2. Argument kontrol


Danai tenka tikrinti argument priklausymo leistinai reikmi atkarpai slygas. Pavyzdiui, kvadratin aknis gali bti skaiiuojama tik teigiamoms argument reikmms. Todl aknis skaiiuojaniose programose reikt tikrinti, ar argumento reikm yra leistina. Kaip tai yra daroma, parodyta programoje Trauk. program Trauk; var x, y: real; { Argumentas ir rezultatas } begin WriteLn ('veskite argumento reikm');{ vedimo uklausa } ReadLn(x); { vedimas if (x>0) { Argumento kontrol then WriteLn ('aknis: ', Sqrt(x):6:2) else WriteLn ('Neleistinas argumentas'); end.

} }

Jei ioje programoje argumento kontrols nebt, vedus neigiam skaii, programos darbas bt nutraukiamas ir ekrane matytsi praneimas apie jos vykdymo klaid. Savarankikai sudarykite program, kuri i trij vest skaii x, y ir z atrinkt didiausi ir jo reikm suteikt kintamajam max. Tokioje programoje turi bti du sakiniai if. Pirmasis turi atrinkti didesnij reikm i dviej, o antrasis turi lyginti atrinktj reikm su treiuoju skaiiumi: if if x>y z>max then else then max:= x max:= y; max:= z; { Didesnis i dviej { Didiausias i trij } }

2.3. Ciklai while


Programa Trauk yra nelabai gera, nes, vedus blog argument, nutraukiamas jos darbas. Geriau kai, vedus neigiam skaii, argumento uklausa kartojama tol, kol vedamas aknies skaiiavimo argumentui leistina teigiama reikm. Tai galima padaryti su ciklo sakiniu while, kurio sintaks: kol Kartojimo slyga while <Kartojimo slyga> do <Kartojamas sakinys> Kartojamas sakinys

is sakinys nurodo, kad u odelio do raytas sakinys privalo bti kartojamas tol, kol tenkinama kartojimo slyga. Jeigu norime kartoti grup sakini, juos reikia rayti tarp baziniais odiais begin ir end ymim

12

operatorini skliaust (programa Control). Norint, kad ciklas netapt begaliniu, btina, kad kartojimo slyga priklausyt nuo kartojamo sakinio rezultat. Programoje Control ciklas sudarytas tam, kad uklausa argumentui bt kartojama tol, kol vedama neleistina neigiama argumento reikm. Surinkite ir patikrinkite i program: program Control; var x, y: real; begin { Argumentas ir rezultatas } } } }

{ vedimo uklausa WriteLn ('veskite i pradi neigiam, o po to teigiam skaii'); ReadLn(x); { vedimas while (x<0) do begin { Uklausos kartojimas WriteLn (' Kartokite, argumentas neigiamas'); ReadLn(x); end; WriteLn ('aknis: ', Sqrt(x):6:2); end.

2.4 Pratimas
Tarkime, kad reikia skaiiuoti auktyn mesto kno trajektorij pagal iraikas: x = a*t; y = b*t g*t2/2, kur koeficiantai a ir b bei pagreitis g yra vedami uklausos bdu i klaviatros. Trajektorijos tak koordinates siloma skaiiuoti laiko t reikmms 0, 1, 2, 3, ir t.t., kol knas nukris ant ems. Paraykite program duotam algoritmui Trajektorija, suderinkite program ir patikrinkite gaunamus rezultatus. Parinkite ivedamiems razultatams vaizdi form. Pradia. Trajektorija; a, b, g, t, x, y reals skaiiai vesti a, b, g reikmes t := 0; x := a * t; y := b*t g*t2 / 2; kol y > 0 Ivesti x, y, t reikmes t := t+1; x := a * t; Pabaiga y := b*t g*t/2;

13

2.5. Uduotis savarankikam darbui


Sudarykite program kvadratins lygties ax2 + bx + c = 0 skaiiavimui. ia duomenys yra lygties argumentai, o rezultatai yra jos aknys. Prie iekant akn reikia patikrinti, ar jos egzistuoja. Koordinai ploktumoje yra padta daug tak. J koordinats (x, y) yra inomos. Bet kuriuos tris takus jungiant atkarpomis galime gauti trikamp. Reikia nustatyti kuriuos takus sujungus gaunami trikampiai ir kokie tak rinkiniai negali bti panaudoti trikampio sudarymui. Reikia parayti program, kuri nustatyt, ar nurodyti trys takai gali bti trikampio virnmis, ar negali. Tak koordinats vedamos i klaviatros ei skaii grupmis (pirmo tako x, y, po to antro ir treio). vedam skaii srauto pabaiga nurodoma eiais skaiiais, lygiais nuliui. Papildykite program veiksmais, kuriais bt suskaiiuojamas galimo trikampio plotas ir ekrane ivedama informacija apie t trikamp: kratini ilgiai ir plotas.

2.6. K turjau imokti?


Populiariausia valdanti struktra, alternatyv parinkimui, yra slygos sakinys, kurio sintaks: if <slyga> then <V1> [else <V2>]; kur V1 ir V2 yra alternatyvos, apraomos sakiniais. Slygos sintaks yra tokia: <i1> <Santykio operacija> < i2>, kur i1 ir i2 - aritmetins iraikos, o santykio operacija gali bti ymima simboliais: = lygu, <> nelygu, < maiau, > daugiau, <= maiau lygu, >= daugiau lygu.

Jeigu i1 ir i2 reikms tenkina santykio operacij, tai santykiui suteikiama login reikm True (tiesa) ir vykdoma alternatyva V1, jei ne, santykiui suteikiama reikm False (melas) ir vykdoma alternatyva V2. aka else iame sakinyje gali bti praleista, ir tuomet alternatyva V1 bus vykdoma tik tada, kai santykis gys reikm True. Slygos sakinys danai yra vartojamas argument kontrolei, nes ne visuomet i klaviatros vedami skaiiai tinka tolimesniems skaiiavimams. Pvz.: kvadratins aknies negalima itraukti i neigiamo skaiiaus, o dalinti negalima i nulio. Kita valdanti struktra yra ciklo sakinys. Ciklai gali bti keli skirting tip. Plaiausiai vartojami ciklai, kuri apraymo sakinio sintaks yra tokia:

14

while <Kartojimo slyga> do <Kartojamas sakinys>; is sakinys reikia, kad u odelio do nurodytas veiksmas bus kartojamas tol, kol tenkinama kartojimo slyga. Jeigu norime kartoti ne vien, o daugiau sakini, juos btina rayti tarp operatorini skliaust (r. 1 pamok). Taip pat reikia irti, kad ciklas netapt begalinis, t.y., kad kartojimo slyga priklausyt nuo kartojimo sakinio rezultat.

2.7. Kontroliniai klausimai


1. Kokius inote valdani struktr sakinius? 2. Kokia yra slygos sakinio sintaks? 3. Kokia yra slygos sintaks? 4. K reikia V1 ir V2? 5. Kokie yra santykio operacijos enklai? 6. Kokias reikmes gali gauti santykis? 7. Kaip pasirenkama, kuri alternatyv vykdyti? 8. Kaip atrodo sutrumpintas slygos sakinys? 9. Kada vartojamas sutrumpintas slygos sakinys? 10. Kokia yra ciklo sakinio sintaks? 11. Kaip vykdomas kartojimas? 12. K daryti, kad ciklas nebt begalinis? 13. Kaip urayti ciklo sakin, kai norim kartoti daugiau sakini? 14. Kam vartojami valdani struktr sakiniai?

2.8. Kontrolins uduotys


1. Suraskite klaidas slygos sakiniuose: a) b) c) d) if a<b then s := s + a; else s := s + b; if s => 0 then d := Sqrt(s) else d := Sqr(s); if k<> 0 then a := k+1 else a := k+1; if r=0 then WriteLn ( Tai nra apskritimas);

2. K spausdins kompiuterio ekrane tokia programa? program alternatyva; var a, b, c : real; begin a := 5; if a+b > c if a+c <b

b := 6; c := 10; then c := b else c := a; then b:= 0 15

else b:= a; WriteLn ( a=, a:3:1, b=, b:4:1, c=, c:2) end. 3. Kurie i emiau pateikt ciklo sakini, kai a = -3, yra begaliniai ir kodl? a) while a<0 do begin WriteLn ( argumentas neigiamas); a := a +1 end; while a<0 do; begin WriteLn( argumentas neigiamas); a := a+1; end; while a<0 do WriteLn( argumentas neigiamas); a := a+1; while a>=0 do WriteLn( argumentas neigiamas); a := a+1;

b)

c)

d)

4. Paraykite ciklo sakin, kuris, vedus kintamojo x reikmes maesnes u 10, spausdint jas su komentarais ir prayt nauj dvienkli skaii. vedus dvienkl skaii, turi bti spausdinama padka.

3 tema. Sumos kaupimo udaviniai. Skaii srautai


Skaii srautus apdorojaniose programose labai danai taikomi sumos, sandaugos ir kiekio skaiiavimo algoritmai. Pradia. Suma x, s reals skaiiai Pavyzdiui tarkime, kad reikia sudaryti program klaviatra vedamo Ivesti: darbo pabaiga, kai x=0 skaii srauto sumavimui, kai yra inoma, s := 0; kad duomen pabaig ymi nulin vesti x reikm reikm. Tokio udavinio sprendimui yra reikalingas vienas kintamasis (x) kol x <> 0 vedamos reikms saugojimui ir antras s := s+x; (s) - sumos kaupimui. Suma yra vesti x reikm skaiiuojama suteikiant jai pradin reikm 0 (nulis) ir kartojant vedimo bei Ivesti rezultat: s reikm sumos kaupimo operacijas tol, kol Pabaiga

3.1 pratimas

16

vedama reikm nelygi nuliui. Sumos kaupimo veiksmas yra apraomas sakiniu s:= s+x; Priskyrimo sakinio kairje ir deinje pusje nurodytos kintamj reikms atitinka skirtingus laiko momentus, todl sumos kaupimo sakinio prasm yra snauja := ssena + x Surinkite ir patikrinkite skaii srauto sumavimo program Suma. program Suma; var x, s : real; { vedama reikm ir Suma } begin WriteLn ('Sumavimo programa. Darbas nutraukiamas vedus 0.'); s:= 0; { Pradin reikm } WriteLn('veskite x: '); ReadLn(x); while (x<>0) do begin { Sumos kaupimo ciklas } s:= s+ x; { Sumos kaupimo veiksmas } WriteLn('veskite x:'); ReadLn(x); end; WriteLn('Sumos reikm: ', s:8:2); { Praneimas apie rezultatus } ReadLn; { Programos stabdymas } end. Pakeiskite i program taip, kad ji skaiiuot ne vedam skaii sum, o sandaug. Tam reikia sumos kaupimo sakin pakeisti sandaugos kaupimo sakiniu s := s * x, sandaugai s suteikti pradin reikm 1 ir pakeisti praneim apie rezultatus. Papildykite program, kad ji suskaiiuot, kiek buvo vesta teigiam ir kiek neigiam skaii. Tam reikia turti papildomus du kintamuosius, pavyzdiui kt teigiam skaii kiekiui saugoti ir kn neigiam skaii kiekiui saugoti. Kiekio skaiiavimas nuo sumos kaupimo skiriasi tik tuo, kad kiekio reikm didinama vienetu kiekvienu atveju, kada yra surandama tinkama reikm. Program Suma ciklo viduje reikia papildyti sakiniu, kurio algoritmas toks: x>0 t kt := kt+1; kn := kn+1; n

17

3.2. Uduotis savarankikam darbui


Klaviatra vedamos skaii poros. Pirmasis skaiius reikia preks kain, o antrasis tos preks pirkjo pasirinkt kiek. vedam skaii srauto pabaiga nurodoma dviem skaiiais, lygiais nuliui. Reikia sudaryti program, kuri suskaiiuot, kiek pirkjas privalo sumokti pinig u savo pirkinius. Ivesti ekran suskaiiuot sum ir kiek skirting preki pasirinko pirkjas (kiek skaii por buvo vesta).

3.3. K turjau imokti?


Skaii srauto sumavimui, sudauginimui, ar kiekio skaiiavimui reikalingi du kintamieji: vedamos reikms saugojimui ir kaupimui. Jeigu skaiiuojama suma arba kiekis, tai kaupimo kintamajam suteikiama nulin reikm, o jeigu sandauga - vienetin reikm. Sumos kaupimo veiksmas apraomas sakiniu s := s + x; o kiekio skaiiavimo k := k + 1; ia priskyrimo operatoriaus kairje ir deinje pusje nurodytos to paties kintamojo reikms skirtingais laiko momentais, todl kaupimo veiksmo prasm yra nauja reikm := sena reikm + dydis.

3.4. Kontroliniai klausimai


1. 2. 3. 4. 5. 6. 7. 8. Kaip galima nustatyti skaii srauto pabaig? Kiek ir koki kintamj daniausiai reikia kaupimo udaviniuose? Koki pradin reikm reikia suteikti sumos kaupimo kintamajam? Kuo skiriasi skaii srauto sumavimo ir dauginimo algoritmai? Kuo skiriasi sumos ir kiekio skaiiavimo algoritmai? Kokiu operatoriumi apraomas sumavimo veiksmas? Kokia yra sumos kaupimo operatoriaus prasm? Kodl, apdorojant skaii srautus, kaupimo kintamiesiems reikia priskirti tam tikras pradines reikmes?

3.5. Kontrolins uduotys


1. K skaiiuoja i programa? program Nul_ats; var ats, k : real; begin WriteLn( Darbas nutraukiamas vedus nul);

18

ats := 1; WriteLn( veskite kintamojo reikm); ReadLn(k); ats := ats * k; while k<>0 do begin WriteLn( veskite kintamojo reikm); ReadLn(k); ats := ats * k end; WriteLn( Atsakymas bus:, ats : 3 : 0); ReadLn; end. 2. Patikrinkite i program. Jos atsakymas neteisingas. Pataisykite i program. 3. Duota skaii seka su nuliniais elementais, bet joje negali bti dviej vienod gretim skaii. Reikia suskaiiuoti, kiek teigiam, neigiam ir nulini reikmi vedme. Paraykite kartojimo sakin, kuris ubaigt duomen vedim.

4 darbas. Didiausios ir maiausios reikms paieka skaii sraute


4.1. Algoritmas
Tai danai sprendiami udaviniai. Populiariausias yra toks j sprendimo bdas. Deklaruojami kintamieji vedamai (x) ir didiausiai (d) reikmms saugoti. Skaitoma pirmoji reikm ir padaroma prielaida, kad ji yra didiausia (jei iekoma Pradia Maksimumas didiausios reikms): x, d reals d := x vesti x reikm Po to skaitomos kitos reikms ir lyginamos su d. Jei randama didesn, kintamojo d saugoma reikm keiiama nauja: if x>d then d:= x Taip apdorojus vis vedam sraut, kintamasis d saugos didiausi vest reikm. Surinkite ir patikrinkite didiausios reikms atrinkimo i klaviatra vedamo srauto program d := x; kol x <> 0 t x > d n

d := x; vesti x reikm Ivesti didiausi reikm d Pabaiga

19

Maksimumas. program Maksimumas; var x, d : real; { vedama ir didiausia reikms } begin WriteLn('Maksimumo paiekos programa., 'Darbas nutraukiamas vedus 0. '); WriteLn('veskite x: '); ReadLn(x); d:= x; { Pradin reikm } while (x<>0) do begin { vedimo ir analizs ciklas } if x>d then d:= x; { Maksimumo paieka } WriteLn('veskite x:'); ReadLn(x); end; { Praneimas apie rezultatus } WriteLn('Didiausia reikm: ', d:8:2); ReadLn; { Programos stabdymas } end. Pertvarkykite didiausios reikms paiekos program taip, kad ji iekot maiausios reikms vedimo sraute. Ne visuomet patogu pirmj Pradia. Minimumas reikm laikyti pradine didiausia n - sveikas skaiius; x, m reals reikme. Ypa tuomet, kai ta reikm turi bti skaiiuojama (pavyzdiui, vesti n reikm iekant didiausios funkcijos reikms nurodytame argument kitimo m := +10000; intervale). Tokiu atveju, galima kol n > 0 pradine didiausia reikme laikyti vesti x reikm pakankamai ma reikm, toki, kuri x<m tikrai bt maesn u visas galimas t n reikmes. Iekant maiausios m := x; reikms, pradine reikme galima n := n-1; laikyti pakankamai didel skaii. m < +10000 Pavyzdys. Klaviatra vedami n t n reali skaii. Reikia surasti maIvesti: Maesni iausi skaii. Paraykite program Ivesti m reikmi u bazin pagal duot 10000 nebuvo algoritm Minimumas, suderinkite j ir patikrinkite su duomenimis, Pabaiga nurodytais 4.1 lentelje. 4.1 lentel n reikm 4 3 0 x reikms 5 32 28000 39000 Rezultatas 5 nebuvo nebuvo

8 3 15000

20

1 3

8 18 15230

8 8

4.2. Uduotis savarankikam darbui


Sudarykite didiausios reikms paiekos programos modifikacij, kuri ne tik rast didiausi reikm, bet ir jos eils numer vedimo sraute. Tam reikia papildomai vesti vedam skaii skaitikl n, jam suteikti pradin reikm 0 ir, vedus kiekvien skaii, didinti i reikm vienetu (n := n+1). Kieki bei eils numeri skaiiavimui paprastai yra naudojami sveiko tipo kintamieji, kuri tipas deklaravimo sakiniuose nurodomas baziniu odiu integer. Iekant didiausios reikms vietos, reiks siminti ne tik dalinius maksimumus, bet ir j numerius. Taip pat turs bti pakeistas ir praneimas apie rezultatus.

4.3. K turjau imokti?


Didiausios ir maiausios reikmi (ekstremum) iekojimo udaviniai skirstomi dvi grupes pagal tai, ar reikia surasti tos maksimalios (minimalios) reikms eils numer arba prie kokios argumento reikms jis gautas, ar ne. Algoritmo struktra taip pat priklauso nuo to, kaip bus pateikiami pradiniai duomenys: skaii srautu ar skaiiuojami pagal formules. Jeigu reikia rasti didiausi ar maiausi skaii srauto reikm, tai var srityje yra apraomi tik du kintamieji: vestam srauto skaiiui saugoti ir ekstremumui siminti. Kintamajam, kuris saugo didiausi ar maiausi reikm, skaiiavim pradioje reikia suteikti pradin reikm. Daniausiai tai bna pirmoji srauto reikm arba bet koks skaiius, u kur sraute nra didesni arba maesni. Kartojant vedim, tikrinama, ar vestoji reikm nedidesn (nemaesn) u simintj. Todl slygos sakinys, iekant didiausios reikms, bus toks: if x > d then d := x; Iekant maiausios reikms: if x < m then m := x; Jeigu reikia siminti didiausios reikms eils numer, tuomet var srityje reikia aprayti tris kintamuosius: du kaip ir ankstesniu atveju, o trei eils numeriui siminti. Kadangi eils numeris gali bti tik sveikas skaiius, is kintamasis apraomas baziniu odiu integer.

4.4. Kontroliniai klausimai


1. 2. 3. Kaip dar vadinami didiausios ir maiausios reikms iekojimo algoritmai? Kaip skirstomi didiausios (maiausios) reikmi iekojimo udaviniai? Kiek ir koki kintamj reikia aprayti var srityje, norint surasti tik pat ekstremum? 21

4. 5. 6. 7. 8. 9.

Kiek ir koki kintamj reikia aprayti var srityje, kai norim rasti kelintas elementas i srauto yra maiausias? Koks yra didiausios reikms iekojimo slygos sakinys? Koks yra maiausios reikms iekojimo slygos sakinys? Kokias pradines reikmes reikia suteikti tam kintamajam, kuris saugo ekstremumo reikm? Kada kintamuosius var srityje apraome baziniu odiu integer? Ar visuomet didiausios reikms saugojamam kintamajam galima suteikti pirm srauto reikm? Kodl?

4.5. Kontrolins uduotys


1. Maiausiai reikmei i trij skaiiuoti duotas toks slygos sakinys: if a < b then if a < c then else if b < a then min :=a if b < c then min := b else min := c;

Ar jis teisingas? Jei ne, tai pateikite kelet toki kintamj reikmi, su kuriomis jis bus neteisingas. 2. Kaip itaisyti aukiau parayt sakin? 3. Reikia rasti skaii sraute didiausi neigiam reikm. Duota tokia programa: program Klaida; var did, x : real; begin WriteLn (veskite x); ReadLn(x); did := x; while (x<>0) do begin if x < 0 then if x > did then did := x; WriteLn (veskite x); ReadLn(x); end; WriteLn(Didiausia neigiama reikm:, did :5:2); end. Ar visuomet ios programos rezultatas bus teisingas? Jeigu ne, tai kada atsakymas bus neteisingas? 4. Pataisykite program Klaida.

22

5 tema. Skaii sraut analizs udaviniai


5.1 Sraut analiz
Apdorojant duomen srautus, gali bti sprendiami vairs analizs udaviniai. Pavyzdiui, gali bti skaiiuojama, kiek skaii telpa nurodytoje atkarpoje, kokia yra j suma, koks yra ios sumos santykis su vis skaii suma ir panaiai. Sprendiant tokius udavinius, kiekvienai skaitomai srauto reikmei yra taikomi du veiksmai: filtravimas ir apdorojimas. Filtruojant yra nustatoma, ar reikm priklauso tiriamai duomen grupei, o skaiiuojant yra nustatomos vairios tiriamos grups charakteristikos. Paprastos filtravimo slygos yra apraomos operatoriumi if ir santykiais. Sudtingesnms slygoms aprayti toki priemoni nepakanka, tenka i santyki ir kitoki logini dydi formuoti logines iraikas. Jose loginiams dydiams gali bti taikomos ios operacijos: not (neigimas), or (veiksmas arba), and (veiksmas ir), xor (grietas arba). Logini iraik reikms gali bti suteikiamos loginiams kintamiesiems, kurie apraomi baziniu odiu boolean. Logines operacijas apibdina 5.1 lentel. Sudarant logines iraikas, reikia inoti, kad loginio neigimo, kaip ir kit unarini operacij, prioritetas yra aukiausias, operacijos and prioritetas atitinka * ir / prioritetus, o operacijos or - veiksm + ir - prioritetus. Natrali veiksm tvark galima pakeisti skliaustais. Pavyzdiui, kintamojo x priklausymas atkarpai [5, 15] gali bti apraomas taip: (x>=5) and (x<=15). ios atkarpos ior aprao iraika (x<5) or (x>15). 5.1 lentel. Logins operacijos A b not a True true false True false false False true true False false true a or b true true true false a and b true false false false a xor b false true true false

23

5.2 Pratimas
Isiaikinkite, kaip yra sudaryta ir kaip dirba programa, kuri skaiiuoja, koks klaviatra vedam skaii procentas patenka atkarp [5, 15]. Duomen pabaig nurodo nulin reikm. Skaii kieki skaiiavimui yra skiriami integer tipo kintamieji (skaitikliai), kurie gali turti tik sveiksias reikmes.

Pradia. Atkarpa x, sv, s reals sv := 0; s := 0 vesti x reikm kol x <> 0 s := s+1; 5 <= x ir x <= 15 t n sv := sv + 1; Ivesti s ir (sv/s)*100 Pabaiga.

program Atkarpa; var x, { vedama reikm } sv, s: integer; { Skaii skaitikliai } begin WriteLn('Klaviatra vedamo skaii srauto analiz'); WriteLn('Srauto pabaiga - nulin reikm'); WriteLn('veskite skaiius (po vien eilutje);, pirmasis ne nulis:'); sv:= 0; s:= 0; { Pradins skaitikli reikms } ReadLn(x); { Pirmoji srauto reikm } while x<>0 do begin { Srauto pabaigos kontrol } s:= s+1; { Perskaityt skaii kiekis } if (x>=5) and (x<=15) then { Srauto filtravimas } sv:= sv+1; { Atrinkt skaii kiekis } ReadLn(x); { Nauja srauto reikm } end; WriteLn('Analizs rezultatai:'); WriteLn('vesta skaii: ', s); WriteLn('Atkarpos[5, 15] viduje yra ', (sv/s)*100:5:2, ' procent vest skaii.'); ReadLn; end. Pertvarkykite pratimo program taip, kad ji skaiiuot atkarpos [5,15] vid patenkani skaii sum ir vidutin reikm. Savarankikai sudarykite program, kuri vedamo srauto duomenis pertvarkyt pagal formul y:= Sqrt(100- x*x). Sudarykite filtr, kuris skaiiavimams nukreipt tik tas reikmes, kurioms pertvarkymo formul yra apibrta. vedus kitokias reikmes turi bti formuojamas praneimas, kad ioms reikmms skaiiavim formuls negalima taikyti.

24

5.3. Uduotis savarankikam darbui


Klaviatra vedam sveik skaii sekos pabaiga yra nulis. Reikia parayti program, kuri suskaiiuot, kiek buvo vienaenkli, dvienkli, trienkli, keturenkli ir kitoki skaii. Vliau papildykite program veiksmais, kuriais bt suskaiiuojamas vest skaii aritmetinis vidurkis.

5.4. K turjau imokti?


Sprendiant udavinius, apdorojanius duomen srautus, kiekvienai skaitomai srauto reikmei yra taikomi du veiksmai: filtravimas ir apdorojimas. Filtruojant yra nustatoma, ar reikm priklauso tiriamai duomen grupei. Skaiiuojant (apdorojant) yra nustatomos vairios tiriamos grups charakteristikos. Paprastos filtravimo slygos yra apraomos operatoriumi if ir santykiais. Sudtingesnms slygoms aprayti tenka i santyki ir kitoki logini dydi formuoti logines iraikas. Jose loginiams dydiams gali bti taikomos ios operacijos: not or and xor (neigimas), (veiksmas arba), (veiksmas ir), (grietas arba).

Loginiai kintamieji apraomi baziniu odiu boolean. Pirmiausia atliekamas neigimas, po to operacija and (ir) ir pabaigoje or (arba). Natrali veiksm tvark galima pakeisti skliaustais.

5.5. Kontroliniai klausimai


1. Kokie veiksmai taikomi apdorojant duomen srautus? 2. Kas atsitinka filtruojant ir skaiiuojant? 3. Kaip apraoma filtravimo slyga? 4. Kokias inote logines operacijas? 5. Kokiu baziniu odiu apraomi loginiai kintamieji? 6. Kokie yra logini operacij prioritetai?

5.6. Kontrolins uduotys


1. Kuris i anksiau nagrintos programos if sakini atlieka filtravim, o kuris apdorojim? program Klaida; var did, x : real; begin did := -1E + 06; WriteLn (veskite x);

ReadLn(x); 25

while (x<>0) do begin if (x < 0) then if (x > did) then did := x; WriteLn (veskite x); ReadLn(x); end; Writeln(Didiausia neigiama reikm:, did:5:2); end. 2. Kaip, naudojant logines iraikas, sutrumpinti slygos sakin? if a <= b then if a <c then min :=a else min := c

else if

b <= a then if b < c then min := b else min := c;

3. Duoti trij trikampio kratini ilgiai a, b, c. Kuriam tikslui reikalingas toks sakinys: lk := (a =b) and (b=c) and (a=c) ? Ar jis teisingas? Ar io priskyrimo sakinio negalima supaprastinti?

6 tema. Tekstiniai failai


6.1. Failo tipas ir failo kintamasis
Sprendiant udavinius, danai yra pageidaujama atskirti pradini duomen parengimo, j apdorojimo ir rezultat analizs procesus. Tai galima padaryti suraant pradinius duomenis failus ir parengiant i fail apdorojimo programas ir rezultatus vl raant failus. Programos apra dalyje kiekvienam failui yra skiriamas failo kintamasis, kurio aprao sintaks: <Vardas>: <Failo tipas> Universaliausi yra tekstiniai failai, kuri tipas ymimas baziniu odiu text. ie failai yra sudaromi i eilutes sugrupuot simboli. Eilui pabaigos ymimos specialiais eiluts pabaigos simboliais, o failo pabaig ymi failo pabaigos simbolis. Siuniant parengt fail disk, is simbolis raomas automatikai. Ekrane eilui ir failo pabaigos simboliai nerodomi. Programos pagrindinje dalyje kiekvienas failo kintamasis turi bti susiejamas su konkreiu operacins sistemos (OS) failu. Tai nurodoma procedra: Assign(<Failo kintamasis>, '<Failo vardas>') Failo vardas yra sudaromas pagal aptarnaujanioje OS numatytas taisykles ir yra suteikiamas failui kuriant j redaktoriumi. Programoje OS 26

failo vardas tiesiogiai nurodomas tik procedroje Assign, o po to jis yra atstovaujamas failo kintamojo. Po to failas turi bti parengiamas konkreiai apdorojimo operacijai: skaitymui Reset (<Failo kintamasis>); raymui Rewrite (<Failo kintamasis>); Duomenys i fail yra skaitomi panaiai kaip i klaviatros: Read(<Failo kintamasis>, <Kintamj sraas>); ReadLn(<Failo kintamasis>, <Kintamj sraas>); I tekstini fail skaitomi skaiiai turi bti atskirti tarpais, tabuliacijos arba eiluts pabaigos simboliais. Procedra Read i tekstinio failo visuomet skaito tiek reikmi, kiek yra element jo kintamj srae. Procedra ReadLn skiriasi tuo, kad ji i pradi perskaito vis eilut ir tik po to skirsto jos duomenis kintamiesiems. Jei eilutje duomen bna perdaug, pertekliniai duomenys atmetami. Jei j trksta, skaitoma kita failo eilut ir reikmi skirstymas kintamiesiems tsiamas. Ivedimui failus naudojamos procedros: Write (<Failo kintamasis>, <Duomen sraas>); WriteLn(<Failo kintamasis>, <Duomen sraas>); Jos savo savybmis yra analogiki atitinkamoms ivedimo ekran procedroms. Procedra WriteLn nuo Write skiriasi tuo, kad ji ivedam duomen sra papildo specialiais eiluts pabaigos simboliais. Kai fail apdorojimas baigiamas, juos btina udaryti: Close(<Failo kintamasis>) Skaitant failus, loginmis funkcijomis ir EoLn(<Failo kintamasis>) Eof(<Failo kintamasis>)

galima tikrinti atitinkamai eiluts ir failo pabaigos ymes. ioms funkcijoms yra suteikiama reikm true nuskaiius paskutin duomen element eilutje arba faile atitinkamai.

6.2. Pratimas
Patikrinkite program, kuri sumuoja atskirose tekstinio failo duomenys.dat eilutse raytus skaiius. Rezultatai parodomi ekrane ir suraomi fail. Prie raant program, duomen failas su laisvai pasirinktais skaiiais turi bti sukuriamas Turbo Paskalio aplinkos redaktoriumi ir raomas darbin katalog. program Sumos; var duomenys, rezultatai: text; x, s, n: integer; { Duomen ir rezultat failai } { Skaitoma reikm } { Skaii suma ir eiluts numeris } 27

begin WriteLn ('*** Failo duomen skaitymas ir apdorojimas ***'); Assign(duomenys, 'duomenys.dat'); Reset(duomenys); { Failo parengimas skaitymui } Assign (rezultatai, 'result.dat'); Rewrite(rezultatai); { Failo parengimas raymui n:= 0 { Pradin reikm } while not Eof(duomenys) do begin { Failo skaitymas s:= 0; n:= n+1 { Suma eilutei ir numeris while not EoLn(duomenys) do { Eilui apdorojimas begin Read(duomenys, x); { Skaiiaus skaitymas s:= s+x; { Sumos kaupimas } end; ReadLn(duomenys); { Perjimas nauj eilut { Rezultat ivedimas ekran WriteLn('Eiluts nr. ', n, ' Suma: ', s:8:2); { Rezultat raymas fail WriteLn(rezultatai, 'Eiluts nr. ', n, ' Suma: ', s:8:2); end; Close(duomenys); { Fail udarymas } Close(resultatai); ReadLn; end.

} } } } } } } }

Atsiminkite, kad duomen failas turi arba bti tame paiame kataloge, kaip ir j apdorojanti programa, arba jo viet turi nurodyti aplinkos parametrai, arba keli j turi aprayti programoje sakinys Assign. Rezultat failo duomenis galima pamatyti ir po to, kai programa baigia darb. Naudodami integruotos aplinkos priemones, patikrinkite tai savarankikai. Pakeiskite program taip, kad ji ekrane parodyt skaitomus i pradini duomen failo skaiius. Pakeiskite program, kad ji papildomai skaiiuot kiekvienoje eilutje esani skaii kiek, ir visame faile esani skaii sum bei kiek. Savarankikai sudarykite sveikj skaii failo analizs program, kuri nustatyt, kok procent faile sudaro lyginiai skaiiai. Nustatant, ar skaiius yra lyginis, patogu vartoti liekanos skaiiavimo operacij, kuri dar yra vadinama dalyba moduliu. Jos apraymo sintaks: <dalinamasis> mod <daliklis>. Operacijos rezultatas yra lygus liekanai. Pavyzdiui, slyga, kuri tikrina, ar skaiius x yra lyginis, gali bti apraoma taip: (x mod 2) =0.

28

Modifikuokite sveikj skaii failo analizs program taip, kad ji skaiiuot, kok procent sudaro skaiiai, kurie baigiasi skaitmeniu 5. Toki skaii filtravimo slyga yra (x mod 10) = 5.

6.3. Uduotis savarankikam darbui


Sudaryti sveikj skaii failo analizs program, kuri nustatyt, kiek procent skaii yra maesni u didiausios reikms pus. Pradini duomen fail teks skaityti du kartus: iekant didiausios reikms ir filtruojant reikmes pagal duot slyg.

6.4. K turjau imokti?


Pradini duomen ir rezultat saugojimui galima naudoti failus. Apra dalyje kiekvienam failui yra skiriamas failo kintamasis, kuris apraomas var srityje taip: <Vardas>:<Failo tipas> Tekstini fail tipas daniausiai ymimas baziniu odiu text. Norint susieti failo kintamj su operacins sistemos konkreiu failu, naudojama procedra: Assign(<Failo kintamasis>, '<Failo vardas>'); Failo vardas yra sudaromas pagal OS galiojanias taisykles. Jeigu failas yra ne tame paiame kataloge, kur yra j apdorojanti programa, tai prie vardo reikia nurodyti ir keli. Po susiejimo failas turi bti parengiamas konkreiai apdorojimo operacijai: a) skaitymui: b) raymui: Reset(<Failo kintamasis>); Rewrite(<Failo kintamasis>);

Duomenys i failo yra skaitomi panaiai kaip ir i klaviatros: Read(<Failo kintamasis>,<Kintamj sraas>); ReadLn(<Failo kintamasis>,<Kintamj sraas>); Tekstinis failas, i kurio skaitomi duomenys turi bti paruotas i anksto. Skaiiai faile vienas nuo kito turi bti atskirti tarpais. Kiekvienos eiluts pabaig ir failo pabaig ymi specials simboliai, kurie ekrane nematomi, bet uraomi diske. Skaitant su procedra Read, yra skaitoma tiek reikmi, kiek kintamj yra srae, o procedra ReadLn skaito visas reikmes iki eiluts pabaigos simbolio ir tik po to priskiria jas srao kintamiesiems. Jeigu reikmi yra per daug, jos atmetamos. Jeigu trksta, tai padaroma su sekania eilute. Skaitant fail, loginmis funkcijomis EoLn(<Failo kintamasis>) ir Eof(<Failo kintamasis>) galima tikrinti atitinkamai eiluts ir failo pabaigos 29

ymes. ioms funkcijoms suteikiama reikm true skaitant paskutin simbol eilutje ar faile atitinkamai. Ivedimui failus naudojamos procedros: Write(<Failo kintamasis>, <Duomen sraas>); WriteLn(<Failo kintamasis>, <Duomen sraas>); ios procedros skiriasi tik tuo, kad WriteLn papildo fail eiluts pabaigos simboliais. Kai fail apdorojimas baigiamas, juos btina udaryti: Close(<Failo kintamasis>) Negalima vienu metu ir skaitymui ir raymui naudoti to paties failo.

6.5. Kontroliniai klausimai


1. Kokia procedra susieja failo kintamj su OS failu? 2. Kam reikalingos procedros Reset ir Rewrite? 3. Kaip reikia aprayti failo kintamj var srityje? 4. K reikia daryti, norint nuskaityti duomenis i failo? 5. Kokia procedra naudojama fail udarymui? 6. Kuo skiriasi procedros Read ir ReadLn, skaitant duomenis i failo? 7. Kuo skiriasi procedros Write ir WriteLn raant rezultatus fail? 8. Kuriam tikslui reikalingos funkcijos EoLn ir Eof? 9. Kaip sudaromi duomen failai ?

6.6 Kontrolins uduotys


1. Sudaryta programa vedam i klaviatros sveik skaii sekos raymui disk ir j sumavimui. Skaiiai vedinjami tol, kol j suma nevirija 100. Galutin suma taip pat raoma disk ir spausdinama ekrane. Ar teisinga programa? Pagrskite savo nuomon. program Sumavimas; var x, sum : integer; F : text; begin Assign(f, a:\duom.dat); Rewrite(F); sum := 0; while sum <= 100 do begin WriteLn( veskite sveik skaii); ReadLn(x); sum := sum + x; WriteLn(F, x); end; WriteLn(F, sum); ReadLn(F, sum); 30

WriteLn(Galutin suma:, sum); Close(F); end. 2. Duotas duomen failas d.dat, kuriame skaiiai idstyti tokia tvarka: 3 2 5 4 2 1 Programoje duotas toks sakinys: while not Eof(F) do ReadLn(F, a, b, c, d); ia F failo kintamasis. Kas bus atspausdinta ekrane, vykdius komand: WriteLn( a=, a:2, b=, b:2, c=, c:2, d=, d:2); Kodl? 3. Kaip pasikeis antros uduoties atsakymas, jeigu procedr ReadLn pakeisime Read? 4. Sudarykite program, kuri i duomen failo d.dat (r. uduot Nr. 2) sudaryt fail d1.dat, kuriame bt tik neigiami skaiiai.

7 tema. Atsitiktini situacij modeliavimas


Dauguma program modeliuoja vairius ms aplinkos reikinius, kur danai tenka turti reikal su atsitiktiniais dydiais. Pavyzdiui, aidiant kortomis, atsitiktinius skaii altinis yra kort kalad. Tik siekiant, kad maloniau bt aisti, kortos papuoiamos paveiksliukais. aidjai, imdami kortas ir darydami jimus, formuoja situacijas, kurios lemi laimtoj.

7.1. aidim modeliavimas


Panagrinkime, kaip galima sumodeliuoti paprasiausi aidim kortomis 'Akis'. iame aidime aidjai ima pakaitomis kortas i kalads tol, kol surenka sum pakankamai artim skaiiui 21. Laimi tas aidjas, kurio suma bna artimesn skaiiui 21. Vienas i aidj yra kompiuteris. aidimo modeliavimui reikalingi kintamieji, kurie vaizduot aidj imamas kortas, j surinktas tak sumas, aktyv aidj ir sprendimus apie aidimo nutraukim. Kort kalad galima imituoti atsitiktini skaii generavimo funkcija Random(n), kuri generuoja atkarpos [0, n-1] atsitiktinius skaiius. Prie panaudojant i funkcij, rekomenduojama ikviesti procedr Randomize, kuri susieja funkcijos Random generuojamos atsitiktini skaii sekos pradi su kompiuterio laikrodio parodymu. Prie pradedant rayti program, taip pat turi bti sudaromas jos scenarijus (algoritmas), kuris turi tiksliai numatyti vis programos valdom 31

veiksm sek. Tokio scenarijaus metmenis galima aprayti paprastais lietuvi kalbos sakiniais. Pavyzdiui, kort aidimo Akis modeliavimui gali bti parenkamas toks scenarijus: aidj sumoms suteikiamos pradins nulins reikms; Formuojama uklausa apie pradedant aidj; Kol bent vienas aidjas sutinka aisti, kartojami veiksmai: Modeliuojamas kortos mimas; Kortos takai pridedami prie aktyvaus aidjo sumos; Keiiama aktyvaus aidjo ym; Informuojama apie aidybin situacij; Priimamas sprendimas apie aktyvaus aidjo nor tsti aidim; Skelbiami aidimo rezultatai. Turint scenarij, galima parinkti jo realizavimui skirtus kintamuosius ir numatyti atskir veiksm programinio realizavimo bdus. Pavyzdiui, i kalads imamos kortos ir aidj surinkt sum modeliavimui tinka integer tipo kintamieji, sprendimams apie nor tsti aidim - boolean tipas, aktyvaus aidjo nurodymui - char tipas. I scenarijaus apraymo struktros matyti, kad j galima aprayti operatoriumi while, kuris turi tikrinti aidj apsisprendim apraanias logines (boolean) ymes. Apie kortos mimo i kalads modeliavim jau buvo minta - iam tikslui tinka atsitiktini skaii generavimo funkcija Random. Uklausos ir informaciniai praneimai realizuojami vedimo/ivedimo operatoriais, o aidj apsisprendimas apie aidimo nutraukim - slyginiais operatoriais if. Inagrinkite aidim kortomis modeliuojani program Akis ir patikrinkite jos darb. { Programa modeliuoja aidim kortomis Akis } program Akis; var x, { aidjo imama korta } n1, n2: integer; { Sukauptos sumos e, { Pagalbinis kintamasis } c: char; { Aktyvus aidjas } dar1, dar2: boolean; { Apsisprendimo yms } begin WriteLn (' ****** A I D I M A S A K I S ****** '); { aidiant siekiama surinkti sum, { kuri bt galimai artimesn skaiiui 21 } { Kintamieji dar1 ir n1 modeliuoja { kompiuter, o dar2 ir n2 - aidj. 32

} } }

dar1:= true; dar2:= true; { Pradinis apsisprendimas } n1:= 0; n2:=0; { Pradins sumos } WriteLn('Kas pradeda aidim (k- kompiuteris, - aidjas)'); ReadLn(c); Randomize; { Generatoriaus nustatymas } while dar1 or dar2 do begin { aidimo ciklai } x:= Random(11)+1; { Imama korta } if dar1 and (c='k') then begin { Kompiuterio korta } n1:= n1+x; { Kompiuterio suma } c:=''; { Aktyvaus aidjo keitimas } if (21-n1)<=2 then dar1:= false;{ Sprendimas, ar tsti } end else begin { aidjo korta } WriteLn('Ar dar bus jimas (t/n)'); { aidjas atsako } ReadLn(e); if e='t' then begin { Sprendimo analiz } n2:= n2+x; c:='k'; WriteLn ('Jums teko: ', x, ' Js suma: ', n2) end else begin dar2:= false; c:= 'k' end; { Atsisakymas tsti } end; end; WriteLn ('Rezultatai:'); WriteLn('Kompiuterio: ', n1, ', Js: ', n2); ReadLn; end. Papildykite program, kad jos pradioje bt pateikiamos aidimo taisykls; Pakeisti kompiuterio sumos kaupimo slyg taip, kad joje bt atsitiktinis skaiius ir aidjui bt sunkiau orientuotis, kada nutraukti aidim; Papildykite program rezultat analizs dalimi, kurioje bt nustatoma, kas laimjo ir bt praneama apie laimtoj. Savarankikai sudarykite program aidimo kauliukais modeliavimui. iame aidime kiekvienas aidjas meta po tris kubo formos kauliukus, ant kuri on yra atkarpos [1..6] skaiiai. Todl aidjui tenka trij atsitiktini ios atkarpos skaii suma. Laimi tas aidjas, kurio suma didesn.

7.2. Atsitiktini skaii panaudojimas skaiiavimuose


Atsitiktini skaii sekos taip pat skmingai yra vartojamos sprendiant vairius skaiiavimo udavinius: iekant daugelio kintamj funkcij maksimali ir minimali reikmi, skaiiuojant sudting figr plotus, 33

trius ir daugeliu kit atvej. Pavyzdiui, panagrinkime, kaip gali bti apskaiiuotas x aies ir linijos y=sin(x) pirmojo pusperiodio ribojamos figros plotas (7.1 pav.).

7.1 pav. Ploto skaiiavimo modelis Figra, kurios plotas yra skaiiuojamas, apibriama staiakampiu, kurio dvi kratines sudaro koordinai ays, o kitos (kx ir ky ) yra parenkamos taip, kad kratini ilgiai bt sveiki skaiiai ir visa nagrinjama figra tilpt staiakampio viduje. Po to turi bti generuojamos atsitiktins tak staiakampio viduje koordinats (x,y) ir skaiiuojama, kiek toki tak patenka figros vid (y<=yl). Jeigu generuojamos koordinai reikms bus tolygiai pasiskirsiusios, io skaiiaus ir vis generuojam tak skaiiaus santykis nurodys, koki staiakampio dal sudaro nagrinjamos figros plotas. Tokio skaiiavimo bdo tikslumas priklauso nuo generuojam tak skaiiaus. Skaiiavim tikslum galima vertinti kartojant skaiiavimus ir sulyginant j rezultatus. Reals tolydinio pasiskirstymo atkaroje [0..1] skaiiai yra generuojami parametr neturinia funkcija Random. Ibandykite program Plotas, kuri 10 kart skaiiuoja funkcijos y=sinx pirmojo pusperiodio ir y aies ribojam plot ir vertinkite skaiiavimo paklaid (ji lygi didiausios ir maiausios reikmi skirtumo pusei). program Plotas; const n= 100; var x, y: real; i, j, m: integer; kx, ky, s: real; ss: real; begin 34 { Tiriam tak skaiius }

{ Tako koordinats } { Pagalbiniai kintamieji } { Takai figros viduje } { Staiakampio kratins, plotas } { Skaiiuojamas figros plotas }

kx:= 4; ky:= 1; { Staiakampio kratini dydiai } s:= kx*ky; { Staiakampio plotas Randomize; for j:=1 to 10 do begin { Ploto skaiiavimo kartojimas m:= 0; for i:= 1 to n do begin { Tak skaiiavimas x:= Random* kx; { Atsitiktins koordinats y:= Random* ky; if y <= Sin(x) then m:= m+1;{ Takai figros viduje } end; ss:= s*m/n; Write (ss: 6: 2 ); { Figros plotas end; ReadLn; end.

} } } }

Papildykite program informaciniais praneimais taip, kad jos darbo rezultatai ekrane bt pateikti vaizdiau. Pakeiskite programos generuojam tak skaii ir patikrinkite, kaip nuo to priklauso skaiiavim paklaida.

7.3. Uduotis savarankikam darbui


Maie sumesti trij skirting spalv rutuliukai. Du aidjai paeiliui i maio traukia po vien rutuliuk. Laimi tas, kuris pirmas surenka kurios nors vienos spalvos penkis rutuliukus. Reikia parayti program, kuri imituot maie esanius rutuliukus ir atsitiktinai irinkt po vien kiekvienam aidjui tol, kol kuris nors i j laims. Programos algoritmas gali bti toks: Pradia. Rutuliukai Kintamj apraymas. sa1 :=0; sa2 := 0; sa3 := 0; Pirmojo aidjo rutuliuk skaiiai sb1 :=0; sb2 := 0; sb3 := 0; Antrojo aidjo rutuliuk skaiiai kol nei vienas i rutuliuk skaitliuk dar nelygs 5 Spalva := Random(3); Pirmojo aidjo rutuliukas Pridedamas vienetukas prie vieno i skaitliuk Spalva := Random(3); Antrojo aidjo rutuliukas Pridedamas vienetukas prie vieno i skaitliuk Skelbiamas nugaltojas arba lygiosios Pabaiga

35

7.4. K turjau imokti?


Modeliuojant vairius aplinkos reikinius, danai tenka susidurti su atsitiktiniais dydiais. Daniausiai tai bna, kai su kompiuteriu norime sumodeliuoti kok nors aidim, pavyzdiui aidimus kortomis, kauliuku, ar domino. Atsitiktinius skaiius generuoja funkcija Random, kuri gali ir neturti parametr. Skaiiai, gauti ios funkcijos pagalba, tolydiai pasiskirsto intervale [0..1]. Jeigu funkcij Random naudosime su parametru n, kuris gali bti tik integer tipo, tai skaiiai tolygiai pasiskirstys intervale [0..n-1]. Prie naudojant funkcij Random, rekomenduojama atsitiktini skaii generatoriui suteikti pradin reikm. Tai atlieka standartin procedra Randomize. Programuojant aidimus, kaip ir sprendiant kitus udavinius, turi bti sudarytas jo scenarijus (algoritmas), kuris tiksliai numatyt vis programos valdom veiksm sek. Turint scenarij, galima numatyti, kokio tipo ir kokius vartosime kintamuosius, i kur imsime duomenis, kokiais programavimo sakiniais uraysime vien ar kit scenarijaus dal. Atsitiktini skaii sekas galima naudoti taip pat ir program patikrinimui, nes kontrolini duomen vedimas i klaviatros atima daug laiko.

7.5. Kontroliniai klausimai


1. Kokiems tikslams daniausiai naudojami atsitiktiniai dydiai? 2. Kokios funkcijos pagalba galima gauti atsitiktinius skaiius? 3. Kas yra svarbu programuojant aidimus? 4. Kuo pasiymi funkcija Random? 5. Kodl patogu sudaryti didesnes skaii sekas i atsitiktini dydi? 6. K daryti, kad naudojant atsitiktinius dydius nenukentt skaiiavim tikslumas?

7.6 Kontrolins uduotys


1. Reikalingas didelis skaii masyvas, kurio skaiiai bt tolydiai pasiskirst intervale [-5..5]. Kaip parayti funkcija Random? 2. Pradini duomen srautai sudaromi dviem bdais: vedant atkarpos [1, 10] skaiius i klaviatros ir generuojant skaii sek procedra Random(10). Pabaigos slyga - vestas ar sugeneruotas skaiius 0. Reikia abiem atvejais rasti didiausi ir maiausi reikm sraute. Prie koki slyg rezultatai bus vienodi? Kodl? Pateikite pavyzdi.

36

8 tema. Ekrano valdymo pradmenys.


8.1. Ekrano daymas ir langai Kiekviena programa turi ne tik realizuoti sprendiamo udavinio algoritm, bet ir bti vaizdi, lengvai valdoma. Programos valdymo ir jos pateikiam duomen vaizdavimo priemons bei bdai yra vadinami programos ioriniu interfeisu. Iorinio interfeiso sudarymo priemons priklauso nuo kompiuterio rangos savybi ir jos nuolat yra tobulinamos, kinta. Todl i priemoni apraymui skirtos konstrukcijos daniausiai priklauso ne paioms programavimo kalboms, bet j ipltimams, papildymams, kurie pateikiami pagalbini priemoni rinkiniuose - bibliotekose. Turbo Paskalio aplinkoje yra labai efektyvi ir paprasta IBM PC tipo kompiuteri ekran vaizdo valdymo biblioteka Crt. Norint ja naudotis, reikia programos pradioje rayti sakin uses Crt; Daniausiai vartojamos bibliotekos procedros ir funkcijos: function ReadKey : char; Klavio simbolio apklausa. procedure GoToXY(<x,y>: integer;) Kursorius perkeliamas koordinatmis x,y nurodom ekrano viet. procedure ClrScr; Ekrano valymas. procedure ClrEol; Valoma aktyvios eiluts pabaiga. procedure TextColor(<spalva>: byte); Teksto spalva: spalvos kodas arba konstanta. procedure TextBackground(<spalva >) Fono spalva: spalvos kodas arba konstanta. Prcedure Window(<x1,y1,x2,y2>: integer); Aktyvaus lango apraymas: (x1,y1) ir (x2,y2) atitinkamai kairiojo virutinio ir deinio apatinio lango kamp koordinats. procedure KeyPressed; Login procedra, kuri pranea, kad paspaustas bet koks klavias. var TextAttr: word; Kintamasis, kuris saugo duomenis apie spalvin ekrano reim

37

Norint gauti isamesni ini apie kuri nors i ivardint procedr ir funkcij arba kit Turbo Paskalio kalbos struktr, reikia redaktoriaus lange surinkti struktros pavadinim, prie jo perkelti kursori ir paspausti klavi pora Ctrl+F1. Po to ekrane bus matoma pagalbin informacija apie kursoriaus nurodom struktr. Nurodant kursoriaus ir lang koordinates, yra laikoma, kad koordinai sistemos pradia yra kairiajame virutiniame ekrano kampe. X ais nukreipta dein, o Y - emyn. Ekranas skaidomas simboli raymui skirtus langelius, kuri dydis priklauso nuo ekrano darbo reimo. Standartinis ekrano dydis 80x25 langeli. Koordinai sistemos pradios langelio koordinats yra(1,1). Ekrano darbo spalvos yra nurodomi skaitmeniniais kodais arba modulio Crt konstantomis: 1 lentel. Spalvas apraanios konstantos Vardas Reikm Vardas black 0 darkgray blue 1 lightblue green 2 lightgreen cyan 3 lightcyan red 4 lightred magenta 5 lightmagenta brown 6 yellow lightgray 7 white Spalv pulsavim aprao konstanta blink = 128. Simboli, fono spalvas ir ekrano reim galima keisti tiktai tada, kai pageidaujamus reimus palaiko kompiuteryje esanio ekrano kontroleris (valdymo taisas). Yra ir kit ribojim. Pavyzdiui, fon galima nurodyti tik pirmais 8 spalv kodais: 0..7. Jeigu prie teksto spalvos kodo pridsime konstant blink, pavyzdiui TextColor (Red+Blink), ekrane bus raomas pulsuojanio rykumo tekstas. Daant ekran, turi bti apraoma fono spalva (TextBackground(<fonas>)) ir vykdoma ekrano valymo komanda ClrScr. Ekrano spalvas keiianiose programose reikia siminti kintamojo TextAttr saugomas spalvas ir programos darbo pabaigoje jas atstatyti.

Reikm 8 9 10 11 12 13 14 15

38

Patikrinkite program, kuri dao ekran dialogo metu nurodomomis spalvomis program Colors; uses Crt; { Bibliotekos Crt aktyvizavimas } var sb, se, st : integer; { Pagalbiniai kintamieji } begin se:= TextAttr; { Spalvinio reimo siminimas } ClrScr; { Ekrano valymas } sb:= 1; { Pradin reikm } Writeln('Ekrano daymas'); while sb<>0 do begin { Ekrano daymo ciklai } WriteLn ('Nurodykite spavos kod (1..7). Pabaiga - 0:'); ReadLn(sb); if sb<>0 then begin { Praneimo apie pabaig kontrol } WriteLn ('Nurodykite teksto spalvos kod (0..15); ReadLn (st); if st = sb { Ar teksto ir fono spalvos sutampa? } then Writeln(' Teksto ir fono spalva sutapo. Spalv nekeisiu. Lieka ankstesns') else begin { Spalv keitimas } TextColor(st); TextBackground(sb); WriteLn ('Raau js pasirinktomis spalvomis'); end end; end; TextBackground(Blue); { Atsisveikinimo lango spalva } Window(20, 2, 70, 4); Clrscr; { Lango apibrimas ir daymas } Window(22, 3, 68, 3); { Langas lange } TextAttr:= se; { Spalv atstatymas } GoToXY(7, 1); { Kursoriaus perklimas lange } Write('Atsisveikinu. Paspausk klavi Enter'^G); ReadLn; ClrScr; end. Pakeiskite program taip, kad, pakeitus spalvas, bt daomos visa eilut, kuri raomas tekstas. Tai galima padaryti terpiant prie kiekvien raymo ir uklausos veiksm eilui valymo procedr ClrEol.

39

Pakeiskite atsisveikinimo lango sudarymo veiksmus taip, kad is langas bt ekrano centre. 8.2. Uduotys savarankikam darbui. Sudarykite sveikj skaii failo duomen analizs program, kuri i failo skaitomus teigiamus skaiius pavaizduot ekrane mlynomis, o neigiamus - raudonomis juostomis. Juost ilgis turi bti proporcingas skaii moduliams. Sudarykite program, kuri kompiuterio ekrane piet atsitiktinio dydio langus ir juos dayt atsitiktine spalva. Numatykite darbo pabaigos slyg. Ekrane matysite vairiaspalv staiakampi mozaik.

8.4. K turjau imokti?


Programos valdymo ir jos pateikiam duomen vaizdavimo priemons bei bdai yra vadinami programos ioriniu interfeisu. Iorinio interfeiso priemons daniausiai priklauso ne paioms programavimo kalboms, bet j ipltimams, kurie yra suraomi specialiose bibliotekose. IBM tipo kompiuteri ekrano vaizdo valdymo biblioteka turi vard Crt. Todl programos, kurioje naudojami ekrano vaizdo valdymo priemons, pradioje btina prijungti i bibliotek naudojimui, uraant sakin: uses Crt; Temos mediagoje pateiktos 9 daniausiai vartojamos standartins funkcijos bei procedros i ios bibliotekos. Norint gauti isamesni ini, apie kuri nors i j, pakanka TP redaktoriaus lange surinkti jos pavadinim, prie jo perkelti kursori ir paspausti klavi por Ctrl +F1. Tada ekrane bus matoma pagalbin informacija apie t struktr. Procedroje GoToXY(<x, y> : integer;), kur x, y yra kursoriaus perklimo koordinats, yra laikoma, kad koordinai pradia( kurios koordinats - 1,1) yra ekrano kairiajame virutiniame kampe, absisi ais nukripta dein, o ordinai emyn. Ekranas yra skaidomas simboli raymui skirtus langelius. Standartinis ekrano dydis 80x25 langeli. Ekrano ir teksto spalvos nurodomos skaitmeniniais kodais arba modulio Crt suprantamais standartiniais odiais. Simboli, fono spalvas ir ekrano reim galima keisti tiktai tada, kai pageidaujamus reimus palaiko kompiuteryje esanio ekrano kontroleris (valdymo taisas). Fonui galima nurodyti tik pirmsias atuonias spalvas. Jei prie spalvos kodo pridsime odel blink, gausime pulsuojani spalv.

40

Norint perdayti ekran pirmiausiai apraoma fono spalva, o po to btina nuvalyti ekran, kad ji pasikeist. Keiiant ekrano spalvas, btina konstanta TextAttr, kuri pradioje simena standartin ekrano spalv, o po darbo j grina.

8.5. Kontroliniai klausimai.


1. Kokiu sakiniu yra prijungiama vartojimui spalv valdymo procedr biblioteka? 2. K vadinam ioriniu programos interfeisu? 3. Kaip gauti papildomos informacijos apie bibliotekos Crt tam tikr funkcij ar procedr? 4. Kur yra ekrane koordinai pradia ir kokios yra jos koordinats? 5. Kuo skiriasi prasta koordinai sistema nuo naudojamos kompiuterio ekrane? 6. Kaip pakeisti ekrano spalv? 7. Koks standartinis ekrano dydis pagal koordinates? 8. Koks specials reikalavimai keliami ekrano spalvoms? 9.Kaip nurodomos ekrano spalvos? 10. Kaip gauti pulsuojani spalv? 11. Kaip grinti ekranui standartin spalv?

8.6 Kontrolins uduotys.


1. Duota tokia programa: program Spalvos; uses Crt; var j, ek : integer; begin ek := TextAttr; ClrScr; j := 1; while j <= 7 do begin TextBackground(j); WriteLn(fonas:, j); TextColor(j+1); WriteLn( spalva: , j+1); j := j+1; WriteLn( Kai pasiirsite, paspauskite ENTER); ReadLn; end;

41

TextAttr :=ek; ClrScr; end. Ar teisinga i programa? Jeigu ne, kas joje blogai? 2. K ji turt spausdinti ir kaip? 3. Pataisykite i program.

9 tema. Ciklas for. Simbolinis duomen tipas


9.1. Ciklas for. Ciklas for yra naudojamas tada, kai i anksto inomas ciklo kartojim skaiius. Ciklo kartojimo metu specialiam diskretinio tipo kintamajam, vadinamam ciklo parametru, i eils yra suteikiamos ciklo aprae nurodytos atkarpos reikms. Ciklo kartojim skaiius yra lygus jo parametro reikmi skaiiui ioje atkarpoje. Operatoriaus sintaks: for <p>:= <i1> to <i2> do <Kartojamas operatorius>; Aprae p ymi ciklo parametr, o iraikos i1 ir i2 nurodo jo reikmi atkarpos ribas. Jei i1>i2 (parametro reikmi atkarpa yra majanti),tai vietoje bazinio odio to raomas odis downto. p := i1, i2; Kartojamas operatorius

Jeigu kartojami veiksmai apraomi ne vienu operatoriumi arba sakiniu, tai j pradioje paraomas odis begin , o gale end; Tokia sakini grup yra vadinama sudtiniu sakiniu. 9.2. Simbolinis duomen tipas

42

Simbolinio tipo kintamiesiems turi bti nurodomas tipas char, o simboli reikms gali bti nurodomos tiesiogiai, raant jas tarp kabui, arba netiesiogiai, vartojant funkcij Chr, kurios sintaks: function Chr(<Simbolio kodas>): char;

Pavyzdiui: var A, B, C, D : char; A :=g; B := Chr( 66 ); Read( C ); D := A; Write( B ); ia kintamojo A reikm bus raid g, kintamojo B bus raid B, kintamojo C bus klaviatroje paspausto simbolinio klavio reikm, o D reikm sutaps su kintamojo A, ekrane bus atpausdinta kintamojo B reikm: matysime raid B. Leistina kod reikmi atkarpa yra [0..255]. Dalis i kod [0..31] yra skirti duomen perdavimo ir atvaizdavimo rengini valdymui. Kiti simboliai yra skaitmenys [48..57], raids (didiosios lotyniko alfabeto raids [65..90] ir maosios [97..122]), ir specials enklai (skliaustai, operacij enklai, skirybos enklai ir pan.). Simbolio kod galima suinoti funkcijos Ord pagalba: function Ord(<Simbolis >): integer;

Funkcijos argumentu gali bti konkretus simbolis, uraomas tarp apostrof, arba simbolinio tipo kintamasis, kurio reikm yra konkretus simbolis. Pavyzdiui: var n : integer; n := Ord( A ); ia n reikm bus 65, t.y. nurodyto simbolio kodas (raids A kodas). Simbolinio tipo kintamj reikmes galima palyginti. ia simbolis keiiamas jo kodu. Simbolis yra didesnis u kit simbol, jeigu jo kodo reikm yra didesn. Tuo bdu gauname, kad raid A yra maiausia, nes jos kodas yra 65 maiausias, o raid z yra didiausia, nes jos kodas yra 122. Pavyzdiui: if A > B then Write( A ) else Write( B ); atspausdins ms atveju kintamojo A reikm raid g , nes jos kodas didesnis u kintamojo B reikm (raid B)

43

9.3. Pratimai. Programa Simboliai ekran iveda simboli ir j kod lentel. Patikrinkite simboli ir j kod demonstravimo programos darb. program Simboliai; uses Crt; var i: integer; (* Ciklo parametras *) begin ClrScr; WriteLn(' Kompiuterio alfabeto simboliai ir j kodai'); for i:= 1 to 255 do (* Kod generavimo ciklas *) begin Write (chr(i): 3, ':', i: 5); (* Simboliai ir j kodai *) if i mod 7 = 0 then WriteLn; (* Vienoje ekrano eilutje *) end; (*po 7 simbolius rodome *) WriteLn; ReadLn; end. Stebdami programos Simboliai darbo rezultatus, pamatysite, kad kompiuterio alfabet sudaro ne tik tradiciniai raymui skirti simboliai bet ir vairs remeli bei kitoki grafini struktr sudarymui skirti simboliai. Jie dar yra vadinami pseudografikos simboliais. Pavyzdiui, ekrano langeli daymui visomis 16 - spalv galima naudoti simbol '', kurio kodas yra 178. Patikrinkite spalv kod demonstravimo programos Spalvos darb. program Spalvos; uses Crt; var i, j, se : integer; begin se:= TextAttr; WriteLn(' Demonstruojamos ekrano spalvos ir j kodai:'); WriteLn; for i:= 0 to 15 do begin (* Spalv kod generavimas *) TextColor(white); Write('Spalvos kodas ', i:3, ' '); TextColor(i); for j:=1 to 20 do (* Juostos i 20 simboli daymas *) Write( Chr(178) );

44

WriteLn; end; ReadLn; end. TextAttr:= se; ClrScr;

Savarankikai sudarykite program, kuri ekranui suformuot mlynos spalvos rmel. Rmelio simbolius parinkite i kompiuterio simboli alfabeto patys. 9.3. Uduotis savarankikam darbui. 7.2. skyrelyje buvo nagrintas atsitiktini skaii generavimo bdas kreive ribojaniam plotui skaiiuoti. Papildykite program veiksmais, kurie leist vizualiai ekrane pavaizduoti skaiiuojamus takus: jeigu kreivs viduje, tai alias simbolis, o iorje raudonas. Takus vaizduokite simboliu *, kurio fonas atitikt nurodytas spalvas. rezultatus pavaizduokite balto fono lange, kurio dydis 20x10 (ia x=20, y=10). Tam reikia sinuso skaiiavimo reikmes 10 kart padidinti. 9.4. K turjau imokti? Ciklas for yra naudojamas tik tada, kai i anksto yra inomas tikslus kartojim skaiius. Operatoriaus sintaks: for <p> := <i1> to <i2> do <Kreipimosi operatorius>; ia p sveiko tipo kintamasis, kuris vadinamas ciklo parametru. i1, i2 ymi ciklo parametro kitimo ribas. Jos gali bti ireikos sveikais skaiiais, sveiko tipo kintamaisiais arba iraikomis, kuri skaiiavimo rezultatas yra diskretinio dydio ir tipas sutampa su parametro tipu. Ciklo parametras p keiiasi nuo i1 iki i2 tik kas vienet. Jeigu i1>i2, tai tada parametro p reikm maja kas vienet ir vietoje bazinio odio to reikia vartoti downto. Jeigu reikia kartoti ne vien sakin, o j grup, tai vartojame operatorinius skliaustus. Tada inomo kartojim skaiiaus sakinys atrodys taip: for <p> := <i1> to <i2> do begin <kartojami operatoriai>; end;

45

Tokia sakini grup yraa vadinama sudtiniu sakiniu. Simbolinio tipo kintamieji yra tokie, kurie programos darbo metu gyja simboli reikmes, t.y. raidi, operacijos enkl. Jie var srityje apraomi naudojant bazin od char. Simboli reikms iems kintamiesiems gali bti raomos tiesiog kabutse arba su funkcija Chr, kurios bendra iraika yra: function Chr(<simbolio kodas>) : char; Leistina kod reikmi atkarpa [0 .. 255]. Simbolio kod galima suinoti funkcijos Ord pagalba. Jos sintaks tokia: function Ord(<simbolis>) : integer; ia simbolis yra pats abcls elementas, paraytas kabutse, kurio kod norime suinoti, arba simbolinio tipo kintamasis. Simbolinio tipo kintamuosius galima palyginti santykio enklais. Didesniu laikomas tas simbolis, kurio kodas yra didesnis. Tarp 255 simboli kod yra ne tik mums prasti, bet ir psiaudografikos simboliai. 9.5. Kontroliniai klausimai. 1. K vadinam sudtiniu sakiniu? 2. Kokia yra inomo kartojim skaiiaus sakinio struktra? 3. Kokios gali bti ciklo parametro reikms? 4. Kada sakinyje vartoti bazin od to, kada downto? 5. Kokie kintamieji yra simbolino tipo? 6. Kaip suinoti simbolio kod? 7. Kaip galima parayti simbol? 8. K duoda funkcija Chr? 9. Pagal k lygimami simboliai? 10. Pateikite bent vien psiaudografikos pavyzd. 9.6 Kontrolins uduotys. 1. Duotas toks kartojimo sakinys: for i := 1 to 5 do begin WriteLn('spausdinu ', i, ' -j kart);

46

i := i + 2; end; Kiek kart kartojimo sakinys spaudins praneim? Ar negalima io sakinio supaprastinti? Jeigu ne, tai kodl? 2. Kaip reikia pakeisti pirmosios uduoties kartojimo sakin, kad programa spausdint tik lygines i reikmes? 3. Sudaryta tokia programa: program Atbulai; var a, b, x, s : integer; begin WriteLn('veskite intervalo [a, b] kratines reikmes'); ReadLn(a, b); s := 0; for x := a to b do s := s + x; WriteLn('Intervale [a,b] sveik skaii suma = ', s); end. Kai papra vesti intervalo reikmes, surinkote: 40 30 Enter; Kok spaudins atsakym? Kodl? K reikia pakeisti kartojimo sakinyje, kad atsakymas bt: "Intervale [a,b] sveikj skaii suma = 385", vedus tuos paius skaiius ir tokia paia tvarka? 4. Duota programa: program Kodai; uses Crt; var x : char; i, n : integer; begin ClrScr; Randomize; for i := 1 to 10 do begin n := Random(150); x := Chr(n);

47

WriteLn('............', n, '..............', x); end; end. Daugtaki vietoje raykite komentarus atsakymams. Kaip pakeisti pirmj priskyrimo sakin, kad nespausdint valdani simboli?

10 tema. Garsai. Ciklas repeat...until.


10.1. Garsai. Modulyje Crt yra ios gars valdymo procedros: procedure Sound(<Danis>: word); Garsiakalbio jungimo, nurodant garso dan, procedra. procedure Delay(<Trukm milisekundmisd>: word); Pauz, kurios metu kompiuteris veiksm neatlieka. procedure NoSound; Garsiakalbio ijungimas. Visos trys ios procedros yra vartojamos kartu - jungiamas pageidaujamo danio (tono) garsas, leidiama jam kur laik skambti - Delay ir jis ijungiamas arba keiiamas tono auktis. 10.2. Ciklas repeat...until. Skaiiavimai Cikliniams procesams aprayti buvo naudojamos dvi cikl formos: while ir for. iki <Pabaigos slyga> Esti toki ciklini skaiiavim, kuriuos visuomet bent kart btina atlikti ir kuri metu paaikja, ar skaiiavimai bus tsiami. Tokius veiksmus patogu aprayti ciklo sakiniu repeat...until. Skaiiavimai vykdomi tol, kol ciklo pabaigos slygos rezultatas bus reikm False. Skaiiavimuose turi bti veiksmai, kuri metu gaunamos reikms keiia arba nekeiia ciklo pabaigos slygos rezultat, taiau btina, kad kada nors bt gautos reikms, kurioms esant ciklas baigtusi. Ciklo sakinio struktra: repeat <Skaiiavimai> until <Pabaigos slyga> 10.3. Pratimai.

48

Atsitiktinis spalv ir gars generavimas. Garsiakalbio valdym geriausiai aprayti natomis, bet domius efektus galima gauti ir naudojant atsitiktinius skaiius. Kaip tai yra daroma, iliustruojama pavyzdyje. Pradia Garsai. Ekrano paruoimas darbui. Generuojama atsitiktin spalva ir ja nudaomas ekranas. jungiamas garsas, kurio tonas priklauso nuo spalvos kodo. Atsitiktinio ilgio pauz. Ijungiamas garsas. iki bus paspaustas bet koks klavias. Keiiamas tonas, jeigu buvo paspaustas klavias t. Virutin danio riba apribojama. iki veiksm pabaigos: klavias q arba Q. Ekrano bsenos atstatymas. Pabaiga. program Garsai; uses Crt; var sb, se: byte; bg, g: longint; t, p: integer; c: char; begin TextBackground (Black); se:= TextAttr; ClrScr; GoToXY(20, 25); (*

(* Spalvos *) (* Garsai *) (* Tempas *)

(* Spalv siminimas (* Ekrano valymas Kursoriaus perklimas

*) *) *)

49

Write('Tonas - "t". Pabaiga - "q". '); Window(10, 3, 70, 20); bg:= 1000; (* Bazinis tonas *) t:= 200; (* Bazinis tempas *) repeat repeat Randomize; sb:=Random(6)+1;(* Atsitiktiniai skaiiai *) TextBackground(sb); ClrScr; (* Lango daymas *) p:= bg div 10+20; Sound(bg+ p * sb); (* Tono keitimas *) Delay(t + Random(t)); NoSound; (* Trukm *) until KeyPressed; (* Klavi kontrol *) c:= ReadKey; (* Klavio kodas *) if c='t' then bg:= bg+ 500 (* Ar keisti ton? *) if bg>5000 then bg:= 10; (* Ribojimas daniui *) until (c= 'q') or (c= 'Q'); (* Nutraukimo slyga *) TextAttr:= se; ClrScr; (* Spalv atstatymas *) end. Pakeiskite program taip, kad su klaviu "g" bt galima keisti kompiuterio grojamos melodijos greit, o ekrano centre bt matomas praneimas apie bazin dan bg. Greit keiia programos parametras t. Programoje GarsoLangai keiiami spalvot lang dydiai. Grojanti programa bus domesn, jei sinchronikai keisis ne tik ekrano spalvos, bet ir daom lang dydiai. Kaip tai yra daroma iliustruojama programoje. program GarsoLangai; uses Crt; var sb, se: byte (* Spalvos *) bg, g: longint; (* Garsai *) t, p: integer; (* Tempas *) c: char; x1, y1, x2, y2: byte; (* Lang koordinats *) begin TextBackground(Black); se:= TextAttr; ClrScr; GoToXY(20, 25); (* Kursoriaus perklimas *) Write('Tonas - "t". Pabaiga - "q". '); Window(1, 1, 80, 24); bg:= 1000; t:= 200; (* Bazinis tonas ir greitis*) repeat

50

repeat Randomize; sb:=Random(6)+1; Randomize; (* Atsitiktins koordinats *) x1:= 1 + Random(50); y1:= 2+Random(12); x2:= x1 + Random(80-x1); y2:= y1 + Random(25-y1); Window(x1, y1, x2, y2); TextBackground(sb); ClrScr; (* Lango daymas *) (* Garsiakalbio jungimas *) p:= bg div 10+20; Sound(bg+ p * sb); Delay(t + Random(t)); NoSound; (* Trukm *) until KeyPressed; (* Klavi kontrol *) c:= ReadKey; (* Klavi apklausa *) if c='t' then bg:= bg+ 500; (* Bazinio danio keitimas *) if bg>5000 then bg:= 10; until c= 'q'; TextAttr:= se; ClrScr; end. Garsiniai ir vaizdiniai efektai danai vartojami program darbo pradioje ir gale. Pavyzdiui, programos prisistatymui galima vartoti "augant" ekrano vaizd. Kaip tai padaryti, iliustruojama programoje Auga. program Auga; uses Crt; var s, x1, x2, y1, y2 : byte; (* Spalvos ir lang koordinats *) i, j, d : integer; begin TextBackground (Black); ClrScr; (* Ekrano valymas *) s:= TextAttr; GoToXY(30, 1); Write('Lang augimo demonstravimas'); Delay (1000); for i:=1 to 12 do (* Lang daymo ciklai *) begin TextBackground(Blue); (* Lango spalva *) (* Dydio keitimas ir daymas *) Window(37-3*i, 13-i, 44+3*i, 13+i); ClrScr; Window(37, 13, 44, 14); Write ('Startas!');(* Praneimas *) d:= -50; for j:= 1 to 3 do (* Garsinio efekto ciklas *) begin d:= d*(-1); Sound(500 + d*j); Delay(100 - (d*j) div 2); NoSound;

51

end; end; Delay(1000); for j:= 1 to 3 do (* Atsisveikinimo ciklas *) begin Sound(50); Delay(300); NoSound; Window(37, 13, 44, 14); Write ('Bye-bye!'); Delay(500); ClrScr; end; TextAttr:= s; ClrScr; end. Pakeiskite program taip, kad langas ne didt, o nuosekliai mat. 10.4. Savarankiko darbo uduotis. Parinkite kiekvienai lotyniko alfabeto raidei skirtingo tono ir danio garsus. I klaviatros vedinjamas raides uraykite atsitiktine spalva atsitiktinje ekrano vietoje, palydint atitinkamais garsais. Numatykite darbo pabaigos form. 10.5. K turjau imokti? Modulyje Crt be ekrano valdymo struktr yra ir garso valdymo trys procedros: Sound, Delay, NoSound. Jungiant ias tris procedras galima gauti vairius garsus. Cikliniams procesams aprayti be operatori while ir for, yra dar vienas repeat. Jis vartojamas tuo atveju, jeigu kartojimo veiksmus reikia atlikti bent vien kart, o tik po to paaikja ar jie bus kartojami toliau. io ciklo uraymo sintaks tokia: repeat <skaiiavimai> until <pabaigos slyga>; Skaiiavimai, prieingai negu cikle while, yra kartojami tol, kol pabaigos slygos rezultatas yra false. Ciklo viduje skaiiavimai turi bti vykdomi taip, kad kada nors ciklo pabaigos slygos rezultatas gyt reikm false, kitaip ciklas bus begalinis. 10.6. Kontroliniai klausimai. 1. Kokios yra garso valdymo procedros modulyje Crt? 2. Kada kartojimams aprayti yra vartojamas ciklo sakinys repeat?

52

3. Kuo repeat skiriasi nuo while? 4. Kaip reikia organizuoti skaiiavimus ciklo viduje? 10.7 Kontrolins uduotys. 1. Duota programa: program Melodija; {garsas} begin Sound(500); Delay(2000); NoSound; end. Ar ji teisinga? Jeigu ne pataisykite. 2. K girdsime vykd i program? Padarykite, kad garsas ir tyla periodikai pasikartot 5 kartus. 3. Duotas kartojimo sakinys: repeat sum := sum + x; x := x + 3; until (x < 10); Kiek kart bus pakartotas sumavimas, jeigu programos pradioje buvo paraytas toks sakinys: x := 3;? Kodl? 4.Kaip pasikeis programa, jeigu priskyrimo sakinys bus: x := 15? Kodl? 5. Pataisykite kartojimo sakin taip, kad jis sumuot sveikus skaiius, besidalinanius i trij intervale [0, 20]. 6. Reikia vedinti skaii sek, kol bus vestas neigiamas skaiius ir suskaiiuoti kiek kart buvo vestas nulis. Kur kartojimo sakin repeat ar while geriau naudoti ciklo organizavimui. rodykite tai sudarydami dvi programas.

53

Uduotys savarankikam darbui.


Pirmas variantas. U-1. Klaviatra vedami trys skaiiai, kurie reikia trikampio kratini ilgius. Suskaiiuoti ir atspausdinti trikampio plot. U-2. Klaviatra vedami du skaiiai, kurie reikia staiakampio kratini ilgius. Suskaiiuoti ir atspausdinti staiakampio plot. U-3. Klaviatra vedami keturi skaiiai, kurie reikia atkarpos, nubrtos koordinai ploktumoje, gal tak koordinates (x, y). Suskaiiuoti ir atspausdinti atkarpos ilg. U-4. Klaviatra vedami trys skaiiai, kuri pirmas reikia apskritimo spindul, o kiti du apskritimo, nubrto koordinai ploktumoje, centro koordinates (x,y). Suskaiiuoti ir atspausdinti apkritimo ilg ir centro atstum nuo koordinai centro. U-5. Klaviatra vedami du skaiiai, kurie reikia tako koordinates ploktumoje (x, y). Suskaiiuoti ir atspausdinti tako atstum nuo koordinai pradios tako. U-6. Klaviatra vedami keturi skaiiai, kurie reikia staiakampio, nubrto taip, kad kratins bt lygiagreios koordinai aims, prieing dviej kamp koordinates (x,y). Suskaiiuoti ir atspausdinti staiakampio plot. U-7. Klaviatra vedami trys skaiiai, kurie reikia kvadratins lygties ax2+bx+c=0 koeficientus. Suskaiiuoti ir atspausdinti akn reikmes. Pastaba: koeficient reikms vedamos tokios, kurioms esant sprendiniai bus. U-8. Klaviatra vedami ei skaiiai, kurie reikia trikampio, nubrto koordinai ploktumoje, virni koordinates (x,y). Suskaiiuoti ir atspausdinti trikampio kratini ilgius. U-9. Klaviatra vedami keturi skaiiai, kurie reikia staiakampio, nubrto taip, kad kratins bt lygiagreios koordinai aims, prieing dviej kamp koordinates (x,y). Skaiius parinkite taip, kad jie apibrt kairio virutinio kampo ir deinio apatinio kampo

54

koordinates. Suskaiiuoti ir atspausdinti staiakampio koordinates bei jo atstum nuo koordinai pradios tako.

centro

U-10. Klaviatra vedami keturi skaiiai, kurie reikia atkarpos, nubrtos koordinai ploktumoje, gal tak koordinates (x, y). Suskaiiuoti ir atspausdinti apskritimo ilg ir centro koordinates, jeigu atkarpa apskritimui yra diametras. Antras variantas. Uduotys tos paios. Duomen yra daug. Reikia su visais atlikti skaiiavimus. Sugalvokite duomen srauto, vedamo i klaviatros, pabaigos poym ir realizuokite programoje. Treias variantas. Papildykite ir modifikuokite savo ankstesn program. Duomenys yra suraomi i anksto tekstin fail. Programa juos skaito, atlieka nurodytus skaiiavimus ir iveda rezultatus kit tekstin fail su paaikinimais ir pradiniais duomenimis. Tarp duomen gali bti ir toki, kurie Js udaviniui bus netinkami (pvz., kratins ilgis neigiamas arba nulinis). Juos praleiskite. Ketvirtas variantas. Papildykite ir modifikuokite savo ankstesn program. Sugalvokite ir realizuokite programoje duomen ir rezultat pavaizdavim kompiuterio ekrane tok, kuris bt graus, aikus ir suprantamas. Tam naudokite spalvas ir ekraninius langus. Penktas variantas. Papildykite ir modifikuokite savo ankstesn program naujais nurodytais skaiiavimais. Sugalvokite ir realizuokite papildomas priemones, kurios bus naudingos dialogui su vartotoju. U-1. Suskaiiuoti ir atspausdinti vis trikampi plot ir stai trikampi kiek. U-2. Suskaiiuoti ir atspausdinti vis staiakampi plot ir kiek buvo kvadrat. U-3. Suskaiiuoti ir atspausdinti vis atkarp ilgius ir kiek buvo atkarp, kurios pilnai nubrtos pirmame ketvirtyje.

55

U-4. Suskaiiuoti ir atspausdinti vis apkritim ilgius ir j atstumus iki koordinai centro ir kiek yra apskritim pilnai nubrt tik pirmame ketvirtyje. U-5. Suskaiiuoti ir atspausdinti vis tak atstumus iki koordinai pradios tako. Suskaiiuoti vidutin tako atstum iki koordinai pradios tako. U-6. Suskaiiuoti ir atspausdinti vis staiakampi plot ir rasti staiakampi, kurie yra pilnai pirmame ketvirtyje, plot sum. U-7. Suskaiiuoti ir atspausdinti vis lygi akn reikmes. Jeigu realios aknys neegzistuoja, tuomet tai nurodyti. Suskaiiuokite vis akn aritmetin vidurk. U-8. Suskaiiuoti ir atspausdinti vis trikampi kratini ilgius. Suskaiiuoti vidutin kratins ilg. U-9. Suskaiiuoti ir atspausdinti vis staiakampi centr koordinates bei j atstumus nuo koordinai pradios tako. Kiek t centr yra pirmame ketvirtyje. U-10. Suskaiiuoti ir atspausdinti vis apskritim ilgius ir centr koordinates, jeigu kiekviena atkarpa yra apskritimo diametras. Kurie apskritimai yra nubriami tik pirmame ketvirtyje? Kiek yra toki apskritim?

Struktrogram elementai
( Nassi-Schneiderman diagrams ) Udavini sprendimo algoritmus vaizduoti galima vairiais bdais: pseudokodu (labai detaliai), simbolinmis (blokinmis) schemomis, struktrogramomis. Programuotojai renkasi labiausiai atitinkant j konkreius poreikius bd. 1973 metais amerikiei autoriai I.Nassi ir B.Shneiderman pasil algoritm uraymo bd, kuris inomas struktrogram vardu (Vakaruose inomas vardu NassiSchneiderman diagrams). Tai bdas, kuris gerai tenkina struktrinio programavimo technologijos reikalavimus: vaizdus, lakonikas, paprastas, neleidiantis formuoti nestruktrini element. Tobuljant programavimo priemonms, struktrogram elementai taip pat dalinai pakito. Taip, pavyzdiui, atsitiko su Irinkimo pagal poym struktrogramos elementas: autori pasilyta forma retai naudojama. Toliau yra parodyti pagrindiniai struktrogram elementai.

56

x := a + b

Priskyrimas. Duomen vedimas bei ivedimas. Duomen tip apraymas. Kintamj apraymas. Programos bloko vardas. Kreipinys procedr. Slygos sakinys: if a + b > c then c := a+g else c := a/x; Ciklo sakinys: x := a; while x <= b do begin (* skaiiavimai *) x := x + h; end; Ciklo sakinys for x := a to b do begin (* skaiiavimai *) end; Ciklo sakinys repeat (* skaiiavimai *) until x <= b;

Daug ( A, n, k )

a+b > c c := a + g c := a / x

x := a; kol x < b skaiiavimai x := x + h

x := a, b skaiiavimai

skaiiavimai iki x <= b

irinkti pagal x a: b: c: r := 2 r := 3 r := 6

Irinkimas pagal poym case X of a : r := 2; b : r := 3; c : r := 6; end;

57

irinkti pagal x a: b: kitaip r := 2 r := 3 r := 3

Irinkimas pagal poym case X of a : r := 2; b : r := 3; else r := t; end;

Programos, paprogrami, programinio bloko struktrograma.


Pradia

Pradia. ia uraomas programos Apraymai vardas, paprograms antrat arba programos bloko vardas. Programos Veiksmai blokas yra programos teksto dalis, kuri sudaro viening veiksm grup ir kuri, Pabaiga kaip taisykl, uraoma tarp skliaust begin ... end. Programoje bloko vardas gali bti raomas kaip komentarai bloko pradioje. Apraymai. i dalis gali bti sudaryta i keli specializuot skyri, kuriuose apraomi konstantos, duomen tipai, kintamieji ir kitos struktros. Suraant kintamuosius siloma juos grupuoti pagal paskirt ir tipus. Rekomenduotina tokia seka: duomenis apraantys kintamieji, rezultatus apraantys kintamieji ir vairs pagalbiniai kintamieji. ios dalies gali ir nebti. Jeigu apra dalis yra didel, j galima aprayti atskirai u struktrogramos rib. Kintamieji, kuri paskirtis ir tipai akivaizds, kaip pvz., ciklo for parametras, gali bti visai nenurodomi apraymuose. Raant programos tekst, btina sitikinti, kad visi kintamieji apraymuose buvo nurodyti. Jeigu ne, tuomet reikia, pervelgus algoritm, papildyti programos kintamj sra. Veiksmai. ia parodomi udavinio algoritm sudarantys veiksmai, j login seka. Kiekvienas struktrinis elementas gali bti sudtingas: jo viduje gali bti braiomi kiti elementai. Labai sudtingus elementus tikslinga vaizduoti atskiromis struktrogramomis. Pagrindinje struktrogramoje tokie elementai nurodomi bloko vardu. Taip gaunamos hierarchikai susietos strutrogramos. Hierarchinse sistemose pirmiausia apraoma udavinio sprendimo eiga stambiomis funkcinmis veiksm grupmis. ios grups yra komentuojamos ir o po to atskirai yra detalizuojamos. Tai leidia

58

lengviau suvokti udavinio sprendimo esm, be to detalizacijos lyg galima riboti pagal tai, koki patirt turi programuotojas, kuris rao tekst. Detalizacijos lygis taip pat priklauso nuo algoritmo pobdio ir nuo to, kiek jis susietas su realizacija konkreia programavimo kalba. Struktrograma turi bti pieiama visa: nuo pradios iki pabaigos, t.y. negalima nutraukti jos paveiksl bet kurioje vietoje ir tsti kitoje vietoje ar kitame lape. Jeigu struktrograma netelpa, tuomet dal veiksm vardiname bloku ir atskirai detalizuojame. Paprogrami algoritmai braiomi atskirai. Algoritme kreipiniui procedr yra skiriamas vienas atskiras elementas. Kreipinys funkcij yra iraikose, todl jam nra skiriamas atskiras elementas. Pabaiga. ia galima urayti struktrogramos antratje esant vard. Komentarai struktrogramoje raomi tuose elementuose, kuri veiksmus jie aikina. Juos galima surayti elemento viruje, apaioje arba alia veiksm, taiau siloma rayti taip, kad juos galima bt perkelti programos tekst be papildym arba pataisym. Pavyzdys. Uduotis. Turime reali skaii masyv. Reikia surasti ir paalinti didiausi skaii. Udavinio algoritmas Rasa iliustruoja kreipin procedr Did ir sudtin sakin Mesti. Atskirai yra parodytas procedros Did algoritmas. Sudtinio sakinio Mesti detalizacija rodoma atskirai tikslu logikai atskirti udavinio veiksm login sek nuo j detalizacijos. Toks algoritmo detalizacijos bdas naudojamas tuomet, kai algoritmas netelpa viename lape, nes algoritmo pradia ir pabaiga negali bti atskiruose lapuose: visas apraymas turi bti vieno staiakampio viduje.
Pradia. Rasa; mas = array [ 1..20 ] of real; A : mas; n : integer; i, d : integer; vesti ir spausdinti n, A(n). Did( A, n, d ) Mesti alinamas surastas didiausias elementas. Spausdinti rezultatus: A(n). Pabaiga. Pradia. Mesti; i := d, n-1; ai := ai+1; n := n-1; Pabaiga. Procedure Did( A : mas; n : integer; var k : integer ); k := 1; i := 1, n; ai > ak k := i; Pabaiga

59

Programavimo kultra.
Algoritmas ( programa ) tampa mogaus intelektualins veiklos produktu, skirtu tiek kompiuteriui, tiek mogui. Jis turi atitikti ir kompiuterio, ir mogaus reikalavimus. Kompiuterio keliami reikalavimai: algoritmas turi bti uraytas taip, kad j galima bt koduoti programavimo kalba ir, gaut program vykdant, gauti teisingus rezultatus. mogaus keliami reikalavimai: algoritmas turi bt toks, kad j galima btu kuo lengviau suprasti. Programa kompiuteriui gali bti charakterizuojama dviem dydiais: atminties kiekiu ir vykdymo trukme. Algoritmas mogui charakterizuojamas laiku, per kur mogus suvokia algoritm. Darbas su kompiuteriu bus skmingas, jei dirbantysis skaitydamas program sugai kuo maiau laiko, greitai ir lengvai j supras. Pagrindiniai programavimo kultros elementai: algoritmas parenkamas toks, kad jis kuo geriau tiktu duotam udaviniui sprsti: bt aikus, trumpas, logikai pagrstas; algoritme turi bti viskas, ko reikalauja udavinio slyga, bet neturi bti nereikaling element ar konstrukcij; veiksmai suraomi logikai pagrsta eils tvarka; algoritmo struktra turi bti aiki ir atspindti udavinio struktr; savarankikos algoritmo dalys apraomos procedromis bei funkcijomis su minimaliais ryiais tarp j; duomen tipai ir struktros parenkami taip, kad jie atspindt j atstovaujam objekt prasm; kintamuj, konstant, tip, procedr, funkcij vardai turi bti prasmingi ir galimai trumpesni; programos tekstas idstomas laikantis tam tikr logikai pagrst taisykli; komentarai turi susieti udavinio formuluot su algoritmu.

60

Programos raomos ne tiktai tam, kad jos teikt informacij kompiuteriui, bet ir tam, kad jas skaityt mons dl toki prieasi: programos labai retai ubaigiamos per pirm kart. Parayti ubaigt program reikia keletos dien ir netgi met. Danai reikia perirti k esi padars; programa labai retai i karto bna teisinga; tikrinimo procese ji perskaitoma kelis kartus i naujo; udavinys labai danai padalomas tarp keletos vykdytoj, kurie turi skaityti ir suprasti kit programas, kad galt tinkamai bendradarbiauti; program dalys danai naudojami kituose udaviniuose. Tam tikslui jas irgi reikia skaityti ir suprasti, kas daroma toje dalyje; programos danai yra keiiamos, nes keiiasi uduotis. Programos stilius vertinamas tokiais pat kriterijais kaip ir natralios kalbos stilius. Programos tekstas turi bti aikus, vaizdus, lengvai skaitomas ir suprantamas, save dokumentuojantis. Raydami program, turime galvoti, kaip padti skaitytojui.

Program komentarai
Komentar buvimas ar nebuvimas ir j turinys visai neturi takos programos darbui. Bet vartotojas, kuris skaitys program, gals pasirinkti k skaityti: tik komentar, ar vis program. Jis gali skaityti komentar, jei nori suinoti, k daro programa arba skaitys program, jei nors suinoti, kaip ji atlieka uduot. Komentarai program turi papildyti, bet netrukdyti j skaityti, todl juos siloma rayti programos deiniame krate. Komentar skliaustai pagal galimyb atitolinami nuo teksto, lygiuojami vertikaliai i abiej pusi (sudaromas komentarinio bloko vaizdas). Komentarai neturi trukdyti programos skaitymui, t.y. jie turi bti trumpi, lakoniki. Jie turi tik taikliai papildyti program, o ne ugoti j. Komentarus reikt atitolinti nuo programos teksto taip, kad akys j "nepastebt" ir lengvai atskirt. J neturi bti per daug, bet jie turi pakankamai dokumentuoti program, kad nebereikt kit dokument, iskyrus programos tekst ir instrukcj vartotojui. Komentarai gali uimti apie 20% programos apimties. Rekomenduojama rayti komentarus : programos pradioje po antrate ( arba prie ), nurodant programos paskirt, autori, programos sudarymo dat ir kitus duomenis; tip bei kintamj aprauose, nurodant j paskirt;

61

prie procedras, funkcijas, blokus, nurodant kokias funkcijas atlieka; prie iorinius modulius, blokus, nurodant j atliekam funkcij, jimo, ijimo duomenis; sakiniuose, paaikinant neaikios paskirties veiksmus, pavyzdiui, slygos sakinyje komentuoti atskirai then ir else dalis. Komentarai nuo programos teksto gali bt atskirti tuiomis eilutmis, jeigu jie uima vis eilut.

Taip nereikia rayti komentar apraant tipus ir kintamuosius: type tekstas = string ( 15 ); pazymiai = array [ 1..5 ] of integer; e = record pav, (* studento pavard *) vard : tekstas; (* jo vardas *) p : pazymiai; (* sesijos paymiai *) vid : real; (* sesijos vidurkis *) end; mas = array [ 1..50 ] of e; var if21, if22: mas; (* student sraai *) n, m: integer: (* sara ilgiai *) i, j: integer; s, v: real; Komentarai turt neugoti programos teksto: type teks = string ( 15 ); paz = array [ 1..6 ] of integer; egz = record pav, (* studento pavard *) vard : teks; (* jo vardas p : paz; (* sesijos paymiai vid : real; (* vidurkis end mas = array [ 1..50 ] of egz; var if21, if22 : mas; (* student sraai *) n, m, (* j ilgiai i, j : integer; (* pagalbiniai s, v : real; (* kintamieji

*) *) *)

*) *) *)

62

Program teksto raymo kultra


Tekstas raomas laikantis bendr raybos taisykli. Tarp odi paliekamas bent vienas tarpas. Paliekami tarpai tarp skyrikli ir odi pradi, tarp atskir sakini ir kitur, kur Paskalio kalba leidia nepalikti tarpo, taiau bendrosios raybos taisykls tam prietarauja. Pavyzdiui:
Taip nereikia rayti: var pirmas,antras,trecias:real; begin Read(pirmas,antras,trecias); WriteLn(pirmas,antras,trecias); end. Turt bti: var pirmas, antras, trecias: real; begin Read (pirmas, antras, trecias); WriteLn (pirmas, antras, trecias); end.

Programos sakiniuose vardus, odius ir kt. siloma rayti grupuojant, ilyginant pagal pozicijas. Tai leidia greiiau ir lengviau skaityti program, rasti joje klaidas, taisyti bei modifikuoti j. mogaus akys ir pasmon neapkraunama papildomu darbu iekant tekste ir iskiriant dedamsias dalis. Pavyzdiui:
Type zodis=string(15); inf=record v1:zodis; kitas:real; sveikas_sk:integer; end; sarasas=array[ 1..50 ]of inf; dok=record vardas:zodis; kiekis:integer; sar:sarasas end; mas = array[ 1..50 ] of real; var pirmas:inf;antras:sarasas; dokumentas:dok; a,b,c:mas; n,n1,n2,n3,i,j:integer; Type zodis = string ( 15 ); inf = record v1 : zodis; kitas : real; sveikas_sk: integer; end; sarasas = array [ 1..15 ] of inf; dok = record vardas : zodis; kiekis : integer; sar : sarasas; end; var pirmas : inf; antras : sarasas; dokumentas : dok; a, b, c : mas; n1, n2, n3 : integer; i, j, n : integer;

Taisyklingai raydami prarasime iek tiek laiko, taiau laimsime ymiai daugiau: taip raydami maiau padarysime klaid, greiiau jas pastebsime.

63

Programos teksto raymas.


Programos raymo stilius vertinamas tokiais pat kriterijais kaip ir natralios kalbos stilius. Programos tekstas turi bti aikus, vaizdus, lengvai skaitomas ir suprantamas. Tekstas lengviau suprantamas, jei jis patogiai idstytas lape, eiluts neperkrautos informacija, naudojami atitraukimai ir tarpai. Teksto idstymas turi: atitikti veiksm hierarchij ir prioritetus, atitikti login algoritmo struktr, naudoti atitraukimus sakini pavaldumui irykinti, naudoti tuias eilutes programos dalims iskirti ar skaitomumui pagerinti: tarp pagrindini dali iki trij tui eilui, tarp ne pagrindini - iki dviej, prie blok - vien. lygiuoti vertikaliai: then...else slygos sakinyje, begin...end blokuose, repeat...until kartojimo sakinyje, record...end apraymuose.
(* ------------------- komentar paalinimas --------------*) i := 1; while i <= n -1 do begin if ( a[ i ] = '(' ) and ( a[ i + 1 ] = '*' ) then (* radome atidaranius enklus *) begin pr := i; yra := false; (* iekome udarani enkl *) while ( i <= n - 1 ) and not yra do begin if ( a[ i ] = '*' ) and ( a[ i + 1 ] = ')' ) then yra := true; i := i + 1 end; if yra then begin g := i; ilg := g pr + 1; (* alinami komentarai *) for k := pr to n ilg do a[ k ] := a[ k + ilg ]; n := n ilg; i := i ilg + 1; end end else i := i + 1 end;

64

Programos moduli pradi sloma paymti komentar eilute, kurioje be skiriamosios linijos dar bt ir modulio vardas, pvz. : (*-------------- D a u g y b a ---*) Pabaig taip pat reikia paymti, taiau vardas nebtinas. Jeigu toliau seka kito modulio tekstas, tai jo pradios ym gali bti ankstesnio modulio pabaigos poymiu. Programos pagrindinio modulio pradi reikt paymti kitokia eilute, pvz.: (*==============*) Programinius modulius, esanius kit moduli viduje reikia paymti taip, kad bt akivaizdi j priklausomyb, pvz.: (*.............................. Raso ...*) (*.............. Raso ...*) (* ==> Raso <==*) Tuios eiluts kaip moduli skyrikliai nra labai akivaizds, tad jas tikslinga naudoti programos blok ar kit programos element atskyrimui. Programoje naudojami vardai raomi laikantis sutart reikalavim: programos, paprogrami vardai pradedami didiaja raide. Jeigu vard sudaro keli odiai, tuomet kiekvienas i j pradedamas didiaja raide; tarnybiniai (baziniai) odiai raomi i maosios raids; konstant vardai pradedami didiaja raide; programuotojo apraom duomen tip vardai pradedami maaja raide. Jeigu tipas yra sudtingos struktros ir vartojamas globaliai, tuomet vardas pradedamas i didiosios raids; kintamj vardai pradedami rayti: lokalini i maosios raids; tarnybini i maosios raids; globalini i didiosios raids kiekvienas odis, jeigu vardas sudurtinis; paprogrami parametr i didiosios raids, jeigu jie yra struktrinio tipo (vis, iskyrus standartinius paprastus duomen tipus); pagrindins programos duomen ir rezultat i didiosios raids kiekvienas odis, jeigu vardas sudurtinis; jeigu vardas standartinio tipo, tuomet i maosios raids; failo tipo vardai i didiosios raids.

65

Atminkime. Raydami programos tekst tvarkingai sugaiime daugiau laiko, taiau: paliksime maiau klaid; klaidas pastebsime greiiau; surasti klaidas bus lengviau; suderinsime program daug kart greiiau; legviau bus padaryti programoje pakeitimus, papildyti naujais veiksmais; didesns galimybs keistis tarpusavyje programomis ar j fragmentais; sudtingos programos raomos kolektyviai, bus lengviau sijungti profesionali programuotoj grup.

Programos apiforminimas
Prie programos tekst reikia surayti btiniausi informacij apie programos paskirt, jos galimybes, apribojimus vartotojui ir pan. Tikslinga tai grupuoti tokia tvarka : programos autorius, jo adresas ir kita btina bendravimui informacija; programos paskutins redakcijos data, versijos vardas; programos paskirtis, taikymo sritys; uduoties sprendimo bdas, metodas arba trumpa anotacija; programiniai apribojimai; kita informacija ( btina autoriaus poiriu ).
(* 1993.06.12. *************************************************) (* Petraitis Petras. KTU Informatikos fak. 1-as kursas, IF-2/5 grup *)
(*---------------------------------------------------------------------------------------------------------------*) (* Sutvarko duot darbuotoj sra profesijos ir darbo stao majimo tvarka *) (* Duomenys tekstiniame faile, kurio vardo paprays programa. Rezultatai bus Js *) (* nurodyto vardo tekstiniame faile. Naudojamas burbuliuko bdas. *) (*---------------------------------------------------------------------------------------------------------------*) (* Duomenys skaitomi masyv, kurio apimtis iki 1000 element. Duomen failo *) (* eiluts struktra: Pavard, vardas, profesija, profesins veiklos pradios data *)

(******************************************************************)

66

Atsakymai kontrolinius klausimus ir uduotis 1. tema. Atsakymai kontrolinius klausimus

1. Programos dalys: programos antrat, apraai, pagrindin dalis. 2. Visos Turbo Paskalio programos pradedamos antrats sakiniu: program <Programos vardas>; 3. Kintamj vardai sudaromi tik i lotynik raidi ir skaitmen, negali bti tarp, sintakss enkl, simboli. Vardas btinai turi prasidti lotynika raide. 4. Komentaras raomas, bet kurioje programos vietoje, kur galima rayti tarpo simbol, specialiuose skliaustuose: (* *) arba { }. 5. rezultat lang galima pereiti naudojant ekrano lang perjungimo komand Alt+F5. 6. Patikrinti ir vykdyti program galima komanda Ctrl+F9. 7. Tarnybiniai odiai: begin ir end vadinami operatoriniais skliaustais. 8. Skaiiavimai porgramoje uraomi priskyrimo sakiniais, kuri bendra struktra yra: <Kintamasis> := <Aritmetin iraika>; 9. Visi programos pagrindinje dalyje naudojami kintamieji, turi bti aprayti apra dalyje var tokio tipo sakiniais: <Vard sraas> : <Tipas>; 10. Aritmetins iraikos sudaromos i kintamj, konstant, funkcij sujungiant jas aritmetini operacij enklais bei skliaustais. 11. Aritmetinje iraikoje pirma atliekami veiksmai skliaustuose, po to dalyba, daugyba, o vliau sudtis ir atimtis. Vienodo pirmumo veiksmai atliekami i kairs den. 12. Veiksm tvark galima pakeisti skliaustais. 13. Raymo sakinio bendra struktra yra: WriteLn( Siuniam duomen sraas); 14. Duomen ivedimo ablonas: <Duomen elementas>:<Bendras lauko ilgis>; 15. Skaitymo sakinio struktra: ReadLn(<kintamojo vardas>); 16. Galimi du atvejai: kiekvien kintamj atskirai ir visus i karto. 17. Uklausa reikalingam, kad bt aiku kokius kintamuosius vesime kompiuterio atmint. 1. tema. Kontrolini uduoi atsakymai program Antroji; {progamos pradia} (*testo uduotis*)

1. b, c ir f. 2. Teisinga programa:

var sk : real; begin WriteLn(Jus sveikina kompiuteris!); WriteLn(veskite savo skaii ); ReadLn(sk); WriteLn( Js vedte: , sk:5:0); WriteLn(Ai, kad bendravote.) end. 3. a, c ir e. 2. tema. Atsakymai kontrolinius klausimus:

1. Valdani struktr inome du sakinius: slygos ir ciklo. 2. Slygos sakinio sintaks: if <Slyga> then <V1> else < V2>; 3. Slygos sintaks tokia: <I1> <Santykio opertacija> <I2>. 4. V1 ir V2 yra alternatyvos, apraytos operatoriais. 5. Santykio operacijos enklai yra: =, <>, <, >, <=, >= 6. Santykis gali gyti logines reikmes True ir False. 7. Jeigu santykis gyja reikm True, tai vykdoma alternatyva V1, o jeigu - False, tai vykdoma alternatyva V2. 8. Sutrumpintas slygos operatorius atrodys taip: if <Slyga> then <V1>; 9. Sutrumpintas slygos sakinys vartojamas tada, kai tam tikr operatori arba j grup reikia vykdyti arba ne, priklausomai nuo slygos, t. y. alternatyva yra tarp vykdymo ir nevykdymo. 10. Ciklo sakinio sintaks yra tokia: while <Slyga> do <Kartojimo sakinys arba j grup>; 11. Kartojimas vykdomas tol, kol slyga yra tenkinama, t.y. kol santykis gyja reikm True. 12. Norint, kad ciklas nebt begalinis reikia irti, kad slyga priklausyt nuo kartojamo sakinio rezultat. 13. Jeigu norim kartoti operatori grup, juos btina rayti operatoriniuose skliaustuose. Tokio sakinio sintaks bt: while <slyga> do begin <operatorius 1>; <operatorius2 >; ......... end;

67

14. Valdani struktr sakiniai danai vartojami duomen kontrolei. Jeigu tolimesniam udavinio sprendimui tinka ne bet kokios argument reikms, tai j vedim reikia organizuoti kartojimo sakinio pagalba taip, kad bt vesti tik tie duomenys, kurie tenkina slygas. 2. tema. Kontrolini uduoi atsakymai

1. Klaid paaikinimai: a) slygos sakinio viduryje kabliatakis nededamas. Sakinys turt atrodyti taip: if a<b then s := s + a else s := s +b; b) blogas santykio operacijos enklas. Sakinys turt atrodyti taip: if s >= 0 then d := Sqrt(s) else d := Sqr(s); c) vienodos alternatyvos negali bti. Sakinys pavyzdiui galt atrodyti taip: if k<> 0 then a := k+1 else a := k - 1; d) neteisinga raymo sakinio sintaks. Tekstas turi bti raomas apostrofuose. Itaisytas sakinys: d) if r=0 then WriteLn ( Tai nra apskritimas); 2. Bus atspausdinta: a=5.0 b= 5.0 c= 6 3. a) ciklas nebus begalinis. b) ciklas bus begalinis, nes kartojamas tuias sakinys ( taip vadinamas ;, paraytas po tarnybinio odio do). Nereikalingas ;. c) ciklas bus begalinis, nes kartojamas tik spausdinimo sakinys, o a reikm nesikeiia. Trksta operatorini skliaust. d) ciklas nebus vykdomas n karto. 4. Kartojimo sakinys atrodys taip: while x<10 do begin WriteLn( Js praoma vesti dvienkl skaii, o js vedte:, x); WriteLn( veskite dvienkl skaii i naujo); ReadLn(x) end; WriteLn( Ai, skaiius geras!); Atsakymai kontrolinius klausimus

3 tema.

1. Skaii srauto pabaig nustato kartojimo sakinio slyga. Ji parenkama pagal tai, koki skaii sraute negali bti. Daniausiai tai bna nulin argumento reikm. 2. Kaupimo udaviniuose daniausiai reikia dviej kintamj. Vienas vedamai argumento reikmei saugoti, o kitas - paiai kaupimo reikmei skaiiuoti. 3. Sumos kaupimo kintamajam reikia suteikti skaiiavimo pradioje nulin reikm. 4. Sudauginimo programa skiriasi nuo sumos skaiiavimo dviem operatoriais: sandaugos reikmei suteikiama vienetin reikm, o pats sandaugos skaiiavimo veiksmas bus uraomas operatoriumi s := s * x. 5. Kiekio skaiiavimo programa skiriasi nuo sumavimo tuo, kad prie senos riekms yra pridedamas vienetas, o ne argumento reikm, t.y. s := s+1; 6. Sumavimo veiksmas apraomas tokiu operatoriumi s := s+ <kintamasis>; 7. io operatoriaus prasm yra ta, kad abiejose priskyrimo enklo pusse yra pavartotas tas pats kintamojo vardas, bet jo reikms yra nevienodos laiko atvilgiu, t.y. nauja kintamojo reikm gaunama prie senosios pridjus tam tikr dyd. 8. Kaupimo kintamiesiems reikia suteikti tokias pradines reikmes, nuo kuri neprikalusyt rezultatas, nes jau pirmo kartojimo metu nuo senos kintamojo reikms skaiiuojama nauja. Tad svarbu, kokia buvo pradin reikm. 3 tema. Kontrolini uduoi atsakymai

1. i programa skaiiuoja vedamo skaii srauto sandaug. vedimas vykdomas tol, kol bus vestas nulis. 2. i programa, bet kokiu atveju, duoda nulin atsakym, o tai yra todl, kad pirma vedama nauja reikm, po to dauginama ir tik tada tikrinama pabaigos slyga. Vadinasi, vedus 0, jis bus sudaugintas su turima sandauga ir pavers j nuliu. Pataisyta programa atrodys taip: program Nul_ats; var ats, k : real; begin WriteLn( Darbas nutraukiamas vedus nul); ats := 1; WriteLn( veskite kintamojo reikm); ReadLn(k); while k<>0 do begin ats := ats * k WriteLn( veskite kintamojo reikm); ReadLn(k); end;

68

WriteLn( Atsakymas bus:, ats : 3 : 0); ReadLn; end. 3. Kartojimo sakinys atrodys taip: while k<>x do begin if x >0 then kt := kt + 1 else if x<0 then kn := kn + 1 else n := n + 1; k := x; WriteLn(veskite sekos nar); ReadLn(x) end; 4 tema. Atsakymai kontrolinius klausimus

1. Didiausios ir maiausios reikms iekojimo algoritmai dar vadinami ekstremum udaviniais. 2. Didiausios ir maiausios reikms iekojimo algoritmai skirstomi dvigrupes pagal tai ar reikia nustatyti didiausios (maiausios) reikms eils numer sraute , ar ne. O taip pat pagal tai i kokios aibs element iekosime ekstremumo. 3. Kai reikia surasti tik pat ekstremum var srityje reikia aprayti du kintamuosius, daniausiai baziniu odiu real. 4. Kai reikia nustatyti kelintas buvo tas didiausias (maiausias) elementas sraute, var srityje reikia aprayti tris kintamuosius: du - daniausiai baziniu odiu real, o treij - integer. nes jis reikia eils numer, kuris gali bti tik sveikas skaiius. 5. Didiausios reikms iekojimo slygos sakinys bus: if d < x then d := x; 6. Maiausios reikms iekojimo slygos sakinys bus: if m > x then m := x; 7. Tam kintamajam, kuris saugos didiaus ar maiausi reikm skaiiavim pradioje reikia suteikti tam tikr reikm. Daniausiai tai bna pirmoji reikm i srauto arba bet koks skaiius, u kur nra didesni, ar maesni sraute. 8. Tie kintamieji, kurie programos vykdymo metu gali gyti tik sveik skaii reikmes, var srityje apraomi baziniu odiu integer. 9. Nevisuomet ekstremumo saugojimo kintamajam galima suteikti pirm i srauto reikm, nes jeigu t sraut reikia perirti ne vis, o tam tikr poaib, tai jame gali nebebti didesni ar maesni reikmi. Pvz.: jeigu ekstremum reikia irinkti tik i tam tikr slyg patenkinani srauto reikmi, o pirmasis srauto elementas gali tos slygos netenkinti. 4 tema. Kontrolini uduoi atsakymai

1. Sakinys nevisuomet teisingas. Jis blogas tuo atveju, jeigu pirm dviej argument reikms tarpusavyje lygios. Pavyzdiui: a := 2, b := 2, c := 3. 2. Itaisytas jis atrodys taip: if a < b then if else if b < c then min := b else min := c; a <c then min :=a else min := b

3. Atsakymas ne visuomet bus teisingas. Jis bus teisingas tik tuomet, kai pirmoji srauto reikm bus neigiama. Kitais atvejais joks didiausias neigamas skaiius nebus didesnis u teigiam. 4. Pataisyta programa: program Klaida; var did, x : real; begin did := -1E + 06; WriteLn (veskite x); ReadLn(x); while (x<>0) do begin if x < 0 then if x > did then did := x; WriteLn (veskite x); ReadLn(x); end; Writeln(Didiausia neigiama reikm:, did :5:2); end. 5 tema. Atsakymai kontrolinius klausimus

1. Apdorojant duomen srautus, kiekvienai skaitomai srauto reikmei yra taikomi du veiksmiai: filtravimas ir apdorojimas. 2. Filtruojant yra nustatoma, ar reikm priklauso tiriamai duomen grupei, o skaiiuojant (apdorojant ) yra nustatomos vairios tiriamos grups charakteristikos. 3. Paprastos filtravimo slygos yra apraomos operatoriumi if ir santykiais.

69

4. Logins operacijos gali bti: not (neigimas), or (veiksmas arba), and (veiksmas ir), xor (grietas arba). 5. Logoniai kintamieji apraomi baziniu odiu boolean. 6. Pirmiausia atliekamas neigimas, po to operacija and (ir) ir pabaigoje or (arba). Natrali veiksm tvark galima pakeisti skliaustais. 5 tema. Kontrolini uduoi atsakymai 1. Sakinio dalis: if (x<0) then - atlieka srauto filtravim, o sakinio dalis: if (x > did) then did := x; atlieka apdorojim. 2. Sutrumpintas slygos sakinys atrodys taip: if (a<=b) and (a<= c) then else if min := a (a>=b) and (b<c) then min := b else min := c;

3. is sakinys reikalingas norint nustatyti ar trikampis yra lygiakratis. Sakinys teisingas, bet viena slyga yra perteklin. Suprastintass sakinys atrodyt taip: lk := (a=b) and (b=c); 6 tema. Atsakymai kontrolinius klausimus

1. Norint failin kintamj susieti su OS failu naudojama procedra Assign. 2. Procedra Reset atidaro fail skaitymui, o Rewrite - raymui. 3. Failo kintamj btina.aprayti taip: <Vardas>:<Failo tipas> 4. Norint nuskaityti duomenis i failo, reikia juos pirmiausiai tinkamai paruoti. Po to, naudojant procedr Reset, paruoti fail skaitymui ir procedr Read arba ReadLn pagalba jau galima skaityti. 5. Fail udarymui naudojama procedra Close. 6. Procedra Read skaito i failo tik tiek reikmi, kiek yra kintamj srae, o procedra ReadLn skaito visus duomenis iki eiluts pabaigos simbolio, o tik po to skirsto konkretiems kintamiesiems ir, jeigu reikmi yra per daug, jos atmetamos. 7. Procedra WriteLn skiriasi nuo Write tuo, kad ji, raydama duomenis fail, papildo j eilui pabaigos simboliais. 8. Loginmis funkcijomis EoLn ir Eof , skaitant duomenis i failo, galima tikrinti atitinkamai eilui ir failo pabaigos ymes 9. Duomenis, skaitomus i failo, reikia paruoti i anksto su tekstiniu redaktoriumi. Raant skaiius, juos reikia atskirti tarpais. rayti duomen fail reikia t pat katalog, kur yra ir j apdorojanti programa, arba procedroje Assign reikia nurodyti keli iki to failo. 6 tema. Kontrolini uduoi atsakymai.

1. Programa nra teisinga, nes t pat fail duomenys raomi ir i jo skaitomi. Pakanka panaikinti eilut ReadLn(f, sum); ir programa bus teisinga. 2. Bus atspausdinta: a=-3 b=2 c=5 d=-4, nes procedraReadLn perskaiiusi pirm eilut priskiria reikmes pirmiems trims kintamiesiems: a, b, c, o perskaiiusi antr eilut, priskiria reikm ketvirtam kintamjam, o kitos dvi yra perteklins. 3.Tada bus atspausdinta: a= -2 b= 1 c=0 d=0. 4. program Neig_skai; var x : integer; f, f1 : text; begin Assign(f, d.dat); Assign(f1, d1.dat); Reset(f); Rewrite(f1); while not Eof do begin Read(f, x); if x<0 then Write(f1,x); end; Close(f, f1); end. 7 tema. Atsakymai kontrolinius klausimus

1. Atsitiktiniai dydiai daniausiai naudojami kompiuteriu modeliuojant aidimus ir kai skaiiavimams reikalingi didesni skaii masyvai. 2. Funkcijos Random pagalba galima gauti atsitiktinius skaiius. 3. Programuojant aidimus, svarbu i anksto gerai apgalvoti ir aprayti programos scenarij (algoritm). 4. Funkcija Random gali neturi parametr, o jos generuojami skaiiai tolygiai pasiskirsto intervale.

70

5. Didesnes skaii sekas patog pakeisti atsitiktiniais dydiais, nes nesugaitama tiek daug laiko j vedimui i klaviatros, todl galima daugiau kart ir su vairesnmis reikmmis atlikti skaiiavimus. Lengviau tikrinti programos teisingum. 6. Norint, kad nenukentt skaiiavim tikslumas, reikia daugiau kart skaiiuoti ir lyginti rezultatus. 7 tema. Kontrolini uduoi atsakymai.

1.Priskyrimo sakinys raytas kartojimo sakin atrodyt taip: a := 5 - Random(10); 2. Rezultat sutapimas priklauso nuo vedam skaii. Jeigu pirmas vedamas skaiius nebus nulis, o tarp vedam skaii bus bent vienas 1, tai minimalus skaiius beveik visada sutaps ir bus lygus 1. Jeigu didiausias vedamas skaiius bus 10, tai atsakymai niekada nesutaps, nes apvalinant sugeneruotus skaiius niekada negausim 10. Jei didiausias vedamas skaiius bus 9, tada atsakymai daniausiai turt sutapti. Atsakymai kontrolinius klausimus

8 tema.

1. Ekrano spalv valdymo biblioteka naudojimui prijungiama uraant programos pradioje sakin: uses Crt; 2. Programos valdymo ir jos pateikiam duomen vaizdavimo priemons bei bdai yra vadinami programos ioriniu interfeisu. 3. Norint gauti isamesni ini, apie kuri nors Crt bibliotekos struktr, pakanka TP redaktoriaus lange surinkti jos pavadinim, prie jo perkelti kursori ir paspausti klavi por Ctrl +F1. 4. Ekrane koordinai pradia yra kairiajame virutiniame kampe ir to tako koordinats yra (1, 1). 5. prastinje koordinai sistemoje Y ais yra nukreipta vir, o ekrano ordinai ais yra nukreipta emyn. 6. Uraom procedra TextBackground(<spalva>), o po to ClrScr, kad pasikeist spalva. 7. Standartinis ekrano dydis pagal koordinates yra 80x25 8. Ekrano spalvoms gali bti tik pirmos atuonios spalvos 0..7 ir tik tos, kurias palaiko ekrano valdymo taisas, esanti kompiuterio viduje. 9. Ekrano spalvos nurodomos sveiku skaiiumi arba standartiniu odiu. 10. Norint gauti pulsuojani spalv prie spalvos kodo reikia pridti odel blink. 11. Norint grinti ekranui standartin spalv, programos pradioje reikia kintamojo TextAttr pagalba siminti spalvos kod, o po to j vl suteikti kintamajam TextAttr. 8 tema. Kontrolini uduoi atsakymai.

1. i programa neteisinga, nes po komandos TextBackground nra ekrano valymo procedros ir fono spalva nesikeis. Taip pat ne visuomet bus matomas uraas fonas: spalvos kodas, nes kartojimo metu teksto ir fono spalvos pirmam WriteLn bus vienodos. 2. Ji turt skirtingo fono ekrane, kitoka spalva spausdinti fono ir raidi spalv kodus ir po kiekvieno prayti paspausti ENTER. 3. program Spalvos; uses Crt; var j, ek : integer; begin ek := TextAttr; ClrScr; j := 1; while j <= 7 do begin TextBackground(j); ClrScr; TextColor(j+1); WriteLn(fonas:, j, ,, spalva: , j+1); j := j+1; WriteLn( Kai pasiirsite, paspauskite ENTER); ReadLn; end; TextAttr :=ek; ClrScr; end. 9 tema. Atsakymai kontrolinius klausimus

1. Sudtiniu sakiniu vadiname tok sakin, kuriame pavartoti operatoriniai skliaustai. 2. inomo kartojim skaiiaus sakinys atrodys taip: for <p> := <i1> to <i2> do <kartojamas sakinys>; 3. Ciklo parametro reikms gali bti tik sveiko tipo. 4. Jeigu i1<i2, tai kartojimo sakinyje vartojame.bazin od to, o jeigu i1 >i2 tai vartojame downto. 5. Simbolinio tipo kintamieji yra tokie, kurie programos darbo metu gyja simboli reikmes. 6. Simbolio kod galime suinoti panaudoj funkcij Ord. 7. Simbol galima parayti tiesiogiai kabutse arba naudojant funkcij Chr.

71

8. Funkcija Chr pagal kodo reik duoda simbol. 9. Simboliai lygimami pagal kod reikmes. 10. Pavyzdiui : 9 tema. Kontrolini uduoi atsakymai.

1. Kartojimo sakinys turt spausdinti praneim 5 kartus, nes jame ciklo parametro reikm gali keistis tik kas vienet, todl priskyrimo sakinys: i := i + 2; ia yra nereikalingas ir netgi klaidingas, todl kartais kompiuteris gali ir visai atsakymo neduoti. Tad is sakinys turt bti uraytas taip: for i := 1 to 5 do WriteLn('spausdinu ', i, ' -tj kart); 2. Norint, kad programa spausdint tik lygines i reikmes, reikia vartoti kartojimo sakin while. Jis usirayt taip: i := 2; while I <= 5 do begin WriteLn('spausdinu ', i, ' -tj kart); i := i + 2; end; 3. Spausdins taip: Intervale [a, b] sveik skaii suma = 40, nes kartojimo sakinys for atliekamas bent vien kart nepriklausomai nuo a ir b reikmi. Todl x bus priskirta a reikm, t.y. 40 ir prisumuota. Kartojimo sakin reikia pakeisti taip: for x := a to b do 4. Programa, vedus komentarus bus: program Kodai; uses Crt; var x : char; i, n : integer; begin ClrScr; Randomize; for i := 1 to 10 do begin n := Random(150); x := Chr(n); WriteLn(' Sugalvojau simbolio kod: ', n, ', j atitinka simbolis: ', x); end end. Priskyrimo sakin reikt pakeisti taip: n := Random(150) + 30; 10 tema. Atsakymai kontrolinius klausimus 1. Modulyje Crt yra trys garso valdymo procedros: Sound, Delay, NoSound. 2. Ciklo apraymui vartojamas operatorius while tuo atveju, jeigu kartojimo veiksmus reikia atlikti bent vien kart, o tik po to paaikja ar jie bus kartojami toliau. 3. Ciklo sakinyje while pabaigos slyga tikrinama pradioje ir todl kartojimai gali bti neatlikti n karto, o repeat atlieka kartojimus bent vien kart. Taip pat sakinyje while kartojimai vykdomi tol, kol pabaigos slyga gyja reikm true, o sakinyje repeat - false. 4. Ciko viduje skaiiavmus reikia organizuoti taip, kad j rezultai, kada nors kartojimo pabaigos slygai suteikt reikm false, o kitaip ciklas nesibaigs. 10 tema. Kontrolini uduoi atsakymai. 1. Programa neteisinga, nes garso valdymui, kaip ir spalv reikia naudoti modul Crt. program Melodija; {garsas} uses Crt; begin Sound(500); Delay(2000); NoSound; end. 2. vykd programa, 50 Hz danio garsin signal girdsime 2 sekundes. program Melodija; {garsas} uses Crt;

72

begin for j := 1 to begin Sound(500); Delay(2000); NoSound; Delay(2000); end; end.

do

3. Kartojimo nebus. Cikle esantys operatoriai bus atlikti vien kart, nes 6<10, o repeat kartojamas, kol slyg gyja reikm false. 4. Tokiu atveju ciklas bus begalinis, nes skaiiai 15, 18, 21 ir t.t. bus visada >10. Pabaigos slyga vis laik gys reikm false ir kartojimas vyks be pabaigos. 5. Priskyrimo ir kartojimo sakinys bus toks: x := 3; sum := 0; repeat sum := sum+x; x := x+3; until (x > 20); 6. Programa bus trumpesn naudojant kartojimo sakin repeat, nes program sudaro 14 eilui, o su while - 16, esant tam paiam sakini idstymui. program var Nuliai_sekoje; {ciklas repeat} k : integer; x : real; begin k := 0; WriteLn(Kai norsite baigti, veskite neigiam skaii); WriteLn; WriteLn(vedinkite sekos narius:); repeat ReadLn(x); if x = 0 then k := k + 1; until x < 0; if k = 0 then WriteLn( Js nevedte n vieno nulio) else WriteLn(Js vedte , k, nuli); end. program Nuliai_sekoje; {ciklas while} var k : integer; x : real; begin k := 0; WriteLn(Kai norsite baigti, veskite neigiam skaii); WriteLn; WriteLn(vedinkite sekos narius:); ReadLn(x) while x > 0 do begin if x = 0 then k := k + 1; ReadLn(x); end; if k = 0 then WriteLn( Js nevedte n vieno nulio) else WriteLn(Js vedte , k, nuli); end.

73

You might also like