Professional Documents
Culture Documents
A.vidziunas Programavimo Teorija
A.vidziunas Programavimo Teorija
A.vidziunas Programavimo Teorija
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
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
} }
} } }
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.
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.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)
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.
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);
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
} }
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 } }
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
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. K spausdins kompiuterio ekrane tokia programa? program alternatyva; var a, b, c : real; begin a := 5; if a+b > c if a+c <b
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.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
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.
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. 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?
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
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
Loginiai kintamieji apraomi baziniu odiu boolean. Pirmiausia atliekamas neigimas, po to operacija and (ir) ir pabaigoje or (arba). Natrali veiksm tvark galima pakeisti skliaustais.
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
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?
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.
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.
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.
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.
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.
35
36
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.
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.
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.
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
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?
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); (*
*) *) *)
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
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, b skaiiavimai
irinkti pagal x a: b: c: r := 2 r := 3 r := 6
57
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
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
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
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
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