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.