Mbinu ya kufafanua mbinu mpya, na kufafanua mzunguko for s-kama muhimu kama wao-haifai Karel kutatua matatizo yoyote mapya. Kila wakati run mpango unafanya kila kitu jambo sawa. Programu zinafaa sana wakati zinaweza kujibu tofauti kwa pembejeo tofauti.
Kwa mfano. Hebu sema unataka kuandika mpango wa kuwa na Karel move kwenye ukuta. Lakini hutaki tu programu hii kufanya kazi kwenye ulimwengu mmoja na ukubwa uliowekwa. Ungependa kuandika mpango mmoja ambao unaweza kufanya kazi kwenye ulimwengu wowote.
Jaribu kubadilisha ulimwengu kwa kubonyeza kushuka kwa "Mabadiliko ya Dunia" juu ya dunia. Kwa ulimwengu wowote wa ukubwa, Karel atakuwa move mpaka move ukuta. Ona kwamba hii feat haiwezi kubatilishwa kwa kutumia for kitanzi. Hiyo ingehitaji sisi kujua ukubwa wa ulimwengu wakati wa programu.
Katika Karel, a while kitanzi hutumiwa kurudia mwili wa kanuniili mradihali fulani imechukua. mzunguko while ina aina yafuatayo ya jumla:
while( mtihani ){
maelezo ya kurudiwa
}
Udhibiti wa mtiririko wa mzunguko while ni kama ifuatavyo. Mpango huo mzunguko while huanza kurudia mchakato ambapo kwanzahundiikiwa mtihani hupita, na kama ni hivyorun skanuni katika mwili.
Wakati programuhundiikiwa mtihani unapita, huamua kamamtihanini kweli kwa hali ya sasa ya ulimwengu. Ikiwa ndivyo, kitanzi hicho kitakuwa run kificho katika mwili. Ikiwa mtihani unashindwa, kitanzi move na mpango move juu.Wakati programurun smwili wa kitanzi, mpango unafanya mistari katika mwili mmoja kwa wakati. Mpango huo unapofika mwishoni mwa mzunguko while , unaruka tena juu ya kitanzi. Halafu inachunguza mtihani, kuendelea kugeuka ikiwa inapita. Mpango hauondoki kitanzi hadi ukiangalia, na mtihani haufanikiwa.
Karel ana nyingimtihanitaarifa, na tutaenda juu ya wote katika sura inayofuata. Kwa sasa tutatumia taarifa moja ya mtihani: frontIsClear() ambayo ni kweli ikiwa hakuna ukuta wowote unaohusika na Karel.
Hebu tubadilishe mpango wetu hapo juu ili kuifanya kuwa ya kuvutia zaidi. Badala ya kuhamia kwenye ukuta, Karel koni mstari wa koni s, moja kwa kila mraba. Tena tunataka programu hii kufanya kazi kwa ulimwengu wa ukubwa wowote:
Hiyo inaonekana kuwa nzuri. Isipokuwa kwa tatizo moja. Katika kila ulimwengu Karel haifai koni kwenye mraba wa mwisho wa mstari (angalia kwa karibu). Wakati Karel akiwa kwenye mraba wa mwisho, programu haina kutekeleza mwili wa kitanzi kwa sababu mtihani hauwezi kupita - Karel anakabiliwa na ukuta. Unaweza kujaribiwa kujaribu kugeuza utaratibu wa mwili ili Karel move s kabla ya kuweka koni. Nambari ni editable hivyo kwenda kujaribu!
Kuna tatizo kubwa ambalo hakuna rearrangement ya mwili inayoweza kutatua. Kwa ulimwengu koni nguzo 7, Karel anahitaji kuweka 7 koni s, lakini lazima tu move mara 6 tu. Tangu mzunguko while inachukua mistari yote wakati mtihani unapopita, unawezaje kupata mpango wa kutekeleza amri moja mara moja zaidi kuliko nyingine?
Mdudu katika programu hii ni mfano wa tatizo la programu inayoitwa kosa la fencepost . Jina linatokana na ukweli kwamba ikiwa unataka kujenga uzio uliofanywa na paneli ambazo zina posta ya uzio moja kwa ukubwa wowote, idadi ya posts ya uzio daima ni kubwa kuliko idadi ya paneli. Je! Ni posts ngapi za uzio, kwa mfano, unahitaji kujenga uzio na paneli 10? Jibu ni 11, kama ilivyoonyeshwa na mchoro uliofuata:
Ukigundua, kurekebisha mdudu huu kwa kweli ni rahisi kabisa. Kabla ya Karel ataacha mwishoni mwa dunia, yote ambayo mpango huo koni kufanya ni kuweka mwisho koni :