Apie Paskalį mokyklose ir valstybinius IT egzaminus

turbo-pascal-7

Šiek tiek pagalvojau parašysiu apie paskalį (Pascal) kalbą kurią mokina mokyklose, kadangi ne visi supranta ir sugeba pilnavertiškai išnaudoti šią kalbą ir duotus įrankius kaip kad debugerį (debugger).

Gal kiek pavėluotai čia aš, kadangi egzaminai jau praėjo, bet vistiek…

Kadangi esu narys ne viename forume, tame tarpe ir Lietuviškuose, pastebiu prieš IT egzaminus pagausėjusių klausimų apie tą ar aną, o kad padėti tenka skaityti kodą, o kai kodas būna baisus, tai dažnai tenka ir neatsakyti nes sunku yra suprasti. Visos problemos yra itin paprastai išsprendžiamos jeigu esate apsiskaitę apie kodo stilių ir suprantate debugerį (apie tai vėliau).

Ką mokina mokyklose teko pačiam patirti. Neketinu sakyti kad mokytojai yra kvaili ir žino tik pagrindus nes to jiems užtenka darbui, tačiau tokia būtų tiesa :P nors aš mokykloje turėjau įdomų mokytoją, kuris suprato ką daro, o prieš jį buvo kitas, mokytoja kurios pavardės neminėsiu, tačiau ji nežinojo kaip parašyti “boolean”, nežinojo skirtumu tarp procedūros ir funkcijos, ir apskritai nieko nežinojo.

Klausimas – kodėl apskritai mokintis tą paskalį, juk tai kalba kurios niekas nebenaudoja. Standartai pasenę, kompiliatorių niekas nebedaro ir panašiai. Lietuvos švietimas mėgsta sakyti “jeigu tai veikė iki šiol ir dar vis veikia, tai kodėl gi keisti!“. Gal tai nėra visiška tiesa, bet aš taip įsivaizduoju. Bet yra kalbų kad paskalis bus panaikintas ir vietoje jo įsigalės C++. Iš vienos pusės tai butų labai gerai.
Kai pasikeis programavimo kalba tai mokytojai turės mokintis naują dalyką. IT mokytojų gali ir gerokai sumažėti, kadangi visokios pagyvenusios moteriškės ateina dėstyti, kurios tą patį paskalį vos išmoko.
Gryštam prie pirmutinio klausimo. Kiek teko kalbėti su užsieniečiais per IRC’ą (senas geras…), Ispanijoje irgi mokina paskaliu programuoti – kolegijoje pirmais metais, kadangi paskalis turi labai paprastą struktūrą ir sintaksę, todėl lengva suprasti algoritmus. Štai kaip paaiškino vienas ispanas:

They teach us pascal because they say is a good example of what structural programming is. They assumed no one knew anything about programming and wanted to start from the very basics. And since pascal is simplier than C, they choose pascal

Bet gana apie tai dabar, šituo klausimu galima diskutuoti amžinai.

Tai tiek pasakų iš mokyklos laikų, tačiau aš paaiškinsiu kodėl tai ką mokina mokyklose vos užtenka išlaikyti egzaminą. Tai yra todėl kad mokytojai mokina labai paprastus dalykus. Pastebėjau kad mokina perrašinėti įvairias funkcijas kurios yra standartinės RT (Run time) bibliotekos dalys. Aišku tai iš vienos pusės yra gerai kai supranti kas vyksta tose funkcijose/procedūrose kurias naudoji, tačiau kai jau viską supranti – kam išradinėti dviratį? Jeigu pasidomėtumėt kitomis kalbomis tai sužinotumėt kad Pitonas, Lietuvoje viena iš populiaresnių kalbų, vien tik tuo ir remiasi. Jam yra prikurta įvairių bibliotekų beveik visiems gyvenimo atvejams, todėl pačiam kažką rimčiau teks itin retai perrašyti.
Pats paskalis galiausiai iš procedūrinės kalbos patapo objektine, taip gimė Delphi arba “Object Pascal”.

Dabar keletas pavyzdžių apie ką eina kalba.
Tarkim reikia sudėti visus skaičius esančius kokiam tai masyve. Jus mokina rašyti ciklą, apsirašyti begalę kintamųjų, eiti per kiekvieną elementą, sudėti visus skaičius ir galiausiai parašyti atsakymą.
Visa tai galima pakeisti į vieną funkciją. Todėl toks kodas:

program Noname0;
const skaiciai : array[0..4] of integer = (1,2,3,4,5);
var i, res : integer;
begin
  for i := 0 to length(skaiciai) do
    begin
      res := res + i;
    end;
   write(res);
   readLn;
end.

Pavirsta tokiu kodu:

program Noname0;
uses math;
const skaiciai : array[0..4] of int64 = (1,2,3,4,5);
var res : integer;
begin
  res := math.sumInt(skaiciai);
  write(res);
  readLn;
end.

Daug paprasčiau, ar ne? Pakeiskim dar vieną dažniausiai naudojamą kodo gabaliuką.
Tarkim reikia mums surasti mažiausią bei didžiausią skaičių masyve. Ir dar surasti vidurkį.
Mokyklose sakytų perrašinėti šitaip:

program Noname0;
const skaiciai : array[0..4] of integer = (1,2,3,4,5);
var didz, maz, vid, i : integer;
begin
  // randam didziausia
  didz := skaiciai[0];
  for i := 0 to length(skaiciai) do
    begin
      if (didz < i) then
        didz := i;
    end;
 
  // randam maziausia
  maz := skaiciai[0];
  for i := 0 to length(skaiciai) do
    begin
      if (maz > i) then
        maz := i;
    end;
 
  // randam vidurky
  vid := 0;
  for i := 0 to length(skaiciai) do
    begin
      vid := vid+i;
    end;
  vid := vid div length(skaiciai);
 
  writeLn('Didziausias: ',didz);
  writeLn('Maziausias: ',maz);
  writeLn('Vidurkis: ',vid);
 
  readLn;
end.

Labai ilgas ir dar trys ciklai… Supaprastinta versija būtų tokia:

program Noname0;
uses math;
const skaiciai : array[0..4] of integer = (1,2,3,4,5);
var didz, maz, vid, i : integer;
begin
  // randam didziausia
  didz := math.maxIntValue(skaiciai);
  // randam maziausia
  maz := math.minIntValue(skaiciai);
  // randam vidurky
  vid := 0;
  for i := 0 to length(skaiciai) do
    vid := vid+i;
  vid := vid div length(skaiciai);
 
  writeLn('Didziausias: ',didz);
  writeLn('Maziausias: ',maz);
  writeLn('Vidurkis: ',vid);
 
  readLn;
end.

Vidurkio deja nebuvo galima šiuo atveju pilnai sumažinti.

Manau supratot ką norėjau pasakyti. Tai yra tik labai paprasti pavyzdžiai, įsivaizduokit jeigu rašytumėt normalias, dideles programas, tai tas kodas pasidarytų beprasmiškai didelis. O visas RT bibliotekas galima peržiūrėti štai čia ir šiuose pavyzdžiuose naudojau MATH biblioteką.

Abidvi nuorodos kurias daviau veda į FreePascal svetainę. Galbūt galvojat kodėl? juk jūs mokotės tiesiog Paskalį, ne jokį Free. Tai yra todėl kad senokai iškilo organizacija kuri taip ir vadinasi – FreePascal, kuri sukūrė nemokamą ir atviro kodo Paskalio kompiliatorių bei IDE (Integrated development environment). Originalus paskalis, kuris kai buvo išleistas Borland kompanijos vadinosi “Turbo Pascal” ir jis jau yra itin pasenęs ir dar mokamas. Tuo tarpu FreePascal yra nemokamas, ir juo yra remtas jūsų FPS IDE, kuris taip plačiai naudojamas egzamine bei mokyklose ir turi laaaabai pasenusią FreePascal kompiliatoriaus versiją.

Pats FPS nėra blogas, tačiau kurti rimtas programas su juo yra sunku, kadangi jis palaiko tik konsolinę versiją ir norint programuoti objektiniu paskaliu, tektų labai pasistengti.
Be to, jis turi labai primityvų debugerį kuris leidžia sekti kodą, bet neleidžia stebėti kintamuosius.

Tad jeigu rašot kokią tai ilgą programą, jeigu tarkim sprendžiat IT egzamino užduotis, tai galiausiai kodas pasidaro ilgas ir logikos būna tiek privelta kad sunku akimis viską sužiūrėti. Kadangi FPS turi labai prastą debugerį, aš naudoju FreePascal išleistą daug geresnę alternatyvą – Lazarus, kurį galima parsisiųsti čia (jeigu pas jus Windows sistema, Lazarus galima įsirašyti ir ant Linux, UNIX bei MAC).

Galiu dabar ramiai paaiškinti kaip naudotis tuo debugeriu pagaliau! O juo naudotis yra taip pat paprasta kaip naudotis FPS.

Kai rašot programą ir iškyla problema, o gal įtariat kad nėra vykdoma viena ar kita programos dalis, tuomet sudedat taškus (breakpoints) tose eilutėse kur manot kad yra problema. Kad juos sudėti pelės mygtuku spaudžiat ties ta eilute kairėje pusėje kur pilka juosta, tuomet atsiras raudonas taškas. Dabar galima spausti F9 (arba Run) kad paleisti mūsų programą ir jis automagiškai sustos ties ta eilute. Dabar galima spaudinėti F7 arba F8 ir sekti kodą.
Jeigu spausit F7, tuomet debugeris seks kiekvieną eilutę eidamas ir į procedūras/funkcijas kurios yra pagrindiniam kode ir seks kodą tenai kol grįš į pirminį kodą ir taip toliau…
Spaudžiant F8 bus tas pat tik debugeris nešokinės iš pirminio kodo į šalutines procedūras/funkcijas.
Jeigu jau nebereikia sekti kodo, galit spausti F9 ir programa tęs darbą iki kol pasieks kita ar tą patį sustojimo tašką (breakpoint).
Su Lazarus užvedus pelę ant kintamojo bus parodyta jo gauta reikšmė.

Vatepva toks tas debugerio naudojimas. Paprasta ir labai naudinga.

Tai ką aš paaiškinau aukščiau dėl bibliotekų naudojimo galbūt nevisai tinka egzamine, kadangi tikrintojai irgi pagyvenę snobai ir žino kiek užtenka egzaminui ištaisyti, tačiau taisyklėse nėra parašyta kad tai draudžiama, o jei nedraudžiama – tai galima ir papildomi taškai yra skiriami už tvarkingą kodą, tad jeigu netinka RT bibliotekų naudojimas kad kodas pasidarytų gražesnis ir atliktų užduotį pilnai, tuomet jau atsiprašau bet tai yra visiška kvailystė.

Dar dėl gražesnio kodo, esu labai daug kur pastebėjęs kad žmonės visiškai nesilaiko taip vadinamų konvencijų arba kitaip – priimtiniausio kodo rašymo.
Tai sakydamas turiu omeny kad naudoja tik raides kintamųjų vardams arba beprasmes kombinacijas, kodas nebūna tinkamai paslinktas tarpais nuo krašto, pradeda rašyti bet kaip, naudoja statines funkcijas ir panašiai ir panašiai.
Pabandysiu paaiškinti kiekvieną atskirai.

Kintamųjų vardams turi būti naudojama ne raidės (nebent tai ciklo laikinas kintamasis) o pilni žodžiai, frazės arba trumpiniai. Paimkim viena iš aukščiau pateiktų kodų ir pervadinkim visus kintamuosius raidėmis:

program Noname0;
const a : array[0..4] of integer = (1,2,3,4,5);
var b, c : integer;
begin
  for b := 0 to length(a) do
    begin
      c := c + b;
    end;
   write(c);
   readLn;
end.

Iškart sunkiau pasidaro skaityti kai reik nuolatos žiūrėti į pradžią kad žinotum koks kintamasis yra kokio tipo.

Dar jei nenaudoja tarpų atskirti žodžiams ar simboliams, ir nededa atitinkamai tarpų pradžioje eilutės tai būna išvis košmaras:

program Noname0;
const a : array[0..4] of integer = (1,2,3,4,5);
var b, c : integer;
begin
for b:=0 to length(a) do
begin
c:=c+b;
end;
write(c);
readLn;
end.

Taškų už gražų kodą tikrai negausit.

O sakydamas statines funkcijas, turiu omeny darbą su masyvu. Aišku darbui su IT užduotimis įvesties failas pirmoje eilutėje turi du skaičius – kiek eilučių ir kiek elementų atskirtų tarpais kiekvienoje eilutėje (ne visuomet), todėl jaudintis dėl per mažo ar per didelio masyvo netenka. O kas jeigu mes nežinom kokio ilgio tas masyvas? tokiu atveju naudojama length(masyvas) kodas.

Vatepva norėjau truputį apšviesti. Jeigu kyla kokių nors neaiškumų ar šiaip klausimų – laukiu komentaru žemiau :)

Dabar parašysiu kelias nuorodas kurias turėtumėt peržiūrėti norint labiau įsigilinti:

Leave a Reply

Your email address will not be published. Required fields are marked *