Čoveče, ne ljuti se – rešenje
Primer pokazuje kako se u programu simulira jedno bacanje kocke, a zatim se pomoću uslovnih naredbi određuje koja poruka treba da se ispiše. Program ne implementira celu društvenu igru — prikazuje samo jednostavnu logiku zadatu u ovom primeru.
Ideja rešenja
Potrebno je generisati broj od 1 do 6, kao rezultat bacanja kocke, i na osnovu njega izabrati poruku:
- Ako je rezultat
2ili4, ispisuje se „U kućici je“. - Ako je rezultat
1, ispisuje se „Nadomak kućice je“. - Za rezultate
3,5ili6, ispisuje se „Nije se pomerio“.
Za izbor poruke možemo koristiti konstrukciju if–else if–else ili naredbu
switch. Obe varijante su prikazane u nastavku.
Rešenje 1 — if–else
Funkcija srand(time(NULL)) postavlja početnu vrednost generatora
pseudo-slučajnih brojeva. Poziva se jednom, na početku programa. Funkcija
rand() zatim vraća pseudo-slučajan broj, a izraz rand() % 6 + 1
u ovom jednostavnom primeru daje vrednost od 1 do 6.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int bacanje;
// Inicijalizujemo generator pseudo-slučajnih brojeva jednom.
srand((unsigned int)time(NULL));
// Dobijamo broj u opsegu od 1 do 6.
bacanje = rand() % 6 + 1;
printf("Bacanje kocke: %d\n", bacanje);
// Ako je rezultat 2 ili 4, ispisujemo prvu poruku.
if (bacanje == 2 || bacanje == 4) {
printf("U kucici je\n");
}
// U suprotnom proveravamo da li je rezultat 1.
else if (bacanje == 1) {
printf("Nadomak kucice je\n");
}
// Preostali mogući rezultati su 3, 5 i 6.
else {
printf("Nije se pomerio\n");
}
return 0;
}
Napomena o slovima č, ć i š: U primeru su poruke u kodu napisane bez dijakritičkih znakova kako bi tekst bio što kompatibilniji sa različitim podešavanjima konzole. Ako je konzola podešena za UTF-8, poruke možete napisati i kao „U kućici je“ i „Nadomak kućice je“.
Kako radi program?
#include <stdio.h>omogućava ispis pomoću funkcijeprintf.#include <stdlib.h>sadrži deklaracije funkcijarandisrand.#include <time.h>omogućava poziv funkcijetime, čija se vrednost koristi kao početna vrednost generatora.rand() % 6 + 1prevodi rezultat funkcijerandu opseg od 1 do 6.- Uslov
bacanje == 2 || bacanje == 4koristi logičko „ili“: dovoljan je jedan od dva uslova da izraz bude tačan. - Grana
elseobrađuje sve vrednosti koje prethodni uslovi nisu obuhvatili.
Rešenje 2 — naredba switch
Kada treba razdvojiti više mogućih vrednosti jedne promenljive, switch može
da učini kod preglednijim. Pošto se za rezultate 2 i 4 ispisuje ista poruka, oba slučaja
mogu da vode do istog bloka naredbi.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int bacanje;
// Početnu vrednost generatora postavljamo samo jednom.
srand((unsigned int)time(NULL));
bacanje = rand() % 6 + 1;
printf("Bacanje kocke: %d\n", bacanje);
switch (bacanje) {
case 2:
case 4:
// Oba slučaja koriste istu poruku.
printf("U kucici je\n");
break;
case 1:
printf("Nadomak kucice je\n");
break;
default:
// Ovde stižu rezultati 3, 5 i 6.
printf("Nije se pomerio\n");
break;
}
return 0;
}
Zašto su važni break i default?
Naredba break završava izvršavanje odgovarajućeg slučaja, pa se ne nastavlja
na sledeći slučaj. Slučajevi case 2 i case 4 namerno nemaju
naredbu break između sebe jer treba da izvrše isti blok. Oznaka
default obrađuje sve vrednosti koje nisu navedene u ostalim slučajevima.
Važne napomene o slučajnim brojevima
srandne određuje najveću dozvoljenu vrednost, već postavlja početnu vrednost generatora koji koristirand.srandtreba pozvati jednom na početku programa, a ne svaki put kada bacamo kocku.- Izraz
rand() % 6 + 1je uobičajen u početničkim primerima, ali zbog ostatka pri deljenju raspodela ne mora biti savršeno ravnomerna. - Za moderni C++ preporučuje se biblioteka
<random>, koja nudi namensku raspodelu celih brojeva.
Naprednija varijanta — generator iz modernog C++-a
Ako se zadatak radi u C++, umesto kombinacije rand i operatora
% možemo koristiti std::mt19937 i
std::uniform_int_distribution. Tako se jasno navodi da želimo ceo broj iz
intervala od 1 do 6, uključujući obe granice.
#include <iostream>
#include <random>
int main()
{
// Generator inicijalizujemo vrednošću iz izvora slučajnosti.
std::random_device uredjaj;
std::mt19937 generator(uredjaj());
// Raspodela vraća cele brojeve od 1 do 6, uključujući 1 i 6.
std::uniform_int_distribution<int> kocka(1, 6);
int bacanje = kocka(generator);
std::cout << "Bacanje kocke: " << bacanje << '\n';
if (bacanje == 2 || bacanje == 4) {
std::cout << "U kucici je\n";
} else if (bacanje == 1) {
std::cout << "Nadomak kucice je\n";
} else {
std::cout << "Nije se pomerio\n";
}
return 0;
}
Ova varijanta koristi C++ biblioteku <random> i pogodna je za novije
C++ programe. Za vežbanje osnovnih naredbi grananja, prvo rešenje sa if–else
sasvim je dovoljno.
Zaključak
Zadatak vežba generisanje broja, logički operator „ili“ i grananje toka programa.
Za tri grupe ishoda obe C varijante daju isti rezultat: if–else je pogodan
za direktno proveravanje uslova, dok je switch koristan kada se ponašanje
programa bira prema konkretnim vrednostima promenljive.
Korisna dokumentacija:
