U prethodnoj lekciji upoznali smo osnovne aritmetičke operatore u C++ jeziku:

  • +
  • -
  • *
  • /
  • %

Od svih ovih operatora, jedan često zbunjuje početnike više od ostalih:

modulo operator (%)

Na prvi pogled izgleda neobično.

Nije sabiranje.

Nije deljenje.

Nije množenje.

Ali u stvarnom programiranju modulo operator je izuzetno važan.

Koristi se u:

  • proveri parnosti brojeva
  • radu sa ciklusima
  • kalendarima
  • igrama
  • validaciji podataka
  • raspoređivanju zadataka
  • algoritmima
  • kriptografiji
  • obradi nizova

Ako dobro razumete modulo operator, rešićete veliki broj tipičnih zadataka mnogo lakše.

U ovoj lekciji naučićemo:

  • šta je modulo operator,
  • kako radi,
  • matematičku logiku iza njega,
  • tipične zadatke,
  • česte greške,
  • i praktične primere.

Šta je modulo operator?

Modulo operator:

%

vraća:

ostatak pri celobrojnom deljenju

Primer:

10 % 3

Prvo:

koliko puta 3 staje u 10?

Odgovor:

3 puta

Jer:

3 × 3 = 9

Koliko ostaje?

1

Zato:

10 % 3 = 1

Još primera

8 % 2

Koliko puta 2 staje u 8?

4 puta

Ostatak:

0

Rezultat:

8 % 2 = 0
17 % 5

Koliko puta 5 staje u 17?

3 puta

Jer:

15

Ostatak:

2

Rezultat:

17 % 5 = 2
25 % 7

7 ide:

3 puta

Jer:

21

Ostatak:

4

Rezultat:

25 % 7 = 4

Vizuelna logika

Formula:

broj = (delilac × količnik) + ostatak

Primer:

17 = (5 × 3) + 2

Dakle:

17 % 5 = 2

To je suština modulo operatora.

Kada je rezultat 0?

Ako je broj potpuno deljiv.

Primer:

12 % 3 = 0

Jer:

12 / 3 = 4

bez ostatka.

To je veoma korisno.

Provera parnog broja

Najpoznatiji primer.

Ako broj delimo sa 2:

paran broj daje ostatak:

0

neparan:

1

Primer:

int broj = 14;

if (broj % 2 == 0) {
    cout << "Paran broj";
}

Jer:

14 % 2 = 0

Primer neparnog:

13 % 2 = 1

Tipičan zadatak — paran ili neparan

#include <iostream>
using namespace std;

int main() {
    int broj;

    cout << "Unesi broj: ";
    cin >> broj;

    if (broj % 2 == 0) {
        cout << "Broj je paran";
    }
    else {
        cout << "Broj je neparan";
    }

    return 0;
}

Ovo je klasičan ispitni zadatak.

Deljivost sa brojem

Modulo se koristi za proveru deljivosti.

Pravilo:

Ako:

broj % n == 0

onda je broj deljiv sa:

n

Primer:

if (broj % 5 == 0)

broj je deljiv sa 5.

Primer:

if (broj % 10 == 0)

broj je deljiv sa 10.

Tipičan zadatak — deljivost sa 3

int broj;

cin >> broj;

if (broj % 3 == 0) {
    cout << "Deljiv sa 3";
}

Tipičan zadatak — deljiv sa 3 i 5

if (broj % 3 == 0 && broj % 5 == 0)

Primer:

15

Rezultat:

tačno.

Jer:

15 % 3 = 0
15 % 5 = 0

Poslednja cifra broja

Veoma koristan trik.

Ako želimo poslednju cifru:

broj % 10

Primer:

123 % 10

Rezultat:

3

Jer:

123 = 120 + 3

Primer:

9876 % 10

Rezultat:

6

Tipičan zadatak — izdvajanje poslednje cifre

int broj = 548;

int poslednja = broj % 10;

cout << poslednja;

Rezultat:

8

Poslednje dve cifre

broj % 100

Primer:

12345 % 100

Rezultat:

45

Sat i kružni sistemi

Modulo je odličan za kružne sisteme.

Primer sat:

Ako je:

23 sata

dodamo:

3 sata

dobijamo:

26

Ali na satu:

2

Račun:

(23 + 3) % 24

Rezultat:

2

Veoma korisno.

Naizmenični obrasci

Primer:

želimo:

0 1 0 1 0 1

Koristimo:

i % 2

Primer:

for (int i = 0; i < 6; i++) {
    cout << i % 2;
}

Rezultat:

010101

Tipičan zadatak — svaka treća iteracija

Primer:

if (i % 3 == 0)

Koristi se za:

  • raspored
  • bojenje tabela
  • ponavljanje događaja

Sabiranje cifara

Primer:

Broj:

572

Poslednja cifra:

572 % 10 = 2

Skidanje poslednje cifre:

572 / 10 = 57

Ponovo:

57 % 10 = 7

Ovo je osnova mnogih algoritama.

Primer programa

#include <iostream>
using namespace std;

int main() {
    int broj = 572;

    while (broj > 0) {
        cout << broj % 10 << endl;
        broj = broj / 10;
    }

    return 0;
}

Rezultat:

2
7
5

Da li modulo radi sa decimalama?

Ne na ovaj način.

Pogrešno:

5.5 % 2

Greška.

Operator % radi sa celobrojnim tipovima.

Za decimalne brojeve postoje druge metode.

Negativni brojevi

Primer:

-7 % 3

Rezultat može zavisiti od implementacije i pravila jezika, pa početnicima nije preporučljivo da se oslanjaju na negativni modulo dok ne savladaju osnove.

Najčešće greške početnika

1. Mešanje modulo i deljenja

Pogrešno razumevanje:

10 % 3

nije:

3.33

Već:

1

2. Korišćenje decimalnih brojeva

Pogrešno:

5.2 % 2

3. Pogrešna logika parnosti

Ispravno:

broj % 2 == 0

Ne:

broj / 2 == 0

4. Zaboravljanje operatora poređenja

Pogrešno:

if (broj % 2)

Iako tehnički radi u nekim kontekstima, početnicima je jasnije:

if (broj % 2 == 0)

5. Deljenje nulom

Pogrešno:

broj % 0

Runtime greška.

Praktični primer — FizzBuzz

Klasičan zadatak:

Ako je broj deljiv sa 3:

ispiši:

Fizz

Ako sa 5:

Buzz

Ako sa oba:

FizzBuzz
if (broj % 3 == 0 && broj % 5 == 0)

Ovo je poznat intervju zadatak.

Gde se modulo koristi?

Veoma često:

  • validacija brojeva
  • rasporedi
  • kružni sistemi
  • igre
  • algoritmi
  • nizovi
  • hash funkcije
  • kriptografija
  • rad sa datumima i vremenom

Rezime

Modulo operator:

%

vraća:

ostatak pri deljenju

Najčešće upotrebe:

  • paran/neparan broj
  • deljivost
  • poslednja cifra
  • ciklični obrasci
  • sat i vreme
  • algoritmi nad ciframa

Ovo je jedan od najkorisnijih operatora u C++.

Mini test

  1. Šta vraća %?
    a) količnik
    b) ostatak
  2. Koliko je:
10 % 3

a) 3
b) 1

  1. Kako proveriti paran broj?
    a)
broj % 2 == 0

b)

broj / 2 == 0
  1. Poslednja cifra broja?
    a)
broj % 10

b)

broj / 10
  1. Koliko je:
23 + 3 = ?
(23 + 3) % 24

a) 2
b) 26

Zadaci za vežbu

  1. Proveri paran/neparan broj.
  2. Proveri deljivost sa 5.
  3. Izdvoji poslednju cifru.
  4. Napravi obrazac 010101.
  5. Reši FizzBuzz.

Domaći zadatak

Napravi program koji:

  • unosi broj
  • proverava da li je paran
  • proverava deljivost sa 3 i 5
  • prikazuje poslednju cifru
  • prikazuje poslednje dve cifre

Pristupačnost