Ce este Informatica?
Informatica este ştiinţa care studiază prelucrarea automată a informaţiei cu ajutorul calculatoarelor. Dacă matematica se ocupă de numere şi relaţii, informatica se ocupă de cum rezolvăm problemele sistematic, pas cu pas.
Imaginează-ţi că eşti un bucatar. O reţetă de gătit este practic un algoritm: o listă de paşi clari şi ordonaţi care transformă ingredientele (date de intrare) într-un fel de mâncare (date de ieşire).
Date cu sens şi context. Calculatoarele stochează informaţia în binar (0 şi 1), dar o organizează în structuri mai complexe.
O secvenţă finită de paşi bine definiţi pentru rezolvarea unei probleme. Orice program este un algoritm transformat în cod.
Un algoritm scris într-un limbaj de programare pe care calculatorul îl poate executa. Noi vom folosi C++.
Informaţiile cu care lucrează un program: numere, text, imagini, sunete. Datele se citesc, se prelucrează şi se afişează.
În lumea modernă, orice domeniu (medicină, economie, arte, biologie) utilizează software. Abilitatea de a programa îţi permite să automatizezi sarcini repetitive, să analizezi date mari şi să construieşti soluţii digitale.
Cum funcţionează un calculator?
Imaginează-ţi calculatorul ca un birou de lucru:
• CPU (Procesorul) = angajatul care face calculele — extrem de rapid
• RAM (Memoria) = biroul de lucru — ţine datele la îndemână, dar se goaleşte când închiţi calculatorul
• HDD/SSD (Stocarea) = un dulap cu dosare — păstrează datele permanent
• SO (Sistemul de operare) = managerul — coordonează toate resursele
Execută instrucţiunile programului. Viteza se măsoară în GHz (miliarde de operaţii/secundă). Programe moderne rulează pe mai multe nuclee simultan.
Ex: Intel i7, AMD Ryzen 9Stochează datele şi programele în execuţie. Volatilă (se şterge la închidere). Variabilele din programul nostru stau în RAM.
Ex: 8GB, 16GB, 32GB DDR5Stocare permanentă. Fişierele şi programele sunt salvate aici. SSD-urile sunt mult mai rapide decât HDD-urile.
Ex: SSD 512GB NVMeGestionează resursele hardware şi oferă o interfaţă utilizatorului. Windows, Linux, macOS sunt sisteme de operare.
Ex: Windows 11, Ubuntu 24Cum rulează un program C++?
// Pasii de la codul sursa la executie: // 1. Scriem codul sursa (.cpp) #include <iostream> using namespace std; int main() { cout << "Salut!"; return 0; } // 2. Compilatorul (g++, MinGW) traduce in cod masina (.exe/.out) // 3. SO incarca .exe in RAM // 4. CPU executa instructiunile una cate una // 5. Rezultatele apar pe ecran
Medii de lucru recomandate
Rulează direct în browser, fără instalare. Perfect pentru început.
Deschide →IDE gratuit, complet, cu compilator MinGW inclus. Recomandat pentru BAC.
Descarcă →IDE clasic, simplu şi uşor de instalat. Foarte popular în licee româneşti.
Descarcă →Editor modern, extensibil. Necesită configurare manuală a compilatorului g++.
Descarcă →Ce este un algoritm?
Un algoritm este o secvenţă finită de paşi precis definiţi care rezolvă o clasă de probleme într-un timp finit.
Proprietăţile unui algoritm bun:
- Finitudine: se termină după un număr finit de paşi
- Claritate: fiecare pas este precis şi fără ambiguităţi
- Generalitate: rezolvă o clasă de probleme, nu doar un caz
- Eficienţă: foloseşte resurse rezonabile (timp şi memorie)
Exemplu: Algoritm pentru maximul a 3 numere
CITESTE a, b, c max ← a DACA b > max ATUNCI max ← b DACA c > max ATUNCI max ← c SCRIE max
int a, b, c; cin >> a >> b >> c; int mx = a; if (b > mx) mx = b; if (c > mx) mx = c; cout << mx;
Complexitatea algoritmilor — pe scurt
Complexitatea măsoară cât de rapid creşte timpul de execuţie cu dimensiunea datelor de intrare. Se exprimă cu notaţia Big-O.
| Complexitate | Exemplu | n=1.000 | n=10.000 | n=100.000 | n=1.000.000 |
|---|---|---|---|---|---|
O(1) | Accesare element vector | 1 op. | 1 op. | 1 op. | 1 op. |
O(log n) | Căutare binară | 10 op. | 13 op. | 17 op. | 20 op. |
O(n) | Parcurgere vector | 1.000 op. | 10.000 op. | 100.000 op. | 1.000.000 op. |
O(n log n) | Sortare eficientă | 10.000 op. | 130.000 op. | 1.700.000 op. | 20.000.000 op. |
O(n²) | Sortare bulă, 2 bucle | 10⁶ op. | 10⁸ op. ⚠️ | 10¹⁰ op. ❌ | 10¹² op. ❌ |
La BAC, limitele tipice sunt: n ≤ 1.000 permite O(n²), n ≤ 10.000 permite O(n²) cu constante mici, n ≤ 100.000 necesită O(n log n) sau O(n).
Structura unui program C++
// Programul minim C++ — "Salut, lume!" #include <iostream> // biblioteca pentru cin/cout using namespace std; // evita scrierea "std::" inainte de cin, cout, etc. int main() { // functia principala — executia incepe INTOTDEAUNA de aici cout << "Salut, lume!" << endl; // afisare pe ecran return 0; // semnaleaza ca programul s-a terminat cu succes } // Output: Salut, lume!
Biblioteci standard esentiale la BAC
| Library | Conţine | Utilizare |
|---|---|---|
<iostream> | cin, cout, cerr, endl | Intrare/ieşire standard |
<fstream> | ifstream, ofstream | Citire/scriere fişiere |
<cmath> | sqrt, pow, abs, floor, ceil | Funcţii matematice |
<algorithm> | sort, min, max, reverse, find | Algoritmi standard |
<cstring> | strlen, strcpy, strcmp, strcat | Şiruri de caractere C |
<cctype> | isalpha, isdigit, toupper, tolower | Operaţii pe caractere |
<vector> | vector<T> | Vectori dinamici |
Citire şi afişare (consolă)
#include <iostream> using namespace std; int main() { // Citire o variabila int n; cout << "Introduceti un numar: "; cin >> n; // Citire mai multe variabile pe o linie int a, b; cin >> a >> b; // a si b separate de spatiu sau Enter // Afisare formatata cout << "Suma: " << a+b << endl; // Operatorul ternar (conditie ? val_adevarat : val_fals) // Este o prescurtare a lui if-else pe o singura linie cout << "Max: " << (a > b ? a : b) << endl; return 0; }
Citire şi scriere din fişiere (BAC)
#include <iostream> #include <fstream> // #include TREBUIE sa fie in afara lui main()! using namespace std; int main() { ifstream fin("date.in"); ofstream fout("date.out"); int a, b; fin >> a >> b; fout << a + b; return 0; }
Datele sunt întotdeauna citite din fişier (date.in sau similar) şi scrise în fişier (date.out). Antrenaţi-vă cu ifstream/ofstream!
▶️ Testează codul C++ direct în browser
Editorul de mai jos îţi permite să rulezi cod C++ fără să instalezi nimic. Modifică exemplul şi apasă Run!
Tipuri de date fundamentale în C++
O variabilă este o “cutie” în memorie cu un nume, un tip şi o valoare. Tipul decide câtă memorie ocupă şi ce valori poate stoca.
| Tip | Dimensiune | Domeniu | Exemplu | Utilizare BAC |
|---|---|---|---|---|
int | 4 bytes | -2.147.483.648 la 2.147.483.647 | int n = 42; | Contoare, indici, numere întregi |
long long | 8 bytes | ±9.2 × 10¹⁹ | long long x = 1e18; | Numere mari, sume de vectori mari |
double | 8 bytes | ±1.7 × 10³⁰⁸ | double pi = 3.14; | Calcule reale, geometrie |
float | 4 bytes | ±3.4 × 10³⁸ | float x = 3.14f; | Mai puţin precis ca double — evitati la BAC |
char | 1 byte | -128 la 127 (cod ASCII) | char c = 'A'; | Caractere, procesare texte |
bool | 1 byte | true / false | bool ok = true; | Condiţii, flaguri |
char[] | n bytes | şir de caractere | char s[100] = "bac"; | Texte, şiruri de caractere (BAC) |
Constante şi converşii
// Constante — valori care nu se modifica const int MAX = 100000; const double PI = 3.14159265; // Conversii intre tipuri int a = 7, b = 2; double rez1 = a / b; // 3.0 (impartire intreaga!) double rez2 = (double)a / b; // 3.5 (conversie explicita) double rez3 = (double)a / (double)b; // 3.5 // Dimensiunile tipurilor cout << sizeof(int); // 4 cout << sizeof(double); // 8 cout << sizeof(char); // 1 // INT_MAX si INT_MIN (din <climits>) cout << INT_MAX; // 2147483647 cout << INT_MIN; // -2147483648
int poate stoca maxim ~2 miliarde. Dacă suma sau produsul depăşeşte, folosiţi long long. Exemplu: 100.000 * 100.000 = 10¹⁰ > INT_MAX!
Operatori în C++
+ | Adunare |
- | Scădere |
* | Înmulţire |
/ | Împărţire (cât) |
% | Rest (modulo) |
== | Egal |
!= | Diferit |
< | Mai mic |
> | Mai mare |
<= | Mai mic sau egal |
>= | Mai mare sau egal |
&& | ŞI logic (AND) |
|| | SAU logic (OR) |
! | NEGATIE (NOT) |
= | Atribuire |
+= | a += b ⇔ a = a+b |
-= | a -= b ⇔ a = a-b |
++ | Incrementare (+1) |
-- | Decrementare (-1) |
Exemple practice cu operatorul %
// Modulul (%) — cel mai util operator la BAC 7 % 3 // = 1 (restul impartirii 7 la 3) 10 % 2 // = 0 (10 este par) 15 % 5 // = 0 (15 este multiplu de 5) // Verificare par/impar if (n % 2 == 0) cout << "par"; else cout << "impar"; // Ultima cifra a unui numar int ultimaCifra = n % 10; // Verificare divisibilitate if (n % k == 0) cout << "n este divizibil cu k";
? : Este o prescurtare a structurii if-else pe o singură linie.
Sintaxa: conditie ? valoare_daca_adevarat : valoare_daca_fals
Exemplu: int maxim = (a > b) ? a : b; este echivalent cu:
if (a > b) maxim = a; else maxim = b;
Operatorul ternar — exemple
// Operatorul ternar (? :) — prescurtare if-else // Sintaxa: conditie ? val_daca_true : val_daca_false int maxim = (a > b) ? a : b; // echivalent cu if(a>b) maxim=a; else maxim=b; // Alt exemplu — verificare par/impar const char* tip = (n%2==0) ? "par" : "impar"; cout << tip;
Structuri de control — fluxul programului
if / else if / else — Structuri decizionale
// if simplu if (x > 0) cout << "pozitiv"; // if-else if (n % 2 == 0) cout << "par"; else cout << "impar"; // Lant if-else if-else if (nota >= 9) cout << "Excelent"; else if (nota >= 7) cout << "Bine"; else if (nota >= 5) cout << "Suficient"; else cout << "Insuficient";
switch — mai clar pentru valori discrete
switch (ziua) { case 1: cout << "Luni"; break; case 2: cout << "Marti"; break; case 3: cout << "Miercuri"; break; default: cout << "Alta zi"; break; } // ATENTIE: fara break, executia "cade" in case-ul urmator!
Bucle — repetitie
// for — cand stim numarul de iteratii for (int i=1; i<=10; i++) cout << i << " "; // 1 2 3 4 5 6 7 8 9 10 // for descendent for (int i=10; i>=1; i--) cout << i << " "; // 10 9 8 ... 1 // while — cand conditia e verificata inainte int n; cin >> n; while (n > 0) { cout << n % 10; // afiseaza cifrele invers n /= 10; } // do-while — executat cel putin o data int suma = 0; do { int x; cin >> x; suma += x; } while (x != 0); // citeste pana la 0 // break si continue for (int i=1; i<=100; i++) { if (i % 2 == 0) continue; // sare numerele pare if (i > 20) break; // iese din bucla cout << i << " "; // 1 3 5 ... 19 }
Programa BAC 2026 — Informatică
Examenul de Bacalaureat la Informatică testează înţelegerea algoritmilor, capacitatea de a rezolva probleme şi abilităţile de programare în C++. Structura examenului: 3 probleme din capitolele de mai jos în 3 ore.
Capitolele din programa de Informatică
Notatie Big-O, analiza timpului de executie, compararea eficientei algoritmilor. Recursivitate vs iteratie.
Include: O(1), O(log n), O(n), O(n log n), O(n²)Funcţii recursive, cazuri de bază şi recursiv, stiva de apeluri. Factoria, Fibonacci, turnurile Hanoi.
Include: factorial, combinari, Fibonacci, HanoiGenerare sistematică a solutiilor, explorare şi revenire. Permutări, combinaţii, generare subset.
Include: permutari, dame, subsets, combinariArray-uri 1D, sortare, căutare, algoritmi clasici pe vectori.
Include: sortare, cautare binara, interclasare, deduplicareArray-uri 2D, parcurgeri, diagonale, rotatie, operatii pe coloane/linii.
Include: parcurgere, diagonale, spirala, inmultire matriciPrelucrarea textelor: palindrom, anagramă, căutare, funcţii cctype şi cstring.
Include: strlen, toupper, palindrom, anagrama, CaesarCitire/scriere fişiere text şi binare. Toate problemele BAC cer date din fişiere!
Include: ifstream, ofstream, getline cu fisiereCe trebuie să ştii înainte de BAC — checklist
✅ Elemente de bază (obligatoriu)
- ☑ Tipuri de date: int, double, char, char[], bool
- ☑ Operatori: aritmetici, logici, relaţionali, %
- ☑ if/else, switch, for, while, do-while
- ☑ Funcţii cu parametri şi valoare returnata
- ☑ Vectori 1D: declarare, parcurgere, sortare
- ☑ Matrici 2D: declarare, parcurgere, diagonale
- ☑ Şiruri char[], strlen, strcpy, strcmp
- ☑ Citire/scriere fişiere (ifstream/ofstream)
⚠️ Subiecte dificile (pct. 5-10)
- ☐ Recursivitate: factorial, Fibonacci, Hanoi
- ☐ Backtracking: permutări, combinaţii
- ☐ Complexitate: Big-O, analiza buclelor
- ☐ Căutare binară şi interclasare
- ☐ Algoritmi pe şiruri: palindrom, anagramă
- ☐ Sortare manuală: bubble, insert, select
- ☐ Parcurgere spirala a matricii
- ☐ Funcţii din <cctype>: toupper, isdigit
Structura subiectului BAC Informatică
Examenul de bacalaureat la Informatică (profil Matematică-Informatică) durează 3 ore şi are 3 subiecte, totalizând 90 puncte + 10 puncte din oficiu = 100 puncte.
| Subiect | Nr. cerințe | Conţinut | Punctaj |
|---|---|---|---|
| I | 5 cerințe (câte 6p) | Cerința 1: Evaluare/scriere expresii C++ (operatori, tipuri de date) Cerința 2: Trasare algoritm — determinare valoare afișată Cerința 3: Completare/corectare secvență de cod Cerința 4: Analiză subprogram (recursiv sau iterativ) Cerința 5: Complexitate algoritm (Big-O, eficiență) | 30 pct |
| II | 2-3 cerințe | Scriere cod C++ complet — prelucrare vectori, matrici, şiruri de caractere, fişiere. Se cere funcție sau program complet, compilabil şi corect. Datele se citesc din fişier. | 30 pct |
| III | 2-3 cerințe | Tehnici avansate: recursivitate (trasare + scriere funcție recursivă), backtracking (generare soluții), eventual programare dinamică. Probleme complexe cu mai multe sub-cerințe. | 30 pct |
| 10 puncte din oficiu | 10 pct | ||
| TOTAL | 100 pct | ||
La Subiectele II și III se scrie cod C++ compilabil. Codul trebuie să includă #include, using namespace std;, funcţia main() şi citire/scriere din fişier (nu cin/cout). Punctajul se acordă parţial dacă logica este corectă dar codul nu compilează.
Subiectul I este mai “teoretic” — studiază complexitate şi trasare algoritm. Subiectele II şi III cer cod C++ complet, compilabil şi corect. Exersează zilnic probleme de pe pbinfo.ro sau infoarena.ro!
📚 Resurse oficiale & platforme de exersare
Subiecte şi bareme de la examenele de bacalaureat anterioare.
→ edu.ro/bacalaureatMii de probleme clasificate pe capitole, cu testare automată. Ideal pentru pregătire BAC.
→ pbinfo.roArhivă de probleme de concurs şi olimpiadă. Nivel mediu—avansat.
→ infoarena.roManuale aprobate de Ministerul Educaţiei, disponibile gratuit online.
→ manual.edu.roGreşeli frecvente la BAC
Acestea sunt cele mai comune greşeli pe care le fac elevii la examen. Cunoaşterea lor îţi poate salva puncte preţioase!
int a = 100000, b = 100000;
cout << a * b; // rezultat: -1794967296 (greşit!)✅ Fix: foloseşte
long long când rezultatele pot depăşi ~2 miliarde. if (x = 5) { ... } // ATRIBUIRE, nu comparaţie!✅ Fix:
if (x == 5) — dublu egal pentru comparaţie. break în switchswitch(x) { case 1: cout << "unu"; case 2: cout << "doi"; } // afişează "unudoi"!✅ Fix: adaugă
break; după fiecare case. cin după getlinecin >> n; getline(cin, s); // s va fi gol — newline-ul rămas în buffer!✅ Fix: adaugă
cin.ignore(); între ele. int v[10]; v[10] = 5; // index valid: 0..9, nu 10!✅ Fix: indexarea porneşte de la 0 — ultimul element valid este
v[n-1]. int a = 5, b = 2; double r = a / b; // r = 2.0, nu 2.5!✅ Fix:
double r = (double)a / b; sau double r = 1.0 * a / b; cin >> n; // GREŞIT la BAC — datele vin din fişier!✅ Fix:
ifstream fin("date.in"); fin >> n;