ELEKTRONINĖS KNYGOS |
|
|
Gintautas GRIGAS
PROGRAMAVIMAS PASKALIU
|
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 renkasi 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,
kad 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 suprastų 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į).
1 pav. Transliatorius išverčia programą iš
Paskalio kalbos į kompiuterio kalbą
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 pateikiamas
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.
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 tekstui 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.).
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.
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ą.
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)
7 pav. Perskaitytas pirmasis duomuo skaičius 22,6 ir įrašytas
į programai skirtą atmintinę (kintamojo a vietą)
8 pav. Surinktas antrasis duomuo skaičius 12,2, bet dar
neperskaitytas ir neįrašytas į atmintinę
9 pav. Perskaitytas antrasis duomuo skaičius 12,2 ir įrašytas
į atmintinę (kintamajam b skirtą vietą)
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.52.7
skyr.). Štai todėl reikia nepamiršti veiksmų, kur nors įrašančių
gautus rezultatus.
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.
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
Jonas
suma
IlgasVardas
DarIlgesnisVardas |
p25
vardas
integer |
a22krc7
m1998
x |
žodis
RaidėA
ABBA |
Klaidingi: |
|
|
|
7a
eil.nr
eil nr
begin |
pirmasis vardo simbolis turi būti raidė;
vardas sudaromas tik iš raidžių ir
skaitmenų;
vardo viduje negali būti tarpų;
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
m_1998 |
Ilgas_vardas
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.
-
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).
-
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 × 10 2
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:
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:
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ą.
|
E Ankstesnis
puslapis |
3 Turinys |
Kitas
puslapis F |
|
|
|
|