====== 1 - Cykly, podmínky a vlastní příkazy ====== Opakování (cykly), větvení (podmínky) programu a vytváření vlastních príkazů (metody). * zdrojové kódy ke stažení: {{courses:A0B36PR1:tutorials:02:pr1-lab02.zip|}} V tomto cvičení si předvedeme pouze vybrané varianty cyklů a větvení. Detailněji bude tato problematika vysvětlena na přednášce a v průběhu semestru na dalších cvičeních. pro vyučující: [[courses:A0B36PR1:internal:tutorials:02:start]] ===== Úkoly ===== - implementujte příkaz (metodu) ''turnRight'', který otočí robota vpravo - robot udělá právě 10 kroků; pokaždé, když během provádění programu narazí na beeper (značku), zatočí na něm doprava (pokud ne, pokračuje v původním směru, v každém případě ale udělá právě 10 kroků) - robot jde tak dlouho, dokud nenarazí na zeď (pak se zastaví) - rozšiřte robota o nový příkaz ''turnRightOnBeeper'', který otočí robota vpravo, pokud právě stojí na beeperu, a beeper sebere - kombinací předchozích, vytvořte robota, který chodí tak dlouho, dokud nenarazí na zeď a vždy, když stojí na beeperu, zatočí vpravo a beeper sebere ==== Nápověda ==== Použité funkce Karla: * příkazy: ''move'', ''turnLeft'', ''pickBeeper'', ''putBeeper'' * podmínky: ''isOnBeeper'', ''isInFrontOfWall'' === Větvení programu === if (podmínka) { příkaz // tento příkaz se provede v případě, že je splněna podmínka } příklad: if (isOnBeeper()) { příkaz // tento příkaz se provede, pokud robot stojí na značce (beeper) } === Opakování s podmínkou === while (podmínka) { příkaz // tento příkaz se opakovaně provádí, pokud je splněna podmínka (nesplnění podmínky ukončuje provádění cyklu) } příklad: while (isOnBeeper()) { move(); // robot jde v jednom směru po značkách (dokud jsou pod ním značky, provádí kroky) } obdoba příkazu s podmínkou na konci: do { příkaz // stejné jako předchozí, ale protože se podmínka testuje až na konci, příkaz se vždy provede minimálně jednou } while (podmínka); === Zadaný počet opakování === for (int i = 0; i < 100; i++) { příkaz // tento příkaz se provede 100x } === Vlastní příkaz === Vytvoření nového příkazu ''doFiveSteps'', který provede pět kroků robota. void doFiveSteps() { for (int i = 0; i < 5; i++) { move(); } } Jak vypadá celý program resp. definice našeho vlastního robota, rozšířená o nový příkaz: package cz.cvut.fel; import kareltherobot.FelKarel; public class Lab02Karel extends FelKarel { // Definice našeho nového příkazu (metody) void doFiveSteps() { for (int i = 0; i < 5; i++) { move(); } } @Override public void execute() { // Zavolání našeho nového příkazu doFiveSteps(); } } ===== Tipy ===== Jak na kompilování a spuštění programu v Javě [[courses:a0b36pr1:tutorials:tutorial_kompilace|]] Jak nastavit java prostředí v příkazové řádce pod Windows [[courses:a0b36pr1:tutorials:ant|]] ===== Domácí úkol ===== Karel obejde místnost po obvodu. Pokud narazí na beeper, přesune ho o jedno políčko dále od stěny. Po skončení práce se robot vypne. Předpokládejte, že beepery se nacházejí pouze u stěn a nejsou v rozích. Místnost je dostatečně veliká, obdélníková a bez překážek (kromě obvodových zdí tam žádné dalši nejsou). ==== Instrukce ==== Program pište do připravené šablony v které jste pracovali na cvičení do souboru ''Lab02Karel.java''. Je pouze třeba jenom změnit "svět" ve kterém se Karel pohybuje. Toho docílíte zakomentováním řádku 12 v Lab02Task a odkomentováním řádku 13 v tomtéž souboru. Změníte tedy obsah z: World.readWorld("beepers.kwld"); //World.readWorld("walls.kwld"); na: //World.readWorld("beepers.kwld"); World.readWorld("walls.kwld"); Implementujte příkaz (metodu) ''goToCorner'', který přesune robota do rohu. Orientace robota po přesunu do rohu je taková, že zeď má po pravé straně a za zády. Implementujte příkaz (metodu) ''cleanOneWall'', který projde s robotem kolem jedné zdi a posune všechny beepery o jedno políčko od zdi. Metoda předpokládá, že robot stojí v rohu místnosti, otočený ve směru pohybu (zeď vzadu a vpravo, tedy tak jak má robota umístit metoda ''goToCorner''). Po provedení ''cleanOneWall'' robot stojí v následujícím rohu orientován pro další pohyb (opět zeď vzadu a vpravo). - Doplňte svůj program do 'Lab02Karel' - Spusťte Karla a ověřte, že Karel správně udělá, co po něm žádáte - Otevřete webovou stránku Upload Systemu a nahrajte svoje řešení (soubor 'Lab02Karel') - Zkontrolujte body, které jste za řešení získali - nejste-li spokojeni, můžete nahrát nové řešení Vlastní příkazy (metody) ''goToCorner'' a ''cleanOneWall'' nesmí být ''private'', jinak neprojdou v Upload Systemu. Pokud nevíte o co se jedná, nebojte, dozvíte se v průběhu semestru. Nyní vám postačí vědět, že vlastní příkaz zapíšete stejně jako je uvedeno v nápovědě, tedy např.: void goToCorner() { // telo prikazu }