B. Martuzāns

Kā Pēcis Beisikāns Maiju Saprātiņu programmēt mācīja

Par programmēšanu vispār un par programmēšanas valodu BASIC

Saturs

  1. Sēriju uzsākot3
  2. Ko Maija un Pēcis pārsprieda, visu turpmāko izlasījuši5
  3. 1.Kā viss sākās7
  4. 2.Pirmā iepazīšanās10
  5. 3.Maija Saprātiņa uzzina, kas ir algoritms19
  6. 4.Vēl viens algoritms25
  7. 5.Valodas, valodas, valodas…29
  8. 6.Sākas darbs37
  9. 7.Maijas pirmā programma45
  10. 8.Neliels labums no programmēšanas60
  11. 9.Pats grūtākais operators69
  12. 10.Maija par programmēšanu jau zina visu77
  13. 11.Dari kā es, dari labāk par mani!93
  14. 12.Neliels ieskats grāmatvedībā97
  15. 13.Skaitļotājs vai skolotājs?103
  16. 14.Galvenais ir uzskaite110
  17. 15.Skaitļotājs — ne tikai skaitļošanai124
  18. 16.Darbs ar vārdiem132
  19. 17.Mašīna apgūst latviešu valodu147
  20. 18.Vēl mazliet par to, kā skaitļotājs māca bērnus158
  21. 19.Maija uzzina par failiem171
  22. 20.Maija turpina apgūt failoloģiju192
  23. 21.Maza ekskursija pa Suvorova ielu205
  24. 22.Ko vēl var izdarīt208
  25. Īsa atgādne par beisiku213
  26. Priekšmetu rādītājs215
  27. Lasītāja anketa223

Sēriju uzsākot

Ar šo grāmatu, kas lasītājus gatavo personālo skaitļotāju un vispārējas kompjuterizācijas ērai, uzsākam jaunatnes sēriju «Zaļais stars». Tās grāmatu lappusēs jūs lasīsit par dabas, sabiedrības un kultūras parādībām zinātnes skatījumā. Visdažādāko nozaru speciālisti — sākot ar fiziķiem, biologiem un beidzot ar filozofiem un filologiem — vecāko klašu vidusskolēnam saprotamā valodā dalīsies tajās vispārcilvēciskajās garīgajās vērtībās, kuras var sniegt mūsdienu zinātne. Izmantosim ne vien latviski sarakstītus darbus, bet arī cittautu populārzinātniskās kultūras sasniegumus.

Latviešu valodā vispārizglītojošas populārzinātniskas grāmatas iznāk samērā reti. Tāpēc paredzams, ka faktiskais lasītāju loks šai sērijai būs plašs. Zinātnes atziņas var izklāstīt dažādā sarežģītības pakāpē. Vecāko klašu vidusskolēnu uztveres līmenis acīmredzot uzskatāms par populārzinātniskā izklāsta pamatpakāpi. Neviena augstskolu fakultāte, pat filozofiskā, dziļāku izpratni visā zināšanu «frontē» pagaidām, diemžēl, nedod. Specializācijas ēnā kāda daļa no līdzšinējām zināšanām var pat izgaist. Tāpēc populārzinātniskām grāmatām, kas adresētas vecāko klašu vidusskolēniem, nekāds lasītāju «vecuma cenzs» nepastāv: dzīvnieku emocijas un valoda fizikas profesoram var būt tikpat svaigs temats kā jaunajam naturālistam. Ceram, ka ar «Zaļo staru» sadraudzēsies arī daudzi no tiem, kas sevi vairs neuzskata par jauniem, taču dzīves burzmā vai specializācijas žņaugos nav pazaudējuši to nesavtīgo, nepraktisko, nepiespiesto un nepārvaramo «kāpēc?», ar kuru mēs visi ienākam pasaulē, tik spilgti atšķirdamies no pārējām dzīvajām būtnēm.

4Mēs, sērijas veidotāji, visvairāk vēlamies neatpalikt no dzīves, pirmām kārtām no zinātnes attīstības, un neatrauties no jums, lasītāji. Gaidām vēstules ar jūsu domām, vērtējumiem, priekšlikumiem un jautājumiem. Rakstiet, par ko vēlaties lasīt turpmāk, par kādām izlasītajās grāmatās skartajām problēmām labprāt uzzinātu vairāk. Atbildes saņemsit vēstulēs, sērijas nākamo grāmatu beidzamajās lappusēs vai arī periodisko izdevumu rakstos. No rosīgākajiem korespondentiem gribam izveidot otru, sabiedrisku «Zaļā stara» redkolēģiju, kas klātienē un neklātienē piedalītos sērijas «politikas» izstrādāšanā un tematikas izvēlē.

Zaļais stars ir reta optiska parādība, kas jūrā vai tās malā novērojama dažas sekundes pirms saulrieta beigām. Lai mūsu sērijas nosaukums simbolizē ikviena īsta zinātnes popularizētāja sapni: kaut izdotos atrast tādus vārdus, ka zinātniskā ideja lasītāja apziņā uzplaiksnī visā savā pirmatnīgajā skaistumā!

Uz saprašanos —
izdevniecības «Zinātne» Populārzinātniskās literatūras un zinātniskās daiļliteratūras redakcija
sērijas «Zaļais stars» redkolēģija

Ko Maija un Pēcis pārsprieda, visu turpmāko izlasījuši

— Es tev teikšu, Maija, grāmatiņa ir tā nekas...

— Nu, protams! Tu tur esi tik gudrs, tik gudrs, ka drebuļi krata! Bet es? Ievajadzējās dumiķīti, un uzreiz: kur tā Saprātiņa atkal pazudusi?!

— Tu pārspīlē, nemaz tik dumja tu tur neizskaties. Bet kaut kādu priekšstatu par programmēšanu grāmatiņa dos gan...

— Protams, protams! Tādiem kā tu, kas jau programmē un pat citus māca. Bet tiem, kas sāk no paša sākuma? Tiem grūtākās vietas vajadzēs studēt nezin cik ilgi.

— Toties citviet par vienkāršām lietām tiek runāts un runāts...

— Jāsaka atklāti: tāda īpašība tev tiešām piemīt, šinī ziņā viss ir pareizi.

— Vēl es domāju, ka nesaprotamu vietu tik baigi studēt nemaz nav nepieciešams. Labāk ir lasīt vien mierīgi tālāk, var taču gadīties, ka tas, ko nevar saprast tagad, tiks izskaidrots vēlāk. Un vispār programmēšanā labi saprast sākumu var tikai tad, ja saprot beigas, bet beigas, protams, nevar saprast bez sākuma. Tāpēc, lasot vidū, ieteicams šad un tad vēlreiz pašķirstīt arī sākumu. Un paskaties: šeit, beigās, ir priekšmetu rādītājs. Ja lasīdama sastopi tādu programmēšanas terminu, kuru jau esi aizmirsusi, tad šajā rādītājā vari uzzināt, kurā lappusē par to bija runa.

Maija, Pēcis un viņu gudrais draudziņš
Maija, Pēcis un viņu gudrais draudziņš

— Bet vai no visas tās lasīšanas būs kāds labums? Elektronisko skaitļošanas mašīnu var ieraudzīt, tikai nejauši nokļūstot Skaitļošanas centrā. «Jā, lūdzu, 6mīļie bērni, šeit ir mūsu ESM, šo podziņu varat nospiest, bet vairāk gan neko neaiztieciet. Vai! Pie tā skapja nespiedieties, un tu, mazais, nebāz pirkstu tajā spraugā!» Vai teiksi, ka tā nav?

— Drusku taisnība tev ir gan. Bet pēc dažiem gadiem visās iestādēs un skolās tādu mašīnu būs papilnam. Varēs pat veikalos nopirkt.

— Atradies pareģotājs! Kas tad dažos gados var mainīties?

— Tad redzēsi.

Ilustrācija

— Bet tagad? Kāda jēga šai grāmatai, ja izmēģināt savu programmu ar mašīnu varēs tikai pēc dažiem gadiem?

— Man par to grūti spriest, jo pats pie mašīnas tiku klāt no paša sākuma. Un tomēr man liekas, ka programmēšanā svarīgākais ir izdomāt, kas vispār jādara, névis zināt, kurš mašīnas taustiņš ko nozīmē.

— Izdomāt, kas vispār jādara...

— Nu jā! Un domāšanai nekāda mašīna nav vajadzīga. Sēdi un domā, kamēr izdomā.

— Var jau būt. Mēs jau arī strādājām ne tikai ar mašīnu. Mājās studējām un pētījām gatavas programmas.

— Un, izpildot vingrinājumus, programmu tu taču rakstīji, mierīgi pie galda sēdēdama?!

— Jā gan. Un pēc katras uzrakstītās programmas mans prāts apskaidrojās daudz vairāk nekā pēc tavas pļāpāšanas, kas te tik cītīgi ir aprakstīta.

— Šaubu nav, ka apskaidrojās. Bet apskaidrojās tikai tāpēc, ka tu jau biji dzirdējusi manus paskaidrojumus, lai arī kā tev tos labpatiktu nosaukt! Tāpat arī šo grāmatu ir vērts palasīt, pirms tiek pie mašīnas. Vissvarīgākais, ko bez programmas laišanas nevarēs apjēgt, ir tas, ka programmēšana patiesībā ir viena vienīga kļūdu labošana. Ka pilnas ar kļūdām ir arī tās programmas, kas pašam programmistam liekas fantastiski labas.

— Jā... Tās kļūdas... Bet tur nu gan tev nav taisnība, ka programmas sastāv tikai no kļūdām. Beigu beigās katra programma taču sāk strādāt! Nu, lielas programmas, kur ir tūkstošiem rindu, patiešām ir grūti sastādīt, it sevišķi tad, ja no paša sākuma viss nav labi izdomāts un izplānots... Šo to esmu par šiem jautājumiem paklausinājusi, jo, kā liekas, pēc skolas startēšu uz fizmatiem. Varu to tev atklāt.

7— Es gan vēl neesmu galīgi izlēmis. Man no fizmatiem ir mazliet bail. Kaut ko vienkāršāku...

— ...un vieglāku. Kam tad tev programmēšana, ja vieglas dzīves tīkojas? Starp citu, šis izteiciens grāmatā tiek citēts kā tavējais.

— Es no tā neatsakos. Taču, pirmkārt, no vieglas dzīves iespējams izvairīties jebkurā profesijā, un, otrkārt, programmēšanas monopols no fizmatu rokām jau slīd laukā. To taču tu būsi ielāgojusi, ka visai drīz personālais skaitļotājs kļūs par katras profesijas darbarīku, par katra cilvēka pirmo palīgu un padomdevēju. Par izklaidīga cilvēka labāko draugu.

— Mērķēts uz mani. Nu, bet Pēcis Beisikāns, nabaga Maiju Saprātiņu fizmatos ievilinājis, pats laikam būs uz rakstniecību sataisījies...

— Un savā pirmajā romānā attēlos Maijas Saprātiņas kompjuterizēšanos un šī procesa pozitīvo ietekmi uz viņas personības harmoniju. Varena ideja!

— Lēnāk! Es tev neesmu nekāds izmēģinājumu trusītis. Un savu programmista talantu upurēt šaubīgiem eksperimentiem dvēseļu inženierijā — ak, Pēci Beisikān, attopies!

— Pati izprovocēji. Nu labi, uzskati to par mirkļa vājību. Ļoti jau gribētos sasniegt programmēšanas kalngalus...

— Tad uz redzēšanos fizmatos?

— Čau!

1.

Kā viss sākās

Pēcis Beisikāns gāja pa ielu, mierīgi domādams savas domas. Likās, ka nekādi pārsteigumi nav gaidāmi.

Bet tad... Maija Saprātiņa no paralēlklases! Nāk pretī! Pēcis pašķielēja pa labi. Nama siena! Nevienas ieejas, pa kuru nozust veikalā vai kāpņu telpā. Pa kreisi pat skatīties nebija vērts. Tur bija iela, brauca automašīnas, bet Pēcis jau kopš bērnudārza laikiem necienīja cilvēkus, kuri ielu pāriet nepareizās vietās. 8Bija vien jāiet tālāk. Un Pēcis gāja! Galvu mazliet nodūris, pieri grumbās savilcis, lai izskatītos pēc cilvēka, kas dziļi gremdējies domās. Varbūt nepamanīs...

Ilustrācija

— Čau, Beisikān! — Pēcis izdzirdēja. Nācās tēlot pārsteigumu. — Ā-ā! Tā esi tu. Čau!

— Uz kurieni?

— Es, vai? Es tad... Es taisos aizlaist uz centru.

— Un ko tu centrā taisies darīt? Blandīsies vai iesi uz kino?

Pēcis Beisikāns nepavisam nebija noskaņots savos plānos dalīties ar Maiju Saprātiņu. Vai samelot? Nevar teikt, ka melot Pēcis nemaz nemācētu. Viņam bija gadījies to darīt un iznāca tīri ciešami. Taču melošanai bija vajadzīgs pārliecinošs iemesls, bet šoreiz tādu nevarēja atrast.

— Ne vienu, ne otru... Braukšu uz Skaitļošanas centru. Es tur šad tad programmēju ar ESM.

— Jā?! Kas tev lēcies? Vai skolā maz uzdod? Vai varbūt taisies uz matemātiķiem?

— Vēl nemaz nezinu, uz kurieni taisos, — Pēcis tiešām nezināja, — bet uzdot man uzdod kā visiem. Vieni iet uz peldēšanu vai, piemēram, uz filatēlistu pulciņu, bet es — uz programmēšanu. Un vispār programmēt tagad jāmāk katram cilvēkam.

Maija gluži sašuta.

— Kā tad, Beisikān! Ja es nemācos fizmatklasē, tad... tad es neesmu cilvēks!

Tādu reakciju Pēcis nebija gaidījis, tomēr saglabāja mieru un mēģināja paskaidrot:

— Tu arī varētu iemācīties. Tas nemaz nav grūti, un mateni tu taču tīri labi apjēdz.

9Pēcis Beisikāns to zināja, jo viņam bija nācies kopā ar Maiju piedalīties matemātikas olimpiādēs un — kas tur ko slēpt! — Maijai parasti bija labākas sekmes, kaut arī skolotājiem minūtes desmit bija jāpatērē, lai Maiju nomierinātu, jo viņa te paziņoja, ka uzdevums esot nepareizs, te pa visu klasi meklēja rakstāmo, te pieprasīja apklusināt blakussēdētāju, kas, pēc viņas domām, pārāk skaļi pukstot.

Mazliet padomājis, Pēcis piebilda:

— Tiesa, lai iemācītos programmēt, manuprāt, matemātika ļoti labi nemaz nav jāzina.

— Ē-ē! — Maija iesaucās. — Zinu es šito programmēšanu. Kaimiņu meitenei to jau māca. Sākumā viņi visi gaidīja, kas nu būs, bet izrādījās — ba-aigā garlaicība! Kaut kādus skaitļus no vienas skaitīšanas sistēmas pārveido citā un tad atpakaļ — vai kaut kas tamlīdzīgs — un visu laiku tik runā, cik lieliski, cik grandiozi, cik vērtīgi... būtu pastrādāt ar īstu ESM.

— Piedod, bet es strādāju pa īstam — pie programmas, kura patiešām būs vajadzīga. Protams, ja kaut kas derīgs iznāks.

— Tā nu es tev ticēšu! Katram sīkajam ļaus darīt ko patiešām vajadzīgu?!

— Kāpēc gan ne?! Nestrādāju taču pirmo gadu. Ne vienu vien programmu esmu sastādījis. Bija, protams, arī mācību programmas, bet bija arī gluži īstas, kuras pavisam normāli var izmantot. Bet, atklāti sakot, šī nodarbošanās man patīk, un es sagaidīt vien nevaru, kad atkal tikšu pie mašīnas.

To pateicis, Pēcis mazliet saminstinājās, jo no savas pieredzes jau zināja, ka par to, kas patīk, it sevišķi ja tas ir kas nopietns, ar meitenēm pārāk daudz pļāpāt nedrīkst. Sāks vēl izsmiet. Taču šoreiz Maijas balsī bija saklausāma pat interese.

— Oho! Var teikt, ka tu esi labi iekārtojies. Ar īstu ESM pastrādāt — tas nemaz nav slikti... Bet mums, parastajiem cilvēkiem, uz to jau nav ko cerēt.

— Nekas nevar būt vieglāk! — Pēcis aizrautīgi izsaucās. — Vari braukt man līdzi. Paspēlēsi ar mašīnu dažādas spēles, paskatīsies, kā es strādāju, un, ja gribi, arī tevi varu iemācīt programmēt.

— Ha-ha-ha! Pēcis Beisikāns učuka lomā! Te jau pat kompjūteriem jāsmejas. Bet paskatīties jau var. Braucam arī.

Un tā Maija Saprātiņa nokļuva Skaitļošanas centrā.

2.

Pirmā iepazīšanās

— Skaties! Tavā priekšā ir elektroniskā skaitļošanas mašīna. Jeb elektroniskais skaitļotājs. Vari sacīt pavisam īsi — skaitļotājs. Šo mašīnu sauc par «SM-4». Uz mašīnas rakstīts «CM-4» — tie ir krievu burti. Tas ir gluži tāds pats nosaukums, kāds, piemēram, automašīnai ir Žiguļi vai Moskvičs. Diemžēl, skaitļotājiem ir daudz vairāk tipu nekā vieglajām automašīnām, un, ja cilvēks ir apguvis vienu skaitļotāju, tad tas vēl nenozīmē, ka viņš tūdaļ bez raizēm varēs strādāt arī ar citu.

Skaitļotāji ir daždažādi

— Pē! Tad jau nav vērts ķerties pie mācīšanās, pirms cilvēks nezina, ar kādu skaitļotāju būs jāstrādā.

— Tik traki nav. Būtībā tie visi ir vienādi, un, ja tu pratīsi programmēt ar vienu skaitļotāju, tad apgūt citu būs daudz vieglāk. Vajadzēs iegaumēt pārdesmit jaunu vārdu un varbūt apgūt dažus jaunus jēdzienus.

— Tas nu būtu sīkums.

— Kā man stāstīja, ir arī citas atšķirības. Piemēram, skaitļotāja iespējas. Cits skaitļotājs var izdarīt vairāk, cits mazāk.

— Tas ir skaidrs. Jo lielāka mašīna, jo tai jābūt labākai. Šī mašīna ir daudz mazāka nekā citas. Televīzijas raidījumos esmu redzējusi pavisam lielas — aizņem veselu zāli.

— Gluži tā vis nevajadzētu spriest. Teiksim, lielajām mašīnām ir liela atmiņa — daudz lielāka, nekā tev vajag. Kāds tad tev no tā labums? Arī darbības ātrums jeb ātrdarbīgums dažādām mašīnām ir dažāds. Lielākas mašīnas, atšķirībā no mazajām, parasti izpilda daudz vairāk aritmētisko darbību sekundē, piemēram, dažus miljonus. Bet ja tev vajag izpildīt tikai simttūkstoš darbību? Lielajai mašīnai tas prasīs desmitdaļu sekundes, šai mašīnai — apmēram sekundi. Kāda starpība, gaidīt veselu sekundi vai desmitdaļu?

Ilustrācija

— Simttūkstoš darbību sekundē... Simttūkstoš... Tas nu gan ir liels skaitlis. Vai kaut kur būtu vajadzīgs izpildīt tik daudz aritmētisko darbību?

— Jā gan. Un vēl vairāk. Parasti jau visādos aprēķinos šeit, Skaitļošanas centrā, ar vienu sekundi nepietiek, rēķināts tiek stundām ilgi. Vēl gan jāņem vērā, ka jāizpilda ne tikai aritmētiskās darbības. Ir arī citas. Piemēram, dažādu datu pārsūtīšana no vienas vietas uz citu.

— To tu man acīmredzot nevarēsi, kā nākas, izskaidrot, tāpēc labāk saki: kas kur atrodas šajā mašīnā?

No kā sastāv skaitļotājs

— Nu... Šajā mašīnā — un, manuprāt, arī visās citās — pamatsastāvdaļas ir atmiņa un procesors. Atmiņā glabājas visi dati, ar kuriem mašīnai būs jāstrādā, un visi tie darba rezultāti, kuri vēl būs vajadzīgi. Procesors ir iekārta, kas ar šiem datiem strādā un šos rezultātus iegūst. Strādāt — tas nozīmē izpildīt aritmētiskās vai arī citas operācijas, piemēram, kā jau es teicu, datu pārsūtīšanu. Datus pārsūtīt nākas diezgan daudz. Teiksim, saskaitīšanā saskaitāmie jāpārsūta no atmiņas uz procesoru un, kad summa ir gatava, tā jāpārsūta atpakaļ uz atmiņu. Un vēl! Pati programma arī glabājas atmiņā un, lai tiktu izpildīta, jāpārsūta uz procesoru.

— Un tas viss notiek šajos skapjos?

Procesors rēķina mērkaķa ātrumā
Procesors rēķina mērkaķa ātrumā

12OPERATĪVĀ ATMIŅAMAGNĒTISKIE DISKI— Jā. Un palūkojies, lūdzu, uz šejieni. Te ir svarīga iekārta. Šeit informācija tiek ierakstīta magnētiskajos diskos un no tiem arī nolasīta. Un tik svarīgi tas ir, lūk, kāpēc. Mašīnas atmiņu — to pašu, no kurienes procesors dabū datus un kur noglabā rezultātus, — sauc par operatīvo atmiņu, jo ir vēl arī citas atmiņas. Operatīvā atmiņa strādā ļoti ātri, bet, kad mašīnu izslēdz, tad viss, kas šajā atmiņā glabājies, izzūd. Un tas, tu saproti, ir slikti. Tāpēc ir izgudroti šie magnētiskie diski — tāda atmiņa, kurā ierakstītā informācija saglabājas arī tad, kad disku no mašīnas izņem un noliek plauktā. Toties rakstīšana uz diskiem un nolasīšana no tiem velkas samērā ilgi.

— Cik nojaušu, informācija šajos magnētiskajos diskos tiek rakstīta gluži tāpat kā maģī uz lentes.

Ilustrācija

— Jā, princips ir tāds pats, tikai magnētiskās lentes vietā ir ciets, skaņuplatei līdzīgs disks, kas visu laiku griežas drausmīgā ātrumā. Visu laiku tāpēc, ka nevar jau zināt, kad tev iegribēsies tajā kaut ko ierakstīt. Kamēr iekustēsies, var zaudēt pat veselu sekundes desmitdaļu! Bet drausmīgā ātrumā disks griežas tādēļ, lai ātrāk varētu informāciju nolasīt vai pierakstīt. Tiesa, tik un tā ar diskiem iet daudz lēnāk nekā ar operatīvo atmiņu. Starp citu, skaitļotāji raksta arī magnētiskajā lentē, un, dabiski, var no tās nolasīt. Tas iet vēl lēnāk.

— Kāpēc tad nevar iztikt ar diskiem vien?

— Kāpēc? Varbūt tāpēc, ka magnētiskā lente maksā lētāk nekā magnētiskais disks.

— Labi, liksim lentes mierā. Pagaidām es neko tajās negribu rakstīt. Bet kas tas?

— Tā ir drukas iekārta. Ar to var izdrukāt programmu tekstus un programmu darba rezultātus. Redzi, šeit kaut kas ir izdrukāts.

ABCDEFGHIJKLMNOPRSTUVWXYZ0123456789

— Izskatās tīri labi. Gan burtus, gan ciparus veido simpātiski punktiņi.

Ilustrācija

— Tāpēc šādas iekārtas sauc par mozaīkas drukas iekārtām. Punktiņi, kuri veido gan burtus, gan ciparus, gan speciālās zīmes jeb, vienā vārdā, simbolus, tiek paņemti no 35 punktiņiem, kas izvietoti taisnstūrī 7×5.

Drukāšana notiek tā!
Drukāšana notiek tā!

Displejs — skaitļotāja saite ar pasauli

— Bet šis televizors laikam ir pats galvenais?

— Jā, tā ir svarīga manta. To sauc par ekrānpulti jeb displeju. Displeja priekšā tu redzi ievades tastatūru. Nospiedīsi tastatūras taustiņu, un uz ekrāna parādīsies simbols — arī izveidots no punktiņiem. Nospiedīsi citu taustiņu, parādīsies cits. Gluži tāpat, kā strādājot ar rakstāmmašīnu. Tikai burti netiek drukāti uz papīra, bet gan parādās uz ekrāna. Pats galvenais taustiņš ir ievades taustiņš — šeit, pa labi, vai redzi —, uz tā krieviski rakstīts ВВОД. Ja to nospiež, viss, kas redzams pēdējā ekrāna rindā, nonāk mašīnas operatīvajā atmiņā, un mašīna šo informāciju sāk pētīt. Īsāk to var pateikt tā: notiek rindas ievade no displeja. Kamēr ievades taustiņš nav nospiests, mašīnai ir pilnīgi vienalga, ko tu pēdējā rindā esi sarakstījusi. Bet ievade ir tikai puse no tā, ko var darīt ar displeju. Vēl mašīna pati uz ekrāna var izvadīt aprēķinu rezultātus vai ziņojumus programmistam. Piedod! Kad mani mācīja, tad dikti bāra par tādiem izteikumiem kā «mašīnai ir vienalga», «mašīna sāk pētīt informāciju», «mašīna pati var izvadīt», jo tie elektroniskajam skaitļotājam piedēvējot cilvēka īpašības. Pareizāk tiešām būtu sacīt: var noprogrammēt informācijas izvadi uz ekrāna.

— Jā? Tas taču ir tas pats, un nav tur ko piekasīties.

Skaitļotājam savas galvas nav!

Ilustrācija

— Gluži tas pats vis nav. Svarīgi ir saprast, ka elektroniskais skaitļotājs pats neko nevar izlemt. Viņš dara tikai to, ko grib programmists. Brīžiem skaitļotājs, protams, izskatās tīri saprātīgs, bet pats — es saku pats! — nevar vairāk kā traktors vai kā... kā, teiksim, veļas mazgājamā mašīna.

— Bet saka taču: traktors ar, veļas mazgājamā mašīna mazgā.

— Jā... Tā tiešām saka, bet tu taču nešaubies, ka visas mašīnas vada cilvēks. Patiesībā tas «arājs» ir traktorists: viņam izsniedz televīzijas vimpeli par labu darbu, nevis traktoram. Tāpat arī veļas mazgājamo mašīnu un elektronisko skaitļošanas mašīnu vada cilvēks. Un tāpēc, kaut arī liekas, ka ESM kaut ko dara pati, īstenībā to dara programmists, kurš kādreiz ir sastādījis programmu. Mēs šo programmu tad nu laižam, brīnāmies, cik lieliski tā strādā, bet programmistu, tās autoru, savā mūžā neesam redzējuši, un arī pats programmists neko par mums nav dzirdējis. Un tomēr tieši viņš ir izlēmis, ko mūsu ESM tagad darīs. Nu, varbūt pēc kādiem simt gadiem mašīna arī kļūs kaut nedaudz patstāvīga.

— Labi, es skatos, ka tu sāc baigi filozofēt. Lūdzu, konkrētāk!

Šis un tas par rakstāmmašīnām un burtiem

TASTATŪRA— Tad sēdies pie displeja un papēti tastatūru. Taustiņi ar burtiem šeit ir izvietoti gluži tāpat kā parastai 15rakstāmmašīnai ar krievu burtiem. Es ceru, ka rakstāmmašīnu tu esi redzējusi.

Ilustrācija
Skaitļotājs iesācēja izpratnē
Skaitļotājs iesācēja izpratnē

— Rakstāmmašīnu redzējusi gan esmu, bet to, kā tur burti izvietoti, neatceros. Atklāti sakot, es nemaz nezināju, ka visām rakstāmmašīnām burti izvietoti vienādi.

— Tas nu ir droši! Burtu izvietojums atšķiras vienīgi rakstāmmašīnām ar krievu un latviešu burtiem. Lai uz displeja varētu rakstīt krievu burtus, jābūt nospiestam šim taustiņam ar bultu virsū. Paskaties, uz katra taustiņa ir gan krievu, gan attiecīgs latīņu alfabēta burts. Ir arī nelieli izņēmumi. Redzi: krievu А un latīņu A, krievu Б un latīņu B, bet šeit krievu Ж un latīņu V. Kā tu saproti, lai varētu rakstīt latviešu valodā, trūkst garumzīmju, mīkstinājuma zīmju un burtu š, č un ž. Un katrs programmists izlīdzas, kā prot. Es, piemēram, garumzīmi apzīmēju ar burtu H aiz attiecīgā patskaņa. Kādreiz latviešu valodā tā darīja. Piemēram, «jērs» man būs JEHRS. Kā jau visiem pareizrakstības likumiem, arī šim ir izņēmums: ja garais patskanis ir vārda beigās, tad garumu apzīmēju ar apostrofu «'». Piemēram, «rītā» man būs RIHTA'.

Ilustrācija

— Tas vēl nav tik briesmīgi. Vai tu man varētu pateikt, ko tavā «ģeniālajā» pareizrakstībā nozīmē KRAHS? «Krahs» vai «krās»?

— Protams, ar viena vārda uzrakstīšanu vien nepietiek. Bet, ja šis vārds tev būs teikumā, tad es uzreiz sapratīšu, vai tur runa ir par krahu, 16vai par krāšanu. Ar līdzskaņiem š, ž un č es izrīkojos līdzīgi — to apzīmēšanai izmantoju burtu H: SH, ZH un CH. Bet līdzskaņus n, l, k, g mīkstinu ar burtu J. Jocīgi jau nu tāds teksts izskatās, piemēram, «ķīši» te būs jāraksta kā KJIHSHI, bet pierast pie tādas mašīnpareizrakstības nav grūti.

Varbūt tagad paspaidi taustiņus.

Maija jau sāk darboties

— Jā, taustiņus spaidīt ir viegli un patīkami. Ņemšu un uzrakstīšu kādu vārdu. Mašīnpareizrakstībā.

>MULJKJIS
Ilustrācija

— Kāpēc noteikti jāraksta tieši «muļķis»?

— Nepiekasies. Ja nepatīk, varu uzrakstīt tā:

>MULJKJISINTELIGJENTS

— Tas jau ir daudz labāk!

— Paklau, bet es gribēju, lai «inteliģents» būtu nākamajā rindā.

KURSORS— Ar gribēšanu vien ir par maz, vajag arī visu pareizi izdarīt. Paskaties uz rindas beigām. Vai tu redzi mazu horizontālu svītriņu nedaudz zemāk par pašu rindiņu? Tas ir kursors. Tur, kur atrodas kursors, nospiežot taustiņu, arī parādīsies simbols. Kad tu uzdrukāji pirmo vārdu, kursors palika vārda beigās, tāpēc nav nekāds brīnums, ka otrais vārds novietojies tūlīt aiz 17pirmā. Ja gribi pāriet uz jaunu rindiņu, vari, piemēram, nospiest ievades taustiņu.

MCR -- TASK NOT IN SYSTEM
>

— Ai! Es laikam kaut ko sabojāju.

— Nebaidies. Spaidot taustiņus, tu varētu tikai sabojāt informāciju uz diska, pašu mašīnu šādi salauzt nevar.

Programmēšana jeb skaitļotāju dresēšana nav bīstama
Programmēšana jeb skaitļotāju dresēšana nav bīstama
Ilustrācija

— Bet kas tad īsti notika?

— Vai pirms kursora redzi zīmi «lielāks» — «>»? Ja rindas sākumā ir tikai šī zīme, tad tas nozīmē, ka mašīna gaida komandu, ko darīt. Tādas komandas pašreiz varētu ievadīt vairākas, bet ņem vērā: ja kaut viens simbols ir nepareizs, tad arī visa komanda ir nepareiza un mašīna — ja tā var teikt — neko nesaprot. Ar tādu pašu zīmi sākās arī rinda, kuru tu ievadīji mašīnā.

— Tiesa gan! Uzreiz nepamanīju.

— Nu tad klausies. Tas «muļķisinteliģents», ko tu ievadīji mašīnā, nav nekāda komanda. To tu pati labi saproti. Un mašīna uz ekrāna izvadīja ziņojumu, ka ievads ir nepareizs.

Ko vēl var redzēt uz tastatūras

Turpini vien iepazīties ar tastatūru. Iegaumē, kur atrodas punkts un komats, uz rakstāmmašīnu tastatūrām tie ir izvietoti citās vietās. Ai, es gandrīz 18piemirsu speciālās zīmes! Rakstāmmašīnām to parasti nav. Redzi, procenta zīme «%», to jau visi zina.

— Bet kas tas ragainais tai blakus?

— Šī zīme «¤» ir naudas vienības simbols, bet programmisti to sauc par saulīti. Tā mums būs vajadzīga. Bet šī zīme «#» ir numura simbols. Tiesa, tā mums būs mazāk vajadzīga.

— Izskatās, ka visas zīmes esmu redzējusi. Tikai šo «&» ne.

— Tā, tā... Liekas, esmu aizmirsis. Man šī zīme vēl nav bijusi vajadzīga. Tu nebūsi redzējusi arī citas zīmes, piemēram, «\», ko sauc par otrādo slīpsvītru, jo ir arī parastā slīpsvītra «/», ar kuru apzīmē dalīšanu. Savukārt reizināšanu apzīmē ar zvaigznīti «*». Bet diez vai tas tevi interesē.

Maijai sāk gribēties programmēt

— Stāsti vien. Man sāk likties, ka to programmēšanu tomēr vajadzētu pamācīties. Gluži veltīga laika nosišana tā vis nebūtu. Ja tikai varētu tikt pie mašīnas.

— Es domāju, ka vajadzētu varēt, bet par to jāparunā ar Algoritmu.

— Ar ko, ar ko?

— Ar mūsu programmēšanas pulciņa vadītāju. Tagad, kad mēs esam apguvuši programmēšanu un darbojamies patstāvīgi, Algoritms vairs tikai dod vadošus norādījumus. Bet par Algoritmu mēs viņu iesaucām tāpēc, ka viņš visu laiku par algoritmiem vien runā: galvenais ir algoritms, izdomājiet algoritmu, neredzu algoritmu, labs algoritms, slikts algoritms.

— Nu tad aprunāsimies ar Algoritmu. Šodien pat. Kad būsim beiguši. Bet tagad turpini.

Ilustrācija

— Šodienai pietiks. Par displeja tastatūru jau ir gandrīz viss. Vēl tikai jāpastāsta par cipariem. Skaties, tie ir pamattastatūras pašā augšējā rindā, un, lai tos ievadītu, vajag pārslēgties uz krievu burtiem. Tā kā programmisti galvenokārt strādā ar latīņu alfabētu un cipariem, tad, lai visu laiku nevajadzētu pārslēgties no vieniem burtiem uz otriem, ir arī atsevišķa tastatūriņa cipariem. Runājot par cipariem, jāteic, ka nulle uz ekrāna parādās un uz 19papīra izdrukājas pārsvītrota — «Ø». Lai to varētu droši atšķirt no burta «O». Nu gan ir viss.

— Ē-ē! Pagaidi! Vēl taču kaut kas jāizdara. Ar vispārīgu iepazīšanos vien ir par maz.

— Vairāk es gan nestāstīšu. Vari ar mašīnu jeb, pareizāk sakot, ar programmu kaut ko paspēlēt. Piemēram, trīsdimensiju desas. Tev kā iesācējai tas var būt interesanti. Man gan tās spēles jau sen ir apnikušas.

— Nezinu, kā spēles var apnikt. Uz priekšu!

3.

Maija Saprātiņa uzzina, kas ir algoritms

Nākamreiz Maija un Pēcis satikās Pēča mājās, jo viņš gribēja pastāstīt, kas ir programma, programmēšana un programmēšanas valoda. Bet par to var runāt arī bez paša elektroniskā skaitļotāja.

Pārrunas ar Algoritmu tiešām bija vainagojušās ar panākumiem. Maijas apmācīšanai tika iedots mašīnlaiks — kad var strādāt ar ESM — un par skolotāju iecelts Pēcis. Turklāt Algoritms piebilda, ka runa varot būt tikai par nopietnu mācīšanos, nevis par kaut kādu trādirīdi, kā dažreiz iedomājoties. Maijai gan šī piezīme likās pilnīgi lieka un klaji audzinoša, bet Algoritma klātbūtnē viņa to neteica.

Kļuvis par skolotāju, Pēcis sarunai rūpīgi gatavojās un visu, ko zināja, pamatīgi apdomāja. Un, jāsaka, viņš zināja diezgan daudz.

Tiesa gan, sākumā viņš centās izteikties pārāk gudri.

Pirms programmas vienmēr ir algoritms

— Pirms sākam diskutēt par programmas un programmēšanas jēdzieniem, jāizanalizē fundamentālais algoritma jēdziens.

— Kas, kas?

— Tas, ka vispirms vajag saprast, kas ir algoritms.

— Nu labi. Gribu dzirdēt.

ALGORITMS— Tā, kā skolā jāatbild stundās, es tev izskaidrot nevaru. Bet, ja runājam vienkārši, algoritms ir priekšraksti, pēc kuriem jārīkojas, lai kaut ko izdarītu. Jeb varbūt tā... Ar algoritmu tiek izskaidrots, kas jādara, lai kaut ko izdarītu. Bet šim izskaidrojumam jābūt ļoti skaidram un precīzam. Katru reizi, uzsākot kaut ko darīt, jāparedz visi iespējamie iznākumi, kā arī jāizplāno, kas katra iznākuma gadījumā jādara. Laikam nav visai skaidrs?

— Kāpēc gan ne! Aizej tur, nezin kur, izdari to, nezin ko.

— Hm. Tad varbūt aplūkosim kādu piemēru. Ņemsim algoritmu, kā pirmklasnieks Pēcītis nāk mājās no skolas.

— Tu pats, vai?

— Nav svarīgi. Ja mājāsnākšanas procesu aplūkotu sīki, algoritms būtu ļoti sarežģīts, bet vispārīgos vilcienos, tikai skaidrības labad, to var izklāstīt pavisam viegli. Visīsākais Pēcīša ceļš no skolas uz mājām Programmistu bulvārī 38 ir tāds, kā šeit uzbildēts. Viss sarežģās tāpēc, ka namu nr. 36 nevar apiet no kreisās puses, ja tur skraida suns Briesmonis, ko saimnieks bieži palaiž savā vaļā. Dažu iemeslu dēļ, kurus sīkāk aplūkot nav vajadzības, Briesmonis Pēcīti ļoti neieredz. Tātad, ja Briesmonis nav piesiets, namu nr. 36 vajag apiet no labās puses. Bet arī šeit iespējami sarežģījumi, jo te var spēlēties piekasīgais un lecīgais mocītājs Bidzis Huligāns. Tas ir vēl sliktāk, nekā sastapties ar Briesmoni.

Ilustrācija

Algoritmus attēlo ar blokshēmām

— To, ko es pastāstīju, var attēlot shematiski — ar algoritma blokshēmu. Paskaties uz šo zīmējumu.

Ilustrācija

BLOKSHĒMABlokshēmā taisnstūrveida blokos aprakstītas tās Pēcīša darbības, kuras neprasa nekādus spriedumus, nekādus lēmumus, bet rombveida blokos attēloti jautājumi, uz kuriem Pēcītim ir jāatbild ar «jā» vai «nē», izmantojot informāciju, kuru viņš iegūst darbības gaitā. Atkarībā no atbildes iespējama divējāda turpmākā darbība. Kā redzi, blokshēmā ir divi rombi ar jautājumiem «Vai Briesmonis skraida?» un «Vai Bidzis Huligāns spēlējas?».

— Jā-ā, shēma ir interesanta, it sevišķi Bidzis Huligāns. Bet saki, lūdzu, vai es pareizi saprotu: ja Briesmonis skraida un Bidzis Huligāns spēlējas, tad Pēcītis tā arī grozīs galvu gan pa labi, gan pa kreisi?

Svarīgs jēdziens — «cikls»

CIKLS— Tieši tā. Viņam būs jāgroza galva tik ilgi, kamēr uz vienu no šiem jautājumiem varēs atbildēt «nē» vai arī viņš pats nokritīs zemē aiz noguruma. Bet zinātniski var teikt, ka algoritmā ir cikls. Spriežot pēc jautājuma, to tu jau esi pamanījusi. Cikls sanāk tāpēc, ka, Briesmonim skraidot un Bidzim Huligānam spēlējoties, bultiņa no pēdējā romba atgriezīsies blokā «Paskatīties pa kreisi». Šim ciklam ir divas izejas pēc nosacījuma. Lūk, shēmā es tās esmu atzīmējis. Citu izeju no cikla nav, tātad citādi tas nevar beigties. Tas arī ir viss.

— Labi. Diez kādas gudrības tās nu nav, bet nāksies tomēr pierast. Un tad vēl. Kad man ir izdevies atrisināt kādu uzdevumu matemātikā, es dažkārt «pārdomāju»: bet kas būs, ja šo nosacījumu mainīs? kas būs, ja šis leņķis nebūs taisns kā uzdevumā, bet šaurs? kas... un tā tālāk. Varbūt pārdomāsim arī tavu algoritmu?

— Nu?

— Piemēram, ja Pēcītim vajadzētu izdarīt visvisādus sarežģītus pagriezienus, kā mūsu mikrorajonā, tad tavā algoritmā faktiski neko jaunu nevajadzētu paredzēt: tu gluži vienkārši pievienotu vēl kādus taisnstūrveida blokus.

— Jā, protams.

— Tālāk. Ja Pēcītim būtu iespējams ne tikai pagriezties pa labi vai pa kreisi, bet arī doties taisni? 23 Tur viņam draudētu, teiksim, sastapšanās ar sētnieci, kura atkal dažu iemeslu dēļ varētu sākt Pēcīti pāraudzināt, bet viņam to nemaz negribas. Ko lai dara šādā gadījumā?

Ilustrācija

— Tad pievieno taisnstūrveida bloku «Paskatīties taisni uz priekšu» un rombisko bloku ar nosacījuma «Vai sētniece strādā?» pārbaudi. Lūk, šeit apakšā tūlīt pēc bloka ar Bidzi Huligānu.

— Man tā arī likās. Bet pasaki, lūk, ko. Vai ir obligāti, lai no blokiem ar nosacījuma pārbaudēm, kā tu tos sauc, izietu tieši divas bultiņas — viena ar atbildi «jā», otra ar atbildi «nē»? Bet kas būtu, ja uzdotu jautājumu, kuram var būt vairāki atbilžu varianti un ne tik vienkārši kā «jā» un «nē»? Vai tas būs uzskatāms par algoritmu vai vairs ne? Nu, teiksim, jautājums «Cik tev gadu?» vai «Uz kurieni tu ej, Pēcīt?». Ir taču skaidrs, ka ar tādiem jautājumiem, uz kuriem jāatbild tikai ar «jā» vai «nē», daudzmaz sarežģītas darbības nevar aprakstīt.

— Tā... Vienu mirkli... Dziļi roc, es skatos... Arī šajā gadījumā visu var attēlot ar rombveida bloku virkni! Blokos jāpārbauda visi nosacījumi «Vai Pēcītis iet uz mājām?», «Vai uz skolu?», «Vai uz pulciņu?» un tā tālāk. Uz visiem šiem jautājumiem var atbildēt ar «jā» vai «nē». Iznāk, ka tik slikti nemaz nav — pat sarežģītākas darbības var aprakstīt ar tādiem jautājumiem, uz kuriem jāatbild tikai ar «jā» vai «nē». Algoritmos, kā tu drīz sapratīsi, tikai tādi jautājumi vien var būt.

— Skaidrs. Tagad pasaki — kāpēc pašā sākumā tu teici, ka īstais algoritms Pēcīša iešanai uz mājām esot daudz sarežģītāks?

Ievads robottehnikā

— Nu, kā tad, ka sarežģītāks! Iedomājies tādu robotu, kas Pēcīša vietā ietu uz skolu un, protams, arī no skolas uz mājām...

— Oho! Tādu robotu man gan gribētos!

— Un piedevām vēl šis robots būtu ļoti līdzīgs Pēcītim, pat viņa sarežģītajās attiecībās ar Briesmoni un Bidzi Huligānu. Kas šim robotam būtu jāprot? Ja runājam par iešanu no skolas uz mājām, tad vispirms tam būtu jāprot iziet no skolas. Bet ko 24 nozīmē iziet no skolas? Pirmkārt, atvērt durvis. Tas ir, atrast durvju rokturi, nospiest to uz leju, pēc tam durvis pavilkt uz savu pusi, atvērt, cik vajag, pa izveidojušos spraugu izspiesties laukā un durvis aizvērt. Tas viss jādara, pastāvīgi kontrolējot savas darbības: vai rokturis pietiekami nospiests uz leju, vai durvis netiek vilktas par stipru, vai tās ir pietiekami atvērtas. Pie tam robotam ir jāzina, kas darāms dažādās avārijas situācijās.

— Kādas gan te var būt avārijas?!

— Tā dēvē novirzes no paredzētās notikumu gaitas. Piemēram, tās durvis ir aizslēgtas, un visus bērnus un robotus laiž ārā pa sāndurvīm, vai arī puikas ir noskrūvējuši durvju rokturi, vai arī tāda negaidīta situācija, kur durvis jau atvērtas vai pusatvērtas. Robota programmā visas šīs situācijas ir jāparedz. Un sīki jāizskaidro, kas katrā gadījumā darāms. Mēs runājam par durvju atvēršanu, bet tas vēl ir tikai pārsteigumiem un briesmām pilnā ceļa sākums. Un, visbeidzot, katra darbība, par kuru es runāju, arī ir jāsadala atsevišķās vienkāršākās darbībās, kuras gluži tāpat var nepavisam nebūt vienkāršas.

Nospiest?... Pacelt?... Nospiest?...
Nospiest?... Pacelt?... Nospiest?...

— Jā-ā... Kļūst skaidrs, kāpēc līdz šim vēl nav robotu, kas bērnu vietā ietu uz skolu. Žēl gan...

— Labi. Šodienai pietiks.

— Pietiks gan. Laba daudz nevajag.

4.

Vēl viens algoritms

Kad nākamajā dienā Maija un Pēcis atkal satikās, lai nodarbības turpinātu, Pēcis ierosināja:

— Šodien izpētīsim vēl vienu algoritmu.

— Paklau, vai algoritmu un vispārīgu spriedelējumu jau nebūs diezgan? Labāk pastāsti, kā jāstrādā ar ESM.

— Mmm... Es tomēr uzskatu, ka šo algoritmu vajag paskatīties. Tur ir kāda nianse. Manuprāt, ļoti svarīga. Es ātri.

— Nu labi...

Algoritms iesācējiem

— Tas ir algoritms mācībām vidusskolā. Protams, arī stipri vienkāršots. Skaidrs, ka vienpadsmit mācību gadu uz vienas papīra lapas pilnībā attēlot nevar.

— Nu, nu!

— Algoritma blokshēma ir šāda:

Ilustrācija

SKAITĪTĀJSTā svarīgā nianse šajā algoritmā ir klašu skaitītājs K. Pareizāk sakot, pabeigto klašu skaitītājs, tāpēc ka, skolu sākot, šim skaitītājam piešķir vērtību nulle, bet pēc katras klases beigšanas tā vērtību palielina par vienu.

— Bet ļoti dīvaini, ka tūlīt pēc tam, kad šim skaitītājam tika piešķirta vērtība nulle, tiek pārbaudīts, vai tā nav vienāda ar vienpadsmit. Kas te ko pārbaudīt?

— Pašā skolas sākumā tāda pārbaude patiešām ir lieka, kaut arī kļūdu tā nerada. Bet, ja tu blokshēmu izskatīsi līdz beigām, tad redzēsi, ka pēc katras klases beigšanas uz šo bloku vajag atgriezties un pārbaudīt, vai skaitītājs nav vienāds ar vienpadsmit, tas ir, vai tu jau neesi beigusi vidusskolu. Kāpēc gan veltīgi censties un iet uz skolu, ja tā jau ir pabeigta?!

... un skaitītājs katrreiz atķeksē
... un skaitītājs katrreiz atķeksē

Darbs ar klašu skaitītāju

— Jā, bet saki — vai tu neesi kļūdījies, uzrakstīdams tādu dīvainu vienādību K=K+1? Tā taču nekad nevar būt!

— Nevar gan. Bet K=K+1 šeit nenozīmē to, ka skaitlis K ir vienāds pats ar sevi plus viens. Šī izteiksme nozīmē sekojošo: lieluma K pašreizējai vērtībai pieskaitīt vienu vienību un rezultātu pasludināt par lieluma K jauno vērtību. Programmisti saka arī tā: lielumam K piešķirt tā vērtību, kas palielināta par vienu. Jeb pavisam īsi: K vērtību palielināt par vienu. Patiesībā zīme «=» šeit nozīmē nevis «vienāds», bet gan «piešķirt vērtību» jeb vienkārši «piešķirt». Programmēšanā tādas atšķirības no pierastā gadās bieži.

— Nekas, pieradīsim. Kā mēs varētu pārdomāt tavu jauno algoritmu? Protams, tas nav pilnīgs, kā arī tu pats atzini. Bet visvairāk man nepatīk tas, ka tu neesi paredzējis iespējamību no skolas aiziet pēc astotās klases beigšanas. Ļauj, es to pievienošu algoritmam, redzēsim, kas iznāks.

Maija uzlabo algoritmu

Es domāju, ka nosacījuma «Vai K=8?» pārbaude nepieciešama pirms pārbaudes «Vai K=11?». Tad, ja astoņas klases nav pabeigtas, nekas sevišķs nenotiek, ejam tālāk pārbaudīt nosacījumu «Vai K=11?». Bet ja astoņas klases jau ir pabeigtas?... Tad pārbaudām nosacījumu «Vai tu gribi mācīties PTV?». Ja gribi, tad, protams, ej un mācies, bet, ja ne... Tad zini ko?! Ej taisnā ceļā uz taisnstūrveida bloku «Nopietni mācīties vienu gadu», jo nav nekādas vajadzības atgriezties un pārbaudīt, vai K=11, ja nupat mēs šo K pārbaudījām un konstatējām, ka tas ir vienāds ar astoņi un nekādi nevar būt vienpadsmit.

— Starp citu, varētu arī pārbaudīt, nekādas kļūdas nebūtu, tikai lieks darbs. Bet, lūdzu, savus izdomājumus attēlo grafiski.

— No jauna es uzzīmēšu tikai nelielu blokshēmas daļu. Zaļā krāsā es zīmēju papildinājumus, bet melnā — to, kas bija jau iepriekš.

Ilustrācija

— Uzzīmēts ir lieliski, un sevišķi skaisti izceļas tie tavi zaļumi. Bet, lai cik žēl man arī būtu, tavā algoritmā ir drausmīga kļūda, kas to, par spīti daiļajam noformējumam, padara pilnīgi nederīgu.

Kļūda!

— Nav ko priecāties, ja arī būtu kļūda. Hm... es gan nekā kļūdaina neredzu.

— Bet tu paskaties šurp: tūlīt pēc tam, kad K vērtība palielināta, bultiņa no apakšas pienāk blokā ar pārbaudi «Vai K=11?». Tieši šī bultiņa veido ciklu, un tagad tev iznāk...

— Ā-ā-ā... Iznāk, ka pārbaude «Vai K=8?» paliek ārpus cikla un notiek tikai vienreiz mūžā, kad K=0 un cilvēks tikko ir uzsācis skolas gaitas. Rezultātā jaunā nosacījuma pievienošana faktiski neko nedod. Jā-ā-ā...

— Nekā briesmīga jau nav. Šī kļūda ir viegli izlabojama: bultiņa, kura ieiet blokā ar pārbaudi «Vai K=11?», jāpārceļ uz augšu, lai tā ieietu jaunajā blokā ar pārbaudi «Vai K=8?». Lūk, tā, kā es tagad izlabošu.

— Skaidrs. Tagad jau nu viss ir pareizi.

— Nekad nevar zināt, vai viss ir pareizi. Kļūdas gadās vienmēr un muļķīgas kļūdas arī. Bet varu tevi iepriecināt: programmisti to zina ļoti labi un par kļūdām nevienu nebar. Programmēt — tas nav tas pats, kas rakstīt kontroldarbu. Programmistam ir jāprot kļūdas meklēt, meklēšanai jāgatavojas un meklēšana jāmācās, cik nu var iemācīties. Galvenais — nevajag no sevis iedomāties diezin ko, bet vajag nopietni strādāt un censties, ne tā kā...

Nav viegli programmā «izķert» kļūdas
Nav viegli programmā «izķert» kļūdas

— Vai tev neliekas, ka baigi esi aizrāvies ar manis audzināšanu? Bet es tev varu atklāt, ka man ir pilns audzinātāju komplekts, pie tam nevis kaut kādi sliņķi un haltūristi, bet godīgi darba darītāji, kuri raujas melnās miesās un pie tam ar milzīgiem panākumiem.

Kaut arī Pēcim tā vis nelikās, strīdēties viņš nesāka, bet ierosināja vēlreiz kopumā izskatīt visu blokshēmu un tad beigt.

5.

Valodas, valodas, valodas…

Nākamajā reizē abi jaunie programmisti devās uz Skaitļošanas centru strādāt ar skaitļotāju, jo Maija bija paziņojusi, ka runāt pietiekot. Varot jau būt, ka sacerēt visvisādus algoritmus par nezināmo Pēcīti un dažādiem skolēniem ir diezgan amizanti, tomēr Beisikāns taču nesākšot noliegt, ka tādi algoritmi nevienam nav vajadzīgi un jau sen ir laiks uzsākt ko tādu, kas varētu būt noderīgs, kaut vai pavisam nedaudz.

Taču ceļā Pēcis vēl turpināja stāstīt par algoritmiem.

Pasaule sastāv no atomiem un algoritmiem

— Zini, Maija, pašus algoritmus tu, protams, vari aizmirst kaut vai šodien pat. Bet, lai strādātu ar ESM, manuprāt, vajag izjust algoritmizācijas garu. Saprast, ka mums visapkārt ir algoritmi, algoritmi un nekas cits kā tikai algoritmi. Sarežģīti un vienkārši, asprātīgi un dumji. Katru rītu, kā tikai pamosties, tu sāc izpildīt algoritmus — apģērbšanās algoritmu, gultas klāšanas algoritmu, mazgāšanās algoritmu, tējas vārīšanas algoritmu, iešanas algoritmu un tā tālāk, un tā joprojām. Vispār vienmēr, kad mēs kaut ko darām, mēs izpildām kaut kādu algoritmu.

Mūs vada mūsu algoritmi
Mūs vada mūsu algoritmi

— Ūja, vai nu gluži vienmēr? Varbūt esi dzirdējis par tādu dabas parādību kā mīlestība? Vai algoritmi tev ir arī gadījumam, ja nejauši būs jānodarbojas ar šādām problēmām?

— Nu, ar to «vienmēr» es drusciņ pārspīlēju. Tam vajadzēja būt skaidram. Bez tava piemēra varētu nosaukt vēl arī citus, kur algoritma nav. Teiksim, diezin vai varētu izgudrot domāšanas algoritmu.

— Bet runā taču par domājošajām mašīnām, par mākslīgo intelektu. Vai neesi lasījis?

— Ai, zini, man liekas, ka tā ir baigā čuguna liešana! Pārāk daudz par šiem jautājumiem es gan vēl nezinu, bet jau tagad man ir skaidrs: domāšanas nevienā mašīnā nav un intelekta arīdzan. Manuprāt, tie, kas runā par mākslīgo intelektu, šiem vārdiem piešķir citu jēgu nekā tu, un tad ar viņiem ir grūti saprasties. Kaut gan, iespējams, ir arī tādi, kas tamlīdzīgus vārdus izmanto vientiešu muļķošanai.

Brīdi padomājis, Pēcis turpināja:

— Ja ESM patiešām arī spēj darīt kaut ko saprātīgas būtnes cienīgu, tad tas ir nevis mākslīga, bet gan pavisam dabiska intelekta — programmista prāta — nopelns. Un vispirms tavam programmista intelektam ir jāparādās algoritma radīšanā. Vajag precīzi aprakstīt visu, kas jādara, — to es tev jau stāstīju.

— Diez kādas ticības tavam «dabiskajam programmista intelektam» man gan nav. Nu labi, pamocījies, pamocījies un radīji izcilo Pēcīša mājāsnākšanas algoritmu. Un kas par to? Kam šis algoritms ir vajadzīgs?

Precizitāte! Galvenais ir precizitāte!
Precizitāte! Galvenais ir precizitāte!

Vēl par algoritmiem

— Tiesa jau tiesa, jebkurš skolēns mājās nokļūs arī tad, ja precīzu algoritmu neviens viņam nebūs devis. Bet iedomājies: ja nu viņam vajag šķērsot ielu? Tad būs jāievēro pietiekami skaidri formulēts algoritms — satiksmes noteikumi. Tie gan nav nekādi sarežģītie. Sarkana gaisma — stāvi uz vietas! Zaļa — skrien, cik gribi! Bet neviens taču nepiedzimst, šo algoritmu jau zinādams. Tas ir jāapgūst, bet vieglāk ir apgūt to, kas ir skaidri un gaiši pateikts. Vai tad ne?

— Tas gan, bet nesaprotu, kādēļ tu te par visu to runā.

— Gribu pateikt, ka, pirmkārt, šo to skaidri un gaiši pateikt jeb algoritmizēt ir vērts pat tad, ja neviens šeit netaisās izmantot ESM. Otrkārt, pasaulē ir drausmīgi daudz līdzīgu algoritmu, un tikai tāpēc ESM vispār kaut kam der. Iedomājies, teiksim, algoritmu, pēc kura autovadītājs šķērso neregulējamu ielu krustojumu. Tuvojoties šim krustojumam, viņam jāpaskatās pa labi un pa kreisi, gluži kā Pēcītim, taču jāskatās nevis uz Briesmoni vai Bidzi Huligānu, bet gan uz mašīnām, kas piebrauc no kreisās un it sevišķi no labās puses, un jāuzzina šo mašīnu turpmākā rīcība — vai tās brauks pa labi, pa kreisi vai taisni.

— He hē! «Mašīnas brauc», «mašīnu turpmākā rīcība» — un to saka cilvēks, kurš pavisam nesen uzstājās ar lielu runu par to, ka mašīnas pašas neko nedara.

— Jā-ā-ā... Ko lai dara, esmu iekritis. Varu vienīgi 32 piebilst: ja mēs mēģinātu aprakstīt autovadītāja rīcības algoritmu, tad no šī viedokļa nepavisam nebūtu svarīgi, vai mašīnas pie krustojuma piebrauc pašas, vai arī tās vada cilvēki. Svarīgi būtu tas, ka kaut kas ar kaut kādu ātrumu pārvietojas krustojuma virzienā. Tas bija algoritms vadītājam. Ielu satiksmes automātiskās vadības sistēmai, protams, būtu cits algoritms: tai jāskaita, cik mašīnu stāv pie sarkanās gaismas, jāmēra, cik ilgi tās stāv, un atkarībā no šīs informācijas jāpārslēdz luksofora gaismas.

— Liekas pavisam vienkārši.

— Tur jau ir tā lieta, ka tikai liekas. Ja sāktu darīt, tad sarastos tik daudz vērā ņemamu sīkumu, ka uzreiz viss sajuktu. Kamēr neesi sācis darīt, vienmēr liekas, ka darbs būs viegls.

— Kā nu kuram. Man dažreiz grūtāk ir darbu iesākt, bet, kad sāku... Uzreiz viss kļūst viegli... Dīvaini gan sanāk: es visu mūžu esot izpildījusi daždažādus algoritmus. Man tas pat prātā nebija ienācis. Nemaz nevar noticēt. Tiesa, mazliet pārliecina tie piemēri ar skolnieces rīta algoritmiem, visādiem tējas vārīšanas un citiem... Bet tik un tā par pašu galveno tu vēl neko neesi teicis. Kā ESM strādā, kā tā saprot, ko vajag darīt?

— Nekā tā nesaprot! Es taču teicu, ka patiesībā tā nesaprot vairāk... kā televizors, kas rāda ļoti gudru raidījumu!

— Bet kā tomēr iespējams, ka izskatās, it kā mašīna saprastu?

— Ja runājam pavisam godīgi, jāatzīstas, ka līdz galam es to nezinu. Man to nemaz neskaidroja, teica, ka tad vajagot apgūt mašīnas komandas, bināro aritmētiku, matemātisko loģiku un vēl nezin ko. Apgūt to visu varot, tas gan esot diezgan sarežģīti, tomēr saprotami. Taču nemaz jau nav visā pilnībā jāzina, kā strādā motors, lai bez avārijām varētu braukt ar automobili. Tev varu izstāstīt tikai to, ko mums stāstīja Algoritms un ko es, šķiet, esmu sapratis. Algoritms apgalvoja, ka ar izstāstīto pietiekot, lai sastādītu tādas skaitļotāju programmas, kurām būtu jēga un no kurām būtu kaut kāds labums. Un izskatās, ka tiešām pietiek. Bet arī mani dažreiz nomoka ziņkārība: kas gan tur mašīnā iekšā notiek?

— Ko ar tevi lai dara, ja esi tāds neapmācīts. Un kas gan ir tas, ko tu tik lieliski esi apguvis?

Valodas, kurās programmisti runā ar skaitļotājiem

— Es runāju par algoritmiskajām jeb programmēšanas valodām. Jeb, precīzāk, par vienu no tām — par beisiku, kuru es zinu un kurā sastādu programmas, kaut arī ne pārāk lielas un svarīgas. Par šo valodu es tev drīz sākšu stāstīt.

Programmēšanas valoda ir kā buramvārdi
Programmēšanas valoda ir kā buramvārdi

— Skaidrs. Bet, lai viss izskatītos sistemātiski un zinātniski, pirms sāksi stāstīt par beisiku, kuru tu zini, vispirms parunāsi par valodām vispār — par afrikāņu un indiāņu valodām, par putnu, bišu, suņu un kaķu valodām, par puķu valodu jeb, īsi sakot, par visu to, ko tu galīgi nesajēdz.

— Tas nu gan ir nepelnīti. Ja kaut ko nezinu, es to godīgi arī pasaku. Vai tad tā nav?

— Neliela profilakse nekaitēs. Nav ko cemmēties, Beisikān.

— Bet par programmēšanas valodām vispār drusciņ vajadzētu parunāt. Citādi var gadīties, ka tu apgūsti beisiku un tev sāk likties, ka nu tu esi tik gudra, tik gudra kā pats... kā pats... skolas direktors.

— Labi, labi. Turpini vien tālāk.

— Patiesība ir tāda: ESM apstrādā informāciju — un tikai. Tas nozīmē, ka tajā tiek ievadīta un no tās arī izvadīta kaut kāda informācija. Citiem vārdiem sakot, mašīnā ievada kaut kādus simbolus, tas ir, ciparus vai burtus, un no tās arī saņem kaut kādus simbolus. Protams, ļoti vēlams, lai saņemtajiem simboliem būtu kāda jēga.

— Nezinu, kāpēc tevi visu laiku velk uz filozofiskām virsotnēm. Izskaidro dumiķītei vienkāršāk. Ar piemēriem, pavisam vienkāršiem piemēriem.

— Ar piemēriem? Zini ko, piemēru tev būs vesels maiss, kad mēs tiksim pie mašīnas. Bet pagaidām iztiec ar šādu piemēru. Vai vari iedomāties mašīnu, kura spēlē šahu?

— Varu.

Ievada un izvada informācija

IZVADINFORMĀCIJAIEVADINFORMĀCIJA— Nav pat svarīgi, šahu vai citu spēli. Vispirms mašīnā jāievada spēles sākumpozīcija. Mašīnai tā būs ievades informācija jeb ievaddati. Pēc tam, lai sanāktu spēle, mašīnā jāievada savs gājiens. Gājiens arī ir ievadinformācija. Līdzko mašīna ir saņēmusi pretspēlētāja gājienu, tai šī informācija jāapstrādā, protams, ņemot vērā spēles pašreizējo stāvokli. Šīs apstrādes rezultātā mašīna atrod savu gājienu, kas ir jāizvada, citādi pretspēlētājs to neuzzinās. Šis gājiens būs izvadinformācija jeb izvaddati. Par ievadāmo un izvadāmo informāciju tas nu būtu viss. Pats galvenais, kā tu pati saproti, notiek laikā starp ievadi un izvadi, kad saņemtā informācija tiek apstrādāta pēc attiecīgā algoritma. Patiesībā šis algoritms nosaka ne tikai to, kas ar mašīnā ievadīto informāciju notiks, bet arī to, kāda informācija vēl jāievada un kāda tiks izvadīta. Un visām šīm darbībām algoritmā jābūt precīzi aprakstītām. Pie tam tādā formā, kas ir piemērota darbam ar mašīnu. Un tā tad arī ir programma šai mašīnai.

— Beidzot esam tikuši līdz jēdzienam, kura dēļ viss sākās!

Programmistiem ir jāsastāda programmas

PROGRAMMĒŠANAS VALODASPROGRAMMA— Programma patiešām ir ļoti svarīga lieta. Bez tās elektroniskā skaitļošanas mašīna ir skapis ar degošām spuldzītēm. Daudzi pat uzskata, ka pareizi ir sacīt nevis «mašīna spēlē šahu» vai «mašīna apstrādā informāciju», bet gan «programma spēlē 35 šahu» vai «programma apstrādā informāciju». Viņiem varētu piekrist, jo patiešām programma ir tā, kas realizē šaha spēles algoritmu. Varētu piekrist, ja nezinātu, ka programma bez pašas mašīnas ir tikai nevajadzīgi ķeburi uz papīra. Tālāk, tev jāzina, ka programmas raksta programmēšanas valodās. Tā kā programma faktiski ir algoritma apraksts, tad šīs valodas vari saukt arī par algoritmiskajām valodām. Vēl var teikt, ka programma ir algoritms, kas uzrakstīts cilvēkam un mašīnai saprotamā formā.

Mašīna šahu nespēlē, šahu spēlē programma!
Mašīna šahu nespēlē, šahu spēlē programma!

— Haha! Re, ka atkal iekriti! Tu taču teici, ka mašīna nekā nesaprotot un tie, kas apgalvo, ka saprot, esot galīgi stulbeņi.

— Es, pieņemsim, teicu ne gluži tā, bet vispār teiktā jēgu tu esi sapratusi brīnišķīgi. Varbūt es pārteicos pedagoģiskos nolūkos, lai noskaidrotu, vai tu pamanīsi vai ne. Tagad pasaki šo teikumu pareizi.

— Programma ir algoritms, kas uzrakstīts formā, kura saprotama cilvēkam un... un...

— ...piemērota izpildei ar ESM. Tā varētu teikt. Bet tā nav definīcija, no galvas vari nemācīties, neviens tev to neatprasīs.

— Vai tiešām? Bet es jau biju sataisījusies iezubrīt visus tavus izteikumus.

— Tagad iznāk tā. Lai ar ESM risinātu kādu uzdevumu, vispirms mums jāizdomā algoritms. Pēc tam jāuzzīmē šī algoritma blokshēma, kā mēs to jau darījām, jāuzraksta programma un, visbeidzot, šī programma jāievada mašīnā. Ja gribi, tad uzskati, ka esmu izstāstījis superalgoritmu, tas ir, algoritmu, 36 pēc kura jārīkojas, uzdevumus risinot ar ESM. Šim algoritmam arī varētu uzzīmēt blokshēmu, kas, tiesa gan, būtu ļoti vienkārša. Vai skaidrs?

Ilustrācija
Ilustrācija

— Nu... Skaidrs.

Valodas kā sazināšanās līdzeklis

— Programmēšanas valodu ir ļoti daudz. Viena tipa uzdevumu risināšanai piemērotāka ir viena valoda, otra — cita. Tas ir gluži tāpat kā dzīvē. Mēs ar tevi tagad runājam vārdu valodā, bet mūziķi savā starpā sazinās nošu valodā, protams, ja runa ir par mūzikas gabalu atskaņošanu. Vari droši uzskatīt, ka komponists savu skaņdarbu izpildīšanas algoritmu raksta nošu zīmju valodā. Savukārt arī pati mūzika — es domāju nevis uzrakstīto, bet gan jau skanošo — ir valoda — skaņu valoda. Tiem, kuri to saprot, tā kaut ko taču izsaka.

— Tikai mūzika izsaka nevis ar vārdiem, bet gan ar «izteiksmes līdzekļiem».

— Jā, jā. Tagad iedomājies citu gadījumu. Autoinspekcija ceļa zīmju un luksofora signālu valodā programmē ielu satiksmi, jo gan ceļa zīmes, gan luksofora signāli nosaka autovadītāju darbības algoritmus konkrētajā situācijā. Bet vispār, ja mazliet padomā, kļūst skaidrs, ka gan komponists, gan autoinspekcija visu vajadzīgo principā varētu izteikt ar parastajiem latviešu valodas vārdiem. Notīm taču ir nosaukumi, un «ķieģeļa» vietā varētu pakārt uzrakstu «iebraukt aizliegts». Vai saproti, kādas grūtības tad rastos?

Beisiku saprot visi
Beisiku saprot visi

— Kas tur ko nesaprast! Sevišķi grūti būtu tiem, kas latviski nesaprot.

— Līdzīga situācija esot arī ar programmēšanas valodām. Katru no tām vai vismaz vairākumu var uzskatīt par universālām, un kaut kā noprogrammēt lielākās uzdevumu daļas izpildīšanu var katrā. Taču labi tas izdosies tikai ar kaut kādu uzdevumu klasi. Tā nu tas ir. Personiski es zinu tikai vienu programmēšanas valodu — beisiku. Šo valodu neuzskata par pašu labāko, varbūt tāpēc, ka tā ir vienkāršāka par citām. Neņemos spriest, vai tas ir liels trūkums, bet mans paziņa no fizmatiem Andris Fortranietis, kas programmē fortranā, uz manu noņemšanos raugās no augšas. Tiesa gan, par viņu pašu diezgan slikti atsaucas viņa lielīgais kursabiedrs Vilis Peello, kas strādā valodā PL-1. Varbūt tu arī ar šito publiku iepazīsties, viņi tepat pa centru klīst bieži.

6.

Sākas darbs

Nākamajā reizē Maija tūdaļ iekārtojās pie displeja un paziņoja, ka strādātāja būšot viņa, bet Pēcis varot novērot un tēlot gudrinieku.

— Labi, lai nu tā būtu. Bet man jāsaka, ka pagaidām nekas mašīnā notikt nevar. Sākumā vajag izsaukt beisika interpretatoru.

Visu dara interpretators

— Kas tas tāds? Par to nekādas runas nebija!

— Tā ir jau iepriekš sastādīta programma, kas glabājas uzrakstīta uz magnētiskā diska. Tās uzdevums ir apstrādāt beisika programmu — atšifrēt, kādas darbības šī programma uztic izpildīt mašīnai, un vēl vairāk — šīs darbības tiešām arī izpildīt. Vārdu sakot, interpretēt beisika programmu.

— Kā tā? Iznāk, ka viena programma apstrādā otru.

— Jā, tā iznāk. Beisika programma ir ievaddati interpretatoram.

Ilustrācija

— Un kā lai izsauc šo in-ter-pre-ta-to-ru? Liekas, tā tu teici?

— Jā. Izsaukt — tas nozīmē programmu no diska pārrakstīt operatīvajā atmiņā un iedarbināt. Programma var strādāt, tikai būdama operatīvajā atmiņā. Uz diska tā mierīgi «guļ» un nekā nedara. Bet izsaukšanai vajadzīga vēl cita programma ...

— Vai dieniņ! Cik tad to programmu te īsti ir?

— Neuztraucies! Pagaidām bija tikai divas. Bet vispār tādu apkalpojošo programmu ir daži desmiti — tā kādreiz teica Algoritms. Visas apkalpojošās programmas kopā veido tā saukto operacionālo sistēmu, par kuru es diemžēl zinu maz. Algoritms mums par to stāstīja ļoti īsi. Viņš jokoja: lai uzzinātu, kā darbojas operacionālā sistēma, ir jābeidz fizmati. Ceru, tu jau pati noproti, ka operacionālās sistēmas programmas nevar būt uzrakstītas beisikā, jo bez tām gluži vienkārši nav kas izsauc interpretatoru. Un arī pats interpretators acīmredzot ir uzrakstīts citā valodā.

— Bet kas tad galu galā darāms ar to tavu interpretatoru?

Interpretatora izsaukšana

KOMANDA— Vispirms pievērs uzmanību ekrāna pēdējai rindiņai. Tur redzi zīmi «lielāks» un blakus tai — kursoru. Kā jau es tev kādreiz teicu, tas nozīmē, ka pašlaik operacionālā sistēma gaida komandu. Ja tu gribi izsaukt beisika interpretatoru, tad jāievada izsaukšanas komanda. Tā ir ļoti vienkārša — BAS. Trīs latīņu alfabēta burti. Vari ievadīt.

>BAS

Viss ir kārtībā. Tagad atrodi ievades taustiņu un nospied.

Un Maija nospieda taustiņu. Uzreiz visas ekrāna rindiņas pavirzījās uz augšu, arī Maijas ievadītā rindiņa — un apakšā parādījās teksts

IAS/RSX BASIC V02-01M

READY

— «Redī», — izlasīja Maija, — gatavs.

— Taisnība gan. Interpretators ir gatavs darbam. Bet iepriekšējā rindiņa nozīmē, ka strādā tieši beisika interpretators.

— Paklau, vai tad arī turpmāk mašīna izskaidrosies tikai angliski? Mani senči, gods kam gods, centās, cik vien varēja, un kādu laiku mani vadāja pie vienas «anglietes» spīdzināšanai, bet es gan nevaru teikt, ka mūsu abu mocības būtu devušas kādus augļus.

— Tev dzīvē veicas. Ko lai dara tie, kas skolā mācās vācu valodu un pie tam ne sevišķi labi? Bet nomierinies. Mācoties beisiku, angļu valoda vajadzīga ļoti maz. Ar tavām zināšanām pilnīgi pietiks, ja jau tu zini, ka «redī» nozīmē «gatavs».

— Interpretators ir gatavs darbam. Tad nav ko daudz pļāpāt. Ko tagad var izdarīt?

Interpretatoru iedarbina komanda BAS
Interpretatoru iedarbina komanda BAS

Darbs tiešajā režīmā

— Tagad ar interpretatoru var strādāt tiešajā režīmā, tas ir, tāpat kā ar mikrokalkulatoru: viss, ko tu interpretatoram uzdosi, tiks izpildīts uzreiz.

— Piemēram?

— Piemēram, tu vari izveidot mainīgo A un tam piešķirt vērtību, teiksim, 12. Tas nozīmē: jāievada A=12.

A=12

READY

— Un tālāk? Pagaidām nekas nav noticis.

— Tagad ievadi B=20.

— Atkal nekas nenotika!

Ilustrācija

— Nekam arī nebija jānotiek. Saproti, tu tikai nodibināji divus mainīgos un tiem piešķīri vērtības. Tagad tu ar šo mainīgo vērtībām, tas ir, ar skaitļiem 12 un 20, vari izdarīt, piemēram, jebkuru aritmētisku darbību. Saki — ko tu gribētu?

— Es gribētu izdarīt visu — gan saskaitīt, gan atņemt, gan sareizināt un izdalīt, ja nu tāda brīnišķīga iespēja ir radusies.

— Tad vari darīt tā. Ievadi C=A+B. Tas nozīmē, ka interpretatoram ir jānodibina mainīgais C un tam jāpiešķir vērtība, kas vienāda ar mainīgo A un B vērtību summu.

— Darīts! Nekas nav noticis. Rezultāta nav.

Darba rezultāti vienmēr ir jāizvada!

— Rezultāts jau ir, bet, lai to uzzinātu, to vajag izvadīt uz ekrāna. Tādēļ ir izvades operators PRINT. Uzraksti šo vārdu un pēc tam — visu to mainīgo sarakstu, kuru vērtības gribi izvadīt, katru atsevišķo mainīgo šajā sarakstā atdalot ar komatu. Ak, jā! «Print», ja tu nezini, nozīmē drukāt. Nu, izvadi A, B un C vērtības!

— Labi.

Tagad Maija uz ekrāna redzēja

Ilustrācija
PRINT A,B,C
 12            20            32

— Jā, beigu beigās tomēr iznāca!

— Ļoti ērti ir tas, ka pēc PRINT nav obligāti jāraksta tikai mainīgie — var rakstīt to summu A+B vai reizinājumu A*B — zīme «*» šeit nozīmē reizināšanu —, vai arī to dalījumu A/B, kur daļsvītra «/» nozīmē dalīšanu. Labi iegaumē šos beisika apzīmējumus aritmētiskajām darbībām. Rakstīt drīkst tikai šādi.

— Bet tu nekā neesi teicis par atņemšanu.

— Atņemšanu — kā vienmēr — apzīmē ar mīnuszīmi. Tātad operatoram PRINT drīkst sekot jebkura aritmētiska darbība. Un tagad klausies uzmanīgi! Ne tikai aritmētiska darbība, bet arī jebkura aritmētiska izteiksme, lai no nezin cik aritmētiskajām darbībām tā arī sastāvētu, piemēram, (A*B+C)/C*20+30. Svarīgi ir tas, lai šīs aritmētiskās izteiksmes garums nepārsniegtu vienas ekrāna rindas garumu. Vai tu zini, cik simbolu satur viena rinda?

— No kurienes es to varētu zināt?

— Intereses pēc varēji saskaitīt. Bet varu arī pateikt. Pavisam rindā ir 80 simbolu. Nu, ievadi kādu aritmētisku izteiksmi!

— Labi, ievadīšu.

PRINT 24/A*2
 4

Hē! Mašīna nemaz nemāk rēķināt. Rezultātam jābūt nevis 4, bet 1.

— Nevar būt! Skaidrs. Es tev nepateicu, kā beisikā tiek lietotas iekavas. Ja saucējā ir reizinājums, tad tas obligāti jāliek iekavās. Ja šo iekavu nebūs, tad interpretators izdalīs tikai ar pirmo reizinātāju, bet ar nākamajiem reizinātājiem sareizinās iegūto rezultātu. Ja tu, teiksim, uzrakstīsi 6/2*3, tad seši tiks izdalīts ar divi, dabūjot trīs, un, to pareizinot ar trīs, rezultāts būs deviņi. Ja rakstīsi 6/(2*3) vai 6/2/3, dabūsi vienu. Tāpēc šo piemēru atkārto.

PRINT 24/(A*2)
 1

READY

— Tagad ir pareizi.

— Pareizi bija arī iepriekšējā reizē: mašīna taču izpildīja to, ko tu tai biji uzdevusi. Tas, ka tu biji uzdevusi nepareizi, ir tikai tava vaina ... Vēl varu pateikt, ka beisikā ir speciāla zīme kāpināšanai — «↑». Tastatūrā tā atrodas šeit, pa kreisi, uz tā paša taustiņa, kur krievu burts «Ч».

— Tas jāizmēģina.

PRINT 2^2
 4

Interesanti, bet vai tā kaut kas sanāks?

PRINT A^A
 8.91610E+12

Beisikān! Kas tās par dumjībām?

Skaitļa divas formas beisikā

— Kas tad? Ā-ā! Rezultāts ir izvadīts eksponenciālajā formā.

— Atkal jauns termins!

EKSPONENCIĀLĀ FORMA— Ko lai dara! Tu labāk uzmanīgi klausies un visu pako tik savās smadzenēs. Starp citu, nekā sarežģīta te nav. Tādās reizēs Algoritms saka: tas ir tik vienkārši kā programmēšana beisikā. Lai saprastu, kāds skaitlis ir izvadīts, lieto šādu algoritmu. Piemēram, mašīna tev ir izvadījusi skaitli eksponenciālajā formā: —1.23000E+07. Lai šo skaitli pārvērstu parastajā formā, vispirms izvadītajā skaitlī ir jāatrod burts E un jāuzraksta simboli, kas no burta E ir pa kreisi, —1.23000. Tie dos tā saukto skaitļa mantisu. Simboli no burta E pa labi, tas ir, +07, dos tā saukto skaitļa kārtu. Vēl kāds sīkums. Beisikā, pierakstot skaitļus ar decimāldaļām, komata vietā ir punkts. Komatu lieto, lai skaitli atdalītu no skaitļa. Tagad skaitļa mantisa jāreizina ar desmit pakāpē skaitļa kārta —1,23 · 107. Un dabūsi skaitli parastajā pierakstā —-12300000. Vēl varu piebilst, ka skaitļa kārtas zīme tiks izvadīta vienmēr, bet paša skaitļa zīmi jeb, kas ir tas pats, mantisas zīmi interpretators izvada tikai negatīviem skaitļiem.

Un tagad pārbīdīsim punktu ...
Un tagad pārbīdīsim punktu ...

— Paklausies, Beisikān! Kārtīgs pedagogs no tevis neiznāks. Kā var tik ilgi tarkšķēt par tik vienkāršām lietām!

— Bet tu šīs vienkāršās lietas pamēģini izklāstīt algoritmiski. Mājasdarbā uzzīmē blokshēmu algoritmam44, pēc kura skaitlis no eksponenciālās formas tiek pārvērsts parastajā, tad zināsi, vai no manis iznāks pedagogs vai ne.

— Tu gan esi atriebīgs tips! Skolā mājasdarbi, mājās mājasdarbi un arī šeit mājasdarbi. Tā jau cilvēks var nobeigties, neuzzinājis, kas ir programmēšana.

Cik ir divpadsmit divpadsmitajā pakāpē!

— Nekas, nekas. Mājasdarbi ir ļoti svētīga lieta. Bet tagad uzraksti, kāds skaitlis pēdējoreiz tika izvadīts uz ekrāna.

— Lūdzu! 8916100000000.

— Pareizi. Es ceru, tu nedomā, ka šis skaitlis ir precīzi divpadsmit divpadsmitajā pakāpē. Mašīna darbības izpilda ar sešu zīmju precizitāti un arī izvada tās pašas sešas zīmes. Nulles šeit patiesībā nav nulles, bet gan nezināmi cipari.

Ilustrācija

— Gudrs jau nu tu esi, Beisikān, bet tik un tā iekriti. Pirmā nulle no kreisās puses ir īsta nulle, jo tā bija skaitlī, kuru mašīna izvadīja. Neīstās nulles ir tikai tās septiņas nulles, kuras es pierakstīju klāt.

— Taisnība gan. Tā nulle ir krietni īstāka par citām. Bet pilnīgi garantēt, ka pareizajā rezultātā šajā vietā arī būs nulle, nevar, jo, visu laiku darbojoties ar sešām zīmēm, pēdējā iznāk neprecīza.

Vēl tev varu pateikt, ka eksponenciālajā formā skaitļus var arī ievadīt. Tad starp punktu un burtu E nav obligāti jābūt pieciem cipariem — var būt arī mazāk — un pirms punkta arī nav obligāti jābūt tieši vienam ciparam. Tu, piemēram, vari ievadīt A=—12.3E+Ø4.

Bet tagad vari paspēlēties ar mašīnu, izdarīt kaut kādus aprēķinus tiešajā režīmā. Piemēram, citu pēc citas aprēķini divnieka pakāpes un paskaties, kad interpretators rezultātus sāks izvadīt nevis parastajā, bet gan eksponenciālajā formā.

— To jau es zinu. Tad, kad rezultātam būs vairāk nekā sešas zīmes.

— Tad pamēģini kaut ko citu. Vairāk es tev šodien neko nestāstīšu, jo mūsu laiks drīz beigsies un pie mašīnas nāks strādāt citi.

7.

Maijas pirmā programma

Nākamajā reizē Maija un Pēcis pie mašīnas devās ar stingru apņemšanos programmēt. Maija bija pieprasījusi izbeigt tukšās runas un sākt darboties.

— Runas nemaz nav tik tukšas, kā tev liekas. Tu tikai, tāpat kā visi mazi bērni, slikti saproti, kas tev ir labi un kas slikti.

— Izbeidz, vectētiņ, pļāpāt un labāk stāsti, kas vēl vajadzīgs, lai sāktu programmēt.

Programmas ķieģelītis — operators

OPERATORS— Vajadzīgs pavisam nedaudz. Vispirms iegaumē, ka programmēšanas valodas veido operatori. Katrs operators ir komanda, ar ko mašīnai pavēl kaut ko konkrētu izdarīt. Operatori programmēšanas valodām ir pamatsastāvdaļa — gluži tāpat kā vārdi latviešu valodai. Tikai operatoru ir daudz mazāk nekā vārdu. Progammēšanas pamatu veido četri operatori. Pagājušajā reizē tu iepazinies ar diviem no tiem; arī vārdu «operators» mēs jau lietojām. Palikuši vairs tikai divi pamatoperatori.

Operatori ir jāklausa
Operatori ir jāklausa

— Tos divus es gan pagājušoreiz kaut kā nepamanīju. Varbūt viens bija PRINT?

PIEŠĶIRE— Jā, viens no tiem bija izvades operators PRINT. Bet otrs bija piešķires operators. Ievadīdama rindiņu A=12, tu patiesībā ievadīji piešķires operatoru — mašīnai pavēlēji piešķirt mainīgajam A vērtību 12. Var teikt, ka piešķires operators tiek apzīmēts ar vienlīdzības zīmi «=», no kuras pa kreisi raksta to mainīgo, kuram jāpiešķir vērtība, bet pa labi pašu vērtību — vai nu kā skaitli, vai arī kā aritmētisku izteiksmi, kura jāaprēķina. Vai atceries, mēs runājām par aritmētiskajām izteiksmēm izvades operatorā PRINT. Pilnīgi to pašu var teikt par izteiksmēm, kas piešķires operatorā drīkst atrasties pa labi no vienlīdzības zīmes.

Viss par mainīgajiem

MAINĪGAISLaikam vajadzētu pateikt, kas tas mainīgais vispār tāds ir, bet tas man būs par grūtu. Nu ... tas ir kaut kas tāds, kas atrodas mašīnā, kam ir sava vērtība un kas var piedalīties kaut kādās darbībās, kurās tam var mainīties vērtība — un tikpat labi arī nemainīties. Un vēl mainīgajam vienmēr ir apzīmējums. Teiksim, pēdējā piemērā mainīgajam apzīmējums ir burts «A», bet vērtība — skaitlis 12.

Ilustrācija

— To es nesaprotu. Tev iznāk apmēram tā: mainīgajam A apzīmējums ir burts «A». Tā jau ir kaut kāda bezjēdzība.

— Bet vai to tu saproti, ka skolniecei Saprātiņai uzvārds ir «Saprātiņa»?

— To es saprotu.

— Nu tā. Skaidrs taču, ka skolniece nav tas pats, kas viņas uzvārds. Un, tāpat kā skolniecei ir uzvārds, mainīgajam ir apzīmējums. Atšķirība starp skolnieci un mainīgo, protams, ir — kaut vai tāda, ka Saprātiņa eksistē neatkarīgi no tā, kā viņu sauc un vai vispār viņu kaut kā sauc, bet mainīgie mašīnā sāk eksistēt tikai tajā brīdī, kad tos kaut kā nosauc, kad tie pirmo reizi parādās piešķires operatorā no vienādības zīmes pa kreisi. Iztēlojies, ka interpretators katram mainīgajam mašīnas atmiņā atvēl vietu, kur glabāt tā vērtību, vai — vēl vienkāršāk — katrs mainīgais ir kastīte, uz kuras uzrakstīts apzīmējums un kurā glabājas tā vērtība. Un, kad vērtība mainīgajam47 tiek piešķirta pirmoreiz, tad interpretators izveido tādu kastīti ar visu nosaukumu un vērtību.

Ilustrācija

Nekas briesmīgs nenotiek, ja programmists kļūdās un, piemēram, kādā aritmētiskajā izteiksmē izmanto mainīgo, kuram vērtība vēl nemaz nav piešķirta. Interpretators pieņem, ka tā ir nulle.

Beisiku var tulkot latviski

Tagad mūsu slaveno piešķires operatoru A=12 no beisika pārtulkosim latviski. Iznāks apmēram tā:

A=12Beisikā
Mainīgajam ar apzīmējumu «A»piešķirt vērtībudivpadsmitLatviski

Parasti gan programmisti saka nevis «mainīgais ar apzīmējumu «A»», bet gluži vienkārši «mainīgais A».

Ko vēl? Vēl varu pastāstīt, kā mainīgos apzīmē. Tos apzīmē ar jebkuru latīņu burtu un ciparu — divām zīmēm — vai arī tikai ar burtu. Tādi ir spēles noteikumi beisikā. Ja saskaita visas iespējas, tad iznāk, ka vispār var būt 286 dažādi mainīgo apzīmējumi.

— Vai nebūs par maz?

— Tev pietiks. Tagad pārtulkosim latviski šādu izvades operatoru:

PRINTA, B, CBeisikā
Izvadītmainīgo A, B un C vērtībasLatviski
Ilustrācija

— Šis tulkojums gan ir ļoti vienkāršs.

— Kāds nu ir, tāds ir. Vēl varu pateikt, ka ar izvades operatoru PRINT iespējams izvadīt ne tikai skaitļus, bet arī citas zīmes, piemēram, burtus. Var izvadīt jebkuru tekstu. Dara šādi: pēc vārda PRINT raksta vajadzīgo tekstu pēdiņās vai apostrofos. Nu, raksti. Ai, pagaidi, mēs taču neesam izsaukuši beisika interpretatoru! Tā, viss kārtībā. Interpretators ir gatavs lieliem darbiem.

— Ko gan lai izvadu?...

PRINT "SVEIKS"
SVEIKS

— Ceru, tu saproti, ka šādi, tiešajā režīmā, tekstu uz ekrāna izvadīt nav nekādas jēgas, — tu varēji uzrakstīt vārdu SVEIKS, un tev tas uz ekrāna arī būtu. Parasti tekstu uz ekrāna izvada, ja programmas darba gaitā vajag kaut ko paziņot par darba rezultātiem.

— Interesanti gan, kā es to varu saprast, ja tu vēl ne vārda neesi teicis par programmām!

Programmas veidošana

PROGRAMMAS RINDA— Jau saku. Rakstīdama operatorus ar rindu numuriem sākumā, tu iegūsi programmu. Ja operatoru ievadi bez numura sākumā, tad šis operators tiek izpildīts uzreiz — tas ir tiešais režīms, kuru tu jau zini. Bet, ja operatoru ievadi ar rindas numuru priekšā, tad interpretators šo operatoru iegaumē un no visiem šiem numurētajiem operatoriem atmiņā izveido programmu. Atceries — atmiņā! Bieži vien to nesaprot.

— Vajadzētu pamēģināt ... Saki, lūdzu: vai par numuru var būt jebkurš skaitlis?

— Jebkurš naturāls skaitlis, bet tikai mazāks par 215—1=32767. Pirms sāc ievadīt programmu, tā ir kaut kā jānosauc un nosaukums jāpaziņo interpretatoram — ar vārdu NEW.

— Cerams, ka «ņū» angliski nozīmē «jauns»?

— Jā. Ievadi vārdu NEW un programmas nosaukumu. Uz priekšu!

NEW SUPER

— Vai tā būs labi?

— Pa pirmo! Jā, starp citu, programmas nosaukumā nedrīkst būt vairāk par deviņiem burtiem un cipariem, bet pirmais simbols obligāti ir burts.

— Paklau, bet vai NEW ir jauns operators?

PAVĒLE— Ne gluži. NEW ir nevis operators, bet gan beisika pavēle. Pavēles atšķirībā no operatora nodarbojas ar pašām programmām un ir izpildāmas tikai tiešajā režīmā. Bet operatori programmās strādā ar ievaddatiem un mainīgo vērtībām.

Labi. Programma nu ir nosaukta, vari sākt to ievadīt. Vispirms uzraksti rindas numuru ...

1 A_

Bet kāpēc tu sāc ar vieninieku?!

— Kā tad citādāk! Viens, divi, trīs ... Tā arī numurēšu.

Kā numurē rindas!

— Redzi, tā var gan, bet tā nedara. Programmisti rēķinās ar to, ka vēlāk programmu vajadzēs pārveidot un turklāt ne vienu reizi vien — kaut kas būs kļūdains, kaut kas tiks izdomāts no jauna. Un tad var izrādīties, ka vajag iespiest vēl vienu rindu, piemēram, starp rindām ar numuriem 3 un 4. Bet to tu nevarēsi, jo ar daļskaitļiem numurēt nevar! Tāpēc 50parasti rindas numurē nevis pēc kārtas, bet ar kaut kādu soli, piemēram, 10, 20, 30 un tā tālāk. Programmas izpildīšanai ir tāds likums — operatorus izpilda rindu numuru augšanas kārtībā, ja nav īpaši norādīts, kura rinda ir jāizpilda nākamā. Ja ir rindas ar numuriem 10 un 20, bet nav ar numuriem no 11 līdz 19, tad nekāda brēka netiek sacelta, un, ja tev vēlāk rodas vēlēšanās, piemēram, izveidot rindu ar numuru 15, tu to vienmēr vari izdarīt, gluži vienkārši ievadot rindu ar šo numuru. Ir pilnīgi vienalga, kādā numuru kārtībā programma tiek ievadīta.

Ilustrācija

— Varu arī ievadīt tā, kā tu saki. Bet ko lai daru ar šo rindiņu, kuru es sāku rakstīt?

— Šo rindu var anulēt. Es to izdarīšu tavā vietā.

— Labi, sākšu ar numuru 10.

10 A=12
20B=20

Ai, pēc numura 20 es aizmirsu atstarpi! Vai rindu atkal vajag anulēt?

— Vispār nebija nekādas runas par to, ka pēc rindas numura būtu vajadzīga atstarpe.

— Man liekas, ka tā tur iederētos.

— Vari neuztraukties, atstarpi pēc rindas numura interpretators ieliks pats. Vēl vairāk, tu vari jebkurā vietā likt atstarpes un vari nelikt, liekās interpretators tik un tā izmetīs un vajadzīgās saliks. Turpini vien tālāk.

30 C=A+B
40 PRINT A,B,C

— Tas arī ir viss.

— Vēl būtu vēlams pievienot operatoru END. Ko tas nozīmē angliski?

— «End» nozīmē «beigas» vai «beigt».

— Jā, END programmā norāda, ka vairāk operatoru tajā nav, jeb, kā saka programmisti, operators END norāda programmas fiziskās beigas. Programmai vēl ir arī loģiskās beigas51 — tad, kad programma ar operatora STOP palīdzību tiek apturēta. Tātad nu tev būs vēl divi operatori. Bet tie nav pamatoperatori, tāpēc nedomā, ka esi jau iemācījusies programmēt.

Programmu aptur operators STOP
Programmu aptur operators STOP
50 END

— Vai operators END ir jāievada šādi?

— Tieši tā. Šajā gadījumā programmas loģiskās beigas sakritīs ar fiziskajām un interpretators apstāsies.

Ievades pārbaude ...

— Tagad programma ir ievadīta. Kaut arī uz ekrāna tu redzi visas rindas, kuras esi ievadījusi, tomēr vēl viena pārbaude nenāks par ļaunu. Ir iespējams apskatīt visu programmu, kas atrodas atmiņā, ar pavēles LIST palīdzību. «List»

LIST

SUPER     21-NOV-86   14:35:20

10 A=12
20 B=20
30 C=A+B
40 PRINT A,B,C
50 END

angliski nozīmē «sastādīt sarakstu», bet tas ir pēc vārdnīcas, pie mums tas nozīmē «parādīt programmu». Tā ir otra beisika pavēle, ko tu uzzini. Pavēle tāpēc, ka darbojas ar pašu programmu.

— Jā, tev ir taisnība. Tagad pēc numura 20 jau ir atstarpe.

— Tā tam arī jābūt. Vēl, kā tu redzi, pirms programmas teksta ir izvadīta rinda ar programmas nosaukumu, šodienas datumu un pulksteņlaiku. Lai šī rinda neparādītos, izmanto pavēli LISTNH.

... un programmas palaišana

Ja viss ir labi, programmu vajag palaist. Tas izdarāms ar pavēli RUN.

Visi pie darba!
Visi pie darba!

— Hā! Angliski «ran» taču nozīmē «skriet»!

— Ne tikai skriet, bet arī darboties — tā var teikt par mašīnām un programmām. Ievadām šo pavēli.

RUN

SUPER     21-NOV-86   14:46:30

 12            20            32

READY

Kā redzi, viss ir kārtībā. Sākumā interpretators izvada programmas nosaukumu, pēc tam — pašas programmas darba rezultātus. Ja programmas nosaukumu tev nevajag, tā izvadi var atslēgt, izmantojot pavēles RUN variantu RUNNH. Pašlaik programma savu darbu ir beigusi: tu redzi interpretatora ziņojumu READY, bet mainīgo vērtības vēl arvien atrodas mašīnas atmiņā katra savā kastītē, un interpretators tiek tām klāt. Tās var pārbaudīt un pat pārveidot, izmantojot tiešā režīma iespējas.

— Interesanti, kādas gan iespējas es varētu izmantot?

— Piemēram, izvadīt A un C vērtību reizinājumu.

— Ar operatoru PRINT?

— Pats par sevi saprotams.

PRINT A*C
 384

— Tā, ļauj padomāt. Rezultāts ir pareizs.

— Par to nešaubies.

— Klusu! Man ir ideja.

A=10

READY
PRINT A,C
 10            32

Es domāju, ka varbūt, mainot A vērtību, mainīsies arī C vērtība. C taču ir A un B summa.

— Nu nē! Lai dabūtu jaunu summu, vajag no jauna palaist programmu un pie tam ar jauno mainīgā A vērtību. Bet, tā kā šim mainīgajam vērtība tiek piešķirta rindā ar numuru 10, tad šī rinda ir jāpārveido. Rindas pārveidošana ir ārkārtīgi vienkārša: ar to pašu numuru jāievada jaunā, vajadzīgā rinda.

10 A=10

Un tagad programmu var palaist. Izmanto pavēli RUNNH.

RUNNH
 10            20            30

READY

— Nav jau diez ko ērti te tā mainīt, ja kaut kas ir jāaprēķina ar citādiem skaitļiem.

Ievade programmas darba gaitā

IEVADES OPERATORS— Protams. Ja beisika programma būs jālaiž vairākkārt, katru reizi ar citādiem skaitļiem, tad vajag lietot ievades operatoru INPUT. Tas ir jauns — trešais — pamatoperators.

— «Input», «input» ... Ko tas latviski varētu nozīmēt?

— Tas nozīmē «ievade» vai «ievadīt», varbūt vēl «ielikt». Katrreiz, kad interpretators programmā sastop ievades operatoru INPUT, tas mašīnai liek gaidīt55 ievadi no displeja, un, lai tu zinātu, ka tā jau kaut ko gaida, uz ekrāna tiek izvadīta jautājumzīme. Bet tas, kas tai jāgaida, kura mainīgā vērtība šajā brīdī ir jāievada, programmistam ir jāuzraksta tūlīt pēc vārda INPUT. Ja tādi mainīgie tev ir vairāki, tad tie cits no cita jāatdala ar komatu. Arī rindu ar INPUT no beisika var pārtulkot latviešu valodā.

Datus no ekrāna saņem INPUT
Datus no ekrāna saņem INPUT
INPUTA, BBeisikā
Sagaidīt no displejamainīgo A un B vērtību ievadiLatviski

IEVADEIEVADSIegaumē atšķirību starp vārdiem «ievade» un «ievads»! Ievade ir tas, ko tu izdari, kad nospied taustiņu; ievads ir tā informācija, kas nokļūst atmiņā. Ievade ir process, kura rezultāts ir ievads. Gluži tāpat ir ar vārdiem «izvade» un «izvads».

— Manā programmā šim ievades operatoram acīmredzot ir jābūt desmitajā rindā. Es it kā mainīgā A vērtības piešķires operatora vietā ielieku ievades operatoru ... Vai ne?

— Mainīgā A vērtības piešķiršana tev notiek pirmajā, nevis desmitajā rindā. Tev programmā vispār nav desmit rindu.

— Nu labi, rindā ar numuru desmit. Vai tu gribi, lai es tā saku?

— Jā, domāju, ka tā būs pareizāk; vēl var teikt — rindā 10. Bet vispār tev ir taisnība, šajā rindā var ielikt ievades operatoru.

10 INPUT A

Tagad palaid programmu.

RUNNH
?_

Redzi nu. Jautājumzīme ir — mašīna stāv un gaida A vērtību. Vari ievadīt vajadzīgo vērtību.

?500
 500           20            520

READY

— Skaidrs. Tagad šo programmu, protams, var laist daudz reižu, bet man ar nožēlu jāatzīst, ka tās intelektuālais līmenis varētu būt augstāks. Diez vai šī programma tautsaimniecībā varēs būt noderīga.

Programmas pārrakstīšana no atmiņas uz diska

— Nekas, nekas. Tev viss vēl priekšā. Bet tagad, kamēr mūsu laiks vēl nav beidzies, es tev gribu pastāstīt, kā programma glabāšanai tiek izvadīta uz diska.

— To gan vajag. Šai vēsturiskajai programmai ir jāglabājas mūžīgi.

— Tik ātri jau tas neizdosies. Vispirms uz diska ir jāatrod brīva vieta, kur programmu ierakstīt.

FAILSUn tagad iegaumē jaunu vārdu: tā vieta uz diska, kurai ir nosaukums un kura ir atvēlēta, lai kaut ko glabātu — kaut vai programmu —, ir fails. Atklāti sakot, es ne uzreiz sapratu, kas ir fails, un varbūt tu arī šo jēdzienu apradīsi tikai vēlāk, kad dabūsi ar šiem failiem pastrādāt, bet īstenība ir tāda: ja gribi programmēt, tad centies apjēgt, kas ir fails. Bet pati programma uz diska tiek saglabāta ar pavēli SAVE.

— «Seiv» — tas, manuprāt, ir «glābt». Kas tad te ir glābjams?

FAILA APRAKSTS— «Glābt», pie mums «uzglabāt», bet galu galā arī «glābt» nemaz nav tik slikti — paglābt no izzušanas. Pēc SAVE ir jānāk faila aprakstam, citiem vārdiem sakot, ziņām par to: kā apzīmēsi failu, kurā rakstīsi programmu, un kurā vietā šis fails ir jāizveido. Ar apzīmējumu ir vienkārši. Ar vietu, kur fails 57ar programmu glabāsies, ir grūtāk, šeit ir jāzina, kā šīs vietas pieņemts apzīmēt operacionālajā sistēmā. Nu, bet šodien, lai noglabātu šo programmu uz diska, tev pietiks ar pašu vienkāršāko faila aprakstu, kas ir šāds:

Programmu uz diska noglabā SAVE
Programmu uz diska noglabā SAVE
Ilustrācija

Vispirms jāuzrāda tās iekārtas kods, kur fails tiks izveidots. Kods vienmēr sastāv no diviem burtiem, un, ja iekārta ir disks, tad šie burti būs DK. Seko iekārtas numurs, jo vajag pilnīgi vienādas iekārtas atšķirt citu no citas. Pēc iekārtas numura jāliek kols. Un, visbeidzot, kolam seko faila apzīmējums, kas var saturēt līdz deviņām zīmēm, no kurām pirmā zīme, protams, ir burts.

— Uh, cik sarežģīti!

— Nepavisam. Tas ir tikpat vienkārši kā programmēt beisikā! Vai gribi, es tev parādīšu dažus piemēriņus?

Vai sekojošie failu apraksti ir pareizi?

DK0:C

— It kā būtu pareizs.

— Kā tad! Ņem vērā, ka iekārtas numuru Ø var arī nerakstīt.

DK3:ZET

— Pareizs.

— Vispār jā, bet tikai tad, ja mašīnai ir četri diski: nulltais, pirmais, otrais un trešais.

LP:

— Jā, nu man gan nav ko teikt. Ko tas varētu nozīmēt?

— Nav arī nekāds brīnums, jo es tev neko neesmu teicis par tādu iekārtas kodu. To, ka tas ir iekārtas kods, tu varēji arī iedomāties, jo te ir divi burti un beigās kols. Vārdu sakot, tas ir drukas iekārtas kods.

Programmas pārrakstīšana no atmiņas uz papīra

Ilustrācija

Pavēlē SAVE tas tiek uzrādīts faila apraksta vietā, ja programmu vajag saglabāt uz papīra, tas ir, nodrukāt. Jāuzrāda tikai drukas iekārtas kods un nekas vairāk. Pamēģini, nodrukā savu programmu.

SAVE LP:

— Tas acīmredzot ir viss. Es sapratu, ka vairāk nekas nav jāraksta.

— Skaidrs, ka ne. Rakstot uz diska, vajadzētu uzrādīt arī faila apzīmējumu, lai mašīna citreiz šo failu varētu atrast. Bet uz drukas iekārtas nekas tāds nebūs jādara un to arī nevar izdarīt, jo uzdrukāto programmu tu aiznesīsi prom. Varu vēl piebilst, ka pavēle SAVE LP: ir ļoti līdzīga pavēlei LIST, tikai viena programmu izvada uz ekrāna, turpretī otra — uz drukas iekārtas.

— Viss! Nospiežu ievades taustiņu.

10 INPUT A
20 B=20
30 C=A+B
40 PRINT A,B,C
50 END

Vai, cik smuki uzdrukāja!

— Vari to saglabāt piemiņai. Mazbērniem parādīsi, ar kādām mašīnām esi jaunībā strādājusi. Bet tagad savu programmu uzraksti uz diska, un skrienam mājās, ir jau vēls. LP: vietā norādi iekārtu un faila apzīmējumu.

— Bet diska numurs? Vai var kuru katru uzrādīt?

— Nē, nē! Jāuzrāda tikai tas, uz kura tev atļauj rakstīt un ir brīva vieta. Šoreiz gan nekādu problēmu nav, tāpēc ka uz disku iekārtas Nr. 1 ir uzlikts man piešķirtais disks, uz kura brīvas vietas vēl ir daudz. Tā ka vari rakstīt uz mana diska.

SAVE DK1:_

— Bet tagad — faila apzīmējums. Kādam tam jābūt?

— Kā — kādam?! Kādu gribi, tādu liec! Un pacenties to neaizmirst, lai nākamreiz, kad ievajadzēsies, varētu savu programmu atrast.

— Un kā es to varēšu atrast?

— Par to parunāšu tad, kad būs jāmeklē. Tagad izdomā faila apzīmējumu.

SAVE DK1:PIRMFAIL

— Failu ar manu pirmo programmu loģiski būtu apzīmēt kā PIRMFAIL.

— Normāli. Nospied ievades taustiņu, un tava programma tiks uzrakstīta uz diska. Un tagad iemācies vēl vienu pavēli — BYE — «bai», kas latviski nozīmē «atā». Beidzot darbu, šī pavēle katrreiz ir jādod, lai beisika interpretators mašīnas vadību nodotu atpakaļ operacionālajai sistēmai.

Ej atpūties!
Ej atpūties!
8.

Neliels labums no programmēšanas

60— Nu, Maija. Pagaidām tu zini tikai dažus operatorus, tomēr ar tiem pietiek, lai uzrakstītu kaut kam derīgu programmu. Protams, nekāds lielais šis derīgums nebūs, bet viss jāsāk ar mazumiņu. Vai tu esi lasījusi kaut ko no Džeka Londona?

— Es? Jā... bet kāpēc tu to gribi zināt?

— Pašlaik es viņu lasu, visvisādus stāstus par piedzīvojumiem Aļaskā, un gaisa temperatūra tur vienmēr dota Fārenheita grādos. Es zinu, ka šos grādus pārvērst par Celsija grādiem nav sarežģīti, bet nekādi nevaru iegaumēt vajadzīgās skaitliskās konstantes. Uzraksti nelielu programmu, kas noderētu tādiem kā es. Algoritms kādreiz smējās, ka visās programmēšanas grāmatiņās esot šī grādu pārvēršanas programma.

— Vienmēr laipni. Bet kas šai programmai ir jādara?

Fārenheita un Celsija grādi

— Pēc tam kad tā temperatūru ar ievades operatoru palīdzību ir saņēmusi Fārenheita grādos, uz ekrāna jāizvada temperatūras vērtība Celsija grādos. Formulu, pēc kuras no Fārenheita grādiem F var pāriet uz Celsija grādiem C, es tev norakstīju no grāmatas.

C = 59 (F - 32)

— Ļauj padomāt. Manuprāt, tā būs ļoti vienkārša programma. Es to tūdaļ ievadīšu.

— Nesteidzies. Vispirms izdomā nosaukumu un paziņo interpretatoram, ka vēlies ievadīt jaunu programmu.

— Labi, šo programmu es nosaukšu CELS.

NEW CELS

READY
10 INPUT F
20 C=(5/9)*(F-32)
30 PRINT C
40 END

Tas ir viss. Vai varu to palaist?

— Laid vien.

RUNNH
?

— Ievadi -50. Vai zini, kāpēc šī vērtība mani interesē? Džeks Londons raksta, ka pie šīs temperatūras spļāviens sasalstot, sniegu nesasniedzis.

— Brrr. Tev gan ir intereses!

? -50
-45.5556

READY

— Skaidrs. Es gan domāju, ka temperatūra būs zemāka. Kas attiecas uz programmu, tā, protams, strādā, tomēr par pirmklasīgu nosaukt to nevar, drīzāk jau par pirmklasniecisku.

— Ko?! Kas tev vēl ir vajadzīgs?!

— Mieru, tikai mieru. Ja paskatās uz programmas tekstu, tad nav gluži skaidrs, ko tā dara...

— Bet vai tad tu nezini?!

Programmai ir jābūt saprotamai!

— Zinu gan, bet saproti jel, ka programmas gandrīz vienmēr sastāda tādēļ, lai tās varētu lietot arī citi, bet, ja kāds paskatīsies uz šādu programmu, tad nekā nesapratīs. Protams, tu te vari sēdēt un visiem skaidrot, ko katrs burts nozīmē, 62bet ilgi tu to neizturēsi. Arī tu pati, taisīdama programmas tikai sev, jau pēc pāris mēnešiem būsi aizmirsusi, kas tām bija jādara. Tāda esot visas programmēšanas vēstures rūgtā pieredze... Un kā ir tad, kad programma strādā? Vai tu esi droša, ka spēsi paturēt prātā visas jautājumzīmes, kas parādās uz ekrāna? Ja viena vai divas, tad nekas; bet ja tavā programmā būs paredzēta daudzu skaitļu ievade? Ko tad? Ar savām jautājumzīmēm sajauksi galvu jebkuram lietotājam. Tāpēc pierodi lietotājam ērtības sagādāt jau no mazām dienām.

— Es tevi nesaprotu! Tu taču pats teici, ka bez jautājumzīmēm nebūšot saprotams, ka ir vajadzīga ievade, bet tagad par tām ņirdz un par mani arī. Neko citu taču nevar izdarīt. Vismaz tu man neko citu neesi skaidrojis.

— Ja tu proti tekstu izvadīt ar operatora PRINT palīdzību, tad nekā cita tev nevajag. Sākumā uz ekrāna izvadi kaut ko tamlīdzīgu: programma, kas Fārenheita grādus pārvērš par Celsija grādiem. Pēc tam lietotājam pasaki, ka jāievada Fārenheita grādi. Bet, izvadīdama rezultātus, izvadi arī tekstu, kurā būtu pateikts, kas tas ir par skaitli, — nu, norādīts, ka tie ir Celsija grādi.

Priekšāteikšana ir obligāta
Priekšāteikšana ir obligāta

— Jā-ā-ā... Tā jau darba būs divreiz vairāk.

— Varbūt pat trīsreiz. Bet saki, lūdzu, — kam tev programmēšana, ja vieglas dzīves tīkojas?

— Uh, kašķis! Nomocīšos gan es ar tevi.

Maija patielējās, patielējās, bet beigu beigās tomēr izdarīja tā, kā Pēcis teica. Pārāk ātri tas negāja: 63bija gan jāpadomā, gan arī šādas tādas kļūdas jāizlabo, jo reizi pa reizei ne tas taustiņš nospiedās, kuru vajadzēja. Bet, kad viss beidzot bija kārtībā, Maija ievadīja pavēli LISTNH un uz ekrāna parādījās programma

5 PRINT "PROGRAMMA PAHRVEIDO FAHRENHEITA
  GRAHDUS"
6 PRINT " PAR CELSIJA GRAHDIEM"
7 PRINT " IEVADIET TEMPERATUHRU"
8 PRINT " FAHRENHEITA GRAHDOS"
10 INPUT F
20 C=(5/9)*(F-32)
25 PRINT "TAS BUHS"
30 PRINT C
35 PRINT "CELSIJA GRAHDI"
40 END

— Nu paskaties, mocītāj, uz šo programmēšanas šedevru!

— Kolosāli! Bet jāpaskatās, kā tas strādā. Palaid, lai pārveido tos pašus -50 Fārenheita grādus.

RUNNH

PROGRAMMA PAHRVEIDO FAHRENHEITA GRAHDUS
 PAR CELSIJA GRAHDIEM
 IEVADIET TEMPERATUHRU
 FAHRENHEITA GRAHDOS
? -50
TAS BUHS  -45.5556 CELSIJA GRAHDI
-45.5556
CELSIJA GRAHDI

READY

Ahā, sanāk tāpat! Tātad tu vismaz neko neesi sabojājusi. Nu, vai tagad nav glītāk?

Maija uzlabo izvadi

— Ir. Bet varēja būt pavisam skaisti. Man nepatīk, ka starp ziņojumu par programmas darbu un lūgumu ievadīt temperatūru nav nekāda intervāla. Es gribētu, lai tur būtu tukša rindiņa — tie tomēr ir dažādi ziņojumi. Bet to, jādomā, nevar izdarīt.

— Kāpēc gan ne! Tu vari ielikt PRINT bez nekā, un tev izvadīs tukšu rindiņu!

— Skaidrs... Bet pagaidi. Starp rindām ar numuriem 6 un 7 es taču neko nevaru iespiest! Ko lai dara? Vai lai visu ievadu no jauna ar citiem numuriem?

PĀRNUMURĒŠANA— Protams, ne! Tādos gadījumos izmanto pavēli RESEQ — «risēk» — tas laikam ir saīsinājums no angļu vārda resequence, kam, manuprāt, jānozīmē «sakārtot no jauna». Vārdnīcā tādu vārdu man neizdevās atrast. Un tātad šī pavēle liek pārnumurēt visas rindas, sākot ar pirmo — 10, 20, 30, 40 un tā tālāk.

— Interesanti būtu izmēģināt.

RESEQ

READY
LISTNH
10 PRINT "PROGRAMMA PAHRVEIDO FAHRENHEITA
  GRAHDUS"
20 PRINT " PAR CELSIJA GRAHDIEM"
30 PRINT " IEVADIET TEMPERATUHRU"
40 PRINT " FAHRENHEITA GRAHDOS"
50 INPUT F
60 C=(5/9)*(F-32)
70 PRINT "TAS BUHS"
80 PRINT C
90 PRINT "CELSIJA GRAHDI"
100 END

— Jā, šis tas no taviem solījumiem piepildās. Vēl man nepatīk, ka rezultāts tika izvadīts veselās trijās rindās. Es gribētu, lai man iznāk skaists izvads vienā rindiņā: TAS BUHS -45.5556 CELSIJA GRAHDI. Vai tas ir iespējams?

65— Protams, ir. Pirmkārt, ar vienu un to pašu operatoru tu vari izvadīt gan simbolus, gan skaitļus, tā ka droši varēji rakstīt PRINT «TAS BUHS», C.

— Skaidrs. Un pēc komata — «CELSIJA GRAHDI».

IZVADA ZONA— Nesteidzies. Ja pēc izvades operatora PRINT ir izvadvienību saraksts, kur šīs vienības, tāpat kā šajā piemērā, ir atdalītas ar komatiem, tad iznāks tā: ekrāna rinda tiks sadalīta zonās pa četrpadsmit zīmēm katrā. Un katrā zonā parādīsies viena izvadvienība. Vai arī vairākās zonās — ja vienā nesaies. Es ceru, tu saproti, ka mainīgo skaitliskās vērtības jeb skaitļi vienmēr ietilps vienā zonā...

— Ceri vien, ceri.

— Izvadāmie simboli zonā tiks izvietoti no kreisās puses, un, tā kā to būs mazāk par 14, tad zonas labā puse paliks tukša. Ja atceries, tad tavas pirmās programmas izvadā starp A, B un C vērtībām bija atstāta diezgan liela atstarpe.

— Jā! Tā tiešām bija, es vēl pabrīnījos, bet jautāt neko nejautāju.

— Atdalot ar komatiem, tev iznāks ļoti daudz tukšas vietas starp skaitli -45.5556 un tekstu CELSIJA GRAHDI. No tā viegli izvairīties: izvadvienības cita no citas jāatdala nevis ar komatu, bet ar semikolu, un tad attiecīgo mainīgo vērtības tiek izvadītas cieši cita pēc citas.

— Tad es to pašu izvadīšu vēlreiz, tikai šīs, kā tu saki, izvadvienības atdalīšu ar semikoliem, nevis ar komatiem!

— Gluži to pašu izvadīt nevajag. Ņem vērā, ka mašīna atstarpes starp izvadvienībām neliks, tev pašai tās ir jāparedz un jāieprogrammē. Tātad, lai būtu skaisti, pēc TAS BUHS jāparedz viena atstarpe. Tāpat arī pirms CELSIJA GRAHDI.

— Drausmīga sīkumainība, bet es, liekas, sapratu un varu pamēģināt.

70 PRINT "TAS BUHS ";C;" CELSIJA GRAHDI"

Vai programmu var palaist?

— Nē, nevar. Kaut gan... laid vien, redzēsim, kas iznāks.

RUNNH
PROGRAMMA PAHRVEIDO FAHRENHEITA GRAHDUS
 PAR CELSIJA GRAHDIEM
 IEVADIET TEMPERATUHRU
 FAHRENHEITA GRAHDOS
? -50
TAS BUHS
-45.5556
CELSIJA GRAHDI

READY

— Tā kā par daudz izvadīja...

Atkal kļūda!

— Iznāca tā, kā vajadzēja, kā bija paredzēts programmā. Tu visu izvadi pārnesi uz rindu 70, bet nākamās rindas ar numuriem 80 un 90, kurās arī paredzēta izvade, atstāji, kā ir, un tās tika izpildītas. Vari tās apskatīties ar pavēļu LIST un LISTNH palīdzību. Starp citu, šīs pavēles paredz šādu iespēju: ja pavēlei seko rindas numurs, tad tiks parādīta tikai šī rinda, ja divi numuri no — līdz ar domuzīmi vidū, tad parādīsies visas rindas ar numuriem šajās robežās. Tā, piemēram, LIST 7Ø parādīs rindu 70, LIST 7Ø—9Ø — rindas ar numuriem starp 70 un 90. Es domāju, ka tieši šī pavēle tev tagad jāievada.

— Lūdzu!

LISTNH 70-90

70 PRINT "TAS BUHS ";C;" CELSIJA GRAHDI"
80 PRINT C
90 PRINT "CELSIJA GRAHDI"

— Paskaties uzmanīgi! Izvades operators rindā ar numuru 70 izvadīs visu, kas tev vajadzīgs. Bet 67rindas 80 un 90? Tās ir gluži liekas un tāpēc jānodzēš. Ak, jā! Es taču vēl neesmu teicis, kā to dara. Uzraksti rindas numuru un nospied ievades taustiņu — rinda ar šo numuru tiks nodzēsta. Pacenties nekļūdīties, citādi var tikt nodzēsta vajadzīgā rinda, varbūt pat tava vismīļākā.

— Labi, es to darīšu ār-kār-tī-gi uzmanīgi.

80
90

Viss kārtībā. Es laižu.

Programmisti un kļūdas

— Atkal tu steidzies! Pasēdi, padomā, varbūt vēl atradīsi kaut ko labojamu vai uzlabojamu. Kāda jēga laist kļūdainu programmu?! Protams, par kļūdām tevi neviens nebārs. Programmēšanā kļūdas ir neizbēgamas, un neviens tev nevaicās, cik bija kļūdu. Galvenais, ka tikai programma strādātu. Un, ja strādā, tad viss ir kārtībā.

Domāšana ir vislabākās zāles pret kļūdām programmās
Domāšana ir vislabākās zāles pret kļūdām programmās

— Par programmistu attieksmi pret kļūdām neņemos spriest. Bet kāpēc lai nepalaižu programmu, ja tā jau ir gatava? Ja strādās pareizi — labi. Ja nepareizi, tad arī sākšu domāt, kas par vainu. Nepareiza programma mašīnu taču nesabojās!

— Protams, ne. Bet runa nav par to. Svarīgi ir tas, cik tu laika iztērēsi — gan sava, gan mašīnas 68laika. Varu atklāt noslēpumu — arī mašīnlaiks ir nauda. Bet, ja nauda tevi neinteresē, tad vēl paliek problēmas sportiskā puse: kurš labāks programmists, tas ātrāk strādā — ātrāk izlabo savas kļūdas.

— Pietiek pļāpāt! Tad jau redzēs.

RUNNH

PROGRAMMA PAHRVEIDO FAHRENHEITA GRAHDUS
 PAR CELSIJA GRAHDIEM
 IEVADIET TEMPERATUHRU
 FAHRENHEITA GRAHDOS
? -50
TAS BUHS -45.5556 CELSIJA GRAHDI

— Tev laimējās. Viss iznāca tā, kā tu gribēji.

— Tā ir nevis laime, bet gan augsta meistarība.

— Kā tad citādi! Bet tagad mums jābeidz darbs un tātad šī programma jānoglabā uz diska.

— Vai, piedod! Esmu pilnīgi aizmirsusi, kā to dara.

— Neuztraucies! Sākumā viss aizmirstas. Vēlāk, kad būsi pieradusi, lieliski atcerēsies gan beisiku, gan operacionālo sistēmu, gan arī citu skaitļošanas mašīnu īpatnības, ja ar tām nāksies iepazīties. Bet, lai noglabātu programmu, dod komandu SAVE, pēc kuras nāk faila apraksts jeb, citiem vārdiem sakot, iekārtas kods un faila apzīmējums.

— Jaunu apzīmējumu man negribas domāt. Failu apzīmēšu šādi:

SAVE DK1:CELS

— Viss ir pareizi. Nospied ievades taustiņu, un programma tiks uzrakstīta uz pirmā diska.

9.

Pats grūtākais operators

69Nākamās nodarbības sākumā Pēcis bija noskaņots diezgan augstprātīgi.

— Nu, ko tev, Saprātiņa, lai saku? Programma, kuru tu pagājušoreiz ar tādām mokām sastādīji, protams, ir nāvīgi triviāla. Un tomēr tā drusku jau ir līdzīga īstai programmai. Tai, piemēram, ir gabals... ko es saku, gabaliņš!... kur notiek datu ievade, tāds pats mazs, mazs izvades gabaliņš un vēl mazāks gabaliņš, kas ievaddatus pārstrādā par izvaddatiem.

— Esmu līdz sirds dziļumiem sašutusi. Ko tu no manis galu galā gribi!

— Mieru, tikai mieru. To es saku tāpat, lai tu nedomātu, ka visu jau esi apguvusi. Bez tam es gribēju arī uzsvērt, ka jebkurai programmai ir šīs trīs sastāvdaļas, kuras var attēlot tādā kā blokshēmā:

Ilustrācija
Ilustrācija

— Nu, vai zini...

— Zinu, zinu, bet labāk izsauc savu programmu, un to mazliet uzlabosim, lai tā pārstāj būt tik taisna kā miets un lai tajā parādās kaut kāda loģika.

— Atkal! Izsaukt programmas no diska es taču nemāku!

— Tūlīt, tūlīt. Tās izsauc ar pavēli OLD. Ko «ould» latviski nozīmē?

— Vecs.

— Bet pēc OLD apraksti to failu, kurā programma glabājas. Tieši tāpat kā pagājušoreiz, kad programmu noglabāji, izmantodama pavēli SAVE.

OLD DK1:CELS

READY

70READY ir, tātad viss kārtībā. Tagad programmu pārveidosim tā, lai Celsija grādos tiktu pārvērsta viena Fārenheita grādu vērtība, tad otra un tā tālāk, cik vien vajag.

— Kā lai to izdara?

— Var rīkoties dažādi. Es ieteiktu šādu variantu. Pēc tam kad viena vērtība ir pārvērsta, programma lietotājam jautā: «Vai jūs gribat turpināt darbu?» Un gaida skaitļa ievadi. Ja lietotājs ievada nulli, tas nozīmē, ka darbs tiek pārtraukts, bet, ja citu skaitli, tad darbs tiek turpināts.

Kā lai izvada jautājumu par darba turpināšanu — tam tev jau jābūt skaidram: izmantojot operatoru PRINT. Tāpat ir skaidrs, kā ievada skaitli, kas būs beigu pazīme, — ar operatora INPUT palīdzību. Šis skaitlis būs kaut kā jāapzīmē, piemēram, ar Z.

Tagad — sazarošanās operators

Diemžēl, lai uzzinātu, vai skaitlis ir vai nav nulle, ar vecajiem operatoriem nepietiek: tam nepieciešams jauns operators — nosacītās pārejas jeb sazarošanās operators IF... THEN. Vai zini, ko tas nozīmē?

— «If» nozīmē «ja», bet «zen»... Varbūt «tad»?

— Jā, tā šie vārdi tiek tulkoti. Bet pašu nosacītās pārejas operatoru jeb, kā to dažkārt īsuma labad sauc, operatoru IF būs grūtāk saprast nekā iepriekšējos. Tāpēc aizturi elpu, kamēr nebūšu beidzis. Vispirms raksta IF, pēc tam loģisko nosacījumu, piemēram, mūsu gadījumā tā būs izteiksme Z=Ø, pēc tam THEN, bet pēc tam tās rindas numuru, no kuras darbs jāsāk, ja — un šis «ja» ir ļoti svarīgs — loģiskais nosacījums ir patiess, tas ir, Z tiešām ir vienāds ar nulli. Bet, ja nav, — tad darbs tiek turpināts tālāk, izpildot nākamo operatoru. Skaties:

Ilustrācija

71Es pats arī ne jau uzreiz aptvēru, kas ir loģiskais nosacījums, jo dažkārt tas izskatās gluži pēc piešķires operatora. Atšķirība ir tāda, ka šeit, izpildot operatoru, mainīgā Z vērtība nekļūs vienāda ar nulli, bet paliks tāda pati, kāda bijusi, — divi, desmit, un galu galā tikpat labi tā varēja būt arī nulle.

Ilustrācija

Uzrakstīsim, kā šo operatoru varētu pārtulkot latviski.

IFZ=ØTHEN6ØØBeisikā
Jamainīgā Z vērtība ir vienāda ar nullitadjāpāriet uz rindu ar numuru 600Latviski

Re, kas sanāk: zīme «=» piešķires operatorā nozīmēja «tiek piešķirta vērtība», bet operatora IF loģiskajā nosacījumā tā tiek lasīta kā «vienāds», tāpat kā aritmētikā.

Protams, ir arī citas iespējas, kā operatorā IF salīdzināt divus skaitļus. Var sastādīt beisika un latviešu valodas vārdnīciņu par loģiskajiem nosacījumiem, kurus drīkst izmantot nosacītās pārejas operatorā. Nekādi citi tur nevar būt.

BeisikāLatviski
=vienāds
<mazāks
>lielāks
<=mazāks vai vienāds
>=lielāks vai vienāds
<>nav vienāds

72Tā, sazarošanās operatoru «ja A mazāks par B, tad ej uz rindu 600» var un vajag rakstīt šādi: IF A<B THEN 6ØØ. Dažkārt operatoru IF sauc arī par salīdzināšanas operatoru.

Maija veido dialogu ar mašīnu

— Labi, sāksim tavas gudrības pārbaudīt praksē! Jaunievedums būs jāliek... tur, kur bija iznīcinātā rinda ar numuru 80. Interesanti, cik rindas būs jāpieliek?... Šķiet, ka ne pārāk daudz, — numurēšu tās ar soli 5. Vispirms jautājums par darba turpināšanu.

80 PRINT "JA BEIDZAT, IEVADIET 0"

Vai tavs lietotājs šo teikumu sapratīs?

— Kas to lai zina? Varēji uzrakstīt arī vairāk kaut ko tādu, ka var ievadīt jebkuru citu skaitli, ja vien ir vēlēšanās turpināt. Vispār Algoritms mums mācīja, ka, gudrojot paskaidrojumus, svarīgi ir atrast zelta vidusceļu, citādi, ja izvadīsi maz, lietotājs nesapratīs, bet, ja izvadīsi daudz, ekrāns būs pilns ar tekstu un cilvēkam tavos prātojumos būs grūti orientēties.

Pie kā noved liekvārdība programmas izvadā
Pie kā noved liekvārdība programmas izvadā

— Tagad paredzam skaitļa Z ievadi. Tas ir vienkārši.

85 INPUT Z

73Un nu — slavenais nosacītās pārejas operators. Ļauj padomāt. Kad būs uzrakstīts «ja Z=0, tad ej uz..», nebūs zināms, uz kurieni jāiet... bet tas jau arī nav svarīgi, jo tā, vienalga, nav pareizi. Jāpāriet tieši tad, kad Z nav vienāds ar nulli! Un tas jāraksta šādi:

90 IF Z<>0 THEN 30

— Tā. Tas nu ir gatavs. Vēl palūgsim izvadīt tīru rindu.

25 PRINT

— Izskatās gluži labi. Vēl tikai pēc nosacītās pārejas ieliec operatoru STOP. Tas te gan ir vajadzīgs tikai kārtības labad, jo interpretators, sasniedzis programmas pēdējo rindu, darbu tik un tā beigs.

95 STOP

Tagad es programmu pārnumurēšu.

RESEQ

READY
Ilustrācija

Pēc tam, pirms programmu laidīšu, es to pārbaudīšu. Bet visu skatīties man nevajag. Pietiks, ja pārbaudīšu beigas, kur sākas grozījumi, tas ir, no astoņdesmitās rindas, piedod, no rindas ar numuru astoņdesmit. Tā kā klāt ir nākusi rinda 25, tad, programmu pārnumurējot, rinda ar numuru 80 kļūs par rindu ar numuru 90.

LISTNH 90-200
90 PRINT "JA BEIDZAT, IEVADIET 0"
100 INPUT Z
110 IF Z<>0 THEN 40
120 STOP
130 END

READY

Pārnumurēšanas īpatnības

Paraugies, lūk, šeit! Šausmas! Rindā 110! Kad es to ievadīju, tad pēc THEN rakstīju 30, un to vēl var redzēt uz ekrāna. Taču pēc pārnumurēšanas šo 30 mašīna ir pārtaisījusi par 40. Kas te notiks, ja mašīna visu bojā?!

— Tā nemaz nav bojāšana. Tu taču pati teici, ka rindas 25 iespiešana visu pārbīdīs. Pēc pārnumurēšanas rinda ar numuru 30 kļuvusi par rindu ar numuru 40, un tātad tagad jāpāriet tieši uz rindu ar numuru 40. Tāpēc arī interpretators pēc THEN mainīja numuru.

— Baigi gudri gan izdomāts!

— Kā tad savādāk! Kurš, it īpaši lielā programmā, varētu pats atrast un izlabot visus nosacītās pārejas operatorus!

— Citādi izskatās tā nekas. Es laižu!

RUNNH

PROGRAMMA PAHRVEIDO FAHRENHEITA GRAHDUS
 PAR CELSIJA GRAHDIEM

 IEVADIET TEMPERATUHRU
 FAHRENHEITA GRAHDOS
? -50
TAS BUHS -45.5556 CELSIJA GRAHDI
JA BEIDZAT,IEVADIET 0
? 0_

75Tagad darbu beigsim.

STOP AT LINE 120

READY

— Paskaties: ja mašīnu apstādina operators STOP, tad interpretators par to ziņo un parāda, kādā numura rindā tas ir noticis. Protams, angliski. Bet vispār ar šo programmu strādāt beidzam, vari to noglabāt uz diska.

SAVE DK1:CELS

— Būtu interesanti uzzināt, vai ar to pašu faila apzīmējumu programmu diskā var ierakstīt otrreiz.

— Kā tad, ka var!

— Bet vai iepriekšējais fails ar tādu pašu apzīmējumu tiks aizmirsts?

— Tu gribēji teikt — nodzēsts, nevis aizmirsts. Nē, tas netiks nodzēsts. Tu pat varētu tikt pie tā klāt, ja labāk zinātu operacionālo sistēmu. Pavēle OLD izsauks tikai pēdējo variantu.

— Man jau arī tikai šis pēdējais variants būs vajadzīgs, es tāpat vien pavaicāju. Tad nu ievadu šo te rindu.

Ko Maija jau prot!

— Kārtībā. Tagad mēs šo tavu pēdējo programmu varētu pārdomāt. Vai tev tagad būtu grūti uzrakstīt tādu programmu, kas darītu otrādi — Celsija grādus pārvērstu Fārenheita grādos?

— Nemaz. Tur, kur rakstīts FAHRENHEITA, es ieliktu CELSIJA, bet CELSIJA vietā rakstītu FAHRENHEITA.

— Diemžēl pašu galveno tu nepateici. Jāpārveido arī formula, kas aprēķina mainīgā C vērtību.

— Ak, jā! Tādas formulas gan vēl nav, bet es domāju, ka to nebūs grūti iegūt no iepriekšējās.

76— Protams, ne. Tā būs šāda:

F = 95 C + 32

Bet tam nav nozīmes, jo mēs to pašlaik nemaz netaisāmies programmēt. Saki — vai tu tagad varētu sastādīt programmu, kas, piemēram, kilometrus pārvērstu centimetros?

— Kāda gan var būt runa, profesor! Es pat zinu formulu, kas šeit jāizmanto. Ja vēlies, es varētu uztaisīt programmu, kas centimetrus pārvērstu kilometros vai pat collas — centimetros!

— Lieliski! Bet sekundes — gados?

— Jūs mani apvainojat, biedri profesor!

Ilustrācija

— Tātad iznāk, ka mūsu programma ir ļoti viegli pārtaisāma par tādu, kas vienas mērvienības pārvērstu citās neatkarīgi no tā, par kādām mērvienībām ir runa.

— Diezin vai tam ir nozīme, ka mēs vienas mērvienības pārvēršam citās...

— Lūk! Tieši to es arī gribēju dzirdēt. Svarīgi ir tas, ka aprēķins notiek pēc kaut kādas formulas, vienalga, pēc kādas. Tā var būt ātruma aprēķināšana pēc dotā attāluma un laika, tā var būt algas aprēķināšana pēc izstrādāto normu skaita un izcenojuma; tā var būt kuba tilpuma aprēķināšana pēc vienas malas vai cilindra tilpuma aprēķināšana pēc rādiusa un augstuma.

— Tikpat labi tā varētu būt arī laukuma aprēķināšana.

— Cits piemērs. Ar lielām mokām tu esi atrisinājusi vienu matemātikas uzdevumu. Piemēram, tādu: no punkta A uz punktu B ar ātrumu v1 brauc vilciens, tam pretī ar ātrumu v2 brauc otrs vilciens. Pēc cik ilga laika tie saskriesies, ja attālums starp punktiem A un B ir m kilometru.

— Labāk būtu automašīnas — tās var pabraukt viena otrai garām.

— Tas ir pilnīgi vienalga. Ja vēlies, tad lai tās būtu vardes. Svarīgi ir tas, ka abas drāžas viena otrai pretī. Ja tu šādu uzdevumu esi atrisinājusi, tad vari noprogrammēt satikšanās laika formulu

T = mv1+v2

77un, ievadījusi ātrumus v1, v2 un attālumu m, dabūsi satikšanās laiku. Un tā ir ar jebkuru līdzīgu formulu. Un ar nelīdzīgu arī. Galvenais, lai būtu formula.

— Tomēr ir arī atšķirības. Mūsu pirmajā programmā bija jāievada tikai viens skaitlis — Fārenheita grādi. Bet, lai rēķinātu pēc tavas vilcienu satikšanās formulas, vajag ievadīt trīs skaitļus.

— Jā, tāda atšķirība ir. Bet, vienalga, tagad mēs varam sastādīt programmu jebkurai pasaules formulai.

Saproti jel — blokshēmas šīm programmām būs vienādas, bet programmas darīs kaut ko it kā pavisam atšķirīgu.

— Kāpēc tad «it kā»?

— Tāpēc, ka tās atšķirības rodas tikai tad, kad tu nāc un sāc iedziļināties lietas būtībā: kas pēc šīs formulas tiek rēķināts? ko ievada? ko izvada? Kad tu gribi saprast, kāda tam visam ir jēga. Mašīna nevar ne gribēt, ne saprast, tā tikai dara to, kas tai ir uzdots, — aprēķina pēc attiecīgās formulas. Un tad arī starp formulām nav lielas atšķirības. Vai saprati?

— Ne visai. Bet gan jau. Līdz nākamajai reizei sapratīšu. Tagad tik un tā jādodas projām, jo šitie jaunatnācēji, kas grib tikt pie mašīnas, man jau pūš pakausī.

10.

Maija par programmēšanu jau zina visu

Jautri svilpodama, Maija pienāca pie mašīnas. Pēcis viņu jau gaidīja.

— Nokavējies. Bet pa šo laiku te bija Algoritms. Apjautājās, kā iet, es pastāstīju, un tad viņš izteicās, ka tava apmācība ir beigusies.

Nevarētu teikt, ka Maija būtu pārāk aizrāvusies ar jauno nodarbību, taču viņa bija domājusi, ka tā būs viņa, kas pateiks, ka viss nu ir līdz kaklam, kad patiešām būs apnicis. Bet tā, pēkšņi, viņu atstādināt... nē, pie tā Maija gan nebija pieradusi.

78 — Kas tad tie par jaunumiem! Kam es te esmu pāri nodarījusi? Vai varbūt kādu apsaukājusi? Vai tavam Algoritmam ar kaut ko pa pliko pauri iemetusi? Vai...

— Viņam nemaz nav pliks pauris. Tas pirmkārt. Bet, otrkārt, nevajag trokšņot. Viņš tikai teica tā: ja cilvēks ir apguvis četrus programmēšanas stūrakmeņus — sazarošanās operatoru, ievades un izvades operatorus un piešķires operatoru, tad par programmēšanu viņš zina visu būtisko un palikuši ir sīkumi, nenozīmīgas detaļas. Vārdu sakot, tagad tu vari sākt mācīt citus.

Ilustrācija

— Zini ko, Beisikān! Es dažkārt skatos uz tevi, un man sāk likties, ka tu esi baigi dumjš, nu vienkārši nepārspējams. Un tie tavi sājie jociņi... Bet ja nopietni: vai tad tiešām programmēšanā nekā vairāk nav kā tikai šie četri operatori?

— Kur nu! Vēl būs nezin cik daždažādu noteikumu, operatoru un paņēmienu, gan interesantu, gan ne visai. Taču nekā sevišķi jauna vairāk nebūs, ja nu vienīgi apakšprogrammas un funkcijas jēdzieni, bet tie ir viegli saprotami. Vēl gan ir skaitļu masīva jēdziens, bet par to es tev tūlīt pat izstāstīšu.

Par skaitļu masīviem

MASĪVSSkaitļu masīvs, citiem vārdiem sakot, ir skaitļu tabula jeb skaitļu virkne, turklāt šie skaitļi ir izvietoti mašīnas atmiņā un tiem ir savi numuri, lai tos citu no cita varētu atšķirt. Var teikt arī tā: masīvs ir mainīgais ar vairākām 79 vērtībām, kuras mēs numurējam. Un — kā jau mainīgajam — tam ir apzīmējums, kurš tiek veidots tāpat kā vienkāršo mainīgo apzīmējums — no burta vai no burta un cipara.

MASĪVA ELEMENTSJa mums, piemēram, ir masīvs ar apzīmējumu M, tad šā masīva pirmais skaitlis jeb mainīgā M pirmā vērtība, jeb — kā visbiežāk saka — masīva pirmais elements tiek apzīmēts ar M(1), otrais — ar M(2), trešais — ar M(3) un tā tālāk. Šie apzīmējumi, kā tu pati saproti, jālieto tad, kad tev attiecīgā elementa vērtība ir jāizmanto kādā aritmētiskā izteiksmē vai arī šim elementam tu gribi piešķirt kādu vērtību. Piemēram, pieraksts M(6)=18 nozīmē to, ka masīva M sestajam elementam tiek piešķirta vērtība astoņpadsmit. Izteiksme Z=5*M(6) nozīmē to, ka masīva M sestā elementa vērtība ir jāpareizina ar pieci.

Neliels masīvs ar sešiem elementiem
Neliels masīvs ar sešiem elementiem

— Vai tu vari minēt kaut vienu piemēru, kur tādi masīvi patiešām ir vajadzīgi un noderīgi?

— Protams, varu. Bet, kamēr vēl neesmu aizmirsis, — iekavās pēc masīva apzīmējuma nav obligāti jāraksta skaitlis, lai dabūtu vajadzīgā masīva elementa numuru. Vari rakstīt, piemēram, M(K), tad interpretators atradīs elementu ar numuru K, protams, ja pirms tam šim mainīgajam K ir piešķirta skaitliskā vērtība. Var vēl sarežģītāk: M(K+1) vai M(5×K+3), un vispār — iekavās var būt jebkura aritmētiskā izteiksme. Interpretators šo izteiksmi izrēķinās un atradīs vajadzīgo masīva elementu.

Tagad par to, kad šādi masīvi ir vajadzīgi. Vispārīgi runājot, tie ir vajadzīgi tad, kad tavai programmai ir jāstrādā ar daudziem viena tipa skaitļiem, kas doti tabulās. Teiksim, kaut kādu mērījumu rezultāti — vidējā dienas temperatūra gada laikā vai 80 vienādu katra lieluma apavu skaits veikalā, vai algas apmērs katram strādājošajam kaut kādā darbavietā. Svarīgi ir tas, lai visi strādājošie algu sarakstā būtu stingrā, nemainīgā kārtībā — tad pēc strādājošā kārtas numura algas masīvā varēs atrast viņam pienākošos summu. Bet, lūk, cits piemērs. Masīvā var glabāt atzīmes, kādas skolēni saņēmuši angļu valodas kontroldarbā. Atkal svarīgi ir tas, lai skolēna kārtas numurs klases žurnālā būtu nemainīgs — tas būs arī masīva elementa numurs. Jukas te nedrīkst pieļaut, jo nevienam nebūs nekāda prieka, ja viņam tiks piedēvēta sveša atzīme. Kā redzi, tamlīdzīgu piemēru ir papilnam.

— Labi, diezgan piemēru. Ja kaut kas vēl ir jāzina, tad saki, un sākam darbu.

Tas, kāds masīvs būs vajadzīgs, jāzina pašā sākumā

MASĪVA GARUMS— Pirms sāc darbu, vajag aprakstīt masīvu — piešķirt tam apzīmējumu un garumu. Masīva apzīmējumu var veidot tāpat kā mainīgā apzīmējumu, un turklāt tie var arī sakrist, piemēram, mainīgais A un masīvs A. Apzīmējums būs viens un tas pats, taču vērtības, protams, ne. Bet masīva garums — kā jau to viegli iedomāties — ir maksimālais elementu skaits masīvā. Vispār masīvu apraksta ar speciāla masīvu aprakstes operatora DIM palīdzību. Šie trīs burti ir saīsinājums no angļu vārda dimension — dimensija. Pēc DIM jāraksta masīva apzīmējums un iekavās masīva garums jeb, kā es teicu, maksimālais elementu skaits.

— Bet kas tad īsti ir maksimālais elementu skaits? Un kāpēc maksimālais?

— Tūlīt pateikšu. Vispirms tikai pabeigšu par operatoru DIM. Tas var izskatīties, piemēram, šāds:

Ilustrācija

Kā redzi, ar DIM var definēt vairākus masīvus uzreiz, tie tikai pēc šī operatora jāapraksta, citu no cita 81 atdalot ar komatu. Bet nu par maksimālo elementu skaitu. Tas ir tā. Var gadīties, ka programmā tev ir vajadzīgs masīvs, bet nav zināms, cik šajā masīvā ir elementu. Tad tu šo masīvu vari aprakstīt, par maksimālo elementu skaitu ņemot skaitli, kas katrā ziņā ir lielāks par elementu kopējo skaitu. Ja tu esi aprakstījusi garāku masīvu, nekā tev ir vajadzīgs, — nav nekāda nelaime, svarīgi, lai tas nebūtu īsāks.

Masīva apjoms jāzina savlaicīgi
Masīva apjoms jāzina savlaicīgi

— Bet ja es pat nevaru iedomāties, cik būs elementu?

— Tad programmu rakstīt tev vēl par agru. Parasti jau var un vajag zināt, kāds būs maksimālais elementu skaits masīvā. Piemēram, tu gribi izveidot kontroldarba atzīmju masīvu, ko apzīmējam ar A, pie tam tādu, kas derētu jebkurai klasei. Uzreiz rodas grūtības, jo skolēnu skaits katrā klasē ir atšķirīgs. Tad šo masīvu var aprakstīt šādi:

20 DIM A(50).

Es domāju, ka klasē nekad nebūs vairāk par piecdesmit skolēniem. Šajā gadījumā 50 būs maksimālais elementu skaits, bet faktiskais tev būs mašīnā jāievada atsevišķi.

Maza programma atzīmju ievadīšanai

Tā kā pie mašīnas mēs nevaram tikt, jo pašlaik to remontē, tad sastādi, lūdzu, programmu, kas kaut kādā masīvā ievadītu kontroldarba atzīmes. Šādai programmai lielas vērtības nebūs, bet tu vari iedomāties, ka tā ir lielas programmas sastāvdaļa.

82 — Lūdzu.

10 DIM A(50)
20 PRINT «IEVADIET ATZIHMI»
30 INPUT A(1)
40 PRINT «IEVADIET ATZIHMI»
50 INPUT A(2)

Paklau, vai tie PRINT un INPUT man visu laiku būs jāraksta?

Ilustrācija

— Nē-ē! Tad jau tā programmēšana būtu tīrie rakstu darbi. Atceries vienu no mūsu pirmajiem algoritmiem — skolā iešanas algoritmu! Tur tika izveidots klašu skaitītājs, šeit tu vari izveidot skolēnu skaitītāju.

— Jā, jā, tā tur bija. Ahā! Ja es rakstu 15 N=1, tad skaitītāja N vērtība kļūs vienāda ar 1. Tālāk rindā 40 N=N+1 skolēna numurs palielināsies par vienu. Un tas ir gandrīz viss.

— Rindā ar numuru 30 neaizmirsti A(1) nomainīt ar A(N).

— Jā, jā, citādi visu laiku tiks ievadīts tikai masīva pirmais elements. Bet tagad man vajag, lai pēc skaitītāja vērtības palielināšanas par vienu atkal tiktu izpildīta rinda 20.

Operators, kurš vadību nodod vienmēr

— Ja tu tā gribi, tad vari izmantot pārejas operatoru GO TO, ko izrunā «gou tu».

— Un kas latviski nozīmē «ej uz», bet bija runāts, ka nekādu jaunu operatoru vairāk nebūs.

— Tā nu gan es neteicu. Runa bija par to, ka nekā būtiski jauna nebūs, bet vispār jauni operatori varētu būt. Vēl tikai mazliet par operatoru GO TO. Pēc tā jāraksta tās rindas numurs, kura ir jāizpilda nākamā. Piemēram, 50 GO TO 20 nozīmē, ka nākamās tiks izpildītas rindas, sākot ar numuru 20, un tā tālāk pēc kārtas līdz rindai ar operatoru IF vai GO TO. Starp citu, operators GO TO nav nekas jauns. To var uzrakstīt ar operatora IF palīdzību. Piemēram, šādi:

50 IF Z=Z THEN 20.

Šis operators mainīgā Z vērtību salīdzina pašu ar sevi un, ja tās ir vienādas, bet tās vienmēr ir vienādas, tad vadību nodod uz rindu ar numuru 20.

— Kāpēc tad tāds operators GO TO vispār ir vajadzīgs?

Viņš taču nekad neapstāsies!
Viņš taču nekad neapstāsies!

— Īsuma labad, tikai īsuma labad. Arī skaidrāk būs, ja uzrakstīsi GO TO, nevis kaut kādu tur IF.

— Skaties, programma ir gatava!

10 DIM A(50)
15 N=1
20 PRINT «IEVADIET ATZIHMI»
30 INPUT A(N)
40 N=N+1
50 GO TO 20
60 END

Nemaz nav slikti. Vai ne?

— Slikti jau nav, bet šis un tas tomēr trūkst. Mašīna visu laiku prasīs un prasīs atzīmes.

— Un nekad nebeigs?

— Nē, principā viss beigsies, ievadot piecdesmitā masīva elementa vērtību. Piecdesmit pirmo vairs nevarēsi ievadīt — būs ziņojums par kļūdu.

Kā beidz datu ievadi

— Ko tagad lai daru? Varbūt darīt tā, kā mēs darījām, kad Fārenheita grādus pārvērtām Celsija grādos? Pēc katras atzīmes ievadīšanas vēl papildus ievadīt nulli, ja ievade beidzas.

— Jā, tā varētu. Taču tā tu patiesībā divkāršosi lietotāja darbu. Viņam vajadzēs ievadīt atzīmi un tūdaļ arī norādījumu, vai darbu turpināt vai ne. Cik atzīmju, tik atbilžu. Un ja nu atzīmes ar atbildēm sajūk?

— Nesajuks. Uzrakstīsim uz ekrāna, kas jāievada.

— Visticamāk, ka sajuks. Tādās reizēs vienmēr gribas ievadīt ātrāk un ātrāk, un tas beidzas ar to, ka sajūk.

84 — Pats vainīgs.

— To vēl nevar zināt. Varbūt vainīgs ir programmists, kurš tik nesakarīgi ir noprogrammējis. Labāk būtu darīt tā: pašā sākumā izvadīt ziņu, ka ievade beigsies tad, kad atzīmes vietā tiks ievadīta nulle. Skaidrs, ka atzīmes var būt tikai no 1 līdz 5. Šajā gadījumā katra ievadītā atzīme programmā ir jāpārbauda — ir vai nav nulle.

Vēl varētu pamēģināt citu paņēmienu: pašā sākumā mēs varam pavaicāt, cik klasē ir skolēnu, un katrreiz pirms — es uzsveru — pirms, nevis pēc N palielināšanas rindā 40 pārbaudām, vai N jau ir vienāds ar skolēnu skaitu. Ja nav, tad turpinām. Ja ir, tad beidzam.

— Kāpēc tu tik ļoti uzsver, ka šī pārbaude ir jāliek pirms N palielināšanas?

— Pirms N vērtības palielināšanas jāpārbauda, vai šī vērtība ir vienāda ar skolēnu skaitu, bet pēc N vērtības palielināšanas — vai šī vērtība ir lielāka par skolēnu skaitu. Tur ir tā atšķirība.

— Bet kā tad būtu labāk programmēt to atzīmju ievadi?

— Tagad man liekas,ka labāk būtu, ja pēc rindas 40 rindas 50 vietā mēs izdarītu salīdzināšanu un, ja N vērtība nebūtu lielāka par skolēnu skaitu, tad vadību nodotu uz rindu ar numuru 20.

— Cik es atceros, loģiskā nosacījuma «nav lielāka» sazarošanās operatoram nebija.

— Nebija gan. Bet ko nozīmē «nav lielāka»? Vai nu mazāka, vai vienāda. Bet tāds loģiskais nosacījums mums bija. Ja skolēnu skaitu apzīmējam ar K, tad jaunā rinda būs šāda:

50 IF N<=K THEN 20.

Bet tas vēl nav viss. Lai to, ko mēs te tik ilgi apspriežam, varētu uzrakstīt īsāk, ir izdomāts cikla operators FOR.

Operators, kurš kaut ko dara zināmu reižu skaitu

CIKLA MAINĪGAISBūtībā šis operators veido skaitītāju, kuru mēs šeit saucam par cikla mainīgo.

— Pag, pag, lai varētu veidot skaitītāju, ir taču jāzina, ar kādu skaitli jāsāk un ar kādu jābeidz?!

85 CIKLA ROBEŽA— Tu esi apbrīnojami apķērīga! Cikla operatorā tiešām ir jāuzrāda cikla mainīgā pirmā vērtība un arī robežvērtība. Un vēl jānorāda solis, ar kādu cikla mainīgais pieaug.

Ilustrācija

Cikla operatora piemērs varētu būt šāds:

FOR N=1 TO K STEP 1.

Tā gan ir tikai viena operatora daļa; bet vispirms — ko nozīmē «for»?

— Ja nepareizā latviešu valodā, tad «priekš» vai «dēļ», bet «tu», kas nāk pēc N=1, varētu nozīmēt «pie» vai «uz».

— Jā, bet šeit tas drīzāk nozīmē «līdz». Tūlīt pēc FOR atrodas mainīgā apzīmējums, šajā gadījumā — N. Tas arī ir tas teiksmainais cikla mainīgais. Pēc tā ir vienādības zīme, kurai seko cikla mainīgā pirmā vērtība. Šajā operatorā zīme «=» jālasa «no», tas ir, pavisam citādi nekā piešķires operatorā. Starp citu, kā mēs to tur īsti lasījām?

— «Tiek piešķirta vērtība», bet sazarošanās operatorā mēs to lasījām tā, kā pienākas, — «vienāds ar». Lūk, tā! Šo to es arī atceros.

— Malacis. Pēc TO ir jāraksta cikla mainīgā robežvērtība. Šoreiz tā būs mainīgā K vērtība. Bet pēc vārda «step», kas nozīmē «solis, pakāpiens», tiek rakstīta soļa vērtība.

Un vēl viens triks, ko es pats izdomāju. Tukšā vieta pašās operatora beigās jālasa «izpildiet sekojošos operatorus». Tā, tagad iepriekšējo piemēru mēs varam pārtulkot latviski:

BeisikāFORN=1TOKSTEP1
LatviskiMainīgā N vērtībāmno1līdzKar soli1izpildīt šos operatorus

Ko tas viss nozīmē!

Tagad es pastāstīšu par cikla operatora otro daļu, kas programmā atradīsies pavisam citā vietā un mūsu piemērā izskatīsies šāda:

NEXT N.

— «Nekst» nozīmē «nākamais».

— Jā, tā tas ir. Pievērs tikai uzmanību tam, ka pēc 86 NEXT ir jāraksta cikla mainīgā apzīmējums. Starp abām cikla operatora daļām gluži kā iekavās ir jāliek tie operatori, kas būs jāizpilda visu iespējamo cikla mainīgā vērtību gadījumos.

— Vai visas iespējamās nozīmē tās, kuras iegūst, pieskaitot un pieskaitot soli cikla mainīgā pirmajai vērtībai?

— Jā, bet neaizmirsti, ka pieskaitīšana beigsies tad, kad cikla mainīgā vērtība būs kļuvusi lielāka par robežvērtību. Var gadīties, ka jau pirmā vērtība ir lielāka par robežvērtību. Tad cikla operatori netiks izpildīti ne reizes.

Tagad es tev mēģināšu uzzīmēt kaut ko līdzīgu cikla operatora shēmai.

Ilustrācija

Papēti šo shēmu, tad tev kļūs skaidrāks. Shēma ir vienkāršota, jo patiesībā mainīgo B, C un D vietā var būt patvaļīgas aritmētiskas izteiksmes. No otras puses, ir iespējama vēl vienkāršāka cikla operatora forma: ja solis ir vienāds ar vienu, tad STEP 1 var arī nerakstīt. Saīsināti cikla operators, ar kuru mēs sākām, tad izskatīsies šāds:

FOR N=1 TO K
...
NEXT N

87 Tas nozīmē, ka tiks ņemtas N vērtības 1, 2, 3 un tā tālāk līdz K ieskaitot. Arī šajā, saīsinātajā formā gan vieninieka vietā, gan mainīgā K vietā var rakstīt aritmētiskās izteiksmes.

Programma iesācējiem piegriezējiem
Programma iesācējiem piegriezējiem

Pareizie un nepareizie cikla operatori

Un tagad paskatīsimies piemērus. Vai ir pareizs šāds cikla operators?

FOR I=100 TO 200 STEP K
...
NEXT I

— Es domāju, ka ir pareizs. Tiks ņemtas I vērtības, sākot ar simtu, ar soli K — tik ilgi, kamēr I būs lielāks par 200.

— Kāda būs pēdējā I vērtība, ja K ir vienāds ar seši?

— Ar seši? Man iznāk, ka pēdējā I vērtība būs 100+96, tātad 196.

— Bet tagad paskaties uz šo cikla operatoru. Vai būs pareizi?

FOR K=6+A*B/C TO ((Z+K)/A-Z*C)*2
...
NEXT K

— Nav pareizi.

— Kāpēc?

— Nezinu, bet pareizus operatorus tu taču vairāk nerādīsi, vai tad es skolotājus nepazīstu.

88 — Jāsaka, ka tev ir taisnība, bet tomēr paskaties un pasaki, kāda nepilnība ir šajā piemērā.

— Aritmētiskās izteiksmes taču var būt, solis, ja tas ir vienāds ar vienu, nav obligāti jānorāda...

— Bez šaubām. Vaina ir citur.

— Nezinu. Padodos.

— Šeit cikla beigu noteikšanai tiek izmantota izteiksme, kas satur cikla mainīgo K. Tas ir ļoti slikts stils. Nevar teikt, ka tas būtu nepareizi, jo interpretators, aprēķinot cikla mainīgā robežu, ņems to cikla mainīgā K vērtību, kura tam tobrīd būs. Un tā būs 6+A*B/C, tā ka patiesībā cikla mainīgā robeža tiks aprēķināta pēc izteiksmes ((Z+(6+A*B/C))/A-Z*C)*2. Vēlāk ciklā, kad mainīgajam K būs jauna vērtība, nekas netiks pārrēķināts.

— Viss nu ir skaidrs. Bet kas tad šeit ir tik slikts?

— Redzi, beisikam ir viens diezgan liels trūkums: katrai mašīnai šī valoda ir citāda. Protams, būtisku atšķirību nav, bet sīkumos — tikai šķietamos sīkumos, jo programmēšanā sīkumu nav, — tā var atšķirties. Piemēram, citas mašīnas interpretators visas izteiksmes FOR operatorā katrai cikla mainīgā vērtībai var aprēķināt no jauna. Un tad šī pēdējā programma tiks izpildīta pavisam citādi. Jāiegaumē vispārīgs programmēšanas princips — programmēt pēc iespējas vienkāršāk, tā, lai programma būtu piemērota jebkurai mašīnai un to viegli varētu saprast pats un citi.

— Par citām mašīnām vēl par agru domāt. Jāmēģina tikt galā ar šo pašu.

Un vēlreiz tā pati programma

— Bet nu paskaties uz mūsu atzīmju ievadīšanas programmu. Tagad, kad tu zini cikla operatoru, rindu 15 vari nomainīt ar cikla operatora FOR daļu un rindu ar numuriem 40 un 50 vietā ielikt NEXT N. Un tad tā programma būs šāda:

10 DIM A(50)
12 PRINT «IEVADIET SKOLEHNU SKAITU»;
13 INPUT K
15 FOR N=1 TO K
20 PRINT «IEVADIET »; N; «. SKOLEHNA ATZIHMI»;
30 INPUT A(N)
40 NEXT N
60 END

Skolēna kārtas numura izvadi rindā 20 es ievietoju, lai lietotājs precīzi zinātu, kuram skolēnam atzīme ir jāievada. Bet semikolus visiem tekstu izvades operatoriem beigās liku tādēļ, lai jautājumzīme, kuru pēc tam parādīs operators INPUT, būtu uzreiz pēc šiem tekstiem, tajā pašā rindā. Jā, un vēl ir nākusi klāt arī skolēnu skaita ievade rindā 12.

— Bet paklau — vai tad bija vērts tā ņemties, ja ietaupījām tikai vienu rindiņu? Iepriekš, lai izveidotu ciklu, bija vajadzīgas trīs rindiņas, bet tagad divas. Tāds sīkums vien ir.

— Kā to lai ņem. Es gan domāju, ka cikla operators nav izgudrots tikai ekonomijas labad. Cilvēcei tas ir vajadzīgs citu iemeslu dēļ. Svarīga ir pati cikla ideja!

Galvenais ir apjēgt, ka programmas sastāv no cikliem. Uzdevumos tie jāmeklē un jāatrod. Un programmās tiem ir jābūt skaidri redzamiem. Programmistam ir jādomā ciklos, kā saka Algoritms. Tas jāsaprot tā, ka cikliem jābūt algoritmu un tātad arī programmu pamatā. Nu — un ekonomija tomēr ir. Īstās programmas ir ļoti garas, un, ja kaut ko var uzrakstīt īsāk, tad arī jāraksta īsāk, bet tikai ne uz programmas skaidrības rēķina.

Programma skaitļu summēšanai

Bet tagad, izmantojot cikla operatoru, sastādi tādu programmu, kura summētu visus skaitļus no viena līdz simtam.

Ilustrācija

— Hē! Tik viegli tu mani vis nepaķersi. Ir taču formula tādas summas aprēķināšanai. Summa būs 10100, dalīts ar divi. Tātad... 5050!

— Tik un tā sastādi tādu programmu, bet ņem nevis simtu, bet gan patvaļīgu skaitli N, kuru lietotājs ievadīs.

— Labi jau, labi, kaut arī šim gadījumam ir formula — summa būs N(N+1)2. Tā ka programmu es rakstīšu tikai aiz cieņas pret tevi.

90 — Netērē laiku. Pacenties sastādīt, pirms mēs tiekam pie mašīnas. Un ņem vērā, ka aritmētiskajās izteiksmēs cikla mainīgo var izmantot gluži tāpat kā parastu skaitli.

Maija tā arī izdarīja. Viņas darba rezultāts bija šāds:

10 PRINT «PROGRAMMA SUMME' VISUS SKAITLJUS NO 1 LIHDZ N»
20 PRINT «IEVADIET SKAITLI N»
30 INPUT N
40 S=0
50 FOR I=1 TO N
60 S=S+I
70 NEXT I
80 PRINT «SUMMA IR »; S
90 STOP

— Uh, nomocījos gan, kamēr izdomāju, ka summas mainīgajam S sākumā vajag piešķirt vērtību nulle, bet pēc tam pieskaitīt skaitļus pa vienam. Nu, kā ir?

— Tā nekas, programma strādās.

Vēl kādu laiciņu pagaidījuši, skolēni tika pie ESM.

— Nu, Maija, izsauc interpretatoru!

>BAS

READY

Vispirms topošo programmu vajag kaut kā nosaukt, izmantojot pavēli NEW. Ievadi pavēli NEW un jaunās programmas nosaukumu.

NEW SUMMA

— Vai esi apmierināts?

Ātri un slikti! Tas nav programmistu stils!

— Jā, pilnīgi. Sāc ievadīt programmu un pie tam ātri. Mums šodien maz mašīnlaika.

Maija ķērās pie darba. Drīz viņa pavēstīja:

91 — Gatavs. Var laist.

— Vispirms paskatīsimies.

— Nav ko skatīties. Kādas gan var būt kļūdas, tik īsu programmu ievadot!

RUNNH

PROGRAMMA SUMME' SKAITLJUS NO 1 LIHDZ N
IEVADIET SKAITLI N

?SYNTAX ERROR AT LINE 30

Kas tie par jokiem?!

— Nu protams! Rindā 30 ir sintaktiska kļūda. Tas nozīmē, ka šī rinda beisikā nav iespējama. Visdrīzāk kāds burts nav pareizs. Paskaties šo rindiņu.

— Ar pavēli LIST?

— Jā, LIST un pēc tam rindas numuru.

LISTNH 30
30 INPT N

— Jā, tiešām, nezin kāpēc tur sēž INPT, kur vajadzēja INPUT.

— Sēž, sēž... Un nezin kāpēc.

— Nav liela nelaime. Ievadīšu no jauna.

30 INPUT N
RUNNH

PROGRAMMA SUMME' VISUS SKAITLJUS NO 1 LIHDZ N
IEVADIET SKAITLI N
? 100

?FOR WITHOUT NEXT AT LINE 60

— Atkal kaut kādas muļķības!

— Kļūda, bērniņ, kļūda. Kļūda cikla veidošanā.

92 Kurā rindā tev bija jābūt NEXT?

— Rindā ar numuru 90.

— Paskatīsimies to.

LISTNH 90

90 NXT I

Nu re! Kļūdains ievads!

— Tā, izlaboju.

— Nu, ja izlaboji, vari laist.

RUNNH

PROGRAMMA SUMME' SKAITLJUS NO 1 LIHDZ N
IEVADIET SKAITLI N
? 100
SUMMA IR 5050

STOP AT LINE 110

READY

— Fū-ū-ū... Beidzot viss ir kārtībā.

— Tagad ātri noglabā savu programmu uz diska.

— Viss kārtībā. Varam drāzt uz mājām.

11.

Dari kā es, dari labāk par mani!

93 Katru dienu pie elektroniskā skaitļotāja nevar tikt, tāpēc Pēcis ierosināja paskatīties vecās programmas, kuras viņš bija sastādījis, savā laikā mācīdamies.

— Zini, reizēm nemaz nenāk par ļaunu papētīt citu sastādītās programmas. Es domāju, pēc tam tev radīsies sajūta, ka arī tu tā varētu.

— Kur nu! Ar tādiem programmēšanas klasiķiem kā Pēcis Beisikāns es jau nekad nevarēšu mēroties.

Visvienkāršākā vienādojuma risināšanas programma

— Labi, labi. Lūdzu, pirmā programma, kurā tiek risināts vienādojums AX=B, A un B — zināmie koeficienti, X — nezināms lielums.

— Lai atrisinātu tādu vienādojumu, nekāda lielā gudrība jau nu nav vajadzīga.

— Nav gan. Vienīgais triks ir tāds, ka jāpārbauda, vai A nav vienāds ar nulli. Ja ir vienāds, tad savukārt jāpārbauda, kāds ir B, un tikai tad, ja B=0, vienādojumam būs atrisinājums, pat bezgalīgi daudz atrisinājumu, jo X var būt patvaļīgs skaitlis. Ja B nav nulle, tad nekā, atrisinājuma nav, jo, lai ko ar nulli arī reizinātu, nulle vien iznāks.

Kontroldarbu sāc ar blokshēmu!
Kontroldarbu sāc ar blokshēmu!

— Jā, patīkami atcerēties jaunību, kad viss tas likās neaptveramas gudrības kalngali.

94 — Programma ir sastādīta pēc šādas blokshēmas:

Ilustrācija
Ilustrācija

Un pati programma izskatās šāda:

10 PRINT " PROGRAMMA RISINA VIENAHDOJUMU A*X=B"
20 REM MAINIHGAIS A - KOEF. A; B - KOEF. B
30 PRINT  \ PRINT "IEVADIET KOEFICIENTU A";
40 INPUT A
50 PRINT "IEVADIET KOEFICIENTU B"; \ INPUT B
55 \
60 REM IEVADIHJUSHI A UN B, SALIHDZINAHM A AR 0
70 REM JA A=0, TAD IZVADAHM REZULTAHTU,
80 REM ATKARIHGU NO TA', VAI B=0, VAI NAV
85 \
90 IF A<>0 THEN 150
100 IF B<>0 THEN 130
110 PRINT "ATBILDE: X IR PATVALJIHGS SKAITLIS"
120 GO TO 160
130 PRINT "ATBILDE: ATRISINAHJUMA NAV"
140 GO TO 160
150 PRINT "ATBILDE:   X=";B/A
155 \
160 PRINT  \ PRINT "JA DARBU BEIDZAT, IEVADIET 0"
170 INPUT K
180 IF K<>0 THEN 30
190 STOP
200 END

— Skaties, blokshēmā pie katra bloka es pierakstīju to rindu numurus, ar kurām sākas bloka izpilde.

— Labi, skatāmies tavu programmu. Pirmajā rindā ar numuru 10 nekā sevišķa neredzu. Uz ekrāna tiek izdrukāts ziņojums, un tas ir viss. Otrā gan sākas jocīgi...

Kā savu programmu lai paskaidro!

— Tur parādās jauns operators — piezīmju operators, kuru apzīmē ar REM, kas ir saīsinājums no remark — «rimāk» — «piezīme». Šā operatora darbs ir gaužām vienkāršs. Tas nekā nedara.

— Jā, nekā nedarīt tiešām ir vienkārši. Bet kāpēc tad tāds operators ir vajadzīgs?

— Pēc REM programmā var ierakstīt visu, ko vien vēlas. Gandrīz visu, kā tu pati sapratīsi no programmas nākamās rindas. Tie var būt paskaidrojumi par programmas darbu: ko tā dara, kāds algoritms ir izraudzīts. Atsevišķās sarežģītākās vietās var paskaidrot, kas tur notiek.

Piezīmēs ierakstītais nekad neaizmirsīsies
Piezīmēs ierakstītais nekad neaizmirsīsies

— Vai tas atkal domāts lietotājam? Bet paši lietotāji programmu patiesībā nemaz neredz.

PIEZĪMES— Ir visādi lietotāji. Taču piezīmes būs noderīgas 96 ne tikai lietotājiem, bet arī pašam programmistam, kad viņš jau pēc neilga laika savu programmu būs krietni piemirsis. Tāpēc ir svarīgi, lai programmā būtu piezīmes. Ne tik svarīgi, lai to būtu daudz, cik svarīgi, lai piezīmes dotu ko jaunu, salīdzinot ar pašu programmu. Piemēram, nav lielas jēgas rakstīt kaut ko tādu:

10 REM A PIESHKJIRAM VEHRTIHBU 7
20 A=7

Piezīmē šeit ir tikai izstāstīts beisika operators.

— Un kā tad būtu labāk?

— Labāk būtu uzrakstīt, ko mainīgais A nozīmē, piemēram, dienu skaitu nedēļā. Bet šīs programmas otrajā rindā es piezīmēju, kādi mainīgie ir manā programmā un ko tie nozīmē. Runa gan ir par pamatmainīgajiem A un B, kuru vērtības būs vienādas ar koeficientiem A un B.

Nākamajā rindā 30 parādās simbols «\». Otrādā slīpsvītra, kā jau tev teicu. Ar to operatorus atdala citu no cita, ja vienā rindā grib rakstīt vairākus. Šajā rindā vispirms ir operators PRINT bez nekā — tas uz ekrāna izvadīs tukšu rindu. Un tad vēl viens operators PRINT ar tekstu. Tagad ir skaidrs, ka piezīmes tekstā pēc REM nedrīkst būt šī otrādā slīpsvītra. Tā nozīmēs, ka REM beidzas un sākas nākamais operators. Vēl otrādo slīpsvītru var izmantot, lai vienu programmas daļu atdalītu no otras, kā rindā 55.

— Rindu 40 vari nepaskaidrot, bet nākamā... Tur atkal ir divi operatori — PRINT un INPUT. Nekas briesmīgs, saprast var. Bet labi, ka vienā rindā var rakstīt vairākus operatorus.

— Labi gan, bet ar to neiesaka aizrauties, jo vadību var nodot tikai uz rindas sākumu. Uz rindas vidu nevar. Ja man nāktos kaut kad vēlāk programmā ar IF vai GO TO operatoriem vadību nodot uz operatoru INPUT, tad visa rinda 50 būtu jāpārveido par divām. Bet to man nevajadzēs darīt, jo šie PRINT un INPUT savā starpā ir cieši saistīti.

— Tālāk ir piezīmes. Veselas trīs rindas. Tur tu raksti par to, kā programma darīs savu darbu.

— Jā, to es īsi aprakstu, un vairāk piezīmju programmā nebūs. Vispār jau vajadzētu, taču man ir PRINT operatori ar diezgan labi saprotamiem izvadtekstiem, kurus arī var lasīt kā piezīmes. Skaties tālāk.

97 — Ahā! Tagad A vērtība tiek salīdzināta ar nulli. Ja A nav nulle — un tas būtu normāli —, tu ej uz rindu ar numuru 150, bet to es neskatīšos. Skatīšos nākamo rindu, un tur tev atkal ir salīdzināšana. Nu jā — tā, kā ir paredzēts blokshēmā. Tā, piemēram, ja B=0, tiek izvadīts viens ziņojums, bet, ja nav, tad cits. Domāju, ka to var saprast. Pēc abu ziņojumu izvadīšanas tu ej uz rindu 160, kur ir...

— Vispirms varbūt paskaties rindu 150, uz kurieni jādodas, ja A nav nulle.

— Kas tur ko skatīties, tiek izvadīts B dalījums ar A, un tas ir viss. Un pēc tam tieši uz rindu 160! Nu kā tad, arī blokshēmā pēc visiem šiem darbiem pāriet uz jautājumu: ko lai dara, strādāt tālāk .vai ne? Tātad tagad jārisina šī problēma. Tas arī notiek rindās ar numuriem no 160 līdz 190. Lieliska programma, Pēcīt! Apsveicu!

— Skatāmies nākamo programmu.

12.

Neliels ieskats grāmatvedībā

Šī programma aprēķina ienākuma nodokli, ja ir dots algas lielums.

— Vai dieniņ, cik nopietnas lietas! Es, piemēram, nekad neesmu interesējusies par to, cik mani senči saņem un kādus nodokļus maksā.

Bērniem līdz 16 gadiem lasīt atļauts

— Varēji arī painteresēties. Tiesa, arī es pats, tikai strādājot ar šo programmu, uzzināju, pēc kāda algoritma tiek aprēķināts ienākuma nodoklis. Un algoritms ir šāds. No algas līdz 70 rubļiem nekādu nodokli neatvelk — tas ir tā sauktais neapliekamais minimums. Nodokli neatvelk arī no kapeikām. Ja tev pienākas 71 rbl. 99 kap., tad nodoklis būs jāmaksā no 71 rubļa. No 71, 72 vai 73 rubļiem nodokli N aprēķina pēc formulas:

N=0.34A−23.89,

98kur A ir aprēķinātā alga. Tālākajām summām formulas ir šādas:

N=0.35A−24.60, ja 74≤A≤76;
N=0.34A−23.79, ja 77≤A≤90;
N=0.12A−3.80, ja 91≤A≤100.

Visbeidzot, sākot ar 101 rubli, nodokli maksā kā no 100 rubļiem un vēl 13% no summas virs 100 rubļiem jeb pēc formulas:

N=0.13A−4.80.

— Neko daudz es vis nesapratu.

— Tad skaties blokshēmu.

Ilustrācija

99Un tagad pati programma.

10 PRINT "PROGRAMMA APREHKJINA IENAHKUMA NODOKLI"
20 REM A - ALGA, N - NODOKLIS
30 M=70 \  \ REM MINIMAHLA' NEAPLIEKAMA' ALGA
40 R1=.34 \  \ REM KOEFICIENTS FORMULA' N=R1*A-Z
50 R2=.35
60 R3=.12
70 R4=.13
80 S1=73 \  \ REM KONSTANTES FORMULU MAINJAI
90 S2=76 \ S3=90
100 Z1=23.89 \  \ REM KOEFICIENTI FORMULAHS
110 Z2=24.6
120 Z3=23.79
130 Z4=3.8
140 Z5=4.8
150 S4=100
155 \
160 PRINT  \ PRINT "IEVADIET ALGAS LIELUMU RUBLJOS"
170 INPUT A1
180 A=INT(A1) \ REM NODOKLI APREHKJINA TIKAI NO RUBLJIEM
185 \
190 REM SAHKAS NODOKLJA APREHKJINAHSHANA ***************
200 IF A>M THEN 220
210 PRINT "ALGA ";A;" RBLJ. NETIEK APLIKTA" \ GO TO 350
220 IF A>S1 THEN 240
230 N=R1*A-Z1 \ GO TO 310 \  \ REM     0.34*A-23.89
240 IF A>S2 THEN 260
250 N=R2*A-Z2 \ GO TO 310 \  \ REM     0.35*A-24.60
260 IF A>S3 THEN 280
270 N=R1*A-Z3 \ GO TO 310 \  \ REM     0.34*A-23.79
280 IF A>S4 THEN 300
290 N=R3*A-Z4 \ GO TO 310 \  \ REM     0.12*A-3.80
300 N=R4*A-Z5 \  \ REM                 0.13*A-4.80
305 \
310 REM NODOKLIS IR APREHKJINAHTS ***********************
320 K=INT(N*100+.5) \ N=K/100
330 R=INT(N) \ K=K-R*100 \ REM APREHKJINA RBLJ. UN KAP.
340 PRINT " NODOKLIS IR ";R;" RBLJ. ";K;" KAP."
350 PRINT  \ PRINT "IEVADIET 0, JA BEIDZAT DARBU";
360 INPUT Z
370 IF Z<>0 THEN 160
380 STOP
390 END

— Dod šurp to programmu, tūlīt es to nokritizēšu. Tā, tā... Pirmajā rindā izdrukāts, ko programma dara. Ļoti labi. Otrajā rindā piezīmes — alga, nodoklis...

100— Nākamajās rindās es izveidoju aprēķināšanai vajadzīgās konstantes. Piemēram, ar M apzīmēju neapliekamo minimumu. Ja šo minimumu paaugstinās, programmā būs jāmaina tikai rinda 30. Tad pa visu programmu nebūs jāmeklē, kur tiek izmantots 70 un ko šis 70 nozīmē. Tāpat ir arī ar citām konstantēm, kuras jāizmanto visās piecās formulās.

Ilustrācija

— Ahā! Tas viss notiek rindās ar numuriem no 30 līdz 150. To es saprotu. Tad nāk algas ievade rindā 170. Bet rindā 180? Kas te notiek?

Funkcijas, kas vajadzīgas visiem

IEBŪVĒTĀS FUNKCIJAS— Te? Pats interesantākais šajā programmā. Parādās pirmā iebūvētā funkcija tavā programmista praksē. Dažreiz cilvēkam ar mainīgo vērtībām vajag izdarīt kaut ko sevišķu, no četrām aritmētiskajām darbībām atšķirīgu. Tādam nolūkam ir paredzētas iebūvētās funkcijas. Tām, tāpat kā mainīgajiem, ir savs apzīmējums, piemēram, INT, pēc kura iekavās raksta to aritmētisko izteiksmi, ar kuras vērtību ir jādara tas, ko funkcija dara.

— Bet kāpēc tās sauc par iebūvētajām funkcijām?

— Tāpēc, ka tās jau ir pašā beisika interpretatorā, vienalga, vai programmistam tās vajag vai ne. Un vēl tāpēc, lai tās atšķirtu no tām, kuras vajadzības gadījumā var izveidot pats programmists, bet par to vēlāk.

— Un ko tas INT varētu nozīmēt?

— INT ir saīsinājums no angļu vārda integer, ko izrunā «intidžer» un kas nozīmē «vesels», protams, 101ja runa ir par skaitļiem, nevis par cilvēkiem. Funkcija INT atrod skaitļa veselo daļu, precīzāk, tās aritmētiskās izteiksmes veselo daļu, kura ir uzrakstīta iekavās aiz INT. Piemēram, ja A=4,56789, tad INT(A) būs 4. Vienkārši, vai ne?

Veselo daļu atrod iebūvētā funkcija INT
Veselo daļu atrod iebūvētā funkcija INT

— Cik vērtīga ir programmēšana! Cilvēks pilnīgi par velti atkārto un padziļina aritmētikas zināšanas.

— Atgriežamies pie rindas 180. Kā jau teicu, nodokli aprēķina tikai no rubļiem, kapeikas jāatmet, kas, runājot matemātiski, nozīmē paņemt algas veselo daļu.

— Skaidrs! Un ko nozīmē rindā 190 redzamās zvaigznītes?

— Neko sevišķu. Tās tur ir tikai izskata pēc: programmas sākumdaļu atdala no galvenās daļas, kur notiek viss svarīgākais. Piezīmju operatoru var izmantot arī šādos nolūkos.

— Ahā! Rinda 200 algu jau salīdzina ar neapliekamo minimumu. Ja alga lielāka, tad rindai ar numuru 210 pārlec pāri. Tā jāizpilda tad, ja alga ir mazāka par neapliekamo minimumu. Kā tad! Šajā rindā tiek izvadīts ziņojums, ka alga ar nodokli nav apliekama, un vadība tiek nodota kaut kur uz priekšu. Gan jau vēlāk redzēs.

Tālāk. Rindā 220 tiek pārbaudīts, vai alga nav lielāka par 73 rubļiem. Nu jā, un uz rindu 230 nonāk tikai tad, ja alga ir lielāka par neapliekamo minimumu — tātad par 70 rubļiem — un bez tam nav lielāka par 73 rubļiem. Liekas, ka viss norit pareizi.

— Un pilnīgi tāpat notiek aprēķināšana arī pēc pārējām formulām. Viss šeit ir rūpīgi pārbaudīts, lai nodokļi tiktu noteikti ar precizitāti līdz kapeikai.

— Bet, kad nodoklis ir aprēķināts, notiek kaut kas neparasts. Es domāju rindu 320.

Noapaļošanas kļūdas skaitļotājā ir neizbēgamas

— Redzi, izdarot aprēķinus, mašīnā rodas noapaļošanas kļūdas un, teiksim, 5 vietā var iznākt 4,99999, kas, protams, ir gandrīz 5. Bet, ja mašīna izvadīs, ka nodoklis ir 4,99999 rubļi, tad jebkurš grāmatvedis smiesies, vēderu turēdams. Diemžēl 102pirmie programmas varianti tā arī darīja, un tāpēc bija vajadzīga šī rinda 320. Šeit es daru sekojošo. Vispirms, pareizinot ar simtu, rubļus pārvēršu kapeikās un tad pieskaitu puskapeiku, lai gadījumā, ja 500 kapeiku vietā esmu ieguvis 499,9999 kapeikas, man būtu 500,499 kapeikas, no kurām, paņemot veselo daļu, iznāks 500 kapeikas, kā arī vajag. Ja rezultāts man bija pareizs, tad puskapeikas pieskaitīšana veselo daļu nekādi neietekmēs.

Pagaidi! Kapeikas jānoapaļo citādi!
Pagaidi! Kapeikas jānoapaļo citādi!

Vēl es aprēķinātajā nodoklī gribu atdalīt rubļus un kapeikas, piemēram, ja nodoklis sanāk 5,42 rubļi, tad man vajag atsevišķi izvadīt 5 un 42. Tādas rubļu un kapeiku atdalīšanas saprašana nav pārāk vienkārša. Skaties, šeit rindā 330 es no kopējā kapeiku skaita K atņemu veselo rubļu skaitu, kas pareizināts ar simtu. Rezultātā man būs...

— Kapeiku skaits! Tas taču nemaz nav tik sarežģīti!

— Un seko rezultāta izvade un jautājums, vai lietotājs ar šo programmu vēl grib strādāt. Es šo programmu pārbaudīju visām vērtībām no 71 līdz 90 rubļiem, dažām starp 90 un 100, kā arī dažām, kas lielākas par 100. Un vienmēr izrēķinātais nodoklis sakrita ar to, kas iznāk pēc tabulām, kuras izmanto grāmatveži. Tās tabulas jau arī ir sastādītas pēc šīm formulām.

— Nu labi. Vispār man sāk likties, ka šīs tavas programmas tiešām var papētīt — šis tas kļūst skaidrāks. Varbūt rīt varam arī citas paskatīties, ja tev vēl ir.

— Ir, ir. Paskatīsimies.

13.

Skaitļotājs vai skolotājs?

103Nākamajā dienā Pēcis atnesa mazliet sarežģītākas programmas.

— Tu jau būsi dzirdējusi, daži uzskata, ka mašīnas var ne sliktāk par cilvēkiem mācīt bērnus. Drīz skolotājus aizstāšot elektroniskie skaitļotāji. Citi savukārt iebilst, ka mašīnas neko jēdzīgu nespēšot iemācīt. Kamēr viņi strīdas, izpētīsim vienu apmācības programmu. Pavisam vienkāršu, protams. Apmācības programmas parasti jau arī nav sarežģītas. Uzskata, ka pats grūtākais un svarīgākais ir nevis programmēt, bet gan iepriekš izdomāt, kā programma mācīs, lai kaut ko tomēr iemācītu.

Ilustrācija

Mācību par to, kā jāmāca, sauc par metodiku

Mana programma māca, patiesībā atkārto, reizrēķinu. Un metodika ir šāda. Ņemam divus veselus gadījumskaitļus no 1 līdz 9. Vēlāk par gadījumskaitļiem pastāstīšu vairāk. Ja pirmais ir vienāds ar vienu, tad to apmainām ar 7. Ja otrais, tad ar 8. Abus skaitļus parādām skolēnam; viņam tie ir galvā jāsareizina un rezultāts jāievada. Ja rezultāts ir pareizs, tad labi, ja nepareizs, tad atceramies, ka bija kļūda. Tā darām tik reizes, cik skolēns grib. 104Pašās beigās izvadām atzīmi.

— Un kur tad te ir metodika?

— Metodika ir tāda, ka mēs nemaz nedodam piemērus, kur piedalās vieninieks, — 1×2 vai 7×1, tos visi māk atrisināt. Toties mēs palielinām to piemēru skaitu, kur piedalās 7 vai 8.

— Tātad tu uzskati, ka ar deviņi ir vieglāk reizināt nekā ar septiņi vai astoņi.

— Ir jau arī. Attiecīgo skaitli vajag pareizināt ar desmit un no rezultāta atņemt to pašu skaitli, piemēram:

7×9=7×10−7=7×(10−1)=63.

— Labi jau, labi, vai tad es reizrēķinu nezinu!

— Tagad vari skatīties programmu.

10 REM PROGRAMMA REIZREHKJINA ATKAHRTOSHANAI
20 REM A UN B - GADIHJUMSKAITLJI, X - TO REIZINAHJUMS
30 REM P - PIEMEHRU SKAITS , P1 - ATZIHME,
32 REM K - KLJUHDU SKAITS
35 \
40 FOR I=1 TO 24 \ PRINT  \ NEXT I
50 PRINT "SVEIKS, MAZAIS DRAUGS !" \ PRINT
60 PRINT " TAGAD ATKAHRTOSIM REIZREHKJINU"
70 PRINT "ES JAUTAHSHU, TU ATBILDEHSI"
80 PRINT " CIK DAUDZ PIEMEHRU TEV RAHDIHT"; \ INPUT P
85 \
90 IF P>=5 THEN 120
100 PRINT "TAS IR PAR MAZ, NJEMSIM 5" \ P=5
110 GO TO 140
120 IF P<=100 THEN 140
130 PRINT "TAS IR PAR DAUDZ,NJEMSIM 100" \ P=100
140 PRINT  \ PRINT  \ PRINT "   UZMANIHBU !!!  STARTS !!!"
150 K=0 \  \ REM SAHKUMA' KLJUHDU SKAITS IR NULLE
155 \
160 FOR I=1 TO P
170 A=INT(RND*9)+1 \  \ REM PIRMA' SKAITLJA IZVEHLE
180 IF A<>1 THEN 200
190 A=7 \  \ REM  JA A=1, TAD NJEMAM 7
200 B=INT(RND*9)+1 \  \ REM OTRA' SKAITLJA IZVEHLE
210 IF B<>1 THEN 230
220 B=8 \  \ REM  JA B=1, TAD NJEMAM 8
230 PRINT "CIK IR ";A;" REIZ ";B;" ";
240 INPUT X \  \ REM ATBILDES IEVADE
250 IF X=A*B THEN 280
260 K=K+1 \  \ REM PALIELINAHM KLJUHDU SKAITU
270 PRINT "      NEPAREIZI ! ";A;" REIZ ";B;" IR ";A*B
280 NEXT I
285 \
290 IF K=0 THEN 360
300 PRINT "PAREIZI BIJA ";P-K;" NEPAREIZI ";K;" PIEMEHRI"
310 P1=INT((P-K)/P*5+.5) \  \ REM ATZIHMES IZVEHLE
320 IF P1<>0 THEN 340
330 P1=1 \  \ REM ATZIHMES 0 NAV
340 PRINT "VAREHJA BUHT LABAHK! LIEKU ";P1
350 GO TO 370
360 PRINT "LIELISKI !!!  MALACIS !!!  LIEKU PIECI !!!"
370 PRINT  \ PRINT
375 \
380 PRINT "JA GRIBI TURPINAHT, IEVADI 1" \ INPUT Z
390 IF Z=1 THEN 80
400 PRINT  \ PRINT " DARBA BEIGAS. UZ REDZEHSHANOS!"
410 STOP
420 END

— Paskatīsimies, kā tu taisies bērnus mocīt. Šis jaunais operators REM man ļoti patīk: nav par to sevišķi jādomā, viss tāpat ir skaidrs. Bet tas cikla operators — rindā 40 — tur ir ko padomāt! Oho! Un vēl trīs operatori vienā rindā!

Ilustrācija

— Nekas sevišķs. Šis cikls uz ekrāna izvada 24 tukšas rindas. Vārdu sakot, attīra ekrānu, jo tam ir tieši 24 rindas.

— Tā, tālāk ir mīļa papļāpāšana. Iemidzina bērna modrību. Tā vajag! Kaut kas sākas rindā 80: ievada piemēru skaitu. Un jau nākamajā rindā to salīdzina ar 5...

— Tas ir tāpēc, lai pārbaudītu ievadu. Ievads vienmēr ir jāpārbauda. Vai maz kur cilvēks var kļūdīties. Šajā vietā, manuprāt, pareizais piemēru skaits ir no 5 līdz 100. Ja lietotājs kļūdas dēļ vai tīšuprāt ievada citu skaitli, es to nomainu vai nu ar 5 rindā 100, vai arī ar 100 rindā 130.

— Skaidrs! Sak, tu, «mazais draugs», vari ievadīt, cik gribi, bet es pateikšu, cik «njemsim». Tas tiešām izskatās pēc pedagoģijas.

— Bet tas taču ir saprātīgi: neņemt pārāk daudz un neņemt tikai vienu vai divus piemērus!

— Ir jau, ir. Es tāpat vien. Nav jau klase, kur jāsēž mierīgi. Skatāmies tālāk. Rinda 140 ir pilnīgi saprotama. Šeit tu gribi bērnu nobaidīt. Rindā 150 mainīgajam K tu piešķir vērtību 0. Kas bija K? Skatāmies piezīmēs sākumā. Kļūdu skaits. Ahā! Pašā sākumā kļūdu vēl nav, tāpēc kļūdu skaits ir nulle. Tālāk nāk cikls... Sākas rindā 160...

Interesanti, kur gan tas beidzas? Rindā 280. Un šajā ciklā viss acīmredzot arī notiek. Bet kas tas — rindā 170? Nekā nesaprotu.

Gadījumskaitļu ģenerators — funkcija RND

GADĪJUMSKAITĻI— Šeit parādās jauna iebūvētā funkcija, kura dod gadījumskaitļus. Tās apzīmējums ir RND, kas ir saīsinājums no angļu vārda random — to izrunā «rendom», un tas nozīmē «uz gadījumu attiecīgs, ar gadījumu saistīts». Nu ir īstais brīdis parunāt par gadījumskaitļiem. Visvienkāršākais veids, kā tādus iegūt, ir mest spēļu kauliņu. Daudzkārt metot, visi skaitļi no viena līdz seši uzkritīs gandrīz vienādi bieži. Bet to, kāds skaitlis uzkritīs katrā reizē, protams, pateikt nevar. Vienīgais, ko var pateikt, ir tas, ka jebkura skaitļa uzkrišanas varbūtība ir viena sestdaļa.

— Bet gadījumskaitļi? Kas tad ir gadījumskaitļi?

— Ja, metot kauliņu, mēs pierakstīsim skaitļus, kas uzkrīt, tad arī iegūsim vienmērīgi sadalītus gadījumskaitļus: 2, 3, 1, 5, 4, 3, 2, 1 utt.

Bet tagad iedomājies metamo kauliņu, kuram ir divdesmit skaldnes un uz skaldnēm — skaitļi no viens līdz divdesmit. Metot šo kauliņu un pierakstot uzkritušos skaitļus, tu dabūsi vienmērīgi sadalītus naturālos gadījumskaitļus no 1 līdz 20.

Gadījumskaitļa izvēle
Gadījumskaitļa izvēle

Bet atgriezīsimies pie funkcijas RND, kura, starp citu, no citām funkcijām atšķiras ar to, ka tai nav argumenta. Izsaukdami šo funkciju, iegūstam gadījumskaitļus, kas vienmērīgi sadalīti intervālā no 0 līdz 1.

— Nē, to es nesaprotu.

— Labi, mēģināšu vienkāršāk. Kad es izsaucu šo funkciju, tad tā piever acis un ar asu zīmuli biksta intervālā no 0 līdz 1. Un trāpa kādā skaitlī, piemēram, 1070,76812. Nākamreiz tā trāpa pavisam citā skaitlī, piemēram, 0,38631. Pie tam jebkurā vietā tā trāpa ar vienu un to pašu varbūtību. Nav tā, ka tai gribētos iebikstīt tuvāk vieniniekam vai tuvāk pusei — 0,5.

Ilustrācija

Citiem vārdiem sakot, ar funkciju RND mēs mašīnai liekam «iedomāties» vienu skaitli no 0 līdz 1.

— Beidzot es sāku saprast.

— Varbūt sapratīsi vēl labāk, ja uzzināsi, kāpēc tas man ir vajadzīgs.

Kādēļ vajadzīgi gadījumskaitļi!

Es gribu it kā izgatavot metamo kauliņu ar deviņām skaldnēm, lai man būtu gadījumskaitļi no 1 līdz 9, kurus likšu skolēnam sareizināt. Bet tāda kauliņa nav un nemaz nevar būt. Tāpēc es intervālu no 0 līdz 1 sadalu deviņās vienādās daļās un funkcijai RND ļauju «durt» šajā intervālā. Ja tā trāpa piektajā daļā, tad es saku, ka man ir uzkritis piecnieks, ja trešajā, tad trijnieks un tā tālāk. Funkcija RND man dod skaitli S starp nulli un vieninieku, 108tā ka atliek tikai noteikt, kurā no deviņām intervāla daļām tas atrodas. To dara šādi: šo skaitli izdala ar vienu devītdaļu un uzzina, cik devītdaļas tajā ieiet. Piemēram, ja S=0,76812, tad, dalīdami ar 1/9 jeb, kas ir tas pats, reizinādami ar 9, dabūsim 6,91308. Tātad šis skaitlis atrodas aiz sešām devītdaļām, bet tuvāk par septiņām devītdaļām — septītajā intervālā.

Kauliņus var uzmest ar funkciju RND
Kauliņus var uzmest ar funkciju RND

Kā atrast šo septītnieku vai, sliktākajā gadījumā, sešinieku? Šeit palīgā nāk funkcija INT, ar kuru mēs jau esam pazīstami. Pasaki — kāda ir veselā daļa no 6,91308?

— Nu, seši taču.

— Lai izrēķinātu, kurā intervāla [0;1] daļā ir trāpīts, vajag izdarīt ļoti maz — pie šīs veselās daļas pieskaitīt vieninieku. Tas tiek darīts rindā 170. Un arī rindā 200, kur notiek otrā skaitļa izvēle. Atkārtoju, ka, katrreiz no jauna izmantodami funkciju RND, mēs iegūstam jaunu gadījumskaitli. Pilnīgi tāpat mēs izrīkotos arī gadījumā, ja vajadzētu veselu gadījumskaitli, nevis no 1 līdz 9, bet gan no 1 līdz N. Tad skaitļa 9 vietā mums būtu mainīgais N, kuram savlaicīgi esam piešķīruši vajadzīgo vērtību.

— Bet tu esi par tālu aizskrējis. Es tā arī nesapratu, kas notiek rindā 180. Ā! Šeit tu iegūto skaitli salīdzini ar vieninieku, un, tā kā vieninieki tev nepatīk, tad gadījumā, ja mainīgā A vērtība ir viens, tu to pārveido par septiņi.

— Un pilnīgi to pašu es daru arī ar mainīgo B. Skaties rindas ar numuriem no 200 līdz 220.

— Labi. Un rinda 230 acīmredzot no nabaga bērna grib uzzināt, kāds tad īsti ir reizinājums.

— Jā gan. Bet neskrien tik ātri, šo rindu, manuprāt, ir vērts papētīt. Vai redzi atstarpi pēc CIK IR, tāpat arī pirms un pēc REIZ? Tas tāpēc, ka mainīgo A un B vērtības tiek izvadītas uzreiz pēc CIK IR un REIZ, — vai redzi semikolus pirms un pēc A un B? Šeit ir vēl kāds sīkumiņš: pēc B vērtības izvadām atstarpi, jo nākamais ir operators INPUT, kurš tajā pašā rindā parādīs jautājumzīmi. Un būs glītāk, ja šo jautājumzīmi un B vērtību atdalīs atstarpe.

Starp citu, to jautājumzīmi operators INPUT rāda vienmēr, atcelt tās rādīšanu nevar, un tāpēc izvadā pirms INPUT es lietotājam parasti uzstādu jautājumus. Kā šajā gadījumā: CIK IR. Nevis ATRODI vai kaut ko citu.

109— Nu labi. Atbilde ir ievadīta, un tu to salīdzini ar pareizo rezultātu rindā 250.

— Ja viss ir pareizi, es veidoju nākamo piemēru. Pie tam, kā redzi, es eju uz operatoru NEXT, lai tas palielinātu cikla mainīgo — piemēru skaitītāju — un vispār lai cikla operators darbotos tā, kā vajag.

— Un, ja atbilde ir nepareiza, tad palielini izdarīto kļūdu skaitu un izvadi nepatīkamu ziņojumu.

— Arī pareizo atbildi. Lai cilvēks zina.

— Tagad cikls tā kā būtu beidzies, visi piemēri ir aplūkoti un mēs atrodamies rindā 290. Kas bija K? Kļūdu skaits. Pārbaudām, vai kļūdu skaits ir nulle... Ja nulle, tad ejam uz rindu 360, bet, ja nav... Ahā, tiek izvadīts gan pareizo, gan nepareizo atbilžu skaits, vai ne?

— Pilnīgi pareizi.

— Un kas ir tas P1 rindā 310? Vai atzīme? Un tā tu aprēķini atzīmi?!

Atzīmes tik un tā ir jāliek!

— Jā. Pareizo piemēru skaitu es izdalu ar visu piemēru skaitu un uzzinu, kāda daļa no piemēriem bija pareiza. Un tagad gribu uzzināt, cik piektdaļas no visiem piemēriem ir bijušas pareizas. Mana vērtēšanas sistēma ir šāda: ja cilvēks zināja 4/5 piemēru, lieku viņam četri, ja 3/5, tad trīs un tā tālāk līdz vieniniekam. Tāpēc pareizo piemēru daļu es dalu ar vienu piektdaļu — tāpat, kā darīju, kad meklēju gadījumskaitli no 1 līdz 9. Tā es iegūstu atzīmi, bet tikai ar decimāldaļām aiz komata, piemēram, 2,8 vai 4,6. Ja no šā skaitļa es paņemšu veselo daļu, atzīme būs zemāka. 2,8 vajadzētu noapaļot 110uz 3, bet skolēns saņems divnieku, 4,6 vajag noapaļot uz 5, bet iznāks četrinieks. Lai tā nenotiktu, es vēl pieskaitu 0,5.

Kādu atzīmi viņš man ieliks?...
Kādu atzīmi viņš man ieliks?...

— Ļoti laipni no tavas puses.

— Un vēl kas. Ja pareizu atbilžu bērnam ir ļoti maz vai nav nevienas, tad atzīme var iznākt nulle, kas mūsu skolā nav paredzēts. Tāpēc rindas 320 un 330 šajā gadījumā P1 vērtību pārveido par 1. Un tad nāk...

— Tad nāk pati atzīme. Tas ir brīnišķīgi! Es runāju par izteicienu «varēja būt labāk»! Tas skaidri apliecina, ka elektroniskais skaitļotājs var būt skolotāja lomā. Ja kāds par to vēl šaubījās, tad, ieraudzījis šo frāzi uz ekrāna, pārliecināsies, ka skaitļotāji tiešām var aizstāt skolotājus.

— Nezinu, man gan liekas, ka skaitļotājs skolotājam var tikai mazdrusciņ palīdzēt, šādus tādus sīkumus pamācīdams.

— Beisikān, tu taču visu uztver bezjēdzīgi nopietni! Es lieliski saprotu, ka mašīna nevar aizstāt skolotāju, pat nedrīkst, jo kurš tad gribēs kaitināt mašīnu! Un vai tad mašīnai varēs iestāstīt, ka tev vakar vakarā drausmīgi sāpēja galva un tu nevarēji iemācīties reizrēķinu un tāpēc cāli likt tev nedrīkst.

— Atgriezīsimies pie programmas.

— Nekas tur daudz vairs nav palicis. Rinda 360 izvada... Kad tad tā izvada? Ā-ā! Uz šo rindu atnāk no rindas 290, ja kļūdu nav vispār. Un pēc tam jautājums, vai turpināt. Tas nu ir kā vienmēr.

— Un tagad...

— Tagad vajag atpūsties. Nemaz nebija tik vienkārši šos tavus gara darbus pētīt. Drāžam uz pagalmu patrakot. Es tikai paķeršu badmintona raketes.

14.

Galvenais ir uzskaite

No sportošanas atgriezušies, Maija un Pēcis sparīgi ķērās pie darba, jo Maijai šoreiz gribējās beigt agrāk: pa televizoru bija gaidāms Raimonda Paula koncerts.

111— Labāk vis nesteigsimies. Neesam jau nekādi dzimtcilvēki. Nepabeigsim šodien, turpināsim rīt.

— Vai zini, Pēci, tava izcili pareizā domāšana dažreiz izverd pavisam nepareizas idejas. Jebkurš klases audzinātājs, gan elektroniskais, gan šitas... ē... fizioloģiskais, tev pateiks, ka sāktais darbs ir jāpabeidz.

Ko bērniem vēl var mācīt!

— Vienalga, nav ko tukšu pļāpāt. Tagad «pārdomāsim» pēdējo programmu, kas bērniem mācīja reizrēķinu. Vai tu, piemēram, ņemtos sastādīt tādu programmu, kas maziem bērniem mācītu saskaitīt skaitļus pirmā desmita robežās?

Ilustrācija

— Bet vai to tavu reizrēķina programmu drīkst skatīties?

— Apžēliņ! Vai tad tas ir kāds kontroldarbs! Programmēšanā tu drīksti skatīties, ko vien vēlies. Galvenais, lai programma būtu gatava. Vispār nē, arī programmēšanā varētu būt kontroldarbi, bet šoreiz tas nav kontroldarbs.

— Ja tā, tad es, protams, sastādītu. Visos izvadtekstos, kur kaut kas ir teikts par reizrēķinu, es attiecīgi ieliktu visu par saskaitīšanu nepieciešamo, un tad vēl, lai ievadīto rezultātu varētu salīdzināt ar pareizo, pēdējo es aprēķinātu, abus skaitļus nevis reizinot, bet gan saskaitot.

— Labi. Bet kā ar saskaitīšanu simta robežās?

— Simta robežās? Tas būs grūtāk. Tur ir jāsaprot, ko tu dari ar funkciju RND.

— Jā gan, bet, ja arī nesaproti, tad tikai paturi prātā: ja tev vajadzīgs reāls gadījumskaitlis intervālā no nulles līdz X, tad raksti šādi: X*RND.

Bet, ja vajadzīgs vesels skaitlis intervālā no 1 līdz N, jāraksta šādi:

INT(N*RND)+1.

— Bet vai gadījumskaitļus pirmā simta robežās es varēšu dabūt pēc izteiksmes

A=INT(100*RND)+1?

— Protams.

— Tad jau es to programmu varēšu sastādīt! Vēl 112vairāk! Es pat apņemos ar tiem nabaga bērniem atkārtot atņemšanu pirmā simta robežās.

— Tas gan nebūs tik vienkārši. Ko tu darīsi, ja gadījumskaitļu starpība būs negatīva? Mazi bērni par negatīvajiem skaitļiem nekā nezina!

— Jā, ko lai daru?... Varbūt šajā gadījumā skaitļus apmainīt vietām?

— Vari droši to darīt. Bet vispirms es tev pastāstīšu, kā to dara. Uzreiz vari arī neiedomāties. Ja divu mainīgo A un B vērtības jāapmaina vietām, tad ņem talkā palīgmainīgo, piemēram, C. To dara šādi:

C=A
A=B
B=C
Ilustrācija

Bet šāda mainīšana vietām nav vienīgā iespējamība. Vēl varētu ņemt nākamo skaitļu pāri. Agri vai vēlu atradīsies tādi divi skaitļi, kurus atņemot iznāks pozitīvs skaitlis. Jā, un programmā būtu jāieliek vēl viena pārbaude: vai izraudzīto skaitļu starpība nav mazāka par nulli?

— Kaut ko varētu iesākt arī ar dalīšanu.

— Domāju gan. Piemēram, lai bērns noteic, cik reizes otrais skaitlis ieiet pirmajā un kāds ir atlikums.

— Kā lai to izdara?

— Reiz mēs to jau darījām. Kad algu no kapeikām pārvērtām rubļos. Tad mēs noteicām, cik reizes attiecīgajā skaitlī ieiet simts un kāds ir atlikums. Vai atceries, tev vēl tas likās ļoti vienkārši.

— Nu, nu... Vienalga, mazliet jāpadomā.

113— Padomāt vajag vienmēr. Vispār šī programma var kalpot par pamatu programmām, kas atkārto dažādas formulas. Piemēram, kā minūtes pārvērst sekundēs vai otrādi, diennaktis stundās vai otrādi, metrus kilometros vai otrādi un tā tālāk, un tā joprojām.

— Šķiet, ka tādas pārvēršanas programmas pat būtu vienkāršākas, jo tur vajadzīgs tikai viens gadījumskaitlis.

— Kā tad! Bet, ja būtu vajadzīgi kaut vai trīs, arī tad nebūtu nekas briesmīgs. Funkcija RND tos izsniegtu bez aizķeršanās. Vēl būtu vērts padomāt par to, kā uzlabot apmācības metodiku. Programma varētu sekot līdzi, kādi piemēri bērnam ir grūtāki: ja, teiksim, viņam slikti padodas reizināšana ar septiņi, tad biežāk dotu piemērus ar septiņnieku. Vai arī tos piemērus, kur viņam bija kļūdas, pēc kāda laika liktu rēķināt atkal. Varētu vēl vākt ziņas par to, kādi piemēri bērniem vispār ir paši grūtākie. Tāda programma būtu krietni vien sarežģītāka.

— Bet tev, liekas, bija vēl kāda programma, ko mēs varētu paskatīties.

Veikals skaitļotāja atmiņā

— Jā, un šī programma risina pavisam citādu problēmu. Iedomājies audumu veikalu, kur kāds audums ir vairākos baķos. Pārdevējas drēbi griež no visiem baķiem, un viņām ir svarīgi zināt, cik katrā baķī ir atlicis. Lai pāri nepaliktu pārāk mazi auduma gabali, kurus pārdot nevarēs un kuri būs jānoceno vai jānoraksta.

Ilustrācija

— Ko tad pārdevēja var darīt?

114— Viņa var mazliet parēķināt. Ja, piemēram, no baķa ir atlikuši trīs metri, tad pārdevēja var nogriezt trīs reizes pa metram, tas ir, ļoti īsām biksēm, vai arī divas reizes pa pusotram metram, tas ir, ļoti garām biksēm. Ja viņa nogriezīs metru divdesmit, tad paliks metrs astoņdesmit — un to neviens nepirks. Nāksies nogriezt, piemēram, metru četrdesmit, un četrdesmit centimetru atgriezums paliks nepārdots. Tāpēc metrs divdesmit ir jānogriež no cita baķa.

— Acīmredzot tu reti iegriezies veikalos. Tādās reizēs pārdevējas saka: te mums ir metrs astoņdesmit, pērciet visu — mēs nost negriežam.

— Mēs taču modelējam kulturālas apkalpošanas veikalu. Jeb, ja tev tā patīk labāk, spēlējam tādus veikalus, kur pircēja vēlēšanās ir likums.

— Lai tā būtu. Un ko tu šeit vari palīdzēt?

— Neko daudz. Varētu izgudrot tādu algoritmu, kas, zinādams, cik bieži kāda garuma gabalus pērk, pārdevējām pateiktu priekšā, no kura baķa prasītais gabals jāgriež. Bet tādu algoritmu es nezinu. Pamēģini tu to izdomāt! Es tikai varēju sastādīt programmu, kas uzskaita, cik drēbes katrā baķī ir atlicis. Šai programmai ir četri režīmi. Pirmais ir sākumrežīms, kur mašīnā tiek ievadīti sākotnējie baķu garumi. Otrajā — pamatrežīmā — baķu garumi tiek mainīti, norādot, no kura cik ir nogriezts. Trešajā režīmā parāda, cik auduma katrā baķī ir atlicis, un pēdējais režīms beidz darbu. Arī programma, protams, ir sadalīta četrās daļās, kuras ir samērā vienkāršas, un es pat nezīmēšu tām blokshēmas. Uzreiz sāksim ar pašu programmu!

10 REM PROGRAMMA UZSKAITA DREHBES DAUDZUMU BAKJOS
20 REM G - BAKJU GARUMI, B - TO SKAITS, A - TEKOSHAIS
30 REM ATGRIEZUMA GARUMS, N - TEKOSHAIS BAKJA NUMURS
35 \
40 DIM G(50) \ D1=50 \ REM D1 - MAKSIMAHLAIS BAKJU SKAITS
50 REM RINDA' #40 JAHNOMAINA D1 VEHRTIHBA GADIHJUMA',
52 REM JA BAKJU VAR BUHT VAIRAHK NEKA' 50
55 \
60 PRINT "CIK DAUDZ IR BAKJU"; \ INPUT B
70 IF B<=D1 THEN 90
80 PRINT "TIK DAUDZ NEVAR, JAHNOMAINA RINDA #40" \ STOP
85 \
90 PRINT "DARBA REZHIHMI:"
100 PRINT "         1 - BAKJU GARUMU UZDOSHANA"
110 PRINT "         2 - ATGRIEZUMU GARUMA IEVADE"
120 PRINT "         3 - BAKJU GARUMU PARAHDIHSHANA"
130 PRINT "         4 - DARBA BEIGAS"
140 PRINT " KURSH REZHIHMS"; \ INPUT R \ PRINT
145 \
150 ON R GO TO 160,220,370,460
155 \
160 PRINT "UZDODAM BAKJU SAHKOTNEHJOS GARUMUS" \ REM111111
170 FOR I=1 TO B
180 PRINT "KAHDS IR BAKJA #";I;" GARUMS (METROS)";
190 INPUT G(I)
200 NEXT I
210 GO TO 90
215 \
220 PRINT "ATGRIEZUMU GARUMA IEVADE" \ REM2222222222222222
230 PRINT  \ PRINT " JA GABALA NUMURS IR IEVADIHTS  0,"
240 PRINT " TAD TIEK PARAHDIHTI BAKJU GARUMI "
250 PRINT "KAHDS IR BAKJA NUMURS"; \ INPUT N
260 IF N<>INT(N) THEN 280
270 IF N<=D1 THEN 290
280 PRINT "IEVADS NEPAREIZS, ATKAHRTOJIET" \ GO TO 250
290 IF N=0 THEN 370 \  \ REM GRIB PASKATIHTIES GARUMUS
300 PRINT "CIK DAUDZ IR ATGRIEZTS (METROS)"; \ INPUT A
310 A1=G(N)-A \ IF A1>=0 THEN 330
320 PRINT "TIK DAUDZ ATGRIEZT NEVAR" \ GO TO 280
330 IF A1<>0 THEN 350
340 PRINT "BAKJIS #";N;" IR CAURI" \ GO TO 250
350 G(N)=A1 \ PRINT "BAKJI' #";N;" PALIEK ";A1;" METRI"
360 GO TO 250
365 \
370 PRINT " BAKJU GARUMU PARAHDIHSHANA" \ REM3333333333333
380 PRINT "KAHDS IR PARAHDAHMO BAKJU MAKSIMAHLAIS GARUMS";
390 INPUT M
400 FOR I=1 TO B
410 IF G(I)=0 THEN 440 \  \ REM VAI BAKJIS IR CAURI ?
420 IF G(I)>M THEN 440 \  \ REM VAI BAKJIS NAV PAR IHSU ?
430 PRINT "BAKJI' #";I;" IR ";G(I);" METRU"
440 NEXT I
450 GO TO 90
455 \
460 PRINT "            DARBA BEIGAS" \ REM4444444444444444
470 STOP
480 END

— Tā gan ir milzīga programma!

— Kur nu! Milzīga būtu tūkstošreiz garāka.

— To tu man varēji pateikt pašā sākumā, un es nemaz nebūtu ķērusies pie šitās programmēšanas. Tūkstošreiz garāka programma! Uz tādiem varoņdarbiem es neesmu spējīga.

— Neviens nav spējīgs. Ļoti lielas programmas sastāda vairāki programmisti, esot 116pat programmistu brigādēs, kurās ir vairāki simti programmistu un visi darbojas ap vienu lielu programmu.

— Tu mani nomierināji. Paldies.

— Tātad, kā vienmēr, programmas sākumā ir piezīmes. Lai zinātu, kādi ir svarīgākie mainīgie. Pati programma sākas ar rindu 40, kurā ir aprakstīts masīvs G ar baķu garumiem. Pieņemam, ka veikalā nav vairāk par piecdesmit baķiem, un, kas ir ļoti svarīgi, tie ir sanumurēti.

— Ja runa ir par viena auduma baķiem, tad tev laikam ir taisnība, bet vispār jau jābūt vairāk.

— Runa nav par viena auduma baķiem, tikpat labi var būt arī dažādi audumi. Ja uzskaite jāizdara vairāk nekā piecdesmit baķiem, tad rindā 40 iekavās pēc G, kā arī D1 vērtības piešķires operatorā skaitlis 50 jānomaina pret vajadzīgo skaitli.

— Jā, es jau redzu, ka nākamajā rindā tu ievadi patieso baķu skaitu B un uzreiz to salīdzini ar D1. Un, ja baķu ir vairāk, programma izvada ziņojumu, ka rinda 40 ir jāmaina.

— Ar rindu 90 sākas jauna ziņojumu izvade. Lietotājam tiek pateikts, kādi režīmi var būt, un piedāvāts izvēlēties vajadzīgo režīmu jeb, citiem vārdiem sakot, ievadīt vajadzīgā režīma numuru. To visu, ceram, tu saproti labi. Neskaidrības tev var rasties rindā 150. Te parādās jauns operators — aprēķināmās pārejas operators ON. Šo vārdu izrunā «on», un tas nozīmē «uz», kaut gan mēs to tulkosim «atbilstoši».

Vēl viens pārejas operators

Pats operators izskatās šādi:

ONRGO TO16Ø, 22Ø, 37Ø, 46ØBeisikā
Atbilstošiaritmētiskās izteiksmes vērtībai Rej uzrindām ar numuriem 160, 220, 370, 460Latviski

117Aprēķināmās pārejas operators strādā ārkārtīgi vienkārši. Vispirms tiek pārbaudīta aritmētiskās izteiksmes vērtība, mūsu gadījumā — mainīgā R vērtība. Ja R=1, tad vadība tiek nodota uz rindu, kuras numurs pēc GO TO ir pirmais, mūsu gadījumā — uz rindu 160; ja R=2, tad uz to rindu, kuras numurs ir otrais, un tā tālāk.

Ja šī vērtība ir tāda, ka nekāds rindas numurs nevar sanākt, piemēram, mūsu gadījumā 100 vai —2, tad tiek izvadīts ziņojums par kļūdu un — kas ir daudz šausmīgāk — programma pārtrauc darbu. Šā iemesla dēļ manai programmai tūdaļ vari uzrādīt nopietnu trūkumu: tā nepārbauda, vai ievadītā R vērtība ir robežās starp viens un četri. Ja pārbaudītu un atrastu, ka lietotājs ir kļūdījies, ievadi varētu atkārtot.

Ilustrācija

Lai tev neliktos, ka šis operators ir kaut kas gluži jauns, uzraksti to ar operatora IF palīdzību.

— Man ir jā-pa-pa-pa-pa-pa-domā... Vai lai pārrakstu to pašu operatoru ON?

— Jā. Nesāksim jau sacerēt citu speciāli taviem vingrinājumiem.

— Labi, labi. Tūlīt. Sāksim ar rindu 15Ø.

15Ø IF R=1 THEN 16Ø

151 IF R=2 THEN 22Ø

152 IF R=3 THEN 37Ø

153 IF R=4 THEN 46Ø

— Pilnīgi pareizi. Un tagad mēs varam pētīt pirmo režīmu — baķu sākotnējā garuma uzdošanu.

Kas jādara darba sākumā

— Programmā tas tev ir atzīmēts. Pirmais režīms ir rindās no 160 līdz 210.

— Un sastāv no viena cikla pa visiem baķiem. Šajā ciklā mēs noskaidrojam, kāds ir katra baķa garums, un šos garumus ievadām masīvā D.

— Un uz kurieni tiek nodota vadība, ja visu baķu garumi ir ievadīti? Ahā, skaidrs! Uz jauna režīma izvēli. Kāda gan šeit var būt izvēle? Jāiet taču uz atgriezumu garuma ievadi!

— Visbiežāk, protams, uz otro režīmu. Bet ja nu kaut kas gadās, varbūt lietotājs grib ievadīt no jauna, jo visu ir saputrojis, varbūt grib paskatīties un pārbaudīt, kas ir ievadīts, varbūt viņam viss jau ir apnicis un viņš grib beigt?

Kas jādara pēc katra pirkuma

— Un tas otrais režīms ir rindās ar numuriem no 230 līdz 360. Garš gan.

— Tāpēc ka ievads ir jāpārbauda un pārbaudes vienmēr stipri pagarina programmu. Bet programmēt bez pārbaudēm man neļāva. Pārbaudēm jābūt, un cauri!

— Kāpēc tik dīvaina izvade rindās 230 un 240?

— Iedomājies situāciju: cilvēks ievada un ievada atgriezto gabalu garumus, bet te viņam sagribas paskatīties, cik katrā baķī ir atlicis. Un tad viņš ievadīs gabala numuru — nulli, kas nozīmēs, ka jāparāda baķu garumi. Bet, lai lietotājs to zinātu, tad, sākot darbu otrajā režīmā, par to tiek izvadīts ziņojums. Tieši rindās 230 un 240.

— Tālāk seko jautājums: kāds ir baķa numurs? Acīmredzot tā baķa, no kura tika nogriezts. Tas tiek ievadīts. Un tad — tiek salīdzināts baķa numurs ar tā paša numura veselo daļu! Interesanti būtu zināt: kāpēc?

— Te jau sākas pārbaudes. Baķa numuram jābūt veselam skaitlim. Bet veselam skaitlim veselā daļa sakrīt ar pašu veselo skaitli. Tā var pārbaudīt, vai ievadīts ir vesels skaitlis.

— Kāpēc gan tādi sīkumi būtu jāpārbauda? Kurš gan ies numuru ievadīt kā daļskaitli?!

119— Vairāk pieredzējuši programmisti apgalvo, ka šajā vietā tas var gadīties. Cilvēkam gribas ievadīt pēc iespējas ātrāk, un steigā viņš numura vietā ievada atgriezuma garumu.

— Tagad gabala numurs tiek salīdzināts ar nulli. Lai uzzinātu, vai nav jāiet uz parādīšanas režīmu. Ja nav jāiet, tad ievada atgrieztā gabala garumu un aprēķina, cik drēbes baķī ir atlicis, un šo atlikumu salīdzina ar nulli. Ahā, lai rindā 320 izdrukātu «tik daudz atgriezt nevar», ja grib nogriezt vairāk, nekā ir baķī.

— Bet tagad iedomājies: cilvēks ir kļūdaini ievadījis atgriezuma garumu kādam baķim — 1,45 metri — un pēkšņi attopas, ka tas bija nevis 1,45 metri, bet gan 1,54 metri. Izlabot var ļoti vienkārši: no tā paša baķa atgriež mīnus 1,45 metrus, t. i., patiesībā pieskaita 1,45 metrus, un pēc tam atņem vajadzīgos 1,54 metrus. Nebijusi šāda iespēja, man nāktos veidot vēl vienu režīmu — labošanas režīmu.

Algoritmam jāprot labot kļūdas
Algoritmam jāprot labot kļūdas

— Tu gribi teikt, ka kļūdīties ir cilvēcīgi un tas programmistam ir jāzina un jāparedz, lai zinātu, kas šajā gadījumā būtu darāms.

— Tālāk pārbaudu, vai atlikuma garums nav vienāds ar nulli, tas ir, vai šis baķis nav jau pārdots. Tad es to paziņoju lietotājam. Ja ne, tad baķa garumam rindā 350 piešķiru šo jau izrēķināto atlikumu. Un pieprasu jaunu baķa numuru.

— Līdz ar to šis režīms beidzas, un rindās 380 — 450 varam sākt skatīties jaunu — parādīšanas — režīmu. Kas tas par parādāmo baķu maksimālo garumu rindā 380?

— Pilnīgi visi baķi lietotāju, protams, neinteresēs. 120Viņam darba gaitā var ievajadzēties uzzināt tikai to baķu garumus, kuri ir tuvu beigām. Piemēram, īsāki par diviem vai trim metriem. Protams, var painteresēties arī par visu baķu garumiem, M uzdodot lielāku par vislielākā baķa garumu. Teiksim, 5000 metru lielu.

Ilustrācija

— Skaidrs. Tālāk tev ir cikls pa visiem baķiem, un izskatās, ka pārdoto baķu garumu tu nemaz netaisies rādīt.

— Jā, un tieši tāpēc rindā 410 katra baķa garumu salīdzinu ar nulli.

— Nākamajā rindā baķa garumu tu salīdzini ar šo maksimālo garumu un apej rādīšanu, kas tev ir rindā 430. Lieliski! Un, kad visu esi parādījis, aizej uz jauna režīma izvēli.

— Tas varbūt arī nebūtu vēlams: ja esmu aizgājis uz baķa garuma rādīšanu atgriezumu ievades laikā, tad lietotājam ērtāk būtu atgriezties atpakaļ uz otro režīmu. Bet kā lai viņš tad beidz darbu? Tagad, pārejot uz režīmu izvēli, lietotājs var uzdot ceturto režīmu.

Par datiem un to apstrādi

Negribu lielīties, bet šī programma, salīdzinot ar iepriekšējām, jau ir daudz tuvāk īstajām vajadzīgajām programmām. Tādas mēdz būt tā sauktās datu apstrādes programmas. Un dati šeit ir gan baķu garumi, gan arī atgriezumu garumi.

— Bet vai kaut ko līdzīgu taviem baķiem var izdomāt?

— Es domāju, ka var. Grūtākais ir izdomāt, kur varētu būt kaut kas līdzīgs baķu pārdošanai bez atlikumiem. Varbūt stacijā, kur pienāk vagoni ar maisiem, kastēm vai konteineriem un tos izkrauj automašīnās ar dažādu vestspēju, pie tam lāgā nezinot, kādas automašīnas atbrauks. Tad būs svarīgi, lai vagona izkraušanas beigās nepaliek atlikumi, kas ir stipri mazāki par vienas mašīnas vestspēju.

— Nekas briesmīgs nenotiks. Mašīnā iekraus to, kas ir palicis pāri, tā brauks pie nākamā vagona, un tur mašīnā iekraus, cik vajag.

— Bet vai par liekiem darbalaika zudumiem tu 121nepadomāji? Mašīnai jābraukā apkārt, jāgaida, kamēr atbrauc celtnis, kamēr attaisa vagonu, un vēl nezin kas!

Daudz vairāk piemēru varam atrast, ja atlikumi mūs neuztrauc. Piemēram, mūsu programma varētu aprakstīt kaut kādu krājumu sadalīšanu noliktavā. Tur ir dažādu preču krājumi; mēs preces sanumurējam, sākotnējo daudzumu ievadām mašīnā un, kaut ko no noliktavas izsniedzot, to no šī sākotnējā daudzuma atņemam. Vai arī cits gadījums. Iedomājies, ka tu saņem algu un uzreiz sadali naudu ēšanai, frizierim, saldējumam...

— Nu nē! Tā gan es nedarīšu. Es uzreiz visu iztērēšu, un tad jau redzēs.

— Ticu. Bet, ja tu tā nedarītu, tad katrreiz, par kaut ko izdevusi naudu, varētu skriet uz mašīnu un ievadīt, cik un par ko ir iztērēts.

Ilustrācija

— Vai zini, esmu dzirdējusi, ka uzņēmumu grāmatvedībās tā arī darot. Tur esot stingri noteikts, par ko un cik naudas drīkst tērēt.

— Redzi nu. Un tādus piemērus varētu izdomāt vēl un vēl. Būtiski ir tas, ka mums ir masīvs ar skaitļiem, kuri kaut ko nozīmē, nav svarīgi, ko, un mēs ar šiem skaitļiem kaut ko darām...

— ...nav svarīgi — ko. Labi gan tev sanāk. Kaut ko darām, nav svarīgi — ko. Ar kaut ko, nav svarīgi — ar ko. Kaut kā, nav svarīgi — kā. Kaut kur, nav svarīgi — kur.

— Varbūt es izsakos neskaidri, bet, kad mācās programmēšanu, tad jāsaprot tās līdzība ar matemātiku. Citādi, ka neiznāk tā kā tam mazajam Jānītim, 122kurš, pārnācis no skolas, stāsta tētim, ka šodien viņiem mācīta saskaitīšana. Tētis grib zināt, kā Jānītis to ir apguvis: «Skaties, Jānīti, te man ir divi apelsīni, un es pielieku klāt vēl divus. Cik būs pavisam?» Jānītis domā, domā un saka: «Nezinu. Skolā mēs saskaitījām ābolus.»

— Tā ir veca anekdote.

Ilustrācija

— Veca gan, bet tāpēc ne mazāk pamācoša. Paskaties uz mūsu masīvu šajā programmā! Vai ir kāda nozīme, ka tajā glabājas tieši baķu garumi? Protams, ka nav. Vai arī tam, ka programma ar šiem skaitļiem masīvā izdara atņemšanu? Bet, ja būtu saskaitīšana, — vai tad kaut kas būtiski mainītos? Nekas! Itin nekas! Citiem vārdiem sakot, programmas loģiskā struktūra paliktu nemainīga. Vai arī tā: programmas blokshēma nemainītos. Programmēšanā ne vien nav svarīgi apelsīni vai āboli, bet arī darbības ar tiem: vai tos saskaita, vai atņem, vai ar tiem dara ko citu.

— Nesaprotu, kāpēc jāapspriež kaut kāda saskaitīšana, ja mūsu uzdevumā ir vajadzīga atņemšana.

— Ja tu esi nolēmusi visu savu mūžu risināt tikai šo uzdevumu, tad, protams, nevajag. Bet, ja gribi kaut ko iemācīties, tad padomā un pasaki piemēru, kurā atņemšanas vietā ar masīva elementiem būtu jāveic saskaitīšana.

— Jā, pedagoga ķēriens tev ir. Kā tikai skolēns sāk izrunāties, tā viņam, blauks, uzdevums. Sēdi un domā. Un nepuksti.

— Domā vien, domā.

Vēl par datu apstrādi

— Kas tur ko neizdomāt... Rokā ir! Vai zooloģiskajā dārzā dzīvo ziloņi, lauvas un citi zvēri? Dzīvo. Vai viņi ir jābaro? Ir. Vai tas naudu maksā? Maksā. Es iesaku sastādīt šādu programmu. Katram zvēram, kuram mēs esam piešķīruši numuru, atbilst kāds masīva elements. Divi ziloņi — divi elementi. Četri tīģeri — četri elementi. Un tā tālāk. Kādam zvēram nopirkdami kaut ko paēst, attiecīgā elementa vērtību palielinām. Un mūsu programma ļaus uzzināt, cik katrs zvērs kopš gada sākuma ir apēdis, tas ir, cik naudas viņa dēļ ir iztērēts. Un, ja 123viņš ir apēdis vairāk, nekā vajag, tad tajā dienā ēst nedodam. Un vēl! Mēs taču varam ievadīt, cik dienas kopš gada sākuma ir pagājušas, un aprēķināt vidējo dienas tēriņu katram zvēram.

Vai zvērus var barot ar kompjūteriem?
Vai zvērus var barot ar kompjūteriem?

— No programmēšanas viedokļa tavs piemērs ir nevainojams. Bet no zvēru puses, iespējams, varētu būt iebildumi.

Vispār izdomāt piemērus ar saskaitīšanu ir daudz vieglāk. Te der jebkura darba uzskaite. Brigāžu darba uzskaite, kuras mērķis ir noteikt sociālistiskās sacensības uzvarētāju. Tas pats ar atsevišķiem darba darītājiem, teiksim, ar republikas kombainieriem, konkursa «TV vimpelis meklē īpašnieku» dalībniekiem. Tas pats ar republikas rajonu sacensībām ražas novākšanā vai pionieru posmu sacensībām makulatūras vākšanā.

Vēl labāk būtu, ja programma paredzētu gan saskaitīšanu, gan atņemšanu. Tad preču uzskaite noliktavā būtu pilnīgāka. Preces taču ne tikai izved no noliktavas, bet arī tajā ieved. Tikpat labi varētu aprakstīt, kā strādā krājkases, kur cilvēki naudu gan nogulda, gan izņem. Ar negatīvajiem skaitļiem tas tomēr nav tik dabiski.

Visai manai runāšanai vēl ir jāatklāj dažas problēmas. Pirmā — tā ir cīņa pret kļūdām. Iedomājies: tu atnāc uz krājkasi, lai izņemtu simt rubļu, bet tev pasaka, ka tavā kontā ir mīnus divsimt rubļu un tev krājkasei vēl ir jāpiemaksā, lai nepaliktu parādā. Un tas viss tikai tāpēc, ka kasiere iepriekšējā reizē tavā kontā naudu nevis pieskaitīja, bet gan atņēma.

— Nē, tādu «traģēdiju» nevaru pat iedomāties.

— Nākamā problēma. Šie dati ir jāglabā uz diska, citādi nebūs nekādas jēgas. Piemēram, ar tiem pašiem taviem zvēriem. Mašīnai jādarbojas cauru 124dienu un nakti, atmiņā jābūt tavai uzskaites programmai — un tas tikai tādēļ, lai tu vienreiz dienā atnāktu un ievadītu datus par to, cik kurš ir apēdis? Tas neder. Jābūt tā. Tu atnāc, palaid savu programmu, tā no diska nolasa stāvokli līdz vakardienai, tu ievadi šodienas datus, un mašīna diskā ieraksta šodienas stāvokli. Tas nozīmē, ka tev būs jāmācās par rakstīšanu uz diska. Un vēl viena problēma. Jābūt iespējai informāciju izdrukāt uz papīra. Piemēram, tev ir programma, kas fiksē republikas kombainieru sacensību rezultātus. Tu taču viņus nevedīsi uz skaitļotāju, lai rezultātus parādītu uz ekrāna. Tātad būs vēl jāmācās drukāt. Un to visu mēs darīsim, bet ne nākamreiz. Nākamajai reizei atstāsim citus darbus.

15.

Skaitļotājs — ne tikai skaitļošanai

Nākamo reizi Pēcis bija parūpējies, lai mašīnlaika būtu tik daudz, cik nepieciešams jauno jēdzienu pamatīgai aplūkošanai. Kā vienmēr, viņš sāka ar vispārīgiem pārspriedumiem.

— Daudzi uzskata, ka ESM ir tikai skaitļotājs — mašīna, kas veic skaitliskus aprēķinus, kuri galu galā nav nekas cits kā noteiktā secībā izdarāmas aritmētiskās darbības: saskaitīšana, atņemšana un reizēm reizināšana vai dalīšana. Labums ir tāds, ka ESM šīs darbības veic milzu ātrumā un kļūdās reti. Dažreiz gadās izlasīt, ka kaut kur skaitļotājus izmantojot slimību diagnoscēšanai vai šaha spēlei, un tas izraisa briesmīgu izbrīnu. Programmēt šaha spēli mēs ar tevi, šķiet, varēsim vēl ne tik drīz, bet to, ka ESM nav nekāds milzātrs mikrokalkulators, mēģini aptvert jau tagad.

— Negribu no jums, cienītais, slēpt, ka mana pazīšanās ar šo cilvēces prāta sasniegumu neļauj fiksēt tādas būtiskas atšķirības, par kurām jūs nule atļāvāties izteikties.

— Iespējams, ka tas tev kļūs skaidrāks šodien, kad mēs aplūkosim simboliskos mainīgos.

Simboliskie mainīgie

— Nu, vai zini! Un tu teici, ka nekā jauna vairāk nebūs!

SIMBOLISKIE MAINĪGIE— Protams. Būs tikai vecais. Mainīgie jau bija, simboli bija, tagad būs simboliskie mainīgie, bet vecie mainīgie turpmāk sauksies «skaitliskie mainīgie». Tāda mazītiņa atšķirība. Bet, ja runājam nopietni, tad atšķirība ir; liela vai maza — to pati redzēsi.

— Nu tad sāc.

SIMBOLU VIRKNE— Varbūt sākšu ar to, ka simbolisko mainīgo apzīmē ar burtu un «saulīti», bet vidū vēl var būt arī cipars. Piemēram, A¤, B¤, C1¤ ir pareizie simbolisko mainīgo apzīmējumi, bet nepareizie...

— Nepareizos nevajag. Turpini.

— Simboliskajam mainīgajam vēl ir arī vērtība — viens vai vairāki simboli. Tā sakot, simbolu virkne. Vai šiem simboliem ir kāda jēga vai nav — tas ir tikai programmista ziņā. Mazliet pacieties, tūlīt viss kļūs skaidrāks, kad pateikšu, kāds simbolisko mainīgo gadījumā izskatās piešķires operators. Tas var būt, piemēram, šāds: A¤=«A». Šī rinda nozīmē: simboliskajam mainīgajam ar apzīmējumu A¤ tiek piešķirta vērtība — simbolu virkne, kura sastāv no viena simbola — no burta A. Un iegaumē: simbolisko mainīgo vērtības piešķires operatorā tiek liktas pēdiņās.

Ilustrācija

— Līdzīgs gadījums jau bija operatorā PRINT.

Simbolu izvade

— Pilnīgi pareizi! Par šo operatoru tu ieminējies īstajā brīdī. Simbolisko mainīgo vērtības var izvadīt. Ja tagad ievadītu operatorus... Bet, starp citu, kāpēc gan mēs nevarētu ievadīt!

A¤="A"
PRINT A¤
A

126Redzi nu, ar simboliskajiem mainīgajiem var strādāt tiešajā režīmā, tas ir pirmkārt. Un, otrkārt, viss iznāca, kā vajadzēja: tika izvadīts burts A, kurš ir mainīgā A¤ vērtība, protams, bez pēdiņām. Pamēģināsim vēl!

A¤="MAIJA"
PRINT A¤
MAIJA

Tātad simboliskā mainīgā vērtība tiešām var būt simbolu virkne, ne tikai viens simbols. Izvades operatorā vienlaicīgi var atrasties gan simboliskie, gan skaitliskie mainīgie.

Simbolu virknē var būt tikai 255 simboli!
Simbolu virknē var būt tikai 255 simboli!
A=5
PRINT A¤,A
MAIJA           5

Ceru, ka tagad saproti: ja burtu A mēs izmantojām apzīmējumā A¤, tad tas nenozīmē, ka tajā pašā programmā to nevarētu lietot arī mainīgā A apzīmējumā. Tie ir dažādi mainīgie. Pavisam dažādi.

Bet saki — kāpēc starp vārdu MAIJA un ciparu 5 ir tik liela atstarpe?

— Tu kaut ko stāstīji par zonām.

— Tieši tā. Mainīgo A¤ un A vērtības tika izvadītas 127dažādās zonās, jo operatorā PRINT starp to apzīmējumiem bija komats.

Vienīgā darbība ar simboliem

KONKATENĒŠANAAtšķirībā no skaitliskajiem mainīgajiem, ar kuriem iespējamas veselas četras darbības, ar simboliskajiem mainīgajiem var veikt tikai vienu darbību. Šo vienīgo darbību sauc par konkatenēšanu. Ja vārds tev liekas par grūtu, šo operāciju vari saukt par apvienošanu jeb saķēdēšanu, jeb saplūdināšanu. Bet pati operācija ir pavisam vienkārša: viena pēc otras tiek uzrakstītas simbolisko mainīgo vērtības. Šo darbību apzīmē ar plusu «+». Lūdzu, piemērs.

Pamazām, palēnām — un tā saķēdēsim veselu grāmatu
Pamazām, palēnām — un tā saķēdēsim veselu grāmatu
B¤="SAPRAHTINJA"
PRINT A¤+B¤
MAIJASAPRAHTINJA

— Ha-ha! Triks neizdevās.

— Tūlīt izdosies.

PRINT B¤+C¤+A¤
SAPRAHTINJA MAIJA

READY

128Mainīgā C¤ vērtība ir īpašs simbols — atstarpe jeb tukša vieta. Algoritms to vienreiz nosauca par tuksni un, kad mēs bijām beiguši smieties, paskaidroja, ka tā saukt šo simbolu pilnīgi nopietni iesakot daži valodnieki. Vispār šajā piemērā konkatenēšana diez ko vajadzīga nebija — to pašu var izdarīt arī citādi.

PRINT A¤;C¤;B¤
MAIJA SAPRAHTINJA

Kā salīdzina simbolu virknes

Vēl atliek pastāstīt, kā simboliskos mainīgos var izmantot nosacītās pārejas operatorā. Atšķirīga ir tikai loģiskā nosacījuma rakstība. Pat ne pati rakstība, bet gan apzīmējumu izpratne. Nosacītā pāreja var būt, piemēram, šāda:

40 IF A¤=«BOM» THEN 500.

Šajā piemērā mainīgā A¤ vērtība tiek salīdzināta ar simbolu virkni, kas sastāv no trim burtiem, — BOM. Ja visi simboli sakrīt, tiek secināts, ka nosacījums ir izpildīts un nākamā tiek izpildīta rinda ar numuru 500.

— Skaitliskos mainīgos varēja salīdzināt arī savā starpā un noteikt, kuram vērtība ir lielāka vai mazāka, bet to pašu darīt ar simbolisko mainīgo vērtībām nav jēgas, vai ne?

— Jā. Simboliem nav tādas salīdzināšanas kā lielāks vai mazāks. Taču tos ir iespējams salīdzināt, izmantojot tās pašas zīmes «<», «>», «=<» un «=>», salīdzināt pēc alfabēta.

— Un ko tas nozīmē?

— Tiek noteikts, kura no simbolu virknēm pēc alfabēta ir pirmā un kura otrā. Pieņemsim, ka mēs esam piešķīruši šādas vērtības ar operatoriem: A¤=«ANNA» un B¤=«ZUZANNA». Tad nosacījums A¤<B¤ būs pareizs jeb, runājot precīzāk, patiess. Bet patiess šis nosacījums būs tāpēc, ka vārds ANNA pēc alfabēta ir pirms vārda ZUZANNA.

129Nosacījums A¤>B¤ šajā gadījumā, protams, nebūs patiess, bet B¤>A¤ būs.

Simbolisko mainīgo gadījumā var izdomāt vārdnīcu, kas ir līdzīga tai, kādu mēs uzrakstījām skaitliskajiem mainīgajiem.

BeisikāLatviski
=sakrīt
<>nesakrīt
<alfabētiskajā kārtībā ir pirms
<=alfabētiskajā kārtībā ir pirms vai sakrīt
>alfabētiskajā kārtībā ir pēc
>=alfabētiskajā kārtībā ir pēc vai sakrīt
Ilustrācija

— Tātad šie «pirms» un «pēc» noderēs, kad kaut kādus vārdus vajadzēs sakārtot pēc alfabēta. Bet kad vēl?

Programma divu vārdu sakārtošanai

— Liekas, vairāk nekad. Tagad pamēģini sastādīt šādu programmu. Vārdi tiek ievadīti patvaļīgā kārtībā, bet izvadīti — alfabētiskā. Ņem divus vārdus!

— Labi, pamēģināšu... Bet kā ievada simboliskos mainīgos?

— Ar to pašu operatoru INPUT. Uzraksti tajā to, kas tev jāievada, un — uz priekšu. Mums gan līdz šim bija tikai tādi operatori INPUT, kuri ievadīja pa vienai mainīgā vērtībai. Taču iespējams ievadīt arī vairākas, vienīgi visu ievadāmo mainīgo apzīmējumus vajag uzrakstīt pēc kārtas, tos atdalot ar komatu. Tātad tos divus vārdus vari ievadīt ar operatoru INPUT V1¤, V2¤, kur V1¤ ir mainīgā apzīmējums pirmajam vārdam, bet V2¤ — mainīgā apzīmējums otrajam vārdam.

— Uzreiz es to neizdarīšu. Man vajag pasēdēt pie papīra lapas.

Maija apsēdās pie galda un sāka domāt. Bet viņa domāja pavisam neilgi.

— Vai zini, es sapratu, kas šeit ir darāms! Lūk, mans priekšlikums.

10 PRINT «PROGRAMMA SAKAHRTO 2 VAHRDUS PEHC ALFABEHTA»
20 PRINT «IEVADIET DIVUS VAHRDUS»
30 INPUT S1¤, S2¤
40 IF S1¤>S2¤ THEN 60
50 PRINT S1¤, S2¤
60 PRINT S2¤, S1¤
70 STOP
80 END

— Pastāsti, ko tu te dari.

— Tātad vispirms paziņoju, ko programma dara. Pēc tam lūdzu ievadīt divus vārdus. Tad es šos vārdus ievadu. Rindā 40 tos salīdzinu un, ja pirmais alfabētiskajā secībā ir pēc otrā, tad eju uz rindu 60, kur abus vārdus izvadu, vispirms otro un tad pirmo. Bet, ja, tos salīdzinot, izrādās, ka pirmais ir pirms otrā, tad es vispirms izvadu pirmo un tad otro...

Es tikai savākšu — lai kārto citi
Es tikai savākšu — lai kārto citi

— Un pēc tam? Kas ir pēc tam?

— Jā, kas ir pēc tam... Pēc tam ir vēl kaut kāda rezultātu izvade.

— Jā, kaut kāda izvade.

— Hā! Es iespiedīšu vēl vienu rindiņu.

55 STOP

— Tagad viss ir kārtībā.

— Bet, paklau, kā lai programmas darba laikā tos vārdus ievadu un kā interpretators tos varēs atšķirt?

— Vari darīt divējādi. Pirmkārt, tiklīdz ir parādījusies jautājumzīme, ievadi pirmo vārdu, tūlīt parādīsies vēl viena jautājumzīme, un tad, protams, dod otro vārdu. Vairāk jautājumzīmju nebūs, protams, ja viss būs pareizi. Otrais variants — abus vārdus ievadi uzreiz, tos atdalīdama ar komatu.

131— Man viss ir skaidrs. Es gribu savu programmu sākt ievadīt.

— Labi. Tikai neaizmirsti ievadīt pavēli NEW — tā iztīrīs atmiņu.

Ilustrācija

Šoreiz Maija programmu centās ievadīt ļoti rūpīgi un pat izskatīja tekstu ar pavēles LIST palīdzību. Viss bija it kā pareizi.

— Nu ko, es laižu!

RUNNH

PROGRAMMA SAKAHRTO 2 VAHRDUS PEHC ALFABEHTA
IEVADIET DIVUS VAHRDUS
? ZUZANNA
? ANNA
ANNA          ZUZANNA

STOP AT LINE 70

Urrā, programma strādā!

— Kāpēc tu tā domā?

— Kas te ko šaubīties! Paskaties, tā taču visu izvadīja pareizi!

— Bet tu jau neaplūkoji variantu, kur abi vārdi ir ievadīti pareizā kārtībā.

— Kādēļ?! Kas tad ar tiem var notikt!

— Vienalga, vajag pārbaudīt. Katrs operators ir jāpārbauda, un ne tikai rūpīgi izskatot cauri. Laid vien vēlreiz.

— Ja jau tu vēlies...

RUNNH

PROGRAMMA SAKAHRTO 2 VAHRDUS PEHC ALFABEHTA
IEVADIET DIVUS VAHRDUS
? ANNA
? ZUZANNA
ANNA          ZUZANNA

STOP AT LINE 55

Nu, ko es teicu?! Viss ir pareizi.

16.

Darbs ar vārdiem

132— Ko tu manā nabaga galviņā dzīsi šodien?

— Šodien mēs vēl varētu padarboties ar simboliskajiem mainīgajiem.

— Pēē! Tie man šķiet pavisam garlaicīgi. Un kas tur var būt interesants, ja tos var tikai konkan... konkan... Man drausmīgi patika šis vārds, un ja vēl varētu atcerēties!

— Ar tiem var izdarīt konkatenēšanu.

Ilustrācija

— Es arī saku — tos var konkatenēt.

— Tā neviens nesaka.

— Kā tad neviens, ja es tikko kā pateicu?

— Nu labi, lai būtu. Simbolisko mainīgo konkatenēšanu varbūt nāksies izpildīt daudz retāk nekā citas darbības.

— Bet tu taču teici, ka citu darbību nemaz nav!

— Nav tādu, kas kaut mazliet ir līdzīgas aritmētiskajām darbībām. Bet ar simboliskajiem mainīgajiem var izdarīt citas — īpatnējas darbības.

— Un kādas?

Ko gan visu var izdarīt ar vārdiem!

— Vai zini? Izdomā kaut vienu darbību ar simbolisko mainīgo vērtībām. Ar kādu jaunu darbību tev gribētos bagātināt zinātni?

— Nu... tu mani pārsteidz nesagatavotu. Tas mums nebija uzdots, kā teiktu skolā.

— Tad varbūt tā. Ko tu dari ar vārdiem, kad runā?

— Es tos izsaku... izrunāju...

— Cerēju, ka tu atbildēsi: es tos loku — «vārds», «vārda», «vārdam», «vārdu» un tā tālāk. Tās arī būtu darbības ar vārdu «vārds».

— Kaut kā nepierasti... Darbības ar vārdiem...

— Bet kāds būtu vārda «vārds» locīšanas algoritms? Kā lai to apraksta?

— Vajag sākt ar nominatīvu. «Vārds». Tālāk — ģenitīvs. Nomainām galotni: -s vietā liekam -a — «vārda». Tā, vai ne?

— Es nešaubījos, ka tu to iedomāsies. Bet tagad saki: kas tas ir — nomainīt galotni? Ar kādām darbībām tas ir izdarāms?

133— Vispirms atmetam veco galotni un pēc tam pieliekam jauno.

— Piekrītu. Un tātad beisikā ir paredzētas tādas darbības ar mainīgajiem, kuras ļauj noprogrammēt galotnes maiņu un līdzīgus pasākumus. Ja tu esi izpratusi programmēšanas garu, tad nopratīsi, ka šo darbību nav daudz, bet tās ir tādas, ar kurām iespējams izdarīt visu vajadzīgo. Starp citu, galotnes maiņa nebūt nav vienkārša darbība. Vajag zināt, kas ir galotne, vajag prast to atrast un atdalīt. Bet nekā sarežģīta arī nav, ja vien ir algoritms.

— Vai kaut ko konkrētāku par darbībām ar simboliskajiem mainīgajiem nevari pateikt?

APAKŠVIRKNE— Beisikā darbības ar simboliskajiem mainīgajiem veic funkcijas. Kā tās strādā patiesībā, to mēs paskatīsimies ar mašīnu. Pastāstīšu tikai pašu galveno. Svarīgākais, ko var izdarīt ar šīm funkcijām, ir no simbolu virknes izdalīt apakšvirkni. Protams, tu jautāsi, kas ir apakšvirkne.

— Varbūt virknes daļa?

— Jā, bet, ja tā var teikt, nepārtraukta virknes daļa. Piemēram, apakšvirknes simbolu virknei VIRKNE ir VIRKN, VIRK, VIR, IR, R un vēl vesela virkne citu burtu sakopojumu. Taču tāds sakopojums kā IRNE nebūs apakšvirkne, kaut arī sastāv no sākotnējās virknes simboliem.

Ilustrācija

— Es teiktu, ka tā IRNE ir apakšvirkņu IR un NE kon-ka-te-nā-ci-ja.

— Tiešām! Es par to nebiju padomājis.

— Lūk, tā! Iegaumē, ar ko tev ir darīšana!

— Tātad ir funkcija, kas no virknes izķeksē apakšvirkni, un vēl cita funkcija, kas pasaka, kurā vietā viena simbolu virkne atrodas otrā simbolu virknē. Ja, piemēram, ir dotas divas simbolu virknes VIRKNE un IR, tad šī funkcija noteiks, ar kuru simbolu sākot pirmajā virknē atrodas otrā. Kādam skaitlim šajā gadījumā jāiznāk?

— VIRKNE un IR? Domāju, ka divi.

— Tā arī būs.

— Bet kas būs tad, ja šī otrā virkne vispār neieies pirmajā? Piemēram, otrā ir nevis IR, bet NAV?

— Tad šī funkcija dos vērtību nulle. Tiksim pie mašīnas, tad arī redzēsi.

Nosēdusies pie mašīnas, Maija tūdaļ izsauca beisika interpretatoru.

— Viss kārtībā. Ar kādu funkciju sākam?

Cik virknē ir simbolu!

— Sāksim ar pašu vienkāršāko. Par to es gan tev neko netiku stāstījis. Šīs funkcijas apzīmējums ir LEN, un tā aprēķina simboliskā mainīgā garumu. LEN, starp citu, ir saīsinājums no angļu vārda length — «lengs» — «garums». Tā kā funkcija LEN atrod simboliskā mainīgā vērtības garumu jeb simbolu skaitu mainīgā vērtībā, tad tās argumentam jābūt šim mainīgajam. Šo funkciju mēs uzrakstīsim šādi:

Ilustrācija

A=LEN (A¤).

Mainīgajam A tiks piešķirta vērtība, kas ir vienāda ar simboliskā mainīgā A¤ garumu — simbolu skaitu mainīgā A¤ vērtībā.

— Diezgan runāts. Mašīna stāv un gaida. Iedod tai kādu piemēru.

— Sākumā paskatīsimies tiešajā režīmā.

A¤="SAPRAHTINJA"
A=LEN(A¤)
PRINT A
 11

— Un tagad es.

A¤="BEISIKAHNS"
PRINT A
 11

135O-ho-ho! Šī funkcija taču strādā kļūdaini!

— Vienu mirkli. Trīs, seši, desmit. Kaut kas tiešām nav tā, kā vajag. Ā! Mainīgajam A¤ tu piešķīri jaunu vērtību, bet mainīgajam A — ne. Tāpēc arī tika izvadīta vecā vērtība. Tiešajā režīmā jāstrādā uzmanīgi. Vajadzēja darīt šādi:

PRINT LEN(A¤)
 10

vai arī tā:

A=LEN(A¤)
PRINT A
 10

Tagad viss ir pareizi, bet tu nodomāji nezin ko.

— Es priecājos, ka programmēšanā neko nevajadzēs mainīt.

Ko var atrast simbolu virknē

— Tagad varam aplūkot citu funkciju, kuras apzīmējums ir POS, saīsinājums no angļu position — «pozišn», kas nozīmē «pozīcija». Šī funkcija noteic apakšvirknes atrašanās vietu. To dara šādi:

A=POS (A¤, B¤, N).

Kā redzi, tai ir veseli trīs argumenti: pirmie divi ir simboliskie mainīgie, bet trešais — skaitliskais mainīgais. Šī funkcija strādā šādi: paņem 136pirmā argumenta — simbolu virknes — vērtību; tajā meklē otrā argumenta vērtību. Bet meklēšanu sāk ar simbolu, kura numurs vienāds ar trešā argumenta vērtību. Funkcijas vērtība ir tā simbola numurs, ar kuru otrā argumenta vērtība sākas pirmā argumenta vērtībā. Paskaties šīs funkcijas darbību piemēros!

Ilustrācija
PRINT POS(A¤,"EI",2)
 2

Redzi, viss ir pareizi. Turklāt ņem vērā, ka šās funkcijas trešais arguments var būt ne tikai vienkāršs mainīgais, bet arī jebkura izteiksme. Pirmie divi argumenti var būt vairāku mainīgo konkatenācija vai kāda cita funkcija, kuras vērtība ir simboliskais mainīgais.

— Tādu funkciju mums nav bijis.

— Tūlīt būs. Tikai pateikšu, ka par argumentiem var būt arī konstantes — skaitliskā konstante trešajā argumentā un simboliskās konstantes pirmajos divos argumentos.

Simbolu virknes sadalīšana

— Tagad par funkciju SEG¤. Kā redzi, pēdējais simbols tās apzīmējumā ir «saulīte». Tas nozīmē, ka funkcijas darba rezultātā radīsies simbolu virkne. Tā arī ir tā ilgi gaidītā funkcija, kurai gan arguments, gan rezultāts ir simbolu virkne. Iespējams, ka SEG ir saīsinājums no angļu vārda segment, bet pa īstam to neviens nezina. Šī funkcija izdala apakšvirkni no pirmā argumenta — 137simboliskā mainīgā — vērtības, otrais arguments norāda, ar kuru simbolu jāsāk izdalīt apakšvirkni, un trešais — ar kuru simbolu jābeidz. Vari papētīt šādu operatoru:

Ilustrācija

Z¤=SEG¤(A¤, M, N).

Tagad kaut ko mēģināsim izdarīt, strādājot ar mašīnu.

Ilustrācija
A¤="SAPRAHTINJA"
PRINT SEG¤(A¤,1,3)+SEG¤(A¤,9,11)
SAPNJA

Vai saprati, kā no SAPRAHTINJA iznāca SAPNJA?

— Kas tur ko nesaprast!

— Tagad varbūt papētīsim vienu no manām vecajām programmām — SIMBO. Šī programma ievadīto vārdu sadala atsevišķos burtos.

OLD DK1:SIMBO

Izdrukā šo programmu!

SAVE LP:
10 REM PROGRAMMA SADALA IEVADIHTO SIMBOLU
20 REM VIRKNI ATSEVISHKJOS SIMBOLOS
30 PRINT \ PRINT "IEVADIET SIMBOLU VIRKNI"
40 INPUT A¤
50 N=LEN(A¤) \ REM ATRODAM VIRKNES GARUMU
60 FOR I=1 TO N
70 B¤=SEG¤(A¤,I,I) \ REM SIMBOLA IZDALIHSHANA
80 PRINT I;". SIMBOLS IR ";B¤
90 NEXT I
100 STOP \ END

— Šis tas man jau ir skaidrs — neesmu vairs nekāda iesācēja. Pirmās četras rindas ir pilnīgi saprotamas. Aizķeršanās iznāk pie rindas 50, bet tu jau mums esi labsirdīgs un paskaidro, kas tur notiek: tātad mainīgā N vērtība būs vienāda ar burtu skaitu ievadītājā vārdā. Tālāk sākas cikls. No viena līdz N! Šo N mēs tikko kā esam atraduši un jau liekam 138to par cikla robežu! Tad jau cikls būs pa visiem burtiem, vai ne?

Ilustrācija

— Protams! Es taču visus burtus gribu atdalīt un izvadīt!

— Un atdalīšana notiek rindā 70. Tā jāpapēta sīkāk. Funkcija SEG¤ no ievadītā vārda izdala apakšvirkni, sākot ar I-to simbolu un beidzot ar to pašu I-to simbolu, tātad tikai vienu burtu. Lieliski! Tālāk izdrukā... Vispirms drukā I vērtību jeb burta numuru un pēc tam viltīgi pievieno punktu un vēl tekstu un tad arī pašu burtu. Un tas viss notiek ciklā. Nekā sarežģīta šajā programmā nav! Intereses pēc to palaidīšu.

RUNNH


IEVADIET SIMBOLU VIRKNI
? VAHRDS
1. SIMBOLS IR V
2. SIMBOLS IR A
3. SIMBOLS IR H
4. SIMBOLS IR R
5. SIMBOLS IR D
6. SIMBOLS IR S

STOP AT LINE 100
Ilustrācija

Sūdzēties nevar. Strādā pareizi.

Bet vai ievadīto skaitli ciparos tā varētu sadalīt?

— Programma strādā ar simboliem. Ar simboliem! Un tai ir gluži vienalga, ko tu ievadīsi. Ja tu ievadīsi simbolu virkni «123», tad programma to sadalīs atsevišķos simbolos. Par to vari nešaubīties. Tu taču redzi, ka A¤ ir simboliskais mainīgais.

Sakarības starp skaitļiem un simboliem

Man ir jautājums uz iekrišanu. Kāda vērtība pēc operatora izpildes būs mainīgajam S¤?

S¤=«1»+«2»

— He! Varbūt tu domāji, ka es pateikšu trīs? Nekā nebija. Mainīgā S¤ vērtība būs divpadsmit.

— Arī ne divpadsmit! Mainīgā vērtība būs simbolu virkne «12», kura jālasa — «viens, divi». Un simbolu virkne «12» vai «1234» nav nekāds skaitlis, 139ar to nekādas aritmētiskās darbības izpildīt nevar. Bet pārvērst par skaitli šādu simbolu virkni var, ja tev to vajag. Šim nolūkam der funkcija VAL, kuras apzīmējums ir saīsinājums no angļu vārda value — «veljū», kas nozīmē «vērtība». Šo funkciju varētu saukt par simbolu virknes skaitliskās vērtības aprēķināšanas funkciju. Un to lieto piemēram šādi:

N=VAL(B¤).

Simboliskā mainīgā B¤ vērtība tiks pārveidota par skaitli, un šis skaitlis kļūs par mainīgā N vērtību. Protams, mainīgā B¤ vērtībai ir jābūt tādai simbolu virknei, kuru par skaitli var pārvērst. Piemēram, virknes «123», «6789», «3,1414», «0.68E-6» par skaitļiem pārvērst varēs, bet virkni «MAIJA» — ne. Tā ir tāda nepilnvērtīga virkne.

— Tu pārāk neizrunājies. Labāk paskaidro, lūk, ko. Šī funkcija ir derīga, to var redzēt, bet mēs runājām par to, kā lai atrod skaitļa ciparus.

— Ja jau tev tā gribas tos ciparus, tad izmanto funkciju STR¤, kas darbojas pilnīgi pretēji funkcijai VAL. Šī funkcija skaitli pārvērš par simbolu virkni. Pilns vārds ir string, kuru izrunā tāpat, kā raksta, un latviski tas nozīmē «simbolu virkne». Tiesa, tikai programmēšanā, dzejolī tas nozīmēs «stīga». Šīs funkcijas izsaukšana arī savā ziņā ir pretēja funkcijai VAL.

A¤=STR¤(X)

— Skaidrs. Mainīgā X vērtību tā pārvērš par simbolu virkni, ko piešķir simboliskā mainīgā A¤ vērtībai.

— Jā, un turklāt pārvērš tāpat kā izvadot. Varētu teikt, ka mainīgā X vērtību tā izvada mainīgā A¤ vērtībā. Varbūt nebūs lieki piebilst, ka mainīgā X vietā var būt jebkura aritmētiska izteiksme.

— Būs lieki. Vari nepiebilst.

Ievadām simbolus, strādājam ar skaitļiem, izvadām simbolus
Ievadām simbolus, strādājam ar skaitļiem, izvadām simbolus

Kalendārs skaitļotājā

— Tad vēl divas funkcijas, kurām vērtības ir simboliskie mainīgie, bet argumentu vispār nav. Pirmā funkcija CLK¤ paziņo pulksteņlaiku, bet otrā DAT¤ — datumu. Vispirms par datumu. Visvienkāršāk to uz ekrāna ir izvadīt šādi:

PRINT DAT¤
12-FEB-87

Kā redzi, tas ir šodienas datums stingri noteiktā formā. Vispirms diena, tad domuzīme jeb mīnuszīme, mēneša angliskā nosaukuma pirmie trīs burti, tad atkal domuzīme un, visbeidzot, gadskaitļa pēdējie divi cipari.

— Man gan labāk patīk, ja mēneša nosaukuma vietā ir tā numurs: 12-02-87.

Ilustrācija

— Valsts standarts gan paredz šādu datumu formu: 87 02 12. Bet, ja tev patīk citāda, tad sastādi programmu, kura datumu no beisika formas pārveidos tavā formā.

— Bet kā lai to dara?

— Vispirms no DAT¤ vajag izdalīt mēneša nosaukumu.

— Ahā! Ar funkciju... piemirsu apzīmējumu.

— Ar funkciju SEG¤.

— Labi... Skaties, kā man iznāk.

— Mazliet pagaidi. Ievadīsim pavēli NEW, lai attīrās atmiņa.

NEW DATUMS

READY

Un tagad vari ievadīt savu programmu.

— Programmas vēl nav, ir tikai viena rindiņa.

10 A¤=SEG¤(DAT¤,4,6)

141Vai būs pareizi?

— Liekas, ka būs. Tagad vajag atrast mēneša kārtas numuru. Šim nolūkam es vispirms iesaku nodibināt šādu mainīgo.

20 B¤="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"

Šis mainīgais, kā tu redzi, satur visu mēnešu nosaukumu pirmos trīs burtus. Vai tagad tu saproti, kas būs tālāk?

Ilustrācija

— Nē! Drīzāk es saprastu, ja tu būtu nodibinājis masīvu ar šiem mēnešu nosaukumu saīsinājumiem.

— Varēja arī tā. Bet šādi būs vienkāršāk. Tagad vajag, izmantojot funkciju POS, noteikt, ar kuru simbolu sākot mainīgā B¤ vērtībā ieiet mainīgā A¤ vērtība — ar pirmo, ceturto vai kādu citu.

— Ahā! Es sāku nojaust tavu ideju. Bet tikai nojaust.

— Tad nu uzraksti, kā lai šo funkciju izsauc.

30 N=POS(B¤,A¤,1)

— Pēdējais arguments man ir 1, jo pārbaude jāsāk ar pirmo simbolu mainīgā B¤ vērtībā.

— Domāju, ka viss ir pareizi. Bet precīzi to uzzināsim tad, kad būsim palaiduši programmu. Un tagad uzraksti, kā no numura N var iegūt mēneša kārtas numuru.

— Tādi uzdevumi man vienmēr ir bijuši grūti. Šeit būs... Nē, citādi. N izteiksim ar mēneša numuru I:

N=3(I−1)+1=3I−2.

Tagad I izsaku ar N:

I=(N+2)/3.

Šo formulu pārbaudām: ja N=1, tad I=1. Ja N=4, I=2. Pareizi. Var rakstīt programmā:

40 I=(N+2)/3

142Tagad mainīgā A¤ vērtībā ietilpstošo mēneša nosaukumu vajadzētu nomainīt ar I vērtību.

— Nekā nebija. Nevis ar I vērtību, bet gan ar šīs vērtības izteiksmi simbolos. To varētu izdarīt ar funkcijas STR¤ palīdzību, taču šī funkcija no vieninieka izveidos simbolu «1», no divnieka — «2» un no divpadsmit, dabiski, «12». Vajadzētu tā, lai simbolu virknes katrreiz sastāvētu no diviem simboliem — nevis «1» vai «2», bet gan «01» vai «02».

— Skaidrs, ka tā būtu skaistāk. Bet kā lai priekšā ieliek to nulli?

— Kaut ko līdzīgu mēs tikko darījām. Nodibināsim vēl vienu simbolisko mainīgo.

50 C¤="010203040506070809101112"

Un tagad šajā simbolu virknē pēc mēneša numura atrodi tā simbolisko apzīmējumu.

— Iznāks it kā apgriezts mēneša numura meklēšanas uzdevums. Kaut kā jau galā tikšu.

60 J=2*I-1
70 C1¤=SEG¤(C¤,J,J+1)

Un tagad veidošu jaunu datuma formu.

80 D¤=SEG¤(DAT¤,1,3)+C1¤+SEG¤(DAT¤,7,9)
90 PRINT D¤
100 END

— Paskatīsimies, ko šī programma dara.

RUNNH

12-02-87

— Urrā! Strādā kā pulkstenis!

Pulkstenis skaitļotājā

— Tagad funkcija CLK¤ — izvada pulksteņlaiku tādā formā... Nē, labāk paskatīsimies!

PRINT CLK¤
17:21:26

Vispirms stundas, kols, tad minūtes, atkal kols un, visbeidzot, sekundes. Dažreiz programmistam ir svarīgi zināt, cik sekunžu pagājis kopš dienas sākuma.

Ilustrācija

— Kādēļ gan tas būtu vajadzīgs?

— Lai aprēķinātu laika intervālus, piemēram, to, cik ilgi skolēns ir apdomājis kādu programmas uzdevumu. Tad tu gan apdomāšanas sākumā, gan beigās vari uzzināt, cik sekunžu pagājis kopš diennakts sākuma. Šo skaitļu starpība ir apdomāšanas ilgums.

— Aprēķināt, cik sekunžu pagājis kopš diennakts sākuma, ir tīrais nieks. To es apņemos izdarīt.

— Dari arī.

— No tiem simboliem, ko izveido funkcija CLK¤, vajag paņemt stundu skaitu un to pareizināt ar 3600, pēc tam tāpat minūtes paņemt, pareizināt ar 60 un abus skaitļus, kā arī sekundes saskaitīt kopā.

— Un kā tas izskatīsies programmā? Teiksim, ja tu turpinātu to pašu programmu DATUMS, kura mums datumu pārveidoja citā formā?

— Nu tad skaties.

100 A1=VAL(SEG¤(CLK¤,1,2))

Aprēķināsim stundu skaitu. Vai redzēji, cik veikli es izmantoju funkciju VAL, jo simbolu virkne man ir jāpārveido par skaitli!

— Redzēju. Tas patiešām bija veikli. Atšķirt simboliskos un skaitliskos mainīgos nav nemaz tik vienkārši.

— Tālāk.

110 A2=VAL(SEG¤(CLK¤,4,5))
120 A3=VAL(SEG¤(CLK¤,7,8))
130 A=A1*3600+A2*60+A3
140 PRINT CLK¤,A

Vai tā būs labi?

— Man nejautā. Jautā mašīnai.

RUNNH

12-02-87
17:30:40        63040

— Mašīna saka, ka tik labu programmu sen neesot redzējusi.

Paša darināti darbarīki — programmista funkcijas

— Tad ir labi. Bet varbūt vienkāršāk būtu, ja tu izmantotu funkciju definēšanas iespēju. Savām vajadzībām definēt funkcijas programmists var šādi. Vispirms uzraksta DEF, kas ir saīsinājums no angļu define, ko izrunā «difain»...

— ...un kas pilnīgi droši nozīmē «definēt».

145PROGRAMMISTA FUNKCIJA— Pēc DEF raksta FN un kādu burtu, piemēram, M. Ciparu nedrīkst! Tas būs funkcijas apzīmējums. Pēc tam iekavās — argumentus, pie tam argumentiem ir jābūt obligāti. Un pēc vienlīdzības zīmes — pašu funkcijas izteiksmi. Tā būs funkcijas definīcija. Tagad par lietošanu.

Ieceļu tevi par programmista funkciju
Ieceļu tevi par programmista funkciju

— Pagaidi, pagaidi. Definīciju es vēl nesaprotu. Uzraksti kādu piemēru!

— Lūdzu. Rakstu jau mūsu programmas vajadzībām.

5 DEF FNA(X,Y)=VAL(SEG¤(CLK¤,X,Y))

Vai redzi, programmas sākumā definēju funkciju, kura apraksta tās trīs izteiksmes, kuras bija rindās 100, 110 un 120. Mainot argumentu vērtības, vari iegūt jebkuru no tām. Tālāk definēju vēl vienu funkciju.

6 DEF FNP(I)=FNA(1,2)*3600+FNA(4,5)*60+FNA(7,8)

Tā aprēķinās sekunžu skaitu kopš diennakts sākuma. Šajā definīcijā es izmantoju nule definēto funkciju FNA. Bet funkcijai FNP arguments I man ir vajadzīgs 146tikai kārtības labad: ja tā nebūs, tad interpretators paziņos, ka ir sintaktiska kļūda.

Un tagad vēl viena rinda programmas beigās.

150 PRINT FNP(I)

Tur tiks izdrukāta FNP vērtība, protams, neņemot vērā lieko argumentu I. Un šī vērtība būs kopējais sekunžu skaits kopš diennakts sākuma.

— Labi, un nu tavu lielo gudrību pārbaudīsim.

RUNNH

12-02-87
17:46:12        63792
 63793

Interesanti, kāpēc tavs sekunžu skaits no manējā par vienu atšķiras?

— Kamēr manas funkcijas strādāja, sekunžu skaitītājs pārlēca par vienu uz priekšu. Es negribu teikt, ka tas, ko esmu uzrakstījis, ir daudz labāks par taviem aprēķiniem, bet šī funkcija būs ļoti noderīga, ja sekunžu skaitu, kas pagājis kopš diennakts sākuma, programmā vajadzēs rēķināt vairākas reizes.

— Vispār jau vajag arī. Ja jāaprēķina laika sprīža ilgums, tad tās sekundes būs jāuzzina vismaz divreiz.

Ilustrācija

— Pilnīgi pareizi. Bet tagad darīsim tā. Tu sastādi programmu, kas loka tos latviešu valodas pirmās deklinācijas lietvārdus, kuri beidzas ar «s». Bet es pa to laiku padarbošos ar savām programmām.

17.

Mašīna apgūst latviešu valodu

Ar šo Pēča uzdevumu Maija nodarbojās diezgan ilgi. Jau ar blokshēmu iznāca krietni vien pamocīties, jo, to zīmējot, radās dažas idejas par ievaddatu pārbaudi.

Ilustrācija
Ilustrācija

Tas, ko programmē, ir jāzina

Maijas izgudrotajai pārbaudei vajadzēja atklāt kļūdaini ievadītos vārdus: tos, kuri nebeidzas ar -s, un tos, kuri ar -s gan beidzas, bet priekšpēdējais burts tiem ir patskanis. Diemžēl Maija nevarēja izdomāt, kā programmu sastādīt tā, lai to nevar apmānīt, tai iedodot locīt citu deklināciju lietvārdus, kas beidzas ar -s, piemēram, «akmens», «mēness», «klints» vai «sirds».

— Jā, tādu programmu sastādīt ... Te jau iznāk gandrīz domājošā mašīna.

Pēcis neko neatbildēja. Skaitļotāju nodevis Maijas rīcībā, viņš aizdrāzās konsultēties par savām problēmām. Maija sāka ievadīt tikko sastādīto programmu, bet diemžēl pieļāva kļūdas. Programma ar visām kļūdām izskatījās šāda:

10 REM PROGRAMMA LOKA PIRMAHS DEKLINAHCIJAS LIETVAHRDUS
20 PRINT  \ PRINT  \ PRINT  \ PRINT
30 PRINT "IEVADIET, LUHDZU, PIRMAHS DEKLINAHCIJAS"
40 PRINT "LIETVAHRDU VIENSKAITLJA NOMINATIHVA' "
50 PRINT "VAI VAHRDU: BEIGAS, JA JAHBEIDZ"
60 INPUT V¤
70 IF V¤<>"BEIGAS"THHEN 90
80 PRINT " BEIGAS" \ STOP
90 REM JAHPAHRBAUDA, VAI IR PAREIZI IEVADIHTS
100 G=LEN(V¤)
110 C¤=SEG¤(G¤,G,G) \  \ REM PEHDEHJAIS BURTS
120 C1¤=SEG¤(V¤,G-1,G-1) \  \ REM PRIEKSHPEHDEHJAIS BURTS
130 IF C¤<>"S" THEN 200
140 IF C1¤="I" THEN 200
150 IF C1¤="U" THEN 200
160 IF C1¤="E" THEN 200
170 IF C1¤="A" THEN 200
180 IF C1¤="O" THEN 200
190 GO TO 220
200 PRINT "TAS NAV PIRMAHS DEKLINAHCIJAS VAHRDS"
210 STOP
220 Z¤=SEG¤(V¤,1,G-1) \  \ REM VAHRDS BEZ GALOTNES
230 PRINT
240 PRINT "NOMINATIHVS       KAS?  ";V¤
250 PRINT "GJENITIHVS        KA'?  ";Z¤+"A"
260 PRINT "DATIHVS           KAM?  ";Z¤+"AM"
270 PRINT "AKUZATIHVS         KO?  ";Z¤+"U"
280 PRINT "INSTRUMENTAHLIS AR KO?  ";"AR"+Z¤+"U"
290 PRINT "LOKATIHVS         KUR?  ";Z¤+"A'"
300 PRINT  \ PRINT
310 GO TO 30
320 END

149Maija nolēma palaist programmu, negaidot, kamēr atnāk Pēcis. Kaut arī bija mazliet bail, tomēr ļoti gribējās redzēt, kas iznācis.

RUNNH

IEVADIET, LUHDZU, PIRMAHS DEKLINAHCIJAS
LIETVAHRDU VIENSKAITLJA NOMINATIHVA',
VAI VAHRDU: BEIGAS, JA JAHBEIDZ
? VAHRDS

?SYNTAX ERROR AT LINE 70

— Kas tad tas? Rindā 70 ... Sintaktiska kļūda? Paskatīšos.

LISTNH 70

70 IF V¤<>"BEIGAS" THHEN 70

Ak tā ... Viss skaidrs. THEN ir ievadīts ar diviem H. Tas taustiņš tik bieži ievada divus H! Tagad jālabo.

70 IF V¤<>"BEIGAS" THEN 70

Laidīšu no jauna.

IEVADIET, LUHDZU, PIRMAHS DEKLINAHCIJAS
LIETVAHRDU VIENSKAITLJA NOMINATIHVA',
VAI VAHRDU: BEIGAS, JA JAHBEIDZ
? VAHRDS
TAS NAV PIRMAHS DEKLINAHCIJAS VAHRDS

STOP AT LINE 210

150Kādas muļķības! Kā tad nav, ka ir! Beidzas ar -s un ir visīstākais pirmās deklinācijas lietvārds! Laikam mašīna būs sabojājusies.

Kļūda vai mašīnas bojājums!

Ilustrācija

Maija nolēma pagaidīt Pēci.

— Kur tu biji pazudis? Staigā apkārt, bet pa to laiku mašīna sabojājusies. Dara ne to, ko vajag.

— Kāpēc tu tā domā?

— Skaties, tā izvadīja, ka «vārds» nav pirmās deklinācijas lietvārds. Nomirt var no smiekliem.

— Ielāgo uz visu mūžu, ka mašīna bojājas daudz retāk, nekā kļūdās programmists. Un sākam meklēt kļūdu! Programma ir aizgājusi pa nepareizu atzarojumu — tātad pirmais, kas jātur aizdomās, ir pārejas operatori. Kā tu pārbaudi, vai ievadīts ir pirmās deklinācijas lietvārds?

— To man pārbauda veseli ... veseli seši operatori. Vispirms es pārbaudu, vai attiecīgais lietvārds beidzas ar -s; ja nebeidzas, tad šis vārds ir nepareizi ievadīts. Ja beidzas ar -s, tad pārbaudu, vai priekšpēdējais burts nav -i-, -u-, -e-, -a- vai -o-, jo, manuprāt, priekšpēdējais burts pirmās deklinācijas lietvārdam nominatīvā vispār nevar būt patskanis.

— Parādi tos pārbaudes operatorus.

LISTNH 130-180

130 IF C¤<>"S" THEN 200
140 IF C1¤="I" THEN 200
150 IF C1¤="U" THEN 200
160 IF C1¤="E" THEN 200
170 IF C1¤="A" THEN 200
180 IF C1¤="O" THEN 200

Izskatās tā nekas. Ja pieņemam, ka pārejas operatori uzrakstīti pareizi, bet pāreja tomēr notiek ne tā, kā vajag, tad acīmredzot nepareizi būs tie lielumi, kurus tu salīdzini. Burti -s-, -i-, -u- utt., protams, ir pareizi. Atliek mainīgie C¤ un C1¤.

Kas te ir sabojājies?
Kas te ir sabojājies?

Paskatīsimies, kāda izskatās C1¤ vērtība. Tai jābūt vārda VAHRDS priekšpēdējam burtam.

PRINT C1¤
D

— Pilnīgi pareiza! Mašīna ir beigta, tur nav ko strīdēties.

— Vēl paskatīsimies C¤.

PRINT C¤

— Vai, cik jocīgi! Acīmredzot mašīna nevar izvadīt C¤ vērtību, tik beigta tā ir.

— Nepavisam ne tā. Tai nav ko izvadīt. C¤ vērtība nav pareizi atrasta. Kuram operatoram tas būtu jādara?

— Rindai ar numuru ... ar numuru 110.

LISTNH 110
110 C¤=SEG¤(G¤,G,G)

— Izvadīsim G¤ vērtību.

PRINT G¤
Ilustrācija

Interesanti gan. Kā var no simbolu virknes izdalīt vienu simbolu, ja šajā virknē simbolu vispār nav!

— Nu jā! Tur taču bija jābūt nevis G¤, bet gan V¤. Kā tas G tur varēja gadīties?

— Vai nu to ir ievadījis ļaunais gars, vai arī tu pati esi pārskatījusies un burta V vietā nospiedusi G. Intereses pēc pārbaudīsim mainīgo G¤.

PRINT G
 6

Normāli. Rindā 110 tev G¤ jānomaina ar V¤.

— Atkal jāievada vesela rinda!

Kā izlabo nepareizu rindu

ATDALĪTĀJS— Vispār tu jau esi pietiekami liela, lai uzzinātu pavēli SUB. Šī pavēle atsevišķus simbolus programmas rindās ļauj mainīt, neievadot visu rindu no jauna. Pavēle izskatās šāda: vispirms SUB, pēc tam tās rindas numurs, kuru tu gribi mainīt, tad šīs rindas «nepareizā» daļa jeb apakšrinda — un beigās apakšrinda, kuru tu liksi vietā. Abas apakšrindas ir jāievieto atdalītājos.

— Kas tie tādi?

— Jebkurš simbols, kura abās šajās apakšrindās nav. Es parasti izmantoju simbolu «>». Skaties, kāda būs vajadzīgā pavēle!

SUB110>G¤,>V¤,>_

Ja pēc otrā atdalītāja nekā nebūs, tad uzrādītajā rindā tiks nodzēsti simboli, kuri atrodas pavēlē SUB starp pirmo un otro atdalītāju.

— Un to vietā būs tukšas vietas?

153— Nē, nekā nebūs. Jeb, ja gribi, saki — būs nekas. Tukša vieta ir patstāvīgs, pilntiesīgs simbols.

— Ļoti interesanti. Nospied ievades taustiņu, redzēsim, kas iznāks.

110 C¤=SEG¤(V¤,G,G)

— Lūk, pavēle SUB parāda izlaboto rindu. Nu viss ir pareizi. Vai redzi, es nomainīju ne tikai burtu G pret V: trīs simbolus G¤ un komatu nomainīju pret V¤ un komatu, kaut arī saulīte un komats bija pareizā vietā.

— Es pat zinu, kāpēc. Mainot tikai G, nomainītos SEG¤ pret SEV¤, kas ir pilnīgi nevajadzīgi. Acīmredzot vajadzīgās apakšrindas meklēšanu interpretators sāk no rindas sākuma.

— Lieliski, tu pieņemies prātā, acīm redzot.

— Nav ko pļāpāt. Jālaiž programma.

RUNNH

IEVADIET, LUHDZU, PIRMAHS DEKLINAHCIJAS
LIETVAHRDU VIENSKAITLJA NOMINATIHVA',
VAI VAHRDU: BEIGAS, JA JAHBEIDZ
? VAHRDS
NOMINATIHVS       KAS?  VAHRDS
GJENITIHVS        KA'?  VAHRDA
DATIHVS           KAM?  VAHRDAM
AKUZATIHVS        KO ?  VAHRDU
INSTRUMENTAHLIS AR KO?  ARVAHRDU
LOKATIHVS         KUR?  VAHRDA'


IEVADIET, LUHDZU, PIRMAHS DEKLINAHCIJAS
LIETVAHRDU VIENSKAITLJA NOMINATIHVA',
VAI VAHRDU: BEIGAS, JA JAHBEIDZ
? BEIGAS
BEIGAS

STOP AT LINE 80

154— Iznāca diezgan sakarīgi. Tikai tas instrumentālis varēja būt labāks. Cik gan nav bijis piemēru ar izvadi, kur bija smalki paredzēts, kurš vārds kuram seko un kur jābūt atstarpēm! Un te pēkšņi — kaut kāds «arvārdu»!

Vēl viens labojums programmā

— Labi jau, labi. To taču nav grūti izlabot.

— Izdari to ar pavēli SUB.

SUB280>AR>AR >
280 PRINT "INSTRUMENTAHLIS AR KO? ";"AR"+Z¤+"U"

— Bet pavēli taču tā neizpildīja!

— Ar pavēli SUB jārīkojas uzmanīgi. Interpretators ielika vēl vienu tukšu vietu tur, kur ir jautājums «ar ko?». Tagad jāmaina atpakaļ. Jānodzēš tā liekā tukšā vieta un pēc tam tur, kur vajag, jāieliek jauna.

SUB 280>R >R>
280 PRINT "INSTRUMENTALIS AR KO?";"AR"+Z¤+"U"

SUB 280>R">R ">
280 PRINT "INSTRUMENTALIS AR KO?";"AR "+Z¤+"U"
Ilustrācija

— Uff! Tagad visam jābūt pareizam. Izlaboto programmu ierakstīšu diskā.

SAVE DK1:LOKS

— Tas, ka programmu ierakstīji diskā, neskādēs. Bet tas, ka tu domā, ka viss ir pareizi, apliecina tavu ...

— Nu, saki — ko?

Dzīves īstenība, nevis moralizēšana

LĀGOŠANA— Labi, lai paliek nepateikts. Es jau kādreiz teicu, ka programmistam jābūt pārliecinātam, ka viņa programmas strādā pareizi. Bet, jo ilgāk programmē, jo mazāka šī pārliecība kļūst. Tu vēl nezini, ka sākumā programmas ilgu laiku nestrādā un gandrīz viss programmista laiks tiek patērēts kļūdu izķeršanai jeb — kā to sauc pareizi — programmas lāgošanai. Šo darbu vajag iemīlēt, protams, ja gribi nodarboties ar programmēšanu. Bet kļūdu meklēšana nepavisam nav tik neinteresants darbs. Šeit vajadzīga dzelžaina loģika un, protams, zināšanas par to, ko īsti mašīna dara, kā pētāmajā situācijā strādā beisika interpretators. Diemžēl parasti kļūdu meklēšana beidzas ar pārsteigumu: kā esi varējis tik dumji kļūdīties!

— Atklāti runājot, tādi pārsteigumi gadās gan.

— Nu re! Pieredze pamazām krājas. Runājot par tavu programmu, var atzīt, ka šīs programmas lāgošana ir krietni pavirzījusies uz priekšu. Programma pareizi nostrādāja ar vārdu «vārds».

— Ar vārdu «Beisikāns» tā arī nostrādās pareizi!

— Nestrīdos. Nostrādās pareizi. Bet programmistam ir jābūt pārliecinātam, ka viņa programma strādās pareizi ar jebkuriem ievaddatiem. Nedomā, ka es tev lieku priekšā paņemt latviešu valodas vārdnīcu, atrast visus pirmās deklinācijas lietvārdus un pārbaudīt ar savu programmu. Es ierosinu izdarīt programmas pārbaudi jeb testēšanu, tas ir, programmā ievadīt tādus datus, kuri visiem nosacītās pārejas operatoriem liktu nostrādāt gan tā, lai nosacījums tiek izpildīts, gan arī tā, lai netiek izpildīts. Tas arī ir viss: citu iespēju, kā mainīt operatoru izpildes kārtību, beisikā nav.

— Bet operators GO TO?!

— Izteicos neprecīzi. Operators GO TO tiešām maina operatoru izpildes kārtību. Taču sazarojumu tas neveido. Lai kādas arī būtu mainīgo vērtības, vadību šis operators vienmēr nodos uz vienu un to pašu vietu. Tā tas ir. Ai! Es taču aizmirsu par aprēķināmās pārejas operatoru ON. Tas, protams, arī veido sazarojumu. Bet nu paņemsim šīs programmas blokshēmu un izdomāsim, kas ir jāievada, lai visi nosacītās pārejas operatori nostrādātu abējādi.

Ilustrācija
Testējot pārbaudi visas iespējamības!
Testējot pārbaudi visas iespējamības!

Pirms testēšanas ir jāpadomā

— Mēs taču vienreiz jau izpildījām šo programmu un izgājām cauri visiem sešiem nosacītās pārejas operatoriem! Nezinu, vai tas tiek ņemts vērā, bet to gadījumu, kur lietvārds beidzas ar -s un priekšpēdējais burts nav patskanis, mēs taču pārbaudījām!

— Tas, protams, tiek ņemts vērā. Tagad ir vajadzīgs vārds, kas nebeidzas ar -s.

Ilustrācija

— Lūdzu — «aita».

— Labi, «aita». Tālāk izdomā kādu vārdu, kas beidzas ar -is, lai pārbaudītu otru iespējamību otrajā nosacītās pārejas operatorā.

— «Vērsis».

— Un tagad vārdu, kas beidzas ar -us.

— «Medus».

— Tātad, lai veiktu programmas testēšanu, mums tā ir jāizlaiž ar vārdiem «vārds», «aita», «vērsis», «medus», kā arī ar nepareiziem vārdiem, piemēram, «bas», «bes», «bos». Un klāt nāk vēl viens vārds.

— Nekas nenāk klāt, viss tiks pārbaudīts.

— Bet programmas nobeigšana? Vai programma darbosies pareizi, ja ievadīsim vārdu «beigas»?

— Jā, tā darbosies pareizi. Vienreiz šo vārdu jau ievadījām.

— Tas gan. Bet to vārdu sarakstā, kurus nepieciešams ievadīt pārbaudei, vārdam «beigas» ir jābūt.

— Ir jābūt. Ir. Varbūt ievadīsim visus šos vārdus, lai tu nomierinātos.

Pēc brīža visi vārdi jau bija pārbaudīti.

— Redzi, Pēci, viss ir vislabākajā kārtībā.

Kļūdas var «sadzīt» tikai ar testiem
Kļūdas var «sadzīt» tikai ar testiem

— Par to nemaz nešaubījos, jo visi nosacītās pārejas operatori ir gandrīz vienādi, bet kārtībai ir jābūt.

Un atkal — valodas

— Kārtībai ir jābūt. Tas man ir stāstīts bez sava gala. Labāk parunāsim par citu ko. Kad tiku strādājusi pie šīs programmas, nekādi nevarēju izdomāt īsti labu pārbaudi tam, vai ievadīts ir pirmās deklinācijas lietvārds. Pavisam grūti būtu noteikt, vai attiecīgais vārds vispār ir lietvārds, jo tādus vārdus kā «kāja» un «gāja» tu ar programmu neatšķirsi. Es protu noteikt otro deklināciju — pēc galotnes -is. Arī trešo deklināciju — pēc galotnes -us. Bet nevaru atšķirt, protams, programmā, sesto no pirmās, tas ir, vīriešu dzimtes vārdus, kas beidzas ar -s, no sieviešu dzimtes vārdiem, kas beidzas ar -s. «Zivs» un «zvejnieks» man iznāk vienā un tajā pašā deklinācijā.

— Tā jau ir. Kad cilvēki gudroja latviešu valodu, viņi ļoti neapdomīgi neparedzēja savas pēcteces Maijas Saprātiņas vajadzības. Tev programmā jānodibina simbolisko mainīgo masīvs, kur jāglabā visi iespējamie sestās deklinācijas lietvārdi. Jā, arī simboliskajiem mainīgajiem var būt masīvi. Un, saņēmusi kādu vārdu, kas beidzas ar -s, pārbaudi visu masīvu, vai tā tur nav. Otru masīvu tu varētu izveidot vīriešu dzimtes vārdiem, kas beidzas ar -s, bet pieder pie otrās deklinācijas, piemēram, «asmens».

— Tas taču būs drausmīgs darbs! Visus vārdus ievadīt masīvā! Un pēc tam vēl salīdzināt! Ar katru vārdu!

158— Tur neko nevar darīt. Kāda tā latviešu valoda ir, tāda ir, kaut ko grozīt laikam jau ir par vēlu. Starp citu, krievu valodā lietvārdu deklinācijas algoritmiski atšķirt ir vēl daudz grūtāk ... Bet nekāds lielais papildu darbs ar tiem masīviem nemaz nebūs, jo izņēmumu jau nevar būt daudz. Ja ir mazāk par simtu, tad pārbaudi mašīna izdarīs vienā mirklī.

Ilustrācija

— Mazāk būs gan. Tikai īsti nezinu, cik.

— Tagad šo programmu varam pārdomāt. Trešo deklināciju noteikt proti. Bet kā ir ar locīšanu?

— Medus, lietus, ledus, tirgus. Ar locīšanu nav nekādu problēmu. Problēmas rastos ar otro deklināciju. Tur, zini, ir tā līdzskaņu mija. Brālis, brāļa. Pēcis, Pēča. Kā lai ar to tiek galā?

— Ja padomāsi ilgāk — izdomāsi. Vieglāk būs, ja pieņemsi, ka vārdi tiek izvadīti mašīnpareizrakstībā.

— Ar citām deklinācijām būtu diezgan līdzīgi. Es domāju pašu locīšanu. Bet noteikt piederību pie šīm deklinācijām — tā atkal ir problēma.

— Tāpēc ir jābūt vārdu sarakstiem simboliskajos masīvos. Bet vai zini ko? No šīs tavas programmas viegli iztaisīt programmu, kas pārbauda skolēnu zināšanas pirmās deklinācijas lietvārdu locīšanā.

— Jā? Bet kā izdarīt tā, lai ... nu, lai iepriekš nevarētu zināt, ko mašīna vaicās?

— Atkal jāizmanto simboliskie masīvi. Ko lai dara, nākamreiz vajadzēs parunāt par tiem.

18.

Vēl mazliet par to, kā skaitļotājs māca bērnus

Nākamajā reizē, kā bija runāts, Pēcis un Maija pētīja programmu, kura apmāca bērnus un kurā tiek izmantoti simbolisko mainīgo masīvi.

— Šī programma bērniem iemāca padomju republiku galvaspilsētas. Domāju, ka tu vēl atceries tos laikus, kad pati mocījies, tās iekaldama.

— Bija pat tāds laiks, kad es nezināju pašas savienotās republikas.

Mācīsimies ģeogrāfiju

— Pašas republikas nu gan šīs programmas lietotājam būtu jāzina. Kas attiecas uz programmu, tad tajā ir paredzēti četri režīmi. Pirmajā režīmā bērnam uz ekrāna izvada visas republikas un to galvaspilsētas. To izmanto pašā apmācības sākumā, kad bērns vēl maz ko zina. Īstā apmācība notiek nākamajā, atkārtošanas, režīmā, kad skolēnam jānosauc vai nu galvaspilsētai atbilstošā republika, vai arī republikai atbilstošā galvaspilsēta. Trešais režīms ir eksāmens.

— Protams, bez eksāmeniem jau nu nevar iztikt!

— Bet kā lai citādi cilvēks uzzina, ka ir visu apguvis? Pēdējais režīms — tā ir darba nobeigšana. Ļoti vienkāršs režīms. Un, lūk, pati programma.

Ilustrācija
10 REM PROGRAMMA MAHCA SAVIENOTO REPUBLIKU GALVASPILSEHTAS
20 REM R¤ - MASIHVS AR REPUBLIKU NOSAUKUMIEM
30 REM G¤ - MASIHVS AR GALVASPILSEHTU NOSAUKUMIEM
40 DIM R¤(15),G¤(15)
50 REM PROGRAMMA VAR LIKT NOSAUKT REPUBLIKU
60 REM ZINAHMAI GALVASPILSEHTAI VAI ARI' OTRAHDI
70 REM U1 - VARBUHTIHBA, KA JAUTAHS GALVASPILSEHTAI
72 REM ATBILSTOSHO REPUBLIKU
100 DIM E(15) \  \ U1=.5
110 REM U1 SKOLOTAHJS VAR MAINIHT
120 \
130 DATA "KRIEVIJ","MASKAVA","UKRAIN","KIJEVA"
140 DATA "BALTKRIEVIJ","MINSKA","KAZAHIJ","ALMA-ATA"
150 DATA "MOLDAHVIJ","KISHINJEVA","GRUZIJ","TBILISI"
160 DATA "ARMEHNIJ","EREVAHNA","AZERBAIDZHAHN","BAKU"
170 DATA "LATVIJ","RIHGA","LIETUV","VILJNJA"
180 DATA "IGAUNIJ","TALLINA","UZBEKIJ","TASHKENTA"
190 DATA "TADZHIKIJ","DUSHANBE","TURKMEHNIJ","ASHHABADA"
200 DATA "KIRGIHZIJ","FRUNZE"
205 \
210 REM NOLASA REPUBLIKU UN GALVASPILSEHTU.NOSAUKUMUS
220 FOR I=1 TO 15 \ READ R¤(I),G¤(I)
230 A¤=" PSR" \ IF I<>1 THEN 240 \ A¤=" PFSR"
240 R¤(I)=R¤(I)+"AS"+A¤ \ REM IZVEIDO PILNU NOSAUKUMU
250 NEXT I
255 \
260 PRINT  \ PRINT  \ PRINT  \ PRINT
270 PRINT " ******************** TAGAD MAHCIHSIMIES"
280 PRINT "  SAVIENOTO REPUBLIKU GALVASPILSEHTAS *********"
290 PRINT  \ PRINT  \ PRINT
300 PRINT "IEVADI 1 - UZZINAHSI GALVASPILSEHTAS"
310 PRINT "IEVADI 2 - VAREHSI ATKAHRTOT"
320 PRINT "IEVADI 3 - VAREHSI LIKT EKSAHMENU"
330 PRINT "IEVADI 4 - DARBS BEIDZIES"
340 PRINT "TAVS IEVADS "; \ INPUT M
345 \
350 ON M GO TO 360,450,780,990
355 \
360 REM PARAHDIHSHANA 1111111111111111111111111111111111111
365 \
370 PRINT  \ PRINT
380 PRINT "PADOMJU SAVIENIHBA' PAVISAM IR 15 SAVIENOTAHS";
390 PRINT " REPUBLIKAS" \ PRINT
400 FOR I=1 TO 15
410 PRINT I;"  ";R¤(I);"  AR GALVASPILSEHTU  ";G¤(I)
420 NEXT I
430 GO TO 290
435 \
440 REM ATKAHRTOSHANA 2222222222222222222222222222222222222
445 \
450 PRINT  \ PRINT  \ PRINT  \
460 PRINT "ATKAHRTOSIM SAVIENOTO REPUBLIKU GALVASPILSEHTAS"
470 PRINT "ATBILDES JAHDOD MASHIHNPAREIZRAKSTIHBA'"
480 PRINT  \ PRINT "  KAD TEV BUHS APNICIS, IEVADI #"
510 REM IZVEHLAS REPUBLIKAS
530 J=0 \ K=0 \ REM JAUTAHJUMU UN KLJUHDU SKAITS
545 \
550 REM SAHKAS ATKAHRTOSHANA ******************************
560 R=RND
570 IF R>U1 THEN 670
580 REM DOTA GALVASPILSEHTA, JAHNOSAUC REPUBLIKA ----------
590 PRINT "KAHDAS REPUBLIKAS GALVASPILSEHTA IR ";
600 GOSUB 1000 \  \ REM ATROD REPUBLIKAS NUMURU
610 PRINT G¤(I);
620 INPUT R1¤ \  \ REM IEVADA REPUBLIKAS NOSAUKUMU
630 IF R1¤="#" THEN 750 \ REM     VAI NAV APNICIS?
640 N¤=R¤(I) \  \ REM SAGATAVO N¤ APAKSHPROGRAMMAI
650 GOSUB 2000 \  \ REM         ATBILDES PAHRBAUDE
660 GO TO 560
665 \
670 REM DOTA REPUBLIKA,JAHNOSAUC GALVASPILSEHTA ----------
680 GOSUB 1000
690 PRINT "NOSAUC ";R¤(I);" GALVASPILSEHTU";
700 INPUT R1¤
710 IF R1¤="#" THEN 750
720 N¤=G¤(I)
730 GOSUB 2000
740 GO TO 560
750 PRINT "NO ";J;" ATBILDEHM ";J-K;" BIJA PAREIZAS"
760 GO TO 290
765 \
770 REM EKSAHMENS 333333333333333333333333333333333333333
775 \
780 PRINT  \ PRINT  \ PRINT  \
790 PRINT "SAHKAM EKSAHMENU"
800 REM MASIHVA' E TIEK ATZIHMEHTS,KURAS REPUBLIKAS
802 REM IR JAUTAHTAS
810 FOR I=1 TO 15 \ E(I)=0 \ NEXT I
820 J=0 \ K=0
830 N=INT(RND*15)+1
840 IF E(N)<>0 THEN 830
850 PRINT "NOSAUC ";R¤(N);" GALVASPILSEHTU";
860 INPUT G1¤
870 IF G1¤<>G¤(N) THEN 890
880 PRINT "ATBILDE IR PAREIZA" \ GO TO 900
890 PRINT "ATBILDE NAV PAREIZA" \ K=K+1
900 J=J+1 \ E(N)=1 \ REM ATZIHME', KURAS REPUBLIKAS BIJA
910 IF J<15 THEN 830 \ PRINT
920 IF K<>0 THEN 940
930 PRINT "ATZIHME - TEICAMI (5)" \ GO TO 290
940 IF K<>1 THEN 960
950 PRINT "ATZIHME - APMIERINOSHI (3)" \ GO TO 290
960 PRINT "VAJAG ATKAHRTOT VEHL - BIJA ";
970 PRINT K;" KLJUHDAS"
980 GO TO 290
985 \
990 PRINT "DARBA BEIGAS" \ STOP
995 \
1000 REM APAKSHPROGRAMMA ATROD NUMURUS
1010 N=INT(RND*15)+1
1040 IF N=9 THEN 1010 \ REM RIHGU ZINA VISI
1060 RETURN
1965 \
2000 REM APAKSHPROGRAMMA PAHRBAUDA ATBILDES
2010 IF R1¤<>N¤ THEN 2030
2020 PRINT "ATBILDE IR PAREIZA" \ GO TO 2060
2030 PRINT " NEPAREIZI!!! PAREIZA' ATBILDE IR ";N¤ \ K=K+1
2060 J=J+1 \ RETURN
2070 END

— Šausmas! Tā nu gan ir gara programma! Ko te var saprast?

— Garums vēl neko nenozīmē. Būtiskais ir tas, cik tā ir sarežģīta. Bet par sarežģītu šo programmu nevar uzskatīt. Tūlīt pati redzēsi, ka tās lielākā daļa ir vienkārši, uzskatāmi izvades vai piezīmju operatori. Varu garantēt, ka visu sapratīsi. Ar laiku, protams.

— Sākumu jau sapratu. Līdz rindai 70. Tur parādās kaut kāda varbūtība.

— Redzi, atkārtošanas laikā var uzdot divējādus jautājumus. Piemēram: kādas republikas galvaspilsēta162 ir Kišiņeva? Vai arī — kas ir Moldāvijas PSR galvaspilsēta? Tu jau zini, kas jāatbild. Mainīgā U1 vērtība norāda, vai biežāk būs pirmā vai otrā tipa jautājumi, vai arī tie būs vienlīdz bieži. Rindā 100 skolotājs U1 vērtību var mainīt. Ja viņš, piemēram, grib, lai skolēns nosauc tikai galvaspilsētas, tad mainīgajam U1 jāpiešķir vērtība 0. Vai arī kā citādi.

Ilustrācija

— Bet kas tas rindā 130 un tālāk? Kaut kāds neparasts operators DATA. Ja tas ir operators.

Kā programmās glabā datus

— Tas ir operators. Datu glabāšanas operators. «Deita» angliski nozīmē «dati». Šis operators vienīgi glabā datus un vairāk neko. Interpretators, šādu operatoru sastapis, tam pārskries pāri. Mainīgo vērtībās dati tiek dabūti ar operatora READ palīdzību.

— «Rīd» nozīmē «lasīt». Tad jau operators READ ir nolasīšanas operators ...

— Jeb ielasīšanas operators. No glabātavas DATA operatoros tas ielasa vajadzīgo mainīgo vērtībās. Mūsu programmā operators READ ir rindā 220. Šeit sākas cikls no 1 līdz 15, tātad pa visām republikām, un šajā ciklā tiek nolasīti visu republiku un to galvaspilsētu nosaukumi.

Kas zog datus manā dārzā?!
Kas zog datus manā dārzā?!

Pati nolasīšana notiek šādi. Ejot cauri ciklam pirmo reizi, kad I=1, interpretators, uzdūries operatoram READ, kurš satur simbolisko masīvu elementus163 R¤ (I) un G¤ (I) jeb — šajā gadījumā — R¤ (1) un G¤ (1), sāk meklēt, kur programmā ir operators DATA, un atrod, ka pirmo reizi tas sastopams rindā 130 un ka pirmās divas simbolu virknes, kas tur glabājas, ir «KRIEVIJ» un «MASKAVA». Tās tad arī kļūst par mainīgo R¤ (1) un G¤ (1) vērtībām. Jā, vai vari pateikt, kā lai uzzina, kur operatorā DATA beidzas pirmā simbolu virkne un sākas otrā?

— Muļķīgs jautājums! Tās taču tiek atdalītas ar komatu!

Ilustrācija

— Kā tad. Ja mums vajadzētu ielasīt nevis simbolisko, bet skaitlisko mainīgo vērtības, tad nekas nemainītos: operatorā DATA glabātos skaitliskās vērtības. Tālāk. Ciklam cauri ejot otro reizi, notiek tāpat un tiek ielasītas mainīgo R¤ (2) un G¤ (2) vērtības. Un tā līdz cikla beigām. Protams, visam jābūt rūpīgi saskaņotam. Operatoros DATA visām vērtībām jāglabājas tieši tādā kārtībā, kā tās tiks lasītas, jeb, ja tev patīk labāk, tās jālasa tieši tādā kārtībā, kā glabājas operatorā DATA.

Darba laikā interpretators atzīmē, līdz kurai vietai dati DATA operatoros ir nolasīti. Ja visi dati jau ir nolasīti, taču pēkšņi parādās vēl kāds operators READ, tad ir kļūda.

Dažkārt šie dati, kurus glabā DATA operatori, programmistam var būt vajadzīgi vairākas reizes. Tad viņam jāizmanto operators RESTORE. «Ristor» nozīmē «atjaunot». Kad interpretators programmā būs atradis šo vārdu, operators READ, kurš būs jāizpilda nākamais, nolasīs datus no paša pirmā DATA operatora.

Datus lasiet no paša sākuma!
Datus lasiet no paša sākuma!

— Man visu laiku mēles galā ir jautājums. Kāpēc tu visos šajos DATA operatoros tik jocīgi raksti — KRIEVIJ, LATVIJ?

Piemēriņi darbam ar simboliem

— Tikai lai taupītu laiku. Republikas izvadīšu formā KRIEVIJAS PFSR, LATVIJAS PSR. Bet man vieglāk uzrakstīt ciklu, kas pieliek šo «AS PSR», nekā visos DATA operatoros rakstīt pilnu formu. Skaties, cik vienkārši. To beigu pielikšanu es izdaru šajā pašā datu nolasīšanas ciklā. Vispirms rindā 230 atrodu simboliskā mainīgā A¤ vērtību, kura ir «PFSR», ja runa ir par Krieviju, tas ir, ja I vērtība ir 1, turpretī pārējos gadījumos A¤ vērtība paliek «PSR».

— Un tad rindā 240 tiek izveidots pilns nosaukums. Nav slikti.

— Tālāk nāk piemērota režīma izvēle.

— Visvienkāršākais laikam būs parādīšanas režīms.

— Nē, apstāšanās režīms ir vēl vienkāršāks, taču parādīšanas režīms rindās 370—430 arī nav sarežģīts: uz ekrāna stabiņā izvada republikas kārtas numuru, republikas nosaukumu un galvaspilsētas nosaukumu. Tālāk ir atkārtošanas režīms. Bet rindas ar numuriem 440—480 tev, cerams, ir saprotamas.

— It īpaši rinda 480. Kaut jel vienu vienīgu reizīti man būtu pateikts: kad tev būs apnicis mācīties, tad ... Bet nekā!

Ļoti svarīgs jēdziens — «apakšprogramma»

APAKŠPROGRAMMA— Pirms skatāmies tālāk, nedaudz parunāsim vēl par vienu ļoti svarīgu programmēšanas jēdzienu. Par apakšprogrammas jēdzienu. Var gadīties, ka kaut kas programmā jāizdara daudzas reizes, bet katrreiz ar citām mainīgo vērtībām. Piemēram, šajā programmā man vairākas reizes vajadzēja noteikt, kurai republikai atbilst izraudzītais gadījumskaitlis. Bet katrreiz citā programmas vietā un ar citām mainīgo vērtībām. Definēt funkciju nevaru, jo algoritmu vienā izteiksmē iespiest nav iespējams. Tāpēc šo algoritmu noprogrammēju atsevišķi, kā apakšprogrammu, rindas sākot numurēt ar tūkstoti, lai 165gan varēja būt arī cits numurs. Tur, kur vajag izpildīt šo algoritmu, rakstu operatoru GOSUB. GOSUB 1000

— Tagad, protams, noskaidrosim, kā šo vārdu izrunā un ko tas nozīmē angliski.

— Izrunā «gousab», un tas ir saīsinājums no go to subroutine, kas nozīmē «ej uz apakšprogrammu». Bet tas vēl nav viss. Šis operators, gluži tāpat kā GO TO, vadību nodod uz norādīto rindu, mūsu gadījumā — uz rindu 1000. Programmas izpilde turpinās no šīs rindas līdz rindai, kur interpretators sastop operatoru RETURN.

Maija Saprātiņa apakšprogrammas lomā
Maija Saprātiņa apakšprogrammas lomā

— «Ritēn» nozīmēja ... nozīmēja ...

— ... atgriezties. Un programmas vadība atgriežas uz nākamo operatoru pēc GOSUB. Tātad, lai programmas daļu varētu uzskatīt par apakšprogrammu, tajā ir jābūt operatoram RETURN. Ar ko tad GO TO atšķiras no GOSUB?

— Nu, GO TO aizsūta uz kaut kurieni, no kurienes nekad neatgriezīsies, bet, ja GOSUB aizsūta, tad atgriezīsies. Bet vispār, manuprāt, ir pēdējais laiks atgriezties pie tavas superprogrammas.

— Cik tālu mēs tikām?

— Līdz rindai 530.

Par pedagoģijas automatizēšanu

— Šeit piešķiram nulles tiem mainīgajiem, kuri apzīmē kļūdaino atbilžu un uzdoto jautājumu skaitu, un sākam atkārtošanu.

— Vispirms izvēlas gadījumskaitli. Dīvaini, ka ar 166to nekas netiek darīts, vienmēr taču ar kaut ko reizināja un ņēma veselo daļu.

— Šoreiz ir vajadzīgs gadījumskaitlis intervālā no 0 līdz 1, jo tas nosaka, kādu jautājumu uzdosim: vai parādīsim republiku un pavaicāsim, kāda ir tās galvaspilsēta, vai otrādi. Tam izmanto U1 vērtību, par kuru mēs jau runājām.

— Tas nekas, var parunāt vēl. Gribu paskatīties, kas te notiks. U1 vērtība tev sākumā ir 0,5.

— Tas nozīmē, ka pusē gadījumu būs viena tipa jautājums, pusē — otra tipa jautājums.

— Labi. Bet, ja U1=0 ... Tad R — izraudzītais gadījumskaitlis starp nulli un vienu — vienmēr būs lielāks par U1, un mēs aiziesim uz rindu 670.

— Arī tad, ja U1 vērtība būtu mazāka par nulli.

— Cits gadījums. Ja tā ir lielāka par vienu. Tad vadība arvien tiks nodota uz nākamo rindu — 580. Bet, ja šī vērtība, piemēram, būs 0,9, tad gandrīz vienmēr izpildīsies nākamā rinda un tikai vienā gadījumā no desmit vadība tiks nodota uz rindu 670. Domāju, ka šos trikus saprast var. Turpināsim.

— Ja vadība pēc salīdzināšanas rindā 570 tiek nodota uz nākamo rindu, tad mēs uzreiz izvadām jautājumu un griežamies pie apakšprogrammas, kas ir rindā ar numuru 1000. Tā pasaka numuru — kuru republiku lai izvēlamies.

— Šo apakšprogrammu vajadzētu paskatīties.

— Tā ir pavisam vienkārša. Izvēlas gadījumskaitli starp 1 un 15. Ja šis skaitlis ir deviņi, tātad jājautā par Latvijas PSR, izvēlas citu gadījumskaitli, jo cilvēks, kurš dzīvo Rīgā, laikam taču zina, kam tā ir galvaspilsēta.

— Un pašās beigās — operators RETURN, kā jau katrā pieklājīgā apakšprogrammā ir jābūt.

— Un šis operators vadību nodod atpakaļ uz rindu 610, kur operators PRINT izvada vajadzīgo galvaspilsētu un operators INPUT — nākamajā rindā — ievada republikas nosaukumu.

— Tas ir kā vienmēr. Arī nākamā salīdzināšana ir diezgan parasta. Skatāmies, vai lietotājs nav ievadījis numura zīmi, un, ja ir, tad dodamies uz rindu 750. Kas tur notiek? Ahā! Izvada darba rezultātus un nodod vadību uz jauna režīma izvēli. Bet ja nu vēl nav apnicis? Ja nav apnicis, tad nezin kāpēc mainīgajam N¤ piešķir ... ko piešķir?

— N¤ man ir mainīgais, kura vērtība ir pareizā 167atbilde. Šajā gadījumā tas ir republikas nosaukums, kurš skolēnam bija jāievada.

— Un atkal aizejam uz apakšprogrammu?!

— Jā, bet nu tā ir cita apakšprogramma. Šī apakšprogramma ievadīto atbildi salīdzina ar pareizo un paziņo salīdzināšanas rezultātus. Programmā to var redzēt. Papildu darbs ir tad, ja atbilde bijusi nepareiza; tad vajag palielināt kļūdu skaitu par vienu.

— Un, kad mēs atgriežamies no apakšprogrammas, tad dodamies uz rindu 560, lai visu sāktu no jauna.

— Nākamā programmas daļa, kurā tiek parādīts republikas nosaukums un skolēnam jāievada galvaspilsētas nosaukums, ir pilnīgi līdzīga nule izpētītajai. Nedaudz atšķiras izvade, un pareizo atbildi, protams, ņemam no galvaspilsētu masīva.

Mašīna pieņem eksāmenu

— Tad jau jāiet uz eksāmena pieņemšanu.

— Pirms «pieņemam» eksāmenu, pastāstīšu, kā tas notiek. Izvēlamies vienu no 15 republikām un pavaicājam tās galvaspilsētu, pēc tam vienu no atlikušajām 14 republikām, pēc tam vienu no 13 un tā tālāk, līdz visas ir bijušas. Atšķirībā no atkārtošanas, divreiz vienu un to pašu jautājumu šeit neuzdod. Masīvā E fiksējam tās galvaspilsētas, kuras ir noskaidrotas. Sākumā tur iesūtām nulli, bet, kad galvaspilsēta jau ir atprasīta, attiecīgajā elementā iesūtām vieninieku.

— Redzu. Nuļļu iesūtīšanas cikls ir rindā 810. Nākamajā rindā tu nulles piešķir mainīgo J un K vērtībām, acīmredzot jautājumu un kļūdu skaitam.

— Jā, tā tas ir domāts. Un nākamā rinda — 830?

— Šeit, kā parasti, tiek izraudzīts gadījumskaitlis N no 1 līdz 15. Bet pēc tam ir jocīga salīdzināšana.

— Šī salīdzināšana noskaidro, vai republika ar numuru N ir vai nav atprasīta. Ja ir, tad ņem nākamo gadījumskaitli un, ja vajag, atkal nākamo, līdz kamēr atrodas tāda republika, kuras galvaspilsēta vēl nav vaicāta.

— Bet tā jau tos gadījumskaitļus var ņemt un ņemt. Ja, teiksim, ir atlikusi tikai viena neatprasīta republika ...

168— Kritika vietā. Ņem un izdomā tādu algoritmu, kurš strādātu labāk.

— Atkal pedagoģiski triki!

— Nav nekādi triki — tev tiek dota iespēja augt. Skaties tagad rindu 850.

— Tur nekā interesanta nav! Liek nosaukt izraudzītās republikas galvaspilsētu, pēc tam ievada, ko tas nabadziņš ir izdomājis, un tad, protams, salīdzina — un, ja nepareizi, tad baras. Kas gan cits te var būt?

— Var gan. Ja atbilde ir nepareiza, tad palielinās kļūdu skaits. Bet jebkurā gadījumā palielina jautājumu skaitu un atzīmē, kuras republikas galvaspilsēta jau ir atprasīta. Kad jautājumu skaits būs 15, tad eksāmens beigsies un tiks aprēķināta atzīme.

— Šausmas! Ja cilvēks nav zinājis vienu galvaspilsētu, tad viņam trulis, bet, ja divas, tad cālis. Tu, Pēci, esi nodevējs! Vajadzēja taisīt citādi: ja zina kaut vienu, tad — trijnieciņš.

— Galvaspilsētas gan nav grūti iemācīties. Un jāzina tās ir. Algoritms vispār lika taisīt tā, ka liek vai nu piecnieku, vai divnieku. Tas trijnieks ir mana pašdarbība. Labāk pārdomāsim programmu. Kā to varētu pārveidot?

Ko vēl varētu mācīt ar mašīnu ģeogrāfijā ...

— Visvieglāk būtu izveidot tādu programmu, kas māca autonomo republiku galvaspilsētas. Tur pat mainīt neko daudz nevajadzētu.

— Šo to jau nu vajadzētu. Jānomaina viss DATA operatoru saturs un savienotās republikas visur 169jāaizstāj ar autonomajām republikām. Kā arī vēl daži sīkumi. Tādi paši grozījumi būtu vajadzīgi, ja gribētu sastādīt pasaules valstu galvaspilsētu mācīšanas programmu.

Jā, nu es ticu, ka skaitļotājs var mācīt ģeogrāfiju
Jā, nu es ticu, ka skaitļotājs var mācīt ģeogrāfiju

— Tas nu gan būtu milzu darbs! Pasaulē jau ir ap pusotrsimt valstu. Visu valstu un to galvaspilsētu nosaukumus ievadīt vien!

— Drusciņ jau nu būtu jāpastrādā, bet dzīva tu, Maijiņ, paliktu. Tiesa, liekas, ka tādu eksāmenu neviens nespētu izturēt. Ievadīt pusotrsimt atbilžu — tas būtu par daudz. Eksāmenu vajadzētu pārveidot tā, lai atprasa tikai, teiksim, divdesmit valstis.

— Nevis divdesmit, bet nodibināt konstanti — un lai skolotājs tajā liek, kādu vērtību grib. Līdzīgi, kā tev ir ar konstanti U1. Arī atzīmju likšanas sistēma būtu jāpārveido. Vispār — tā ir jāpārveido.

— Arī šeit jau varēja nodibināt konstantes. Ar tik kļūdām liek četri, ar tik — trīs un ar tik — divi. Arī šīs konstantes skolotājs varētu mainīt, kā iepatīkas. Vēl varētu izdarīt tā, ka mašīna biežāk prasītu tās republikas, par kurām skolēns ir kļūdījies.

... valodās ...

Bet vispār — pilnīgi līdzīgi šo programmu varētu pārveidot svešvalodu vārdu apgūšanai. Vienā masīvā ieliec kādu tūkstoti svešvalodas vārdu, otrā masīvā — tūkstoti latviešu vārdu un — uz priekšu! Tiesa, ar vienu vārdu pārtulkot svešu vārdu latviski pa īstam jau nu nevar, bet vārda pamatnozīmi varētu. Varētu mācīt ne tikai vārdu nozīmes, bet arī dažādus likumus, piemēram, neregulāro darbības vārdu formas, kādas ir angļu valodā un kādas, iespējams, arī citās valodās atradīsies.

Ilustrācija

— Ar neregulārajiem darbības vārdiem tik vienkārši vis nebūs. Tur ir trīs formas, piemēram, go, went, gone, bet tev, Pēci, tikai divi masīvi.

— Nav jau nekāda lielā māka pielikt vēl vienu masīvu, bet var iztikt arī bez tā. Vienā masīvā es lieku nenoteiksmi go, bet otrā — abas pārējās formas went un gone. Mašīnai nebūs ne mazākās jausmas, ka vienā masīva elementā ir divi vārdi. Simbolu virkne tā taču ir.

— Tas viss par valodu; bet kā ar citiem mācību 170priekšmetiem? Vai tur šai programmai būtu kāda jēga?

— Kādus priekšmetus tu gribētu?

— Piemēram, literatūru.

— Sacerējumus jau nu mašīna nerakstīs un to, kā tas darāms, arī nemācīs. Vienīgi varētu sastādīt programmu, kas atkārto rakstnieku dzīves datus, programmā neko būtisku nemainot, bet mums tos datus diez ko mācīties nespiež. Vēsturē pilnīgi tāpat varētu mācīties svarīgāko notikumu gadskaitļus. Pirmajā masīvā notikums, otrajā — gadskaitlis.

... vēsturē ...

— Vai tu gribi teikt, ka viena masīva elementa vērtība varētu būt kāda vēsturiskā notikuma apraksts, piemēram, «Franču buržuāziskās revolūcijas sākums»?

— Kāpēc gan ne! Bet, mācoties vēsturi, ir jēga atprasīt tikai notikumus un atbildēt ar gadskaitļiem. Ja otrādi, tad pavisam grūti būs atbildēt, kas noticis, piemēram, 1890. gadā. Tad taču notika daudz kas, un nevar jau zināt, ko programmas sastādītājs ir domājis.

— Es gan nezinu nekā tāda, kas varētu būt noticis šajā gadā.

— To es tāpat — piemēram. Ja arī tu pareizi iedomātos, kas tajā gadā ir noticis, tad tā notikuma apraksts būtu jāievada tieši tāpat, kā tas programmā, operatoros DATA, glabājas.

— Izdomāju, kā šo programmu varētu pārveidot!

— Kā?

... un vēl kur citur

— Tikai tas nav gluži skolas vajadzībām. Varētu atkārtot pasaules rekordus vieglatlētikas disciplīnās. Vienā masīvā disciplīna, otrā — rekords. Ja kādam gribas paspīdēt ar savām zināšanām, tad var samācīties.

— Varētu gan. Bet kurš tad tos rekordus nezina! Tad jau labāk populāru dziesmu nosaukumus un tos ansambļus, kuri tās izpilda.

171— Tos zina visi. Tāpēc tos arī sauc par populāriem.

— Vai zini, kas man pašam šajā programmā visvairāk nepatīk? Tas, ka tā liek ievadīt mašīnpareizrakstībā. Vajadzēja noprogrammēt tā, ka stabiņā tiek izvadītas sanumurētas republikas vai galvaspilsētas un skolēnam jāizvēlas, kurš numurs kam atbilst. Pirmkārt, ievade tad būtu krietni vien ātrāka, un, otrkārt, mazāka būtu iespējamība, ka skolēns kontroldarbā uzraksta, ka «Moldahvijas galvaspilsēta ir Kishinjeva». No otras puses, tāds saraksts būtu gandrīz vai špikeris.

— Ilgi gan esam noņēmušies ar šo programmu! Bet viss taču sākās ar to, ka apspriedām, kā manu lietvārdu locīšanas programmu izmantot bērnu mācīšanai! Iznāk, ka atmiņā ar operatoru DATA būtu jāglabā nezin cik pirmās deklinācijas lietvārdu, pēc tam tie jāsaliek masīvā un pēc tam no tā masīva jāņem ārā, kā pagadās, un jādod bērnam locīt.

— Es domāju, varētu ņemt vēl vienu gadījumskaitli no 1 līdz 6, kurš apzīmētu locījuma numuru, un šo locījumu arī atprasīt. Protams, tad tev vajadzētu nodibināt simbolisko masīvu ar locījumu nosaukumiem un atbilstošajām galotnēm. Lai varētu izveidot izvadu. Vēl būs jāpārbauda, vai nav uzkritis instrumentālis. Tas ir tāds sevišķs locījums, jo tajā ne tikai mainās lietvārda galotne, bet lietvārdam tiek arī pievienots prievārds «ar». Bet nu gan jābeidz. Man vēl jāmācās latene un nepavisam ne par pirmās deklinācijas lietvārdu locīšanu.

19.

Maija uzzina par failiem

Jau ne vienreiz vien Maija bija pārmetusi Pēcim, ka viņas programmas iegūtos rezultātus tikai parāda uz ekrāna, bet viņa tos labprāt arī izdrukātu, lai varētu saglabāt, parādīt mājās. Taču to Pēcis viņai nezin kāpēc nemācot. Pēcis visu laiku bija atrunājies, 172ka vēl par agru un vispār visērtāk šo mākslu ir apgūt visu uzreiz — iemācīties par visiem failiem, kādi vien var būt. Tāpēc arī Maija nopriecājās, izdzirdusi:

— Tad nu tā, šodien sākam iedziļināties zinātnē par failiem jeb, kā es to saucu, failoloģijā.

— Beidzot! Sen jau bija laiks.

— Protams, varēja arī agrāk, bet, manuprāt, pirms ķeramies pie failiem, tev vajadzēja pierast pie programmēšanas, pie mašīnas. Tagad tev tie faili var likties pat ļoti vienkārši, taču tikai tāpēc, ka tava galviņa jau ir dabūjusi just, kas ir formālā domāšana — tāda domāšana, kāda ir vajadzīga programmistam. Bet darboties ar failiem ir jāprot. Mēdz būt programmas, turklāt ļoti svarīgas, kuras strādā gandrīz tikai ar failiem.

— Labi, beidz kult tukšus salmus! Runā konkrētāk! Skolotājs!

— Es jau tev kādreiz teicu, ka failu var saprast kā vietu uz ārējā informācijas nesēja — diska vai lentes. Un šai vietai ir apzīmējums, pēc kura to un tur uzrakstītos datus vajadzīgajā brīdī var atrast.

Fails=grāmata!

FAILA ATVĒRŠANAKatrs fails var būt vai nu atvērts, vai aizvērts. Protams, neviens neko uz ārējā informācijas nesēja ne aizver, ne atver. Tas tikai ir tāds izteiksmes veids. Atvērt failu nozīmē atļaut ar to kaut ko darīt — datus tajā rakstīt vai nolasīt. Bet aizvērt failu nozīmē uz laiku par to aizmirst. Pie tā netiek klāt, tā it kā nav, un, pirms šis fails netiek no jauna atvērts, izdarīt ar to nevar neko.

Kad OPEN atver failu, tiekam pie datiem
Kad OPEN atver failu, tiekam pie datiem

173— Un kā tad to atver?

— Lūk, piemērs faila atvēršanai.

OPEN «DK1:FAILS» FOR INPUT AS FILE 3

Kā redzi, tas ir pats garākais operators beisikā. Pārtulkosim to.

OPENDK1:FAILSFOR INPUTASFILE 3Beisikā
Atvērtfailu ar šādu aprakstuievadeikāfailu Nr. 3Latviski

— Nav gluži skaidrs, kāpēc te parādās kaut kāds «Nr. 3».

Faila loģiskais numurs

FAILA LOĢISKAIS NUMURS— Es to saprotu šādi. Šo operatoru apstrādā interpretators, kurš arī ir programma. Tam atmiņā ir paredzēta vieta, kur glabāt informāciju par atvērtajiem failiem, varētu teikt — masīvs ar failu aprakstiem, kuri nav nekas cits kā simbolu virknes. Bet masīva elementi ir jānumurē. Un šis numurs tad arī ir faila numurs! To sauc arī par faila loģisko numuru. Failu ar numuru 3 var atvērt uzreiz — pirms tam nebūt nav jāatver faili Nr. 1 un Nr. 2. Atverot failu, interpretators pārbauda, vai tāds fails uz norādītās iekārtas vispār eksistē un, ja eksistē, — vai tas jau nav atvērts. Ja izdodas atklāt kādu nepareizību, tas tiek ziņots.

Vai atceries, ko nozīmē faila apraksts, piemēram, «DK1:FAILS»?

— Jā, es atceros gan. DK1 norāda iekārtu un tās numuru, bet FAILS ir faila apzīmējums.

— Operatorā OPEN faila apraksts nav obligāti jāuzdod kā simboliska konstante. To var uzdot arī kā simboliskā mainīgā vērtību. Tas nozīmē, ka faila aprakstu var izveidot, saķēdējot atsevišķus simbolus. Paskaties, piemēram, šādu programmas gabaliņu.

100 PRINT «IEVADIET DISKA NUMURU»
110 INPUT N¤
120 PRINT «IEVADIET FAILA APZIHMEHJUMU»
130 INPUT F¤
140 OPEN «DK»+N¤+«:»+F¤ FOR INPUT AS FILE 1

Sākumā te ievadām diska numuru. Kā simbolu! Tad ievadām faila apzīmējumu.

— Kā simbolus!

— Dabiski. Un pēc tam saķēdējam pilnu faila aprakstu.

Ilustrācija

Tagad par vārdu INPUT operatorā OPEN. Tā vietā var būt arī OUTPUT.

— «Autput»... ko gan tas varētu nozīmēt? Varbūt «izvade». «Ievade» jau bija.

— Jā, un šajā gadījumā fails tiek atvērts izvadei. Vienlaikus ievadei un izvadei viens un tas pats fails nevar būt atvērts. Interpretators to neļauj. Lai vienā un tajā pašā failā vispirms ierakstītu un tad nolasītu, pirmkārt, fails jāatver ievadei, otrkārt, tajā jāieraksta, treškārt, fails jāaizver, ceturtkārt, fails jāatver izvadei un, visbeidzot piektkārt, jānolasa tas, kas ir vajadzīgs.

— Tik sarežģīti!

— Redzi, kā tas ir. Lasīt no faila var tikai pēc kārtas. Un rakstīt failā arī. Kad no faila lasām, tad interpretatoram ir zināms, cik daudz esam nolasījuši — līdz kurai vietai failā. Un, kad failā rakstām, arī tad katrreiz ir zināms, kur mēs atrodamies. Bet, ja kādā failā gribēsim gan rakstīt, gan arī lasīt, tad var iznākt, ka vienā un tajā pašā brīdī atrodamies divās vietās. Bet to mēs nevaram. Iedomājies, ka lasām failu no magnetofona lentes. Mēs taču varēsim lasīt tikai līdz tai vietai, līdz kurai lente ir aiztīta.

— Skaidrs, ka var sākt lasīt no jauna, ja failu aizver un atkal atver. Bet tu jau netaisies stāstīt, kā failu aizver.

Darbības ar failiem

Ilustrācija

— Taisos gan. To aizver ar operatoru CLOSE.

— Kā tad! «Klouz» taču nozīmē «aizvērt»!

— Šis operators ir daudz vienkāršāks par operatoru OPEN. Pēc tā ir tikai jāuzraksta tā faila loģiskais numurs, kuru tu gribi aizvērt:

CLOSE 3

Bet, ja numura pēc CLOSE nav, tad tiks aizvērti 175visi faili, kas šajā brīdī bija atvērti. Par aizvēršanu būtu viss.

— Lieliski. Vēl viens ķieģelītis Maijas Saprātiņas zināšanu pilī. Vai būdiņā.

— Vēl ir viens svarīgs, bet ļoti bīstams operators.

KILL «DK1:FAILS»

— «Kil»... Nezinu.

— «Nogalināt»! Operators nevienu jau nu nenogalina, bet tikai nodzēš failu. Kad šāds operators būs izpildīts, diskā Nr. 1 faila ar apzīmējumu FAILS vairs nebūs. Kā redzi, dzēšamais fails ir jānorāda pēc operatora KILL. Vai nu kā simboliskā konstante, vai arī kā simboliskais mainīgais, kura vērtība ir nodzēšamā faila apraksts.

Ilustrācija

— Nodzēš... Tik vienkārši — ņem un nodzēš. Bet ja nu pēc tam ievajagas?

— Ievajagas vai neievajagas, taču nekādi spēki šo failu no nebūtības neizsauks. Tā, starp citu, ir liela magnētisko disku priekšrocība atšķirībā no papīra, ka informāciju no tiem var viegli nodzēst. Bet, ja nodzēsīsi ne to, ko vajag, vaino pati sevi.

— Brrr. Auksti sametās.

Ierakstīšana failā

— Vēl jāparunā par to, kā failā ieraksta un kā no tā nolasa. To dara ar tiem pašiem vecajiem labajiem operatoriem INPUT un PRINT, kurus tu jau pazīsti. Tie ir tikai papildināti. Skaties, kā es rakstu.

PRINT # 3, A, B

Pēc vārda PRINT ir numura zīme «#», faila numurs, komats un mainīgo saraksts. Līdz ar to mainīgie tiks izvadīti failā Nr. 3. Līdzīgi dara ar operatoru INPUT.

INPUT # 4, B¤

176Šajā piemērā mainīgā B¤ vērtība tiks ievadīta no faila, kurš ir atvērts ievadei kā fails ar loģisko numuru 4.

Ilustrācija

— Vai par izvadi un ievadi tas ir viss?

— Nē, nav viss. Vēl tev ir jāzina, ka operatoros PRINT un INPUT pēc numura zīmes var būt ne tikai skaitliskā konstante, bet arī skaitliskais mainīgais. Ja šīs skaitliskās konstantes vai arī skaitliskā mainīgā vērtība ir nulle, tad ievade un izvade notiek pa vecam — uz displeja. It kā uz displeja būtu fails ar loģisko numuru 0. Tagad gan ir viss.

— Tā kā būtu sapratusi. Tas loģiskais faila numurs gan ir mazliet neskaidrāks. Bet viss gan nevar būt, jo tu neko neesi stāstījis par drukāšanu.

— Uz drukas iekārtas jāatver izvades fails, kura apraksts sastāv tikai no iekārtas koda — līdzīgi, kā tas bija, izdrukājot programmu.

OPEN «LP:» FOR OUTPUT AS FILE 4

Protams, ja šim failam esi izvēlējusies ceturto loģisko numuru.

Par drukāšanu būtu viss. Arī par failiem. Paklausies, Maija, tagad var teikt, ka tu esi apguvusi visu būtisko programmēšanā — un visu mazāk būtisko arī. Palikušas vairs tikai dažas detaļas. Tagad papētīsim šādus tādus programmas piemērus un — pie darba.

— Tieši tā. Programmēt, programmēt un vēlreiz programmēt! Tāda lai ir mūsu devīze!

Skaitļotājs apsveic svētkos

— Vispirms papētīsim apsveikuma programmu. Kas tai ir jādara un ko tā dara? Tai ir skaisti jāizdrukā apsveikums dzimšanas dienā vai kādos citos svētkos. Skaisti — tas šajā gadījumā nozīmē, ka apsveikuma tekstam visapkārt ir izdrukāts rāmītis, kuru veido kaut kāds simbols. Es to saucu par dekoratīvo simbolu.

Apsveikuma sākumā ir uzruna, kas sastāv no vārda «Dārgais», «Cienījamais» u. tml. un no paša apsveicamā cilvēka vārda. Pie tam apsveicamā vārds ir vokatīvā, kaut arī ievadīts tiek nominatīvā. Tātad vajag noprogrammēt vokatīva veidošanu. Programma, vokatīvu meklēdama, pie reizes arī noskaidro, vai 177tas ir vīrieša vai sievietes vārds. Vēl programma lietotājam pavaicā, vai apsveicamo uzrunāt ar Tu vai Jūs un vai apsveicamais ir skolēns vai pieaugušais. Varbūt sāksim pētīt pašu programmu, tad arī redzēsi, kas tur notiek.

10 REM PROGRAMMA APSVEIKUMU DRUKAHSHANAI
20 R=16 \ REM RINDU SKAITS APSVEIKUMA'
30 N=30 \ REM ZIHMJU SKAITS VIENA' RINDA'
40 S¤="*" \ REM DEKORATIHVAIS SIMBOLS
50 S1¤="DZIMSANAS DIENA." \ REM SAKARA' AR KO APSVEIC
60 DIM L1¤(2,2),T¤(10)
70 L1¤(1,1)="DARGAIS" \ L1¤(1,2)="DARGA"
80 L1¤(2,1)="CIENIJAMAIS" \ L1¤(2,2)="CIENIJAMA"
90 DIM L2¤(2) \ L2¤(1)="TEVI" \ L2¤(2)="JUS"
100 DIM L3¤(2) \ L3¤(1)="TEV" \ L3¤(2)="JUMS"
105 \
110 DATA " ","APSVEICU "," ","VELU ","DAUDZ PRIEKA,"
120 DATA "LAIMES, SKAISTUMA","PAVASARA UN"," "," "
130 DATA "        PECIS"
135 \
140 PRINT "PROGRAMMA IZDRUKA' APSVEIKUMUS"
150 PRINT "IZVADE UZ EKRAHNA   - 1"
160 PRINT "       UZ PAPIHRA   - 2" \ INPUT F
170 F=F-1 \ REM TAGAD F IR FAILA NUMURS
180 IF F=0 THEN 200 \ REM IZVADE UZ EKRAHNA
190 OPEN "LP:" FOR OUTPUT AS FILE 1 \ REM DRUKAHSHANA
195 \
200 PRINT "UZRUNAHT AR    TU - 1"
210 PRINT "         AR  JUHS - 2"
220 INPUT T \ PRINT
230 PRINT " DAHRGAIS      - 1"
240 PRINT " CIENIHJAMAIS  - 2"
250 INPUT C \ PRINT
260 PRINT "SKOLEHNS      - 1"
270 PRINT "PIEAUGUSHAIS  - 2"
280 INPUT S \ PRINT
290 PRINT "KA' VINJU SAUC"; \ INPUT V¤
295 \
300 L=LEN(V¤) \ REM VAHRDA GARUMS
310 P¤=SEG¤(V¤,L,L) \ REM ATROD PEHDEHJO BURTU
320 REM SAHKAS VOKATIHVA VEIDOSHANA
325 \
330 IF P¤<>"S" THEN 370
340 V1¤=SEG¤(V¤,1,L-1) \ REM UZRUNA, JA GALOTNE -S
350 D=1 \ REM TAS IR VIHRIESHA VAHRDS
360 GO TO 470
365 \
370 IF P¤<>"A" THEN 400
371 IF SEG¤(V¤,L-2,L-1)<>"IN" THEN 380 \ REM GALOTNE -INA?
372 V1¤=SEG¤(V¤,1,L-1) \ D=2 \ GO TO 470
380 V1¤=V¤ \ REM VOKATIHVS    \ D=2 \ REM SIEVIESHU DZIMTE
390 GO TO 470
395 \
400 IF P¤<>"E" THEN 430
410 IF SEG¤(V¤,L-2,L-1)<>"IT" THEN 380 \ REM GALOTNE -IHTE?
420 V1¤=SEG¤(V¤,1,L-1) \ D=2 \ GO TO 470
425 \
430 IF P¤<>"O" THEN 450
440 V1¤=V¤ \ D=1 \ GO TO 470
450 PRINT "IEVADS NEPAREIZS" \ GO TO 290
455 \
460 REM SAHKAS TEKSTA SAGATAVOSHANA =======================
465 \
470 RESTORE  \ FOR J=1 TO 10 \ READ T¤(J) \ NEXT J
480 T¤(1)=L1¤(C,D)+" "+V1¤+"!" \ REM UZRUNA
490 T¤(2)=T¤(2)+L2¤(T) \ REM APSVEICU TEVI(JUHS)
500 T¤(3)=S1¤ \ REM SAKARA' AR KO APSVEIC
510 T¤(4)=T¤(4)+L3¤(T) \ REM VEHLU TEV (JUMS)
520 IF S=1 THEN 540
530 T¤(7)="UN LABU VESELIBU." \ GO TO 560
540 T¤(7)="UN LABAS SEKMES SKOLA."
545 \
550 REM SAHKAS IZVADE ====================================
555 \
560 GOSUB 1000 \ REM DEKORATIHVA' RAHMJA PIRMA' RINDA
570 R1=INT((R-10)/2) \ REM ATROD RINDU SKAITU BEZ TEKSTA
580 GOSUB 2000 \ REM UN TIKPAT DAUDZ ARI' IZDRUKA'
585 \
590 REM TAGAD TEKSTS RAHMI'
600 FOR J=1 TO 10 \ REM CIKLS TEKSTA IZDRUKAHSHANAI
610 N1=INT((N-2-LEN(T¤(J)))/2) \ REM ATSTARPJU SKAITS
620 PRINT #F,TAB(5);S¤;TAB(N1+6);T¤(J);TAB(N+4);S¤
630 NEXT J
635 \
640 GOSUB 2000 \ REM IZDRUKA' RINDAS BEZ TEKSTA
650 GOSUB 1000 \ REM UN PEHDEHJO RINDU
660 CLOSE  \ PRINT  \ PRINT  \ REM AIZVER VISUS FAILUS
665 \
670 PRINT "IZDRUKAHT VISU, KA' IR         - 1"
680 PRINT "IZMAINIHT APSVEICAMA' VAHRDU   - 2"
690 PRINT "SAGATAVOT VISU NO JAUNA        - 3"
700 PRINT "BEIGT DARBU                    - 4"
710 INPUT I1
715 \
720 F=0 \ ON I1 GO TO 740,290,150,730
725 \
730 STOP
740 F=1
750 OPEN "LP:" FOR OUTPUT AS FILE 1
760 GO TO 560
770 END
775 \
1000 REM IZDRUKA' RINDU AR DEKORATIHVAJIEM SIMBOLIEM
1010 PRINT #F,TAB(5); \ FOR I=1 TO N \ PRINT #F,S¤; \ NEXT I
1020 PRINT #F \ RETURN
1025 \
2000 REM IZDRUKA' DEKORATIHVO RAHMI BEZ TEKSTA
2010 FOR I=1 TO R1
2020 PRINT #F,TAB(5);S¤;TAB(N+4);S¤
2030 NEXT I
2040 RETURN
3000 END

Vai, gandrīz aizmirsu! Man ir arī izdrukātā apsveikuma paraugs.

******************************
*                            *
*                            *
*                            *
*      CIENĪJAMĀ MAIJA!      *
*       APSVEICU TEVI        *
*      DZIMŠANAS DIENĀ.      *
*          VĒLU TEV          *
*       DAUDZ PRIEKA,        *
*     LAIMES, SKAISTUMA      *
*   UN LABAS SEKMES SKOLĀ.   *
*                            *
*                            *
*               PĒCIS        *
*                            *
*                            *
*                            *
******************************
Ilustrācija

Kā redzi, mašīna izdrukā bez garumzīmēm, un «š» vietā ir «s», pēc tam es ar lodīšu pildspalvu piezīmēju klāt visu vajadzīgo.

— Vienreizēji! Kāpēc tu man dzimšanas dienā neatsūtīji tādu apsveikumu?

— Kā es to varēju izdarīt! Šo tikai vakar izdrukāju. Bet uz nākamo dzimšanas dienu pati varēsi piedrukāt vai simtu.

— Tā nebūs interesanti.

— Bet nu par programmu. Pašā sākumā piešķiru vērtību diviem mainīgajiem R un N. Patiesībā šie mainīgie nosaka dekoratīvā rāmīša garumu un platumu. Pēc tam tiek piešķirta vērtība simboliskajam mainīgajam S¤ — zvaigznīte, kura būs rāmīti veidojošais simbols. Tālāk, par simboliskā mainīgā S1¤ vērtību tiek pieņemti svētki, kuros apsveic.

— Un šī vērtība būs jāmaina, ja gribēšu apsveikt nevis dzimšanas dienā, bet gan ar skolas beigšanu.

Par divdimensiju masīviem

— Pilnīgi pareizi. Nākamajā rindā sākas šis tas jauns. Tur tiek aprakstīts divdimensiju simboliskais masīvs L1¤. Šādi gan skaitliskie, gan simboliskie divdimensiju masīvi parādās tad, ja mainīgo vērtībām ir divi numuri, piemēram, atzīmei liecībā — priekšmeta un ceturkšņa numurs. Taču priekšmetiem tad jābūt iepriekš sanumurētiem. Cits piemērs — daiļslidošanas sacensību protokolā ierakstītās atzīmes ar daiļslidotāja numuru un tiesneša numuru. Atkal gan daiļslidotājiem, gan tiesnešiem jābūt saviem kārtas numuriem. Parasti ar divdimensiju masīviem programmā apraksta kaut kādus sarakstus, kuros ir rindas un kolonnas. Šāds saraksts var būt gan liecība, gan arī sacensību protokols. Iedomājies, piemēram, tādu sarakstu: rindās uzrakstīti zooloģiskā dārza zvēri, bet kolonnās — cik katram dienā ir jāapēd. Te ir tāds mazs fragments:

Ilustrācija

Ja gribēsi sastādīt programmu, kas apstrādā šādu informāciju, būs jānodibina divdimensiju masīvs.

— Neticu, ka dzīvnieki ar tavām normām var izdzīvot; un vispār — kas gan te būtu ko rēķināt!

— Arī es tam neticu, jo man nav ne mazākās nojausmas, cik tādai vārnai vajag. Un tiešām — kas te 181ko rēķināt, ja mums ir tikai trīs dzīvnieki! Bet ja būtu trīs simti? Tad varētu izrēķināt, cik daudz produktu tiks patērēts, cik tas izmaksās un varbūt vēl kaut ko. Līdzīgu sarakstu varētu sastādīt rūpnīcai, kur vajag tik un tik naglu, tik un tik uzgriežņu, tik un tik integrālshēmu, tik un tik tādu un šitādu vadu, lai iztaisītu vienu tādu, vienu šitādu un vēl vienu nezin kādu radioaparātu.

— Bet kādēļ tev tieši šajā programmā ievajadzējies divdimensiju masīvs?

— Manā programmā tas ir ārkārtīgi vienkāršs. Vispirms sanumurēju cieņas pakāpes: 1 — dārgais; 2 — cienījamais. Pēc tam dzimtes: 1 — vīriešu dzimte; 2 — sieviešu dzimte. Pēc tam izveidoju divdimensiju masīvu:

Cieņas pakāpe
12
Dzimte1. Vīriešudārgaiscienījamais
2. Sieviešudārgācienījamā

— Tālāk tu acīmredzot atkal nodibini simboliskos masīvus un to elementiem piešķir tās vērtības, kuras, apsveikumu drukājot, būs vajadzīgas.

Apsveikt ir jāprot

— Jā gan. Un pie tam abos masīvos L2¤ un L3¤ pirmie elementi atbilst gadījumam, kur apsveicamo uzrunā ar «Tu», un otrie — kur ar «Jūs». Varētu teikt, visus iespējamos uzrunāšanas veidus esmu sanumurējis šādi: 1 — «Tu»; 2 — «Jūs».

— Nesaprotu, kāpēc tu tik daudz par to runā. Kādas vērtības gribēji, tādas piešķīri.

— Tev taisnība. Bet es gribu uzsvērt, ka man ir jāgrib piešķirt šīs vērtības, jāizdomā, kādas tās būs un kā programma tās atradīs.

— Labi. Tālāk ir DATA operatori, kuros, spriežot pēc visa, tu glabā pašu apsveikuma tekstu.

— Es teiktu, teksta sagatavi. Pēc tam kad visas simbolu virknes no DATA operatoriem būs pārvērstas par mainīgo vērtībām — skaties rindu 60 —, tās vēl tiks papildinātas, un tas arī būs īstais teksts.

182— Interesanti, kāpēc rindā 70 pieminēta izvade uz ekrāna, ja tu taisies drukāt?

Ilustrācija

— Tā vajadzīga pārbaudei. Nedomā, ka šādu programmu varu uztaisīt uzreiz un bez kļūdām. To vajadzēja lāgot, un lāgošanas laikā pārbaudāmos fragmentus labāk ir izvadīt uz ekrāna, lai lieki netērētu papīru. Tālāk. Savu vēlmi par to, kur izvadīt apsveikumu, tu esi ievadījusi: to izsaka mainīgā F vērtība. No tās tūdaļ atņemam vienu. Kādēļ? Lai iznāktu faila numurs. Numurs failam, kuru izvadām uz ekrāna, vienmēr ir nulle, bet drukas failam varam dot tādu numuru, kādu gribam. Šoreiz vislabāk ir gribēt vieninieku.

— Bet tu jau varēji uzreiz pieprasīt, lai ievada nulli vai vienu. Nebūtu jāatņem.

— Varēju. Nedarīju tāpēc, ka tālāk programmā tiek prasītas vērtības 1 vai 2 un es gribēju, lai tādas tās tiktu prasītas visur.

— Liela muiža! Dažādās vietās būtu dažāda ievade, toties pašam mazāk jāprogrammē.

— Par sevi šeit nav jādomā. Jādomā par lietotāju.

— Eh, labāk pasaki, ko sazarošanās operators dara šeit, rindā 180!

— Te mēs izrēķināto faila numuru salīdzinām ar nulli. Ja tas ir nulle, tad ejam tālāk, jo tas nozīmē, ka lietotājs izvadu grib redzēt uz ekrāna. Bet, ja tas nav nulle, tad rindā 190 atveram drukas iekārtu — kā failu ar numuru 1.

— Tālākais ir skaidrs. Lietotājam tiek jautāts, ko viņam vajag.

— Jā, kaut kas interesantāks sākas, kad ievada apsveicamā vārdu, atrod tā garumu un pēdējo burtu rindās 300 un 310.

Cilvēkam vienkārši, mašīnai sarežģīti

— Ahā! Šeit sākas vokatīva veidošana, kā vēstī piezīme rindā 320.

— Vokatīva veidošanas algoritms ir šāds. Ja vārds beidzas ar galotni -s, tad to atmet; ja beidzas ar -a, tad nedara neko; ja beidzas ar -ina, tad -a atmet. Pēdējais noteikums attiecas gan uz tādiem vārdiem kā «Katrīna», «Janīna», gan arī uz tādiem kā «Aijiņa», 183«Maijiņa». Ja vārda galotne ir -e, tad vokatīvs sakrīt ar nominatīvu, izņemot gadījumu, kur vārds beidzas ar -īte, piemēram, «Skaidrīte», «Mudīte», «Sarmīte». Tad beigu -e ir jāatmet. Programmā nav paredzēta vokatīva veidošana tādiem vārdiem kā «Kristīne», «Hermīne» u. tml., kas beidzas ar -īne. Ja grib, lai vokatīvs būtu «Kristīn», tad jāievada nevis «Kristīne», bet «Kristīna».

— Tā nu tāda izlāpīšanās vien ir.

— Protams, varēja noprogrammēt pēdējā burta atmešanu arī šādiem vārdiem. Bet galu galā nemaz tik šausmīgi neizklausās arī uzruna «Cienījamā Kristīne».

Skaidrības labad uzzīmēšu vokatīva veidošanas algoritma blokshēmu.

Ilustrācija

184Programmā reizē ar vokatīva veidošanu tiek aprēķināta mainīgā D vērtība: D=1, ja vārds beidzas ar -s vai -o, un tātad tas ir vīrieša vārds; D=2, ja vārds beidzas ar -a vai -e, tātad — sievietes vārds. Bet atšķirt vīriešu un sieviešu vārdus nebūt nav tik vienkārši, jo ir arī izņēmumi: vīrieša vārds var beigties ar -a vai -e, piemēram, krievu «Savva», «Koļa», «Vaņa» vai vācu «Ūve» utt.

— Ahā! Šādā gadījumā programma drukās «Cienījamā Koļa!», vai ne?

— Tā būs. Bet arī šajā gadījumā programmu var «apmānīt». Ievadīt nevis «Koļa», bet «Koļas», un tad liekais -s tiks atmests. Sliktāk ir ar tiem sieviešu vārdiem, kurus algoritmā ielikt nepratu. Tā, piemēram, vārdiem «Ina», «Tīna», «Zina» tiks atmests beigu -a, turpretī «Emīlijai», «Stefānijai» — netiks atmests. Nelaime ir tāda, ka nav precīza algoritma, kuriem vārdiem galotne jāatmet un kuriem — ne.

Vispār pati svarīgākā vieta programmā ir galotnes atmešana, bet to jau tu labi atceries no lietvārdu locīšanas programmas.

Sāk veidoties apsveikuma teksts

— Drusku atceros gan. Bet par to pietiks. Pārejam pie teksta sagatavošanas, kura sākas ar rindu 470. Un uzreiz tiek nolasīti DATA operatori masīvā T¤. Bet nākamajā rindā...

— Nākamajā rindā noskaidrojas, kāpēc visur prasīju ievadīt viens vai divi.

— Ahā! Mainīgais C! Tā vērtība bija... paskatīsimies... viens, ja jāuzrunā «dārgais», un divi, ja — «cienījamais». Mainīgais D tika aprēķināts tur, kur veidojām vokatīvu.

— Bet svarīgi ir tas, ka šo mainīgo vērtības tiek...

— ...tiek izmantotas, lai iegūtu vajadzīgo divdimensiju simboliskā masīva L1¤ elementu: «dārgo» vai «cienījamo» — sieviešu vai vīriešu dzimtē.

— Tu man nemaz neļauj palepoties ar labi izdomātu vietu. Tev vajadzēja mierīgi noklausīties un beigās izsaukties: «Vai, Pēci, cik tu labi izdomāji ar tiem mainīgajiem C un D!»

185— Vai, Pēci, cik tu labi izdomāji to, ka pie atrastās masīva elementa vērtības var pieķēdēt atstarpi! Un pēc tam jau agrāk atrasto vokatīvu! Un vēl izsaukuma zīmi! Tagad tiks izdrukāts nevis «CIENIJAMAISPECI», bet gan smuki — «CIENIJAMAIS PECI!».

— To atstarpi varēja arī nelikt, bet tad masīvā L1¤ būtu jāglabā nevis vienkārši vārds «CIENIJAMAIS», bet gan «CIENIJAMAIS » ar atstarpi beigās.

Ilustrācija

— Es jau arī saku, ka tas ir lieliski.

— Vari smieties, bet es teikšu, ka programmēt jau tāpēc vien ir interesanti, ka kaut vai sīkumu, bet var labi izdomāt.

— Un tas sniedz «radošu gandarījumu».

— Vienam sniedz radošu gandarījumu strādāt, otram — smieties.

— Es jau nemaz nesmejos! Man tikai gribas tevi paķircināt.

— Labāk paskaties, kā tiek veidots masīva T¤ trešais un ceturtais elements. Šeit saķēdēju divas simbolu virknes un atstarpi starp tām nelieku, jo tā man jau bija DATA operatoros pēc vārdiem «apsveicu» un «vēlu».

— Un ko tu dari rindā 520 un tālāk? Atkal netaisnīga izturēšanās pret skolēniem! Pieaugušajiem vēli labu veselību, bet skolēniem — «labas sekmes skolā». Labas sekmes skolā, bērniņ! Kam tev laba veselība, ka tikai būtu labas sekmes.

— Neticu gan, ka kāds labu sekmju dēļ būtu zaudējis veselību.

— Nabaga Pēci! Ja tu nebūtu tik smieklīgs, tad tavu nopietnību nemaz nevarētu izturēt!

— Nesaprotu, vai turpināsim vai atliksim uz citu reizi.

Pavisam vienkārša apakšprogramma

Ilustrācija

— Viss, beidzu. Turpinām. Skatāmies rindu 550. Sākas izvade. Aizsūta uz apakšprogrammu, kura sākas ar rindu 1000... Kas tā par apakšprogrammu?

— Šeit būs divas apakšprogrammas. Pirmā izdrukā rindu ar dekoratīvajiem simboliem. Tur ir cikls, kas pa vienam simbolam drukā tik daudz reižu, cik vajag.

186— Jā, cikls ir. Bet kas tas par PRINT pirms tā?

— Ak jā! Par funkciju TAB tu vēl neko nezini. Šo funkciju var izsaukt tikai operatorā PRINT, un tā norāda rindas pozīciju, no kuras jāturpina drukāt. Labāk to paskaidrošu ar piemēriem.

PRINT «SVEIKA»; TAB(40); «MAIJA»

Vārdu SVEIKA šāds operators uz ekrāna izvadīs, sākot ar pirmo rindas pozīciju, bet vārdu MAIJA, sākot ar četrdesmito.

PRINT TAB(40); «SVEIKA»; «MAIJA»

Tekstu SVEIKAMAIJA šis operators izvadīs, sākot ar četrdesmito pozīciju.

Ilustrācija

Funkcijas argumentā nebūt nav jāuzrāda tieši skaitliska konstante, tur var būt arī jebkura aritmētiska izteiksme. Un tagad pasaki — ko dara šāds operators?

PRINT TAB(5);

— Nezinu. Man liekas, ka tas... nedara neko.

— Tev būtu taisnība, ja tam beigās nebūtu semikola. Bet, tā kā tas ir, tad nākamais PRINT operators izvadi sāks ar sesto pozīciju. Līdzīgu operatoru es rakstu rindā 110 — tādējādi pirmās piecas pozīcijas man ir tukšas un drukāšana nesākas no pašas papīra malas.

— Tad jau citas rindas arī būs jāsāk drukāt ar sesto pozīciju.

— Tā arī darīšu.

— Bet ko nozīmē šis te vientuļais PRINT operators pēc cikla?

— Lai ar vienu simbolu varētu piedrukāt veselu rindu, ciklā esošajam PRINT operatoram beigās ir semikols. Semikols savu darīs arī tad, kad cikls būs beidzies un nākamais izvads turpinās dekoratīvo rindu. Pārlēkšanu uz nākamo rindu nodrošina PRINT 187operators pēc cikla. Tas it kā pārtrauc semikola darbību.

— Un, atgriezdamies no tās apakšprogrammas, uzreiz atduramies pret kaut kādu sarežģītu aprēķinu.

— Šeit tiek aprēķināts, cik tukšu rindu ir jāatstāj starp rāmīša augšējo malu, kuru tikko izdrukāja, un apsveikuma tekstu. Tāpat arī zem teksta būs tukšas rindas. To skaitu es aprēķinu šādi. Mainīgā R vērtība — kopējais rindu skaits — man ir zināma: 15. No tā atņem 10 — rindu skaitu apsveikuma tekstā. Starpība ir visu tukšo rindu skaits. Bet cik no tām atstāt augšā? Vislabāk — pusi. Ja dalījums (R-10)/2 nav vesels skaitlis, tad no tā paņem veselo daļu. Man gribas, lai mainīgā R1 vērtība būtu vesels skaitlis, jo apakšprogrammā, kura sākas ar rindu 2000, es to izmantoju par cikla robežu.

Vēl viena apakšprogramma

Ilustrācija

— Kur ir tā tava otrā apakšprogramma? Ahā! Šeit atkal tā funkcija TAB. Bet operators PRINT šoreiz ir daudz sarežģītāks. Kaut gan nē... Saprast var. Vispirms paej piecas pozīcijas uz priekšu, tad izdrukā dekoratīvo simbolu, tad uzreiz aizlec uz rindas beigām, kur izdrukā vēl vienu dekoratīvo simbolu. Un tik vien!

— Ko tu vēl gribēji? Nekas vairāk nav vajadzīgs. Kad izvadītas tukšās rindas, var sākt drukāt tekstu. To dara cikls rindās 600—630. Vispirms tiek aprēķināts, cik tukšo vietu būs starp dekoratīvo rāmīti un pirmo teksta simbolu. Tas jādara pirms katras rindas izdrukāšanas, jo rindu garumi apsveikuma tekstā ir dažādi.

— Paskatīsimies, kā tas notiek. No visa rindas garuma atņem teksta garumu, iznākumu izdala ar divi un atrod veselo daļu. Jā, gandrīz tāpat kā toreiz, kad noteica tukšo rindu skaitu augšā un apakšā.

— Taču ir arī neliela atšķirība. Toreiz rāmīša augšējā un apakšējā mala pie rindām pieskaitīta netika: R bija rindu skaits starp rāmīša rindām, bet N ir simbolu skaits vienā rindā, ieskaitot dekoratīvo simbolu rāmīša kreisajā un labajā malā.

— Manuprāt, tas ir mazsvarīgi. Tik un tā es izraudzīšos tādus R un N, lai apsveikums izskatītos labi.

188Bet atgriežamies pie teksta drukāšanas! Mani interesē pats izvades operators rindā 620. Vispirms tas drukāšanas vietu pārbīda par piecām pozīcijām, sestajā izdrukā dekoratīvo simbolu, kā tas jau bija, tad atkal pārlec uz vietu, kur jādrukā simboli... To tu esi labi izdomājis!

— Vispār... vispār to es pats neizdomāju, man to izstāstīja Algoritms.

— Te tev nu bija! Bet tiešām tā TAB ir viena vērtīga funkcija. Nemaz nevajadzēja iepriekš zināt, cik simbolu ir apsveikuma rindā, lai to izdrukātu tieši vidū starp abiem dekoratīvajiem simboliem.

— Vēl tiek izdrukātas tukšās rindas zem teksta, tad apakšējā rāmīša rindiņa, un tas arī ir viss par teksta izvadi. Tālāk ar operatoru CLOSE tiek aizvērti visi faili, lai patiešām sāktos drukāšana.

Lietotājs izvēlas turpmāko rīcību

— Un tad programma noskaidro, kas darāms, un nu lietotājs var izvēlēties.

— Parunāsim par pirmo iespēju — izdrukāt visu, kā ir. Šajā gadījumā vadība tiek nodota uz rindu 740 un pirmā darbība ir šāda: mainīgajam F piešķir vērtību 1. Pēc tam atver drukas iekārtu, jo visi faili ir aizvērti, — atceries rindu 660.

— Bet kāpēc rindā 720 pirms operatora ON tu mainīgajam F piešķir vērtību nulle?

— Visi faili, izņemot nullto, ir aizvērti, un, ja operators ON vadību nodos uz rindu 290, tad nevarēs izpildīties operatori PRINT # F. Vienīgi gadījumā, ja F=0, tie tiks izpildīti normāli un viss tiks izvadīts uz ekrāna.

— Un, ja lietotājs gribēs izdrukāt ar cita apsveicamā cilvēka vārdu, tad nākamreiz vajadzēs izvēlēties pirmo režīmu?

— Jā, tā nu tas ir noprogrammēts... Vēl programmu varētu uzlabot, uzrakstot apakšprogrammu vokatīva atrašanai.

— Nesaprotu! Manuprāt, tā būtu vajadzīga tikai vienu reizi, bet apakšprogrammas ir vērts rakstīt tikai tad, ja tās izmanto vairākas reizes, vismaz divas, kā šajā programmā. Tā taču tu pats teici!

Ilustrācija

— Teicu gan. Bet apakšprogrammas var izmantot arī pavisam citās programmās. Piemēram, ar mašīnu spēlējot, pašā sākumā tiek noskaidrots, kā sauc spēlētāju. Viņš ievada — «Pēcis». Un beigās programma izvada: tu, Pēci, esi zaudējis! Kaut kādam sīkajam, kas no programmēšanas nekā nesajēdz, acis no pieres izsprāgs: mašīna zina, kā mani sauc! Tiesa, ar tādām iepriekš sagatavotām apakšprogrammām vajag apieties diezgan uzmanīgi, jo tajās izmantotie mainīgo apzīmējumi var sakrist ar mainīgo apzīmējumiem programmā, kura šo apakšprogrammu izmantos, un, ja šādu sakrišanu laikus nepamanīsi un nenovērsīsi, mainīgo vērtības var tikt sabojātas.

Ilustrācija

Programmas pareizības pārbaude

Bet atgriezīsimies pie apsveikumu drukāšanas programmas. Tad, kad tā bija gatava, to vajadzēja testēt — pārliecināties, ka ar visiem ievaddatiem tā tiešām strādā. Saki — kādi personvārdi man bija jāievada, lai pārliecinātos, ka uzrunas forma tiek atrasta pareizi?

Ilustrācija

— Tas taču viss ir blokshēmā! Pēcis, Pēcītis, Maija, Maijiņa, Zane, Zanīte.

— Un tas ir viss?

— Citu variantu tur nav.

— Vēl vajadzīgs vārds, kas nebeidzas ne ar vienu no šīm galotnēm. Piemēram, Krkrk.

— Labi. Kopā ar «Krkrk» iznāk septiņi vārdi. Tātad testēšanai programma būtu jāizlaiž septiņas reizes.

190— Lai notestētu vokatīva atrašanu. Bet vēl pirms personvārda ievades četrreiz tiek ievadīts vieninieks vai divnieks. Testējot sarežģītu programmu, šie septiņi vārdi mašīnā būtu jāielaiž kopā ar jebkuru kombināciju no četriem skaitļiem — vieniniekiem vai divniekiem. Tas nozīmē, ka vispār mums būtu 7.2.2.2.2=112 variantu.

— Šausmas!

— Neuztraucies. Šoreiz tas nebija jādara, jo mūsu programma ir ļoti vienkārša un pilnīgi pietiek ar vienu pārbaudi.

Ilustrācija

— Vai gribi teikt, ka ir diezgan, ja ievadām variantus «skolēns» — «Pēcis» un «pieaugušais» — «Pēcis», lai viss būtu kārtībā un nebūtu jāpārbauda varianti «skolēns» — «Maija» un «pieaugušais» — «Maija»?

— Gribu teikt vēl vairāk: pietiek, ja pārbauda vienīgi variantus «skolēns» — «Pēcis» un «pieaugušais» — «Maija» — tas ir, ja uzrunas veidošanas pārbaudi apvieno ar ievada «skolēns» — «pieaugušais» jeb mainīgā S vērtības apstrādes pārbaudi. Šis ievads programmā ļoti maz ko ietekmē: mainīgais S piedalās tikai vienā nosacītās pārejas operatorā rindā 520. Ja te būtu nevis piešķiršana, bet gan sarežģīti aprēķini, kuros izmantotu ievadīto vārdu, tad mums būtu jāizlaiž visi iespējamie varianti — divi S ievada varianti reiz septiņi vārda ievada varianti.

— Manuprāt, par mainīgā C vērtības ievadu var teikt to pašu. Šis mainīgais atbild par to, vai apsveicamais mums ir dārgs vai cienījams. Un šo mainīgo izmanto arī tikai vienreiz. Tur, kur no masīva izvēlas vārdus «dārgais» vai «cienījamais» attiecīgajā dzimtē. Ja programma pareizi izvēlēsies Maijai, tad arī Zanei būs pareizi.

— Bet atkal: ja šī C vērtība piedalītos kaut kādos sarežģītos aprēķinos, tad būtu jāpārbauda visi iespējamie varianti.

— Acīmredzot to pašu varētu teikt arī par mainīgo T, kas atrod vajadzīgo pieklājības formu. Un vēl vairāk to var teikt par mainīgo F, kurš atbild par izvadu uz ekrāna vai papīra. Ja tika pieprasīts izvadīt uz papīra un uz papīra arī izvadīja, tad, to pašu pieprasīdami nākamreiz, arī dabūsim izvadi uz papīra.

— Var cerēt.

191— Cik tad īsti to variantu sanāca?

— Tikai septiņi. Mums jāpārbauda visi personvārdi, bet, kad mašīnā būsim ielaiduši kādu variantu, tad, pirms programma liks ievadīt apsveicamā vārdu, vajadzēs ievadīt arī šādu ciparu kombināciju: vispirms — 1, 1, 1, 1; pēc tam — 2, 2, 2, 2. Bet, kā jau teicu, tik vienkārši sanāca tāpēc, ka mēs mazliet nohaltūrējām, apgalvodami, ka ievaddati cits citu neietekmē.

— Ūja! Kas tur par haltūru! Mēs kārtīgi un godīgi izspriedām, ka savstarpējās ietekmes nav; ja jau vienreiz programma vārdu «cienījamais» izvēlējās pareizi, tad arī citreiz izvēlēsies pareizi. Viss ir loģiski.

Vēl dažas iespējamās kļūdas

— Loģiski viss ir ar pareizu programmu. Bet programma var būt nepareiza, un pie tam gadās tā, ka programma strādā pareizi, bet, tikai ievadot dažas ievaddatu kombinācijas, atklājas kļūdas.

— Neticu, ka tādas kļūdas varētu būt.

— Visgrūtāk atrodamas ir tās kļūdas, kuru nevarot būt. Tā, starp citu, saka Algoritms.

— Nu tad izdomā šajā programmā kādu tamlīdzīgu kļūdu!

— Es nerunāju par šo programmu, bet vispār. Šeit tādas kļūdas varbūt arī nevar piedzejot, ja nu vienīgi pieliekam klāt vēl kādu pilnīgi jocīgu rindiņu. Piemēram, meklēdami pēdējo burtu apsveicamā vārdam, rakstām nevis

P¤=SEG¤(V¤, L, L),

bet gan kļūdaini

P¤=SEG¤(V¤, S, S).

Kas tad notiks?

— Kas notiks? Gadījumā, ja apsveicamais ir skolēns, tiks atrasts vārda pirmais burts, bet gadījumā, ja apsveicamais ir pieaugušais, — otrais.

— Programma nostrādās pareizi, ja Maiju sveiksim kā pieaugušo, un nepareizi, ja kā skolnieci. Pateiks, ka šāds vārds neder, un pieprasīs jaunu; tu atkal ievadīsi to pašu, atkal pieprasīs citu, un nekad nevarēsi ne iedomāties, kādu vārdu programmai vajag, lai tā nomierinātos. Bet ja būs šāda kļūda?

P¤=SEG¤(V¤,5,5)

— Tad apsveicamā vārdā tiks atrasts piektais burts. Tikai tiem apsveicamajiem, kuru vārdiem ir pieci burti, programma uzrunu izdrukās pareizi.

— Jāatzīstas, ka mūsu testēšanas sistēma šādu kļūdu atklāšanu nenodrošina.

— Bet kā lai tās atrod?

Ilustrācija

— Tas nav viegli. Ja mašīna atsakās ņemt pretī pilnīgi pareizu vārdu, tad pirmais, ko var iedomāties, ir gadījums, kur kāds no salīdzināšanas operatoriem strādā nepareizi. Kurš — to var noteikt, vienīgi programmā pārbaudot visus šādus operatorus. Ja tie izrādās pareizi, tad nepareizi ir dati, kuri tiek izmantoti. Bet izmantojam tikai mainīgā P¤ vērtību. Ja tā, tad pēc P¤ vērtības atrašanas ieliekam papildu rindu 315 STOP. Kad programma pie šīs rindas ir apstājusies, tad tiešajā režīmā varam izvadīt P¤ vērtību, L vērtību, kā arī tās programmas rindas, kuras šīs vērtības nosaka un piešķir. Tad arī uzzināsi, kura rinda nav pareiza.

— Tradicionāli mums tagad šī programma būtu jāpārdomā. Bet mēs ar to esam tik daudz noņēmušies, ka pārdomāšanu varam atlikt uz citu reizi.

20.

Maija turpina apgūt failoloģiju

Kad pēc dažām dienām Maija un Pēcis atkal satikās Skaitļošanas centrā, tad, tikuši pie mašīnas, viņi vispirms uzdrukāja apsveikumus visiem radiem, draugiem un paziņām dzimšanas dienās, vārda dienās, visos valsts svētkos, sakarā ar skolas beigšanu un ar skolas sākšanu — vismaz pāris gadu uz priekšu. Beidzot Maija ieteicās:

— Vajag to drukāšanu pārtraukt un parunāt par programmēšanu. Drukāšanai vien jau tos skaitļotājus neizgudroja.

Ko vēl var izdrukāt

— Skaidrs, ka ne, bet izdrukāt skaisti un saprotami taču arī ir jāprot un jāmācās. Kāds no tā labums, ja mašīna izskaitļo kaut ko derīgu, bet programmists nav parūpējies, lai rezultāti tiktu pienācīgi izvadīti.

— Vai zini, pārdomājot pēdējo programmu, man liekas, ka līdzīgi varētu programmēt dažādu sludinājumu izdrukāšanu. Piemēram, tādā un tādā datumā, tādā un tādā kabinetā notiks komjauniešu vai pionieru sapulce. Ierašanās visiem obligāta. Un beigās — paraksts. Mašīna prasa ievadīt, kad un kur, paši mēs izmainām tā simboliskā mainīgā vērtību, kurš nosaka, kas tā būs par sapulci, un — uz priekšu. Varam piedrukāt tik daudz, ka lipini kaut vai uz katra stūra.

— To tu saki pareizi. Bet tev bija taisnība arī par to, ka skaitļotāji nav izgudroti drukāšanai vien. Tas nav nekāds lielais sasniegums — kaut ko ievadīt un tūlīt pēc tam izdrukāt. Protams, zināms atvieglojums būtu. Droši vien katrā iestādē bieži nākas drukāt, piemēram, pavēles par pieņemšanu darbā, kuras maz atšķiras cita no citas. Vai arī pavēles par rājiena izteikšanu.

— Vai tu domā, ka rājienus izteic tik bieži?

— Nezinu. Ja nepatīk, tad, lūdzu, cits piemērs. Cilvēks grib braukt uz pionieru nometni un aiziet pie ārsta pēc izziņas. Ārsts paskatās: jā, vesels, lai brauc. Un palaiž programmu, kas izdrukā izziņu.

Ilustrācija

— Ārstiem tādas izziņas jau ir gatavas, atliek tikai ierakstīt uzvārdu, pārciestās slimības, asins analīzes rezultātus un varbūt vēl šo to.

— Bet tagad iedomājies, ka ārstam diskā jau ir viss par Maijas Saprātiņas veselību: slimojusi ar cūciņām, vējbakām, asinis pavisam neparastas. Attiecīgā programma to no diska nolasa un izdrukā.

— Tad gan.

Skolēnu saraksts uz diska

— Ļoti svarīgi ir prast datus ierakstīt diskā, kā arī tos nolasīt atpakaļ atmiņā. No otras puses, nekādā gadījumā nav jādomā, ka īsta ir tikai tā programma, kura strādā ar disku. Paskatīsimies, kā to 194 dara mana programma, kura apstrādā failu ar vienas klases skolēnu sarakstu. Ar šo programmu es diskā varu izveidot sākotnējo skolēnu sarakstu, varu kādu uzvārdu tam pievienot vai arī no tā izdzēst. Saraksts, kas glabājas diskā, satur skolēna vārdu, uzvārdu, tēvvārdu un dzimšanas datumu. Blokshēmu šai programmai nezīmēšu, domāju, ka tā ir diezgan vienkārša. Pietiks ar tekstu.

10 REM PROGRAMMA DARBAM AR FAILU: SKOLEHNU SARAKSTS
20 REM F¤ - FAILA NOSAUKUMS,KO PROGRAMMA VEIDO PATI NO
30 REM  KLASES NUMURA UN DISKA NUMURA
40 REM F UN F1 - ATVEHRTO FAILU NUMURI
50 REM U¤ - UZVAHRDS, V¤ - VAHRDS, T¤ - TEHVVAHRDS
60 REM D¤ - DZIMSHANAS DATUMS FORMA': DD.MM.GG
70 REM R - DARBA IZVEHLES RAHDIHTAHJS,
72 REM N - SKOLEHNU NUMURI
80 \
90 PRINT " SAHKAM DARBU AR SKOLEHNU SARAKSTU" \ PRINT
100 PRINT "TA' DISKA NUMURS, UZ KURA IR(BUHS) FAILS";
110 INPUT D¤
120 PRINT " IEVADIET KLASI, PIEMEHRAM: 6A"; \ INPUT K¤
130 PRINT  \ F¤="DK"+D¤+":"+"FASK"+K¤
135 \
140 PRINT "IZVEIDOT JAUNU SARAKSTU          - 1"
150 PRINT "PASKATIHTIES SARAKSTU            - 2"
160 PRINT "PIERAKSTIHT SKOLEHNU             - 3"
170 PRINT "IZSVIHTROT SKOLEHNU              - 4"
180 PRINT "BEIGT DARBU                      - 5"
190 PRINT "JUHSU IZVEHLE"; \ INPUT R
200 F=1 \ F1=2 \ \ \ REM FAILU NUMURI
205 \
210 ON R GO TO 230,300,370,370,220
215 \
220 CLOSE  \ PRINT "BEIDZU DARBU" \ STOP
225 \
230 OPEN F¤ FOR OUTPUT AS FILE F
240 PRINT  \ PRINT "SAHKAS IEVADE; LAI TO BEIGTU,"
250 PRINT "UZVAHRDA VIETA' IEVADIET - #"
260 GOSUB 1000 \ \ REM IEVADA ZINJAS PAR SKOLEHNU
270 IF U¤<>"#" THEN 260 \ \ REM VAI IEVADE JAHBEIDZ?
280 CLOSE  \ GO TO 140 \ \ REM IEVADI BEIDZ
285 \
290 REM PASKATIHTIES FAILU 22222222222222222222222222
300 OPEN F¤ FOR INPUT AS FILE F1
310 N=0 \ \ REM N BUHS SKOLEHNA NUMURS
320 GOSUB 2000 \ N=N+1 \ REM NOLASA ZINJAS PAR SKOLEHNU
330 IF U¤="#" THEN 280 \ REM VAI LASIHSHANA JAHBEIDZ?
340 PRINT N;TAB(3);U¤;TAB(15);V¤;TAB(25);T¤;TAB(35);D¤
350 GO TO 320
355 \
360 REM SKOLEHNU PIERAKSTIHT VAI IZSVIHTROT 34343434343
370 IF R=4 THEN 400
380 PRINT "PEHC KAHDA NUMURA PIERAKSTIHT";
390 INPUT N \ GO TO 420
400 PRINT "KAHDU NUMURU IZSVIHTROT"; \ INPUT N
410 N=N-1
420 OPEN F¤ FOR INPUT AS FILE F1
430 OPEN "DK0:DARBA" FOR OUTPUT AS FILE F
440 FOR I=1 TO N
450 GOSUB 2000 \ \ REM NOLASA ZINJAS
460 IF U¤<>"#" THEN 480
470 PRINT "NUMURS PAR LIELU" \ GO TO 670
480 GOSUB 3000
490 NEXT I
500 IF R=3 THEN 540 \ REM AIZIET UZ PIERAKSTIHSHANU
510 GOSUB 2000 \ \ REM NOLASA, BET NEIERAKSTA
520 IF U¤="#" THEN 470
530 GO TO 550 \ \ REM TAGAD JAHNOLASA ATLIKUMS
540 GOSUB 1000 \ \ REM IEVADA JAUNO SKOLEHNU
550 GOSUB 2000 \ \ REM NOLASA ZINJAS PAR NAHKAMO
560 IF U¤="#" THEN 580
570 GOSUB 3000 \ GO TO 550
580 PRINT #F,U¤ \ \ CLOSE \ \ REM VISS NOLASIHTS
585 \
590 REM NO DARBA FAILA PAHRRAKSTA JAUNO SARAKSTU
600 OPEN F¤ FOR OUTPUT AS FILE F
610 OPEN "DK0:DARBA" FOR INPUT AS FILE F1
620 GOSUB 2000 \ \ REM NOLASA NO DARBA FAILA
630 IF U¤="#" THEN 660
640 GOSUB 3000 \ \ REM IERAKSTA JAUNAJA' FAILA'
650 GO TO 620
660 PRINT #F,U¤
670 CLOSE  \ KILL "DK0:DARBA" \ GO TO 140
675 \
680 \
1000 PRINT "    SKOLEHNA UZVAHRDS"; \ INPUT U¤
1010 IF U¤<>"#" THEN 1030
1020 PRINT #F,U¤ \ RETURN
1030 PRINT "               VAHRDS"; \ INPUT V¤
1040 PRINT "           TEHVVAHRDS"; \ INPUT T¤
1050 PRINT "    DZIMSHANAS DATUMS"
1060 PRINT "     GADS PIEM.    85"; \ INPUT D1¤
1070 PRINT " MEHNESIS PIEM.    02"; \ INPUT D2¤
1080 PRINT "    DIENA PIEM.    01"; \ INPUT D3¤
1090 D¤=D3¤+"."+D2¤+"."+D1¤
1100 IF LEN(D¤)=8 THEN 1120
1110 PRINT " DATUMS IEVADIHTS NEPAREIZI" \ GO TO 1050
1120 GOSUB 3000
1130 RETURN
1135 \
Ilustrācija
1140 \
2000 REM PROGRAMMA NOLASA DATUS PAR SKOLEHNIEM
2010 INPUT #F1,U¤
2020 IF U¤<>"#" THEN 2040
2030 RETURN
2040 INPUT #F1,V¤,T¤,D¤
2050 RETURN
2055 \
2060 \
3000 REM UZRAKSTA DATUS UZ DISKA
3010 PRINT #F,U¤ \ PRINT #F,V¤
3020 PRINT #F,T¤ \ PRINT #F,D¤
3030 RETURN

Vispirms laikam jāpaskaidro, kā programmas sākumā tiek veidots faila apraksts. Lietotājs ievada tās disku iekārtas numuru, uz kuras viņš ir uzlicis disku ar skolēnu failiem. Šis numurs viņam ir jāzina. Pēc tam viņš ievada tās klases numuru, ar kuras sarakstu grib strādāt. Kādā formā viņš šo numuru ievada — tā ir viņa darīšana, galvenais, lai viņš to vienmēr darītu vienādi. Bet visādam gadījumam iedodam viņam paraugu — 6A. Pēc tam rindā 130 tiek izveidots faila apraksts.

— Kas tas ir — FASK?

— Tikko par to gribēju runāt. Tas ir saīsinājums vārdkopai «faili ar skolēniem». Pēc šī FASK skolēnu failus varēs droši pazīt. Ja lietotājs ir ievadījis, ka disks atrodas uz pirmās iekārtas un runa ir par 581A klasi, tad tiks iegūts šāds faila apraksts: DK1:FASK581A.

Failu atrod pēc tā nosaukuma
Failu atrod pēc tā nosaukuma

— 581. klases mūsu skolās nav.

— Tu taču saproti, ka skaitļotājam nav ne mazākās nojausmas par klasēm, ja programmā nav paredzēta nekāda klases pārbaude. Jēgu šai 581A klasei 197 var piešķirt vienīgi lietotājs — viņš, piemēram, var būt nolēmis, ka tas ir 58. skolas 1.a klases apzīmējums.

Tālāk paskatīsimies, kā tiek veidots saraksts. To dara apakšprogramma, kas sākas rindā 1000. Šo darbu sarežģī tas, ka programmā ir pieņemts pārtraukt ievadi, līdzko lietotājs uzvārda vietā ir ievadījis simbolu «#». Šis simbols apzīmē arī faila beigas. Ja uzvārda vietā no faila saņemam simbolu «#», tad tas nozīmē, ka vairāk nekā tajā failā nav. Tāpēc arī tūlīt pēc uzvārda ievadīšanas vai tā nolasīšanas no diska vienmēr tiek pārbaudīts, vai uzvārds nesakrīt ar «#». Pārējo datu ievade ir vienkārša. Dzimšanas gads jeb, precīzāk, dzimšanas gada pēdējie divi cipari. Dzimšanas mēnesis. Diena. Pēc tam šie dati tiek sakārtoti tādā formā, kādā tie glabāsies uz diska. Interesanti, ka šī apakšprogramma pati arī izsauc citu apakšprogrammu, lai uz diska ierakstītu datus. Tā darīt drīkst.

Pēc atgriešanās no apakšprogrammas, kas sākas rindā 1000, uzreiz pārbauda, vai uzvārda vietā ir simbols «#», tas ir, vai lietotājs ievadi nav beidzis.

Darbs ar sarakstu

Tagad par otru iespēju — paskatīties sarakstu. To dara, lai uzzinātu, kas tajā failā vispār glabājas. Nekāda apstrāde nenotiek. Tāpēc rādīšanas programma ir ārkārtīgi vienkārša. Vari paskatīties pati.

— Pagaidi, nesteidzies. Paskatīsimies apakšprogrammu, kas ir rindās 2000—2050. Tā vispirms nolasa uzvārdu un, ja tas sakrīt ar simbolu «#», tad beidz. Viss skaidrs.

— Tagad par saraksta papildināšanu un izsvītrošanu no tā. Datus par jaunu skolēnu ielikt kaut kur faila vidū nevar. Tad vajadzētu pārbīdīt tos datus, kas atrodas faila beigās pēc šiem jaunajiem datiem. Rakstot diskā, tas nav iespējams.

— Arī rakstot uz papīra, tas nav iespējams. Bet, ja uzrakstītos vārdus varētu tā smuki pārbīdīt vienu uz vienu pusi, otru uz otru pusi, vienu rindu uz augšu, otru uz leju, tad gan skolēniem būtu dzīve!

DATU PĀRBĪDĪŠANA— Laikam nebūšu izteicies precīzi. Datu pārbīdīšana diskā nav iespējama tehniski, toties ar programmēšanas līdzekļiem to izdarīt var: failu pārrakstām 198 citā vietā un pārrakstīšanas laikā pievienojam datus par jauno skolēnu. Uz diska pārrakstīt drīkst, jo tur veco informāciju ļoti viegli var nodzēst un tad tajā pašā vietā no jauna rakstīt kaut vai divsimt reižu. Starp citu, Algoritms teica, ka failam jebkurā vietā ir iespējams pievienot papildinājumus, pašu failu nepārrakstot, bet tas esot krietni vien sarežģītāk ...

Ilustrācija

— Un, lai to saprastu, jābeidz fizmati? Vai ne?

Kā papildina sarakstus

— Tiešām! Tieši tā viņš teica. Bet atgriezīsimies pie programmas. Jaunu datu iespiešana failā notiek šādi. Vispirms failu nolasa līdz tai vietai, kur sarakstā tiks uzņemts jaunais skolēns. Un ne tikai nolasa, bet arī pārraksta jaunā failā, kura apraksts ir «DK0:DARBA». Pēc tam šajā jaunajā darba failā ar tās pašas rindās 1000—1130 izvietotās apakšprogrammas palīdzību ieraksta jauno skolēnu un tad nolasa atlikumu no vecā faila, to atkal pārrakstot darba failā. Kad viss ir beidzies, tad datus no darba faila pārraksta vecajā failā. Pašās beigās darba failu nodzēš, jo tas vairs nebūs vajadzīgs.

— Noraksta, pārraksta, uzraksta, pieraksta, ieraksta, apraksta, aizraksta, izraksta. Vai to normāli izklāstīt nevar?

— Nezinu. Liekas, ka nevar. Varu vienīgi uzzīmēt shēmu.

Ilustrācija

— Tagad ir saprotamāk.

— Gandrīz tāpat notiek skolēna izsvītrošana no saraksta. Taču šajā gadījumā datus par šo skolēnu no sākotnējā faila gan nolasa, bet darba failā neie199raksta. Un to tur nebūs. Vēlāk pati papēti, kā tas programmā notiek. Bet papēti gan, jo šī ir ļoti svarīga programma.

— Kas tur ir tik svarīgs? Parasta programma un nepavisam ne pārāk interesanta! Nu, ieraksta uz diska. Un kas par to?

— Bet pēc tam taču var nolasīt! Un ar nolasītajiem datiem izdarīt visu, ko vajag! Protams, tu teiksi: ko var darīt ar klases skolēnu sarakstu? Pareizi. Neko daudz ar to nabaga skolēnu failu izdarīt nevar. Bet gluži tāpat diskā var izveidot failu ar jebkuru informāciju, kāda vien pasaulē ir.

— Kādu failu diskā varētu izveidot vēl? ... Skolēni jau ir ... Varbūt skolotājus?

— Tu, Maija, labāk domā nevis par to, ko varētu, bet gan par to, ko vajadzētu. Bet, lai to izdomātu, jāzina un jāsaprot, ko uz diska ar datiem var izdarīt un, galvenais, kas ir jādara.

— Bet man liekas, ka ar skolēnu sarakstu uz diska neko sevišķu izdarīt nevar.

— Nevajag domāt, ka skaitļotājs tev izdarīs kaut ko sevišķu! Bet, ja tavā vietā izdarīs kaut ko vienkāršu, nekas slikts nenotiks. Tev paliks vairāk laika izdarīt kaut ko sevišķu.

— Nu labi, un ko tādu vienkāršu mēs varētu izdarīt?

Kam noder šāds saraksts

— Pirmām kārtām — izdrukāt skolēnu sarakstu. Tie bieži mēdz būt vajadzīgi. Piemēram, braucot ekskursijā, līdzi ir jāņem saraksts. Kādam tas taču būs jāuzraksta. Lai drukā mašīna! Arī sporta sacensībām, ārsta apskatēm, daždažādiem sekmju ekrāniem saraksti ir vajadzīgi.

— Jā ... Daudzos sekmju ekrānos dzīvē ir nācies būt. Mums pionieros bija dažādas sacensības starp posmiem. Varētu izdrukāt posmu sarakstus, bet uz diska nav posma numura.

— Neviens tev to neliedz ievadīt. Tad programmā būs jāizveido posma numura ievade. Mainīgā P vai tikpat labi P¤ vērtības ievade. Izmainīsies apakšprogrammas: tajās parādīsies jauns mainīgais. Mazliet būs jāpārveido arī galvenā programma.

— To, kā varētu pievienot posma numura ievadi, gan jau izdomāšu. Es pat varētu pielikt klāt vēl divu mainīgo ievadi. Kaut vai divdesmit! Vienīgi nezinu, kādu.

— Tas atkarīgs no taviem nolūkiem. No tā, ko tu ar skolēniem gribi darīt. Vari ierakstīt adreses, ziņas par vecākiem. Tik un tā šīs ziņas skola prasa.

— Adreses ... Adresei, starp citu, ir sastāvdaļas. Pilsēta, iela, mājas numurs, dzīvokļa numurs ...

— Vēl pasta indekss.

— To arī gribēju teikt. Acīmredzot tad lietotājam visas šīs sastāvdaļas ir jāievada atsevišķi.

Skolēnu raksturojumu ievade

— Domāju gan. Sarežģītāk būtu tad, ja tu gribētu ievadīt ziņas, kurām precīzs rindu skaits nav zināms, piemēram, skolēna raksturojumu. Tad varētu darīt tā. Sākumā noskaidrot, cik rindu būs jāievada. Un tad uzrakstīt ciklu pa rindām. Piemēram, šādu.

1500 PRINT «RINDU SKAITS RAKSTUROJUMA'» \ INPUT N2
1510 PRINT # F, N2
1520 FOR I=1 TO N2
1530 PRINT «IEVADIET RINDU»; I; \ INPUT R¤
1540 PRINT # F, R¤
1550 NEXT I
1560 RETURN

Tas būtu papildinājums apakšprogrammai rindā 1000. Iespējams arī cits variants. Tu liec, lai lietotājs raksturojuma beigās ievada kaut ko tādu, kā raksturojumā noteikti nav, piemēram, simbolu kombināciju «//» vai «\», vai «###» u. tml. Tad papildinājums apakšprogrammai varētu būt šāds:

1500 PRINT «IEVADIET RAKSTUROJUMU»
1510 PRINT «IEVADES BEIGAS //»
1520 INPUT R¤
1530 PRINT#F, R¤
1540 IF R¤ <> «//» THEN 1520
1550 RETURN

Lūk, kā var noprogrammēt nenoteikta skaita rindu ievadi. Vai ievēroji, ka pirmajā variantā es rindu skaitu uzrakstīju uz diska?

— Ievēroju, ievēroju. Ievēroju pat to, ka arī abas daļsvītras tu uzrakstīji uz diska.

— Tas tādēļ, lai pēc tam, no diska nolasot, varētu saprast, kur beidzas raksturojums un sākas nākamā skolēna uzvārds. Uz diska tiek ierakstītas tikai mainīgo vērtības. Bet to nozīme tur izskaidrota nav. Faila saturu varētu attēlot shematiski:

Ziņas par pirmo skolēnuZiņas par otro skolēnu
UzvārdsVārdsTēvvārdsDzimš. dat.Raksturojuma pirmā rindaRaksturojuma otrā rinda...//

Kā redzi, raksturojuma beigas parāda simbols «//», bet paša faila beigas, ja vēl atceries, — simbols «#». Simbolu izvēle ir pašu ziņā, ka tikai nebūtu juku.

Ilustrācija

— Galvenokārt nolasot, vai ne?

— Tieši tā! Ko uzrakstīsi, tas arī būs jānolasa. Strādājot ar failu, labi jāpazīst tā struktūra. No kā tas sastāv, no kādām ieraksta vienībām. Piemēram, fails ar ziņām par skolēniem FASK6A sastāv no pirmā skolēna uzvārda, vārda, tēvvārda un dzimšanas datuma, no otrā skolēna uzvārda, vārda ... un tā tālāk. Visas šīs četras simbolu virknes, kuras mašīnai nenozīmē neko, bet mums nozīmē uzvārdu, vārdu, tēvvārdu un dzimšanas datumu, arī veido faila ieraksta vienību. Darbs patiesībā notiek tieši ar šīm ieraksta vienībām. Apakšprogramma rindās 1000—1130 šādu vienību uzraksta uz diska, apakšprogramma rindās 2000—2050 to nolasa. Ja programmu, kas nolasa no 202 diska, gribēsi sastādīt, piemēram, skolēnu saraksta izdrukāšanai, tad būs jānoprogrammē lasīšana pa ieraksta vienībām, kaut arī programmā skolēna dzimšanas datums varbūt nemaz netiks izmantots. Nolasīt no diska atsevišķi tikai uzvārdus nevar.

Fails sastāv no ieraksta vienībām
Fails sastāv no ieraksta vienībām

Drauga dzimšanas dienu aizmirst nedrīkst!

Man ir vēl kāda programmiņa, kas pārbauda, vai kādam no klasesbiedriem drīzumā nav dzimšanas diena. Protams, tajā tiek izmantots fails ar datiem.

10 REM PROGRAMMA DRIHZAHKAHS DZ. DIENAS NOTEIKSHANAI
20 PRINT "SHODIENAS DATUMS  DD-MM-GG" \ INPUT D1¤
30 N=5 \ REM CIK DIENU ATLICIS LIHDZ DZIMSHANAS DIENAI
40 PRINT "TA' DISKA NUMURS, UZ KURA IR FAILS AR SARAKSTU"
50 INPUT D¤
60 PRINT "IEVADIET KLASI, PIEMEHRAM, 6A" \ INPUT K¤
70 OPEN "DK"+D¤+":"+"FASK"+K¤ FOR INPUT AS FILE 1
80 S¤=D1¤ \ GOSUB 2000 \ REM NOTEIC DIENU SKAITU
90 D1=D \ REM UN SAGLABA'
100 Z=0 \ REM Z RAHDA, VAI DZ. DIENA IR ATRASTA
110 GOSUB 1000 \ REM NOLASA IERAKSTA VIENIHBU
120 IF U¤<>"#" THEN 160
130 IF Z<>0 THEN 150
140 PRINT "TUVAHKAJA' LAIKA' DZIMSHANAS DIENU NEBUHS"
150 CLOSE  \ STOP
160 S¤=SEG¤(D¤,1,5)+SEG¤(D1¤,6,8)
170 GOSUB 2000
180 IF D-D1>=N THEN 110
190 Z=1 \ REM SIGNALIZE', KA DZ. DIENA IR ATRASTA
200 PRINT U¤;" IR DZIMIS ";SEG¤(D¤,1,5)
210 GO TO 110
220 END
1000 REM NOLASA DATUS PAR SKOLEHNU
1010 INPUT #1,U¤
1020 IF U¤<>"#" THEN 1040
1030 RETURN
1040 INPUT #1,V¤,T¤,D¤
1050 RETURN
2000 REM NOTEIC DIENU SKAITU KOPSH GADSIMTA SAHKUMA
2010 DATA 0,31,59,90,120,151,181,212,243,273,304,334
2020 DIM A(12)
2030 RESTORE
2040 FOR I=1 TO 12 \ READ A(I) \ NEXT I
2050 DEF FND(I)=VAL(SEG¤(S¤,3*I-2,3*I-1))
2060 G=FND(3)
2070 D=G*365+INT(G/4)+A(FND(2))+FND(1)
2080 IF INT(G/4)<>G/4 THEN 2110
2090 IF FND(2)>2 THEN 2110
2100 D=D-1
2110 RETURN

Visi operatori šajā programmā tev jau ir labi zināmi, un vari to papētīt viena pati. Ne gluži skaidra varbūt būs vienīgi apakšprogramma rindās 2000—2110, kurā tiek aprēķināts, cik dienu pagājis kopš 1900. gada 1. janvāra.

— Kopš 1900. gada 1. janvāra! Kam tas būtu vajadzīgs?

— Mūsu pašreizējais kalendārs ir diezgan piņķerīgs. Mēneši ar 30 un 31 dienu, tad vēl tas februāris un garie gadi.

— Bet tur neko nevar darīt — pats tā kādreiz teici.

— Kaut ko arī varētu, bet acīmredzot nekas netiks darīts. Tāpēc es aprēķinu, cik dienu kopš 1900. gada 1. janvāra ir pagājis līdz šodienai un kāda klasesbiedra dzimšanas dienai, un atrodu starpību. Tā arī parāda, cik dienu vēl ir atlicis. Kāpēc tieši 1900. gada 1. janvāris? Laikam jau šis datums nav obligāts, bet tāds bija programmā, kuru man iedeva, lai es varētu noprogrammēt šo daļu. To, kā tiek aprēķināts pagājušo dienu skaits, diezgan viegli saprast, ja zina, ka katrs ceturtais gads ir garais un skaitļi, kurus ielasa masīvā A, ir dienu skaits no gada sākuma līdz attiecīgā mēneša pirmajam datumam. Par šo apakšprogrammu tas arī būtu viss. Bet vispār šo programmu, kas nolasa ziņas no faila, varam apvienot ar to, kura drukāja apsveikumus, un uzdrukāt apsveikumu, ja dzimšanas diena ir tuvu. Bet tad gan faila ieraksta vienībai ir jābūt citādai un jāsatur vairāk ziņu par apsveicamo — visu, kas bija vajadzīgs drukāšanas programmai: «pieaugušais» vai «skolēns», «cienījamais» vai «dārgais» utt.

Ilustrācija

— Var pafantazēt un iedomāties, ka mašīna apsveikumu izdrukās nevis šeit, mašīnzālē, bet gan pieslēgsies pie personālā kompjūtera apsveicamā dzīvoklī un izdrukās tur. Un varbūt pat nevis izdrukās, bet ierakstīs diskā, ka apsveicis ir Pēcis Beisikāns. Bet tas laimīgais savukārt ar savu programmu pārbauda, kas viņu ir apsveicis. Tad šī programma drukā atbildes apsveikumus — un arī varbūt nevis drukā, bet gan pilnīgi patstāvīgi ieraksta Pēča Beisikāna 204 personālā kompjūtera diskā. Tas būs brīnišķīgi! Neviens nebūs pašam jāapsveic! Visu darīs mašīnas.

— Ja negribi, tad tādas apsveikšanas programmas vari arī netaisīt — neviens tev to neliek. Bet tagad iedomājies, ka failā glabājas nevis uzvārdi, bet gan darbi, kas ir jādara. Un arī darbu izpildes termiņi ir turpat. Tad mašīna izdrukās nevis apsveikumu, bet gan atgādinājumu, pēc cik ilga laika tev būs kaut kas jādara. Tad tā būs darbu izpildes kontroles programma. Šādu programmu esot ļoti daudz. Avīzē esmu lasījis, ka kādā rūpnīcā darbu izpildes termiņus kontrolējot mašīna un ka tas esot ļoti izdevīgi.

— Ja runa ir par darbiem rūpnīcās vai kur citur, tad dienu skaits līdz darba izpildes beigām maz ko izsaka. Svarīgi ir tas, cik darbadienu jāpatērē. Bet par to nekas runāts netika.

— Aprēķināt darbadienas būs grūtāk, bet arī tas nav nekas neizpildāms. Tas pats dienu skaits kopš gadsimta sākuma ļauj noteikt nedēļas dienu.

— Vai patiešām?!

— Protams. Jāzina tikai tas, ka gadsimta pirmā diena — 1900. gada 1. janvāris — bija pirmdiena. Tātad, ja, kopējo dienu skaitu kopš tā laika dalot ar septiņi, atlikumā ir viens, tad tā ir pirmdiena, ja divi, tad otrdiena ...

— Oho! Bet valsts svētki?

— No tiem būs jāizveido saraksts. Nu, masīvs ar datumiem. Protams, būs jāpadomā.

— Tas viss ir interesanti. Bet man par darbu ar failiem tomēr gribētos dzirdēt vēl. No tā, ko pastāstīji, nevar izsecināt, ka īstajiem uzdevumiem tie faili tiešām būtu tik svarīgi.

— Vai tiešām? Pēc tik lielas runāšanas?! Izdarīsim tā. Es līdz nākamajai reizei padomāšu par to, kur faili vēl vajadzīgi, un atnesīšu programmēšanas uzdevumus, kurus mums deva Algoritms.

— Uzdevumus? Varbūt nevajag?

— Vajag gan. Kaut vai padomāt par to, kā tie būtu risināmi.

21.

Maza ekskursija pa Suvorova ielu

— Maija, vai tu negribētu doties ekskursijā pa Suvorova ielu?

— Bet es ...

— Nē, nē. Nekur nebūs jābrauc. Iedomāsimies, ka ejam pa šo ielu, skatāmies pa labi un pa kreisi un apspriežam, kur varētu izmantot ESM un kur šajā izmantošanā noderētu faili.

Skaitļotājus — katrā mājā!
Skaitļotājus — katrā mājā!

— Tad sāksim ar stacijas laukumu.

— Stacijas laukumā ir stacija. Un tur ir plašas iespējas izmantot elektronisko skaitļotāju — gan ar failiem, gan bez tiem. Piemēram, tu gribi braukt uz Vladivostoku. Bet nezini, ar kādu vilcienu, no kāda perona, cik jāmaksā, cik ilgi vilciens ies, vai ir jāpārsēžas u. tml. Bet, par laimi, stacijas telpā ir displejs un uz ekrāna tu redzi uzrakstu: IEVADIET, UZ KAHDU PILSEHTU GRIBAT BRAUKT. Tu, protams, ķeries pie tastatūras un uzzini visu, ko vajag. Vai pēc visām šīm nodarbībām vari pastāstīt, kā būs izveidota šāda informācijas programma?

— Tur būs masīvs ar visu pilsētu nosaukumiem ...

— Jā. Un vēl?

— Vēl masīvs ar ... Nē. Vairāki masīvi. Daudz masīvu. Ar vilcienu nosaukumiem, piemēram, Rīga—Maskava, ar peronu numuriem, ar biļešu cenām, ar atiešanas laikiem un visu pārējo. Lietotājs ievada pilsētas nosaukumu; mašīna pārbauda, vai tāda pilsēta masīvā ir. Ja ir, tad no visiem masīviem paņem vajadzīgo informāciju.

Ilustrācija

— Tā varētu būt. Manuprāt, faili šādai programmai nebūtu vajadzīgi: visu informāciju par dažiem simtiem pilsētu varētu glabāt programmā — operatoros DATA — un, kā vienmēr, darba sākumā tajos masīvos ielasīt. Faili būtu vajadzīgi, lai kasierēm izsniegtu ziņas par brīvajām vietām. Tad būtu jāizveido faili ar katra vilciena vietām.

— Fails ar vietām ... Nesaprotu.

— Es to iedomājos šādi. Tāda faila ieraksta vienība aptver vienu vagonu un sastāv no vagona numura, tipa (piemēram, nulle — kupejvagons, viens — vietaskaršu vagons u. tml.) ... Beigās ir skaitļi, kuri apraksta vietas (nulle, ja vieta brīva, viens, ja aizņemta) un kuru ir tikpat daudz, cik vietu. Kupejvagonā, piemēram, ir 36 vietas. Pārāk vienkārša šāda programma vis nebūtu: būtu ko padomāt, kā veidot brīvās vietas meklēšanu, kaut kur varbūt vajadzētu atzīmēt, ka attiecīgajā vagonā brīvu vietu nav. Ieraksta vienībā varētu norādīt pirmās brīvās vietas numuru, lai nav jāpārbauda viss vagons.

— Pārbaudīt nozīmē vietu skaitļus salīdzināt ar nulli, ja nulle, tad brīvs, tu teici ...

— Kā tad. Vai tad tu nesaprati?

— Nekas, nekas. Es tikai skaļi domāju.

— Blakus stacijai ir pasts. Šeit var izdomāt informācijas programmu, kas atvieglo parakstīšanos uz laikrakstiem un žurnāliem. Cilvēks atnāk uz pastu, pieiet pie displeja, un viņam parāda, uz kādiem žurnāliem par dārzkopību vai programmēšanu viņš var parakstīties, cik tas maksā.

— Nu tu šauj pār strīpu. Kā tu varēsi noteikt, par ko ir žurnāls? «Dārzs un Drava» ir par dārzkopību, tas jau ir redzams pēc nosaukuma, bet «Lauku Dzīvē» arī ir raksti par dārzkopību ...

— Uz nosaukumu nav ko paļauties. Vajadzētu darīt tā. Diskā ierakstot ziņas par žurnāliem, faila ieraksta vienībā paredzam šādu informāciju: nosaukumu, numuru skaitu, viena numura cenu, par ko šis žurnāls ir. Teiksim, simbolu virkne JA-SK-PO-LI varētu nozīmēt — jaunatnei, par skolām, sabiedriski politisks, literārs. Šādi īsumā varētu raksturot žurnālu «Draugs». Sastādot šādu programmu, visgrūtāk būtu izlemt, kāda ir katra žurnāla orientācija.

— Labi. Pārejam ielu. Tur ir veikali. Gastronomija, dzērieni, saimniecības preces, tālāk audumi.

— No programmēšanas viedokļa visi veikali ir gandrīz vienādi. Failā glabājas ziņas par preču krājumiem. Saņem preci — atzīmē failā. Pārdod preci — atkal atzīmē. Tā var zināt, kādas preces ir veikalā, cik dienām katras preces pietiks.

— Nu tu gan stipri idealizē. Tā jau tur grib zināt, cik dienām katras preces pietiks.

— Protams, ka idealizēju. Bet tas nekas. Vēl lielāka idealizēšana būs, ja pateikšu, ka, piemēram, saimniecības preču veikalā varētu būt informācijas programma par tur dabūjamām precēm. Pircējs ieiet veikalā, pieiet pie displeja, un viņam parāda ziņas par visiem atslēdznieka instrumentiem, kādi ir veikalā, vai par krāsām, vai par naglām, vai par ledusskapjiem. Kas ir pārdošanā, kam noderīgs, cik maksā, cik atlicis. Programma būtu pilnīgi līdzīga tai, kuru mēs gribējām sastādīt par žurnāliem.

— Ejam tālāk. Optikas darbnīca, foto ateljē ...

— Visas darbnīcas mums ir vienādas. Tām varētu sastādīt programmu, kas kontrolētu pasūtījumu izpildes termiņus un būtu ļoti līdzīga tai, kuru tev rādīju. Nu, tai, kura rēķināja, cik dienu atlicis līdz klasesbiedra dzimšanas dienai. Šeit tā aprēķinātu, cik pasūtījumu jāizpilda vienas, divu, desmit dienu laikā. Protams, programma varētu tikai atgādināt, kas nav izpildīts. Pati tā nevarētu izpildīt neko.

— Tagad nāk viesnīca, klubs.

— Viesnīca un klubs mums ir līdzīgi stacijai. Stacijā bija vilcieni un vagoni, viesnīcā ir numuri, klubā — koncerti. Visās šajās iestādēs tiek rezervētas vietas; jāzina, cik vietu ir aizņemts, cik — brīvu.

— Tālāk nekā interesanta nav. Veikali, veikali, veikali. Tos tu bāz vienā maisā. Uzskaites un informācijas maisā.

— Protams, katrā vietā gan uzskaitei, gan informācijai būs savas atšķirības. Par tām nevaru neko pastāstīt, jo mani jau neviens nekur iekšā nelaidīs un neinformēs, kādas viņiem ir darba īpatnības. Bet šīs īpatnības mūsu programmu var diezgan stipri izmainīt. Mūs mācīja, ka programmistam labi jāzina ne tikai programmēšana, bet arī tas, ko viņš programmē. Ja viņš ķeras pie viesnīcas vajadzībām domātas programmas, tad darbs viesnīcā viņam jāpārzina, cik labi vien iespējams.

— Tev vēl atliek pateikt: «Cienījamie Rīgas viesi. Līdz ar to mūsu ekskursija pa Rīgu beigusies.»

22.

Ko vēl var izdarīt

— Tagad tev parādīšu apsolītos uzdevumus. Ir gan ļoti vienkārši, gan arī ļoti sarežģīti. Algoritms teica, ka programmistam jau no paša sākuma jāprot noteikt programmas sarežģītību, to, cik ilgi viņš ar programmu noņemsies.

  1. Spēle ar skaitļiem. Mašīna «iedomājas» vienu skaitli no 1 līdz 1000. Spēlētājam šis skaitlis ir jāuzmin. Minēt drīkst ne vairāk kā desmit reižu. Mašīna, katrreiz saņēmusi minējumu, pasaka, vai tās skaitlis ir lielāks vai mazāks. Izdomāt spēles algoritmu.
  2. Tā pati spēle, taču šoreiz skaitli iedomājas spēlētājs, bet mašīna min.
  3. Tās pašas spēles, kas bija iepriekšējos uzdevumos, bet vienu reizi drīkst mānīties — pateikt, ka skaitlis ir lielāks vai mazāks par pareizo, kad patiesībā nav.
  4. Sportloto. Sastādīt programmas šīs spēles cienītājiem. Vienu, kas izdrukā sešus skaitļus no 49 vai piecus no 36, protams, gadījumskaitļus. Otrai programmai uz diska jāuzkrāj informācija par visiem skaitļiem, kas laimējuši sportloto izlozēs, jāmeklē kopsakars starp šiem skaitļiem un pēc tā jāparedz nākamās izlozes rezultāti.
Ilustrācija
  1. Noprogrammēt šādu spēli: spēlētājs nosauc skaitli no 1 līdz 10, otrs tam pieskaita skaitli robežās no 1 līdz 10 un paziņo summu. Un tā tālāk. 209 Tas, kurš pirmais nosauc summu 100, ir uzvarētājs. Programma var būt gan pirmā, gan otrā spēlētāja lomā. Izdomāt tādu spēlēšanas algoritmu, kas nodrošina uzvaru. Noprogrammēt šo algoritmu. Sastādīt vēl vienu programmu, kura uz uzvaras algoritmu nepārietu uzreiz no paša spēles sākuma, lai pretspēlētājs šo algoritmu nevarētu uzminēt. Bet, ja programma «jūt», ka pretspēlētājs šo algoritmu zina, tad nākamajā spēlē uz uzvaras algoritmu tā pāriet iespējami agri.
  2. Bulgāru tautas uzdevums. Vienam zemniekam ir 25 bifeļgovis. Pirmā dienā dod 1 litru piena, otrā — 2 litrus un tā tālāk līdz divdesmit piektajai, kura dienā dod 25 litrus. Kā lai zemnieks šīs govis taisnīgi sadala starp saviem pieciem dēliem? Katram jāsaņem vienāds govju skaits un no šīm govīm dienā jāizslauc vienāds daudzums piena. Sastādīt programmu uzdevuma atrisināšanai!
  3. Sastādīt programmu, kas ievadīto skaitli no 1 līdz 10 000 izdrukātu ar vārdiem latviski, krieviski, angliski, vāciski. Piemēram, ievadot «25», tiek izdrukāts «divdesmit pieci». Un otrādi — ievadot «divdesmit pieci», izdrukā «25».
  4. Sastādīt programmu, kas jebkuru ievadīto skaitli no 1 līdz 1000 izvadītu romiešu numerācijā un otrādi.
  5. Mašīnā tiek ievadīti trīs pozitīvi skaitļi. Programmai janoteic, vai šie skaitļi der par trijstūra malām. Vai iegūtais trijstūris būs vienādmalu, vienādsānu vai dažādmalu? Vai tas būs taisnleņķa, šaurleņķa vai platleņķa trijstūris? Kāds būs trijstūra laukums? Aprēķināt trijstūra augstumus. Vai no šiem augstumiem var izveidot jaunu trijstūri? Ja var, tad vai tas būs vienādmalu, vienādsānu vai dažādmalu trijstūris? (Skaitļa X kvadrātsakni izrēķina funkcija SQR(X).)
  6. Spēle «Trīs drakoni». Programma izvada divus veselus gadījumskaitļus no 1 līdz 100. Pretspēlētājam jāievada trešais. Ja visi trīs skaitļi der par trijstūra malām, tad spēlētājs iegūst 3 punktus, ja neder, tad zaudē 33. Ja trijstūris ir vienādsānu, tad klāt nāk trīs punkti, ja vienādmalu, tad — 33. Ja trijstūris ir taisnleņķa, tad spēlētājs uzvar un saņem nosaukumu «trīskārtējais 210 lielmeistars». Uzvarai jāsavāc 33×3+3 punkti. Spēli sarežģī tas, ka pirms skaitļu pārbaudes trīsreiz pēc kārtas tiek izraudzīts gadījumskaitlis 1, 2 vai 3. Ja pirmajā reizē uzkrīt trīs, tad parādās pirmais drakons. No sākotnējiem trim skaitļiem tas izvēlas to, kurš dalās ar trīs (ja tāds ir), un šo skaitli samazina par vienu trešdaļu. Ja otrreiz uzkrīt trīs, parādās otrais drakons un skaitli, kurš dalās ar trīs (ja tāds ir), palielina par vienu trešdaļu. Un, ja trešajā reizē uzkrīt trīs, tad parādās trešais drakons un mazāko skaitli pareizina ar trīs.

Kad trijstūra perimetrs ir 33, programma izraugās gadījumskaitli 1, 2 vai 3. Drakons, kuram ir šis numurs, tiek aizdzīts pazemē.

  1. Skaitļu minēšana. Programma izvēlas četrus gadījumskaitļus no 1 līdz 9 un no tiem sastāda simbolu virkni. Pretspēlētājam tā ir jāuzmin. Pēc katras minēšanas programma paziņo, cik cipari ir uzminēti — cik reizes «iedegas zaļā uguntiņa» — un cik cipari gan ir nosaukti, bet ielikti nepareizās vietās — cik reizes «iedegas dzeltenā uguntiņa». Piemēram, programmas izraudzītais skaitlis ir 6834.
Spēlētāja minējumiProgrammas atbildes — «uguntiņas»
33331 zaļa
33662 dzeltenas
66332 zaļas
76331 zaļa, 1 dzeltena
68333 zaļas
68432 zaļas, 2 dzeltenas
6834Uzminēts septiņos gājienos.
  1. Sacenšas divi spēlētāji. Pirmais aizgriežas prom, un otrais mašīnā ievada vārdu. Programma nodzēš ekrānu un ievadīto vārdu otrajam spēlētājam parāda sajauktā burtu secībā. Piemēram, ievadīts vārds MOTORS, tiek parādīts — TROMSO. Otrajam spēlētājam ievadītais vārds ir jāuzmin. Pēc tam spēlētāji apmainās vietām. Programma fiksē katra spēlētāja apdomāšanās laiku un minējumu skaitu.
  2. Spēle «Karātavas». Sacenšas divi spēlētāji. Pirmais 211 aizgriežas prom, un otrais mašīnā ievada vārdu. Programma nodzēš ekrānu un parāda ievadītā vārda pirmo un pēdējo burtu, pārējo burtu vietā ir svītras. Piemēram, ievadīts SKOLNIEKS, parādīts S - - - - - - - S. Pirmais spēlētājs min burtus pa vienam, un programma pārbauda, vai tie kādā vietā der. Ja der, tad attiecīgā svītra tiek nomainīta pret burtu. Programma fiksē minējumu skaitu.
  3. «Mākslīgais intelekts». Programma uz ekrāna izvada uzaicinājumu aprunāties. Ja atbildei tiek ievadīts teikums, kas beidzas ar izsaukuma zīmi, programma izvada «Lūdzu, mierīgāk!». Ja tas beidzas ar jautājumzīmi, programma izvada «Mazliet jāpadomā». Pārējos gadījumos programma ar vienādu varbūtību atbild «Esmu par to dzirdējusi» vai «Un kas tad ir?». Katrai atbildei seko piedāvājums «Parunāsimies vēl».
  4. Atmiņas pārbaude. Uz īsu brīdi programma parāda kādu brīvi izraudzītu burtu (izmantojot funkciju RND). Spēlētājam tas pats burts ir jāievada. Tad programma parāda divus brīvi izraudzītus burtus. Un tā tālāk, līdz kamēr spēlētājs kļūdās. Programma fiksē, cik burtu viņš atcerējies.
  5. Statistiskā modelēšana. M metrus garā ielas malā brīvi izraudzītās vietās piestāj vairākas vienādas automašīnas. Cik automašīnu šādā stāvvietā vidēji varēs atrasties, ja viena aizņem K metrus? Sastādīt programmu šādas situācijas modelēšanai: uz nogriezni [0;1] tiek mesti mazāki nogriežņi ar garumu K/M. Katrreiz, kad mestais nogrieznis uzkrīt virsū kādam no iepriekš uzmestajiem nogriežņiem, mešana jāatkārto. Mešana tiek pārtraukta, kad uz nogriežņa vairs nav vienlaidu brīvas vietas, kuras garums pārsniegtu K/M. Tad tiek saskaitīts, cik mazo nogriežņu iegājis nogrieznī [0;1]. Modelēšanu atkārto 1000 (vai vairāk) reižu un aprēķina nogriežņa [0;1] vidējo ietilpību.
  6. Sastādīt programmu, kas diskā glabātu PSRS hokeja vai futbola čempionāta spēļu rezultātus un pēc pieprasījuma izdrukātu pašreizējo stāvokli turnīrā.
  7. Esperanto valodā visi darbības vārdi tagadnē beidzas ar -as, pagātnē ar -is. Citu vārdu ar šādām galotnēm nav. Sastādīt programmu, kas 212 teikumos tagadni nomainītu ar pagātni. Ņemt vērā, ka pēc vārda var būt gan atstarpe, gan pieturzīme. Vai šā uzdevuma risināšanā esperanto valoda ir jāzina?
  8. Izstrādāt jaunu programmēšanas valodu BALVA, kas nozīmē — beisika atveidojums latviešu valodā. Operatori tajā tiek doti nevis beisikā, bet gan latviešu valodā. Piemēram, GO TO vietā ir EJ UZ; RETURN vietā — ATGRIEZIES; FOR, TO, STEP vietā attiecīgi — PRIEKSH, LIHDZ, SOLIS. Sastādīt programmu, kas balvas programmas pārveidotu par beisika programmām. Balvas programma ir failā uz diska — katra rinda kā simbolu virkne. Un otrādi — beisika programma uz diska jāuzraksta kā simbolu virkņu fails.
  9. Izdevniecība veic kādas grāmatas lasītāju anketēšanu. (Paraugs — anketa grāmatas beigās.) Sastādīt anketēšanas rezultātu apstrādes programmu. Vispirms visi iesūtīto anketu dati ir jāuzkrāj diskā, pēc tam jānolasa un jānoskaidro, piemēram, kā grāmatu ir sapratuši 10—15 gadu vecie lasītāji, kā 30—40 gadu vecie; kas tajā ir paticis zēniem un kas meitenēm; kura vieta grāmatā nav izdevusies; ko varēja saīsināt; par ko pastāstīt plašāk. Izdomāt, kādu informāciju šāda anketēšanas rezultātu apstrāde var dot vēl.
  10. Sastādīt 20 apmācības un atkārtošanas programmas par visu ceturksnī apgūto mācību vielu. Var arī tādas, kas apmācību veic spēles formā — līdzīgi «Trim drakoniem» (sk. 10. uzd.).

— 20 programmas! Neko teikt — asprātīgi! Vai vairāk izdomāt nevarēji?

— Kāpēc gan ne? Ķeries tik pie darba!

— Un tā anketēšana! Kam velti tērēt laiku tādai programmai, ja labi zināms, ka neatsūtīs vairāk par dažām anketām?

— Bet ja nu atsūta, ja negrib citiem izbojāt spēlēšanos?

— Var jau būt ... Un vispār, laiks beigt.

Bija jauks vasaras vakars. Pāri pilsētai tikko bija pārskrējusi lietusgāze, un saule pirms rietēšanas steidza apžāvēt slapjos trotuārus. Neviens nepievērsa uzmanību zēnam un meitenei, kas zem bulvāra liepām nesteigdamies gāja uz stacijas pusi. Negaidīti meitene tik strauji apgriezās riņķī, ka ar somu trāpīja savam pavadonim vēderā, un izsaucās:

— Dzīve ir lieliska vēl arī tāpēc, ka cilvēks var programmēt!

Tas gan nebija viņas izdomāts izteiciens, bet ne Pēcis, ne pa peļķēm lēkājošie zvirbuļi neiebilda.

Īsa atgādne par beisiku

Kvadrātiekavās [] ieslēgtie vārdi un simboli nav obligāti.

Stūriekavās <> ieslēgtie vārdi un simboli paskaidro, kas šajā vietā rakstāms, sastādot programmu.


RN — patvaļīgs rindas numurs.

MA — patvaļīgs mainīgā vai masīva elementu apzīmējums.

AI — patvaļīga aritmētiskā izteiksme.

Operatori

<MA>=<AI> — piešķires operators

INPUT [# <Faila numurs>,] <MA> [,<MA> ...] — ievades operators

PRINT [# <Faila numurs>,]<AI>[,<AI> ...] — izvades operators

DATA <vērtību saraksts> — datu glabāšanas operators

READ <MA>[<,MA> ...] — datu ielasīšana no datu glabātavas

RESTORE — pāreja uz datu lasīšanu no glabātavas sākuma

IF <nosacījums> THEN <RN> — nosacītās pārejas operators

GO TO <RN> — tiešās pārejas operators

ON <AI> GO TO <RN> [,<RN> ...] — aprēķināmās pārejas operators

GOSUB <RN> — pāreja uz apakšprogrammu

RETURN — atgriešanās no apakšprogrammas

FOR <MA>=<AI> TO <AI> STEP <AI> — cikla sākums

214NEXT <MA> — cikla beigas

DIM <masīva apraksts> [,<masīva apraksts> ...] — masīva definēšana

DEF FN <burts>[¤] (<argumenti>)=<beisika izteiksme> — programmista funkcijas definēšana

OPEN <faila apraksts> FOR INPUT AS FILE <faila numurs> — faila atvēršana ievadei

OPEN <faila apraksts> FOR OUTPUT AS FILE <faila numurs> — faila atvēršana izvadei

CLOSE [<faila numurs>[,<faila numurs> ...]] — faila aizvēršana

KILL <faila apraksts> — faila nodzēšana

REM <teksts> — piezīme

STOP — programmas loģiskās beigas

END — programmas fiziskās beigas

Funkcijas

ABS(X) — absolūtā vērtība

INT(X) — veselā daļa

SGN(X) — skaitļa zīme (vērtības 1, 0 vai —1)

SQR(X) — kvadrātsakne

LOG(X) — naturālais logaritms

LOG10(X) — decimāllogaritms

EXP(X) — eksponente

SIN(X) — sinusa funkcija

COS(X) — kosinusa funkcija

ATN(X) — arktangensa funkcija

RND — gadījumskaitlis

PI — skaitlis 3,14159

TAB(X) — drukāšanas sākuma pozīcija

VAL(X¤) — simbolu virknes pārvēršana skaitlī

STR¤(X) — skaitļa pārvēršana simbolu virknē

LEN(X¤) — simbolu virknes garums

POS(X¤, Y¤, N) — ar kuru simbolu sākot virknē X¤ ieiet virkne Y¤

SEG¤(X¤, M, N) — apakšvirknes izdalīšana

CLK¤ — pulksteņlaiks

DAT¤ — datums

Pavēles

NEW <programmas nosaukums> — jaunas programmas veidošana

OLD <faila apraksts> — vecas programmas izsaukšana atmiņā

215SAVE <faila apraksts> — programmas saglabāšana diskā

LIST [NH] <rindu numuru saraksts> — programmas teksta parādīšana uz ekrāna

RUN [NH] — programmas palaišana

RESEQ — programmas pārnumurēšana

BYE — darba izbeigšana

SUB <RN> <atdalītājs> <1. apakšrinda> <atdalītājs> [<2. apakšrinda> <atdalītājs>] — programmas rindas izlabošana

Priekšmetu rādītājs

AIZVĒRŠANA, FAILA 164

ALGORITMS 20

APAKŠPROGRAMMA 164

APRAKSTS, FAILA 56

APZĪMĒJUMS, FAILA 56

APZĪMĒJUMS, MAINĪGĀ 46

ARITMĒTISKĀ IZTEIKSME 41

ATMIŅA 11

ATVĒRŠANA, FAILA 172

BLOKSHĒMA 22

CIKLA MAINĪGAIS 84

CIKLA OPERATORS 85

CIKLA ROBEŽA 84

CIKLS 22

DISPLEJS 15

EKSPONENCIĀLĀ FORMA 43

ELEMENTS, MASĪVA 79

FAILA AIZVĒRŠANA 174

FAILA APRAKSTS 56

FAILA APZĪMĒJUMS 56

FAILA ATVĒRŠANA 172

FAILA LOĢISKAIS NUMURS 173

FAILS 56

FUNKCIJA CLK¤ 143

DAT¤ 140

INT 100

LEN 134

POS 135

RND 106

SEG¤ 136

STR¤ 139

TAB 186

VAL 139

FUNKCIJA, IEBŪVĒTĀ 100

FUNKCIJA, PROGRAMMISTA 145

GADĪJUMSKAITĻI 106

IEBŪVĒTĀ FUNKCIJA 100

IEKĀRTAS KODS 57

IEKĀRTAS NUMURS 57

IEVADES OPERATORS 54

INTERPRETATORS 38

IZVADES OPERATORS 40

IZVADA ZONA 65

KODS, IEKĀRTAS 57

KOMANDA 38

KONKATENĒŠANA 127

KURSORS 16

LĀGOŠANA, PROGRAMMAS 155

LOĢISKAIS NUMURS, FAILA 173

MAGNĒTISKIE DISKI 12

MAINĪGĀ APZĪMĒJUMS 46

MAINĪGĀ VĒRTĪBA 46

MAINĪGAIS 46

MAINĪGAIS, CIKLA 84

MAINĪGAIS, SIMBOLISKAIS 125

MAINĪGAIS, SKAITLISKAIS 40

MAKSIMĀLAIS ELEMENTU SKAITS 81

MASĪVA ELEMENTS 79

NOSACĪTĀS PĀREJAS OPERATORS 70

NUMURS, IEKĀRTAS 57

NUMURS, RINDAS 48

NUMURS, LOĢISKAIS FAILA 173

OPERACIONĀLĀ SISTĒMA 38

OPERATORS 45

OPERATORS CLOSE 174

DATA 163

DEF FN 145

END 50

FOR... NEXT 85

GO TO 82

GOSUB 165

IF... THEN 70

INPUT 54

KILL 175

ON 116

OPEN 173

PRINT 40

READ 162

REM 95

RESTORE 163

RETURN 165

STOP 51

PAVĒLE 49

PAVĒLE BYE 59

LIST 51

LISTNH 52

NEW 49

OLD 69

RESEQ 64

RUN 53

RUNNH 53

SAVE 56

PIEŠĶIRES OPERATORS 46

PROGRAMMA 35

PROGRAMMAS LĀGOŠANA 155

PROGRAMMAS NOSAUKUMS 49

PROGRAMMAS RINDA 48

PROGRAMMĒŠANAS VALODA 35

PROGRAMMISTA FUNKCIJA 145

REŽĪMS, TIEŠAIS 40

RINDAS NUMURS 48

SALĪDZINĀŠANA PĒC ALFABĒTA 128

SKAITĪTĀJS 26

ZONA, IZVADES 65

Lasītāja anketa

223Lūdzam atsūtīt mums vēstuli ar atbildēm uz šiem jautājumiem. Atbildes šifrējiet tā, kā darīts šajos piemēros: A1a (ja Jūsu vecums ir līdz 10 gadiem); A4a (ja esat skolēns) utt. Ja uz kādu no jautājumiem Jums atbildēt grūti vai negribas, varat to izlaist.

A. Lūdzam sniegt dažas ziņas par sevi.

  1. Vecums: a — līdz 10 gadiem; b — 10—15 gadi; c — 15—20 gadi; d — 20—30 gadi; e — 30—40 gadi; f — virs 40 gadiem.
  2. Dzimums: a — vīr.; b — siev.
  3. Kādu mācību iestādi esat beidzis(gusi) vai kādā pašlaik mācāties: a — vidusskola; b — PTV; c — tehnikums; d — augstskola; e — cita mācību iestāde.
  4. Jūsu nodarbošanās: a — skolēns; b — students; c — strādnieks; d — kolhoznieks; e — inženiertehniskais darbinieks; f — kalpotājs; g — cita nodarbošanās.
  5. Pirms šīs grāmatas lasīšanas Jūs par programmēšanu a — nezinājāt neko; b — bijāt mācījies, bet aizmirsis; c — šo to zinājāt; d — zinājāt labi.
  6. Šo grāmatu Jūs a — palasījāt un vairāk nedomājat to lasīt; b — palasījāt un vēl lasīsit; c — pašlaik vēl lasāt; d — caurskatījāt un lasīsit; e — caurskatījāt un nelasīsit.

B. Jūsu domas par grāmatu un ESM.

  1. No izlasītā a — sapratāt visu; b — sapratāt gandrīz visu; c — sapratāt apmēram pusi; d — nesapratāt gandrīz neko; e — nesapratāt neko.
  2. Uzdevumus a — risinājāt ar interesi; b — risinājāt; c — gribējāt risināt, bet nerisinājāt; d — nedomājat risināt.
  3. Izklāsta forma (dialogs, sarunu valoda) a — ļoti palīdzēja; b — palīdzēja; c — daļēji palīdzēja; d — traucēja; e — ļoti traucēja.
  4. Pirms šīs grāmatas lasīšanas Jūs uzskatījāt, ka ESM a — nav vajadzīgas, un arī tagad uzskatāt tāpat; b — nav vajadzīgas, bet tagad uzskatāt, ka ir; c — ir vajadzīgas, un arī tagad tāpat uzskatāt; d — ir vajadzīgas, bet tagad uzskatāt, ka nav.
  5. 224Jūsu darbā (mācībās) ESM a — palīdz; b — var palīdzēt, c — varbūt kādreiz varētu palīdzēt; d — nekad nebūs vajadzīgas.

Gaidām arī citas piezīmes par grāmatu (kurās nodaļās izklāsts ir izplūdis, kurās — gluži otrādi — sarežģīts, kas ir lieks, kā nav utt.), kā arī ierosinājumus, kādas grāmatas turpmāk vajadzētu izdot sērijā «Zaļais stars».

Ja vēlaties, uzrādiet savu uzvārdu un adresi.

Vēstuli lūdzam nosūtīt pēc adreses:
226250 Rīga — PDP
Raiņa bulv. 29
P. Stučkas LVU Skaitļošanas centrs
Pēcim Beisikānam