Professional Documents
Culture Documents
Programavimo Pradmenys 10 Kl.
Programavimo Pradmenys 10 Kl.
Jonas Blonskis
Vytautas Buknaitis
Renata Burbait
IUOLAIKIKAS VILGSNIS
PROGRAMAVIMO PAGRINDUS
2
Turinys
VADAS ............................................................................................................................................................................ 4
1.
2.
PRAKTIKOS DARBAI........................................................................................................................................ 13
2.1.
2.2.
2.3.
2.4.
PIRAMID....................................................................................................................................................... 29
2.5.
2.6.
2.7.
2.8.
2.9.
2.10.
TAIKINYS........................................................................................................................................................ 64
2.11.
2.12.
GRAFIKOS PRADMENYS............................................................................................................................ 77
2.13.
2.14.
JUDESYS.......................................................................................................................................................... 84
2.15.
LAIKRODIS..................................................................................................................................................... 89
3.
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
3.7.
3.8.
3.9.
3.10.
3.11.
PROCEDROS.............................................................................................................................................. 104
3.12.
3.13.
4.
4.1.
3
4.2.
4.3.
4.4.
4.5.
4.6.
4.7.
4.8.
5.
4
Skaityk ne tam, kad prietarautum ir neigtum, ne tam,
kad ikart patiktum, ir ne tam, kad turtum apie k
kalbti, bet tam, kad mstytum ir svarstytum.
F. Bekonas
vadas
avdamiesi kompiuterio galimybmis daniausiai pamirtame, kad kompiuteris yra tik mogaus
sukurtos programos vykdytojas. Norint kompiuter efektyviai taikyti praktinje veikloje vien ini apie
kompiuterio darbo principus ir mokjimo dirbti taikomja programine ranga nebepakanka: pasitaiko problem,
kuri sprendimui paiam naudotojui reikia sugalvoti sprendimo keli (bd) ir parayti program. iuolaikins
taikomosios programos (pvz., skaiiuokl, tekst rengykl ir kt.) turi savo programavimo priemones, kurios
leidia iplsti j galimybes, pritaikyti jas konkreiai veiklos sriiai ar uduoiai sprsti. Programavimo inios,
gdiai ir gebjimas kurti nesudtingas programas yra labai naudingi bet kuriam kompiuterio naudotojui.
Imokti programuoti galima tik paiam kuriant programas. Todl mokymsi silome pradti nuo
praktikos darb. Knygos skyriuje Praktikos darbai rasite penkiolikos praktikos darb scenarijus. Jie visi
pateikiami FreePascal 0.6.4a versijoje. Kiekvienas scenarijus aprao, kaip ingsnis po ingsnio kuriama programa.
Labai svarbu prasti, paraius nors ir kelet programos eilui, skirt kokiam nors veiksmui atlikti, patikrinti
programos darb. Tik sitikinus, kad programa dirba ir ji dirba teisingai, galima j rayti toliau. Scenarijuose
vartojamos svokos ir terminai glaustai paaikinti knygos skyriuje Pagrindins struktrinio programavimo
svokos. J mokytis mintinai nra tikslo, taiau suvokti j prasm btina, norint skmingai dirbti su kitais
knygos skyriais, kita literatra.
Kiekvieno praktikos darbo pradioje rasite sra ini ir gebjim, kuriuos gysite atliekant t praktikos
darb. ia tai pat pateikiamos nuorodos skyri Pagrindins Paskalio kalbos konstrukcijos ir Kai kurie
praktikos darbuose naudojami algoritmai skyrelius. Skyriuje Pagrindins Paskalio kalbos konstrukcijos
pristatomos pagrindins Paskalio programavimo kalbos priemons ir konstrukcijos. Tai inyno pobdio
informacija. Skyriuje Kai kurie praktikos darbuose naudojami algoritmai apraomi klasikiniai algoritmai,
naudojami daugeliui vairaus tipo praktikos uduoi sprsti. i skyri informacija bus naudinga tiems, kas nors
pasitikslinti ar pagilinti inias ir gdius atliekant konkret praktikos darb.
Kiekvienas scenarijaus ingsnis tai tam tikra veikianios programos versija. Toks scenarij pateikimo
bdas leis kiekvienam mokiniui dirbti individualiai, mokytojui konsultuojant ar padedant, jei reikia. Atlikus
kiekvien darbo ingsn turime dirbani, bet dar nebaigt program. Darb galima tsti kit pamok arba
namuose nuo sekanio ingsnio.
Kiekvieno praktikos darbo pabaigoje gausu klausim ir uduoi, kurie pads kiekvienam sivertinti savo
inias ir gdius. Jie nra privalomi, taiau silome juos panagrinti ir atlikti. Jei kurie nors klausimai ar uduotys
yra per sunks, nepraleiskite j, pasistenkite juos veikti inagrinj teorin mediag, konsultuodamiesi su
mokytoju ar su klass draugais.
Pirmieji praktikos darb scenarijai yra pakankamai detals, vliau, programavimo gdiams ir inioms
tvirtjant, scenarijai nra tokie isams, paliekama daugiau laisvs saviraikai. Pirmieji ei praktikos darbai skirti
vadui programavim. Juos privalu atlikti. Kiti darbai skirti gautoms inioms ir gdiams tobulinti
programuojant sudtingesnes uduotis, todl nebtina j vis atlikti. Praktikos darb ciklas baigiamas paintimi
su Free Pascal grafikos priemonmis. ie darbai taip pat nra privalomi ir skirti tiems, kurie nori imokti gautus
rezultatus ekrane pateikti vaizdiai.
Mokiniams, jau turintiems pradinius programavimo gdius, alia praktikos darb silome individualiai
atlikti uduotis, pateiktas skyrelyje Uduotys savarankikam darbui. iems mokiniams taip pat bus naudingi
scenarij papildymai ir teorini skyreli mediaga, paymti odiu Smalsiems.
Besidomintiems programavimu knygos gale pateikiamas sraas nuorod, kurios leis rasti internete
daugiau informacijos rpimais klausimais.
Tikims, kad autori silomas programavimo pagrind mokymosi kelias bus jums domus, suprantamas
ir naudingas.
Skms!
Knygos autoriai
6
dien tvas sn pats per krykel perved ir paleido: irk man, eik ir nesidairyk!. Sieksnis,
tiesiai eidamas, pirmiausiai maln prijo ir vis dien malnininkui talkino. Trei dien tvas pats
sn mokykl nutemp.
iame epizode Sieksn galime laikyti nemstaniu algoritmo vykdytoju, kuris tiesiogiai
(nemstydamas ir neanalizuodamas) vykd tvo nurodymus.
Rezultatyvumas. Atlikus baigtin algoritmo veiksm (ingsni) skaii turi bti gaunamas
rezultatas. Vienas i galim rezultat gali bti ir toks, kai udavinys neturi sprendini.
Baigtumas. Rezultat gauname vykd baigtin algoritmo komand skaii.
Universalumas. Naudojant algoritm galima sprsti visus to tipo udavinius, t. y. kiekvienam
pradini duomen rinkiniui gaunamas teisingas rezultatas.
Yra daug udavini, kuriems sprsti nra tiksli algoritm. Pavyzdiui, reikia perveti mainomis daug
vairaus dydio tui di, kurias galima dti vienas kitas. Main su kroviniu skaiius turi bti kuo
maesnis. Net mogus, kuris pasiymi galimybe intuityviai sprsti toki uduot, ne i karto gaus geriausi
rezultat. Jeigu di daug, o mainas telpa nevienodas di skaiius, tuomet nemanoma perrinkti vis
galim sprendini ir tenka pasitenkinti kuriuo nors geresniu rezultatu. Tokio tipo udaviniams sprsti
kuriami algoritmai, vadinami euristiniais. Taikant euristinius algoritmus tinkamu rezultatu laikomas tas,
kuris tenkina mogaus poreikius.
Kiekvienas algoritmas gali bti apraomas skirtingais bdais:
Algoritmo uraymas odiais taikomas tuomet, kai norima labai aikiai nurodyti atliekamus
veiksmus. Uraant algoritm iuo bdu komandos gali bti numeruojamos, arba veiksmai apraomi
kaip pasakojimas.
Algoritmo uraymas grafine forma yra daug vaizdesnis u odin apraym. Labiausiai paplit du
grafiniai algoritm vaizdavimo bdai: simbolins (blokins) schemos ir struktrogramos.
Simbolinse schemose ir struktrogramose naudojami grafiniai simboliai apibria tam tikro tipo
komand. Simbolinse schemose grafinius simbolius jungianios linijos rodo, kokia tvarka atliekami
veiksmai. Sutarta, kad linijos eina i viraus apai ir i kairs dein. Visais kitais atvejais linijos
gale braioma rodykl, nurodanti tolesni veiksm krypt. Struktrogramoje komand vykdymo
tvarka nusakoma paiais grafiniais simboliais.
Algoritmai gali bti uraomi pseudokodu. is bdas skirtas mogui. Pseudokode vartojami odiai,
artimi natraliai kalbai. Pseudokodas vartojamas algoritmams urayti ten, kur aikinama algoritmo
esm vadovliuose, straipsniuose, nes juo algoritm galima urayti trumpiau ir suprantamiau.
Pavyzdiui, skaiiaus a klimo n-tuoju laipsniu algoritmas uraytas:
odiu
1. Suinoti a ir n reikmes.
2. Skaiiuoti kartai = 1.
3. Skaiiuoti laipsnis = 1.
4. Jeigu kartai <= n, tuomet vykdyti 5 ingsn, kitaip 8 ingsnis.
5. Skaiiuoti laipsnis = laipsnis a.
6. Skaiiuoti kartai = kartai + 1.
7. Pereiti prie 4 ingsnio.
8. Rezultatas yra laipsnis reikm.
pseudokodu
vesti: a, n;
laipsnis := 1;
kartoti n kart
laipsnis := laipsnis a;
spausdinti: laipsnis.
vesti: a, n
laipsnis := 1
laipsnis := 1
k := 1
k := 1
kol k n
laipsnis := laipsnis * a
Ne
kn
k := k + 1
Taip
laipsnis := laipsnis * a
k := k +1
Spausdinti: laipsnis
Pabaiga
Spausdinti: laipsnis
Pabaiga
Daugelyje straipsni ir mokomj knyg algoritmams urayti naudojamas pseudo Paskalio programavimo
kalba, kuri nuo tikrosios skiriasi labai nedaug. Taip atsitiko, nes Paskalio programavimo kalba buvo kuriama
kaip galint panaesn nekamsias kalbas, tikintis, kad pradedantiems mokytis programuoti bus lengviau.
1.2. Programa, programavimo kalba, struktrinis programavimas
Algoritmas, uraytas kuria nors programavimo kalba, yra vadinamas programa.
Programavimo kalba skirta algoritmams urayti. Programavimo kalba artima nekamajai, nes ji skirta
programuotojui. Programavimo kalbos abcl skirta kalbos konstrukcijoms sudaryti: vardams, apraams,
sakiniams. Kalba, kaip ir nekamoji, turi savo sintaks ir semantik. Programavimo kalbos kiekvienos
konstrukcijos, kiekvieno odio, kiekvieno sakinio prasm vienareikm ir baigtin. Programavimo kalb
yra labai daug. Nuo pirmosios programavimo kalbos, sukurtos 1954 m., iki dabar yra suskaiiuojama per
2500 kalb.
ioje knygoje programoms kurti naudosime Paskalio programavimo kalb, kuri artima angl kalbai. Taiau
norime pabrti, kad pati programavimo kalba yra tik priemon programavimo gdiams susidaryti, bet ne
mokymosi tikslas. Stengiams naudoti tas konkreios kalbos konstrukcijas, kurios yra bendros ar analogikos
kitose programavimo kalbose.
Programavimas tai procesas, kuris apima iuos etapus:
uduoties parengim,
uduoties analiz,
uduoties skaidym dalis,
sprendimo metod parinkim bei sukrim,
duomen struktr parinkim bei sukrim,
algoritm sudarym,
8
programos teksto raym, derinim, testavim.
Struktrinio programavimo, dar kartais vadinamo procedriniu, pradia yra laikoma XX amiaus
atuntojo deimtmeio pabaiga. Struktrinio programavimo esm labai paprasta: skaldyk ir valdyk.
Kiekvienas udavinys iskaidomas smulkesnes dalis, kurios programuojamos kaip atskiri udaviniai.
Kiekviena t dali skirta vienai grietai apibrtai veiksm sekai atlikti.
Programavimo terp (aplinka) tai aparatini ir programini priemoni visuma, skirta nauj programini
priemoni krimui. Paprasiausios programavimo terps, pavyzdiui, Free Pascal kalbos, turi teksto rengykl
program tekst (ir duomen) fail krimui ir taisymui, kompiliatori, programos redaktori, priemones
programai derinti ir vykdyti. Program tekstus galima rayti ir kitomis priemonmis, pavyzdiui NotePad,
taiau terp turi papildom funkcij, kuri nra kitose tekst rengyklse. Kompiliatorius, tai programa, kuri
veria parayt programos tekst kompiuteriui suprantam kalb. Jeigu randa raybos (sintaksini) klaid
(angl. Error), tai vertim nutraukia nurodydamas rastas klaidas.
program Vardas;
1.3. Programos struktra
Programos struktr (sandar) nulemia programavimo kalba. Vienos kalbos
apraymai
yra grietos struktros, kitose yra leistinos alternatyvos. Programos struktrai turi
takos ir programavimo technologija.
begin
Vadovlyje pateiktos programos paraytos Paskalio programavimo kalba,
veiksmai
laikantis struktrinio programavimo technologijos reikalavim. Programos
end.
tekstas visada skirstomas dvi dalis:
naudojam priemoni (konstant, kintamj, nauj tip, naudojam bibliotek) apraymas;
veiksm sakiniai.
then
else
begin
...
...
end
Kad programa bt aiki, lengvai ir greitai suvokiama bet kuriam naudotojui programos tekstas turi atitikti
login algoritmo struktr ir veiksm hierarchij. Raant program, reikt laikytis toki programavimo
kultros taisykli:
algoritm reikia parinkti tok, kad jis kuo geriau tikt duotam udaviniui sprsti, bt aikus,
trumpas ir logikai pagrstas;
tekst rayti laikantis bendr raybos taisykli. Tarp odi ir po skyrybos enklo palikti bent vien
tarp. Prie : ir := enklus reikt palikti tarp;
kintamj, konstant, tip, procedr, funkcij vardai turi atspindti juos atitinkani objekt
prasm, taiau neturi bti labai ilgi;
komentarai turi susieti udavinio apraym su algoritmu;
jei programoje naudojamos savarankikos algoritmo dalys, tai jos turi bti ireikiamos kuo maiau
tarpusavyje susijusiomis procedromis bei funkcijomis.
Tekst tikslinga rayti taip, kad atskiros dalys pagal prasm bt nesunkiai atpastamos ir suvokiamos. Tam
reikia j idstyti lape lyg kok piein, kur reikia paliekant didesnes traukas.
Pavyzdiui, itaip parayt tekst sunku skaityti:
var pirmas,antras,trecias:real;
begin
Read(pirmas,antras,trecias);
WriteLn(pirmas,antras,trecias);
...
end.
Danai programos tekst padeda suprasti komentarai, kurie skirti programos naudotojui (programuotojui) ir
visai neturi takos programos vykdytojui (kompiuteriu). Komentarai neturi trukdyti skaityti program, t. y. jie
turi bti trumpi, taikliai papildyti program, bet jos neugoti. Komentarai gali sudaryti apie 20 % visos
programos apimties.
Raant komentarus, rekomenduojama:
programos pradioje po antrate (arba prie j) nurodyti programos autori, paskirt, paskutinio
taisymo dat, versijos numer, taikymo sritis, uduoties sprendimo bd, programinius
apribojimus;
kintamj aprauose nurodyti j paskirt;
prie ciklus, procedras, funkcijas, sakini blokus nurodyti j paskirt;
paaikinti neaikios paskirties veiksmus, pavyzdiui, slygos sakinyje komentuoti atskirai then
ir else dalis;
10
jei komentarai uima atskir eilut, nuo programos teksto juos galima atskirti tuiomis
eilutmis.
Pavyzdiui, programos fragment sunku skaityti:
var
Kad programa bt aikesn ir j bt lengviau skaityti, apraant kintamuosius reikt juos grupuoti pagal
prasm ir lyginti pagal pozicijas, o komentarus pateikti darant vienodas traukas. Anksiau pateikt
programos fragment silome rayti taip:
var
ugis1 :
metai1 :
amzius1:
svoris1:
ugis2 :
metai2 :
amzius2:
svoris2:
// Pirmojo
real;
//
integer;
//
integer;
//
real;
//
// Antrojo
real;
//
integer;
//
integer;
//
real;
//
mokinio duomenims:
giui,
gimimo metams,
amiui,
svoriui.
mokinio duomenims:
giui,
gimimo metams,
amiui,
svoriui.
Taisyklingai raydami, prarasime iek tiek laiko, taiau laimsime kur kas daugiau maiau padarysime
klaid, greiiau jas pastebsime.
1.5. Dialogas tarp programos ir naudotojo
Tarp naudotojo ir kompiuterio danai vykdomas dialogas. Pavyzdiui, vedant duomenis klaviatra, btina
ivesti ekran praneim, kad kompiuteris laukia duomen vedimo, paaikinti, k naudotojas turi vesti ir,
jeigu reikia, nurodyti vedimo form ir eils tvark. Pavyzdiui, toks programos fragmentas pareigoja laukti,
kol vesime vien skaii (taiau neaiku, realj ar sveikj):
...
WriteLn('veskite apskritimo spindul');
ReadLn(R);
...
Dialogo tekstas, praneimai, nurodymai turi bti lakoniki, informatyvs ir vienareikmikai suprantami.
Praneimai neturi bti susij su programos kintamj vardais, jeigu jie nra informatyvs, pavyzdiui:
...
WriteLn('veskite a reikm: ');
ReadLn(a);
...
...
WriteLn('veskite preks kain: ');
ReadLn(a);
...
Pirmajame dialoge neaiku, kas yra a. Antrajame dialoge aiku, jog reikia vesti preks kain, nebtina
inoti, kad kaina programoje turi vard a.
Projektuojant programos struktr, reikt atskirti dialogo ir skaiiavim dalis, nes j skirtingi tikslai.
Dialogas skirtas bendravimui su programos naudotoju, o skaiiavimai apdoroja duomenis. Dialogo tikslas
gauti tam tikr informacij. Jis gali bti danai keiiamas, pertvarkomas, papildomas. Tai gali bti susij ne
tik su kalbos tobulinimu, bet ir su technini galimybi pasikeitimu.
1.6. Bendras programos krimo planas
1. Pradini duomen ir bsim rezultat analiz. Isiaikinama, kiek yra pradini duomen, kiek bus
rezultat, kokie j tipai, kokia tvarka juos pateikti.
11
2. Udavinio sprendimo idja tai mintis (sumanymas), kaip sprsti udavin. Idjos teisingumu galima
sitikinti modeliuojant programos veiksmus su vairiais kontroliniais duomenimis. inoma, pirmiausia
reikia patikrinti idj su slygoje pateiktais duomenimis siekiant gauti rezultatus, sutampanius su
slygoje pateiktais rezultat pavyzdiais.
Jeigu modeliuojant negaunama reikiam rezultat arba paaikja, kad sprendimo kelias pernelyg
sudtingas, neracionalus, tai iekoma kito bdo udaviniui sprsti. Bt gerai, kad tik sitikinus, jog
sugalvotas sprendimo bdas teisingas, bt pradta rayti programa.
3. Duomen struktr parinkimas pradiniams duomenims ir rezultatams siminti. Nuo io ingsnio i
esms priklauso programos apimtis, struktra, algoritmas ir jo gyvendinimas.
4. Algoritmo sukrimas tai udavinio sprendimo idjos gyvendinimas. Daniausiai tam pritaikomi
inom matematini udavini sprendimo bdai naudojant konkreias duomen struktras. Algoritmo
sudtingumas paprastai priklauso nuo pasirinkt duomen struktr. Duomen struktros, tai
kompiuterio atmintins paskirstymo bdas duomenims saugoti. Jeigu iame etape paaikja, kad
algoritmas pernelyg sudtingas, tuomet reikia keisti duomen struktras arba net udavinio sprendimo
bd. Jei metodo nerandama, tuomet tenka sprsti uduot euristikai.
5. Programos raymas tai sukurto algoritmo uraymas konkreia programavimo kalba. Programa
raoma struktriniu principu (nedidelmis dalimis). Pageidautina kiekvien dal pirmiausia atskirai
suderinti, t. y. sitikinti, kad jau turima programos dalis duoda reikiamus rezultatus, dirba teisingai. Tai
leidia program rayti ingsnis po ingsnio. Kai derinamo teksto dalys nedidels lengviau ir greiiau
gaunama galutin programa.
6. Testavimas. Parayta programa testuojama, kad sitikintume, kad norimas rezultatas pasiekiamas
visiems galimiems teisingiems pradini duomen rinkiniams. Programuotojas turt sukurti kuo
vairesni pradini duomen rinkini, kurie tikrint prastas bei ribines situacijas, sprendimo efektyvum
atmintins kiekio ir vykdymo laiko poiriu. Jei pradini duomen rinkiniai turi bti dideli, gali tekti
parayti program, generuojani pradini duomen rinkinius. Atkreipiame dmes, kad tai btinas
programos raymo etapas, net ir per olimpiadas.
ie etapai nra atliekami nuosekliai. Kiekvienu momentu gali prireikti sugrti vienu ar keliais ingsniais
atgal. Nepatartina skubti, nes vliau gali tekti rayti program i naujo.
Programos naudotojui btinas apraymas, kaip naudotis programa. Aprayme paprastai pateikiama tokia
informacija:
programos paskirtis, jos panaudojimui btina aparatin ir programin ranga, diegimas (jeigu btina);
programos naudojimo instrukcija, kuri aprao programos vykdymo galimas situacijas;
pradini duomen pateikimo forma, kiek ir koki duomen reikia vesti;
rezultat paaikinimas, j susiejimas su pradiniais duomenimis.
1.7. Trumpa Paskalio ir C++ programavimo kalb atsiradimo istorija
Algoritmus galima urayti vairiomis programavimo kalbomis. Programavimo kalb sukurta labai daug ir
atsiranda vl nauj. Daugelio programavimo kalb pagrindins konstrukcijos yra panaios. Schemoje
pateikta populiari mokymuisi skirt Pascal ir C++ programavimo kalb supaprastinta trumpa atsiradimo
istorija. ia parykinti dviguba linija blokeliai rodo dabar vartojam mokymui Paskalio ir C++
programavimo kalb sukrimo datos. Nuo to laiko tos kalbos buvo modifikuojamos ir papildomos naujomis
galimybmis. Plaiau apie kalbas ir j istorija galite rasti internetiniame puslapyje, kuris pateiktas knygos
pabaigoje.
12
Fortran 1954.11
CLU 1974
Fortran I 1956.10
Pascal 1970
Modula 1975
Mesa 1977
IAL 1958
Algol 58 1958
Algol 60 1960
SimulaI 1964
C 1971
C++ 1983
13
2.
Praktikos darbai
darbalaukyje.
14
Skmingai vykd komandas,
patenkate Free Pascal
terp (toliau FPS). Tai
Windows tipo langas su
pagrindiniu
meniu
ir
priemoni juostomis, kaip
tekst
rengyklje
ar
skaiiuoklje. Jei programos
langas uima ne vis ekran,
o tik jo dal, darbo lang
galima padidinti prastomis
priemonmis.
Pagrindiniame
komandas:
meniu
parinkite
RinkmenaKurtiprogram.
arba
kombinacij
15
FPS redaktoriaus lange, po bazinio odio program, vietoj odio Bevard0 raykite od Darbas1.
Toks bus Js pirmosios programos vardas.
Toliau pagrindiniame meniu parinkite komandas:
Rinkmenarayti kaip...
16
Kaip ir ankstesniame ingsnyje, kuris programos vykdymo bdas jums pasirodys geriausias, t toliau ir
naudokite.
Rezultat lang galima udaryti paspaudiant klaviatros klavi Enter arba gerai jums inom lang
. Neudar rezultat lango negalsite redaguoti programos.
valdymo mygtuk
gij pakankamai patyrimo nordami
paspartinti darb FPS aplinkoje penkt
ingsn galite ir praleisti. Prie
vykdant program, jeigu ji buvo
redaguota (keista ar papildyta), ji bus
i naujo sukompiliuota ir vykdyta, jei
ne tik vykdyta.
Iskleiskite darbo pradioje sukurt katalog Darbas1 ir pairkite, kiek ir koki fail buvo sukurta.
Svarbiausias failas yra Darbas1.pas, nes jame yra programos tekstas. fail reikia saugoti. I io failo
sukuriami kiti tokio paties pavadinimo failai Darbas1 su skirtingais prievardiais, bei kiti pagalbiniai failai.
Septintas ingsnis. Pakeiskite ankstesn program taip, kad j vykdius, alia odio Labas bt
uraytas ir Js vardas.
FPS programos tekste eilut WriteLn('Labas'); pakeiskite tokia:
WriteLn('Labas. Mano vardas Vytautas!');
Atlikus pakeitim programa bus tokia:
program Darbas1;
begin
WriteLn('Labas. Mano vardas Vytautas!');
ReadLn;
end.
ir vykdykite program, t. y. pakartokite penkt ir et ingsnius, arba tik et ingsn. vykd program
ekrane turtumte matyti:
Labas. Mano vardas Vytautas!
Kaip pastebite, kiekvienas WriteLn sakinys, vykdant program ekrane urao po vien tarp apostrof
urayt eilut.
Programoje WriteLn pakeiskite Write.
Write('********************************');
17
Write('* Labas. Mano vardas Vytautas! *');
Write('********************************');
Pastebjote, kad vietoj WriteLn paraius procedr Write, upildoma pirma eilut (eilutje telpa 80
simboli), po to pradedama pildyti antra eilut.
Papildykite program taip, kad prie vard ir po vardu bt spausdinamas i vaigdui sudarytas
ornamentas:
*
*
*
*
*
*
*
*
*** *** *** *** *** *** *** ***
*
*
*
*
*
*
*
*
* Labas. Mano vardas Vytautas! *
*
*
*
*
*
*
*
*
*** *** *** *** *** *** *** ***
*
*
*
*
*
*
*
*
Black = 0;
Blue = 1;
Green = 2;
Cyan = 3;
Red = 4;
Magenta = 5;
Brown = 6;
LightGray = 7;
DarkGray = 8;
LightBlue = 9;
LightGreen = 10;
LightCyan = 11;
LightRed = 12;
LightMagenta = 13;
Yellow = 14;
White = 15;
Blink = 128;
Nordami pakeisti rezultat ekrano spalvas, turjome prisijungti bibliotek Crt. Ji prijungiama sakiniu
uses Crt; Sakinys raomas antroje programos eilutje. Procedra TextBackground nurodo, kokia
bus teksto fono spalva, o TextColor kokia bus teksto spalva.
vykd program ekrane turtumte matyti geltonos spalvos tekst raudoname fone.
Pakeiskite teksto fono spalv ali (Green), o teksto spalv mlyn (blue).
Nordami, kad skirtingose eilutse uraytas tekstas ir/ar jo fonas bt skirtingos spalvos, spalvas btinai
apraykite prie WriteLn eilut. Pvz.:
program Darbas1;
uses Crt;
begin
TextBackground (Green);
TextColor(Blue);
WriteLn('Labas. Mano vardas Vytautas!');
TextBackground (Red);
TextColor(Yellow);
WriteLn('Viso gero.');
ReadLn;
end.
vykdykite i program. Tekstas 'Labas. Mano vardas Vytautas! bus mlynos spalvos aliame
fone, o tekstas Viso gero. Bus geltonos spalvos raudoname fone.
18
Deimtas ingsnis. Darbo su FPS pabaiga.
Tai galima atlikti pagrindinio meniu komandomis: RinkmenaBaigti darb (angl. FileExit)
arba paspaudiant FPS lango udarymo mygtuk
deiniajame virutiniame darbo lango kampe.
Raydami program ir baigdami darb FPS aplinkoje nepamirkite program rayti standiajame
kompiuterio diske. Tai galima atlikti vienu i trij bd:
pagrindinio meniu komandomis: Rinkmenarayti;
Klausimai
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Uduotys
1. Paraykite program, kuri ekrane (arba faile) i skirting spalv vaigdui nupiet Js vardo ir
pavards pirmj raidi derin.
2. Paraykite program, kuri ekrane nupiet js sugalvot ornament.
Smalsiems
Nordami darbo rezultatus matyti ne kompiuterio ekrane, o tekstiniame faile, tursite:
vykd program matysite tui juod ekran, nes visa informacija bus saugoma tekstiniame faile
Darbas1.txt, kuris yra sukuriamas tame paiame kataloge, kuriame saugomas ir programos failas.
19
Matome, kad raant procedr WriteLn, pirmiausiai uraomas failo kintamasis Fr, po to tarp apostrof
raomas tekstas, kur norsime matyti rayt tekstiniame faile.
Savo sukurt program papildykite, kad tekstas ir ornamentas, kurie buvo ivedami ekran, bt
spausdinami tekstin fail.
20
2.2. Ilaidos kambario remontui
Atlikdami darb isiaikinsite, kaip kuriama paprastus skaiiavimus atliekanti programa:
imoksite aprayti sveikojo ir realiojo tipo kintamuosius,
isiaikinsite, kaip perskaitomos ir simenamos kintamj reikms,
suprasite, kaip uraomi ir atliekami vairs skaiiavimai,
pritaikysite raymo procedras Write ir WriteLn rezultat ivedimui ekran.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.1. Kintamasis, kintamojo reikm
94
4.1. Tiesinis algoritmas
103
3.2. Priskyrimo sakinys
94
3.3. Duomen vedimas klaviatra
95
3.4. Rezultat (duomen) ivedimas ekrane 96
Uduotis. inomi kambario imatavimai (metrais) ilgis ir plotis. Abu dydiai yra sveikieji skaiiai.
Reikia apskaiiuoti, koki pinig sum psuma kainuos ikloti kambario grindis plytelmis, jei plyteli vieno
kvadratinio metro kaina yra m2kaina lit. Plyteli reikia pirkti 5 % daugiau galimiems nuostoliams
padengti.
Udavinio sprendimo algoritmas:
Paraykite kintamojo ilgis reikms vedimo klaviatra sakinius: praneimo, koki reikm vesti,
sakin Write ir reikms skaitymo sakin Readln.
Isaugokite ir vykdykite program.
program Darbas2;
21
var ilgis, plotis : integer;
// Kambario imatavimai
begin
WriteLn('Programa darb pradjo.');
Write('veskite kambario ilg: '); ReadLn(ilgis);
ReadLn;
end.
Paraykite kintamojo plotis reikms vedimo klaviatra sakinius: praneimo, koki reikm vesti,
sakin Write ir reikms skaitymo sakin ReadLn. Galite kopijuoti kintamojo ilgis reikms vedimo
sakinius ir vietoje kintamojo vardo ilgis parayti plotis.
Isaugokite ir vykdykite program.
program Darbas2;
var ilgis, plotis : integer;
begin
WriteLn('Programa darb pradjo.');
Write('veskite kambario ilg: '); ReadLn(ilgis);
Write('veskite kambario plot: '); ReadLn(plotis);
Readln;
end.
Paleid vykdyti program, klaviatra surink skaii 5
Programa darb pradjo.
ir skaii 4, bei paspaud po kiekvieno i j Enter
veskite kambario ilg: 5
klavi, ekrane matysite:
veskite kambario plot: 4
22
Paleid program, klaviatra surink skaii 5 ir
skaii 4, bei paspaud po kiekvieno i j Enter
klavi, ekrane matysite:
Programa
veskite
veskite
Kambario
Programa
darb pradjo.
kambario ilg: 5
kambario plot: 4
plotas: 20
darb baig.
Penktas ingsnis. inodami kambario plot apskaiiuosime, kiek kainuos kambar ikloti plytelmis.
Plyteli reikia pirkti 5 % daugiau galimiems nuostoliams padengti. Dabar reikia apskaiiuoti, kiek jos
kainuos, kai inoma vieno m2 kaina. Pinig suma, skirta kambario remontui, gali bti skaiiuojama uraius
priskyrimo sakinius:
psuma := plotas * m2kaina + 0.05 * plotas * m2 kaina;
arba
psuma := 1.05 * plotas * m2kaina;
Klausimai
1. Koks bazinis Paskalio programavimo kalbos odis yra naudojamas sveikojo tipo kintamiesiems
aprayti?
2. Koks bazinis Paskalio programavimo kalbos odis yra naudojamas realiojo tipo kintamiesiems
aprayti?
3. Apraykite du sveikojo tipo kintamuosius: mokinio amius (metai) ir mas (kilogramai).
4. Apraykite realiojo tipo kintamj: mokinio gis (metrai).
5. K reikia raktinis odis var, kam jis naudojamas ir kurioje programos vietoje jis raomas?
6. Kokie du sakiniai naudojami kintamojo reikmei vesti? Uraykite pavyzd kintamojo greitis
reikmei vesti.
7. Ar galima vienu sakiniu ReadLn vesti kelias kintamj reikmes? Jeigu galima, uraykite pavyzd.
8. Kam programos pabaigoje reikalingas sakinys ReadLn;?
23
Uduotys
1. Paraykite program, skaiiuojani, kiek lap popieriaus k reiks visos klass mokini
konspektams nukopijuoti, jei inomas klass mokini skaiius n ir kiek lap m sudaro konspekt.
Pasitikrinkite: ved n = 20 ir m = 10, turtumte gauti k = 200.
2. Laikrodis rodo x valand ir y minui. Paraykite program, kuri apskaiiuot kiek minui m ir
kiek sekundi s prabgo nuo vidurnakio. Programoje naudokite sveikj skaii tip longint
(dideliems sveikiesiems skaiiams).
Pasitikrinkite: ved x = 3 ir y = 5, turtumte gauti: m = 185, s = 11100.
3. iandien Tautvydas venia gimtadien. Jam sukanka a met. Paraykite program, kuri
apskaiiuot kiek mnesi men, dien d ir valand v Tautvydas jau pragyveno iame pasaulyje.
Programoje naudokite sveikj skaii tip longint. Sprsdami udavin laikykite, kad metai turi
365 dienas. Pasitikrinkite: ved a = 16 turtumte gauti: men = 192, d = 5840, v = 140160.
4. Paraykite program, skaiiuojani, kiek knyg k vidutinikai per metus perskaito vienas mokyklos
bibliotekos lankytojas, jei bibliotekinink pateik vidutin per vien mnes perskaityt knyg
skaii v ir vidutin bibliotekos lankytoj skaii n per metus. Sprsdami udavin naudokite
standartin Paskalio funkcij Round, kuri suapvalins knyg skaii iki sveikojo skaiiaus.
Pasitikrinkite: ved v = 120, n = 800, turtumte gauti k = 2.
5. Paraykite program, skaiiuojani, kiek keleivi k vidutinikai vaiuoja viename traukinio vagone
Vilni, jei inomas traukinio keleivi skaiius n, keleivi, vykstani ne Vilni skaiius nv ir
vagon skaiius v. Sprsdami udavin naudokite standartin Paskalio funkcij Round, kuri
suapvalins keleivi skaii iki sveikojo skaiiaus. Pasitikrinkite: ved n = 100, nv = 20 ir v = 4,
turtumte gauti k = 20.
6. Paraykite program, skaiiuojani staiakampio, kurio virutinio kairiojo tako (x1; y1) ir apatinio
deiniojo tako (x2; y2) koordinats yra sveikieji skaiiai vedami klaviatra, plot s ir perimetr p.
Staiakampio kratins lygiagreios koordinai aims. Pasitikrinkite: kai x1 = 0, y1 = 5, x2 = 4, y2
= 0, turi bti spausdinama: Staiakampio plotas s = 20 kvadr. vnt., staiakampio perimetras p = 18
vnt.
7. Takai A (x1;y1) ir B (x2; y2) yra atkarpos galai. J koordinats vedamos klaviatra. Atkarpa AB
yra skritulio skersmuo. Paraykite program, skaiiuojani skritulio plot s ir jo centro koordinates
xc ir yc. Pasitikrinkite: kai x1 = 0, y1 = 0, x2 = 0, y2 = 4, turi bti spausdinama: Skritulio plotas s
= 12.57 kvadr. vnt., skritulio centro koordinats: xc = 0, yc = 2.
8. Paraykite program, kuri sukeist kintamj x ir y reikmes vietomis. Raant program negalima
naudoti papildom kintamj. Pasitikrinkite: kai x = 0, y = 5, turi bti spausdinama: Sukeit x ir y
reikmes vietomis, gauname: x = 5, y = 0.
9. inomas laikas, ireiktas sveikaisiais skaiiais: m, s (ia m minuts ir 0 < m 59, s sekunds ir
0 < s 59, be to m s). Paraykite program, kuri kompiuterio ekrane spausdint, kok kamp ms
(skaiiuojant pagal laikrodio rodykl) sudaro minui ir sekundi rodykls ir kiek maiausiai
laiko minutmis tm ir sekundmis ts turi praeiti, kol laikrodio minui ir sekundi rodykls sutaps.
Pasitikrinkite: kai m = 12, s = 15, turi bti spausdinama: Kampas tarp minui ir sekundi
rodykli ms = 18 laipsni. Kad rodykls sutapt, turi praeiti tm = 0 minui (-s) ir ts = 58
sekundi (-s).
24
2.3. Gros atidavimas maiausiu banknot ir monet skaiiumi
Atlikdami darb isiaikinsite sveikj skaii dalmens sveikosios dalies ir liekanos skaiiavim:
imoksite tinkamai urayti sveikj skaii dalybos operacijas;
tvirtinsite kintamj apraymo, tinkamo pradini duomen vedimo ir rezultat pateikimo
gdius.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.1. Kintamasis, kintamojo reikm
94
4.1. Tiesinis algoritmas
103
3.2. Priskyrimo sakinys
94
3.3. Duomen vedimas klaviatra
95
3.4. Rezultat (duomen) ivedimas ekrane 96
Uduotis. Parduotuvje pardavja nori pirkjui gr g Lt (g sveikasis skaiius) atiduoti maiausiu 1, 2, 5
Lt nominalo monet ir 10, 20, 50 ir 100 Lt banknot skaiiumi. Reikia apskaiiuoti, kiek kokio nominalo
monet ir banknot pardavja turs atiduoti pirkjui.
Udavinio sprendimo algoritmas:
pirmiausiai imame didiausio nominalo banknot (100 Lt) ir gr g daliname i 100 ir
skaiiuojame sveikj dalmens dal. Gautas rezultatas yra 100 Lt nominalo banknot skaiius
k100;
nordami apskaiiuoti, kokia pinig suma liko nepanaudota, galime gr g dalinti i 100 ir
apskaiiuoti dalmens liekan. Tai bus nauja gra g. Likusi gros g dalis gali bti skaiiuojama ir
kitaip: g = g - k100 * 100;
pirmuosius du veiksmus kartojame su vis nominal monetomis ir banknotais.
Pavyzdiui, jei pardavja pirkjui turi atiduoti g = 75 Lt gr, tai jai reiks vieno 50 Lt, vieno 20 Lt
banknot ir 5 Lt monetos.
25
Paleid program, klaviatra surink skaii 75 ir paspaud klavi Enter, ekrane matysite:
veskite pirkjo gr: 75
Treias ingsnis. Papildomas programos kintamj, skirt rezultatams kiekvieno nominalo banknot ar
monet skaiiui sraas. Rezultat skaiiavimas ir rodymas ekrane.
Papildykite program naujais sveikojo tipo kintamaisiais k100, k50, k20, k10, k5, k2 ir k1,
skirtais kiekvieno nominalo banknot ar monet skaiiui saugoti.
Uraykite priskyrimo sakin, skaiiuojant, kiek reiks 100 Lt nominalo banknot k100 grai atiduoti:
k100 := g div 100;
Uraykite priskyrimo sakin, skaiiuojant, kokia pinig suma g liks, atidavus k100 100 Lt banknot:
g := g mod 100;
arba
g := g - k100 * 100;
Toliau raome priskyrimo sakinius, skaiiuojanius 50, 20, 10, 5, 2 ir 1 Lt nominalo banknot ar monet
skaii.
program Darbas3;
var g : integer;
k100, k50, k20, k10, k5, k2, k1 : integer;
begin
Write('veskite pirkjo gr: '); ReadLn(g);
k100 := g div 100; g := g mod 100;
k50 := g div 50; g := g mod 50;
k20 := g div 20; g := g mod 20;
k10 := g div 10; g := g mod 10;
k5
:= g div 5;
g := g mod 5;
k2
:= g div 2;
g := g mod 2;
k1
:= g;
ReadLn;
end.
Programos pabaigoje prie sakin ReadLn paraykite rezultat spausdinimo ekrane sakinius:
WriteLn('Pardavja gr atiduos taip:');
WriteLn('-----------------------------');
WriteLn('100 Lt ------ ', k100);
WriteLn(' 50 Lt ------ ', k50);
WriteLn(' 20 Lt ------ ', k20);
WriteLn(' 10 Lt ------ ', k10);
WriteLn(' 5 Lt ------ ', k5);
WriteLn(' 2 Lt ------ ', k2);
WriteLn(' 1 Lt ------ ', k1);
WriteLn('-----------------------------');
26
Uduotys
1. Apskaiiuokite reikini reikmes:
a. 17 mod 3 + 7 div 3 * 2 =
b. 17 mod (3 + 7) div 3 * 2 =
c. 17 mod (3 + 7 div 3) *2 =
d. 1 + 49 mod 5 + 6 div 3 =
e. (1 + 49) mod 5 6 div 3 =
f.
1 + 49 mod (5 + 7) div 3 =
g. 19 mod 8 + 7 div 3 =
h. 19 mod (8 + 7 div 3) =
27
sprsti. Pasitikrinkite: kai n = 77, d = 7 ir k = 3, tai kiekvienas draugas gavo po m = 9 balionus, o
Andriui teko a = 14 balion.
6. Lktuvas pakilo i aerouosto, kai buvo A valand ir B minui. Lktuvas ore praleido C minui.
Paraykite program, kuri nustatyt, kiek bus valand V ir minui M, kai lktuvas nusileis.
Atkreipkite dmes, kad C reikm gali bti didel ir lktuvas gali leistis ne t pai par. Paraykite
program iam udaviniui sprsti. Pasitikrinkite: kai A = 23, B = 55, C =14, tai lktuvas leisis V = 0
valand ir M = 9 minuts.
7. Nubrauktas trienklio skaiiaus x antrasis skaitmuo. Kai likusiam dvienkliam skaiiui i kairs
buvo priraytas nubrauktasis skaitmuo, tuomet buvo gautas skaiius n (10 < n 999, be to skaiiaus n
deimi skaitmuo nelygus nuliui). Paraykite program, kuri apskaiiuot, kokia buvo x reikm,
kai n reikm vedama klaviatra. Pasitikrinkite: kai n = 135, turi bti spausdinama: Trienklis
skaiius x = 315.
Smalsiems
Nordami sutrumpinti sukurt gros skaiiavimo program, pasikartojanius veiksmus banknot ar
monet kiekio, neatiduotos gros likuio skaiiavim, kiekvieno nominalo banknot ar monet kiekio
spausdinim kelsime savarankik programos dal procedr.
I pagrindins programos procedr kreipsims su skirting nominal pinigais.
Procedros tekstas raomas programos pradioje po programos antrate. Labai patogu nuo pagrindins
programos procedr atskirti komentaru, pvz., brkneli ar vaigdui eilute.
Uraykite programos antrat ir komentar:
program Darbas3;
//------------------------------------------------------- Raome procedr Graza. Procedros antratje skliausteliuose apraysime tris sveikojo tipo
kintamuosius: kintamasis k kokio nominalo banknot ar monet skaiius skaiiuojamas, kx kiek k
nominalo pinig yra, g kokia gra dar liko neatiduota. Kintamieji kx ir g raomi su odeliu var, nes
pagrindin program turi bti grinamos apskaiiuotos j reikms. Apraant kintamuosius btina
nurodyti j tip. Procedros visuje paraykite priskyrimo sakinius kx ir g reikmms skaiiuoti ir raymo
sakin, skirt k nominalo pinig skaiiaus spausdinimui.
procedure Graza(k : integer; var kx : integer; var g : integer);
begin
kx := g div k; g := g mod k;
WriteLn(k : 3, ' Lt ------ ', kx);
end;
//-------------------------------------------------------var g : integer;
k100, k50, k20, k10, k5, k2, k1 : integer;
Pagrindinje programoje paraykite pradini duomen vedimo sakinius ir du pirmuosius rezultat
spausdinimo sakinius:
begin
Write('veskite pirkjo gr: '); ReadLn(g);
WriteLn('Pardavja gr atiduos taip:');
WriteLn('-----------------------------');
Toliau raysime kreipinius procedr Graza:
Graza(100, k100, g);
Graza(50, k50, g);
28
Graza(20, k20, g);
Graza(10, k10, g);
Graza(5, k5, g);
Graza(2, k2, g);
Graza(1, k1, g);
29
2.4. Piramid
Atlikdami darb isiaikinsite, kaip kuriama ciklinius skaiiavimus atliekanti programa, kai i anksto
neinoma, kiek kart reiks kartoti veiksmus:
imoksite urayti neinomo kartojim skaiiaus ciklo antrat,
isiaikinsite, kaip uraomi cikle atliekami veiksmai,
suprasite, kaip skaiiuojama suma ir kiekis,
imoksite skaiiavim rezultatus spausdinti lentelje.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.1. Kintamasis, kintamojo reikm
94
4.1. Tiesinis algoritmas
103
3.2. Priskyrimo sakinys
94
4.2. Ciklinis algoritmas
103
3.3. Duomen vedimas klaviatra
95
3.4. Rezultat (duomen) ivedimas ekrane 96
3.5. Ciklo sakinys while
96
Uduotis. I plyt galima pastatyti vienos plytos ploio taisykling piramid, kurios virnje yra viena
plyta, o onuose puss plytos ilgio laipteliai. Paraykite program, skaiiuojani, kokio ilgio a bus
piramids pagrindas ir keli plyt k aukio bus piramid, jei pradinis duomuo yra piramids statybai skirt
plyt skaiius p.
0 < 10
1 < 10
3 < 10
6 < 10
10 < 10
a
a
a
a
=
=
=
=
0
1
2
3
+
+
+
+
1
1
1
1
=
=
=
=
1
2
3
4
k
k
k
k
=
=
=
=
0
1
2
3
+
+
+
+
1
1
1
1
=
=
=
=
1
2
3
4
s
s
s
s
=
=
=
=
Veiksmai neatliekami, nes netenkinama slyga s
0
1
3
6
<
+
+
+
+
p
1
2
3
4
=
=
=
=
1
3
6
10
30
Pirmas ingsnis. Pasiruoimas. Sukurkite katalog Darbas4, skirt programos failams saugoti,
ikvieskite FPS terp, sukurkite programos fail ir suteik programai vard Darbas4 raykite fail
sukurtame kataloge Darbas4 vardu Darbas4.pas.
:
:
:
:
integer;
integer;
integer;
integer;
//
//
//
//
Paraykite kintamojo p reikms vedimo klaviatra sakinius: praneimo, koki reikm vesti, sakin
Write ir reikms skaitymo sakin Readln.
program Darbas4;
var p : integer;
s : integer;
a : integer;
k : integer;
begin
Write('Kiek plyt
ReadLn;
end.
//
//
//
//
31
Isaugokite ir vykdykite program.
Paleid program, klaviatra surink skaii 10 ir paspaud klavi Enter, ekrane matysite:
Kiek plyt skirta piramids statybai?: 10
Piramids pagrindo ilgis: 0
Piramids auktis: 0
Piramids statybai panaudot plyt skaiius: 0
Ketvirtas ingsnis. Ciklo sakinio antrat. Veiksmai cikle. Kadangi ciklo sakinyje bus kartojami keli
veiksmai, jie turi bti raomi tarp bazini odi begin ir end. Toks sudtinis sakinys baigiamas
kabliatakiu.
Po kintamj a, k ir s pradini reikmi apraymu uraykite ciklo sakin:
while s <
begin
a :=
k :=
s :=
end;
p do
a + 1;
k + 1;
s + a;
Penktas ingsnis. Skaiiavim tarpini reikmi spausdinimas. Nordami sitikinti, kad programa
skaiiuoja teisingai, galite spausdinti ne tik galutinius, bet ir tarpinius skaiiavim rezultatus.
32
Sudtin sakin, nurodant, kokie veiksmai bus atliekami ciklo viduje papildykite kintamj a, k ir s
reikmi spausdinimo sakiniais ir sakiniu, atskirianiu vien kartojim nuo kito vaigdutmis:
while s < p do
begin
a := a + 1;
k := k + 1;
s := s + a;
WriteLn('a = ', a);
WriteLn('k = ', k);
WriteLn('s = ', s);
WriteLn('**********');
end;
33
WriteLn('Pagrindo ilgis
Auktis Panaudot plyt skaiius');
WriteLn('--------------------------------------------------');
while s < p do
begin
a := a + 1;
k := k + 1;
s := s + a;
WriteLn(a : 5, k : 15, s : 20);
end;
WriteLn('--------------------------------------------------');
WriteLn('Piramids pagrindo ilgis: ', a);
WriteLn('Piramids auktis: ', k);
WriteLn('Piramids statybai panaudot plyt skaiius: ', s);
ReadLn;
end.
34
Septintas ingsnis. Tikrinimas, ar programa visada pateikia teisingus rezultatus.
Paleid vykdyti program veskite p reikm, lygi 8. vykd program gaunate t pat rezultat, kaip ir
ved p reikm, lygi 10. Pastebime, kad rezultatas yra neteisingas, nes piramids statybai panaudota
daugiau plyt, negu skirta.
Pakeiskite ciklo antratje slyg s < p salyga p - s >= a + 1 ir vykdykite program su p
reikme, lygia 8. Ekrane turtumte matyti:
Programa, skaiiuojanti piramids pagrindo ilg, aukt
ir statybai panaudot plyt skaii
*******************************************************
-------------------------------------------------Pagrindo ilgis
Auktis Panaudot plyt skaiius
-------------------------------------------------1
1
1
2
2
3
3
3
6
-------------------------------------------------Piramids pagrindo ilgis: 3
Piramids auktis: 3
Piramids statybai panaudot plyt skaiius: 6
Patikslinus ciklo antrats slyg, programa pateikia teisingus rezultatus su visomis kintamojo p
reikmmis.
Klausimai
1.
2.
3.
4.
5.
Jeigu plyt liko nepanaudot, tai kiek? Papildykite program skaiaivimais, kiek liko plyt.
Kaip vykdomas kartojimas ciklo sakinyje while?
K daryti, kad ciklas nebt begalinis?
Kaip urayti ciklo sakin, kai norima kartoti daugiau sakini?
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;
b) while a < 0 do;
begin
WriteLn('argumentas neigiamas');
a := a + 1;
end;
c) while a < 0 do
WriteLn('argumentas neigiamas');
a := a + 1;
d) while a >= 0 do
WriteLn('argumentas neigiamas');
a := a + 1;
35
Uduotys
1. Martynas labai mgsta saldainius. Mamos slptuvje berniukas rado m saldaini. Pirm dien jis suvalg
1 saldain, antr 2, trei 3 ir kiekvien tolesn dien suvalgydavo vienu saldainiu daugiau negu prie
tai buvusi. Per kelias dienas d Martynas suvalgys visus saldainius? Paskutinei dienai gali likti maiau
saldaini. Pasitikrinkite: kai m = 11, turime gauti tok rezultat: d = 5.
2. PALKANOS. Pristigo mogus pinig ir nujo pasiskolinti j i prekybininko. Tas sutiko paskolinti,
bet papra grinti juos kit mnes itaip: pirmj mnesio dien 1 lit, antrj du litus, treij
keturis litus, t. y. kiekvien dien du kartus daugiau negu prie tai buvusi. T dien, kai skola gals bti
padengta, reiks atiduoti ir vis tos dienos norm. Tai, kas bus atiduota viraus, ir bus prekybininko
palkanos.
Uduotis. Paraykite program, kuri suskaiiuot, kiek palkan litais gaus prekybininkas u paskolintus
n lit. (13 olimpiada, 2002).
3. Bankas u indlius moka p procent palkan per metus. Met gale palkanos pridedamos prie indlio.
Jei indlininkas pinig n kiek neiima, palkanos skaiiuojamos nuo vis didesns sumos. Paraykite
program, kuri apskaiiuot, per kiek met t, pradinis indlis ind pasieks sum s. Pasitikrinkite: kai p
= 5, ind = 1000, s = 1200, rezultatas t = 4.
4. Turime kompiuter, kuris nemoka skaiiuoti natralij skaii dalmens sveikosios dalies ir liekanos
(nra DIV ir MOD dalybos operacij). Paraykite program, kuri apskaiiuot skaii n ir m dalmens
sveikj dal dalmuo ir liekan liekana. Pasitikrinkite: kai n = 14, m = 3, turime gauti tokius
rezultatus: dalmuo = 4, liekana = 2.
5. Paskalyje nra funkcijos, skirtos realiojo skaiiaus x klimui sveikuoju laipsniu k. Paraykite program
iam udaviniui sprsti. Rezultat y spausdinkite dviej enkl po kablelio tikslumu. Pasitikrinkite: kai
x = 5, k = 2, rezultatas y = 25.00.
6. PLYTELI DLIOJIMAS. I n kvadratini plyteli reikia sudlioti vienos plytels storio kvadrat
eil. Pirmiausia sudedamas didiausias galimas kvadratas. I likusi plyteli vl didiausias ir t. t.
Uduotis. Paraykite program, kuri iskaidyt duot plyteli skaii dalis, reikalingas kiekvieno kvadrato
statybai. Pavyzdiui, kai n = 75, tai rezultatas turi bti: 64, 9, 1, 1. (11 olimpiada, 2000).
Testo nr.
Pradinis duomuo
Rezultatai
1 1 1
Paaikinimai
35
25 9 1
89
81 4 4
149
144 4 1
225
225
32767
32761 4 1 1
Smalsiems
Nordami, kad piramids statybos rezultatai bt isaugoti tekstiniame faile, programoje Darbas3.pas
atlikite pakeitimus:
program Darbas4;
36
var p : integer;
// Piramids statybai skirt plyt skaiius
s : integer;
// Piramids statybai panaudot plyt skaiius
a : integer;
// Piramids pagrindo ilgis
k : integer;
// Piramids auktis
Fr : text;
// Tekstinio failo kintamasis
begin
Assign(Fr, 'Darbas3.txt'); // Failo kintamasis Fr susiejamas su failo vardu Darbas4.txt
Rewrite(Fr);
// Failas parengiamas raymui
WriteLn(Fr, 'Programa, skaiiuojanti piramids pagrindo ilg, aukt');
WriteLn(Fr, ' ir statybai panaudot plyt skaii');
WriteLn(Fr, '*******************************************************');
Write('Kiek plyt skirta piramids statybai?: '); ReadLn(p);
a := 0; k := 0; s := 0;
WriteLn(Fr, '--------------------------------------------------');
WriteLn(Fr, 'Pagrindo ilgis
Auktis Panaudot plyt skaiius');
WriteLn(Fr, '--------------------------------------------------');
while p - s >= a + 1 do
begin
a := a + 1;
k := k + 1;
s := s + a;
WriteLn(Fr, a : 5, k : 15, s : 20);
end;
WriteLn(Fr, '--------------------------------------------------');
WriteLn(Fr, 'Piramids pagrindo ilgis: ', a);
WriteLn(Fr, 'Piramids auktis: ', k);
WriteLn(Fr, 'Piramids statybai panaudot plyt skaiius: ', s);
Close(Fr);
// raius visus rezultatus failas udaromas
ReadLn;
end.
37
2.5. Elektros laidininko varos skaiiavimas
Atlikdami darb isiaikinsite, kaip kuriama ciklinius skaiiavimus atliekanti programa, kai inoma, kiek
kart bus kartojami veiksmai:
imoksite urayti inomo kartojim skaiiaus ciklo antrat,
isiaikinsite, kaip uraomi cikle atliekami veiksmai,
prisiminsite, kaip skaiiuojama suma,
imoksite tinkamai ivesti apskaiiuot realiojo tipo rezultat.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.1. Kintamasis, kintamojo reikm
94
4.1. Tiesinis algoritmas
103
3.2. Priskyrimo sakinys
94
4.2. Ciklinis algoritmas
103
3.3. Duomen vedimas klaviatra
95
3.4. Rezultat (duomen) ivedimas ekrane 96
3.5. Ciklo sakinys while
96
Uduotis. Elektros laidinink sudaro n nuosekliai sujungt laidinink, kuri varos yra r1, r2, ..., rn
om. Reikia apskaiiuoti grandins var r.
2
4
1
4
Skaiiavim rezultatas: r = 11.
r = 0 + 2 = 2
r = 2 + 4 = 6
r = 6 + 1 = 7
r = 7 + 4 = 11
Pirmas ingsnis. Pasiruoimas. Sukurkite katalog Darbas5, skirt programos failams saugoti,
ikvieskite FPS terp, sukurkite programos fail ir suteik programai vard Darbas5 raykite fail
sukurtame kataloge Darbas5 vardu Darbas5.pas.
n
i
rlaid
r
:
:
:
:
integer;
integer;
real;
real;
//
//
//
//
Laidinink skaiius
inomo kartojim skaiiaus ciklo parametras
Laidininko vara
Elektros grandins vara
Paraykite kintamojo n reikms vedimo klaviatra sakinius: praneimo, koki reikm vesti, sakin
Write ir reikms skaitymo sakin ReadLn.
program Darbas5;
var
n : integer;
// Laidinink skaiius
38
i : integer; //
rlaid : real;
//
r : real;
//
begin
Write('Kiek laidinink
ReadLn;
end.
Ketvirtas ingsnis. Ciklo sakinio antrat. Veiksmai cikle. Kadangi ciklo sakinyje bus atliekami keli
veiksmai, jie turi bti raomi tarp bazini odi begin ir end. Toks sudtinis sakinys baigiamas
kabliatakiu.
Po kintamojo r pradins reikms apraymo uraykite ciklo sakin:
for i := 1 to n do
begin
Write('veskite laidininko var: '); ReadLn(rlaid);
r := r + rlaid;
end;
39
program Darbas5;
var
n : integer; // Laidinink skaiius
i : integer; // inomo kartojim skaiiaus ciklo parametras
rlaid : real;
// Laidininko vara
r : real;
// Elektros grandins vara
begin
Write('Kiek laidinink yra elektros grandinje?: '); ReadLn(n);
r := 0;
for i := 1 to n do
begin
Write('veskite laidininko var: '); ReadLn (rlaid);
r := r + rlaid;
end;
WriteLn('Elektros grandins vara: ', r : 6 : 2);
ReadLn;
end.
Uduotys
1. Elektros grandin sudaro n lygiagreiai sujungt laidinink, kuri varos yra r1, r2, ..., rn om.
Paraykite program, skaiiuojani grandins var r. Pasitikrinkite, kai n = 4, o r1 = 2, r2 = 4, r3 = 1,
r4 = 4, turi bti spausdinama: Elektros grandins vara r = 0.50 om.
2. Klasje mokosi n mokini. Kiekvieno mokinio gis yra u1, u2, ..., un centimetr. Paraykite
program, skaiiuojani vidutin klass mokini g uvid. Pasitikrinkite, kai n = 5, o u1 = 179, u2 =
180, u3 = 178, u4 = 179, u5 = 175, turi bti spausdinama: Vidutinis klass mokinio gis uvid = 178.20
cm.
3. achmat iradjas i valdovo papra tokio atlygio: ant pirmojo achmat lentos langelio padk vien
grd, ant antrojo du, ant treiojo keturis ir t.t. vis dvigubink, kol pasibaigs langeliai. Valdovas tik
nusijuok ir paliep atseikti grd. Kiek grd gaus achmat iradjas? achmat lentoje yra 64
langeliai. Paraykite program iam udaviniui sprsti. Udaviniui sprsti panaudokite real duomen
tip rezultatao reikmei saugoti.
40
Smalsiems
Jei pradini duomen yra labai daug, tai j vedimas klaviatra reikalauja daug laiko, padarius klaid tenka
visk kartoti i naujo. Daug patogiau bt pradinius duomenis perskaityti i tekstinio failo. Papildysime
elektros grandins varos skaiiavimo program duomen skaitymu i tekstinio failo.
Tekstinis failas sukuriamas komandomis Rinkmena Kurti tekstin rinkmen. Atsivrusio
lango pirmoje eilutje raykite skaii 4, kuris reikia laidinink skaii, antroje eilutje raykite
keturi laidinink varas, vien nuo kitos atskirdami tarpais: 2 4 1 4. Ekrane turtumte matyti:
4
2 4 1 4
11.00
Kaip pastebjote, skaitymas i failo yra labai panaus duomen vedim klaviatra. Skaitant duomenis
i failo nebereikia rayti sakini, kuriais praoma vesti pradines kintamj reikmes.
Jei pirmoje failo eilutje raytas laidinink skaiius n, o likusiose n eilui
laidinink varos po vien eilutje, tuomet pradini duomen failas bus toks:
4
2
4
1
4
Norint, kad laidinink var reikms bt perskaitytos tinkamai, sakin Read(Fd, rlaid);
utenka pakeisti sakiniu ReadLn(Fd, rlaid); Sakinys Read skaito reikmes iki eiluts pabaigos,
o ReadLn perskaito kreipinyje nurodyt reikmi kiek ir persikelia kit eilut.
41
2.6. Funkcijos apibrimo srities tyrimas
Atlikdami darb imoksite tinkamai urayti slygos tikrinimo sakin.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.1. Kintamasis, kintamojo reikm
94
4.1. Tiesinis algoritmas
103
3.2. Priskyrimo sakinys
94
4.2. Ciklinis algoritmas
103
3.3. Duomen vedimas klaviatra
95
4.3. akotas skaiiavimas
104
3.4. Rezultat (duomen) ivedimas ekrane 96
3.5. Ciklo sakinys while
96
3.7. Slygos sakinys if
97
3.8. Funkcij sraas
99
Uduotis. Apskaiiuoti funkcijos y =
m +3
m 2 100
program Darbas6;
var mp, mg, mz : real;
begin
Write('veskite argumento pradin reikm: '); ReadLn (mp);
Write('veskite argumento galin reikm:
'); ReadLn (mg);
Write('veskite argumento ingsnio reikm: '); ReadLn (mz);
ReadLn;
end.
Isaugokite ir vykdykite program su tokiais pradiniais duomenimis: mp = -50, mg = 50, mz =
10. Ekrane turt bti rodomi tokie rezultatai:
veskite argumento pradin reikm: -50
veskite argumento galin reikm: 50
veskite argumento ingsnio reikm: 10
42
WriteLn(m:7:2, y:12:3);
m := m + mz;
end;
Patikslin rezultatus pastebime, kad esant argumento m reikmms -20.00, -10.00, 0.00 ir 10.00,
y reikm yra lygi -0.98150. Tokius rezultatus gavome todl, kad argumento reikms -10.00, 0.00
ir 10.00 netenkina slygos m * m - 100 > 0. Funkcijos reikms spausdinamos vykdius slygos
sakin. Jeigu slyga netenkinama, tuomet spausdinama paskutin apskaiiuota y reikm.
43
Ketvirtas ingsnis. Tinkamas skaiiavimo rezultat pateikimas.
Nordami gauti teisingus rezultatus visoms argumento m reikmms, funkcijos reikmi spausdinim
kelsime slygos sakinyje atliekamus veiksmus. Jei argumento m reikm nepriklauso funkcijos
apibrimo sriiai, tuomet vietoj funkcijos reikms spausdinsime septynis vaigdui (*) simbolius.
Slygos sakinio akas papildykite rezultat spausdinimo sakiniais:
if m * m - 100 > 0
then
begin
y := (m + 3) / (Sqrt (m * m - 100));
WriteLn(m:7:2, y:12:5);
end
else WriteLn(m:7:2,'*******':12);
44
Klausimai
1. Kokios bus sveikojo tipo kintamj x ir y reikms atlikus sakini sek?
a) x := 5;
b) x := 3;
c) x := 6;
if x > 4
then y := x + 3
else y := x - 3;
if x <> 3
then y := x + 3;
x := x + 2;
y := x + 2;
d) x := 2;
if x < 0
then y := x - 3
else
begin
x := x + 2;
y := x + 3;
end;
e)
x := 1;
if x > 0
then
begin
y := x
x := x
end
else
begin
x :=
y :=
end;
f)
- 3;
+ 2;
x + 2;
x + 3;
if x <= 8
then
begin
x := x + 2;
y := x + 3;
end
else y := x - 3;
x := 1;
if x = 0
then
begin
y := x - 3;
x := x + 2;
end
else
begin
x := x + 2;
y := x + 3;
end;
2. Kas bus rodoma ekrane atlikus programos fragment? Koki slyg tikrina slygos sakinys?
for x := 10 to 15 do
if x mod 2 <> 0
then WriteLn (x);
7. Remdamiesi funkcij grafikais uraykite, kaip skaiiuojamos funkcij y = f (x) reikms. 1 langelis
atitinka 1 vienet.
a)
b)
Uduotys
1. viesoforas veikia pagal tok algoritm: kiekvienos valandos pradioje tris minutes dega alia viesa,
po to dvi minutes raudona, po to vl tris minutes alia ir t.t. inoma, kiek minui t (t sveikasis
skaiius) prajo nuo valandos pradios. Paraykite program, kuri nustatyt, kokia viesoforo spalva
dega. Pasitikrinkite: kai t = 12, tuomet spausdinama: Dega alia viesa. Kai t = 13, tuomet
45
spausdinama: Dega alia viesa, tuoj degs raudona. Kai t = 5, tuomet spausdinama: Dega raudona
viesa, tuoj degs alia.
2. Geleinkelio stotys A, B ir C yra n-tajame, m-tajame ir p-tajame geleinkelio ruoo kilometruose.
Paraykite program, kuri surast, tarp kuri stoi atstumas yra maiausias. Stotys nebtinai
vardytos abcls tvarka, pavyzdiui, po stoties A gali sekti stotis C. Pasitikrinkite: kai n = 3, m =
8, p = 15, turi bti spausdinama: Atstumas maiausias tarp A ir B stoi. Kai n = 3, m = 9, p = 15,
turi bti spausdinama: Atstumai maiausi tarp AB ir BC stoi. Kai n = 3, m = 15, p = 9, turi bti
spausdinama: Atstumai maiausi tarp AC ir BC stoi.
3. Osvaldas nori savait slidinti viename i trij kurort. Kurorte A slidinjimo sezonas prasideda
lapkriio, o baigiasi balandio mnes, bet dl lavin pavojaus vis sausio mnes slidinti negalima.
Kurorte B slidinti galima nuo gruodio pradios iki kovo pabaigos, taiau vasario 1-15 dienomis
jame vyksta varybos. Kurorte C slidininkai laukiami nuo lapkriio pradios iki gegus pabaigos.
Poilsio kaina kiekviename kurorte, vertinant ir kelions ilaidas, atitinkamai yra k1, k2, k3 lit.
inodami atostog pradios dat (mnes m ir dien d) nustatykite, ar Osvaldas gals atostogauti
bent viename kurorte ir jeigu taip, tai kur kurort jam rinktis, kad ileist maiausiai pinig.
Pasitikrinkite: kai m = 2, d = 5, k1 = 500, k2 = 520, k3 = 499, turi bti spausdinama: Osvaldas
gals slidinti C kurorte. Jam reiks 499 Lt.
4. Pateikiamas dviej natralij skaii a ir b didiausio bendrojo daliklio (DBD) paiekos algoritmo,
dar vadinamo Euklido 2 algoritmu, odinis apraymas. Paraykite program iam udaviniui sprsti.
Euklido algoritmas:
1. Pradiniai duomenys natralieji skaiiai a ir b.
2. Jei skaiiai yra lygs, tai bet kuris i j yra DBD ir veiksmai toliau neatliekami, jei ne atliekami
tolesni veiksmai.
3. Nustatoma, kuris skaiius yra didesnis.
4. Didesniojo skaiiaus reikme tampa didesniojo ir maesniojo skaii skirtumas.
5. Algoritmo veiksmai kartojami pradedant 2.
46
2.7. Kvadratins lygties sprendini skaiiavimas
Atlikdami darb tvirtinsite slygos sakinio uraymo gdius, imoksite sukurti patogesn naudotojo
ssaj.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.3. Duomen vedimas klaviatra
4.1. Tiesinis algoritmas
103
3.4. Rezultat (duomen) ivedimas ekrane
4.3. akotas skaiiavimas
104
3.7. Slygos sakinys if
97
Uduotis. Rasti kvadratins lygties ax2 + bx + c = 0 sprendinius. ia a, b, c skaiiai, nelygs
nuliui.
Algoritmas. Kvadratins lygtys sprendiamos taip:
Skaiiuojamas diskriminantas: d = b2 - 4ac.
Tikrinama, ar lygtis turi sprendini ir jei taip, tai jie skaiiuojami:
o jei d < 0, kvadratin lygtis neturi reali sprendini;
o
o
b
;
2a
b d
b+ d
ir x1 =
.
jei d > 0, tuomet kvadratin lygtis turi du sprendinius: x1 =
2a
2a
Pasiruoimas. Sukurkite katalog programos failams saugoti, atverkite FPS terp ir sukurkite programos
fail Darbas7.pas.
47
GotoXY(27, 7);
ReadLn(c);
TextBackground (Black); // Atstatomas pradinis teksto fonas
GotoXY(5, 9);
WriteLn('Sprendiama kvadratin lygtis:');
GotoXY(15, 11);
Write(a, 'x');
GotoXY(17, 10);
Write('2');
GotoXY(19, 11);
WriteLn(' + ', b,'x + ', c, ' = 0');
ReadLn;
end.
Isaugokite ir vykdykite program su koeficient reikmmis: a = 2, b = 4, c = 1. Ekrane
turtumte matyti:
turtumte matyti:
48
x2 + 14x + 49 = 0;
x2 + 12x + 36 = 0;
x2 - 8x - 9 = 0;
x2 - 6x + 8 = 0;
x2 - 3x + 2 = 0;
x2 - 5x + 6 = 0;
x2 - x + 2 = 0;
-x2 + 4x + 1 = 0;
-5x2 + 9x - 2 = 0.
Uduotis.
Pakeiskite program, kad ji sprst kvadratines lygtis su realiojo tipo koeficientais. Atkreipkite dmes tai,
kad reiks pataisyti ymeklio padt ekrane vedant pradinius duomenis ir spausdinant sprendiam
kvadratin lygt. Laikykite, kad koeficientui vesti skiriamos 7 pozicijos.
49
2.8. Vampyro skaiiai
Atlikdami darb susipainsite su sveikj skaii skaidymu skaitmenimis, naudojant operatorius div ir
mod. Suinosite kaip kombinatorikos (matematikos aka) elementus galima taikyti skaii teorijoje raant
programas. Suinosite kas yra skaiiaus faktorialas.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.2. Priskyrimo sakinys
94
4.2. Ciklinis algoritmas
103
3.3. Duomen vedimas klaviatra
95
4.3. akotas skaiiavimas
104
3.4. Rezultat (duomen) ivedimas ekrane 96
3.6. Ciklo sakinys for
97
3.7. Slygos sakinys if
97
Uduotis. Tarkime, kad turime sveikj skaii sk sudaryt i n (n - lyginis skaiius) skaitmen. Jeigu
skaiius sk turi 2 daugiklius, kiekvienas i kuri yra sudarytas i n/2 skaitmen, sukonstruotus i skaiiaus
sk skaitmen (visi skaitmenys panaudojami tik po 1 kart), jis yra vadinamas vampyro skaiiumi, o i jo
skaitmen sukonstruoti daugikliai vampyro iltimis. Paraykite program, kuri surast ir ekrane
atspausdint visus 4-enklius vampyro skaiius ir j iltis.
Algoritmas. Prie pradedant nagrinti i uduot pateiksime kelet 4-enkli vampyro skaii ir j ili
pavyzdi:
1260 = 21 * 60
1395 = 15 * 93
1827 = 21 * 87
Kaip pastebite ie 4-enkliai skaiiai yra iskaidyti dviej dvienkli skaii skaii sandaug. Be to ie
abu skaiiai turi visus pradinio skaiiaus skaitmenis.
Norint pradti sprsti i uduot pirmiausia reikia mokti atskirti skaiiaus skaitmenis. Tai padaryti galima
naudojant sveik skaii dalybos operatorius div ir mod. Primename, kad pirmasis i j leidia gauti
sveikj dal, o antrasis dalybos liekan. Pavyzdiui, turime keturenkl skaii sk = 1234. Pirmj
skaiiaus skaitmen paymkime a, antrj b, treij c, ketvirtj d simboliais, t. y. sk = abcd. Dabar
paraykime formules, pagal kurias galima rasti iuos skaitmenis:
a
b
c
d
= sk div 1000
= (sk div 100) mod 10
= (sk div 10) mod 10
= sk mod 10
Pirmas ingsnis. Apraomi kintamieji, skirti pradini duomen reikmms saugoti. Uraomi keturi
priskyrimo sakiniai pagal aukiau uraytas formules. Ekrane spausdinamas gautas rezultatas.
program Darbas8;
var
sk,
// Keturenklis skaiius
a, b, c, d : integer;
// Skaiiaus sk (abcd) skaitmenys
begin
WriteLn('Programa pradjo darb');
sk := 1234;
a := sk div 1000;
50
b := (sk div 100) mod 10;
c := (sk div 10) mod 10;
d := sk mod 10;
WriteLn(sk , ' skaitmenys: ', a, ' ', b, ' ', c, ' ', d);
WriteLn('Programa darb baig');
ReadLn;
end.
Programa pradjo darb
Paleid program, ekrane matysite:
1234 skaitmenys: 1 2 3 4
Programa darb baig
Antras ingsnis. Pirmojo 4-enkli skaii deimtuko skaidymas atskirais skaitmenimis ir rodymas
ekrane.
Pakeiskite priskyrimo sakin sk := 1234; ciklo sakiniu
Uraykite operatorinius skliaustus begin .. end.
Isaugokite ir vykdykite program.
program Darbas8;
var
sk,
// Keturenklis skaiius
a, b, c, d : integer;
// Skaiiaus sk (abcd) skaitmenys
begin
WriteLn('Programa pradjo darb');
for sk := 1000 to 1009 do
begin
a := sk div 1000;
b := (sk div 100) mod 10;
c := (sk div 10) mod 10;
d := sk mod 10;
WriteLn(sk , ' skaitmenys: ', a, ' ', b, ' ', c, ' ', d);
end;
WriteLn('Programa darb baig');
ReadLn;
end.
0
1
2
3
4
5
6
7
8
9
51
Treias ingsnis. Grkime prie uduoties vampyro skaii ir j ili. Iskaidius 4-enkl skaii sk
skaitmenimis a, b, c, d, reikia skaitmenis sujungti po du. Galimi ei keturi skaitmen sujungimo po du
variantai (junginiai):
ab, ac, ad, bc, bd, cd.
ia galima atpainti vien i kombinatorikos udavini derini sudarym. Deriniai kombinatorikoje
baigtins objekt aibs, turinios n element, junginiai i k (1 k n) element. Derini skaiius ymimas
C nk ir randamas pagal formul:
C nk =
43 43
=
= 6 . ia 4-enklio skaiiaus sk skaitmen kiekis n = 4, o
2! 2 1
skaitmen kiekis junginyje k = 2. Kaip pastebite apskaiiuotas derini skaiius 6 atitinka aukiau
uraytiems 6 junginiams. Kadangi, pagal uduoties slyg, gautus junginius reikia grupuoti po du, todl
gaunasi trys poros jungini:
ab ir cd
ac ir bd
ad ir bc
Programoje pakeiskite sakin
WriteLn(sk , ' skaitmenys: ', a, ' ', b, ' ', c, ' ', d);
sekaniais sakiniais:
WriteLn(sk , ' junginiu poros:');
WriteLn(' ':20, a, b, ' ', c, d);
WriteLn(' ':20, a, c, ' ', b, d);
WriteLn(' ':20, a, d, ' ', b, c);
program Darbas7;
var
sk,
// Keturenklis skaiius
a, b, c, d : integer;
// Skaiiaus sk (abcd) skaitmenys
begin
WriteLn('Programa pradjo darb');
for sk := 1000 to 1009 do
begin
a := sk div 1000;
b := (sk div 100) mod 10;
c := (sk div 10) mod 10;
d := sk mod 10;
WriteLn(sk , ' junginiu poros:');
WriteLn(' ':20, a, b, ' ', c, d);
WriteLn(' ':20, a, c, ' ', b, d);
WriteLn(' ':20, a, d, ' ', b, c);
end;
WriteLn('Programa darb baig.');
Readln;
end.
Program galima patikrinti, pavyzdiui, su tokiomis ciklo for pradios ir pabaigos reikmmis: 1234.
52
Paleid program, ekrane matysite:
Programa pradjo darb
1234 jungini poros:
12 34
13 24
14 23
Programa darb baig
Ketvirtas ingsnis. Kiekvienai jungini porai (viso 3 poros), sudarykime visas galimas skaitmen
sukeitimo kombinacijas. Kadangi kiekvien pora sudaro po du skaitmenis, tai kiekvienai porai sudarysime po
4 (2*2) kombinacijas (ir. lentel).
Pirma jungini pora
ab
ba
ab
ba
cd
cd
dc
dc
bd
bd
db
db
bc
bc
cb
cb
Pertvarkykite ankstesn program, kiekvien jungini poros spausdinimo sakin, pakeisdami keturiais
kombinacij spausdinimo sakiniais. Taigi, programoje vietoje 3-j spausdinimo sakini atsiras 12-ka
spausdinimo sakini.
program Darbas8;
var
sk,
// Keturenklis skaiius
a, b, c, d : integer;
// Skaiiaus sk (abcd) skaitmenys
begin
WriteLn('Programa pradjo darb');
for sk := 1234 to 1234 do
begin
a := sk div 1000;
b := (sk div 100) mod 10;
c := (sk div 10) mod 10;
d := sk mod 10;
WriteLn(sk , ' junginiu poros:');
WriteLn(' ':20, a, b, ' ', c, d);
WriteLn(' ':20, b, a, ' ', c, d);
WriteLn(' ':20, a, b, ' ', d, c);
WriteLn(' ':20, b, a, ' ', d, c);
WriteLn;
WriteLn(' ':20, a, c, ' ', b, d);
WriteLn(' ':20, c, a, ' ', b, d);
WriteLn(' ':20, a, c, ' ', d, b);
WriteLn(' ':20, c, a, ' ', d, b);
WriteLn;
WriteLn(' ':20, a, d, ' ', b, c);
WriteLn(' ':20, d, a, ' ', b, c);
WriteLn(' ':20, a, d, ' ', c, b);
53
WriteLn(' ':20, d, a, ' ', c, b);
end;
WriteLn('Programa darb baig');
ReadLn;
end.
34
34
43
43
13
31
13
31
24
24
42
42
14
41
14
41
Programa darb baig
23
23
32
32
Penktas ingsnis. Visas aukiau gautas jungini kombinacijas pavert dvienkliais skaiiais (pvz.:
a*10+b), jas sudaugin ir palygin su pradiniu skaiiumi sk galime nustatyti ar skaiius sk yra vampyras.
program Darbas8;
var
sk,
// Keturenklis skaiius
a, b, c, d : integer;
// Skaiiaus sk (abcd) skaitmenys
begin
WriteLn('Programa pradjo darb');
for sk := 1000 to 9999 do
begin
a := sk div 1000;
54
b := (sk div 100) mod 10;
c := (sk div 10) mod 10;
d := sk mod 10;
if sk = (a*10+b)*(c*10+d) then
WriteLn(' Vampyras ', sk, '
if sk = (b*10+a)*(c*10+d) then
WriteLn(' Vampyras ', sk, '
if sk = (a*10+b)*(d*10+c) then
WriteLn(' Vampyras ', sk, '
if sk = (b*10+a)*(d*10+c) then
WriteLn(' Vampyras ', sk, '
if sk = (a*10+c)*(b*10+d) then
WriteLn(' Vampyras ', sk, '
if sk = (c*10+a)*(b*10+d) then
WriteLn(' Vampyras ', sk, '
if sk = (a*10+c)*(d*10+b) then
WriteLn(' Vampyras ', sk, '
if sk = (c*10+a)*(d*10+b) then
WriteLn(' Vampyras ', sk, '
if sk = (a*10+d)*(b*10+c) then
WriteLn(' Vampyras ', sk, '
if sk = (d*10+a)*(b*10+c) then
WriteLn(' Vampyras ', sk, '
if sk = (a*10+d)*(c*10+b) then
WriteLn(' Vampyras ', sk, '
if sk = (d*10+a)*(c*10+b) then
WriteLn(' Vampyras ', sk, '
end;
WriteLn('Programa darb baig');
ReadLn;
end.
60
93
35
30
87
81
80
80
Klausimai
1.
2.
3.
4.
5.
55
6. K gauname bet kok sveik skaii padalin i 10 (div 10)?
7. K gauname bet kok sveik skaii padalin i 10 (mod 10)?
Uduotys
1. Paraykite program, kuri rast i keli skaitmen sudarytas duotas sveikasis skaiius sk.
2. Paraykite program, kuri nustatyt, ar duotas sveikasis skaiius sk lyginis, ar nelyginis.
3. Paraykite program, kuri nustatyt, ar duotas sveikasis skaiius sk yra palidromas (vienodai
skaitomas i abiej gal).
4. Paraykite program, kuri nustatyt, ar duotas sveikasis skaiius sk sudarytas vien i lygini, vien
nelygini skaitmen, ar ir i toki ir toki.
5. Paraykite program, kuri apskaiiuot sveikojo skaiiaus sk faktorial.
6. Paraykite program, kuri apskaiiuot, kiek skirting penketuk galima sudaryti i 10 krepinink.
Raydami program pasinaudokite derini formule.
Smalsiems
Pirmas papildomas ingsnis. Programa bus aikesn ir suprantamesn, jeigu j struktrizuosime,
panaudojant procedr.
Sudarykite procedr, kuri nustatyt, ar skaiius yra vampyras. Procedr pavadinkite tuo paiu vardu
Vampyras. Procedra turs penkis parametrus: 4-enkl skaii sk ir keturis jo skaitmenis a, b, c, d.
Jeigu skaiius sk bus vampyras, tai procedra atspausdins skaii ir jo iltis. Programoje procedr
Vampyras reiks kreiptis 12 kart su atitinkamais argumentais, t. y. kiekvienas programos if sakinys
bus pakeistas kreipiniu i procedr.
program Darbas8;
procedure Vampyras(sk, a, b, c, d : integer);
begin
if sk = (a*10+b)*(c*10+d) then
WriteLn(' Vampyras ', sk, ' = ', a, b, ' * ', c, d);
end;
var
sk,
// Keturenklis skaiius
a, b, c, d : integer;
// Skaiiaus sk (abcd) skaitmenys
begin
WriteLn('Programa pradjo darb');
for sk := 1000 to 9999 do
begin
a := sk div 1000;
b := (sk div 100) mod 10;
c := (sk div 10) mod 10;
d := sk mod 10;
Vampyras(sk, a, b, c, d);
Vampyras(sk, b, a, c, d);
Vampyras(sk, a, b, d, c);
Vampyras(sk, b, a, d, c);
Vampyras(sk,
Vampyras(sk,
Vampyras(sk,
Vampyras(sk,
a,
c,
a,
c,
c,
a,
c,
a,
b,
b,
d,
d,
d);
d);
b);
b);
56
Vampyras(sk, a, d, b, c);
Vampyras(sk, d, a, b, c);
Vampyras(sk, a, d, c, b);
Vampyras(sk, d, a, c, b);
end;
WriteLn('Programa darb baig.');
Readln;
end.
Isaugokite ir vykdykite program. Ekrane matysite tok pat rezultat, kaip ir ankstesnje programos
versijoje
Antras papildomas ingsnis. Norint aukiau parayt program padaryti dar universalesn, reikt rezultatus
pateikti ne ekrane, o rezultat faile.
Norint rezultatus pateikti ne ekrane, o rezultat faile reikia:
program papildyti failo kintamuoju F,
sugalvoti rezultat failo vard, pvz.: Vampyrai.txt,
prisijungti fail ir j susieti su failo kintamuoju,
parengti fail raymui,
papildyti procedros Vampyras parametr sra dar vienu kintamuoju (pvz.: var F : text;),
uraant j pirmoje vietoje,
procedroje Vampyras, spausdinimo sakin WriteLn, papildykite failo kintamuoju F,
visuose 12-oje kreipini procedr Vampyras pradioje urayti argument F,
udaryti tekstin fail.
vykdius program ekrane turt matytis tik dvi eiluts:
Programa pradjo darb
Programa darb baig
Apskaiiuoti rezultatai bus rezultat faile. Atverkite j pasinaudodami meniu komanda Open....
57
2.9. Trys lazdos
Atlikdami darb susipainsite su loginiais kintamaisiais ir loginiais reikiniais, loginmis operacijomis IR,
ARBA. Imoksite loginius reikinius panaudoti ciklo ir slygos sakiniuose.
Nuorodos Paskalio kalbos inyn (psl.)
Nuorodos algoritm inyn (psl.)
3.7. Slygos sakinys if
94
4.2. Ciklinis algoritmas
103
3.8. Funkcij sraas
94
4.3. akotas skaiiavimas
104
Uduotis. Duota n rinkini tam tikro ilgio lazd. Kiekvien rinkin sudaro 3 lazdos. Lazd ilgiai a, b ir c
matuojami decimetrais (sveikieji skaiiai). Nustatyti, ar galima i i lazd sudti trikamp. Jeigu galima, tai
kok: statj, lygiakrat, lygiaon ar vairiakrat. Jeigu negalima, tai urayti atitinkam tekst.
Algoritmas. Sprendiant i uduot galime sivaizduoti, kad trys lazdos geometrijoje atitinka tris atitinkamo
ilgio atkarpas a, b ir c. Prisiminkite, kad ne visuomet i trij atkarp galima sudti trikamp. Btent,
trikampio sudti negalima, jeigu yra bent viena pora atkarp, kurios ilgi suma yra maesn arba lygi u
likusij treij atkarp. Arba, galima pasakyti ir taip, kad i trij atkarp trikamp galima sudti tuomet, kai
vis galim (arba bet kuri) atkarp por ilgi suma yra didesn u treij atkarp, t. y.
Pirmas ingsnis. Apraomi kintamieji, skirti pradini duomen reikmms saugoti, vedami duomenys.
Programos pradioje apraykite trij lazd ilgius sauganius sveikojo tipo kintamuosius a, b, ir c.
Pakeiskite sakin WriteLn('Labas'); nauju sakiniu
WriteLn('Programa pradjo darb');
Paleid program, klaviatra surink skaiius 30 50 40 ir paspaud klavi Enter, ekrane matysite:
Programa pradjo darb
veskite trij lazd ilgius: 30 50 40
Programa darb baig
58
Antras ingsnis. Pirmojo rezultato ar i trij lazd rinkinio galima sudti trikamp skaiiavimas ir
rodymas ekrane.
Papildykite program sakiniu WriteLn, kuris ekrane spausdint pradinius duomenis a, b, c.
Papildykite program slygos sakiniu if su darbo apraymo pradioje pateikto loginio reikinio
skaiiavimu odius ir pakeiiant AND.
Isaugokite ir vykdykite program.
program Darbas9;
var
a, b, c : integer;
// Trij lazd ilgiai
begin
WriteLn('Programa pradjo darb');
Write('veskite trij lazd ilgius: '); ReadLn(a, b, c);
Write('Lazdos: ', a:2, ' ', b:2, ' ', c:2);
if (a + b > c) AND (a + c > b) AND (b + c > a) // Ar trikampis?
then WriteLn(' - galima sudaryti trikamp')
else WriteLn(' - trikampio sudaryti negalima');
WriteLn('Programa darb baig.');
ReadLn;
end.
Paleid program, klaviatra surink skaiius 30 50 40, bei gale paspaud klavi Enter , ekrane matysite:
Programa pradjo darb
veskite trij lazd ilgius: 30 50 40
Lazdos: 30 50 40 galima sudaryti trikamp
Programa darb baig
Dar kart paleid program ir klaviatra surink skaiius 10 50 40, bei gale paspaud klavi Enter, ekrane
matysite:
Programa pradjo darb
veskite trij lazd ilgius: 30 50 40
Lazdos: 10 50 40 trikampio sudaryti negalima
Programa darb baig
Treias ingsnis. Jeigu trikamp galima sudaryti, tai reikia nustatyti, kokio tipo trikamp galima sudaryti.
Statj trikamp galima sudaryti, jeigu duotiems dydiams a, b ir c galioja reikinys
(a2 + b2 = c2) arba (a2 + c2 = b2) arba (c2 + b2 = a2).
Jeigu nei vienas aukiau uraytas reikinys negalioja, tai trikampis yra vairiakratis.
Programoje reikia pakeisti slygos sakinio akoje then esant sakin
WriteLn(' - galima sudaryti trikamp')
59
kitu sudtiniu salygos sakiniu, kuris analizuos, kokio tipo trikamp galima sudaryti i trij duot lazd
rinkinio.
program Darbas9;
var
a, b, c : integer;
// Trij lazd ilgiai
begin
WriteLn('Programa pradjo darb');
Write('veskite trij lazd ilgius: '); ReadLn(a, b, c);
Write('Lazdos: ', a:2, ' ', b:2, ' ', c:2);
if (a + b > c) AND (a + c > b) AND (b + c > a) // Ar trikampis?
then if (a*a + b*b = c*c) OR (a*a + c*c = b*b) OR (b*b + c*c = a*a)
then WriteLn(' - galima sudaryti statj trikamp')
else if (a = b) AND (b = c)
then WriteLn(' - galima sudaryti lygiakrat trikamp')
else if (a = b) OR (b = c) OR (a = c)
then WriteLn(' - galima sudaryti lygiaon trikamp')
else WriteLn(' - trikampio sudaryti negalima');
WriteLn('Programa darb baig');
ReadLn;
end.
Ketvirtas ingsnis. Pritaikykime gaut program keliems duomen trij lazd rinkiniams.
Panaudokime for cikl. Slygoje nurodyta, kad skaiiavimus reikia atlikti su n duomen rinkini.
Papildykite program dviem sveikojo tipo kintamaisiais n ir i. Pirmasis bus skirtas rinkini skaiiui
saugoti, o antrasis rodys, su kuriuo rinkiniu atliekami skaiiavimai.
raykite dialogo sakinius n reikms vedimui.
Apgaubkite duomen vedimo ir salygos sakinius ciklu for. Tam reikia naudoti operatorinius skliaustus
begin .. end, nes cikle bus atliekamas ne vienas , o keli sakiniai.
Pastumkite cikle for tarp begin ir end esant tekst dein. Tai atlikus programos tekstas taps
vaizdesnis, o tuo paiu ir suprantamesnis.
terpkite duomen vedimo dialogo sakin WriteLn ciklo kintamj i.
program Darbas9;
var
a, b, c : integer;
n,
i : integer;
60
begin
WriteLn('Programa pradjo darb');
Write('Iveskite kiek lazd rinkiniu bus: '); ReadLn(n);
for i := 1 to n do
begin
Write('Iveskite trij lazd ', i, '-j rinkin: '); ReadLn(a, b, c);
Write('Lazdos: ', a:2, ' ', b:2, ' ', c:2);
if (a + b > c) AND (a + c > b) AND (b + c > a) // Ar trikampis?
then if (a*a + b*b = c*c) OR (a*a + c*c = b*b) OR (b*b + c*c = a*a)
then WriteLn(' - galima sudaryti statj trikamp')
else if (a = b) AND (b = c)
then WriteLn(' - galima sudaryti lygiakrat trikamp')
else if (a = b) OR (b = c) OR (a = c)
then WriteLn(' - galima sudaryti lygiaon trikamp')
else WriteLn(' - trikampio sudaryti negalima');
end;
WriteLn('Programa darb baig.');
ReadLn;
end.
Klausimai
1.
2.
3.
4.
5.
Ivardinkite kokius inote loginius operatorius ir kaip jie uraomi Paskalio kalboje.
Kaip suprantate login reikin? Paaikinkite.
Kokias reikmes gali gauti loginis reikinys?
Kokie operatoriai daniausiai naudojami apraant login reikin?
Kokias reikmes gali gauti loginis reikinys?
Uduotys
1.
2.
3.
4.
61
5. Duotos staiakampio prieing kamp koordinats: kairiojo virutinio kampo (x1, y1) ir deinio
apatinio kampo (x3, y3). Uraykite loginius reikinius:
Pirmas papildomas ingsnis. Norint aukiau parayt program padaryti universalesn, reikt
duomenis programai vesti ne klaviatra, bet imti i i anksto paruoto duomen failo. Lygiai taip pat
rezultatus reikt pateikti ne ekrane, o rezultat faile.
Nordami duomenis imti i failo pirmiausia reikt susikurti duomen fail, pvz.: Lazdos.txt:
5
30
50
40
40
10
50
50
50
50
50
40
50
40
60
40
Pirmoje failo eilutje uraytas lazd rinkini skaiius n, kitose eilutse po tris skaiius surayti lazd
rinkiniai.
K reikia padaryti:
program papildyti failo kintamuoju,
prisijungti fail ir j susieti su failo kintamuoju,
parengti fail skaitymui,
papildyti n ir a, b, c ivedimo sakinius failo kintamuoju,
paalinti sekanius sakinius kaip nereikalingus
Write('Iveskite kiek lazd rinkiniu bus: ');
Write('Iveskite trij lazd ', i, '-j rinkin: ');
62
vykdius program ekrane turt matytis tik dvi eiluts:
Programa pradjo darb
Programa darb baig
Apskaiiuoti rezultatai bus rezultat faile. Atverkite j pasinaudodami meniu komanda Open....
63
if ArStatus then
WriteLn(fr, ' - galima sudaryti statj trikamp');
if ArLygiakrastis then
WriteLn(fr, ' - galima sudaryti lygiakrat trikamp');
if ArLygiasonis then
WriteLn(fr, ' - galima sudaryti lygiaon trikamp');
if ArIvairiakrastis then
WriteLn(fr, ' - galima sudaryti vairiakrat trikamp');
end
else WriteLn(fr, ' - trikampio sudaryti negalima');
end;
Close(fr);
WriteLn('Programa darb baig.');
Readln;
end.
64
2.10. Taikinys
Atlikdami darb tvirtinsite slygos sakinio uraymo gdius. Suinosite, kaip
nustatyti, ar du reals skaiiai lygs.
Smalsiems silomas kitas programos variantas. ia taikinio duomenys skaitomi i tekstinio
failo, todl pakartotinai vykdant program, nereikia klaviatra suvedinti daug pradini
duomen. Jie suraomi tekstiniame faile ir saugomi tol, kol nepakeiiami naujais. Taip pat
ia js susipainsite, kaip, panaudojant procedras, galima supaprastinti programos
struktr. Atskirus veiksmus uraius procedromis, kiekviena j tampa lengviau skaitoma, pagrindin
programa tampa veiksm nuoseklumo valdymo priemone.
Uduotis. Vyksta audymo i lanko varybos. Taikinys pritvirtintas prie lentos, turinios elektroninius
daviklius. Lentos apatinio kairiojo kampo koordinats yra (0; 0). Taikinio centras paymtas juodu skrituliu.
Aplink skritul yra nubrti dar trys apskritimai. Strlei pataikius skirtingas taikinio vietas yra skiriamas
skirtingas tak skaiius. Reikia parayti program, kuri, priklausomai nuo strls pataikymo vietos, skirt
sportininkui takus. Yra inomi taikinio duomenys: taikinio centro koordinats (xc; yc), apskritim
spinduliai, strls pataikymo vietos koordinats (x; y) ir tak verts. Jeigu strl pataik ant apskritimo
linijos, tuomet sportininkas gauna pus tak, kurie bt skiriami, jeigu takas bt apskritimo viduje.
Algoritmas. Jei takas nuo apskritimo centro yra atstumu a < r, tuomet takas bus apskritimo viduje, jei a =
r takas bus ant apskritimo, jei a > r takas bus apskritimo iorje. Bet kurio tako koordinats (x, y) yra
realieji skaiiai. Nustatyti, ar du realieji skaiiai yra lygs, nemanoma, nes kiekvienas j bendru atveju po
kablelio turi daug skaitmen. Kompiuteryje realieji skaiiai saugomi tam tikru tikslumu, todl skaiiai
laikomi lygiais tuomet, kai skirtumas tarp j yra nedidelis. Yra laikoma, pavyzdiui, kad du realieji skaiiai
yra lygs, jeigu pirmi penki skaitmenys po kablelio yra vienodi. Daugeliu atvej atliekant skaiiavimus su
realiaisiais skaiiais btina inoti, kokiu tikslumu reikia skaiiuoti.
Pavaizduokime situacij grafikai:
y
xt; yt
tak
ats = ( xc xt ) 2 + ( yc yt ) 2
xc; yc
x
r
---------------------------------------------------------------------------
Pasiruoimas. Sukurkite katalog programos failams saugoti, atverkite FPS terp ir sukurkite programos
fail Darbas10.pas. Udavin suskaidysime dalis:
65
Pirmas ingsnis. Pradini duomen skaitymas. Apraomi kintamieji pradiniams duomenims skaityti ir
uraomi duomen skaitymo sakiniai.
program Darbas10;
var
xc, yc : real;
r1, r2, r3, r4 : real;
t1, t2, t3, t4 : integer;
x, y : real;
begin
//
//
//
//
// Duomen skaitymas
Write ('Taikinio centro koordinat xc = ');
ReadLn
Write ('Taikinio centro koordinat yc = ');
ReadLn
Write ('Pirmojo apskritimo spindulys r1 = ');
ReadLn
Write ('Pirmojo apskritimo takai
t1 = ');
ReadLn
Write ('Antrojo apskritimo spindulys r2 = ');
ReadLn
Write ('Antrojo apskritimo takai
t2 = ');
ReadLn
Write ('Treiojo apskritimo spindulys r3 = '); ReadLn
Write ('Treiojo apskritimo takai
t3 = '); ReadLn
Write ('Ketvirtojo apskritimo spindulys r4 = '); ReadLn
Write ('Ketvirtojo apskritimo takai
t4 = '); ReadLn
Write ('Strls koordinat x = '); ReadLn (x);
Write ('Strls koordinat y = '); ReadLn (y);
ReadLn;
end.
Isaugokite program ir patikrinkite kaip veikia.
(xc);
(yc);
(r1);
(t1);
(r2);
(t2);
(r3);
(t3);
(r4);
(t4);
Antras ingsnis. Strls padiai nagrinti reikalingas jos pataikymo taikin tako atstumas iki
apskritimo centro. Jam skaiiuoti paraykite priskyrimo sakin
ats := Sqrt (Sqr (xc - x) + Sqr (yc - y));
66
Treias ingsnis. Ivados, kur yra takas nurodyto apskritimo atvilgiu, formulavimui reikia inoti, kokiu
tikslumu atlikti apskritimo spindulio ir tako atstumo iki apskritimo centro palyginim. Tam reikia ivesti
skaiiavim tikslumo reikm, kuriai saugoti reikia aprayti realaus tipo kintamj, kur galime pavadinti
tiks.
Papildykite program skaiiavim tikslumo reikms vedimo sakiniais.
Isaugokite program ir patikrinkite, kaip ji dirba. vedus pasirinktus duomenis ekrane matysime,
pavyzdiui, tokias eilutes:
Taikinio centro koordinat xc = 60
Taikinio centro koordinat yc = 80
Pirmojo apskritimo spindulys r1 = 10
Pirmojo apskritimo takai
t1 = 10
Antrojo apskritimo spindulys r2 = 15
Antrojo apskritimo takai
t2 = 8
Treiojo apskritimo spindulys r3 = 20
Treiojo apskritimo takai
t3 = 6
Ketvirtojo apskritimo spindulys r4 = 30
Ketvirtojo apskritimo takai
t4 = 2
Strls koordinat x = 55
Strls koordinat y = 45
Pataikymo tako atstumas iki taikinio centro: 35.35534
Skaiiavim tikslumas: 0.01
Ketvirtas ingsnis. Papildykite program nauju sveikojo tipo kintamuoju tsk, skirtu takams siminti.
Programoje paraykite slygos sakin, kuris patikrina tako padt apskritim atvilgiu ir skaiiuoja takus:
if Abs(ats - r1) < tiks then tsk := t1 div 2
else if ats < r1 then tsk := t1
else if Abs(ats - r2) < tiks then tsk := t2 div 2
else if ats < r2 then tsk := t2
else if Abs(ats - r3) < tiks then tsk := t3 div 2
else if ats < r3 then tsk := t3
else if Abs(ats - r4) < tiks then tsk := t4 div 2
else if ats < r4 then tsk := t4
else tsk := 0;
Slygos sakinyje pirmiausiai reikia patikrinti, ar takas yra ant apskritimo. Jeigu duotu tikslumu gauname
atsakym, kad jis yra ne ant apskritimo, tuomet galima tikrinti, ar viduje, ar iorje. Tokia seka reikalinga
tam, kad iskirtume atvej, ar skaiiai lygs. Tikrinti pradedame nuo vidinio apskritimo.
Patikrinkite, ar programa veikia teisingai. Tam reikia paruoti tiek duomen testini variant, kiek
yra tak skaiiavimo variant: kiekvienam apskritimui, kai takas yra jo viduje, kai ant apskritimo ir kai
jo iorje. Jeigu programos pateikiami rezultatai sutampa su test rezultatais, tuomet galime teigti, kad
programa skaiiuoja teisingai. Norint sitikinti, ar gerai skaiiuojamas atstumas, testiniuose duomen
variantuose reikia apskaiiuoti tako atstumus iki apskritimo centro. Tikslinga patikrinti, ar programa
gerai skaiiuoja, kai apskritimas ir takas yra skirtingose staiakamps koordinai ploktumos vietose.
Klausimai
1. Kodl du realiuosius skaiius reikia lyginti tam tikru tikslumu?
2. Kodl lyginant du realiuosius skaiius i pradi reikia patikrinti, ar jie lygs, o po to nustatyti
pirmas didesnis u antr, ar maesnis?
67
3. Jeigu vietoje apskritimo bt staiakampis, kurio kratins yra lygiagreios koordinai aims, tai
kaip reikt parayti patikrinim, ar takas yra viduje, ar iorje, ar ant kurios nors kratins?
Uduotys
1. Papildykite program, kuri skaiiuot takus, kai sportininkas ov i lanko kelis kartus. Tam reikia
strls pataikymo koordinates, atstumo skaiiavim ir tak skaiiavim atlikti cikle. Papildomu
kintamuoju reikia saugoti, kiek kart sportininkas ov.
2. Ne visuomet taikiniuose yra apskritimai. Pakeiskite program, kai vietoje apskritim turime
staiakampius, kuri kratins lygiagreios koordinai aims.
3. Paraykite program, kuri nustatyt, ar du apskritimai kertasi, jeigu yra inomi j spinduliai ir centr
koordinats.
Smalsiems
Paaikinimai
Taikinio centro koordinats xc ir yc
Pirmojo apskritimo spindulys ir skiriami takai
Antrojo apskritimo spindulys ir skiriami takai
Treiojo apskritimo spindulys ir skiriami takai
Ketvirtojo apskritimo spindulys ir skiriami takai
Skaiiavim tikslumas
Tai pastovs duomenys. Derinant program nereiks kiekvien kart suvedinti taikinio duomen. Jeigu bus
skaiiuojami takai ne vienam viui, tai tereiks tik strls pataikymo koordinates vesti. Jeigu bus kitas
taikinys, tuomet duomen faile tursite duomenis surayti i naujo.
Apraomi pradini duomen kintamieji.
program Darbas10;
var
xc, yc : real;
r1, r2, r3, r4 : real;
t1, t2, t3, t4 : integer;
tiks : real;
//
//
//
//
//-----------------------------------------------procedure SkaitytiDuomenis;
var Fd : text;
begin
Assign(Fd, 'TaikinysDuom.txt'); Reset(Fd);
ReadLn(Fd, xc, yc);
ReadLn(Fd, r1, t1);
ReadLn(Fd, r2, t2);
ReadLn(Fd, r3, t3);
ReadLn(Fd, r4, t4);
ReadLn(Fd, tiks);
Close(Fd);
68
end;
//--------- Pagrindin programa (manau, kad reikt akcentuoti)
begin
SkaitytiDuomenis;
// Duomen skaitymas
ReadLn;
end.
Isaugokite program ir patikrinkite kaip veikia. Jeigu joki klaid nra, tuomet galite sitikinti, ar
duomenys i failo perskaityti teisingai. Tam galite parayti kit procedr:
//------------------------------------------------procedure RodytiDuomenis;
begin
WriteLn('xc = ', xc:5:2, ' yc = ', yc:5:2);
WriteLn('r1 = ', r1:5:2, ' t1 = ', t2:5);
WriteLn('r2 = ', r1:5:2, ' t2 = ', t2:5);
WriteLn('r3 = ', r1:5:2, ' t3 = ', t2:5);
WriteLn('r4 = ', r1:5:2, ' t4 = ', t2:5);
WriteLn('Tikslumas: ', tiks:8:5);
end;
//------------------------------------------------Procedra RodytiDuomenis raoma toliau po duomen skaitymo procedros, taiau prie pagrindin
program.
Pagrindinje programoje paraykite kreipin procedr: RodytiDuomenis;
Isaugokite program ir patikrinkite kaip veikia. Jeigu joki klaid nra, tuomet ekrane matysite
pradinius duomenis
xc= 60.00 yc = 80.00
r1= 10.00 t1 =
10
r2= 15.00 t2
8
r3= 20.00 t3=
6
r4= 30.00 t4=
2
Tikslumas: 0.01000
Antras ingsnis. Strls padiai nagrinti reikalingas jos pataikymo taikin tako atstumas iki
apskritimo centro. Jam skaiiuoti toliau pagrindinje programoje paraykite priskyrimo sakin:
ats := Sqrt (Sqr (xc - x) + Sqr (yc - y));
21.21320
69
Treias ingsnis. Tak skaiiavimas.
Papildykite program nauju sveikojo tipo kintamuoju tsk, skirtu takams siminti. Paraykite
procedr, kurioje paraykite slygos sakin, kuris patikrina tako padt apskritim atvilgiu ir
skaiiuoja takus:
//-------------------------------------------------------------------procedure Taskai;
begin
if Abs(ats - r1) < tiks then tsk := t1 div 2
else if ats < r1 then tsk := t1
else if Abs(ats - r2) < tiks then tsk := t2 div 2
else if ats < r2 then tsk := t2
else if Abs(ats - r3) < tiks then tsk := t3 div 2
else if ats < r3 then tsk := t3
else if Abs(ats - r4) < tiks then tsk := t4 div 2
else if ats < r4 then tsk := t4
else tsk := 0;
end;
//--------------------------------------------------------------------
Slygos sakinyje pirmiausia reikia patikrinti, ar takas yra ant apskritimo. Jeigu duotu tikslumu gauname
atsakym, kad jis yra ne ant apskritimo, tuomet galima patikrinti, ar viduje, ar iorje. Tokia seka reikalinga
tam, kad iskirtume atvej, ar skaiiai lygs. Tikrinti pradedame nuo vidinio apskritimo.
Papildykite program sakiniais, skirtais strls pataikymo taikin koordinai reikmi vedimui
klaviatra:
Write ('Strls koordinat x = '); ReadLn (x);
Write ('Strls koordinat y = '); ReadLn (y);
Patikrinkite, ar programa veikia teisingai. Tam reikia paruoti tiek duomen testini variant, kiek
yra tak skaiiavimo variant: kiekvienam apskritimui, kai takas yra jo viduje, kai ant apskritimo ir kai
jo iorje. Jeigu programos pateikiami rezultatai sutampa su test rezultatais, tuomet galime teigti, kad
programa skaiiuoja teisingai. Norint sitikinti, ar gerai skaiiuojamas atstumas, testiniuose duomen
variantuose reikia apskaiiuoti tako atstumus iki apskritimo centro. Tikslinga patikrinti, ar programa
gerai skaiiuoja, kai apskritimas ir takas yra skirtingose staiakamps koordinai ploktumos vietose.
Programos skaiiavim rezultat ekrane pavyzdys:
70
21.21320
Uduotys.
1. Inagrinkite pirmojo programos varianto klausimus ir atlikite pateiktas uduotis.
2. Tak skaiiavimo slygos sakinys sudtingas. Jeigu taikinyje bt daugiau apskritim, jis tapt dar
sudtingesnis). Pagalvokite, kaip galima bt supaprastinti tak skaiiavim.
71
2.11. Elektros grandins varos skaiiavimas
i uduotis yra paimta i 2006 m. informacini technologij valstybinio egzamino. Atlikdami darb
susipainsite su ciklas cikle struktra. Ibandysite skaitymo i failo ir raymo fail veiksmus. Prisiminsite
sumavimo algoritm.
I fizikos kurso inome, kad lygiagreiai sujungt laidinink bendra vara skaiiuojama pagal formul
1 1
1
1
1
=
+
+
+ ... +
, ia R lygiagreiai sujungt laidinink vara, R1, R2, , Rn atskir
R R1 R2 R3
Rn
laidinink varos.
Nuosekliai sujungt laidinink bendra vara skaiiuojama pagal formul R = R1 + R2 + + Rn, ia R
nuosekliai sujungt laidinink bendra vara, R1, R2, , Rn atskir laidinink varos.
Uduotis. Paraykite program, kuri apskaiiuot grandins bendr var, kai grandin sudaro viena ar
daugiau nuosekliai sujungt grandins dali; kiekviena grandins dalis sudaryta i dviej ar daugiau
lygiagreiai sujungt inomos varos laidinink.
Programa turi skaityti duomenis i tekstinio Duomenys.txt failo. Pirmoje failo eilutje raytas nuosekliai
sujungt grandins dali skaiius (ne daugiau kaip 100). Po to atskirose eilutse surayti grandin sudarani
dali duomenys: lygiagreiai sujungt laidinink skaiius (ne daugiau kaip 50) ir j var reikms.
Rezultat apskaiiuot grandins bendr var programa turi rayti Rezultatai.txt fail dviej
enkl po kablelio tikslumu.
Pavyzdys
Duomen failas
3
2 15 41
4 1 2 3 4
3 22 11 24
Duomen paaikinimas
Rezultat failas
R3
R1 15
R4
R2 41
R5
R6
R7 22
R8 11
3
4
17.08
R9 24
Traioji grandins dalis
Skaiiavimas:
L1 =
1
1
1
1
1
1
1
1
1
+ ; L2 =
+
+
+ ; L3 =
+
+
R1 R2
R3 R4 R5 R6
R7 R8 R9
skaiiavimas,
R=
1
1
1
+
+
grandins bendra vara.
L1 L2 L3
grandins
dali
laidum
72
Algoritmas. Kaip pastebite, pirmiausia reikia apskaiiuoti atskir grandins dali varas, pagal aukiau
duot formul ir po to jas susumuoti. iose dalyse laidininkai sujungti lygiagreiai. Pavyzdyje pavaizduotos
trys tokios dalys. Yra inoma kiek kiekvienoje dalyje yra laidinink. Pradioje sivaizduokite, kad grandin
sudaro tik viena dalis, sudaryta i k lygiagreiai sujungt laidinink. Tegul i laidinink varos suraytos
tekstiniame faile Duomenys.txt vienoje eilutje tokia seka: pirmasis skaiius k eilutje nurodo laidinink
skaii, o toliau surayta k laidinink varos. Duomen failo Duomenys.txt pavyzdys:
2 15 41
Duomenims i failo nuskaityti reikia naudoti cikl for. Cikle reikia atlikti atskir laidinink var
sumavim. Nepamirkite prie cikl var sumai priskirti reikm lygi 0.
Pasiruoimas. Sukurkite katalog programos failams saugoti, atverkite FPS terp ir sukurkite programos
fail Darbas11.pas.
Pirmas ingsnis. Vienos dalies laidinink varos skaiiavimas. Tai nesudtingas ciklinis sumos kaupimo
algoritmas. Toliau atlikite sekanius veiksmus.
Sukurkite tekstin duomen fail Duomenys.txt ir j raykite aukiau pateikto pavyzdio vien
eilut.
Programos pradioje apraykite programoje naudojamus kintamuosius.
Paruokite duomen fail vedimui.
Sumos kaupimo kintamajam L priskirkite reikm lygi 0.
veskite duomenis: pirmiausia veskite laidinink skaii k, o po to naudodami cikl for veskte ir kartu
sumuokite laidinink varas.
Udarykite duomen fail.
Atspausdinkite gaut rezultat.
Isaugokite ir vykdykite program.
program Darbas11;
const CDuom = 'Duomenys.txt';
//-----------------------------------------------------------------------------var k,
// Vienos dalies var skaiius
j : integer;
// Ciklo kintamasis
L,
// Vienos dalies laidumas
rj : real;
// Vieno laidininko vara
F : text;
// Failo kintamasis
begin
Assign(F, CDuom); Reset(F);
L := 0;
Read(F, k);
for j := 1 to k do
begin
Read(F, rj);
// Skaitoma vara
L := L + 1 / rj; // Laidum sumavimas
end;
ReadLn(F);
// Vienos dalies var srao pabaiga
Close(F);
WriteLn('Laidinink vara: ', 1/L:8:2);
ReadLn;
end.
73
Laidinink vara
10.98
Ibandykite i program dar du kartus. Pirmj kart duomen fail Duomenys.txt raykite
4 1 2 3 4
o antrj kart
3 22 11 24
Pirmuoju atveju rezultatas laidinink vara turt bti 0.48, o antruoju 5.62.
Susumavus visus programos bandymus su pradiniais duomenimis (ir. schem) rezultatas turt bti toks:
10.98 + 0.48 + 5.62 = 17.08.
Kaip pastebjote is rezultatas pilnai sutampa su pavyzdio rezultatu. Taiau akivaizdu, kad toks darbas su
programa neteikia malonumo, nes atliekant skaiiavimus kiekvienai grandins daliai reikia keisti.duomen
failo turin ir vl i naujo paleidinti program. O be to dar gali prisireikti kalkuliatoriaus susumuojant visos
grandins dali varas. Reikia iekoti ieities i ios situacijos.
Antras ingsnis. Vis nuosekliai sujungt grandins dali bendrai varai rasti programoje reikalingas dar
vienas ciklas for, kuris turi apgaubti ankstesnj cikl for. iam ciklui atlikti, kaip ir ankstesnio ciklo
atveju, reikalingi analogiki paruoiamieji veiksmai.
Pakeiskite duomen failo Duomenys.txt turin tokiu, koks buvo nurodytas darbo pradioje
Papildykite programos kintamj apraus.
Visos grandins sumos kaupimo kintamajam R priskirkite reikm lygi 0.
veskite grandins dali skaii n.
Uraykite cikl for kartu su operatoriniais skliaustais begin..end, kurie apgaubs ankstenj (vidin)
cikl for.
Vidiniam ciklui priklausanius sakinius pastumkite dein. Tai atlikus programa tampa vaizdesn ir tuo
paiu suprantamesn.
Prie pasibaigiant iam ciklui uraykite sumavimo veiksm R := R + 1/L, kuris sumuos atskir
grandins dali (sujungt lygiareiai) varas, suskaiiuotas vidiniame cikle.
Pakeiskite rezultato spausdinimo sakin tokiu
WriteLn('Visos grandins laidinink vara: ', R:8:2);
74
ReadLn(F, n);
for i := 1 to n do
begin
L := 0;
Read(F, k);
for j := 1 to k do
begin
Read(F, rj);
// Skaitoma vara
L := L + 1 / rj; // Laidum sumavimas
end;
ReadLn(F);
// Vienos dalies var srao pabaiga
R := R + 1 / L;
end;
Close(F);
WriteLn('Visos grandins laidinink vara: ', R:8:2);
ReadLn;
end.
17.08
Kaip matote rezultatas sutapo su tuo rezultatu, kuris buvo gautas ankstesn program leidiant tris kartus. Be
to iuo atveju nereikjo kaitalioti duomen failo turinio. Na ir galiausiai nereikjo atlikti atskir grandins
var sumavimo rankomis. Dar kart pavelkite program. Netiktina, j sudaro tik 30 eilui!
Treias ingsnis. Grkime prie uduoties programa gaut rezultat (tik skaii 17.08) turi rayti
rezultat fail Rezultatai.txt.
Pakeiskite rezultato spausdinimo sakin
WriteLn('Visos grandins laidinink vara: ', R:8:2);
tokiais sakiniais
Assign(F, 'Rezultatai.txt'); Rewrite(F);
WriteLn(F, R:8:2);
Close(F);
Klausimai
1.
2.
3.
4.
75
Uduotys
1. Tekstiniame faile atskirose eilutse yra surayta Js klass mokini metiniai vertinim paymiai
(viso 10 paymi). Paraykite program, kuri apskaiiuot kiekvieno mokinio paymi vidurk ir j
atspausdint rezultat faile tokiu pavidalu: mokinio numeris, vidurkis.
2. Tekstiniame faile atskirose eilutse yra surayta miesto troleibus marrut atstumai (metrais) tarp
vis marruto stoteli. Eilui pradioje uraytas atitinkamo marruto stoteli skaiius. Paraykite
program, kuri apskaiiuot kiekvieno troleibus marruto ilg.
Smalsiems
76
ReadLn;
end.
Isaugokite ir vykdykite program. Ekrane matysite tok pat rezultat, kaip ir ankstesnje programos
versijoje
Antras papildomas ingsnis. Pabandykite aukiau sukurt procedr pertvarkyti funkcij. Tam
reikia atlikti labai nedidelius pakeitimus aukiau uraytoje programoje.
Kaip procedr pertvarkyti funkcij:
procedros antrat pakeisti tokia
function RGrandies(var F : text) : real;
procedroje vietoj sakinio R := 1 / L; uraykite sakin RGrandies := 1 / L;
pagrindinje programoje vietoje cikle for esani operatorini skliaust (4 eiluts) uraykite sakin
R := R + RGrandies(F);
Isaugokite ir vykdykite program. Ekrane matysite tok pat rezultat, kaip ir ankstesnje programos
versijoje
77
2.12. Grafikos pradmenys
Atlikdami darb susipainsite su Paskalio kalbos struktromis, skirtomis grafiniam ekrano reimui valdyti
ir imoksite kurti paprastus grafinius objektus.
Free Pascal terpje grafiniam ekrano reimui valdyti skirtos struktros yra saugomos bibliotekoje Graph.
Prijungus ir aktyvizavus bibliotek Graph, sukuriamas grafinis langas, kuriame koordinai pradia (0; 0)
yra kairysis virutinis ekrano takas. x ais nukreipta dein, y emyn. Be to, koordinats yra tik sveikos ir
teigiamos.
Atlikdami darb ibandysite bibliotek Graph ir Crt galimybes.
Pirmas ingsnis. Bibliotekos Graph, kurioje yra visos reikalingos standartins procedros, prijungimas,
apskritimo braiymas.
Po programos antrate terpkite sakin uses Graph; iuo sakiniu prijungiama grafikos biblioteka.
Biblioteka Graph aktyvizuojama pagrindinje programoje, uraant sakin:
Initgraph (gd, gm, ''); ia gd ir gm sveikojo tipo kintamieji, kurie apraomi prie pagrindin
program. Kreiptis bibliotekos standartines procedras galima i bet kurios programos vietos ar
programoje esanios procedros.
Programoje paraykite kreipin standartin procedr Circle, kad bt braiomas apskritimas, kurio
centras yra take (100; 100), o spindulys 50:
program Darbas12;
uses Graph;
var gd, gm : integer;
begin
Initgraph (gd, gm,'');
Circle (100, 100, 50);
ReadLn;
end.
78
for i := 1 to 100 do
begin
x := Random (1000);
y := Random (800);
r := Random (100);
s := Random (256);
SetColor (s);
Circle (x, y, r);
end;
ReadLn;
end.
Isaugokite ir vykdykite
sukurt program. Jei visk
atlikote teisingai, ekrane
turtumte matyti pana
vaizd:
Ibandykite, kaip veikia
programa su atsitiktinai
sugeneruotomis reikmmis
i kito intervalo.
Treias ingsnis. Apskritimo linijos storio ir upildo spalvos bei rato keitimas.
program Darbas12;
uses Graph;
var gd, gm : integer;
x, y, r : integer;
s, sr : integer;
// sr - upildo rato spalva
i : integer;
storis : integer;
// Kontro linijos storis
tipas : integer;
// Kontro linijos tipas
rastas : integer;
// Upildo ratas
begin
Initgraph (gd, gm,'');
Randomize;
for i := 1 to 100 do
begin
x := Random (1000);
y := Random (800);
r := Random (100);
s := Random (256);
sr := Random (256);
SetColor (s);
storis := Random (4);
// Atsitiktinai generuojamas kontro linijos storis
79
tipas := Random (5);
// Atsitiktinai generuojamas kontro linijos tipas
SetLineStyle (tipas, tipas, storis); // Nurodomos linij charakteristikos
SetColor (sr);
// Atsitiktinai generuojama rato spalva
rastas := Random (13);
// Atsitiktinai generuojamas rato tipas
SetFillStyle (rastas, sr);// Nurodomas ratas ir spalva, kurie bus naudojami upildymui
FillEllipse (x, y, r, r); // Braioma upildyta elips, kurios centro koordinats yra (x; y), o
// abu spinduliai vienodi ir lygs r (taip gaunamas apskritimas,
// kuris yra atskiras elipss atvejis).
end;
ReadLn;
end.
Isaugokite ir vykdykite sukurt program. Jei visk atlikote teisingai, ekrane turtumte matyti pana
vaizd:
Ibandykite, kaip veikia programa parinkus kitas elipss spinduli reikmes. Pavyzdiui, pakeit kreipin
procedr FillEllipse tokiu:
FillEllipse (x, y, r, 2 * r);
80
Ketvirtas ingsnis. Judesio programavimas.
Nordami suprogramuoti judes pasinaudosime galimybe apgauti mogaus ak: rodant kelet ar
keliolika paveikslli, tam tikru laiko intervalu. Laiko tarpas apraomas milisekundmis t. Norim laiko
tarp aprao procedra Delay (t). i procedra yra bibliotekoje Crt.
Treiame ingsnyje sukurt program papildykite prijungdami bibliotek Crt: uses Graph, Crt;
Program cikle papildykite kreipiniu procedr Delay: Delay (500);
Isaugokite ir vykdykite sukurt program. Kreipinyje procedr Delay pakeiskite laiko tarpo
reikm ir stebkite situacij. Pastebjote, kad tarpas tarp apskritim pasirodymo keiiasi.
Penktas ingsnis. Garsai.
Nordami papildyti sukurt program garsais, pasinaudosime bibliotekos Crt procedra Sound (garso
danis).
Prie kreipin procedr Delay raykite kreipin procedr Sound: Sound (500);
Isaugokite ir vykdykite sukurt program. Pastebjote, kad parodant kiekvien nauj apskritim,
pasigirsta garsas. Kreipinyje procedr Sound pakeiskite danio reikm ir stebkite situacij. Itirkite,
kokio danio garsai erzina klaus, kokio danio gars jau nebegirdite.
Isamiai visos bibliotek Graph ir Crt procedros ir funkcijos yra apraytos FPS terps inyne, daug
pavyzdi atrasite internete.
Uduotys
1. Pakeiskite antrame ingsnyje sukurt program taip, kad grafiniame ekrane bt rodomi ne apskritimai,
o staiakampiai. Staiakampis pieiamas naudojant bibliotekos Graph procedr
Rectangle (x1, y1, x2, y2).
ia x1, y1 staiakampio kairiojo virutinio kampo koordinats, x2, y2 staiakampio deiniojo
apatinio kampo koordinats. Staiakampio koordinats turi bti generuojamos atsitiktinai.
2. Pakeiskite treiame ingsnyje sukurt program taip, kad grafiniame ekrane bt rodomi vairiais ratais
upildyti vairaus dydio staiakampiai. Upildytas staiakampis pieiamas naudojant bibliotekos Graph
procedr
Bar (x1, y1, x2, y2).
ia x1, y1 staiakampio kairiojo virutinio kampo koordinats, x2, y2 staiakampio deiniojo
apatinio kampo koordinats. Staiakampio koordinats turi bti generuojamos atsitiktinai. Program
papildykite kreipiniais procedras Delay ir Sound.
81
2.13. Reklaminiai uraai grafiniame ekrane
Atlikdami darb imoksite panaudoti grafikos galimybes reklamini ura ekrane krimui.
Pirmas ingsnis. Bibliotek Graph ir Crt prijungimas, ekrano fono upildymas atsitiktinai
generuojamais skirting spalv takais.
Sukurkite program:
program Darbas13;
uses Graph, Crt;
var gd, gm : integer;
x, y : integer;
// Tako koordinatms
s : integer;
// Tako spalvai
i : integer;
begin
Initgraph (gd, gm,'');
Randomize;
for i := 1 to 10000 do
begin
x := Random (1000);
y := Random (800);
s := Random (256);
PutPixel (x, y, s);
end;
ReadLn;
end.
ioje programoje naudojama bibliotekos Graph procedra PutPixel(x, y, spalva), kuri ekrane
vaizduoja atsitiktinai sugeneruotos spalvos tak, kurio koordinats (x; y) yra sveikieji skaiiai,
sugeneruoti panaudojant standartin Paskalio funkcij Random.
Isaugokite ir vykdykite sukurt program. Jei visk atlikote teisingai, ekrane turtumte matyti daug
vairiaspalvi tak.
Antras ingsnis. Programos papildymas reklaminiu urau.
Nordami program papildyti reklaminiu urau, panaudosime bibliotekos Graph procedr
OutTextXY (x, y, tekstas), ia x ir y tako, nuo kurio pradedamas rayti tekstas, koordinats,
tekstas viengubose kabutse raomas tekstas. Jei procedr uraysime OutText (tekstas),
tuomet tekstas bus raomas nuo nuo grafinio ymeklio.
Programoje prie ciklo sakin terpkite kreipin procedr OutText:
OutTextXY (20, 20, 'Programuojame Paskaliu');
Isaugokite ir vykdykite sukurt program. Jei visk atlikote teisingai, ekrane turtumte matyti daug
vairiaspalvi tak ir ura Programuojame Paskaliu.
Treias ingsnis. Reklaminio urao teksto rifto, krypties, dydio keitimas.
Nordami programoje nustatyti reklaminio urao teksto parametrus, eilute panaudosime bibliotekos
Graph procedr SetTextStyle (sriftas, kryptis, dydis). Parametras sriftas leidia
pasirinkti vien i 5 rift. parametras gyja reikmes nuo 0 iki 4. Parametras kryptis nurodo raymo
krypt: jei parametras kryptis lygus nuliui, tekstas raomas horizontaliai, jei 1 vertikaliai. Parametras
dydis gali bti skaiius nuo 1 iki 10.
Programoje prie reklamins eiluts raymo sakin terpkite kreipin procedr SetTextStyle:
SetTextStyle (4, 0, 5);
Isaugokite ir vykdykite sukurt program. Jei visk atlikote teisingai, ekrane turtumte matyti pana
vaizd:
82
program Darbas13;
uses Graph;
var gd, gm : integer;
x, y : integer;
// Tako koordinatms
s : integer;
// Tako spalvai
i : integer;
xe, ye : integer;
// Teksto koordinats
sr, kr, d : integer;
// Teksto formatai
sp : integer;
// Teksto spalva
begin
Initgraph (gd, gm,'');
Randomize;
for i := 1 to 10000 do
begin
x := Random (1000);
y := Random (800);
s := Random (256);
PutPixel (x, y, s);
end;
for i := 1 to 100 do
begin
xe := Random (1000);
ye := Random (800);
sr := Random (5);
kr := Random (2);
d := Random (11);
sp := Random (256);
SetColor (sp);
SetTextStyle (sr, kr, d);
OutTextXY (xe, ye, 'Programuojame Paskaliu');
Delay (1000);
end;
ReadLn;
end.
83
Isaugokite ir vykdykite sukurt program. Jei visk atlikote teisingai, ekrane turtumte matyti pana
vaizd. Skirtingais laiko tarpais skirtingose ekrano vietose atsiranda skirtingos spalvos, dydio ir krypties
uraai.
Uduotis
Sukurkite ura ekrane, kuris reklamuot domi knyg. Kurdami ura panaudokite vairias bibliotek
Graph ir Crt procedras ir funkcijas, suteikite judes, papildykite garsais.
84
2.14. Judesys.
Paprasiausio judesio imitacija gaunama t pat paveiksl perpieiant kitoje ekrano vietoje. Vien judesio
ingsn sudaro trys veiksmai: paveikslo pieimas, pauz ir paveikslo valymas. Nepertraukiamo judesio
vaizdas priklauso nuo paveikslo dydio, pieimo bdo ir pauzs ilgio. Sudtingesnius paveikslus tikslinga
vien kart nupieti ir isaugoti atmintinje santykinmis koordinatmis. Vliau toks paveikslas rodomas
skirtingose ekrano vietose. ia demonstruojamas paprasiausias perpieimo bdas. Sudtingesnius bdus ir
daugiau informacijos galite rasti literatroje. Norint jais pasinaudoti, reikia inoti sudtingesnes duomen
struktras ir algoritmus.
Ankstesniuose darbuose grafinio ekrano dydis buvo parenkamas pagal nutyljim ir sutapo su kompiuterio
ekranu. Buvo parenkama standartin grafinio ekrano tvarkykl. Norint sumainti ekran, reikjo pele
paspausti vidurin ekrano viruje deinje esant mygtuk:
Sumainus lang, po juo rasime tekstin programos lang. J galima aktyvizuoti pele. Taip pat galime
padaryti pele perjungus kompiuterio ekrano apaioje paspaudus langus perjungianius mygtukus:
Sumainus grafin ekran, galite parinkti jo dyd taip, kad bt matomi abu langai, pavyzdiui programoje
Darbas12, galime gauti tok lang idstym ekrane:
85
Paraome procedr, kuri ekrane atsitiktinai pieia nurodyt skaii spalvot skrituli ir j
ibandome. Gauname vaizd, pana gautam Darbas12 programoje.
program Darbas14;
uses Crt, Graph;
//--------------------------------------------------------------------------// Ekrane pieiami n skrituli. Ekrano plotis dx ir aukitis dy
procedure Skrituliai( n : byte; dx, dy : integer);
var x, y, r : integer; // Skritulio koordinats ir spindulys
i : integer;
begin
Randomize;
for i := 1 to n do begin
SetFillStyle( Random(11), Random(15) );
// Parenkama upildymo ratas
SetColor(Random(11) ); SetLineStyle( 0, 0, 1 ); // Kontro spalva ir linija
x := Random( dx - 30 ) + 20;
y := Random( dy - 30 ) + 20;
r := Random( 30 ) + 5;
FillEllipse( x, y, r, r );
end;
end;
//====================================================================
var
dx, dy : integer;
begin
Ekranas(dx, dy);
// Grafinio ekrano aktyvizacija
WriteLn(dx, ' ', dy);
// Tekstiniame ekrane spausinamas grafinio ekrano plotis ir auktis
Skrituliai( 25, dx, dy ); // Ekrane pieiami 25 skrituliai
ReadLn;
CloseGraph;
end.
86
program Darbas14;
uses Crt, Graph;
//--------------------------------------------------------------------------procedure Skrituliai( n : byte; dx, dy : integer);
//--------------------------------------------------------------------------// Pieiama saulut, kurios koordinats ekrane (x, y), o spindulys r
procedure Saulute(
x, y, r : integer);
var t, t1, t2, t3, t4, t5 : word;
begin
// Skaiiuojamos sauluts element santykins reikms, priklausomai nuo pateikt per parametrus dyi
t := r div 4; t1 := r div 5; t2 := r div 7;
t3 := r div 8; t4 := r div 2; t5 := Trunc( r / Sqrt( 2));
SetColor( Black );
SetFillStyle( 1, Yellow );
FillEllipse( x, y, r, r );
// Geltonas skritulys
SetFillStyle( 1, White );
FillEllipse( x-t, y-t4, t2, t1 );
SetFillStyle( 1, Black );
FillEllipse( x-t, y-t4+3, t3, t3 );
Arc( x, y+t-2, 180, 360, r-t );
Arc( x, y-t,
210, 340, r-2 );
SetFillStyle( 1, Red );
// Akys
FillEllipse( x+t, y-t4, t2, t1 );
FillEllipse( x+t, y-t4+3, t3, t3 );
// ypsena
FloodFill( x, y-t+r, Black );
SetColor( red );
// Nosyt
SetLineStyle( 0, 0, 1 );
Arc( x, y+2, 30, 150, t-2 );
end;
//====================================================================
var
dx, dy : integer;
x, y : integer;
begin
Ekranas(dx, dy);
// Grafinio ekrano aktyvizacija
// Tekstiniame ekrane spausinamas grafinio ekrano plotis ir auktis
WriteLn(dx, ' ', dy);
Skrituliai( 25, dx, dy );
// Ekrane pieiami 15 skrituli
x := dx div 2;
y := dy div 2; // Saulut bus pieiama ekrano centre
Saulute( x, y, r );
// Saulut ekrano centre
ReadLn;
CloseGraph;
end.
Ibandykite program, nupiedami saulut ekrano centre. Sauluts spindulys nurodomas konstanta, kuri
paraoma programos pradioje const r = 40;
87
program Darbas14;
uses Crt, Graph;
//--------------------------------------------------------------------------procedure Skrituliai( n : byte; dx, dy : integer);
//--------------------------------------------------------------------------procedure Saulute(
x, y, r : integer);
//--------------------------------------------------------------------------// Generuojama nauja judesio kryptis: koordinai pokyio reikms x ir y
procedure Eiti( var x, y : integer );
var al : integer;
begin
repeat
al := Random( 360 );
x := Trunc( Cos( al / 180 * Pi )*20);
y := Trunc( Sin( al / 180 * Pi )*20);
until ( x <> 0 ) or ( y <> 0 );
end;
//--------------------------------------------------------------------// Sauluts judesys ekrane
procedure Judesys(k, x, y, dx, dy : integer; S : pointer);
var zx, zy : integer;
// Sauluts koordinai pokytis
begin
PutImage( x-k, y-k, S^, 1 );
// Saulut perkeliama ekran
repeat
Eiti( zx, zy );
// Saulutes judesio zingsniai
Skrituliai( 25, dx, dy );
while ( x < dx-k ) AND ( x > k ) AND // Judesys iki ekrano krato
( y < dy-k ) AND ( y > k ) AND
NOT KeyPressed
do begin
PutImage( x-k, y-k, S^, 1 );
// Saulut perkelima ekran
Delay( 10 );
PutImage( x-k, y-k, S^, 1 );
// Sauluts valymas senoje vietoje
x := x + zx; y := y + zy;
// Naujo vietos koordinats
end;
x := x - zx;
y := y - zy;
// Sugrtama ekran
until KeyPressed;
end;
//====================================================================
var
dx, dy : integer;
x, y : integer;
k : integer;
S : pointer;
// Rodykl atmintins viet, kurioje bus saugomas paveikslas
begin
Ekranas(dx, dy);
// Grafinio ekrano aktyvizacija
WriteLn(dx, ' ', dy);
// Tekstiniame ekrane spausdinamas grafinio ekrano plotis ir auktis
k := 2*r;
// Sauluts skersmuo
x := dx div 2;
y := dy div 2; // Ekrano centras
GetMem( S, ImageSize( 0, 0, 2*k, 2*k )); // Atminties iskyrimas saulutei saugoti
Saulute( x, y, r );
// Pieiama saulut
GetImage( x-k, y-k, x+k, y+k, S^ );
// Saulut uraoma atmintinje
Judesys(k, x, y, dx, dy, S);
// Sauluts judesio ekrane imitacija
88
ReadLn;
CloseGraph;
end.
89
2.15. Laikrodis.
Uduotis. Reikia sukurti laikrod, veikiant grafiniame reime. Laikrodio fone idstyti valand skaiius
nuo 1 iki 12. Laikrodis privalo turti tris rodykles: valandoms, minutms ir sekundms rodyti. Rodykls turi
judti.
Sprendiant udavin bus reikalingi du dalykai: trigonometrijos inios ir ekrano grafinis reimas.
Pirmiausia prisiminkime trigonometrij ir j susiekime su laikrodiu. Paprasiausio laikrodio paviriuje
(daniausiai apskritimu) yra suraytos valand reikms nuo 1 iki 12. Kaip inote apskritimas turi 360
laipsni. Taigi, valandos yra idstytos kas 30 laipsni (360/12), minuts ir sekunds kas 6 laipsniai.
Paprasiausias laikrodis turi tris rodykles valandoms, minutms ir sekundms rodyti. Kiekviena rodykl yra
tam tikro ilgio, storio ir spalvos. ios rodykls sukasi ratu ir rodo laik (1 pav.).
t
y
k
x
90
i procedra paruoia kompiuterio ekran darbui grafiniu reimu, t. y. sukuria grafin lang Graph window
application.
graphDriver kintamasis, kurio reikm paprogramei nurodo, kokia bus ekrano grafikos tvarkykl.
graphMode konstanta, kuri nusako ekrano format: tak skaii, spalvas ir j kiek, grafini puslapi kiek.
Nenurodius reikms, parenkama standartin pagal nutyljim.
driverPath kelias katalog, kur saugomas grafikos tvarkykls failas.
grOK standartin konstanta, kurios reikm ymi, kad grafikos reimas jungtas teisingai.
function GraphResult : integer funkcija, kurios rezultatas yra reikm, rodanti, ar skmingai buvo
jungtas grafikos reimas. Galim neskmi prieast rodo funkcijos grinama reikm.
procedure CloseGraph; ijungia grafikos reim. Grtama tekstin darbo reim.
function GetMaxX : integer;
function GetMaxY : integer;
ios funkcijos grina grafinio ekrano tak kiek horizontalia ir vertikalia kryptimis. Tai galimos
didiausios X ir Y koordinai reikms. Atskaitos takas yra kairysis virutinis ekrano kampas, kurio
koordinats (0, 0).
Dabar galima praktikai palaipsniui pereiti grafin ekrano darbo reim.
Pasiruoimas darbui. Sukurkite katalog programos failams saugoti, atverkite FPS terp ir sukurkite
programos fail Darbas15.pas.
91
repeat
until KeyPressed;
CloseGraph;
ReadLn;
end.
vykd program, ekrane matysite grafin lang Graph window application su apskritimu lango centre:
Darome ivad, kad perjimas grafin programos darbo reim buvo skmingas. Darb galima tsti toliau.
Antras ingsnis. Laikrodio valand skaii, nuo 1 iki 12 suraymas grafiniame ekrane
Papildykite ankstesn program sekaniomis trimis paprogrammis ir j vykdykite.
// Grina laikrodio rodykls koordinat x; laikas - laiko reikm; ilgis - rodykls ilgis
function X_Koord( laikas : word; ilgis : integer ) : integer;
// Grina laikrodio rodykls koordinat y; laikas - laiko reikm; ilgis - rodykls ilgis
function Y_Koord( laikas : word; ilgis : integer ) : integer;
// Nubraiomas laikrodio fonas, t. y. aplink idstoma 12 skaii (valand)
// mx, my - grafinio lango dydis; cx, cy - grafinio lango centro koordinates
procedure Fonas ( mx, my, cx, cy : integer );
92
if klaida <> grOk then
begin
WriteLn ( 'Klaidos kodas: ', klaida );
WriteLn ( 'Programa nutraukta.' );
ReadLn;
Halt (1);
end
end;
// Grina laikrodio rodykls koordinat x; laikas - laiko reikm; ilgis - rodykls ilgis
function X_Koord( laikas : word; ilgis : integer ) : integer;
var k : real;
x : integer;
begin
if laikas > 360 then
laikas := laikas - 360;
k := laikas * Pi / 180;
x := - Round ( ilgis * cos( k ) * 639 / 250 );
X_Koord := x;
end;
// Grina laikrodio rodykls koordinat y; laikas - laiko reikm; ilgis - rodykls ilgis
function Y_Koord( laikas : word; ilgis : integer ) : integer;
var k : real;
y : integer;
begin
if laikas > 360 then
laikas := laikas - 360;
k := laikas * Pi / 180;
y := - Round ( ilgis * sin( k ) );
Y_Koord := y;
end;
// Nubraiomas laikrodio fonas, t. y. aplink idstoma 12 skaii (valand)
// mx, my - grafinio lango dydis; cx, cy - grafinio lango centro koordinates
procedure Fonas ( mx, my, cx, cy : integer );
var x, y : integer;
i : integer;
sk : string;
begin
Bar ( 40, 10, mx - 40, my - 10 );
for i := 1 to 12 do
begin
Str ( i, sk );
SetTextStyle ( 0, 0, 2 );
x := X_Koord ( i * 30 + 90, 70 );
y := Y_Koord ( i * 30 + 90, 70 );
MoveTo ( cx + x, cy + y );
SetTextJustify ( 1, 1 );
SetColor ( Green );
OutText ( sk );
end
end;
// --------------------------------- Pagrindin programa -------------------------------------------var
mx, my : integer;
// Grafinio lango imatavimai
cx, cy : integer;
// Grafinio lango centro koordinats
93
begin
GrafinisEkranas;
// Pereinama grafin darbo reim
mx := GetmaxX;
my := GetmaxY;
cx := mx div 2;
cy := my div 2;
// Circle(cx, cy, 100); // Lango centre pieiamas apskritimas
Fonas ( mx, my, cx, cy ); // Nubraiomas laikrodio fonas
repeat
until KeyPressed;
CloseGraph;
ReadLn;
end.
vykd program ekrane matysite grafin lang Graph window application su laikrodio fonu:
---------------------------------------------------------------------------
// Bria linij nukreipt i centro (taskas (cx, cy)) atitinkam tak, kuri nusako laikas ir ilgis
// spalva - linijos spalva; storis - linijos storis
procedure Rodykle( cx, cy : integer; spalva : integer;
laikas : word; ilgis, storis : integer );
94
klaida := GraphResult;
if klaida <> grOk then
begin
WriteLn ( 'Klaidos kodas: ', klaida );
WriteLn ( 'Programa nutraukta' );
ReadLn;
Halt (1);
end
end;
// Grina laikrodio rodykls koordinat x; laikas - laiko reikm; ilgis - rodykls ilgis
function X_Koord( laikas : word; ilgis : integer ) : integer;
var k : real;
x : integer;
begin
if laikas > 360 then
laikas := laikas - 360;
k := laikas * Pi / 180;
x := - Round ( ilgis * cos( k ) * 639 / 250 );
X_Koord := x;
end;
// Grina laikrodio rodykls koordinat y; laikas - laiko reikm; ilgis - rodykls ilgis
function Y_Koord( laikas : word; ilgis : integer ) : integer;
var k : real;
y : integer;
begin
if laikas > 360 then
laikas := laikas - 360;
k := laikas * Pi / 180;
y := - Round ( ilgis * sin( k ) );
Y_Koord := y;
end;
// Nubraiomas laikrodio fonas, t. y. aplink idstoma 12 skaii (valand)
// mx, my - grafinio lango dydis; cx, cy - grafinio lango centro koordinates
procedure Fonas ( mx, my, cx, cy : integer );
var x, y : integer;
i : integer;
sk : string;
begin
Bar ( 40, 10, mx - 40, my - 10 );
for i := 1 to 12 do
begin
Str ( i, sk );
SetTextStyle ( 0, 0, 2 );
x := X_Koord ( i * 30 + 90, 70 );
y := Y_Koord ( i * 30 + 90, 70 );
MoveTo ( cx + x, cy + y );
SetTextJustify ( 1, 1 );
SetColor ( Green );
OutText ( sk );
end
end;
// Bria linij nukreipt i centro (taskas (cx, cy)) atitinkam tak, kuri nusako laikas ir ilgis
// spalva - linijos spalva; storis - linijos storis
procedure Rodykle( cx, cy : integer; spalva : integer;
95
laikas : word; ilgis, storis : integer );
begin
MoveTo ( cx, cy );
SetLineStyle ( 0, 0, storis );
SetColor ( spalva );
LineRel ( X_Koord ( laikas, ilgis ), Y_Koord ( laikas, ilgis ) )
end;
// --------------------------------- Pagrindin programa -------------------------------------------var
mx, my : integer;
// Grafinio lango imatavimai
cx, cy : integer;
// Grafinio lango centro koordinats
val, min, sek, sek1, ss : word;
begin
GrafinisEkranas;
// Pereinama grafin darbo reim
mx := GetmaxX;
my := GetmaxY;
cx := mx div 2;
cy := my div 2;
// Circle(cx, cy, 100); // Lango centre pieiamas apskritimas
Fonas ( mx, my, cx, cy ); // Nubraiomas laikrodio fonas
sek := 0;
sek1 := 0;
repeat
while sek = sek1 do
GetTime ( val, min, sek1, ss );
sek := sek1;
SetColor ( Yellow );
FillEllipse ( cx, cy, Round ( 50 * 639 /
Rodykle ( cx, cy, red, sek * 6 + 90, 50,
Rodykle ( cx, cy, 8, min * 6 + 90, 45, 3
Rodykle ( cx, cy, Black, val * 30 + 90 +
Sound ( 100 );
Delay ( 50 );
NoSound;
until KeyPressed;
CloseGraph;
ReadLn;
end.
250 ), 52 );
1 );
);
Round((min * 6 + 90) / 60), 25, 5);
96
vykd program ekrane matysite grafin lang Graph window application su laikrodio fonu ir
rodyklmis:
---------------------------------------------------------------------------
97
3.
veicar mokslininkas
Niklausas Virtas (Niklaus Emil Wirth),
sukrs programavimo kalb Pascal
Gim 1934 m.
Kompiliatorius kiekvienam kintamajam kompiuterio atmintinje skiria tiek vietos, kiek reikia nurodyto tipo
duomenis saugoti. Kintamieji reikmes (duomenis) gauna duomen vedimo (skaitymo) sakiniais arba
priskyrimo sakiniais. Kintamieji negali saugoti kito duomen tipo reikmi.
ia simbolis := ymi priskyrimo operatori, o Reikinys aprao, kokius veiksmus, kokia tvarka ir su
kokiais argumentais reikia atlikti. Kairiojoje operatoriaus := pusje raytas kintamojo vardas nurodo, kam
suteikiama apskaiiuota reikinio reikm. Daniausiai vartojami aritmetiniai reikiniai, apraantys
aritmetinius skaiiavimus ir atitinkantys mums prast algebrini reikini svok.
Pavyzdiui, priskyrimo sakinys y := x * x; reikia, kad argumento x reikm keliama kvadratu ir
rezultatas priskiriamas kintamajam y. Priskyrimo sakinio raymo forma artima lygybs iraikai, taiau tarp
i struktr yra esminis skirtumas. Lygybmis nurodoma egzistuojanti priklausomyb, patvirtinamas tam
tikras faktas. Tuo tarpu priskyrimo sakiniai aprao procesus, kuriems bdinga reikmi kaita laikui bgant,
todl taisyklingas ir toks sakinys:
a := a + 1;
Jis nurodo, kad senoji kintamojo a reikm turi bti padidinta vienetu, o rezultatas vl pavadintas a.
veiksm galima aprayti lygtimi:
98
a(nauja) = a(sena) + 1.
Priskyrimo sakiniuose, deinje priskyrimo operatoriaus pusje, gali bti nurodyti vairi tip reikiniai.
Todl btina sekti, kad priskyrimo operatoriaus kairiojoje pusje nurodyto kintamojo tipas atitikt reikinio,
esanio deiniojoje pusje, reikms tip.
Reikiniuose galima naudoti tik tokius kintamuosius, kuri reikms apibrtos anksiau raytuose
programos sakiniuose.
Skiriami trys reikini tipai:
Aritmetinis reikinys, kuriame yra kintamieji ir konstantos jungiami aritmetini operacij enklais ir
kuri skaiiavimo rezultatas yra skaiius; reikinius uraant naudojami paprastieji skliaustai, gali
bti kreipiniai funkcijas, kuri darbo rezultatas yra skaiius (pvz, Sin funkcija).
Santykio reikinys. Tai du aritmetiniai reikiniai, tarp kuri raomas santykio operacijos enklas (>,
<, <=, >=, <>, =). Tokio reikinio rezultatas yra login reikm TRUE (tiesa) arba FALSE (netiesa).
Loginis reikinys. Tai reikinys, kuriame santykio reikiniai jungiami logini operacij enklais.
Paskalyje jie ymimi odiais AND (ir), OR (arba), NOT (ne). Reikinio rezultatas yra login reikm
TRUE arba FALSE.
Santykio ir loginiai reikiniai daniausiai naudojami ciklo ir slygos sakiniuose. Kadangi santykio reikiniai
yra logini reikini dalis, todl apbendrintai jie vadinami loginiais reikiniais.
Duomen vedimo procesas programos darbo metu vykdomas dviem etapais: duomen surinkimu klaviatra
ir duomen perdavimu kintamiesiems. I pradi vedimo procedra stabdo kompiuter ir laukia, kol
klaviatra renkami duomenys. Jie kaupiami specialiame buferins atmintins taise ir vaizduojami ekrane.
Tuo metu jie gali bti taisomi vaizdinmis redagavimo priemonmis. Nuspaudus vedimo klavi, kuris
ymimas simboliu arba odiu Enter, buferyje saugomi duomenys paskirstomi procedros Read arba
ReadLn argument srae ivardintiems kintamiesiems, kurie nurodo, kiek ir kokio tipo duomen turi bti
vesta, bei kaip jie turi bti paskirstyti programos kintamiesiems.
Procedros Read ir ReadLn skiriasi duomen atrinkimo i pagalbins atmintins (buferio) bdais. Procedra
Read visuomet ima tiek duomen, kiek jos srae yra parametr, o procedra ReadLn ima visus buferyje
esanius duomenis, kurie vesti prie paspaudiant klavi Enter. Toki pastarosios procedros savyb
nurodo ir jos vardas ReadLn, kuris sudarytas i dviej angl kalbos odi: Read (skaityti) ir Line (eilut).
Pavyzdiui, jei atliekama komanda Read(a, b);, taiau vesime tik vien skaii 25, kintamajam a bus
suteikta reikm 25 ir kompiuteris lauks kol vesime b reikm. Jei, vykdant Read(a, b);, vesime tris
reikmes: 25 -5 10, kintamiesiems a ir b bus paskirstytos pirmosios dvi reikms, o treioji liks buferyje ir
lauks naujo skaitymo veiksmo.
Jeigu tokia pati situacija susidaryt vykdant procedr ReadLn, treioji reikm 10 bt prarasta, nes i
procedra atmeta perteklinius duomenis, kurie lieka paskirsius perskaitytos eiluts duomenis.
Duomen grupes vedant vienoje eilutje, reikms atskiriamos tarpo arba tabuliacijos klaviais.
Procedr ReadLn galima naudoti ir be parametr. Programa laukia, kol, paspaudus klavi Enter, bus
vykdyta i procedra. Tai patogu derinant programas, ivedant ekran didelius duomen kiekius ir kitais
atvejais.
99
Apraant duomen vedim, prie kreipiantis procedr ReadLn (arba Read) patariama rayti ivedimo
sakin, kuris paaikint, koki duomen programai reikia. Tokia ivedimo ir vedimo sakini pora danai dar
vadinama duomen uklausa (arba dialogu). Pavyzdiui, norint vesti mokinio svor (kintamasis sv) reikt
programoje rayti toki uklaus:
Write('veskite mokinio svor: ');
ReadLn(sv);
ReadLn(sv);
arba
Ji nurodo, kad kompiuteriui ekrane reikia suformuoti praneim veskite mokinio svor ir laukti, kol
klaviatra bus surinktas skaiius (svoris).
Ivedam duomen srauose galima nurodyti kintamuosius, konstantas ir reikinius. Be to, gali bti aprayti
ir atskiriems duomenims skirti laukai. Duomen srao elemento struktra:
Duomuo[:s1[:s2]]
ia lautinai skliaustai rodo, kad tos dalies gali nebti. Sveikojo skaiiaus tipo konstanta s1 elemento aprae
nurodo jam skiriamo lauko dyd, o konstanta s2 raoma tik realiesiems skaiiams, turintiems sveikj ir
trupmenin dalis. Tai trupmeninei daliai skirt simboli skaiius. Pavyzdiai:
Write(a);
WriteLn(a:5, ' ', b:6:2);
Jei ivedant realiuosius skaiius trupmeninei daliai skiriamo lauko dydis nenurodomas, skaiiai vaizduojami,
standartine iraika, kurioje vartojamas daugiklis 10n. Laipsnio pagrindas ymimas simboliu E ir po jo
raomas sveikuoju skaiiumi ireiktas laipsnio rodiklis n. Pavyzdiui, 1.254E-05 atitinka 1.25410-5.
Ekrane ivedami duomenys pradedami rayti nuo ymeklio pozicijos, vadinamos aktyvija ekrano pozicija.
Jei atliekama procedra Write, ekrane suraius duomenis, aktyvioji ekrano pozicija lieka ties paskutiniojo
lauko riba. Procedra WriteLn aktyvij ekrano pozicij visuomet perkelia naujos eiluts pradi. i
savyb galima panaudoti apraant tuias ekrano eilutes:
WriteLn;
Procedr Write ir WriteLn argumentai gali bti ne tik skaiiai ir kintamieji, bet ir bet kokie tekstiniai
duomenys, kuriuos pageidaujama matyti ekrane. Tokius duomenis argument srae btina rayti tarp
kabui (apostrof). Pavyzdiui, sakinys
WriteLn('Sveiki! Js programa pradeda darb!');
Apraant programos darbo rezultat ivedim, labai patogu procedros WriteLn duomen srae nurodyti
tiek duomen reikmes, tiek juos paaikinanias simboli eilutes. Pavyzdiui, sakinys
WriteLn ('Staiakampio plotas: ', plotas:10:2);
nurodo, kad prie kintamojo plotas reikm bus raomas paaikinimas Staiakampio plotas:
100
3.5. Ciklas while
Ciklas yra naudojamas pasikartojantiems skaiiavimams atlikti. Ciklo while antrat valdo tik vieno sakinio
kartojim. Jeigu reikia kartoti kelis sakinius, tai jie jungiami sudtin sakin ir raomi tarp begin ir end:
while Slyga do
KartojamasSakinys;
while Slyga do
begin
KartojamiSakiniai;
end;
Slyga tai bet koks loginis reikinys, KartojamasSakinys bet koks sakinys (taip pat ir ciklo).
Ciklo while vykdymo tvarka: Patikrinama Slyga. Jei jos reikm yra TRUE (tiesa), tuomet atliekamas
KartojamasSakinys, prieingu atveju jis praleidiamas ir atliekami toliau u ciklo esantys sakiniai.
Organizuojant cikl reikia atkreipti dmes :
Ciklas bus vykdomas be galo daug kart (toks ciklas vadinamas aminuoju ciklu), jeigu
nepasirpinsite, kad atliekant cikl (KartojamasSakinys viduje) Slyga kada nors gaut reikm FALSE.
Jeigu ciklo viduje reikia vykdyti ne vien sakin, o sakini grup, i grup turi bti raoma tarp begin
ir end.
Jei prie pradedant cikl Slyga yra FALSE, KartojamasSakinys ar sakini grup nevykdomas n karto.
Kintamiesiems, sudarantiems Slyga login iraik, prie while sakin esanioje programos dalyje turi
bti suteiktos pradins reikms, o KartojamasSakinys viduje i kintamj reikms turi bti keiiamos
taip, kad kada nors Slyga tapt FALSE.
Kitimo ingsnis: 1
for cp := R1 downto R2 do
KartojamasSakinys;
for cp := R1 downto R2 do
begin
KartojamiSakiniai;
end;
101
3.7. Slygos sakinys if
Slygos sakiniu keiiama nuosekli sakini atlikimo tvarka. Atliekami veiksmai priklauso nuo Slygos: jei
Slyga tenkinama, atliekamas po then esantis PirmasSakinys, jei ne po else esantis AntrasSakinys. Jeigu
reikia atlikti kelis sakinius, kai Slyga tenkinama arba netenkinama, tai jie jungiami sudtin sakin ir
raomi begin end skliaustuose.
if Slyga
then PirmasSakinys
else AntrasSakinys;
if Slyga
then
begin
Sakiniai, atliekami kai slyga tenkinama
end
else
begin
Sakiniai, atliekami kai slyga netenkinama
end;
Galima vartoti sutrumpint slygos sakin, kuriame yra tik aka then ir veiksmai atliekami tik tuomet, kai
Slyga tenkinama.
if Slyga
then PirmasSakinys;
if Slyga
then
begin
Sakiniai, atliekami kai slyga tenkinama
end;
Slygos sakinio then ir else akose galima urayti bet kokius Paskalio kalbos sakinius. Bet kurioje
slygos sakinio akoje galima urayti dar vien slygos sakin, pastarojo akose dar vien ir t.t. Toks
sakinys vadinamas sudtingu slygos sakiniu. Sudting slygos sakini pavyzdiai:
if Slyga1
then if Slyga2
then PirmasSakinys
else AntrasSakinys
else TreiasSakinys;
if Slyga1
then if Slyga2
then if Slyga3
then PirmasSakinys
else if Slyga4
then AntrasSakinys;
Antras pavyzdys:
if a > 0
102
then WriteLn('Teigiamas')
else if a = 0
then WriteLn('Nulis')
else WriteLn('Neigiamas');
Danai tenka tikrinti, ar kintamj reikms priklauso leistinai reikmi atkarpai. Pavyzdiui, gali bti
skaiiuojama tik teigiam arba lygi nuliui argument kvadratins aknys. Todl tokioje programoje reikt
tikrinti, ar argument reikms yra leistinos, t. y., ar poaknyje nra neigiamas:
if x >= 0
then WriteLn('aknis: ', Sqrt(x):8:3)
else WriteLn('Neigiamas poaknis');
Sudtingos slygos apraomos loginiais reikiniais. Tai reikiniai, kuriuose naudojami loginiai operatoriai
NOT, AND, OR. Jais jungiami palyginimo reikiniai sudtingesnius, kurie vadinami loginiais reikiniais.
Logini operatori teisingumo lentels:
Kintamj reikms
a
b
TRUE
TRUE
FALSE
FALSE
TRUE
FALSE
TRUE
FALSE
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
TRUE
TRUE
Abs(X): argumentoTipas;
ArcTan(X: real): real;
Cos(X: real): real;
Exp(X: real): real;
Ln(X: real): real;
Pi: real;
Sin(X: real): real;
Sqr(X): argumentoTipas
Sqrt(X: real): real;
Round(X: real): longint;
Trunc(X: real): longint;
Smalsiems
3.9. Duomen vedimas i failo
Duomen vedimas klaviatra visuomet organizuojamas dialogo principu: ekrane spausdinami praneimai,
nusakantys kada ir kokius duomenis reikia surinkti klaviatra. Kai duomen skaiius didelis, tai labai
nepatogus ir ilgai trunkantis procesas, nes norint pakartoti skaiiavimus, reikia duomenis suvedinti i naujo.
Nepatogum galima ivengti, jeigu duomenys i anksto suraomi tekstiniame faile. Taiau faile neraomi
praneimai ir paaikinimai, kokie duomenys ir kokia seka surayti. Raant duomen skaitymo i failo
sakinius reikia i anksto inoti, kokia seka surayti duomenys. Nuo to priklauso, kiek bus kintamj ir kokia
seka bus skaitomos j reikms i failo
Norint duomenis perskaityti i failo, reikia:
103
Vis failo kintamj vardus siloma pradti didiaja raide F. Tai leis programos tekste juos atpainti be
papildom paaikinim. Antruoju simboliu siloma rayti rad d (duomenys) arba r (rezultatai). Tolesni
simboliai, jeigu reikia, gali bti parenkami programuotojo nuoira.
Duomenims i failo skaityti naudojamos tos paios procedros, kaip ir vedamiems klaviatra, tik pirmuoju
argumentu raomas failo kintamasis:
Read(Fd, kintamjSraas);
ReadLn(Fd, kintamjSraas);
Procedr darbas niekuo nesiskiria nuo jau nagrinto duomen vedimo klaviatra. inant, kad klaviatra
yra taip pat tekstinis failas, kuris pagal nutyljim yra susiejamas su failo kintamuoju Input, kurio nebtina
(bet galima) rayti procedroje pirmuoju argumentu, panaudojimo skirtum nelieka.
Procedr darbas niekuo nesiskiria nuo jau nagrinto spausdinimo ekrane. inant, kad ekranas yra taip pat
tekstinis failas, kuris pagal nutyljim yra susiejamas su failo kintamuoju Output, kurio nebtina (bet
galima) rayti procedroje pirmuoju argumentu, panaudojimo skirtum nelieka.
Papildymui failas atidaromas procedra Assign. Tuomet esami duomenys nebus naikinami, o failas bus
paruoiamas nauj duomen raymui failo pabaigoje.
104
3.11. Procedros
Procedromis yra vadinami programos struktriniai elementai, kuriuos galima kreiptis daugel kart. Jos
padeda geriau struktrizuoti programas, padaro jas lengviau skaitomas ir analizuojamas. Procedroms yra
skiriamos dviej tip sintaksins struktros: apraymai ir kreipiniai. Apraymai nurodo, k procedra turi
atlikti. Vykdant program jie praleidiami. Procedrose aprayti veiksmai yra vykdomi tiktai tada, kai jas
kreipiamasi. Procedr apraymai gali bti bet kurioje apra vietoje. Procedr aprao sintaks:
procedure Vardas(FormalijParametrSraas);
LokaliejiApraai
begin
ProcedrosKamienas
// Veiksmai, kuriuos atlieka procedra
end;
Vardas parenkamas pagal tas paias taisykles, kaip kintamj vardai.
FormalijParametrSraas, tai kintamj apraymas, kurie skirti ryiui su programa, kuri kvieia
procedr. Kintamieji, prie kuri apraym nra odelio var, skirti tik duomen perdavimui procedr. Jie
vadinami parametrai-reikms Kintamieji, prie kuri apraym yra odelis var, skirti ne tik duomen
Faktiniai parametrai nurodo, kokiais pagrindins programos duomenimis turi bti keiiami formals
parametrai. Parametr keitimo bdas priklauso nuo j tipo. Formals parametraikintamieji keiiami
kreipinyje nurodytais pagrindins programos kintamaisiais. Tokie parametrai yra naudingi tada, kai
pageidaujama, kad procedra pakeist pagrindins programos kintamj reikmes.
Kai norime apsaugoti pagrindins programos kintamuosius nuo pakeitim procedr darbo metu, yra
vartojami parametrai-reikms, kuri aprauose odelis var nenurodomas. Tada duomenys perduodami tik
viena kryptimi i besikreipianios programos vietos procedr. vykdius procedr, tokiais faktiniais
parametrais nurodomos kintamj reikms nepakinta. Be to, faktiniais parametrais-reikmmis gali bti ne
tik kintamieji, bet ir konstantos bei iraikos.
Btina inoti, kad failo kintamieji gali bti tik parametrais-kintamaisiais, pavyzdiui
procedure Spausdinti(var Fr : text);
3.12. Funkcijos
Funkcijomis yra vadinami programos struktriniai elementai, kuriuos galima kreiptis daugel kart. Jos
padeda geriau struktrizuoti programas, padaro jas lengviau skaitomas ir analizuojamas. Funkcijoms yra
skiriamos dviej tip sintaksins struktros: apraymai ir kreipiniai. Apraymai nurodo, k funkcija turi
atlikti. Vykdant program jie praleidiami. Funkcijose aprayti veiksmai yra vykdomi tiktai tada, kai jas
kreipiamasi. Funkcij apraymai gali bti bet kurioje apra vietoje. Funkcij aprao sintaks:
function Vardas(FormalijParametrSraas): RezultatoTipas;
LokaliejiApraai
begin
FunkcijosKamienas
// Veiksmai, kuriuos atlieka funkcija
end;
Vardas parenkamas pagal tas paias taisykles, kaip kintamj vardai.
105
FormalijParametrSraas, tai kintamj apraymas, kurie skirti ryiui su programa, kuri kvieia
vairios
function Random[(Riba: word)]:
SutampaSuKintamojo tipu;
procedure Randomize;
function Chr(X: byte): char;
function Ord(X): longint;
function Round(X: real): longint;
function Trunc(X: real): longint;
procedure
procedure
procedure
procedure
ClrScr;
TextColor(spalva : byte);
TextBackground(spalva : byte)
Window(x1, y1,
x2, y2 : integer);
Data ir laikas.
procedure GetDate(metai, mnuo, diena, savaitsDiena : word);
106
Savaits dienos reikm nulis nurodo sekmadien. Duomen tipas word nurodo sveik teigiam skaii.
procedure GetTime(valanda, minut, sekund, sekundsimtojiDalis : word);
107
4.
Vienas i struktrinio
programavimo pradinink
olandas E. W. Dijkstra
(19302002 m.)
108
3. Atskiriamas antrasis trienklio skaiiaus skaitmuo b.
4. Atskiriamas treiasis trienklio skaiiaus skaitmuo c.
5. Skaiiuojama trienklio skaiiaus skaitmen suma s = a + b + c.
6. Pateikiamas gautas skaiiavim rezultatas.
7. x reikm padidinama vienetu.
8. 2-7 veiksmai kartojami tol, kol x < 1000.
Udavinio sprendimas, uraytas Paskalio programavimo kalba:
program Suma2;
var x, a, b, c, s: integer;
begin
x := 100;
while x < 1000 do
begin
a := x div 100;
b := x div 10 mod 10;
c := x mod 10;
s := a + b + c;
WriteLn ('Skaiiaus ',x,' skaitmen suma lygi ', s);
x := x + 1;
end;
end.
109
end.
begin
if x mod 2 <> 0
then
begin
a := x div 100;
b := x div 10 mod 10;
c := x mod 10;
s := a + b + c;
WriteLn ('Skaiiaus ',x,' skaitmen suma lygi ', s);
x := x + 1;
end
else x := x + 1;
end;
110
end.
Mokydamiesi programuoti daug dmesio skirsime programavimo kultrai taisyklms, kuri turi bti
laikomasi raant teisingas ir lengvai skaitomas programas. Programavimo kultros pagrindiniai poymiai:
tvarkingai idstytas programos tekstas;
prasmingi programos objekt (kintamj, paprogrami, duomen tip vardai);
suprantami ir reikiamose programos vietose parayti komentarai.
Raydami programas stenkits laikytis i taisykli:
Vieno sintaksinio lygmens sakiniai turi bti vienodai atitraukti nuo eiluts pradios. emesnio lygmens
sakiniai yra deiniau negu auktesnio.
Jei programoje yra kelios logikai nepriklausomos dalys, jos viena nuo kitos skiriamos tuia eilute arba
linija, sudaryta i brkneli, vaigdui arba kitoki enkl.
Programoje begin-end, then-else turi bti lygiuojami, jei jie priklauso tai paiai struktrai.
I abiej pusi tarpais turi bti skiriami enklai >, <, <>, >=, <=, =, :=, +, -, *, /. Po
enkl : ir , paliekamas tarpas.
Smalsiems
4.4. Sumos skaiiavimo algoritmas
Keli skaii sum galime urayti taip: suma = sk1 + sk2 + + skn.
ia sk1, sk2, skn yra skaiiai, kuriuos sudj gauname sum suma.
Atlikdami veiksmus skaiiuokliu (ar pietuku popieriuje), visuomet sumuojame du skaiius. Veiksmus
galime iskleisti taip:
suma2 = sk1 + sk2;
suma3 = suma2 + sk3;
suma4 = suma3 + sk4;
. . .
suma = suman-1 + skn ;
Skaiiuoklio ekrane visuomet matome tik paskutinio veiksmo rezultat (dalin sum). Kiekviena nauja suma
gaunama prie jau apskaiiuotos sumos pridedant po vien dmen. Todl uraytoje veiksm sekoje visose
eilutse galima parayti:
suma =
suma =
suma =
. . .
suma =
sk1 + sk2;
suma + sk3;
suma + sk4;
suma + skn;
Sumos skaiiavim galima urayti: suma = suma + skaiius. Tokiu atveju pradin suma reikm turi
bti lygi nuliui, nes:
suma =
suma =
suma =
suma =
. . .
suma =
0;
//
suma + sk1; //
suma + sk2; //
suma + sk3; //
111
Bendru atveju veiksmus galime ireikti tokiu algoritmu:
Pradia Skaii suma
suma = 0;
kol yra skaii
ciklo pradia
vesti skaii sk;
suma = suma + sk;
ciklo pabaiga
Spausdinti (rodyti) rezultat suma
Pabaiga
Ciklo slyg kol yra skaii galime nurodyti labai vairiai. Paprasiausias atvejis, kai prie cikl yra tiksliai
apibriama, kiek bus skaii, kuriuos reikia sudti.
Galimas toks programos tekstas:
// Skaii suma
program SkaiciuSuma;
var suma, sk : integer; // Sumos ir dmens kintamieji
n : integer; // Skaii kiekis
i : integer; // Ciklo parametras
begin
Write('Kiek bus skaii?'); ReadLn(n);
suma := 0;
for i := 1 to n do
begin
Write('Koks bus ', i, ' skaiius?'); ReadLn(sk);
suma := suma + sk;
end;
WriteLn('Sudta skaii: ', n, ' Rezultatas = ', suma);
WriteLn('Pabaiga');
ReadLn;
end.
112
sandaug dauginant i naujo dauginamojo: sand = sand * skaiius. Pradin sandaugos reikm turi
bti lygi vienetui.
Sandaugos skaiiavim seka bus tokia:
sand =
sand =
sand =
sand =
. . .
sand =
1;
//
sand * sk1; //
sand * sk2; //
sand * sk3; //
Bendru atveju veiksmus galime ireikti tokiu paiu algoritmu, kaip ir sumavimo, tik pradin sandaugos
reikm turi bti vienetas, o sudties operatorius (+) pakeistas daugybos (*).
Klimas laipsniu. Sandaugos skaiiavimo algoritmas panaudojamas skaiiaus klimui sveikuoju laipsniu:
R = xn.
// Skaiiaus klimas laipsniu. Panaudojamas sandaugos skaiiavimo algoritmas.
program Laipsnis;
var i : integer; // Ciklo parametras
R,
// Sandaugos kintamasis
x,
// Laipsnio pagrindas
n : integer; // Laipsnio rodiklis
begin
Write('Skaiius, kur kelsite laipsniu: '); ReadLn(x);
Write('Laipsnio rodiklio reikm: '); ReadLn(n);
R := 1;
for i := 1 to n do
R := R * x;
WriteLn('Rezultatas: ', R);
WriteLn('Pabaiga');
Readln;
end.
113
Udavinio sprendimo algoritmas. Pirmasis dvienklis skaiius, kuris dalinasi i penki, yra 10. Kiekio
pradin reikm yra lygi nuliui. Ciklo antratje raome slyg, kad ciklo vykdymas bt nutrauktas,
perirjus visus dvienklius skaiius. Kadangi cikl ateiname su pirmuoju dvienkliu skaiiumi, kuris
dalinasi i 5, tai toki skaii kiekis padidja vienu nauju skaiiumi. Po to x reikm didinama 5, tikrinama
ciklo slyga ir atliekamai veiksmai ciklo viduje.
Veiksm algoritmas analogikas sumos skaiiavimui, tik ia bus sumuojamos ne reikms, o vienetukai.
Dar vienas pavyzdys: rasti, kiek natralusis skaiius x turi dalikli k.
Udavinio sprendimo algoritmas yra klasikinis: sukamas ciklas nuo 1 iki x ir cikle tikrinama, ar natralusis
skaiius x be liekanos dalinasi i ciklo kintamojo i. Jei taip, tai i yra x daliklis ir dalikli skaiius didinamas
vienu nauju dalikliu.
program Dalikliai;
var x, i, k : integer;
begin
WriteLn ('veskite natralj skaii x');
ReadLn (x);
k := 0;
for i := 1 to x do
if x mod i = 0
then k := k + 1;
WriteLn ('Natralusis skaiius ', x, ' turi ', k,' dalikli (-ius)');
ReadLn;
end.
Po to, paeiliui skaitomos kitos reikms ir lyginamos su d. Jei randama didesn, kintamojo d reikm
keiiama nauja:
if
x > d
then
d := x;
Taip patikrinus vis vedam duomen sraut, kintamojo d reikm bus didiausia vesta reikm.
Analogikai iekoma maiausia reikm. Skirtumas tik palyginimo slygoje:
if
x < d
then
d := x;
114
begin
Write(Kiek bus skaii: ); ReadLn(n);
Write(veskite pirm skaii: ); ReadLn(d);
for i := 2 to n do begin
Write(veskite , i,- skaii: ); ReadLn(x);
if x > d then d := x;
end;
WriteLn( Didiausias skaiius: , d);
end;
Pirmj reikm laikyti pradine didiausia (arba maiausia) reikme ne visuomet patogu. Ypa tuomet, kai ta
reikm turi bti apskaiiuojama (pavyzdiui, iekant maiausio teigiamo skaiiaus, kai srauto pradioje gali
bti daug neigiam skaii). Tokiu atveju galima pradinei didiausiai reikmei priskirti pakankamai ma
reikm: toki, kuri tikrai bt maesn u visas galimas reikmes, tarp kuri iekome didiausios reikms.
Cikle analizuojamos visos reikms. Iekant maiausios reikms, pradinei reikmei reikia priskirti
pakankamai didel skaii, geriausia j laikyti lygiu standartinei Paskalio konstantai maxint (arba
maxlongint, jei sveikasis tipas longint).
Pavyzdys. Turguje ant prekystalio yra n arbz, kuri mass inomos. Reikia sudaryti program
sunkiausiam arbzui rasti.
program Turgus;
var n : integer;
// Arbz skaiius
m : real;
// Arbzo mas
i : integer;
// Arbzo numeris
s : real;
// Sunkiausio arbzo mas
ns : integer;
// Sunkiausio arbzo numeris
//----------------------------------------------------begin
Write('Kiek yra arbz? '); Read(n);
// Sunkiausio arbzo paieka
WriteLn('Arbz masi vedimas');
s := 0; ns := 0;
for i := 1 to n do
begin
Write('veskite', i:2, '-ojo arbzo mas: '); ReadLn(m);
if m > s then
begin
s := m; ns := i;
end;
end;
// Rezultatai
WriteLn('Sunkiausias arbzas Nr', ns:4);
WriteLn('Jo mas:', s:6:2);
WriteLn('Spauskite ENTER'); ReadLn;
end.
115
5.
TRYS SODININKAI. Trys draugai apsigyven kaime nusprend mokytis sodininkauti. Kaime buvo
didiulis sodas, jame augo po vien vaismed kiekviename kvadratiniame ploto vienete.
Kiekvienas i trij draug pasirinko staiakamp sklyp ir nusprend priirti jame esanius
medius. Susirinkus draugn paaikjo, kad j pasirinkti sklypai persidengia, t. y. kai kuriuos
vaismedius priirs ne vienas, o keletas sodinink.
Uduotis. Paraykite algoritm, kuris suskaiiuot, kiek vaismedi panorjo
y
priirti visi trys draugai.
Pradiniai duomenys pateikiami trijose tekstins bylos SODAS.DAT eilutse.
kiekvien eilut rayta po keturis skaiius, apibdinanius kiekvieno draugo
x pasirinkt sklyp: sklypo apatinio kairiojo ir virutinio deiniojo kamp
koordinats (pirma koordinat x, po to y.). Visos koordinats sveikieji
skaiiai. (10 olimpiada, 1999).
Testo nr.
1
2 3 6 7
Pradiniai
4 1 8 5
duomenys 6 0 10 3
0
Rezultatas
2
1 5 9 9
5 6 13 12
6 1 9 11
9
3
0 4 6 8
0 4 6 8
0 0 6 4
0
4
10 8 13 12
2 3 9 7
6 0 13 2
0
5
30 30 80 70
10 20 70 90
50 20 100 90
800
6
10 30 100 80
60 10 120 60
70 30 100 50
600
JAPON KALENDORIUS. Senovs japon kalendori sudar 60 met ciklas. Visi metai cikle buvo
sunumeruoti nuo 1 iki 60 ir suskirstyti poromis, kuri kiekviena turjo savo spalv (ali, raudon, gelton,
balt ar juod). Ciklo met spalvos buvo paskirstytos itaip:
1, 2, 11, 12, 21, 22, , 51, 52 metai alia spalva;
3, 4, 13, 14, 23, 24, , 53, 54 metai raudona spalva;
5, 6, 15, 16, 25, 26, , 55, 56 metai geltona spalva;
7, 8, 17, 18, 27, 28, , 57, 58 metai balta spalva;
9, 10, 19, 20, 29, 30, , 59, 60 metai juoda spalva;
inoma, kad naujasis 60 met ciklas prasidjo 1984aisiais ir baigsis 2043iaisiais metais; 1984ieji
ir 1985ieji buvo alios spalvos metai, 1986-ieji ir 1987ieji buvo raudonos spalvos metai, 2043ieji
bus juodos spalvos metai.
Uduotis. Duoti metai m (1800m2200). Paraykite program, kuri nustatyt ir ispausdint, kokia
duotj met spalva.
Testo nr. Pradinis duomuo Rezultatas
Paaikinimai
1984
ALIA
1
Paprasiausias atvejis 1984-ieji metai
2001
BALTA
2
Einamieji metai
3
1804
ALIA
2103
JUODA
1945
ALIA
2137
1859
1970
BALTA
116
9
1942
JUODA
10
1943
JUODA
11
2200
BALTA
Ribinis atvejis
SKAITMENYS. Laura mokosi rayti skaiius. Mokytoja jai liep parayti visus natraliuosius skaiius nuo
1 iki N. domu, kiek skaitmen Laura i viso parays savo ssiuvinyje?
Uduotis. Paraykite program, kuri rast Lauros parayt bendr skaitmen skaii.
Pradiniai duomenys. Pirmoje ir vienintelje pradini duomen failo skait.in eilutje pateiktas
paskutinysis Lauros paraytas natralusis skaiius N (1 N < 10 000).
Rezultatas. Rezultat faile skait.out turi bti raytas vienas skaiius bendras Lauros parayt
skaitmen skaiius.
(19 olimpiada, 2008)
Pavyzdiai
Pradiniai duomenys
Rezultatas
Paaikinimai
10
11
1 2 3 4 5 6 7 8 9 10 i viso 11 skaitmen
1 2 3 4 5 i viso 5 skaitmenys.
IOGAS. iogas tupi ant horizontaliai itemptos virvuts, prie pat kairiojo krato. Virvuts ilgis s sprindi.
iogas moka okti priek a sprindi ir atgal b sprindi. Jam reikia patekti ant virvutje umegzto mazgo,
kuris nutols nuo iogo pradins padties per c sprindi (visi sprindiai vienodo ilgio).
Pradiniai duomenys s, a, b ir c natralieji skaiiai, be to, s > c > a > b > 0.
Paraykite algoritm, kuris apskaiiuot, kiek maiausiai uoli turi padaryti iogas, kad pasiekt mazg.
(8 olimpiada, 1997).
Testo
nr.
1
Pradiniai
duomenys
10 3 2 6
20 3 1 5
20 4 2 5
9 7 4 8
Negalima
Mazg galima bt pasiekti tik tada, jei virvut bt begalinio ilgio (tada
reikt 9 uoli)
100 13 1 27
15
Rezultatas
Paaikinimai
SULTIS GERTI SVEIKA. Kiekvienos savaits pirmadienio ryt Jonas gauna k cent kienpinigiams.
Vienas butelis suli kainuoja s cent, o tuti buteliai superkami po b cent. Kart (tai buvo i-oji savaits
diena), i viso turdamas n cent, Jonas nusprend kasdien (pradedant i-ja diena) pirkti suli u visus
turimus pinigus. Pinigai, gauti pardavus butelius, bus panaudojami kit dien sultims pirkti. itaip Jonas
darys tol, kol jis stengs nusipirkti bent vien suli butel.
Kiek buteli suli igers Jonas?
Paraykite program iam udaviniui sprsti. Pradiniai duomenys natralieji skaiiai k, s, b, n, i (1 <= i <=
7). Jei nusprendiama sultis pirkti pirmadien, tai i karto gaunami kienpinigiai (pasipildo turima pinig
suma). U pirmadien gautus kienpinigius sultys perkamos pirmadien. (9 olimpiada, 1998).
Testo
nr.
Pradiniai duomenys
Rezultatas
Paaikinimai
117
k = 25, s = 10, b = 3, i = 2, n = 15
k = 24, s = 10, b = 2, i = 1, n = 1
k = 25, s = 9, b = 2, i = 4, n = 23
Pinig treiajam buteliui uteks tik tuomet, jei bus parduoti abu
buteliai
74
DIDMENINIS PIRKIMAS. inoma, kad perkant daugiau preki j vienetas kainuoja pigiau. Pundelyje yra
12 por kojini, dje 12 pundeli. Pavyzdiui, kojini d kainuoja 247 litus, pundelis 21 lt, pora 2
lt. domu tai, kad jei mums reikt 11 por kojini, tai geriau pirkti pundel ir vienerias kojines kam nors
atiduoti.
Uduotis. Pirkjas nori sigyti n por kojini. Sudarykite algoritm, vadovaudamiesi kuriuo pigiausiai
nupirktume kojines. Jei u t pai kain galima nupirkti didesn ir maesn kiek kojini, tai perkamas
didesnis kiekis. Raskite perkam di, pundeli ir por skaii.
Pradinius duomenis sudaro keturi skaiiai: kojini por skaiius n, vienos ds, vieno pundelio bei
vienos poros kaina litais. (10 olimpiada, 1999).
Testo
nr.
Pradiniai
duomenys
Rezultatai
Paaikinimai
Di skaiius: 5
720 303 32 3 Pundeli skaiius: 0 n dalus i 144 (por skaiiaus dje)
Por skaiius: 0
84 210 20 2
Di skaiius: 0
Pundeli skaiius: 7 n dalus i 12 (por skaiiaus pundelyje)
Por skaiius: 0
Di skaiius: 2
Perkame tik des; jei pirktume kitais dviem bdais (1, 4, 4
196 100 20 5 Pundeli skaiius: 0 arba 1, 5, 0), kaina bt ta pati, taiau kojini kiekis
Por skaiius: 0
maesnis
Di skaiius: 2
355 292 41 6 Pundeli skaiius: 6 Perkame tik des ir pundelius
Por skaiius: 0
Di skaiius: 3
355 291 50 6 Pundeli skaiius: 0 Perkame tik des
Por skaiius: 0
Di skaiius: 2
355 292 49 6 Pundeli skaiius: 5 Perkame ir des, ir pundelius, ir poras
Por skaiius: 7
VAIZDO RAAI. 240 minui trukms vaizdajuost kainuoja 10 lit 90 cent, 180 minui trukms
vaizdajuost kainuoja 9 litus 15 cent. Tomas perirjo Baltijos televizijos savaits program ir panorjo
sirayti n laid. inoma kiek valand ir kiek minui trunka kiekviena laida. Reikalui esant, bet kuri laida
gali bti suskaidyta dalis ir rayta dvi ar daugiau vaizdajuosi, o vien vaizdajuost gali bti raomos
kelios laidos. Deja, Tomas neturi nei vienos tuios vaizdajuosts.
Uduotis. Paraykite algoritm, kuris suskaiiuot, kiek maiausiai pinig (lit bei cent) reiks ileisti
Tomui, norint nusipirkti tiek vaizdajuosi, kad j utekt norimoms laidoms rayti. (11 olimpiada,
2000).
118
Pirmoje kiekvieno duomen rinkinio eilutje nurodytas laid skaiius n, o likusiose n eilui
kiekvienos laidos trukm. Pirma nurodomas valand, paskui minui skaiius.
Testo nr.
Pradiniai duomenys
1
3
1 10 2 00
2 00
0 30
3
4
0
0
3
1
3
30 2 30
20 2 30
40 1 01
30
5
5
1
1
1
4
1
10
05
00
45
00
6
5
1
1
1
4
1
10
05
00
45
05
3
3
5 30 5 00
3 20 5 00
2 00 3 00
10
3
6
5 00 3 00
5 00 3 00
3 05 3 00
3 00
3 00
0 55
11
6
8
8
8
8
8
2
30
30
30
30
30
00
1:10
4:30
6:00
6:01
9:00
9:05
10:50
13:00
13:05
15:55
44:30
Valand skaiius
10
11
13
14
16
45
Ilg ir trump
vaizdajuosi skaiius
01
02
02
11
03
12
21
13
22
40
93
Rezultatas
9,15 18,30 18,30 20,05 27,45 29,20 30,95 38,35 40,10 43,60 125,55
VARLI KONCERTAS. Varli koncertas. Kart vienoje kdroje gyveno daug varli, ir ne bet koki, o
dresiruot. Kiekviena varl sugebdavo iokti i vandens ir sukvarksti kas tiksliai jai bding laiko
period. Pavyzdiui, varls kvarkimo periodas lygus 5. Tai reikia, kad jei varl sukvarksjo pirm minut,
antr kart ji kvarkss po penki minui, t. y. et minut, trei kart vienuolikt minut ir t. t.
Uduotis. Patekjus saulei visos varls ioko i vandens ir sukvarksjo. Sudarykite algoritm, kuris
nustatyt, po kiek valand ir minui (<60) vyks antrasis varli koncertas, t. y. vienu metu ioks i
vandens ir sukvarkss visos kdroje esanios varls.
Pradiniai duomenys vedami tokia tvarka. Pirma vedamas varli skaiius, po to kiekvienos varls
kvarkimo periodas. Varli pasirodymo periodai surayti i eils: p1, p2, p3, p4, p5 ir t. t., ia p1 pirmosios
varls pasirodymo periodas, p2 antrosios ir t. t. (0 < pi <= 20 minui). Varli skaiius kdroje
nevirijo 10.
Atkreipiame dmes, kad valand skaiius, po kurio vyks antrasis koncertas, nevirija maxlongint. (11
olimpiada, 2000).
Testo
Pradiniai duomenys
Rezultatai
nr.
2
Koncertas vyks po 0 val. ir 8 min.
1
8 8
Paaikinimai
Paprasiausias atvejis: abu
periodai sutampa
3
2 3 5
6
12 15 20 10 6
30
5
18 7 3 2 4
10
Koncertas vyks po 3879876 val. ir 0 iuo testu tikrinamas sprendimo
11 12 13 14 15
min.
efektyvumas
16 17 18 19 20
119
SENAS KALENDORIUS. Metai yra keliamieji, jeigu jie dals i 4 ir nesidalija i 100, arba jeigu jie dals
i 400. Pavyzdiui:
2000 metai buvo keliamieji, nes jie dals i 400;
2004 metai keliamieji, nes jie dals i 4 ir nra dals i 100;
1900 metai nra keliamieji, nes jie dals i 100, bet ne i 400.
Uduotis. Turime sen kalendori, kuris buvo ileistas tarp 1900 ir 2004 met. Paraykite program, kuri
rast artimiausius bsimus metus (t. y. pradedant 2005-aisiais), kuriems tinka turimas kalendorius.
Pradiniai duomenys du sveikieji skaiiai skaitomi i ekrano. Pirmasis skaiius tai metai, kuriems buvo
ileistas senasis kalendorius. Antrasis skaiius yra i intervalo [1..7] ir nusako, kuria savaits diena prasidjo
tie metai.
Rezultatas raomas ekrane.
Pavyzdiui, jeigu pradinis duomuo yra 1979 1, tai rezultatas turt bti 2007. (16 olimpiada, 2005)
DEGTUKAI. Duota n degtuk. Paraykite algoritm, kuris nustatyt, ar i duot degtuk galima sudlioti
bent vien i i figr: lygiakrat trikamp, kvadrat ar staiakamp. Dliojamai figrai turi bti panaudoti
visi degtukai; be to, degtuk lauyti negalima. (8 olimpiada, 1997).
Pradinis
Rezultatas
duomuo
1
Negalima
Testo nr.
1
Paaikinimai
Per maai degtuk;
Negalima
Galima
12
Galima
15
Galima
16
Galima
35
Negalima
NUTRINTI SKAIIAI. Ant popieriaus lapo buvo urayti keturi natralieji skaiiai: a, b, s, d. Po to du i j
buvo nutrinti (juos ymsime nuliais). Reikia atstatyti nutrintuosius skaiius, jeigu inoma, kad yra liks bent
vienas i skaii a ir b ir kad skaiiai tenkino itokias lygybes:
s = a + b;
d = a x b.
(8 olimpiada, 1997).
Testo nr.
1
Pradiniai duomenys
0 12
0
48
39
15
0 105
25 13
0 32766
Rezultatas
12
16
Paaikinimai
48
Nutrinti skaiiai a ir s
20
Nutrinti skaiiai a ir d
13
16
39
Nutrinti skaiiai b ir s
15
90
105
1350
Nutrinti skaiiai b ir d
25
13
38
325
Nutrinti skaiiai s ir d
120
Literatra
1.
Jonas Blonskis, Kazys Baniulis, Vacius Jusas, Romas Marcinkeviius, Jonas Smolinskas. Programavimas.
Vadovlis, II leidimas. Kaunas: Technologija, 2000, 378 psl. ISBN 9986 13 673 3.
2.
Jonas Blonskis, Vytautas Buknaitis, Jonas Smolinskas, Antanas Vidinas. Programavimo praktikumas.
Programavimas su Turbo Paskaliu. Kaunas: Smaltija, 2000, 251 psl. ISBN 9986-965-18-7.
3.
4.
Dagien V., Grigas G. Programavimo pradmen udavinynas / Realinio profilio vidurinms mokykloms.
Vilnius: TEV, 2000, 208 p.
5.
Jonas Blonskis, Valentina Dagien. Programavimo pradmenys. Vadovlis XI-XII klasms. Vilnius: TEV, 2001,
270 psl. ISBN 9955-491-01-9.
6.
Dagien V. Informatikos pradmenys, IXX kl., II d.: Algoritmai. Vilnius: TEV, 1998, 104 p.; Pataisytas ir
papildytas leidimas, Vilnius: TEV, 2001, 112 p.
7.
Valentina Dagien. Informacins technologijos IX-X klasms. 2 dalis. Vilnius, TEV, 2003, 256 p. ISBN:
9955-491-39-6
8.
Valentina Dagien, Alvida Lozdien. Informacins technologijos. Algoritmai: Paskalis. Pratyb ssiuvinis IX-X
klasms. Vilnius: TEV, 2004, 64 p. ISBN: 9955-491-83-3
9.
10. Valentina Dagien, Gintautas Grigas, Tatjana Jevsikova. Enciklopedinis kompiuterijos odynas. Vilnius: TEV,
2005, 388 p. ISBN 9955-680-19-9. Internetinis odyno variantas svetainje www.likit.lt
Naudingos nuorodos
1) http://ims.mii.lt/asmen/rimga/vu/didaktika/free_pascal/fpc_ir_tp_duomtipiu_skirtumai.htm
R. Laucius. Free Pascal ir Turbo Pascal duomen tip skirtumai
2) http://62.80.232.136/informatika/kurybiniai_darbai/vad9_10/
Kompiuterinis "Informatikos pradmen vadovlis" sukurtas Alytaus Vidzgirio vidurinje mokykloje ir
vliau modifikuotas Alytaus Likikli vidurinje mokykloje. Autorius - informatikos vyr. mokytojas Vidas
emaitis. Idja kurti vadovl kilo tada, kai tapo aiku, kad mokykloje truks INFORMATIKOS
PRADMEN vadovli 9 - 10 klasi mokiniams. Vadovlyje mokomoji mediaga pateikta pagal Valentinos
Dagiens vadovlius INFORMATIKOS PRADMENYS (I ir II dalis). Kiekvien skyri sudaro teorija bei
pratimai ir uduotys. Kai kuri skyri pratimuose ir uduotyse galima rasti testus pagal ieit tem. Test
uduoi skaiius nuo 10 iki 14, o mokiniui pateikiamos tik 8 atsitiktinai parinktos uduotys.
3) http://vmc.ppf.ktu.lt/saulius/v2/?puslapis=327
Autorius: Sinkeviius Saulius; 2001 m. ileista Turbo Pascal 7.0 trumpai. inynas knyga.
i knyga gavo grif, t. y. ji yra rekomenduojama Lietuvos Respublikos vietimo ir mokslo ministerijos.
Recenzavo dr. Jonas Blonskis, dr. Valentina Dagien, mok. metodininkas Arvydas Verseckas
2000 m. padarytas informatikos puslapis, kuris buvo pastoviai pildomas iki 2002 met. Vliau tik po
didels pertraukos vl atnaujintas. Puslapis pirm kart publikuotas 2000-06-25. is darbas 2002-03-17
laimjo pirmj viet KTU Informatikos forume, moksleivi sukurt program konkurse. Puslapis
susilaukt ymiai didesnio mano darbo, jei bt ioks toks finansavimas.
121
Darbe panaudotos technologijos: FrontPage, Java Script, Flash, GIF animacija, Java Apletai. 2002 m.
atnaujinant panaudota: PHP, MySQL, CSS.)
4) http://www.ivinskis.kursenai.lm.lt/gimnaz/dalykai/files/ppp10/
A. Verseckas. Programavimo pradmenys
5) http://www.ipc.lt/21z/mokymas/mokymopr/el/ek/knyga1.htm
G.Grigas. Programavimas Paskaliu. Elektronin knyga
i knyga yra programavimo pradiamokslis. Apraomos pagrindins Paskalio kalbos konstrukcijas bei j bei
j panaudojimas algoritmams ir programoms urayti. Mediaga pateikiama taip, kad skaitytojas galt j
sisavinti sprsdamas udavinius. Pateikiami udaviniai ir praktikos darbai. Udaviniai skirti savikontrolei.
Knygos pabaigoje pateikiami j sprendimai (atsakymai). Praktikos darbai tai nedideli programavimo
darbai, skirti programavimo gdiams pagilinti bei darbo su kompiuteriu praktikai.
Knyga turt bti naudinga vyresnij klasi moksleiviams, informatikos mokytojams ir pirmj kurs
pedagogins krypties studentams.
6) http://ims.mii.lt/fps/download/0.6.4/
I ia galima parsisisti Free Pascal.
7) http://62.80.232.136/informatika/uzduotys/vadoveliai/fps.pdf
Lokalizuota Free Pascal programavimo sistema
8) http://www.taoyue.com/tutorials/pascal/contents.html
Paskalis. Mokomoji mediaga. Angl kalba
9) http://www.geocities.com/SiliconValley/Bay/5707/pascal.html
Paskalis. Mokomoji mediaga. Angl kalba
10) http://freepascal.org/download.var
I ia galima parsisisti naujausi Free Pascal versija (Nelokalizuot)
11) Uklausa internete:
Informacini technologij valstybinis brandos egzaminas praktins uduotys 2006 m.
Pateiktis, kur gerai pristatyti Free Pascal diegimas ir aplinka
12) http://www.levenez.com/lang/
Isami informacija apie vairias programavimo kalbas