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.