2014 2015 2016 2017 2018
BEBRO konkurso užduotys 2018

 

Medicinos laboratorija

Taškai: 12

Diagnostikos aparatas medicinos laboratorijoje turi reguliariai supurtyti iš pacientų paimtus mėginius. Aparatas veikia pagal programą, pateiktą sunumeruotomis eilutėmis. Aparatas skaito programos eilutes iš eilės ir vykdo jose parašytas komandas. Jei eilutėje yra komanda eiti į X, tai pereinama į eilutę X ir nuo jos tęsiamas programos vykdymas.

Programa turi saugyklą A, kurioje telpa vienas skaičius. Programa gali įrašyti skaičių į A, pridėti 1 prie ten esančio skaičiaus, joje esantį skaičių palyginti su kuriuo nors kitu skaičiumi.

Kiek kartų aparatas supurtys mėginius, vykdydamas tokią programą?

1 į A įrašyti 0

2 prie A pridėti 1

3 eiti į 6

4 jei A = 60, eiti į 8

5 į A įrašyti 0

6 prie A pridėti 1

7 eiti į 2

8 mėginius supurtyti A kartų

9 baigti darbą.

Atsakymai

  1. Mėginiai niekada nebus supurtyti.
  2. Mėginiai bus supurtyti vieną kartą.
  3. Mėginiai bus supurtyti 60 kartų.
  4. Programa veiks be paliovos, ir aparatas nuolat purtys mėginius.
Paaiškinimas

Programos, parašytos pirmosiomis programavimo kalbomis, kurios sukurtos praėjusio šimtmečio 5-ajame ir 6-ajame dešimtmečiuose ir vadinamomis asemblerio kalbomis, buvo panašios į pateiktą šiame uždavinyje. Jose vienintelė komanda kitų komandų vykdymo eilei keisti buvo nukreipimo komanda, trumpiau – eiti į (angl. goto). Tokias programas buvo sunku skaityti ir ieškoti jose klaidų. Dėl to nuo 6-ojo dešimtmečio į modernesnes programavimo kalbas įtraukiamos specialios konstrukcijos – ciklai, sąlyginiai sakiniai, procedūros, įgalinančios atsisakyti pavojingų nukreipimo komandų.

Šiame uždavinyje parodoma ir dažnai pasitaikanti programavimo klaida – begalinis ciklas, kai programa „užsiciklina“, t. y. negali užbaigti ciklo.

https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf

Raktiniai žodžiai: programavimo kalba, „goto“ komanda, programos skaitymas.

Atsakymas

Programa visada pereis nuo 3-os eilutės prie 6-os, nuo 7-os prie 2-os ir taip nuolat vykdys komandas, esančias 2-oje, 3-oje, 6-oje ir 7-oje eilutėse. Mėginių supurtymo komanda yra 8-oje eilutėje, kuri niekada nebus pasiekta. Tai reiškia, kad aparatas, veikdamas pagal šią programą, mėginių niekada nepurtys. Todėl teisingas atsakymas yra A. Be to, niekada nebus įvykdyta ir komanda, esanti 9-oje eilutėje. Taigi, programos vykdymas niekada nesibaigs.