Ĉi tiu tasko baziĝas sur la fakto ke ĉiun kalkulilan nombron oni povas akiri per la jena ŝablono:
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 aŭ, oni povas uzi la simbolon «|»; oni skribus:
se :lo=0 | :la=0 [haltu] |
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 |
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 |