Invatare Atomica

Expresii aritmetice si logice

Progres lectie:
0%
🎯

Obiectivul lectiei

Vei invata sa scrii si sa evaluezi expresii corecte: operatori aritmetici, relationali si logici, plus regula de aur a precedentei. Este una dintre cele mai frecvente teme la examen.

Dupa aceasta lectie vei putea:

  • Sa aplici operatorii aritmetici (+, -, *, /, //, %, **) si sa distingi impartirea reala de cea intreaga
  • Sa evaluezi expresii respectand precedenta si asociativitatea operatorilor
  • Sa folosesti operatorii relationali (<, >, ==, !=, <=, >=) care produc valori booleene
  • Sa combini conditii cu operatorii logici (and, or, not) si sa intelegi evaluarea pe scurtcircuit
  • Sa scrii aceleasi expresii si in C++ (sectiune intensiv) si sa rezolvi exercitii tip examen

Incearca singur!

Provocare:

Fara calculator, cat face 2 + 3 * 4? Apoi cat face (2 + 3) * 4? Scrie ambele rezultate si explica de ce sunt diferite.

💡 Ai nevoie de un indiciu?

Inmultirea are prioritate mai mare decat adunarea, deci se face prima. Parantezele schimba ordinea: ce este in paranteza se calculeaza intotdeauna primul.

Verifica: 2 + 3 * 4 = 2 + 12 = 14, iar (2 + 3) * 4 = 5 * 4 = 20.

1

1. Operatori aritmetici

Operatorii aritmetici combina numere si produc tot un numar. Atentie la cele doua feluri de impartire din Python:

OperatorDescriereExempluRezultat
+Adunare5 + 38
-Scadere5 - 32
*Inmultire5 * 315
/Impartire reala7 / 23.5
//Impartire intreaga (catul)7 // 23
%Rest (modulo)7 % 31
**Ridicare la putere2 ** 38

Sa le vedem ruland efectiv in Python:

print(7 / 2)    # impartire reala
print(7 // 2)   # impartire intreaga (catul)
print(7 % 3)    # restul impartirii
print(2 ** 3)   # 2 la puterea 3
Rezultat (rulat real):
3.5
3
1
8

Idee cheie: perechea // si % este motorul multor algoritmi de prelucrare a cifrelor (vei prelucra cifrele unui numar in lectiile urmatoare): n % 10 da ultima cifra, iar n // 10 elimina ultima cifra.

2

2. Precedenta si asociativitatea operatorilor

Cand o expresie are mai multi operatori, ordinea de evaluare este (de la prioritate maxima la minima):

  1. ( ) — parantezele (prioritate maxima)
  2. ** — ridicarea la putere
  3. * / // % — inmultire, impartiri, rest
  4. + - — adunare, scadere

La prioritati egale evaluarea merge de la stanga la dreapta. Exceptie: ** este asociativ la dreapta.

print(2 + 3 * 4)     # * inainte de +
print((2 + 3) * 4)   # parantezele schimba ordinea
print(2 ** 3 ** 2)    # ** asociativ la dreapta: 2 ** (3 ** 2)
Rezultat (rulat real):
14
20
512

2 ** 3 ** 2 da 512 pentru ca se evalueaza ca 2 ** (3 ** 2) = 2 ** 9 = 512, NU (2 ** 3) ** 2 = 64. Cand ai dubii, foloseste paranteze — clarifica intentia.

3

3. Operatori relationali (de comparatie)

Operatorii relationali compara doua valori si produc un boolean: True sau False.

OperatorDescriereExempluRezultat
==Egal5 == 5True
!=Diferit5 != 3True
<Mai mic3 < 5True
>Mai mare5 > 3True
<=Mai mic sau egal5 <= 5True
>=Mai mare sau egal5 >= 6False
print(5 == 5)
print(5 != 3)
print(3 < 5)
print(5 >= 6)
print(1 <= 5 <= 10)   # Python permite comparatii inlantuite
Rezultat (rulat real):
True
True
True
False
True

Capcana clasica: nu confunda = (atribuire, da o valoare unei variabile) cu == (comparatie, verifica egalitatea).

4

4. Operatori logici

Operatorii logici combina valori booleene. In Python se scriu in cuvinte: and, or, not.

OperatorDescriereExempluRezultat
andSI logic (adevarat doar daca ambele sunt True)True and FalseFalse
orSAU logic (adevarat daca cel putin unul e True)True or FalseTrue
notNegatie (inverseaza valoarea)not TrueFalse
x = 5
y = 3
print(x > y and x % y == 2)   # 5>3 True, 5%3==2 True -> True
print(x == y or x > y)         # 5==3 False, 5>3 True -> True
print(not (x > y))             # not True -> False
Rezultat (rulat real):
True
True
False

Evaluare pe scurtcircuit: la and, daca primul operand este False, al doilea nici nu se mai evalueaza (rezultatul e deja False). La or, daca primul este True, al doilea se ignora. Acest comportament permite, de exemplu, b != 0 and a % b == 0 — verifici intai ca b nu e zero, evitand impartirea la zero.

5

5. Exercitiu rezolvat pas cu pas

Sa evaluam o expresie tip examen, aplicand precedenta:

a = 10
b = 3
rezultat = a % b + a // b * 2
print(rezultat)

Rezolvare pas cu pas (//, % si * au prioritate peste +):

  1. a % b = 10 % 3 = 1
  2. a // b = 10 // 3 = 3
  3. 3 * 2 = 6 (inmultirea inainte de adunare)
  4. 1 + 6 = 7
Rezultat (rulat real):
7
6

6. Aceleasi expresii in C++ (EXCLUSIV INTENSIV)

Aceasta sectiune este doar pentru specializarea intensiv informatica. La intensiv inveti acelasi material si in C++. Operatorii sunt foarte asemanatori, dar exista doua diferente importante fata de Python:

  • Impartirea: in C++ nu exista //. Daca ambii operanzi sunt int, operatorul / face impartire intreaga (7 / 2 da 3). Pentru rezultat real, cel putin un operand trebuie sa fie real (7.0 / 2).
  • Operatorii logici se scriu cu simboluri: && (si), || (sau), ! (negatie).
  • Booleenii se afiseaza implicit ca 1 / 0; cu boolalpha apar ca true / false.
// Operatori in C++ (intensiv)
#include <iostream>
using namespace std;

int main() {
    cout << 7 / 2 << endl;          // impartire intreaga: 3
    cout << 7 % 3 << endl;          // rest: 1
    cout << boolalpha << (5 == 5) << endl;  // true

    int x = 5, y = 3;
    cout << ((x > y) && (x % y == 2)) << endl;  // true
    cout << (!(x > y)) << endl;                  // false
    return 0;
}
Rezultat (compilat cu g++ -std=c++17 si rulat real):
3
1
true
true
false

Exercitii practice

Exercitiul 1 (Nivel minim) - Evalueaza expresia

Fie a = 15, b = 4. Calculeaza pas cu pas valoarea expresiei a % b + a // b * 2 si verifica rezultatul ruland in Python. (Indiciu: 15 % 4 = 3, 15 // 4 = 3.)

Vezi rezolvarea

Rezolvare pas cu pas, aplicand precedenta operatorilor (//, % si * inainte de +):

  1. a % b = 15 % 4 = 3 (restul impartirii lui 15 la 4)
  2. a // b = 15 // 4 = 3 (catul impartirii intregi)
  3. a // b * 2 = 3 * 2 = 6
  4. a % b + a // b * 2 = 3 + 6 = 9

Rezultat final: 9. Verificare in Python: print(a % b + a // b * 2) afiseaza 9.

Exercitiul 2 (Nivel standard) - Expresie logica

Fie x = 8, y = 3. Stabileste daca expresia x > y and x % y == 2 este True sau False. Justifica fiecare comparatie. (Indiciu: 8 % 3 = 2.)

Vezi rezolvarea

Evaluam fiecare comparatie separat, apoi combinam cu and:

  1. x > y devine 8 > 3, adica True.
  2. x % y este 8 % 3 = 2 (restul impartirii lui 8 la 3).
  3. x % y == 2 devine 2 == 2, adica True.
  4. and este adevarat doar daca ambele conditii sunt True: True and True = True.

Rezultat final: expresia este True. Verificare in Python: print(x > y and x % y == 2) afiseaza True.

Exercitiul 3 (Nivel performanta) - Inverseaza un numar de doua cifre

Pentru n = 47, scrie o expresie care obtine numarul rasturnat (74), folosind doar % si //. Scrie codul:

n = 47
invers = n % 10 * 10 + n // 10
print(invers)   # ce afiseaza?

Explica de ce n % 10 da ultima cifra si n // 10 da prima cifra.

Vezi rezolvarea

Structura de rezolvare (schita, nu solutia rulata de-a gata):

  1. Identifica ce face n % 10: da restul impartirii la 10, adica exact ultima cifra a numarului (pentru 47, cifra 7).
  2. Identifica ce face n // 10: da catul impartirii intregi la 10, adica numarul fara ultima cifra - pentru un numar de doua cifre, ramane prima cifra (pentru 47, cifra 4).
  3. Construieste numarul rasturnat: cifra extrasa cu n % 10 trebuie mutata pe pozitia zecilor (se inmulteste cu 10), iar cifra extrasa cu n // 10 devine unitate si se aduna.

Criterii de evaluare: (1) rulezi codul si confirmi ca afiseaza 74; (2) explici corect rolul lui % 10 si // 10; (3) motivezi de ce n % 10 * 10 + n // 10 functioneaza doar pentru numere de exact doua cifre - pentru trei cifre ar fi nevoie de alta formula, care nu apare in lectie.

Exercitiul 4 (Nivel performanta) - Mini-simulare examen

Fie a = 27. Ce afiseaza urmatorul cod si de ce?

a = 27
print(a % 10 + a // 10)

(Indiciu: este suma cifrelor unui numar de doua cifre.)

Vezi rezolvarea

Structura de rezolvare (schita, nu rezultatul de-a gata):

  1. Descompune expresia in doi termeni: a % 10 si a // 10.
  2. Aplica pe a = 27 regulile din lectie: % 10 extrage ultima cifra, // 10 extrage prima cifra (pentru un numar de doua cifre).
  3. Aduna cele doua cifre extrase - observa ca suma lor este exact suma cifrelor numarului 27.

Criterii de evaluare: (1) calculezi corect cele doua valori si suma lor, apoi confirmi rulind codul in Python; (2) explici in cuvinte proprii de ce a % 10 + a // 10 da suma cifrelor doar pentru numere de doua cifre; (3) bonus - ce ar trebui schimbat pentru un numar de trei cifre? (cazul nu e acoperit in lectie, care trateaza doar doua cifre).

Ce ai invatat astazi

  • Operatorii aritmetici (+, -, *, /, //, %, **) si diferenta / vs //
  • Precedenta si asociativitatea (** este asociativ la dreapta)
  • Operatorii relationali produc valori booleene (==, !=, <, >, <=, >=)
  • Operatorii logici (and, or, not) si evaluarea pe scurtcircuit
  • Echivalentul in C++ la intensiv (/, &&, ||, !, boolalpha)

Vrei mai mult?

Provocare: Scrie o singura expresie Python (fara if) care este True doar daca anul an este bisect: divizibil cu 4, dar nu si cu 100, SAU divizibil cu 400. Testeaz-o pentru 2024 (bisect), 1900 (nebisect) si 2000 (bisect).

De gandit: La and, daca al doilea operand ar fi ceva ce "face o actiune" (nu doar o comparatie) - de exemplu o citire de la tastatura - ce s-ar intampla cu acea actiune atunci cand primul operand este deja False?

Dincolo de lectie: Evaluarea pe scurtcircuit nu e doar o curiozitate - e o tehnica de aparare folosita in programele reale: se scrie and exact ca sa verifice mai intai ca o conditie e sigura (de exemplu ca un numar nu e zero) inainte sa se incerce operatia riscanta (impartirea la el).

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →