Paskalis

1. TRUMPAI APIE PASKALĮ IR JO PROGRAMAS

Gera pradžia – pusė darbo, – sako liaudies išmintis. Tik kur rasti tą gerą pradžią?
Pažintį su programavimu pradėsime nuo nedidelių, bet veikiančių programų pavyzdžių. Tuos pavyzdžius dėliosime šen ir ten, bandysime suprasti, ką su jais kompiuteris veikia, t.y., kaip kompiuteris atlieka Paskalio programą. Naujų programų dar nerašysime, bet bandysime šiek tiek modifikuoti parašytas programas – programuosime pagal pavyzdžius.

1.1. Paskalis, programuotojas ir kompiuteris

Paskalio kalbą sukūrė žymus informatikas ir pedagogas Virtas (Niklaus Wirth) apie 1970 metus. Paskalis, o taip pat ir kitos N.. Virto sukurtos programavimo kalbos (Modula-2, Modula-3, Oberonas-2) pasižymi tuo, kad jos yra universalios, t. y. gerai tinka dažniausiai praktikoje pasitaikančių uždavinių programoms užrašyti. Jos paprastos, logiškos, turi nedaug konstrukcijų, o pačios konstrukcijos yra paprastos ir lengvai įsimenamos. Be to turi gerą apsaugą nuo klaidų. Tai savybės naudingos ir besimokančiajam, ir profesionaliam programuotojui. Na, o iš N. Virto sukurtų kalbų pasirinkome Paskalį todėl, kad jis daugiausiai naudojamas ir Lietuvoje, ir užsienyje. Dauguma (virš 70 procentų) pasaulinių informatikos olimpiadų dalyvių programoms rašyti reenkasi Paskalio kalbą.
Paskalio žymenys vartojami algoritmams užrašyti. Algoritmus skaito ir nagrinėja žmogus. Taigi Paskalio kalba skiriama ne tik žmogaus bendravimui su kompiuteriu, bet ir žmogaus (programuotojo) bendravimui su kitu žmogumi (programuotoju). Paskalis yra patogi priemonė algoritmavimo idėjoms ir metodams išreikšti, ka

ad su jais galėtų supažinti kiti bendraminčiai – programuotojai. Todėl į Paskalį reikia žiūrėti visų pirma kaip į algoritminių žymenų sistemą, skirtą žmogui. Informatikoje (konkrečiau algoritmavime ir programavime) jis atlieka analogišką vaidmenį kaip matematiniai žymenys matematikoje, chemijos formulių kalba chemijoje, natų žymenys muzikoje ir pan.
Pateiksime labai paprastą programos, užrašytos Paskaliu, pavyzdį.
program vidurkis;

var a, b, vid: real;
begin

read(a);

read(b);

vid := (a+b)/2;

writeln(vid: 8: 2)
end.
Net ir menkai išmanančiam programavimą nesunku suvokti, kad ši programa skirta dviejų skaičių aritmetiniam vidurkiui skaičiuoti.
Dabar į programą pažvelkime iš kompiuterio pozicijų. Ar kompiuteris ją supras, ar galės įvykdyti, t.y., suskaičiuoti dviejų skaičių vidurkį?
Kompiuteris gali atlikti tiktai tokias programas, kurios sudarytas iš jam suprantamų komandų, kurios žmogui atrodo kaip beprasmis dvejetainių (arba šešioliktainių) skaičių rinkinys.
Kaip įveikti barjerą tarp žmogaus ir kompiuterio, t.y., kaip padaryti, kad kompiuteris suuprastų ir galėtų įvykdyti Paskalio kalba parašytą programą?
Reikia programą iš Paskalio kalbos išversti į kompiuterio kalbą. Šį darbą atlieka programa, vadinama transliatoriumi (angl. translator – vertėjas) (1 pav.). Išverstą programą kompiuteris jau gali vykdyti (2 pav.). Kompiuteriui pateikę programą, o po to pradinius duomenis (du skaičius), iš kompiuterio gausime rezultatą (vieną skaičių – aritmetinį vidurkį).

Programa Paskalio kalba Programa kompiuterio kalba

(pradiniai duomenys) (rezultatas)

Programa Paskalio kalba Programa kompiuterio kalba

(pradiniai duomenys) (rezultatas)

1 pav. Transliatorius išverčia programą iš Paskalio kalbos į kompiuterio kalbą

Programos Programos

pradiniai duomenys

rezultatai

2 pav. Kompiuteris atlieka į jo kalbą išverstą programą

Pastaruoju metu dažniau vartojami kompiliatoriai (angl. compiler – kompiliatorius). Kompiliatorius ne tik išverčia programos tekstą iš Paskalio kalbos į kompiuterio kalbą, bet ir į programą įjungia (įkompiliuoja) tam tikras iš anksto parengtas programas arba programų fragmentus.
Paskalio kalbos kompiliatorius yra didelė ir sudėtinga programa. Tačiau nesibaiminkime – jos veikimo nereikia žinoti. Mes būsime tik Paskalio kompiliatoriaus naudotojai. Na, o tiems, kas nori apie kompiliatorių sužinoti daugiau ir giliau – pamatyti jį iš vidaus, galima parekomenduoti Vaivos Grabauskienės knygelę „Susipažinkime – transliatorius“[2].
Dažnai sakome, kad duomenis paduodame ne kompiuteriui, bet programai ir rezultatus gauname iš programos. Taip kalbėti patogiau. Nors iš tikrųjų veiksmus atlieka kompiuteris, bet atlieka tik tuos, kurie užrašyti programoje. Taigi, visą kompiuterio darbą apsprendžia programa.
1 ir 2 paveiksluose programos vaizduojamos stačiakampiais, o duomenys – rodyklėmis, jungiančiomis programas (į stačiakampį ateinančios rodyklės vaizduoja pradinius duomenis, o išeinančios – rezultatus). Tie patys duomenys vienai programai gali būti pradiniai duomenys (ateinanti rodyklė), kitai – rezultatas (išeinanti rodyklė). Tai, kad sąveikaujant programoms keičiasi duomenų rolė (rezultatai virsta pradiniais duomenimis) savaime suprantama. Tačiau atidžiau panagrinėję minėtus paveikslus galime pastebėti įdomesnį dalyką: duomenys gali būti laikomi programomis ir atvirkščiai – rezultatai programomis. Žmogaus parašytą Paskalio kalba programą transliatorius laiko pradiniais duomenimis ir ją perdirba į kitus duomenis – rezultatą. Kai šis rezultatas pa

ateikiamas kompiuteriui, kompiuteris ją laiko programa ir ima ją vykdyti. Dabar kompiuteriui reikės pradinių duomenų, kurie nurodyti toje programoje (nagrinėtu atveju – dviejų skaičių) ir atiduos programoje numatytus rezultatus. Tai pavaizduota 3 paveiksle.

Pradiniai duomenys

Programa
Paskalio kalba

Rezultatai

3 pav. Programos transliavimas ir vykdymas. Transliavimo rezultatas virsta programa

Programavimo terpė. Darbo su programomis ir duomenimis schema pateikta 3 paveiksle, yra paprasta ir akivaizdi. Tačiau dirbti pagal šią schemą būtų nelabai patogu: reikia operuoti daugeliu duomenų ir programų bylų. Programos tekstą Paskalio kalba bei jos pradinius duomenis reikia parašyti su kokiu nors tekstų dorokliu. Po to programos tekstą reikia pateikti transliatoriui, iš jo gautą rezultatą (sutransliuotą programą) pateikti kompiuteriui, o kad jis galėtų ją vykdytų – pateikti programos pradinius duomenis, o iš jos gautą rezultatų bylą skaityti vėl su kokiu nors dorokliu. Taigi, reikia atlikti daug veiksmų su bylomis. Šie veiksmai ypač juntami, kai programa yra dar tik rašoma, nes tada ją dažnai tenka taisyti, o pataisius visus tuos veiksmus vėl reikia kartoti.
Tam, kad mažiau rūpesčių keltų darbas su bylomis, programuotojui pateikiamas ne vien transliatorius (kompiliatorius), bet visa programuotojui reikalinga terpė – programavimo sistema. Transliatorius (kompiliatorius) yra svarbiausias sistemos komponentas. Todėl kartais visa programavimo sistema sutapatinama su transliatoriumi (kompiliatoriumi).
Kitas svarbus programavimo sistemos komponentas yra programos tekstų doroklis. (redaktorius). Tada programos te

ekstui rinkti bei taisyti nereikia atskiro kokio nors kito doroklio. Pradėjus darbą su sistema, iškart įsijungia doroklis ir kompiuterio ekrane galima rinkti programos tekstą. Programavimo kalbos dorokliu su tekstu galima atlikti tokias pat operacijas, kaip ir kitais dorokliais: jį rinkti, taisyti, išbraukti, kopijuoti, įterpti į kitą tekstą, įkelti iš bylos, užrašyti į bylą ir pan.
Programavimo terpė paslepia ir patį transliavimo procesą. Ja naudojantis susidaro įspūdis, kad kompiuteris supranta Paskalio kalba parašytą programą ir čia pat ją atlieka.

Uždaviniai
1.1.1. Programą vidurkis pakeiskite taip, kad ji apskaičiuotų trijų skaičių aritmetinį vidurkį. Jis skaičiuojamas pagal formulę
(a + b + c) / 3.
1.1.2. Vietoj daugtaškių įterpkite tinkamus žodžius:
Paskalio kalbos sistemos terpėje esančiu . renkami ir taisomi programų tekstai. Paskalio kalbos . arba . išverčia programos tekstą iš . kalbos į . kalbą.

1.2. Paskalio kalbos dialektai

Kompiliatorių autoriai stengiasi programavimo kalbą kiek galima geriau pritaikyti programuotojų poreikiams, t.y., patobulinti. Šitaip atsiranda kalbos variantai arba dialektai. Tai gerai, nes kalba vystosi, tobulėja. Tačiau pasidaro sunkiau susikalbėti skirtingų dialektų naudotojams. Dėl to programavimo kalbos norminamos, apibrėžiami jų standartai. Paskalio kalbos standartas yra kalbos branduolys, į kurį surinktos pačios svarbiausios jos konstrukcijos. Jis yra tarsi orientyras, vienijantis programuojančius įvairiais Paskalio dialektais.
Standartinis Paskalis turi universalų, bet nedidelį konstrukcijų rinkinį, kuriuo patogu programuoti įvairių žmogaus veiklos sričių (matematikos, fizikos, chemijos, ekonomikos ir kt.) uždavinius. Tokie uždaviniai egzistavo visą laiką ir buvo sprendžiami įvairiais tuo metu naudotais kompiuteriais: didelėmis skaičiavimo mašinomis, stovėjusiomis skaičiavimo centruose, pirmaisiais kuklių galimybių mikrokompiuteriais ir šiuolaikiniais IBM PC genties kompiuteriais. Jų algoritmus galima pavadinti klasikiniais. Jų mokomasi mokyklose, jie rašomi informatikos olimpiadose, jais užrašomi įvairių žmogaus veiklos sričių uždavinių matematiniai sprendimai.
Paskalis ir buvo suprojektuotas taip, kad jis kuo geriau tiktų minėtų bendros paskirties uždavinių algoritmams užrašyti ir kuo mažiau priklausytų nuo kompiuterio.
Daugiausiai vartojamas Paskalio kalbos dialektas yra Turbo Paskalis. Jis paplito po visą pasaulį ir tapo netgi daugiau žinomas, negu standartinis Paskalis.
Turbo Paskalis turi beveik visas standartinio Paskalio konstrukcijas, o taip pat daugybę naujų konstrukcijų (papildymų). Dalis papildymų suteikia naujų, dažniausiai alternatyvių galimybių klasikiniams algoritmams užrašyti, tačiau daugiausia papildymų skirti kompiuterio įrenginiams valdyti. Jie įgalina programuoti grafinį žmogaus ir kompiuterio dialogą, tiesiogiai prieiti prie duomenų, saugomų kompiuterio atmintinėje ir jais operuoti. Dėl to Turbo Paskalis tinka taip vadinamoms sisteminėms programoms – įvairioms kompiuterio įrenginių tvarkyklėms, įvairiems operacinių sistemų komponentams rašyti.
Operacinėje sistemoje OS/2 vartojamas Virtualusis Paskalis. Šis dialektas mažai skiriasi nuo Turbo Paskalio. Tačiau jo kompiliatorius gamina ekonomiškesnes programas. Todėl jis geriau tinka profesiniam darbui.
Paskalis-E – tai standartinis Paskalis, papildytas Europos valstybių abėcėlių raidėmis bei kitais simboliais, o taip pat kai kuriomis Turbo Paskalio konstrukcijomis, reikalingoms algoritmavimo uždaviniams bei programos sąsajai su kompiuteriu.

1.3. Kaip kompiuteris atlieka programą

Kompiuteris iš tikrųjų atlieka į jo kalbą išverstą programą. Tačiau mums patogiau kompiuterio darbą sieti su Paskalio programa. Iš tikrųjų, ir Paskalio programa, ir išversta programa atlieka tuos pačius veiksmus. Todėl nagrinėjant veiksmus nesvarbu, kokia kalba tie veiksmai užrašyti. Todėl pasirenkame mums suprantamesnį variantą – programą, užrašytą Paskalio kalba.
Kompiuteris atlieka programoje užrašytas operacijas su duomenimis, saugomais jo atmintinėje (tiksliau atmintinėje, skirtoje programai). Kaip tie duomenys atsiranda atmintinėje ir kaip kompiuteris atskiria vienus duomenis nuo kitų?
Kompiuterio atmintinę galima įsivaizduoti kaip popieriaus lapą, arba dar geriau – klasės lentą, nes joje galima ištrinti nebereikalingus nebereikalingus duomenis ir į jų vietą rašyti naujus. Atmintinė suskirstyta į daugybę langelių duomenims rašyti. Tam tikra jos dalis skiriama programos duomenims saugoti. Kai programa pradedama vykdyti, joje duomenų dar nėra.
Pasekime, kaip kompiuteris atlieka programą.
Jis skaito programą ir atlieka joje užrašytus veiksmus. Panagrinėkime jau pažįstamą aritmetinio vidurkio skaičiavimo programą: ką reiškia užrašai (t.y., kaip ją supranta žmogus) ir kaip ją atlieka (t.y., supranta) kompiuteris (4 pav.).

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

4 pav. Kompiuteris pasiruošęs atlikti programą

Pirmoji programos eilutė
program vidurkis;
yra jos antraštė. Ji prasideda žodžiu program. Tai bazinis Paskalio kalbos žodis. Baziniai žodžiai Paskalio programose turi griežtai nustatytą prasmę (apie juos kalbėsime 1.5 skyr.).
Toliau einantis žodis vidurkis yra programos vardas. Kaip vadinti programą, sugalvoja programuotojas. Jis gali programą pavadinti bet kokiu vardu. Kompiuteriui programos vardas nerūpi. Svarbu tik, kad jis būtų sudarytas taisyklingai. Apie vardų sudarymo taisykles kalbėsime 1.5 skyrelyje.
Antraštė yra svarbi žmogui, kad jis vieną programą atskirtų nuo kitos. Tuo tarpu kompiuteriui ji nenurodo jokių veiksmų.
Antroji eilutė:
var a, b, vid: real;
yra kintamųjų aprašas. Apie tai pasako bazinis žodis var, kuris yra angliško žodžio variable (kintamasis) santrumpa.
Po žodžio var išvardijami kintamųjų, kurie bus naudojami programoje, vardai. Vardus parenka programuotojas. Kintamieji žymi duomenis. Programoje duomenys nurodomi vardais, o kompiuterio atmintyje saugomos tų duomenų reikšmės. Duomenys gali būti įvairūs: sveikieji skaičiai, realieji skaičiai, tekstai ir t.t. Su skirtingo tipo duomenimis atliekamos skirtingos operacijos, skirtingo tipo duomenims reikia skirtingo vietos kiekio kompiuterio atmintinėje. Todėl reikia žinoti, kokio tipo reikšmes galės įgyti kintamasis ir yra nurodomas kintamųjų tipas. Žodis real pasako, kad prieš jį išvardyti kintamieji žymi realiuosius skaičius. Vadinasi, kintamieji a, b, ir vid galės įgyti tik realiųjų skaičių reikšmes, o kiekviena jų skiriama vietos atmintinėje tiek, kiek reikia vienam realiajam skaičiui įrašyti.
Su aprašais turi darbo ir kompiuteris: jis paskiria vietą atmintinėje kintamųjų reikšmėms saugoti. 5 paveiksle pavaizduota situacija, kad kai kompiuteris perskaitė dvi pirmąsias programos eilutes (perskaitytos ir apdorotos programos eilutės paveiksle patamsintos). Atmintinės vietos, paskirtos kintamiesiems, sužymėtos kintamųjų vardais. Į langelis rašysime kintamųjų reikšmes. Tik ką aprašytų kintamųjų reikšmės pažymėtos klaustukais. Tai reiškia, kad ten gali būti užsilikę nežinomi duomenys iš prieš tai veikusių programų. Šie nežinomi duomenys bus ištrinti, kai kintamiesiems bus priskiriamos reikšmės.

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

5 pav. Kompiuteris paskyrė vietas atmintinėje kintamųjų reikšmėms saugoti

Vietos atmintinėje skyrimas yra pagalbinis veiksmas. Tikrųjų veiksmų pradžią rodo žodis begin. Toliau aprašomi veiksmai. Veiksmų užrašai vadinami sakiniais.
Operacijas kompiuteris atlieka su duomenimis, esančiais jo atmintinėje. Pradžioje programai skirta atmintinė tuščia. Todėl pirmiausia reikia įvesti (skaityti) pradinius duomenis, arba bent dalį jų – kad būtų ką veikti.
Pirmasis sakinys
read(a)
rodo, kad reikia skaityti pradinį duomenį iš klaviatūros ir jį priskirti kintamajam a. Kompiuteris, perskaitęs šį sakinį, programos vykdymą pristabdo ir laukia, kol klaviatūra surinksime skaičių. Tarkime, kad surinkome skaičių 22,6 (6 pav.).
Renkamo skaičiaus trupmeninę dalį nuo sveikosios reikia skirti tašku, o ne kableliu, kaip priimta matematikoje. Toks nukrypimas atsirado dėl to, kad pirmosios programavimo kalbos buvo projektuojamos JAV, o amerikiečiai vietoj kablelio rašo tašką.

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

6 pav. Surinktas, bet dar neperskaitytas pirmasis pradinis duomuo

Kaip pasakyti kompiuteriui, kad skaičius jau surinktas ir jį jau galima skaityti?
Reikia paspausti įvesties klavišą. Tada kompiuteris perskaito skaičių, esantį pagalbinėje klaviatūros atmintinėje ir jį įrašo į kintamojo a reikšmei saugoti skirtą tikrosios atmintinės vietą (7 pav.).
Analogiškai atliekamas sakinys
read(b)
Antrasis pradinis duomuo priskiriamas kintamajam b (8 ir 9 pav.). Tarkime, kad tai buvo skaičius 12,2.
Toliau eina prieskyros sakinys
vid := (a+b)/2
Jis sako, kad reikia apskaičiuoti dešinėje prieskyros ženklo := pusėje esančio reiškinio reikšmę (sudėti du skaičius ir gautą sumą padalyti iš dviejų) ir gautą reikšmę priskirti kintamajam vid, t.y. įrašyti į kintamajam vid skirtą vietą atmintinėje.
Situacija, gauta atlikus šį sakinį, pavaizduota 10 paveiksle.
Liko dar vienas sakinys (veiksmas)
writeln(vid: 8: 2)

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

7 pav. Perskaitytas pirmasis duomuo – skaičius 22,6 ir įrašytas į programai skirtą atmintinę (kintamojo a vietą)

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

8 pav. Surinktas antrasis duomuo – skaičius 12,2, bet dar neperskaitytas ir neįrašytas į atmintinę

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

9 pav. Perskaitytas antrasis duomuo – skaičius 12,2 ir įrašytas į atmintinę (kintamajam b skirtą vietą)

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

10 pav. Apskaičiuota reiškinio a+b)/2 reikšmė ir priskirta kintamajam vid

Juo kompiuteriui sakoma, kad reikia į vaizduoklio ekrano rezultatų langą įrašyti kintamojo vid reikšmę.
Situacija, gauta atlikus šį sakinį, pavaizduota 11 paveiksle.
Skaičiai 8 ir 2 rašymo sakinyje vadinami rašymo formatais. Pirmasis skaičius parodo, kiek vietos (kiek pozicijų) reikia skirti skaičiui, o antrasis – kiek skilčių po kablelio reikia parašyti. Dėl to rezultatas (11 pav. dešinėje viršuje) pavaizduotas su dviem ženklais po kablelio, nors šiuo atveju pakaktų ir vieno.
Sakiniai skiriami kabliataškiais. Todėl reikia dėti kabliataškius tarp greta einančių sakinių, bet nebereikia kabliataškio po paskutinio sakinio (prieš end) – nebėra ką nuo jo atskirti. Nebus klaidos, jeigu ten ir padėsime kabliataškį: tada bus laikoma, kad po kabliataškio eina dar vienas – tuščias sakinys, neatliekąs jokio veiksmo.
Paskutinė programos eilutė
end.
pasako kompiuteriui, kad reikia baigti programą.
Kai programa baigiama, nutrūksta kintamųjų sąsajos su jų reikšmėmis, kurios saugomos atmintinėje (12 pav.). Viskas, kas buvo surašyta programai skirtoje atmintinėje, tampa pamestais ir nebepasiekiamais duomenimis. Jeigu programą paleistume iš naujo, tiems patiems kintamiesiems galėtų būti paskirtos kitos vietos atmintinėje. Taigi, programai baigus darbą, jos kintamųjų reikšmės iš tikrųjų dingsta. Išlieka tik tie rezultatai, kurie buvo įrašyti į vaizduoklio ekraną arba į bylas (apie tai kalbėsime 2.5–2.7 skyr.). Štai todėl reikia nepamiršti veiksmų, kur nors įrašančių gautus rezultatus.

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

11 pav. Kintamojo vid reikšmė (skaičius 17,4) įrašyta į rezultatų langą vaizduolio ekrane

Štai šitaip devyniais paveikslėliais, primenančiais devynis filmo kadrus, parodėme, kokius veiksmus atlieka kompiuteris vykdydamas labai paprastą programą.
Jeigu programai vidurkis pateiktume kitus pradinius duomenis, gautume kitą rezultatą. Tačiau bet kuriuo atveju tai būtų dviejų pateiktų skaičių aritmetinis vidurkis.

Pradiniai duomenys Programa Rezultatai

Programos atmintinė

12 pav. Kai programa baigia darbą, jos duomenų atmintinė lieka tuščia

Visur kalbėjome tik apie duomenų rašymą į atmintinę. Niekur neužsiminėme apie duomenų ištrynimą. Ta atmintinės vieta, vieta, į kurią rašomi nauji duomenys, visada automatiškai ištrinami seni duomenys. Taigi nebereikalingi duomenys išlieka atmintinėje iki tol, kol į jų vietą neužrašomi nauji. Iš tikrųjų kompiuterio atmintinėje išliko ir vidurkio skaičiavimo pradiniai duomenys ir rezultatai programai baigus darbą. Tačiau nebeišliko sąsajos su kintamaisiais. Todėl tų duomenų nebegalima rasti.

Uždaviniai
1.3.1. Ar teisinga šitokia aritmetinio vidurkio skaičiavimo programa?
program vidurkis3;

var a, vid: real;
begin

read(vid);

read(a);

vid := (vid + a)/2;

writeln(vid: 8: 2)
end.
1.3.2. Ką parašytų programos KasBus1 ir KasBus1, jeigu joms pateiktume tuos pačius pradinius duomenis: 11 ir 255?
program KasBus1;

var a, b : integer;
begin

read(a);

read(b);

a := b;

b := a;

writeln(a, b: 4)
end.

program KasBus2;

var a, b, t: integer;
begin

read(a);

read(b);

t := a;

a := b;

b := t;

writeln(a, b: 4)
end.
1.3.3. Ką parašys šitokia programa?
program laipsnis;

var a : integer;
begin

a := 2;

a := a*a;

a := a*a;

a := a*a;

writeln(a)
end.

Praktikos darbas
1.3.1. Kėlimas šimtuoju laipsniu. Parašykite programą, kuri pradinį duomenį – realųjį skaičių pakeltų šimtuoju laipsniu. Paskalio kalba kėlimo laipsniu operacijos neturi. Todėl kėlimui laipsniu naudokite daugybą. Programą parašykite tokią, kad būtų panaudotas mažiausias daugybos operacijų kiekis (pakanka 8 daugybos operacijų).

1.4. Dialogas su kompiuteriu

Gera programa turi būti ne tik teisinga ir suprantama programuotojui, bet ir patogi naudotojui. Naudotojas dažniausiai nėra programuotojas. Jis neskaito programos teksto ir nežino, kas jame parašyta. Todėl apie viską, ką jis turi daryti paleidęs programą, turi jam pasakyti kompiuteris. O kompiuteris pasakys tik tada, kai programoje bus parašyta, ką jis turi pasakyti. Tai reiškia, kad programoje turi būti užrašyti ne tik uždavinio sprendimo veiksmai, bet ir dialogo veiksmai su tuo programos naudotoju – žmogumi, kuris sprendžia uždavinį naudodamasis kompiuteriu ir to uždavinio programa.
Su dialogo trūkumu jau susidūrėme atlikdami programą vidurkis. Jeigu programą atlikome Turbo Paskalio terpėje, tai kompiuteris nieko nepranešė apie tai, kad jis laukia pradinių duomenų, nepasakė, kokie duomenys turi būti ir kiek jų turi būti. Sustojo ir tiek. Tam, kad būtų aišku, kokių žmogaus veiksmų laukia kompiuteris, programą vidurkis papildysime dialogo veiksmais.
1 pavyzdys.
program vidurkis;

var a, b, vid: real;
begin

write(‘Surinkite skaičių: ‘);

read(a);

write(‘Surinkite kitą skaičių: ‘);

read(b);

vid := (a+b)/2;

writeln(vid: 8: 2)
end.
Dabar kompiuteris taip pat sustoja laukdamas pradinio duomens. Tačiau prieš sustodamas jis atliko sakinį
write(‘Surinkite skaičių: ‘)
pagal kurį į ekraną parašė tekstą
Surinkite skaičių:
Jį matydami mes jau žinome ką daryti ir renkame skaičių. Kai paprašo surinkti kitą skaičių – jį surenkame.
Panašūs pranešimai ypač reikalingi, kai programai reikia pateikti daugiau pradinių duomenų ir kai tie duomenys yra įvairūs.
2 pavyzdys. Pateiksime programą, kuri apskaičiuoja, kiek pinigų turėsite banke po mn mėnesių, jeigu dabar padėjote terminuotą prad Lt indėlį, o bankas moka proc procentų metinių palūkanų ir apskaičiuoja jas laikydamas, kad visi mėnesiai lygūs, t.y. kiekvienas jų sudaro 1/12 metų dalį.
program pinigai;

var prad: real;

proc: real;

mn: integer;

galut: real;
begin

write(‘Kokią sumą padėjote į banką? Lt: ‘);

read(prad);

write(‘Kokias metines palūkanas moka bankas? %: ‘);

read(proc);

write(‘Kiek mėnesių laikysite pinigus banke? ‘);

read(mn);

galut := prad + prad*(proc/100*mn/12);

writeln(‘Pasibaigus terminui turėsite Lt:’, galut: 10: 2)
end.
Paleidę programą iš karto matome tekstą
Kokią sumą padėjote į banką? Lt:
Dabar aišku, kurį skaičių reikia rinkti. Jį surinkę ir paspaudę įvesties klavišą, matome naują pranešimą:
Kokias metines palūkanas moka bankas? %:
ir t.t.
Rezultatą sudaro ne vien skaičius, bet ir tekstas, paaiškinantis, ką tas skaičius reiškia.
Atkreipiame dėmesį, kad dialogo tekste nevartojami kintamųjų vardai, o duomenys aprašomi žodžiais taip, kaip mes juos vadiname kasdieniniame gyvenime. Taip daroma dėl to, kad programos naudotojas nemato programos teksto ir nežino, kas kokiu vardu pavadinta. Programos tekstą matome ir gerai žinome tik mes, programuotojai, kol jį rašome. O programos naudotojui programos tekstas nerūpi.
Dialogo veiksmus lengva programuoti. Faktiškai reikia rašyti klausimus, kuriuos pateikia kompiuteris žmogui. Tačiau jų rašymas reikalauja kruopštumo ir atidumo – tekstus reikia estetiškai išdėstyti, kad jie žmogui būtų ne tik naudingi, bet ir būtų malonu į juos žiūrėti. Dar daugiau darbo reikia įdėti, kai tekstas įrėminamas arba pateikiamas meniu pavidalu.
Tuo tarpu uždavinio sprendimo veiksmai yra sudėtingesni ir reikalauja daugiau galvojimo. Todėl pagrindinį dėmesį ir kreipsime į juos. Na, o dialogo veiksmus dažniausiai praleisime, nes jų tekstai būna ilgi ir užtemdytų pagrindinius uždavinio veiksmus.

1.5. Iš ko daroma programa: Paskalio kalbos leksika

Bet kurios gyvosios kalbos (pvz., lietuvių) sakinį sudaro žodžiai ir skyrybos ženklai, sutvarkyti pagal tos kalbos gramatikos (sintaksės) taisykles. Panašiai galima pasakyti ir apie programavimo kalbos (pvz., Paskalio) programą. Tiktai jos sudėtinių dalių, vadinamų leksemomis, yra daugiau. Paskalio kalbos leksemų klasifikacija pateikta 13 paveiksle.
Operacijų ir skyrybos ženklai Paskalio kalboje vartojami tik tokie, kuriuos turi bet kuris kompiuteris. Todėl jų nedaug Štai jie:
+ – * / = < > . , : ; ( ) [ ] { } ‘ ^
Šių ženklų nepakanka. Todėl kai kurios operacijos užrašomos ženklų poromis:
<> nelygu ();
<= nedaugiau ();
>= nemažiau ();
:= prieskyra;
.. intervalas.
Dar kiti ženklai išreiškiami baziniais žodžiais.

13 pav. Paskalio kalbos leksikos elementų klasifikacija. Punktyriniuose stačiakampiuose pateikti leksemų pavyzdžiai. Užtamsintuose stačiakampiuose pateiktos tos leksemos, kurios apibrėžtos Paskalio kalboje; jų yra nedaug, jas galima išvardyti. Kitas leksemas sudaro programuotojas iš kompiuterio abėcėlės simbolių; jų galima sudaryti tiek, kiek reikia (be galo daug)
Pastaba. Paskalio kalbos standarte vartojamas simbolis . Kadangi jo neturi asmeniniai kompiuteriai, tai jų kompiliatoriuose šis simbolis pakeistas simboliu ^. Ankstesni kompiuteriai neturėjo simbolių {}. Todėl vietoj jų galima vartoti ir simbolių poras (* *).
Bazinis žodis programoje laikomas vienu simboliu. Galima sakyti, kad baziniai žodžiai – tai Paskalio kalbos simboliai, kurių nėra kompiuterio abėcėlėje ir todėl užrašomi žodžiais. Baziniai žodžiai vartojami operacijoms bei kitoms programų konstrukcijoms žymėti. Visi baziniai žodžiai yra rezervuoti, t.y. jie turi apibrėžtą prasmę ir kitiems tikslams jų vartoti negalima. Taigi negalima sudaryti naujų vardų, sutampančių su baziniais žodžiais.
Kad baziniai žodžiai būtų lengviau pastebimi, jie paryškinami – spausdinami pusjuodžiu šriftu (pvz., begin), o Paskalio sistemų ekrane rodomame tekste jie dažniausiai kitaip nuspalvinami. Paskalis turi 35 bazinius žodžius.
Vardai. Programas vadiname vardais. Kintamuosius – taip pat vardais. Apskritai, jeigu programoje yra aprašomas koks nors objektas (kintamasis, duomenų tipas, funkcija, procedūra ir kt.), kurį vėliau reikia paminėti (įvardinti), yra pavadinamas vardu. Visi vardai, nesvarbu ką jie žymėtų, sudaromi iš raidžių ir skaitmenų pagal tas pačias taisykles:
• pirmasis vardo simbolis turi būti raidė;
• tolesni vardo simboliai turi būti raidės arba skaitmenys;
• vardas neturi sutapti su baziniu žodžiu;
• vardo viduje negali būti tarpų;
• vardo ilgis formaliai neribojamas, tačiau vardas turi į vieną eilutę (jis negali būti keliamas į kitą eilutę).
Vardų pavyzdžiai.
Teisingi:
a p25 a22krc7 žodis
Jonas vardas m1998 raidėA
suma integer x ABBA
IlgasVardas
DarIlgesnisVardas
Klaidingi:
7a pirmasis vardo simbolis turi būti raidė;
eil.nr vardas sudaromas tik iš raidžių ir skaitmenų;
eil nr vardo viduje negali būti tarpų;
begin vardas negali sutapti su baziniu žodžiu.
Didžiosios ir mažosios raidės varduose laikomos vienodomis. Todėl vardai
SUMA suma Suma SuMa
laikomi sutampančiais.
Didžiųjų ir mažųjų raidžių vienodumu varduose nereikėtų naudotis, nes matydami du užrašus, parašytus tomis pačiomis, bet skirtingo lygio raidėmis, esame linkę juos laikyti skirtingais. Juo labiau, kad kai kuriose kitose programavimo kalbose bei operacinėse sistemose didžiosios ir mažosios raidės varduose laikomos skirtingomis. Jų vienodumas Paskalyje yra laikytinas ankstesnių kompiuterių, turėjusių tik vieno lygio (dažniausiai didžiąsias) raides, reliktu, o ne programavimo patogumu.
Turbo Paskalio varduose gali būti vartojamas pabraukimo simbolis . Jis (panašiai, kaip ir skaitmuo) negali būti pirmasis vardo simbolis.
Pavyzdžiai:
eil_nr Ilgas_vardas
m_1998 dar_ilgesnis_vardas
Paskalyje-E varduose galima vartoti bet kurios kalbos, turinčios lotyniškąją abėcėlę, raides, tarp jų ir specifines lietuviškas (pvz., ą, č).
Visi vardai, nesvarbu ką jie žymėtų, sudaromi iš raidžių ir skaitmenų pagal tas pačias taisykles. Todėl kiekvieną naujai sugalvotą vardą reikia aprašyti. Apraše pasakoma vardo paskirtis – nurodoma, kokios rūšies objektą (konstantą, kintamąjį, duomenų tipą, funkciją, procedūrą, modulį) tas vardas žymi. Kaip vardai aprašomi, nagrinėsime vėliau, kalbėdami apie tais vardais žymimus objektus.
Yra vardų, kurie įtraukti į Paskalį. Tai tarsi paties Paskalio „sugalvoti“ vardai. Jie vadinami standartiniais.
Standartinių vardų pavyzdžiai:
integer real read writeln maxint
Kuo skiriasi standartiniai vardai nuo bazinių žodžių?
Su standartiniu vardu gali sutapti programuotojo sudarytas vardas. Tokiu atveju klaidos nebus. Tiktai ten, kur galioja programuotojo sudarytas vardas, nebus galima panaudoti standartinio – jį nustelbs programuotojo aprašytas vardas. Todėl standartinių vardų galima neprisiminti. Jeigu programuotojas nežino standartinio vardo, tai, aišku, jis jo ir nevartos. Tai nieko blogo, kad jis bus nustelbtas. Tuo tarpu baziniai žodžiai yra rezervuoti ir jeigu bandysime sudaryti vardą, sutampantį su baziniu žodžiu, bus klaida.
Skaičiai. Paskalyje vartojami dviejų rūšių skaičiai: sveikieji ir realieji.
Sveikieji skaičiai sudaromi iš skaitmenų. Neigiamo skaičiaus pradžioje rašomas minusas. Teigiamo skaičiaus pradžioje galima rašyti pliusą. Bet jo galima ir nerašyti – taip paprastai ir daroma.
Pavyzdžiai:
1998 +667
0 -42
Neteisingai užrašytų skaičių pavyzdžiai:
300 000 000 skaičiaus viduje negali būti tarpų,
300.000.000 sveikojo skaičiaus viduje negali būti kitokių ženklų, išskyrus skaitmenis.
Realieji skaičiai užrašomi dviem būdais.
1. Dešimtaine trupmena. Skaičiai rašomi taip, kaip ir dešimtainės trupmenos matematikoje, išskyrus tai, kad trupmeninė dalis nuo sveikosios skiriama tašku (ne kableliu), pavyzdžiui:
643.25

3.1415926536
-20.0
Ženklas ( + arba -) rašomas prieš skaičių be tarpo. Tačiau jeigu ir paliktume tarpą, tai klaidos nebūtų. Tik toks užrašas reikštų atimties operaciją (žr. 2.2 skyr).
2. Rodikliniu pavidalu. Dešimtainės trupmenos užrašas papildomas daugikliu 10n. Paskalyje (o taip pat ir kitose programavimo kalbose) jis rašomas kitaip, negu matematikoje. Vietoj laipsnio pagrindo 10 rašoma raidė E (arba e) ir po jos – sveikuoju skaičiumi išreikštas laipsnio rodiklis n, nepakeltas į viršų. Pateiksime realiųjų užrašų skaičių pavyzdžių matematikoje ir programavime:
643,25 643.25E0
6,4325102 6.4325E2
6432510-2 64325E-2
Jeigu skaičiaus užrašas turi bent vieną realiojo skaičiaus požymį – trupmeninę skaičiaus dalį skiriantį tašką arba raidę E – jis laikomas realiuoju, priešingu atveju – sveikuoju.
Atkreipiame dėmesį, kad programavime sveikieji ir realieji skaičiai sudaro atskiras, nesikertančias aibes (t.y., sveikieji skaičiai nėra realiųjų skaičių poaibis). Todėl reikia griežtai skirti sveikuosius skaičius nuo realiųjų.
Tekstas. Duomenys gali būti ne tik skaičiai, bet ir tekstai: atskiri simboliai arba jų eilutės.
Simbolis yra mažiausias teksto elementas. Tai bet kuris kompiuterio abėcėlės simbolis – raidė, skaitmuo, skyrybos ženklas, operacijos ženklas ir pan. Tam, kad būtų aišku, jog programoje parašytas simbolis yra teksto simbolis, jis rašomas tarp apostrofų, pavyzdžiui,
‘A’ ‘Ą’ ‘B’ ‘5’ ‘;’ ‘>’ ‘ ‘
Paskutinis čia užrašytas yra tarpo simbolis.
Čia tiesūs vertikalūs apostrofai yra Paskalio abėcėlės simboliai, atliekantys skyrybos ženklų vaidmenį.
Apostrofas taip pat yra ir kompiuterio abėcėlės simbolis. Vadinasi, jis gali būti panaudotas ir tekste. Kaip jį užrašyti?
Apostrofo simbolis vaizduojamas dviem apostrofais. Taigi, kartu su simbolį ribojančiais apostrofais gauname šitokį užrašą:
””
Simbolių eilutės. Vienas simbolis – per mažas tekstinės informacijos kiekis. Dažnai patogiau operuoti su didesniais jos kiekiais (pvz., žodžiais, sakiniais, sakinio fragmentais). Todėl beveik visuose Paskalio dialektuose naudojama dar vienas tekstinių duomenų tipas –simbolių eilutė. Tai simbolių seka, užrašyta tarp apostrofų.
Pavyzdžiai:
‘ABBA’
‘Čia yra eilutė’
‘1999.12.31’

Svarbi eilutės charakteristika yra jos ilgis. Tai teksto simbolių skaičius. Pirmoji eilutė yra keturių simbolių ilgio, antroji – 14 simbolių (tarpai taip pat simboliai). Paskutinė eilutės ilgis lygus nuliui. Ji tuščia – neturi nė vieno simbolio.
Eilutę gaubiantys apostrofai atlieka skyrybos ženklų vaidmenį ir nelaikomi eilutės simboliais. Tai galima įsitikinti, kai eilutė rašoma į vaizduoklio ekraną. Pavyzdžiui, pagal sakinį
writeln(‘Čia yra eilutė’)
bus parašytas tekstas:
Čia yra eilutė
Jeigu simbolių eilutėje reikalingas apostrofas (kaip simbolis), tai jis rašomas du kartus (kad skirtųsi nuo eilutės pradžią arba pabaigą žyminčių apostrofų).
Pavyzdys:
‘Rašytojas 0”Henry’
Simbolių eilutę reikia skirti nuo teksto eilutės (žr. 2.5 skyr.). Teksto eilutė – tai ištisa teksto eilutė, kurią matome knygos puslapyje arba vaizduoklio ekrane. Ją sudaro taip pat simboliai. Tiktai teksto skirstymą į tokias eilutės apsprendžia pasirinktas puslapio plotis. Tuo tarpu čia aptartos simbolių eilutės yra teksto gabaliukai su kuriais patogu operuoti programoje.
Štai ir žinome pačius mažiausius programos elementus (leksemas). Iš jų, tarsi iš plytų, statomas pastatas – programa.

Uždaviniai
1.5.1. Kurie vardai sudaryti neteisingai ir kodėl jie neteisingi?
abc cba ABC a(5) ženklas
a5 5a Lt. a’ PrekėsKaina
sandauga begin a54s547 aš prekės kaina
1.5.2. Kiek čia yra skirtingų vardų?
vid vidurkis VID
Vid TrikPlotas Trikplotas
1.5.3. Čia pateiktus duomenis sugrupuokite į keturis duomenų tipus: sveikuosius skaičius, realiuosius skaičius, simbolius ir simbolių eilutes:
1998 1.25E4 125E2 1.25
‘1.25’ -56 0 0.0
‘STALAS’ ‘+’ ‘a+b’ ‘nulis’
”” ‘ ‘ ‘5’ ”
1.5.4. Šiuos skaičius užrašykite trumpiau, rodikliniu pavidalu:
0.0000000000012
3000000.0
-0.0000000001
1.5.5. Kiek čia yra skirtingų eilučių
‘JONAS IR ONA’
‘ONA IR JONAS’
‘JONAS ”IR” ONA’
JONAS IR ONA’
‘Jonas ir Ona’
’12’
‘+12’
‘012’
‘12.0’
1.5.6. Programos vidurkis (žr. 1.1.1 skyr.) žodžius sugrupuokite į: bazinius žodžius, standartinius vardus ir programuotojo sudarytus vardus.

Praktikos darbas
1.5.1. Eilėraštis. Sudarykite ir su kompiuteriu išbandykite programą, kuri parašytų šį Kristijono Donelaičio posmą:

Sveiks, svieteli margs!

Šventes pavasario šventęs;

Sveiks ir tu, žmogau!

Sulaukęs vasarą mielą;
Kiekvienos eilutės rašymą nurodykite atskiru sakiniu writeln.
Rašomas tekstas turi būti išdėstytas lygiai taip, kaip čia parodyta.

1.6. Programos struktūra

Ankstesniame skyrelyje nagrinėjome pačias mažiausias plyteles – leksemas, iš kurių sudaroma programa. Tai buvo žvilgsnis į programą iš apačios. Dabar pažvelgsime į programą iš viršaus – iš kokių stambiausių dalių sudaroma programa.
Paskalio programą sudaro keturios dalys:
• programos antraštė,
• aprašų dalis,
• veiksmų dalis,
• programos pabaigos simbolis – taškas.
Svarbiausios yra aprašų ir veiksmų dalys. Aprašų dalyje pateikiami mums jau pažįstami kintamųjų aprašai, o kaip vėliau matysime – ir kitokių objektų (konstantų, duomenų tipų, funkcijų bei procedūrų) aprašai.
Veiksmų dalį sudaro sakiniai, kuriais užrašomi veiksmai.
Ar kiekviena programa privalo turėti visas išvardytas dalis?
Nebūtinai. Kiekviena programa privalo turėti tik antraštę ir veiksmų dalį. Taigi pati trumpiausia programa galėtų būti tokia:
program tuščia;
begin
end.
Programa tuščia turi veiksmų dalį (žodis begin rodo veiksmų pradžią, o end – jų pabaigą), bet joje – nė vieno veiksmus nurodančio sakinio (galima sakyti ir kitaip – veiksmų dalis turi tik vieną tuščią sakinį). Taigi, programa neatlieka jokio veiksmo. Bet yra taisyklinga. Ją galima pateikti kompiuteriui. Kompiuteris pagal visas taisykles ją įvykdys, bet neduos jokio rezultato, nes programoje nėra rezultato gavimo ir rašymo (išdavimo) veiksmų.
Dabar pateiksime programą, turinčią tik veiksmų dalį.
program pasveikinimas;
begin

writeln(‘Laba diena’)
end.
Ši programa rašo tekstą
Laba diena
Programą galima papildyti komentarais. Komentarai rašomi į skliaustus { }. Programą vidurkis papildysime komentarais.
program vidurkis;

var a, b, { pradiniai duomenys }

vid: real; { rezultatas }
begin

read(a, b); { vienu sakiniu galima užrašyti kelių }

{ pradinių duomenų skaitymą }

vid := (a+b)/2; { apskaičiuojamas vidurkis }

writeln(vid: 8: 2) { rašomas į ekraną rezultatas }
end.
Komentarai – tai paaiškinimai, skirti tik žmogui, bet ne kompiuteriui. Kompiuteris nekreipia dėmesio į tai, kas parašyta komentaruose ir programa atlieka taip, lyg komentarų nebūtų. Dėl to į komentarus galima rašyti bet kokį tekstą.
Komentarais paaiškinamos sunkiau suprantamos programos vietos. Komentarai ypač tinka kintamiesiems paaiškinti. Žinoma, galima parinkti ilgus vardus tokius, kad jie būtų aiškūs ir be komentarų. Tačiau tada tą patį ilgą vardą vėliau tektų dar daugelį kartų rašyti, o tai daugiau darbo, o pernelyg ilgi vardai ilgina programą ir pasidaro ją sunkiau (o gal nuobodžiau) skaitoma. Komentarai padeda pasiekti kompromisą: galima naudoti trumpesnius, bet išsamiai paaiškintus (pakomentuotus) vardus.
Pastaba. Turbo Paskalio ir Virtualiojo Paskalio varduose vartojamos tik angliškos raidės. Todėl kai programa pateikiama kompiuteriui tik nedidelę dalį joje panaudotų objektų (pvz., kintamųjų) galima vadinti nesutrumpintais lietuviškais vardais. Tais atvejais, kai vardo parašyti negalima, reikia vartoti vardo santrumpą ar kitokį jį primenantį raidinį žymenį ir jį paaiškinti komentaru, pavyzdžiui,
var sav, { savaitė }

mn: integer; { mėnuo }

z: string; { žodis }
Beveik kiekvienai programai būdinga veiksmų triada:
• duomenų skaitymas,
• duomenų apdorojimas,
• rezultatų rašymas.
Šiame paprastame pavyzdyje kiekviena triados dalis išreiškiama vienu sakiniu. Didesnėse programose kiekvieną triados dalį gali sudaryti daugelis sakinių.

Uždaviniai
1.6.1. Programą pasveikinimas modifikuokite taip, kad ji ekrane parodytų tekstą
Sveiki, visi
1.6.2. Programos pinigai (žr. 1.4 skyr.) kintamųjų aprašus papildykite komentarais.

Praktikos darbas
1.6.1. Ritinys. Turime programą ritinio pagrindo plotui ir tūriui skaičiuoti
program ritinys;

const pi = 3.1415626536;

var h, { ritinio aukštis }

d, { pagrindo skersmuo }

p, { pagrindo plotas }

v: real; { tūris }
begin

read(h, d);

p := d*d/4*pi;

v := p*h;

writeln(‘PLOTAS: ‘, p: 8: 2);

writeln(‘TŪRIS: ‘, v: 8: 2)
end.
Šią programą atlikite kompiuteriu ir išbandykite, kokius rezultatus gausite pateikę šiuos pradinius duomenis:
• ritinio aukštis 15 cm ir pagrindo skersmuo 2,0 cm;
• ritinio aukštis 2 m ir pagrindo skersmuo 50 cm.
Pakeiskite programą taip, kad pirmiau reikėtų surinkti pagrindo skersmenį, po to – aukštį.
Papildykite programą taip, kad ji skaičiuotų ir ritinio paviršiaus plotą.

2. DUOMENYS IR VEIKSMAI SU JAIS

Programoje užrašomi veiksmai su duomenimis. Todėl pirmiausia aprašomi duomenys, po to veiksmai su tais duomenimis. Duomenų kaita vyksta kompiuterio atmintinėje. Su šiais dalykais susidūrėme ankstesniame skyriuje. Ten nagrinėjome jau parašytų programų pavyzdžius. Dabar visa tai pateiksime išsamiau, nes tai yra pačios pagrindinės sąvokos su kuriomis programuotojas susiduria kiekviename žingsnyje. Pateiktų žinių pakaks, kad galėtume ir patys parašyti bet kokių skaičiavimų pagal formules programas.

2.1. Konstantos ir kintamieji

Programose vartojami dviejų rūšių dydžiai: pastovūs ir kintami. Kaip ir matematikoje, pastovūs dydžiai vadinami konstantomis, o kintami – kintamaisiais dydžiais arba trumpiau – kintamaisiais.
Konstantos – tai į programą įrašyti skaičiai, loginės reikšmės, tekstai (simboliai, simbolių eilutės) ir kitos reikšmės. Konstantų pavyzdžiai:
Duomenų tipas Tipo vardas Konstantų pavyzdžiai
sveikasis skaičius integer 26
realusis skaičius real 721.25

3.444E3
loginis boolean false
simbolinis char ‘A’
eilutė string ‘ABC’

‘1999 balandžio 1d.’

‘A’
Kiekvienas duomuo apibūdinamas duomenų tipu ir reikšme. Koks yra konstantos tipas, vienareikšmiškai galima pasakyti iš jos užrašo pavidalo, išskyrus vieną atveją: vieno simbolio ilgio eilutė nesiskiria nuo simbolio.
Eilutės tipo standartinis Paskalis neturi Tačiau jis yra beveik visuose Paskalio dialektuose. Kol kas eilutes naudosime tik rašymo sakiniuose. Daugiau apie jas kalbėsime 9 skyriuje.
Kintamieji gali įgyti įvairias reikšmes. Jų reikšmės keičiamos programos vykdymo metu. Iš vienų kintamųjų reikšmių apskaičiuojamos naujos reikšmės ir jos priskiriamos tiems patiems arba kitiems kintamiesiems. Visus skaičiavimus galima įsivaizduoti kaip kintamųjų reikšmių keitimus. Todėl kartais sakoma: kad kas suprato kintamuosius, tas suprato ir programavimo esmę.
Programos tekste kintamieji žymimi vardais. Kompiliatorius kiekvienam kintamajam paskiria vietą kompiuterio atmintinėje. Tose atmintinės vietose saugomos kintamųjų reikšmės. Tai duomenys (skaičiai, loginės reikšmės, tekstai). Yra patogiau, kai tas pats kintamasis gali įgyti tik vieno to paties tipo reikšmes. Tada aišku, kiek vietos toms reikšmėms reikės kompiuterio atmintinėje ir tą vietą iš anksto galima rezervuoti. Be to, aišku kokias operacijas bus galima atlikti su tomis reikšmėmis.
Kaip minėjome kintamieji žymimi vardais. Visi vardai sudaromai pagal tas pačias taisykles (žr. 1.5 skyr.), todėl iš vardo užrašo pavidalo negalima nustatyti, kokio tipo kintamąjį žymi tas ar kitas vardas. Dėl to kintamieji aprašomi. Apraše nurodomas kintamojo tipas. Aprašų pavyzdžiai:
var plotas: real;

a, kiekis: integer; { viename apraše gali būti keli }

{ kintamųjų vardai, }

{ jie skiriami kableliais }

raidė: char;

žodis: string[20] { nurodomas didžiausias }

{ eilutės ilgis }

sakinys, frazė: string; { kai ilgis nenurodytas, }

{ laikoma, kad jis yra didžiausias }

{ leistinas – 255 simboliai }
To paties aprašo kintamųjų vardai skiriami kableliais. Visas aprašas baigiamas kabliataškiu. Tam, kad aprašas būtų vaizdesnis, kiekviena grupė pradedama nauja eilute, o visų grupių aprašų pradžios lygiuojamos.
Kitas išdėstymo būdas, kai žodis var rašomas atskiroje eilutėje, pavyzdžiui,
var

a, kiekis: integer;

plotas: real;
Aprašai suteikia kintamajam duomenų tipą, kurio vėliau pakeisti nebegalima – jis išlieka tas pats visą kintamojo gyvavimo laiką. Taigi kintamojo duomens tipas yra pastovus, o reikšmė – kintama.
Aprašas nesuteikia kintamajam jokios reikšmės. Sakoma, kad tik ką aprašyto kintamojo reikšmė yra neapibrėžta. Kintamiesiems reikšmės priskiriamos vėliau, kai atliekami programoje užrašyti veiksmai. Jos gali būti daug kartų pakeistos.
Konstantų aprašai. Konstantas galima pažymėti ir vardais. Vardais pažymėtas konstantas reikia aprašyti. Konstantų aprašai pradedami žodžiu const, po to išvardijamos konstantos ir jų reikšmės, pavyzdžiui,
const pi = 3.1415626536;

n = 2;

alg = ‘Algoritmai ir programos’;
Šitaip aprašytas vardas pi tampa skaičiaus 3.1415626536 sinonimu, o vardas n – skaičiaus 2 sinonimu.
Kam reikalingos vardais pažymėtos konstantos, juk kur reikia programoje galima parašyti ir tikrus skaičius ar kitokias reikšmes?
Vardais patogu pažymėti konstantas, kurios programoje panaudojamos keletą kartų. Tada patogiau rašyti trumpą ir informatyvų vardą, pavyzdžiui, pi – vietoj ilgo skaičiaus (kurį rašant nesunku suklysti), alg – vietoj ilgos frazės. Šitaip išvengiama klaidų, kurios gali atsirasti kai programoje tą patį skaičių arba tą pačią eilutę reikia rašyti daugelį kartų. Prireikus programą su vardais pažymėtomis konstantomis lengviau pataisyti, kai reikia pakeisti konstantos reikšmė, nes ją pakanka pakeisti vieną kartą – konstantos apraše.
Pavyzdys. Programa ritinio pagrindo plotui, paviršiaus plotui ir tūriui skaičiuoti
program ritinys;

const pi = 3.1415626536;

n = 2; { kiek skaitmenų po kablelio }

var h, { ritinio aukštis }

d, { pagrindo skersmuo }

p, { pagrindo plotas }

pavp, { viso paviršiaus plotas }

v: real; { tūris }
begin

read(h, d);

p := d*d/4*pi;

pavp := 2*p + pi*d*h;

v := p*h;

writeln(‘PLOTAS: ‘, p: 8: n);

writeln(‘PAVIRŠIAUS PLOTAS: ‘, pavp: 8: n);

writeln(‘TŪRIS: ‘, v: 8: n)
end.
Jeigu nuspręstume padidinti visų rašomų rezultatų tikslumą, pavyzdžiui, rašyti tris, keturis ar daugiau skaitmenų po kablelio, pakaktų programą pataisyti vienoje vietoje – pakeisti skaičių konstantos n apraše.
Konstantų aprašuose duomenų tipas nenurodomas, nes konstantos tipą vienareikšmiškai galima nustatyti iš jai suteikiamos reikšmės užrašo pavidalo.
Konstantos reikšmės programoje keisti negalima. Ji išlieka ta pati visą konstantos gyvavimo laiką.

Uždavinys
2.1.1. Programoje ritinys yra aprašyta konstanta n = 2. Kodėl prieskyros sakinyje
pavp := 2*p + pi*d*h
rašomas skaičius 2, o ne konstantos n vardas?

2. 2. Aritmetiniai reiškiniai ir jų reikšmių priskyrimas kintamiesiems

Sveikieji ir realieji skaičiai. Matematikoje sveikieji skaičiai laikomi realiųjų skaičių aibės poaibiu. Programavime realieji ir sveikieji skaičiai priklauso skirtingoms aibėms, neturinčioms bendrų elementų. Taigi, programoje skaičius 5 skiriasi nuo skaičiaus 5.0. Skirtumai atsiranda dėl to, kad sveikieji ir realieji skaičiai skirtingai koduojami, o svarbiausia – skirtingai atliekamos ir operacijos su jais.
Aritmetinės operacijos su sveikaisiais skaičiais atliekamos tiksliai. Tačiau skaičiaus dydis ribojamas ir tą ribą galima greitai pasiekti. Pats didžiausias sveikasis skaičius žymimas vardu maxint. Tai standartinė konstanta. Jeigu rezultatas viršija šį skaičių, jis prarandamas. Tokia situacija vadinama perpildymu.
Koks yra maxint, Paskalio standartas neapibrėžia. Jis priklauso nuo kompiuterio genties ir Paskalio dialekto. Turbo Paskalyje maxint = 32767, Paskalyje-E maxint = – 2147483647.
Leistini realiųjų skaičių rėžiai kompiuteryje kur kas platesni ir retai kada viršijami. Todėl retai kada tenka rūpintis, kad neįvyktų perpildymas. Tačiau aritmetinės operacijos su realiaisiais skaičiais atliekamos apytiksliai. Atsiranda paklaidos. Dėl to, pavyzdžiui, negalima garantuoti, kad visada bus tenkinama, pavyzdžiui, šitokia lygybė
a/b*b = a
Dažniausiai paklaidos būna labai mažos ir jų galima nepaisyti. Todėl su realiaisiais skaičiais mėgstama dirbti: ir perpildymo pavojus negresia, ir paklaidos nejaučiamos. Tačiau retkarčiais pasitaiko atvejų, kai paklaidos gaunamos neįtikėtinai didelės ir iškreipia rezultatą.
Sveikųjų skaičių operacijos. Su sveikaisiais skaičiais atliekamos aritmetinės operacijos
+ sudėtis,
– atimtis,
* daugyba,
div dalyba (rezultatas – dalmuo),
mod dalyba (rezultatas – liekana).
Kiekvienos operacijos rezultatas taip pat sveikasis skaičius.
Painiausios yra dalybos operacijos. Jos ir žymimos neįprastai – baziniais žodžiais, o ne operacijų ženklais. Kai abu operandai teigiami skaičiai, tai dalmens ir liekanos apskaičiavimas problemų nekelia. Pavyzdžiui, aišku, kad
7 div 3 = 2;
7 mod 3 = 1;
3 div 7 = 0;
3 mod 7 = 3.
Tačiau kai bent vienas operandas neigiamas, dalmuo ir liekana nebetenka gyvenimiškos interpretacijos. Tokiu atveju susitarta, kad dalmens ženklas nustatomas taip, kaip priimta matematikoje: jei abiejų operandų ženklai vienodi – dalmuo teigiamas, jei skirtingi – neigiamas. Na, o dalmens d ir liekanos l dydžiai, kai dalijamasis yra a, o daliklis b randami tokie, kad būtų tenkinamos sąlygos:
a = b×d + l
l < b
Taigi,
-7 div 3 = -2
-7 mod 3 = -1
-7 div -3 = 2
Kai daliklis neigiamas, Paskalis liekanos neapibrėžia – perdaug negyvenimiška situacija.
Su realiaisiais skaičiais atliekamos operacijos:
+ sudėtis,
– atimtis,
* daugyba,
/ dalyba.
Kiekvienos operacijos rezultatas yra realusis skaičius.
Dalijama apytiksliai tol, kol trupmeninė rezultato (dalmens) dalis dar telpa į realiajam skaičiui skirtą vietą atmintyje. Todėl liekanos sąvoka realiųjų skaičių atveju netenka prasmės.
Akivaizdu, kad sveikųjų ir realiųjų skaičių dalybos operacijos yra skirtingos – jos ir žymimos skirtingai. Tačiau iš tikrųjų skirtingos ir kitos operacijos: sudėtis, atimtis ir daugyba, nors jos žymimos tais pačiais ženklais. Jeigu kam teko susidurti su kompiuterio komandų kodais, tai tas žino, kad sveikųjų skaičių operacijų kodai yra kitokie, negu joms analogiškų realiųjų skaičių operacijų kodai.
Kaip kompiuteris nustato, kurios operacijos variantą atlikti, kai programoje abiem atvejais operacija žymima tuo pačiu ženklu?
Iš operandų tipo. Jeigu operacijų +, -, * abu operandai yra sveikieji skaičiai, tai atliekama sveikųjų skaičių operacija ir rezultatas gaunamas sveikasis skaičius (koks bus rezultato tipas, reikia visada žinoti rašant programą). Jeigu abu operandai realieji skaičiai, tai atliekama realiųjų skaičių operacija ir gaunamas realiojo tipo rezultatas.
O ką daryti, kai operacijų +, – ir * operandai yra skirtingo tipo (vienas – sveikasis, kitas – realusis)? Tokiu atveju sveikasis operandas paverčiamas realiuoju skaičiumi, atliekama realiųjų skaičių operacija ir gaunamas realusis rezultatas.
Dalybos / operacija atliekama tik su realiaisiais skaičiais. Jei vienas arba net abu operandai yra sveikieji skaičiai, tai prieš atliekant operaciją jie paverčiami realiaisiais. Todėl operacijos / rezultatas visada realusis skaičius.
Pateiksime pavyzdžių, iš kurių matyti, kaip priklauso rezultato tipas nuo operandų tipų ir operacijų.
5 + 2 = 7;
5.0 + 2 = 7.0;
5 + 2.0 = 7.0;
5 – 2 = 3;
5.0 – 2 = 3.0;
5 – 2.0 = 3.0;
5 * 2 = 10;
5.0 * 2 = 10.0;
5 * 2.0 = 10.0;
5.0 * 2.0 = 10.0;
5 div 2 = 2;
5 mod 2 = 1;
10 / 2 = 5.0;
10.0 / 2 = 5.0;
10.0 / 2.0 = 5.0;
10.0 / 2.0 = 5.0.
Operacijų div ir mod operandai gali būti tik sveikieji skaičiai. Jeigu bent vienas jų realusis – gaunama klaida. Šią klaidą kompiuteris aptinka transliuodamas programą (t.y., dar nepradėjęs jos vykdyti), nes kiekvieno kintamojo ar reiškinio duomenų tipą galima nustatyti iš programos teksto nepriklausomai nuo pradinių duomenų .
Dar viena bet kokiai dalybos operacijai (div, mod ir /) būdinga klaida – dalyba iš nulio. Žinome, kad iš nulio dalyti negalima. Kai pamirštame ir tokį nelestiną veiksmą bandome pateikti kompiuteriui, jis apie tai iš karto primena, informuodamas apie klaidą. Šią klaidą kompiuteris aptinka vykdydamas programą, nes daliklio reikšmė gali priklausyti nuo pradinių duomenų, o kai programa transliuojama, jie dar nežinomi.
Iš operandų – konstantų ir kintamųjų – sudaromi aritmetiniai reiškiniai. Operacijų atlikimo tvarka nurodoma skliaustais. Kai nėra skliaustų, operacijos atliekamos pagal prioritetus:
– (unarinė atimtis)
* / div mod
+ –
Aukščiausią prioritetą turi (t.y., atliekama pirmiausiai) unarinė atimtis (skaičiaus ženklo keitimo operacija), žemesnį – daugybos ir dalybos operacijos, o žemiausią (atliekama paskiausiai) – sudėties ir atimties (binarinės) operacijos.
Aritmetinių reiškinių pavyzdžiai:
5
a
a + 5
(a + 5) * 2 div 14
-a * ((c + d) – (alfa + beta))
Atkreipiame dėmesį, kad reiškinys gali būti sudarytas tik iš vienos konstantos arba tik vieno kintamojo.
Kiekvienas reiškinys turi reikšmę. Tai paskutinės atliktos operacijos rezultatas.
Reiškinio reikšmę galima priskirti kintamajam. Tai užrašome prieskyros sakiniu. Jo pavidalas yra šitoks:
kintamojo vardas := reiškinys.
Prieskyros sakinių pavyzdžiai:
k := 5;
k := a;
k := (a + 5) * 12 div 14
Atlikus prieskyros veiksmą, kintamasis, kurio vardas parašytas kairėje simbolio := pusėje, įgyja reikšmę reiškinio, esančio dešinėje simbolio := pusėje.
Kompiuteris atlieka programoje užrašytas operacijas su kintamųjų reikšmėmis bei konstantomis. Operacijų rezultatus vėl įrašo į atmintį, t.y. priskiria kintamiesiems. Taigi kintamųjų reikšmės nuolat keičiamos: iš vienų reikšmių apskaičiuojamos kitos, kol galų gale gaunamos reikšmės, kurias galima pavadinti galutiniais rezultatais.
Reiškinio užrašas yra vaizdesnis, kai abipus žemesnį prioritetą turinčių operacijų paliekama po tarpą. Dėl to, pavyzdžiui, reiškinys
a*b + c*d
yra vaizdesnis, negu
a*b+c*d
o užrašas
a * b+c * d
yra netgi klaidinantis, nes jis skaitytoją orientuoja į kitokią operacijų atlikimo tvarką, negu iš tikrųjų ji yra.
Kadangi reikšmės priskyrimo veiksmas atliekamas paskiausiai, tai abipus prieskyros ženklo visada derėtų palikti po tarpą, ką ir darėme ankstesniuose pavyzdžiuose.
Sveikojo tipo reiškinio reikšmę galima priskirti ir sveikojo, ir realiojo tipo kintamajam. Pastaruoju atveju ji automatiškai pakeičiama realiąja.
Realiojo tipo reiškinio reikšmę galima priskirti tik realiojo tipo kintamajam. Mat jeigu tokį priskyrimą parašytume, kompiuteris nežinotų, ką daryti su realiojo skaičiaus trupmenine dalimi: ar ją atmesti ir skaičių apvalinti. Realųjį skaičių galima pakeisti sveikuoju panaudojant standartines funkcijas trunc ir round. Funkcijos trunc rezultatas yra lygus realiojo skaičiaus sveikajai daliai, o round – apvalintam realiajam skaičiui, pavyzdžiui:
trunc(5.6) = 5;
round(5.6) = 6.
Funkcija iš tikrųjų yra operacija, tik kitaip užrašyta. Pirmiausia eina funkcijos vardas, o po jo skliaustuose išvardijami operandai. Jeigu, pavyzdžiui, vietoj operacijos div programavimo kalboje būtų funkcija, pavadinta tokiu pat vardu, tai vietoj
a div b
reikėtų rašyti
div(a, b).
Kitos Paskalio standartinės aritmetinės funkcijos yra šios:
abs(x) apskaičiuoja a,
sqr(x) x2 ,
sin(x) sin x, čia x išreikštas radianais,
cos(x) cos x, čia x išreikštas radianais,
exp(x) ex,
ln(x) ln x, x > 0,
sqrt(x) x, x  0,
arctan(x) arctg x reikšmę radianais,
succ(x) x = x+1,
pred(x) x = x-1.
Tai standartinio Paskalio funkcijos. Paskalio dialektai jų turi daugiau.
Visų išvardytų funkcijų argumentas x gali būti sveikojo arba realaus tipo reiškinys. Funkcijų abs ir sqr rezultato tipas sutampa su argumento tipu. Visų kitų čia išvardytų funkcijų rezultatas yra realiojo tipo.
Programuotojas gali sudaryti naujas funkcijas. Apie tai kalbėsime 6 skyriuje.

Uždaviniai
2.2.1. Nustatykite, kurio tipo: sveikojo ar realiojo yra šių reiškinių reikšmės:
a) 12 + 6 / 4;
b) 12 + 6 / 3;
c) 12 + 6 div 4;
d) 12 + 6 div 3;
e) 12 + 6 mod 4;
f) 4 + 8.5 * 2
2.2.2. Apskaičiuokite šių reiškinių reikšmes:
a) 16 div 2 div 2 div 2;
b) 16 mod 3 mod 3.
2.2.3. Kurie reiškiniai klaidingi?
a) 10 div 2 / 2;
b) 10 / 2 div 2;
c) a div (b / 2);
d) a – – b;
e) a + + b;
f) a * * b;
g) a * – b;
h) a + 2 * b;
i) a + 2b;
j) a + b2.
2.2.4. Parašykite programą dviejų skaičių geometriniam vidurkiui rasti. Skaičių a ir b geometrinis vidurkis skaičiuojamas pagal formulę
g = ab
2.2.5. Parašykite sakinius, kuriais realusis skaičius, reiškiantis pinigų sumą, būtų paverstas dviem sveikaisiais skaičiais: litais ir centais.

2.3. Duomenų skaitymas iš klaviatūros ir rašymas į ekraną

Bendru atveju pradiniai duomenys skaitomi iš bylų, kurios yra paruošiamos prieš atliekant programą, o rezultatai rašomi į bylas, kurios išlieka atlikus programą. Apie tai kalbėsime 2.5 skyrelyje.
Kitas, paprastesnis pradinių duomenų pateikimo būdas yra jų surinkimas klaviatūroje. Klaviatūra surinktų duomenų skaitymas nurodomas šitokio pavidalo sakiniu
read(k1, k2, ., kn);
arba
readln(k1, k2, ., kn).
Kintamiesiems k1, k2, ., kn priskiriamos klaviatūroje surinktos pradinių duomenų reikšmės. Jos priskiriamos kintamiesiems iš eilės: kintamajam k1 – pirmoji reikšmė, kintamajam k2 – antroji ir t.t. Kintamieji gali būti skirtingų tipų. Reikšmių tipai turi atitikti kintamųjų tipus pagal tokias pačias taisykles, kaip ir prieskyros sakinyje. Pavyzdžiui, sveikojo tipo kintamąjį gali atitikti tik sveikasis skaičius, o realiojo tipo kintamąjį – ir realusis, ir sveikasis skaičius. Mat abiem atvejais – skaitymo sakinyje ir prieskyros sakinyje – kintamajam priskiriama reikšmė. Tik vienu atveju apskaičiuota reiškinio reikšmė, o kitu atveju – klaviatūroje surinkta reikšmė.
Apie duomenų skaitymo sakinio formą readln (angl. read line – skaityti eilutę) kalbėsime 2.6 skyr.
Rezultatus paprasčiausia parodyti ekrane. Rezultatų rašymas į ekraną nurodomas šitokio pavidalo sakiniais:
write(r1, r2, ., rn);
writeln(r1, r2, ., rn);
Skliaustuose išvardijami reiškiniai, kurių reikšmes reikia rašyti į ekraną.
Priminsime, kad kintamasis ir konstanta čia laikomi reiškiniais (jie turi reikšmes). Iki šiol rašymo sakiniuose nurodėme tik kintamuosius arba konstantas (simbolių eilutes). Dabar, žinodami, kad čia gali būti bet kokie reiškiniai, galime programas sutrumpinti, iš jų pašalindami rezultatų kintamuosius.
Pavyzdys.
program ritinys;

const pi = 3.1415626536;

n = 2; { kiek skaitmenų po kablelio }

var h, { ritinio aukštis }

d, { pagrindo skersmuo }

p: real; { pagrindo plotas }
begin

read(h, d);

p := d*d/4*pi;

writeln(‘PLOTAS:’, p: 8: n);

writeln(‘PAVIRŠIAUS PLOTAS:’, 2*p + pi*d*h: 8: n);

writeln(‘TŪRIS:’, p*h: 8: n)
end.
Palikome tik vieną rezultato kintamąjį p, nes jo reikšmė vartojama ne tik rašymo sakinyje, bet ir kitų rezultatų skaičiavimo reiškiniuose.
Rašymo sakinyje gali būti nurodytas bet koks rezultatų (reiškinių) skaičius. Nėra skirtumo, ar tuos pačius reiškinius surašysime į vieną sakinį, ar išskirstysime į kelis. Todėl sakinį
write(r1, r2, ., rn)
galima laikyti sakinių
write(r1);
write(r2);
.
write(rn)
santrumpa.
Koks skirtumas tarp sakinių write ir writeln?
Sakiniu write nieko nepasakoma apie rezultatų suskirstymą į eilutes. Sakiniai write rašo rezultatus vieną po kito. Kai nebetelpa, pereinama į kitą eilutę. Perkeliama ten, kur pasiekiamas eilutės kraštas. Taigi skaičius ar tekstas gali būti skeliamas bet kurioje vietoje. Šitaip mechaniškai į eilutes suskaidytus rezultatus nepatogu skaityti. Todėl teksto skirstymą į eilutes geriau nurodyti programoje. Ten, kur reikia, kad būtų pereinama į naują eilutę, rašome sakinį
writeln
Šio sakinio veiksmas prilygtų eilutės pabaigos klavišo paspaudimui, jeigu kompiuteris rašytų rezultatus klaviatūra.
Sakinyje writeln galima nurodyti ir rezultatų. Tada kompiuteris tuos rezultatus parašys, o po to „paspaus“ eilutės pabaigos klavišą. Taigi sakinys
writeln(r1, r2, ., rn)
yra ekvivalentus sakinių porai:
write(r1, r2, ., rn);
writeln
Jeigu norima palikti n tuščių eilučių, reikia parašyti n sakinių writeln.
Rezultatų rašymą rekomenduojama užbaigti sakiniu writeln. Paskutinė neužbaigta (t.y. be eilutės pabaigos ženklo) eilutė gali dingti.
1 pavyzdys. Skaitomi du skaičiai ir išspausdinami į atskiras eilutes.
program du;

var a: integer;
begin

read(a);

writeln(a);

read(a);

writeln(a)
end.
Programoje vartojamas tik vienas kintamasis. Kai jau atliktas antrojo sakinio veiksmas – parašyta kintamojo a reikšmė, trečiuoju sakiniu skaitoma ir jam priskiriama nauja reikšmė. Ankstesnė kintamojo a reikšmė dingsta, nes į jos vietą rašoma nauja. Ankstesnę reikšmę galima prarasti, nes ji jau išspausdinta ir daugiau programoje nevartojama. Todėl tą patį kintamąjį (o tuo pačiu – ir tą pačią vietą kompiuterio atmintinėje) galima panaudoti kito pradinio duomens reikšmei saugoti. Naujos reikšmės spausdinimą nurodo paskutinis sakinys.
2 pavyzdys. Skaitomi du skaičiai ir išspausdinami atvirkščia tvarka, negu buvo perskaityti: į pirmą eilutę antrasis skaičius, į antrą – pirmasis.
program DuAtbulai;

var a, b: integer;
begin

read(a, b);

writeln(b, a: 5)
end.
Čia vieno kintamojo nebepakanka, nes pirmojo perskaityto kintamojo reikšmę reikia išsaugoti kol bus perskaityta ir parašyta antrojo kintamojo reikšmė.
Kiek vietos skirti į ekraną rašomai reikšmei, nurodoma formatu – sveikuoju skaičiumi (bendru atveju – sveikojo tipo reiškiniu), parašytu po tos reikšmės ir atskirtu dvitaškiu. Pavyzdžiui, sakinyje
write(1234: 6, -235: 6)
parodoma, kad kiekvienam skaičiui skiriama po 6 pozicijas (6 simbolius) ekrane. Skaičiai bus išdėstyti šitaip
1234-235
Čia ženklu  pažymėti tarpai. Prieš pirmąjį skaičių bus palikti du tarpai, nes skaičius užima tik 4 pozicijas iš jam skirtų 6, o prieš skaičių -1235 liks tik vienas tarpas, nes skaičiui su minusu reikia 5 pozicijų.
Jeigu rezultatas yra realiojo tipo, tai jam galima užrašyti dar vieną (antrą) formatą. Jis nurodo, kiek vietų po taško skiriama skaičiaus trupmeninei daliai. Pavyzdžiui, sakinio
write(3.1415926536: 10: 5, 3.1415926536: 10: 2)
rezultatas bus
3.14159 3.14
Jeigu nenurodytas nė vienas realiojo skaičiaus formatas arba nurodytas tik vienas, tai realusis skaičius rašomas rodykliniu pavidalu. Pavyzdžiui, pagal sakinį
write(3.1415926536)
Turbo Paskalis parašytų
3.1415926536E00
Kai formatas mažesnis už rezultatui reikalingą pozicijų skaičių, tai vis tiek rašomi visi rezultato simboliai, tik nepaliekama tarpų.
Kaip rašoma, kai formatas nenurodytas, priklauso nuo Paskalio dialekto. Turbo Paskalyje rezultatui skiriama vietos tiksliai tiek, kiek jis turi simbolių. Todėl nenurodžius formatų, rezultatai (skaičiai) susilieja ir pasidaro neįskaitomi. Norint atskirti vieną rezultatą nuo kito reikia parinkti formatus, didesnius už rezultato užimamą pozicijų skaičių arba tarp rezultatų įterpti tarpo simbolius, pavyzdžiui,
write(a, ‘ ‘, b, ‘ ‘, c).
Daugumoje kitų Paskalio kalbos dialektų, kai formatas nenurodytas, skaičiui skiriama viena pozicija daugiau, negu reikėtų pačiam ilgiausiam skaičiui. Tokiu atveju nesusilieja gretimi skaičiai.
Pateiksime pavyzdžių.
3 pavyzdys. Skaitomi trys skaičiai ir rašomi į vieną eilutę atbula tvarka negu jie buvo perskaityti
program trys;

var a, b, c: integer;
begin

read(a, b, c);

writeln(c, ‘ ‘, b, ‘ ‘, a)
end.
Čia jau kiekvienam skaičiui reikia atskiro kintamojo, nes pirmuosius du skaičius reikia saugoti kol bus perskaitytas ir parašytas trečiasis.
Jeigu, pavyzdžiui, kompiuteriui buvo pateikti pradiniai duomenys
31 12 1998
tai jis išspausdins
1987 12 31
4 pavyzdys. Skaitomi trys skaičiai. Rašomas pirmasis skaičius, antrasis skaičius, pakartotas du kartus, ir trečiasis skaičius, pakartotas tris kartus:
program trys;

var a: integer;
begin

read(a);

writeln(a);

read(a);

writeln(a, ‘ ‘, a);

read(a);

writeln(a, ‘ ‘, a, ‘ ‘, a)
end.
Jeigu kompiuteriui pateiksime pradinius duomenis
111
222
33
tai, atlikę šių sakinių veiksmus, jis išspausdins skaičius
111
222 222
33 33 33
Trečias skaičius yra dviženklis. Todėl jis nebesilygiuoja su ankstesnėse eilutėse išspausdintais triženkliais skaičiais. Sulygiuoti galima panaudojus formatus.
5 pavyzdys.
program trys;

const f = 4;

var a: integer;
begin

read(a);

writeln(a: f);

read(a);

writeln(a: f, a: f);

read(a);

writeln(a: f, a: f, a: f)
end.
Dabar kompiuteris išspausdintų:
111
222 222

33 33 33
Skaičiai lygiuojami taip, kad vienas po kito būtų vienodo reikšmingumo skaitmenys. T.y., sveikieji skaičiai pagal dešiniąją pusę, o realieji pagal trupmeninę dalį skiriantį kablelį.

Uždaviniai
2.3.1. Ką matysime ekrane po to, kai kompiuteris atliks programą:
program p;

var pirmas, antras: integer;
begin

read(pirmas, antras);

writeln(pirmas, ‘ ‘, antras, ‘ ‘, pirmas)
end.
jeigu buvo pateikti šitokie pradiniai duomenys:
22 33
2.3.2. Ką matysime ekrane po to, kai kompiuteris atliks programą:
program p;

var pirmas, antras: integer;
begin

read(pirmas, antras, pirmas);

writeln(pirmas, ‘ ‘, antras, ‘ ‘, pirmas)
end.
jeigu buvo pateikti šitokie pradiniai duomenys:
222 333 444
2.3.3. Ką parašys kompiuteris atlikęs programą
program ppp;

var a: integer;
begin

writeln(a);

read(a)
end.
jeigu buvo pateiktas šitoks pradinis duomuo
22
Atsakymą paaiškinkite.

Leave a Comment