Warning
This page is located in archive.

1 - Cykly, podmínky a vlastní příkazy

Opakování (cykly), větvení (podmínky) programu a vytváření vlastních príkazů (metody).

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í: 02

Úkoly

  1. implementujte příkaz (metodu) turnRight, který otočí robota vpravo
  2. 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ů)
  3. robot jde tak dlouho, dokud nenarazí na zeď (pak se zastaví)
  4. rozšiřte robota o nový příkaz turnRightOnBeeper, který otočí robota vpravo, pokud právě stojí na beeperu, a beeper sebere
  5. 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ě tutorial_kompilace

Jak nastavit java prostředí v příkazové řádce pod Windows 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).

  1. Doplňte svůj program do 'Lab02Karel'
  2. Spusťte Karla a ověřte, že Karel správně udělá, co po něm žádáte
  3. Otevřete webovou stránku Upload Systemu a nahrajte svoje řešení (soubor 'Lab02Karel')
  4. 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
}
courses/a0b36pr1/labs/lab02.txt · Last modified: 2015/10/08 11:21 by faiglj