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

(iš G.Grigo knygos)

 

Bendru atveju pradiniai duomenys skaitomi iš bylų, kurios yra paruošiamos prieš atliekant programą, o rezultatai rašomi į bylas, kurios išlieka atlikus programą.

Kitas, paprastesnis pradinių duomenų pateikimo būdas yra jų surinkimas klaviatūra. 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ė.

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 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

1998 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į.