Zadacha F (Nadezhnaja programma)
Zadacha F, privedennaja nizhe, byla predlozhena uchastnikam na
dopolnitel'nyj konkurs, za otdel'nyj priz zhjuri. Uchastniki mogli reshat' zadachu
v techenii dvuh nedel' posle olimpiady. Odnako, nikto iz shkol'nikov zadachu F
tak i ne reshil.
Odin krupnyj komp'juternyj koncern razrabotal novyj jazyk programmirovanija SIM
i superkomp'juter, kotoryj interpretiruet programmy na jetom jazyke.
Superkomp'juter mozhet vypolnjat' 100 trillionov operatorov jazyka SIM v sekundu,
no vyjasnilos', chto ego processor delaet : oshibki! Ne chasche, chem 1 raz na 1000
komand on mozhet libo pereskochit' na druguju komandu, libo isportit' soderzhimoe
odnoj jachejki pamjati. Razrabotchiki stali gorevat', chto ih izobretenie nikomu
ne nuzhno, no uchenye podskazali, chto posle nebol'shoj modifikacii sistemy
komand komp'juter vse zhe mozhno budet ispol'zovat'. Oni predlozhili vvesti
neskol'ko novyh komand i novyj bezopasnyj rezhim raboty processora, v kotorom
processor ne delaet oshibok, no rabotaet ochen' medlenno, so skorost'ju vsego
1000 operatorov v sekundu. Novye operatory pozvoljajut perekljuchat'sja v
bezopasnyj rezhim i vyhodit' iz nego. Takzhe vveli registr PSW, edinichnoe
znachenie kotorogo razreshaet vypolnenie nekotoryh "opasnyh operatorov". Posle
takoj modifikacii sdelalos' vozmozhnym ljubuju programmu nebol'shogo razmera
peredelat' v "nadezhnuju", t.e. ustojchivuju k oshibkam superkomp'jutera.
Vasha zadacha budet napisat' programmu, kotoraja preobrazuet zadannuju programmu
na pervonachal'nom jazyke SIM (ne rasshirennom special'nymi komandami) v
"nadezhnuju".
Vashej zadachej budet napisat' programmu, kotoraja preobrazovyvaet zadannuju
programmu na pervonachal'nom jazyke SIM (ne rasshirennom special'nymi komandami)
v "nadezhnuju".
Nizhe privoditsja spisok operatorov pervonachal'nogo jazyka SIM:
1. Operator prisvaivanija.
Format: < Name > =< Value> , < BR>
gde Name - jeto imja peremennoj, Value - jeto libo imja peremennoj, libo
celochislennaja konstanta.
Dejstvie: Operator ustanavlivaet znachenie peremennoj Name ravnoj
znacheniju Value
Primer: Temperature = -1
2. Arifmeticheskij operator
Format: < Name> =< Value1> < Op> < Value2>
gde Value1 i Value2 - kak i v operatore prisvaivanija, a Op - odin iz znakov
arifmeticheskih operacij +, -, *, / (delenie nacelo).
Dejstvie: Operator ustanavlivaet znachenie peremennoj Name ravnoj znacheniju
vyrazhenija v pravoj chasti.
Primer: i = i + 1
3. Operatory vvoda-vyvoda
Format: READ < Name> i WRITE < Value>
Dejstvie: Operator READ chitaet iz vhodnogo potoka ocherednoe chislo i
zapisyvaet ego v peremennuju Name. Operator WRITE vyvodit v vyhodnoj potok
libo znachenie ukazannoj peremennoj, libo konstantu (parametr Value).
Primer: READ
4. Operator bezuslovnogo perehoda
Format: GOTO < Label> ,
gde Label Label - libo identifikator metki, libo celochislennaja konstanta
Disp.
Dejstvie: proishodit bezuslovnyj perehod k operatoru s zadannoj metkoj,
libo k komande, otstojaschej ot dannoj na Disp operatorov.
Primery:
GOTO -1 (perehod na pred. operator)
GOTO ABC
5. Operator uslovnogo perehoda
Format:
IF < Value1> < Op> < Value2> GOTO < Label>
gde Op - znak operacii sravnenija: "< ", "> ", "=", "< > ", "< =",""> =", a Label -
libo identifikator metki, libo celochislennaja konstanta Disp.
Dejstvie: Esli logicheskoe vyrazhenie istinno, proishodit perehod (sm.
GOTO).
Primer: IF A=0 GOTO EndProgram
6. Operator ostanova
Format: HALT
Dejstvie: Proizvodit ostanov processora. Programma zakanchivaet
rabotu.
Primer: HALT
7. Metki
Metka opisyvaetsja identifikatorom metki, posle kotorogo stavitsja simvol
dvoetochie ":".
Primer metki: ThisIsLabelExample:
Primer programmy, kotoraja vvodit N v nahodit (ne samym optimal'nym
sposobom) summu chisel ot 1 do N:
read N
i = 1
sum = 0
Loop: if i > N goto EndProgram
sum = sum + i
i = i+1
goto Loop
EndProgram:
HALT
Kak uzhe bylo skazano vyshe, v svjazi s tem, chto Superkomp'juter delal oshibki v
jazyk byli dobavleny:
8. Bezopasnyj rezhim raboty
V jetom rezhime processor rabotaet ochen' medlenno, no ne delaet oshibok.
Teper' operatory READ, WRITE i HALT vypolnjajutsja tol'ko v bezopasnom rezhime! V
obychnom rezhime vypolnenie jetih komand ne proizvodit nikakih dejstvij.
9. Operator SLOW
Format: SLOW
Dejstvie: Perevodit processor v bezopasnyj (medlennyj rezhim). Esli
processor uzhe nahodilsja v bezopasnom rezhime, komanda ne proizvodit nikakih
dejstvij. Komanda rabotaet tol'ko v tom sluchae, esli znachenie peremennoj
PSW=1. Esli PSW< > 1 komanda ne proizvodit nikakih dejstvij. Peremennaja
PSW javljaetsja obyknovennoj peremennoj i takzhe mozhet byt' oshibochno isporchena
Superkomp'juterom.
10. Operator FAST
Format: FAST
Dejstvie: Vyvodit processor iz bezopasnogo rezhima. Esli processor rabotal
v normal'nom rezhime, komanda ne proizvodit nikakih dejstvij.
Nachalo raboty programmy
V nachale raboty znachenija vseh peremennyh nulevye. Svoju rabotu
superkomp'juter nachinaet v bezopasnom sostojanii!
Oshibki Superkomp'jutera
Superkomp'juter delaet ne bolee odnoj oshibki na 1000 komand v normal'nom
rezhime. Jeto oznachaet, vypolniv v normal'nom rezhime 1000 komand (bez
perekljuchenij v bezopasnyj rezhim) on oshibetsja ne bolee odnogo raza. Esli oshibka
byla neposredstvenno pered vypolneniem komandy SLOW, to sledujuschaja oshibka mozhet
vozniknut' prjamo srazu posle vypolnenija komandy FAST, nesmotrja na to, chto 1000
komand esche ne proshlo. Oshibka pojavljaetsja v promezhutke mezhdu vypolnenijami
komand. Vo vremja oshibki processor libo portit znachenie kakoj-to peremennoj,
libo sdvigaet ukazatel' tekuschej komandy v kakoe-to sluchajnoe mesto (no v
predelah programmy).
Oshibok pri ispolnenii ne byvaet. Pri delenii na 0 poluchaetsja 0. Programma
schitaetsja zaciklennoj, t.e. posle vypolnenija poslednej komandy v programme
processor perehodit na pervuju.
Primechanie
Bezopasnyj rezhim byl vveden ne dlja togo, chtoby v nem postojanno rabotat', a
tol'ko dlja togo, chtoby sdelat' vozmozhnym rabotu programmy na oshibajuschemsja
komp'jutere!
Podskazka
Pol'zujtes' tem, chto do i posle oshibki Superkomp'juter vypolnit po krajnej
mere 1000 komand bez sboev.
Primer nadezhnoj, no sovershenno bespoleznoj programmy, kotoraja vyvodit chislo
555 i zakanchivaet rabotu.
FAST
Begin:
PSW=1
SLOW
OUT=1
WRITE 555
IF PSW=0 GOTO Begin
IF OUT=0 GOTO Begin
HALT
GOTO Begin (mozhno ne pisat')
Zadanie
Napishite programmu, kotoraja perevodit tekst programmy na pervonachal'nom
jazyke SIM (ne rasshirennom spec. komandami) v nadezhnuju. Ishodnaja programma
soderzhit ne bolee 40 operatorov. Rezul'tirujuschaja nadezhnaja programma dolzhna
soderzhat' ne bolee 4000 operatorov. Vo vremja raboty nadezhnaja programma dolzhna
vypolnjat' ne bolee, chem 200 + 200 * (Kolichestvo vypolnennyh operatorov READ i
WRITE) komand v medlennom (bezopasnom) rezhime.
Format vhodnoj programmy
1. Operatory zapisyvajutsja v otdel'nyh strokah.
2. Metka mozhet nahodit'sja libo v otdel'noj stroke, libo stojat' na odnoj stroke
s operatorom.
3. Identifikator peremennoj i metki sostoit ne bolee, chem iz 20 simvolov.
4. Fajl mozhet soderzhat' pustye stroki i lishnie probely, odnako chisla,
operatory i identifikatory razryvat'sja ne mogut.
5. Identifikatory ne mogut byt' nazvany imenami operatorov.
6. Metka i peremennaja ne mogut imet' odno imja.
7. Identifikator sostoit iz bol'shih i malen'kih latinskih bukv, cifr i
simvolov: "_", "@", "#". Pervyj simvol identifikatora ne mozhet byt' cifroj.
8. Registr bukv i identifikatorah i kljuchevyh slovah znachenija ne imeet.
Format vyhodnoj programmy
Vse tozhe samoe, tol'ko imena peremennyh i metki mogut sostojat' iz 25
simvolov.
Interpretator
U Vas v rasporjazhenii est'
interpretator superkomp'jutera. Opisanie raboty
interpretatora nahoditsja na diskete vmeste s programmoj interpretatora.
Interpretator sovershaet sluchajnye oshibki superkomp'jutera s zadannoj chastotoj.
Vy mozhete ispol'zovat' interpretator dlja otladki svoej programmy, no vy dolzhny
ponimat', pravil'naja rabota "nadezhnost'" programmy na sluchajnyh oshibkah ne
garantiruet ee "nadezhnosti" v celom. Pri testirovanii budet ispol'zovat'sja
"hitryj" interpretator superkomp'jutera, kotoryj pomimo sluchajnyh oshibok budet
narochno pytat'sja "slomat'" vashu programmu.