Hrvatsko društvo za robotiku - Uvod u robotiku - vježbe

Blok

Cilj

Cilj vježbe naučiti kako izvršiti više naredbi grupiranih na dani način - ili nijednu iz grupe.

Potreba

×
Blok naredbi je niz naredbi koje su nerazdvojne - kao blizanci.

Drugim riječima, ili će se izvršiti sve naredbe, ili nijedna.

Potreba za blokom je česta. Ako želimo ući u kuću, moramo otvoriti vrata i zakoračiti. Moramo uvijek učiniti obadvije radnje. Zakoračiti, bez da smo otvorili vrata, nije tako dobra ideja.

Kod

void RobotLine::loop() {
	go(50, 50);
	if (front() < 100){
		go(50, -50);
		delayMs(700);
	}
}
Kod radi isto što i u prethodnoj vježbi. Jedina je razlika što blok nije određen zarezom, nego vitičastim zagradama: {}

Vitičaste zagrade su bolje za više naredbi. Očito bi 20 naredbi bilo nespretno napisati u jednom redu.

Općenito je program pregledniji, kad je svaka naredba u svojoj liniji, osim stvarno jednostavnih i sličnih.

Krivo

void RobotLine::loop() {
	go(50, 50);
	if (front() < 100)
		go(50, -50);
		delayMs(700);
}
Što bi radio ovakav program? Izbacili smo vitičaste zagrade. Tko je programirao u Pythonu, pomislio bi da bi radio isto što i gornji.

2 su naredbe uredno poravnate ispod "if-a", što sugerira da će se izvršiti obadvije ili nijedna.
void RobotLine::loop() {
	go(50, 50);
	if (front() < 100)
		go(50, -50);
	delayMs(700);
}
Ne, ne bi radio isto. C++-u je svejedno koliko ima razmaka ili tabulatora. On bi program protumačio kao što je lijevo.

Više ne bi bio blok od 2 narebe, nego 2 naredbe.

Dakle, robot bi krenuo naprijed. Recimo da nema prepreke, "if" ne bi bio izvršen, ali bi bila izvršena zadnja naredba, "delayMs". To nismo željeli!

Rezultat je da će provjeraviti prepreku svakih 700 ms. Nekad će se početi okretati da dovoljnoj udaljenosti ispred prepreke, nekad bi možda mogao i udariti u nju.

Početniku ispravljanje ovakvih (logičkih) grešaka može biti teško i dugotrajno. Pažljivo proučavajte ove vježbe i budite sigurni da vam je svaka jasna. U protivnom se može dogoditi da jednu grešku ispravljate satima.

Zadatak: skratiti.

void RobotLine::loop() {
	if (2 < 3){
		go(50, 50);
		delayMs(1000);
		stop();
	}
}
Možete li skratiti ovaj program?

Primjedbe



Projekt "Uvod u robotiku" sufinanciran je iz Europskog socijalnog fonda, poziv "Jačanje kapaciteta organizacija civilnoga društva za popularizaciju STEM-a". Relevantne stranice: Sadržaj vježbe za virtualne radionice isključiva je odgovornost Hrvatskog društva za robotiku.