9.1 La ciferoj de la kalkulilo

pict

Ĉi tiu tasko baziĝas sur la fakto ke ĉiun kalkulilan nombron oni povas akiri per la jena ŝablono:

9.1.1 Plenigi ortangulon

pict

Se oni deziras ekzemple grafiki plenan ortangulon grandan je 100 mul 200, unua ideo povas esti desegni la ortangulon je 100 mul 200, poste desegni ortangulon je 99 mul 199, poste ortangulon je 98 mul 198... ĝis la ortangul’ estos tute plena.

Ni komencu per difini ortangulon je lango kaj larĝo dependaj je du variabloj.

 por ort :lo :la
 ripetu 2 [an :lo dn 90 an :la dn 90]
 fino

Por plenigi nian grandan ortangulon, oni rulu:

ort 100 200 ort 99 199 ort 98 198 ..... ort 1 101

Difinu tiam proceduron ortangulo dediĉita grafiki tiun plenan ortangulon.

                                                                                                  
                                                                                                  
 por ortangulo :lo :la
 ort :lo :la
 ortangulo :lo-1 :la-1
 fino

Oni provu ortangulo 100 200 kaj oni rimarku ke estas problemo: la proceduro ne haltas kiam la ortangulo estas plena; ĝi plu grafikas ortangulojn! Oni do aldonu provon ebligantan detekti ĉu la longo aŭ la larĝo egalas 0. Tiam, oni petas la programon halti per la komando haltu.

 por ortangulo :lo :la
 se aŭ :lo=0 :la=0 [haltu]
 ort :lo :la
 ortangulo :lo-1 :la-1
 fino

Rimarko: anstataŭ uzi la primitivon , oni povas uzi la simbolon «|»; oni skribus:

se :lo=0 | :la=0 [haltu]

9.1.2 La programo

Ni bezonas la plenan ortangulon antaŭan:
 por ort :lo :la
 se :lo=0 |:la=0 [haltu]
 ripetu 2 [an :lo dn 90 an :la dn 90]
 ort :lo-1 :la-1
 fino

Ni supozas ke la testudo ekiras de la malsupra maldekstra angulo. Ni difinos proceduron nomatan cifero akceptantan 7 argumentojn :a, :b, :c, :d, :e, :f, :g. Kiam :a valoras 1, oni desegnu la ortangulon 1. Se :a valoras 0, oni ne desegnu ĝin. Jen la principo.

Jen la proceduro:

 por cifero :a :b :c :d :e :f :g
 # Oni desegnu la ortangulon 1
 se :a=1 [ort 160 40]
 # Oni desegnu la ortangulon 2
 se :b=1 [ort 40 160]
 l dn 90 an 120 mdn 90 ml
 # Oni desegnu la ortangulon 3
 se :c=1 [ort 160 40]
 l an 120 ml
                                                                                                  
                                                                                                  
 # Oni desegnu la ortangulon 5
 se :e=1 [ort 160 40]
 # Oni desegnu la ortangulon 4
 mdn 90 l man 40 ml
 se :d=1 [ort 160 40]
 # Oni desegnu la ortangulon 6
 dn 90 l an 120 mdn 90 ml
 se :f=1 [ort 160 40]
 # Oni desegnu la ortangulon 7
 l an 120 mdn 90 man 40 ml
 se :g=1 [ort 160 40]
 fino

9.1.3 Krei malgradan animadon

Ĉi tie ni simulos retronombradon aperigante sekvence la ciferojn de 9 ĝis 0 je ordo malkreska.
 por retronombro
 ev tdk cifero 0 1 1 1 1 1 1 atendu 60
 ev tdk cifero 1 1 1 1 1 1 1 atendu 60
 ev tdk cifero 0 0 1 0 1 1 0 atendu 60
 ev tdk cifero 1 1 1 1 0 1 1 atendu 60
 ev tdk cifero 0 1 1 1 0 1 1 atendu 60
 ev tdk cifero 0 0 1 1 1 0 1 atendu 60
 ev tdk cifero 0 1 1 1 1 1 0 atendu 60
 ev tdk cifero 1 1 0 1 1 1 0 atendu 60
 ev tdk cifero 0 0 1 0 1 0 0 atendu 60
 ev tdk cifero 1 1 1 0 1 1 1 atendu 60
 fino

Jen malgranda problemo: estas palpebruma efiko malagraba dum krei ĉiun ciferon. Por fluemigi tion oni uzos la primitivojn movado, neplu_movigu kaj novigu.

Jen la modifita programo:

 por retronombro
 # Pasu en moduson movado
 movado
 ev tdk cifero 0 1 1 1 1 1 1 novigu atendu 60
 ev tdk cifero 1 1 1 1 1 1 1 novigu atendu 60
                                                                                                  
                                                                                                  
 ev tdk cifero 0 0 1 0 1 1 0 novigu atendu 60
 ev tdk cifero 1 1 1 1 0 1 1 novigu atendu 60
 ev tdk cifero 0 1 1 1 0 1 1 novigu atendu 60
 ev tdk cifero 0 0 1 1 1 0 1 novigu atendu 60
 ev tdk cifero 0 1 1 1 1 1 0 novigu atendu 60
 ev tdk cifero 1 1 0 1 1 1 0 novigu atendu 60
 ev tdk cifero 0 0 1 0 1 0 0 novigu atendu 60
 ev tdk cifero 1 1 1 0 1 1 1 novigu atendu 60
 # Revenu en moduson klasikan
 neplu_movigu
 fino