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?
Rješenje
void RobotLine::loop() {
go(50, 50);
delayMs(1000);
stop();
}
Kako je 2 < 3, "if" će uvijek biti izvršen pa je nepotreban.
Kako se uvijek izvršavaju samo te 3 naredbe, vitičaste su zagrade isto nepotrebne.
void RobotLine::loop() {
go(50, 50);
delayMs(1000);
}
Program se stalno ponavlja. Znači da će odmah nakon zadnje naredbe, "stop", slijediti prva, pokretanje motora, nakon čega slijedi sekunda rada motora.
Znači, "stop" će djelovati toliko kratko da ga možemo zanemariti.
void RobotLine::loop() {
go(50, 50);
}
Sekunda pauze je isto suvišna. Motori rade na isti način, bila tu pauza ili ne.
Došli smo do konačnog rješenja.
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.