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.