====== 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
}