1. Sissejuhatus
C-keeles programmeerimisel kasutatakse erinevaid operaatoreid, et teha arvutusi tõhusalt. Nende seas on %
operaator, tuntud kui “jääk” või “modulo”, eriti kasulik teatud tüüpi arvutustes. Näiteks saab seda kasutada paaris- ja paaritute arvude tuvastamisel, juhuslike väärtuste piiramisel või aja arvutamisel. Selles artiklis selgitame üksikasjalikult, kuidas C-keeles jäägi arvutamine käib ja toome praktilisi näiteid selle kasutamisest programmides.
2. Põhimõistete selgitus
2.1 Kuidas jääki arvutada
C-keeles kasutatakse täisarvude jäägi leidmiseks %
operaatorit. See operaator tagastab jäägi, kui täisarv 1 jagatakse täisarvuga 2. Vaatame konkreetset koodinäidet.
#include <stdio.h>
int main(void){
int x = 10;
int y = 3;
int remainder = x % y;
printf("%dn", remainder); // Väljund: 1
return 0;
}
Selles koodis väljastatakse 10 % 3
tulemuseks 1
, kuna 10 jagamisel 3-ga jääb jäägiks 1. % operaatorit saab kasutada ainult täisarvudega; kui vaja on arvutada jääki komaga arvude puhul, kasuta fmod()
funktsiooni.
2.2 Ujukoma arvude jääk
Kui jääki on vaja arvutada ujukoma arvude puhul, kasutatakse C-keele standardraamatukogus math.h
sisalduvat fmod()
funktsiooni. See on kasulik ujukoma jäägi arvutamiseks.
#include <stdio.h>
#include <math.h>
int main(void){
double x = 7.5;
double y = 2.0;
double remainder = fmod(x, y);
printf("%fn", remainder); // Väljund: 1.5
return 0;
}
Selles koodis annab 7.5 % 2.0
jäägiks 1.5
. Ujukoma arvude jäägi leidmisel on fmod()
funktsioon väga mugav.

3. Modulo-operatori praktilised näited
3.1 Paaris- ja paaritute arvude tuvastamine
Modulo-operaatoriga saab lihtsalt määrata, kas täisarv on paaris või paaritu. Kui jagamisel 2-ga jääb jäägiks 0, on arv paaris; kui jääk on 1, siis paaritu.
#include <stdio.h>
int main(void){
int number = 5;
if (number % 2 == 0){
printf("%d on paarisarvn", number);
} else {
printf("%d on paaritu arvn", number);
}
return 0;
}
Selles näites jääb 5 jagamisel 2-ga jäägiks 1, nii et väljastatakse “5 on paaritu arv”. See on lihtne viis paaris/paaritu tuvastamiseks.
3.2 Täringu silumise simuleerimine
Modulo-operaatorit kasutatakse ka siis, kui tuleb piirata juhuslikke arve teatud vahemikku. Näiteks täringu (1 kuni 6) visete simuleerimiseks.
#include <stdio.h>
#include <stdlib.h>
int main(void){
int dice = (rand() % 6) + 1;
printf("Täringu tulemus: %dn", dice);
return 0;
}
Siin kasutatakse rand()
funktsiooni, mille tulemus jagatakse 6-ga ja liidetakse 1, et saada vahemik 1–6.
4. Modulo-operatori rakendused
4.1 Rõngpuhvri (ring buffer) teostamine
Rõngpuhver on andmestruktuur, kus lõpp ja algus on omavahel ühendatud. Modulo-operaatoriga on lihtne sellises puhvris indeksit hallata.
#include <stdio.h>
#define BUFFER_SIZE 4
int buffer[BUFFER_SIZE];
int index = 0;
void put(int data) {
buffer[index] = data;
index = (index + 1) % BUFFER_SIZE;
}
void printBuffer() {
for (int i = 0; i < BUFFER_SIZE; i++) {
printf("%d ", buffer[i]);
}
printf("n");
}
int main(void) {
put(1);
put(2);
put(3);
put(4);
printBuffer(); // Väljund: 1 2 3 4
put(5);
printBuffer(); // Väljund: 5 2 3 4
return 0;
}
Siin võimaldab BUFFER_SIZE
abil tehtud modulo-arvutus indeksi tsüklilist liikumist puhvri sees, nii et uusi andmeid saab lisada, ilma et läheks puhvri piiridest välja.
4.2 Korduvad toimingud tsüklis
Modulo-operaator aitab ka tsüklis, kui tuleb teha korduva mustriga toiminguid.
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) {
printf("%d on 3-ga jaguvn", i);
}
}
return 0;
}
Selles koodis kuvatakse kõik arvud 1 kuni 10, mis jaguvad 3-ga. Modulo-operaator muudab selliste tingimuste kontrolli lihtsaks.
5. Korduma kippuvad küsimused ja ettevaatusabinõud
5.1 Nulliga jagamise probleem
Üks oluline tähelepanek modulo-operaatori kasutamisel on nulliga jagamine. Kui nimetaja on null, põhjustab programm käitusaegse vea. Seega tuleb alati veenduda, et nimetaja ei ole null.
#include <stdio.h>
int main(void) {
int numerator = 10;
int denominator = 0;
if (denominator != 0) {
printf("Jääk: %dn", numerator % denominator);
} else {
printf("Nulliga jagamine pole lubatavn");
}
return 0;
}
5.2 Märgi käsitlemine
Teine oluline punkt on märgi käsitlemine negatiivsete arvude puhul. Modulo-tulemuse märk on sama, mis jagatava (esimese arvu) märk.
#include <stdio.h>
int main(void) {
int x = -10;
int y = 3;
printf("Jääk: %dn", x % y); // Väljund: -1
return 0;
}
Selles näites on -10 jagamisel 3-ga jääk -1, nii et tulemuse märk järgib jagatava märki.
6. Kokkuvõte
Selles artiklis selgitasime, kuidas C-keeles jääki arvutada ja tõime näiteid selle kasutamisest. Modulo-operaator on kasulik paaris/paaritu arvude tuvastamisel, rõngpuhvri teostamisel, tsüklites ja muudes olukordades. Nende põhiliste kasutusviiside mõistmine võimaldab tõhusamat programmeerimist. Kasuta neid teadmisi oma edasises programmeerimistöös!