Procedūros Spausdinti
( 5 Votes )

Parašė Vidmantas Šarkys   

Šįkart procedūras apžvelgsime detaliau. Nagrinėjome paprastą pavyzdį, kuomet atliekamas vienas veiksmas, tačiau tokiais atvejais naudoti procedūros netgi neapsimoka. Sukurkime įdomesnę procedūrą, kuri netik atliktų keletą veiksmų, tačiau ir turėtų savo pačios - vidinių - kintamųjų, bei grąžintų kintamųjų reikšmes programai.

program proc;
 var x, y, sum, dg : integer;
procedure sk ( a, b: integer; var s: integer; var dg: integer); 
//aprašome procedūrą
 var suma, sandauga : integer;
Begin
 suma := a + b;
 s := suma;
 sandauga := a * b;
 dg := sandauga;
end;
Begin  // aprašome programą
WriteLn('Įveskite du skaičius: ');
ReadLn(x, y);
sk(x, y, sum, dg);
WriteLn('Skaičių suma yra ', sum,' , o sandauga - ', dg);
ReadLn;
end.

Pirmiausiai nušokime į 14-ą eilutę. Šioje eilutėje mes aktyvuojame savo procedūrą. Jei procedūra naudotųsi vien globaliaisiais kintamaisiais, mums užtektų parašyti jos pavadinimą tam, kad ji suveiktų, tačiau šįkart siunčiame jai kintamuosius. Siunčiamieji kintamieji yra 4 : "x" ir "y" reiškia du vartotojo įvestus skaičius, "sum" - tų skaičių suma, "dg" - skaičių sandauga. Svarbu prisiminti, jog kokia tvarka kintamuosius nusiųsime į procedūrą, tokia tvarka procedūra juos ir nuskaitys, t.y. pirmiausiai bus skaitomas "x", o galiausiai - "dg".

Grįžkime į procedūros aprašymą. Atidžiai apžvelkime 3-ią eilutę. Skliausteliuose turime 4 kintamuosius, ir, ko gero, nesunku suprasti, jog tai tie kintamieji, kuriuos siuntėme procedūrai. Tačiau turime visai ne "x" ir "y", o "a" ir "b" ! Klaida čia tikrai neįsivėlė, tiesiog kintamūjų vardus procedūroje pakeitėme, kas yra leistina. Juk, prisiminkime, kintamieji nuskaitomi tokia pat tvarka, kaip ir nusiunčiami, vadinasi "a" atitiks nusiųstojo "x" reikšmę, "b" bus adekvatus "y" reikšmei. Paskutiniojo kintamojo, reiškiančio sandaugą, pavadinimo nepakeitėme.

Yra 3 atvejai, kuriais kintamieji gali būti naudojami procedūrose: 1. Nusiunčiamas kintamasis, o po to jo reikšmė gražinama į programą; 2. Nusiunčiamas kintamasis, kurio reikšmė negražinama; 3. Kintamasis sukuriamas pačioje procedūroje ir jo reikšmė į programą nesiunčiama. Mūsų pavyzdyje turime visus tris variantus. Prie kintamųjų "s" ir "dg" prirašėme žodelį "var" kuris reiškia, jog šio kintamojo reikšmė grįš į programą, t.y. po procedūros atlikimo ji pasikeis. Prie "a" ir "b" nerašėme nieko, vadinasi, net jeigu procedūros metu jie įgytų kitokias reikšmes, jos programoje nesikeistų. Po gautųjų kintamųjų aprašymo sukūrėme dar du sveikojo tipo kintamuosius "suma" ir "sandauga", kuriuos galime naudoti procedūroje, tačiau programai jokios įtakos jie neturės.

Dabar procedūros aprašymas turėtų tapti aiškesnis. Po jos atlikimo, gražinamos sumos ir sandaugos reikšmės, jas parašome ekrane. Verta pažymėti tai, jog, jei nėra būtina elgtis kitaip, geriausia nenaudoti kintamųjų siuntimo į procedūras, kadangi tuomet viskas esą daug painiau. Tačiau yra ir tokių situacijų, kada nenorime, jog tam tikra reikšmė iš procedūros grįžtų, tuomet kintamųjų siuntimas į procedūras yra būtinas.

Tam, kad programa taptų trumpesnė ir išvaizdesnė, ji suskaidoma į procedūras ir papildomi veiksmai pagrindiniame bloke yra nenaudojami. Apžvelkime tokį atvejį.

program procedurine_programa;
var x, y, z, max : integer;
procedure skaitymas;
Begin
 WriteLn('Įveskite 3 skirtingus skaičius');
 ReadLn(x, y, z);
end;
procedure didziausias;
Begin
 If (x > y) and (x > z) then max := x;
 If (y > x) and (y > z) then max := y;
 If (z > x) and (z > y) then max := z;
end;
procedure rasymas;
Begin
 WriteLn('Didžiausias iš įvestų skaičių yra ', max);
 ReadLn;
end;
Begin //pagrindinio bloko pradžia
skaitymas;
didziausias;
rasymas;
end.

Procedūros šįkart tikrai paprastos, ir neaiškumų sukelti neturėtų. Šiame pavyzdyje visi veiksmai buvo atlikti procedūrose, tad pagrindiniame bloke mums pakako aktyvuoti procedūras eilės tvarka. Toks variantas yra populiarus, kadangi programa atrodo aiškiau, profesionaliau.