Invatare Atomica

Evaluarea expresiilor - Tip Bac

Progres lectie:
0%
🎯

Obiectivul lectiei

Vei invata sa evaluezi orice expresie pas cu pas, aplicand corect regulile de precedenta si asociativitate, si sa stapanesti conversiile de tip. Evaluarea expresiilor este una dintre cele mai frecvente teme la examen.

Dupa aceasta lectie vei putea:

  • Sa aplici regulile de precedenta si asociativitate cand evaluezi o expresie
  • Sa folosesti corect impartirea intreaga (//), restul (%) si diferenta fata de /
  • Sa evaluezi expresii logice mixte (aritmetice + comparatii + and/or/not) pas cu pas
  • Sa faci conversii de tip (int, float, str) si sa intelegi evaluarea implicita
  • Sa rezolvi exercitii de evaluare de tip Bacalaureat, verificand fiecare pas

Incearca singur!

Provocare:

Fara sa rulezi cod, calculeaza mental valoarea expresiei 2 + 18 // 4 * 3. Atentie: // si * au aceeasi prioritate si se evalueaza de la stanga la dreapta.

💡 Ai nevoie de un indiciu?

Mai intai operatorii de aceeasi prioritate (// si *), de la stanga la dreapta: 18 // 4 = 4, apoi 4 * 3 = 12. La final adunarea: 2 + 12 = 14.

1

1. Precedenta operatorilor

Precedenta stabileste care operator se aplica primul. Cand doi operatori au aceeasi prioritate, conteaza asociativitatea (de obicei de la stanga la dreapta).

Ordinea (de la prioritate maxima la minima), in Python:

  1. ( ) — paranteze (prioritate maxima)
  2. ** — ridicare la putere (asociativa la dreapta)
  3. * / // % — inmultire, impartire, impartire intreaga, rest
  4. + - — adunare, scadere
  5. < > <= >= == != — comparatii
  6. not — negatie logica
  7. and — SI logic
  8. or — SAU logic (prioritate minima)
print(2 + 3 * 4)        # intai 3*4=12, apoi 2+12
print((2 + 3) * 4)      # parantezele schimba ordinea
print(10 - 2 - 3)        # de la stanga: (10-2)-3
print(2 ** 3 ** 2)       # ** e la dreapta: 2**(3**2)=2**9
Iesire (rulata):
14
20
5
512

Atentie la **: este singurul operator aritmetic asociativ la dreapta, deci 2 ** 3 ** 2 = 2 ** 9 = 512, nu 8 ** 2 = 64.

2

2. Impartirea intreaga (//) si restul (%)

In Python sunt trei operatori de impartire:

  • / — impartire reala, da intotdeauna float (7 / 2 = 3.5)
  • // — impartire intreaga (catul), arunca partea fractionara
  • % — restul impartirii (modulo)
print(7 / 2)      # impartire reala
print(7 // 2)     # cat intreg
print(7 % 2)      # rest
print(-7 // 2)    # in Python rotunjeste spre minus infinit
print(-7 % 2)     # restul are semnul impartitorului
Iesire (rulata):
3.5
3
1
-4
1

Trucuri pentru Bac (foarte des intalnite la prelucrarea cifrelor unui numar):

  • n % 10 = ultima cifra
  • n // 10 = numarul fara ultima cifra
  • n % 100 = ultimele 2 cifre
  • n // 100 = numarul fara ultimele 2 cifre
  • n % 2 == 0 = numarul e par; n % 2 == 1 = impar
3

3. Expresii logice si scurt-circuit

Comparatiile (< > == !=) se evalueaza inaintea operatorilor logici. Ordinea logica este: notandor.
a = 5
b = 3
print(not (a > b) or (a % b == 2))   # not True or True
print(a > b and a < 10)             # True and True
print(not a > b)                    # not se aplica dupa comparatie
print(3 < 5 < 10)                 # comparatii inlantuite
Iesire (rulata):
True
True
False
True

Evaluare scurt-circuit: la and, daca primul operand este False, rezultatul e deja False si al doilea nu se mai evalueaza. La or, daca primul e True, rezultatul e deja True. Asta permite scrieri sigure precum x != 0 and 10 / x > 1.

Interesant: True si False sunt numere

In Python True are valoarea 1, iar False valoarea 0. De aceea True + True da 2.

4

4. Conversii de tip (int, float, str)

O conversie de tip (cast) transforma o valoare dintr-un tip in altul. Este esentiala dupa input(), care returneaza mereu text.
  • int(x) — converteste in intreg (trunchiaza un float, nu rotunjeste)
  • float(x) — converteste in numar real
  • str(x) — converteste in text
print(int("42") + 8)      # text -> numar, apoi adunare
print(float("3.5") * 2)  # text -> float
print(str(2026) + "!")   # numar -> text, apoi concatenare
print(int(3.9))           # trunchiere, NU rotunjire
print(5 == 5.0)          # int si float se compara dupa valoare
Iesire (rulata):
50
7.0
2026!
3
True

Atentie: "42" + 8 (fara conversie) ar da eroare, fiindca nu poti aduna text cu numar. Iar + intre doua stringuri le lipeste (concatenare), nu le aduna.

5

5. Conversii intre baze de numeratie [EXCLUSIV intensiv]

Sectiune EXCLUSIV pentru clasele cu informatica intensiv. Conversiile intre baze de numeratie apar in programa de intensiv (tema 2.2 — prelucrari ale numerelor).

Python are functii predefinite pentru baze, dar e important sa intelegi si algoritmul cu impartiri repetate.

print(bin(13))          # 13 in baza 2 (prefix 0b)
print(int("1101", 2))   # din baza 2 in baza 10
print(int("ff", 16))    # din hexazecimal in baza 10
Iesire (rulata):
0b1101
13
255

Algoritmul de baza (conversie din baza 10 in baza 2 prin impartiri repetate la 2, citind resturile de jos in sus):

# Conversie 13 in baza 2 prin impartiri repetate
n = 13
cifre = ""
while n > 0:
    cifre = str(n % 2) + cifre   # restul devine cifra urmatoare
    n = n // 2                  # continuam cu catul
print(cifre)
Iesire (rulata):
1101

Complexitate: bucla ruleaza de aproximativ log₂(n) ori (n se injumatateste la fiecare pas), deci algoritmul este O(log n).

6

6. Evaluare pas cu pas - exemplu tip Bac

La examen, secretul este sa scrii fiecare pas intermediar. Nu evalua nimic "din cap" cand ai mai mult de doi operatori.

Sa evaluam not (x % 2 == 0) or (x > 10 and x < 20) pentru x = 12:

  1. x % 2 = 0, deci x % 2 == 0 este True
  2. not True = False
  3. x > 10 este True, x < 20 este True
  4. True and True = True
  5. False or True = True
x = 12
print(not (x % 2 == 0) or (x > 10 and x < 20))
Iesire (rulata):
True

Un alt clasic: suma cifrelor unui numar de 3 cifre, doar cu % si //:

n = 385
print(n % 10 + n // 10 % 10 + n // 100)   # 5 + 8 + 3
Iesire (rulata):
16
C++ [EXCLUSIV intensiv] — la intensiv folosesti si C++. Atentie la o capcana majora: int / int da tot un int (se trunchiaza)! Valorile logice se afiseaza ca 1 / 0.
// Evaluare expresii in C++ (intensiv)
#include <iostream>
using namespace std;
int main() {
    cout << 2 + 3 * 4 << endl;        // precedenta la fel ca in Python
    cout << 7 / 2 << endl;            // int/int = int -> 3 (trunchiat!)
    cout << 7.0 / 2 << endl;          // daca un operand e real -> rezultat real
    cout << 7 % 2 << endl;            // rest, doar pe intregi
    cout << (5 > 3 && 5 < 10) << endl; // bool afisat ca 1
    cout << !(4 > 2) << endl;         // bool afisat ca 0
    return 0;
}
Iesire (compilata si rulata cu g++ -std=c++17):
14
3
3.5
1
1
0

Exercitii practice

Exercitiul 1 (Nivel minim) - Suma cifrelor

Fie n = 385. Calculeaza suma cifrelor folosind doar % si //. Scrie pasii intermediari, apoi verifica rezultatul.

Exercitiul 2 (Nivel standard) - Expresie aritmetica

Fie a = 17, b = 5. Cat face a // b * b + a % b? Evalueaza pas cu pas si explica de ce rezultatul este intotdeauna a.

Exercitiul 3 (Nivel performanta) - Expresie logica tip Bac

Fie x = 12. Care este rezultatul expresiei not (x % 2 == 0) or (x > 10 and x < 20)? Justifica fiecare pas (not, and, or).

Exercitiul 4 (Nivel performanta) - Scrie expresia

Scrie o expresie Python care este True daca un numar n este PAR si in intervalul [10, 100] inclusiv. Indiciu: combina n % 2 == 0 cu doua comparatii folosind and.

Ce ai invatat astazi

  • Regulile de precedenta si asociativitate (atentie la ** la dreapta)
  • Diferenta intre /, // si % si trucurile cu cifrele unui numar
  • Evaluarea expresiilor logice (not → and → or) si scurt-circuitul
  • Conversiile de tip: int, float, str si capcanele lor
  • Conversii intre baze de numeratie (intensiv) — O(log n)
  • Strategia de evaluare pas cu pas pentru exercitii tip Bac

Felicitari! Ai terminat modulul

Aceasta a fost ultima lectie din Modulul 1. Intoarce-te la pagina modulului pentru a-ti vedea progresul si a trece la urmatorul modul.

Inapoi la modul →