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.