Č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 2 ili 4, ispisuje se „U kućici je“.
  • Ako je rezultat 1, ispisuje se „Nadomak kućice je“.
  • Za rezultate 3, 5 ili 6, 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?

  1. #include <stdio.h> omogućava ispis pomoću funkcije printf.
  2. #include <stdlib.h> sadrži deklaracije funkcija rand i srand.
  3. #include <time.h> omogućava poziv funkcije time, čija se vrednost koristi kao početna vrednost generatora.
  4. rand() % 6 + 1 prevodi rezultat funkcije rand u opseg od 1 do 6.
  5. Uslov bacanje == 2 || bacanje == 4 koristi logičko „ili“: dovoljan je jedan od dva uslova da izraz bude tačan.
  6. Grana else obrađ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

  • srand ne određuje najveću dozvoljenu vrednost, već postavlja početnu vrednost generatora koji koristi rand.
  • srand treba pozvati jednom na početku programa, a ne svaki put kada bacamo kocku.
  • Izraz rand() % 6 + 1 je 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:


Ilustracija uz oblast grananja u programu. Klikom na sliku otvara se njena veća verzija. Primeri zadataka iz oblasti grananja u programu