De ce contează?
Calculatorul de buzunar face 7 ÷ 2 = 3,5 fără să clipești. Calculatorul din concurs face 7 / 2 = 3 și aruncă restul — pentru că îi spui că lucrezi cu numere întregi. Același simbol, alt sens, altă valoare. Tipul datelor nu e un detaliu tehnic: schimbă concret rezultatul calculului.
Operatorii aritmetici de bază
| Operator | Operație | Exemplu | Rezultat |
|---|---|---|---|
+ | Adunare | 5 + 3 | 8 |
- | Scădere | 5 - 3 | 2 |
* | Înmulțire | 5 * 3 | 15 |
/ | Împărțire | 7 / 2 | 3 (întreg!) |
% | Rest (modulo) | 7 % 2 | 1 |
/ între doi întregi dă câtul întreg — restul se pierde. 7 / 2 = 3, nu 3.5. Operatorul % dă tocmai acel rest: 7 % 2 = 1. Reține: % funcționează DOAR pe tipuri întregi — 7.0 % 2 e eroare de compilare.
Împărțire întreagă vs reală
#include <iostream>
using namespace std;
int main() {
int a = 7, b = 2;
cout << a / b << endl; // 3 -- impartire intreaga
cout << (double)a / b << endl; // 3.5 -- cast la double
cout << a / (double)b << endl; // 3.5 -- acelasi lucru
cout << 7.0 / 2 << endl; // 3.5 -- literal real
// Restul impartirii
cout << a % b << endl; // 1
cout << 13 % 4 << endl; // 1 (13 = 4*3 + 1)
cout << 20 % 5 << endl; // 0 (20 se divide exact)
return 0;
}Ordinea operațiilor
C++ respectă prioritatea matematică obișnuită:
- Expresiile din paranteze
()— prima dată *,/,%— stânga la dreapta+,-— stânga la dreapta
int r1 = 2 + 3 * 4; // 14 (nu 20): 3*4=12, apoi 2+12
int r2 = (2 + 3) * 4; // 20: (2+3)=5, apoi 5*4
int r3 = 10 - 3 - 2; // 5: (10-3)=7, apoi 7-2
int r4 = 10 / 2 / 5; // 1: (10/2)=5, apoi 5/5Operatori de incrementare
int x = 5;
x++; // x devine 6 (echivalent cu x = x + 1)
x--; // x devine 5 (echivalent cu x = x - 1)
x += 3; // x devine 8 (echivalent cu x = x + 3)
x *= 2; // x devine 16 (echivalent cu x = x * 2)Modulo — cel mai util operator la concursuri
Modulo apare în zeci de probleme, adesea acolo unde nu te aștepți:
// Verifica paritatea
if (n % 2 == 0) cout << "par";
// Extrage ultima cifra a unui numar
int ultimaCifra = n % 10; // ex: 1234 % 10 = 4
// Indice circular (wrap-around intr-un vector)
int urmator = (i + 1) % n; // dupa ultima pozitie, revine la 0n % 10 extrage ultima cifră, n / 10 o taie. Repetând aceste două operații, poți procesa toate cifrele unui număr de la dreapta la stânga — vei folosi asta des în capitolele următoare.
Greșeala 1: Calculezi media cu împărțire întreagă. (a + b) / 2 când a și b sunt int trunchiază rezultatul. Dacă vrei zecimale, scrie (a + b) / 2.0.
Greșeala 2: Uiți parantezele și te bazezi pe prioritate. a + b * c ≠ (a + b) * c. Dacă nu ești sigur, pune paranteze — nu costă nimic și elimină ambiguitatea.
Greșeala 3: Verifici imparitatea cu n % 2 == 1, dar n poate fi negativ. În C++, -3 % 2 e -1, nu 1. Condiția corectă pentru impar este n % 2 != 0.