em tečka pé tečka

Pokud máte v poště informace privátního charakteru, smažte je!
(skok na navigaci)

část 2 - opatrnost se vyplácí 11.03.2007, 14:58:00 (zoftware)

aneb hlavou zeď neprorazíš. Ale můžeš se jí vyhnout.

Na začátek diskuse řešení z minula. (všimněte si, jak tu třítýdenní odmlku přecházím jakoby nic)

(podrobné vyhodnocení se seznamem lidí dodám později. možná. ono mezi námi to zas až tak nemá cenu, neboť jsem stejně všem radil a celkově to bodování na samém začátku by muselo být divné)

První úkol byl takový Cimrmanovský – "jdu na sever, a jdu na jih". Tedy, točím se vlevo, až jsem vpravo. K tomu snad ani není co dodat.

program Vpravo:
Vlevo
Vlevo
Vlevo
.

Ve druhém úkolu je třeba si všimnout, že se to kolečko dá rozčtvrtit. Čtvrtina vypadá nějak takhle:

program CtvrtKolecka:
DobehniKeZdi
Vlevo
.

Hlavní program pak jenom udělá čtvrtkolečko čtyřikrát.

Co se týká DobehniKeZdi, je vcelku jasné, že to bude devět kroků. To je ale hromada řádků (konkrétně devět). Rozdělíme si je tedy na tři skupinky po třech krocích a napíšeme si na ně program TriKroky.

(proč zrovna tři? protože 9 je dělitelné 3, takže mi tam nebudou žádné Kroky přebývat a zvyšovat tak počet řádků)

Pak zahodíme DobehniKeZdi a ty kroky naházíme přímo do CtvrtKolecka.

Dohromady tedy takhle:

program TriKroky:
Krok
Krok
Krok
.

program CtvrtKolecka:
TriKroky
TriKroky
TriKroky
Vlevo
.

program Kolecko:
CtvrtKolecka
CtvrtKolecka
CtvrtKolecka
CtvrtKolecka
.

---

Zatím docela nuda a šeď. Tohle bylo hlavně cvičení na to, jak nejlépe rozdělit velký a složitý úkol na několik malých a jednoduchých. Jinak by se tohotéž dalo dosáhnout tím, že bychom Karlovi diktovali příkazy jeden za druhým.

To úloha tři je jinačí kafe. Donutit Karla, aby běhal, než padne vyčerpáním. A protože kapacitu Karlových baterií neznáme, bude jistější nechat ho běhat donekonečna. Jde to vůbec?

Nejde, milé děti, nejde. Všechny příkazy pro Karla, které známe, totiž trvají nějakou dobu a pak skončí. Takže když je napíšeme za sebe, zase to bude trvat nějakou dobu a pak to zase skončí. Nic, co by mohlo neskončit, tu prostě nemáme.

(Pravda, AirGuru to dokázal, ale použil k tomu rekurzi. A tu se mi teď nechce vysvětlovat. Protože kdybych chtěl vysvětlit rekurzi, musel bych napřed vysvětlit rekurzi, a tu se mi teď nechce vysvětlovat. A ani nehodí, co se toho týká. Někdy jindy.)

Ve čtyřce tedy bylo potřeba vytvořit příkaz, který by to skončení nějak obešel. A takovým příkazům se budeme věnovat dneska.

(řešení pětky si schovám na příště, protože se k němu váže velmi poutavé vysvětlení, které se mi sem nevejde.)

Příkaz Opakuj začne akutální program od začátku.

program NakracejDoZdi:
Krok
Opakuj
.

Co se stane, když Karlovi přikážu NakracejDoZdi ? Udělá krok, a pak to zopakuje: udělá krok, a pak to zopakuje: udělá krok, a pak to zopakuje: udělá krok, a pak... Takhle udělá spoustu kroků a zastaví se až o zeď (protože srážka se zdí je pro něj fatální a dál už v programu nepokračuje).

(už víte, proč programátoři umírají vyčerpáním při mytí vlasů? na šamponech je přece napsáno: vmasírujte do mokrých vlasů, opláchněte, opakujte.)

Takovéhle opakování má ale zase nevýhodu: nekončí nikdy, jedině nějakou katastrofou. Ve skutečnosti by se nám nejvíc hodil nějaký příkaz, který by skončil jenom někdy – za nějaké přesně dané podmínky.

K tomu se nám bude hodit pár nových jazykových konstrukcí.

program OpatrneSeber:
if Znacka:
Seber
.
.

program OpatrnyKrok:
unless Zed:
Krok
.
.

Teď ještě jednou a česky. V programu OpatrneSeber si Karel zkontroluje, jestli (anglicky if) je pod ním Znacka, a pokud ano, sebere ji. V programu OpatrnyKrok Karel udělá Krok, jenom pokud není (anglicky unless) před ním Zed. Pokud tam je, neudělá nic.

Můžete se divit, proč místo pěkného českého "když" nebo "pokud" používá Karel anglické "if". Inu, to máte tak. if je takové poměrně významné slovo. Drtivá většina smysluplných programovacích jazyků má slovo if. Bylo by trapné cpát vám do hlavy něco jiného. Proto anglicky "if", "unless" a další. Koneckonců, "program" je taky vlastně anglicky.

Slova Zed a Znacka jsou takzvané podmínky. Podmínka může buď platit nebo neplatit. Příkazy pod ifem se provedou, když podmínka platí, příkazy pod unlessem, když podmínka neplatí. Celkem zná Karel tři podmínky:

Zed platí, pokud Karel stojí čelem těsně u zdi. Jinak neplatí.

(tady původně měly být krásné obrázky, ovšem jejich tvorba mě natolik zmohla, že jsem se na ně raději vyflákl. možná se tu časem objeví, možná ne)

Znacka platí, pokud Karel stojí na políčku, na kterém je alespoň jedna značka. Jinak neplatí.

(i tady měly být obrázky. spoléhám na to, že podmínky jsou tak jednoduché, že se nedají nepochopit. pokud dají, ptejte se.)

A nakonec Sever platí, když se Karel dívá směrem na sever, a jinak neplatí.

(zde si taky můžete představovat obrázky)

A teď, když už jsem všechny dostatečně zmátl podmínkami a ify, dostanu se konečně k tomu opakování. Dva příklady za dva tisíce slov (za ta slova, která jsem vyplýtval místo obrázků):

program KeZdi:
until Zed:
Krok
.
.

program Vycisti:
while Znacka:
Seber
.
.

Jak prosté, milý Watsone. while znamená "dokud" a until znamená "dokud není". Čili příkazy spadající pod while nebo until se opakují, dokud podmínka platí (resp. neplatí). Jinak je to zase na jedno brdo: KeZdi dělá kroky, dokud tam není zeď. Vycisti sbírá značky, dokud tam nějaké jsou.

Úloha první: napište program NaSever, který Karla otočí na sever.

Stejně jako u programu, ve všech čtyřech jazykových konstrukcích (ale jinak jim budeme říkat bloky) se dá použít víc příkazů za sebou, a také se provedou v tom pořadí, v jakém jsou tam napsané. Stejně jako u programu se příkazy pod dalšími bloky odsazují.

Bloky nemusí být nutně na začátku programu, může jich být v jednom programu spousta (dokonce tolik, kolik se vám zachce), dají se i vnořovat. Třeba takhle:

program HledejZnacku:
until Znacka:
if Zed:
Vlevo
else:
Krok
.
.
.

Úloha druhá: co přesně dělá program HledejZnacku ?

Slovo else znamená česky "jinak". Dá se použít s ifem i unlessem, nedá se použít s whilem ani untilem, nemělo by tam smysl (úloha třetí: proč?), a ani nikde jinde. Všimněte si, že mezi if a else není ukončující tečka, tím je naznačeno, že neoddělitelně patří k sobě. A i když už to každému musí být jasné, pro úplnost dodávám: příkazy pod else se provedou, když podmínka v příslušném ifu neplatí, případně když podmínka v příslušném unlessu platí. Úloha čtvrtá: přepište program HledejZnacku tak, aby používal unless místo ifu.

Ještě by stálo za to zdůraznit, že podmínka se vždycky testuje jenom na začátku bloku. Podívejme se například na tenhle program:

program FurtDoKolecka:
while Znacka:
Krok
Vlevo
Krok
Vlevo
Krok
Vlevo
Krok
Vlevo
Seber
.
.

Když má pod sebou značku, oběhne kolečko a značku sebere. Když tam ještě nějaká zůstala, oběhne a sebere znovu. Přitom běhá po políčkách, kde žádné značky nejsou. Značku ale kontroluje vždycky jen na tom výchozím.

Úloha pátá: co je špatně na programu OpatrneDvaKroky ?

program OpatrneDvaKroky:
unless Zed:
Krok
Krok
.
.

---

Nu, a to je pro dnešek všechno. Úlohy jsou vesměs triviálně triviální, tedy řešení by mělo by být na první (nebo nejvýše tak pátý) pohled zřejmé. Řešení mi můžete poslat na mail matejcik zavináč bloguje tečka cézet. Nebo si ho jenom myslete.

---

Kdyby to náhodou nestačilo, bonusová úloha šestá: napište program Dlazdic, který vydláždí celé město značkami. Příkaz Poloz smí být v programu jen jednou, jinak můžete používat všechny příkazy, konstrukce a programy, které jsem tu dnes vypsal. Celé řešení by nemělo mít víc než 30 řádek, čím míň tím líp. (moje řešení má 17)

Komentáře

[1] Laura (11.03.2007, 15:37:43):
To neni pravda :-) Na většině šampónů už je dneska napsáno opakujte, dokud je potřeba. Hm... Aha... Skara :-D
[2] Laura (11.03.2007, 16:22:46):
Mimochodem, je normální, když i lingvistka si s tím ví rady na první pohled? Začínám se sama sebe bát!
[3] matejcik [OpenID] (11.03.2007, 16:25:13):
Lauro, je to normální, je to tak stavěné. Teda minimálně se o to snažím ;e)
pošleš mi odpovědi? :e)
[4] anicka (11.03.2007, 22:45:39):
Tfuj, co to je za implementaci? Muj Karel znal podminky typu "kdyz je zed" ci "kdyz neni znacka" a bylo to tak hezky cesky - pan Capek by plakal. (To me znechutilo a zbytek jsem preskocila, oci se zastavily az na posledni uloze.)

Ad posledni uloha - jestli si pamatuju prikazy dobre, umim to asi na pet prikazu, ale nevim, jestli povolenych - nevim, co vsechno jsi probral. A navic sproste vyuzivam toho, ze jsi nerekl, ze se Karel po vydlazdeni mesta musi zastavit :-D
[5] Tasselhof (12.03.2007, 20:06:36):
jsem línej hledat tvůj mail ... ale jinak bych se i soutěže zúčastnil :-)

Doufám, že lidé se státnicema z informatiky nejsou vyloučeni :-)
[6] Laura (12.03.2007, 21:18:16):
Mateji, odpovědi ti nepošlu, páč nemám čas to formulovat nějak podrobně... to víš, diplomka...
[7] matejcik [OpenID] (12.03.2007, 23:16:00):
[4] aničko, to je implementace dobrá k tomu, že když se zahodí karlovy příkazy, dá se z toho mávnutím kouzelného proutku udělat opravdický programovací jazyk. karla se totiž hodlám během příštího dílu zbavit.
osobně mi "kdyz je znacka" zní hrozně neobratně, tak nějak pascalsky. pan čapek nechť si trhne nohou ;e)

jestli máš implementaci na pět příkazů, tak seš asi drsnější než já, to mi schválně pošli. klidně i v originálním karlově jazyce s "kdyz je znacka" ;e)

[5] Tassle, kdybych to tam nenapsal ... mám se citovat ? "Řešení mi můžete poslat na mail matejcik zavináč bloguje tečka cézet." :ep

[6] Lauro, škoda přeškoda. no co naděláme








www.140.cz http://last.fm/ SomaFM commercial free internet radio