Technika definování nových metod a definování smyček - jak jsou užitečné - ve skutečnosti neumožňují Karlu vyřešit žádné nové problémy. Pokaždé, když program run vždy dělá přesně to samé. Programy se stávají mnohem užitečnějšími, když mohou reagovat odlišně na různé vstupy.
Jako příklad. Řekněme, že jste chtěli napsat program, který má Karla move na zeď. Ale nechcete, aby tento program fungoval na jednom světě s pevnou velikostí. Chtěli byste napsat jeden program, který by mohl fungovat na jakémkoli světě.
Zkuste změnit svět kliknutím na rozevírací seznam "Změnit svět" nad světem. Pro všechny velikosti světa bude Karel move dokud nenarazí na zeď. Všimněte si, že tento výkon nelze dokončit pomocí for smyčka. To by vyžadovalo, abychom v době programování znali velikost světa.
V Karlu, a while smyčka se používá k opakování těla kódutak dlouho jakdané podmínky platí. Smyčka while má následující obecný formulář:
while( test ){
prohlášení, která se mají opakovat
}
Řídicí tok smyčky while je následující. Když program udeří do smyčky, začne opakovat proces, kde je prvníkontrolypokud test proběhne, a pokud anorun skód v těle.
Když programkontrolypokud test proběhne, rozhodne, zdatestplatí pro současný stav světa. Pokud ano, smyčka bude run kód v těle. Pokud test selže, je smyčka ukončena a program move zapnut.Když programrun stělo smyčky, program provede řádky v těle jeden po druhém. Když program dorazí na konec smyčky while, přeskočí zpět na začátek smyčky. Pak test znovu zkontroluje a pokračuje, pokud projde. Program ukončí smyčku, dokud se nedostane ke kontrole a test se nezdaří.
Karel má mnohotesta přejdeme všechny z nich v další kapitole. Prozatím použijeme jedno prohlášení o testu: frontIsClear() to je pravda, pokud není žádná zeď přímo před Karlem.
Upravme náš program, aby byl zajímavější. Místo toho, aby se přesunul ke zdi, kuzel Karel umístit linku kuzel s, jednu na každé náměstí. Opět chceme, aby tento program pracoval pro svět jakékoli velikosti:
To vypadá skvěle. Až na jeden problém. Na každém světě Karel neumí umístit kuzel na poslední čtverec čáry (pozorně). Když je Karel na posledním náměstí, program neprovede tělo smyčky, protože test již neprochází - Karel stojí proti zdi. Můžete být v pokušení zkusit změnit pořadí těla tak, aby Karel move s před umístěním včelaře. Kód je editovatelný, takže to zkuste!
Existuje hlubší problém, který nemůže vyřešit žádné přeskupení těla. Pro svět se 7 sloupci, Karel musí dát 7 kuzel s, ale měl by jen move 6 krát. Protože smyčka while provádí oba řádky, když test projde, jak můžete získat program, aby provedl jeden příkaz ještě jednou než ten druhý?
Chyba v tomto programu je příkladem programovacího problému nazvaného a chyba fencepost . Název pochází ze skutečnosti, že pokud chcete postavit plot z panelů, které mají jeden plotový sloupek na obou velikostech, počet sloupků plotů je vždy o jeden větší než počet panelů. Kolik sloupů plotů potřebujete například pro stavbu plotu s 10 panely? Odpověď je 11, jak ukazuje následující diagram:
Jakmile to zjistíte, opravení této chyby je ve skutečnosti velmi snadné. Než se Karel zastaví na konci světa, vše, co musí program udělat, je umístit finále kuzel :