Sari la conținut

Bac informatică 2026 Simulare, rezolvată

Simularea de la Bacalaureatul la Informatică (Mate-Info, C/C++): conține 3 subiecte (90 de puncte) și are un timp de lucru de 3 ore. Sub fiecare exercițiu găsești răspunsul corect și rezolvarea.

Subiecte oficiale publicate de Ministerul Educației. Rezolvări realizate de subac. Actualizat la .

📌 Despre Simularea din 2026

Simularea din 2026 trece prin expresii logice, tablouri bidimensionale, recursivitate cu parametru transmis prin referință, backtracking, arbori, cifrele unui număr, grafuri fără cicluri, structuri, cel mai mic multiplu comun, șiruri de caractere și fișiere.

Subiectul I (20p): 5 grile: o expresie logică echivalentă cu x<=20 || x>26, verificarea unui mozaic în zig-zag memorat într-un tablou char cu două linii, un subprogram recursiv cu parametru transmis prin referință, penultima soluție dintr-o tombolă generată cu backtracking și numărul maxim de frați ai unui nod într-un arbore dat prin numărul de fii.

Subiectul al II-lea (40p): Un algoritm în pseudocod care formează două numere din cifrele pare ale lui n și îl afișează pe cel mai mic, numărul de noduri și de muchii pentru cele două componente ale unui graf fără cicluri și definirea structurii sala.

Subiectul al III-lea (30p): Un subprogram care calculează cel mai mic multiplu comun a trei numere (depozit), o problemă cu șiruri de caractere care criptează un text cu un cifru circular și o problemă de eficiență care numără valorile pare distincte dintr-un interval, într-un șir ordonat citit din bac.txt.

⚠️ La ce să fii atent

  • La I.2: j merge până la 10, deci comparația se face cu coloana j+1, nu cu j-1, care pentru j=0 iese din tablou.
  • La I.3: n este transmis prin referință, deci toate apelurile modifică aceeași variabilă. La întoarcere se afișează de trei ori 0: 321000.
  • La II.1.d: repetă se oprește când n=0, deci cât timp continuă cât timp n≠0. Condiția se inversează.
  • La III.2: Spațiile se elimină înainte de criptare, iar codurile se iau circular: după al treilea cod urmează din nou primul.
  • La III.3: Șirul este ordonat, deci valorile egale stau una lângă alta. Ajunge să compari fiecare număr cu cel dinaintea lui, fără să memorezi șirul.

Subiectul I

20 de puncte
  1. Exercițiul 1 4p Expresii și operatori

    Variabila x este de tip întreg.

    Indicați o expresie care are valoarea 1 dacă și numai dacă expresia C/C++ alăturată are valoarea 1.

    x<=20 || x>26
    • a)!(x>20) || !(x<=26)
    • b)!(x>=20) && !(x>=26)
    • c)!(x<20 || x<=26)
    • d)!(x<20 && x<26)
    Vezi rezolvarea

    Răspuns corect: a) !(x>20) || !(x<=26)

    !(x>20) înseamnă x<=20, iar !(x<=26) înseamnă x>26, deci a. este chiar expresia dată. b. este adevărată doar pentru x<20, c. doar pentru x>26, iar d. pentru orice x≥20.

  2. Exercițiul 2 4p Tablouri bidimensionale

    Un mozaic este alcătuit din plăcuțe de formă pătrată, cu dimensiuni egale, de culoare albă sau roșie, așezate pe două rânduri și aliniate ca în exemplu. Mozaicul are un model în zig-zag dacă oricare două plăcuțe cu o latură comună au culoare diferită. Se știe că plăcuțele de pe latura din dreapta au culori diferite.

    Variabilele j și ok sunt întregi, iar variabila a este un tablou bidimensional cu două linii și 12 coloane, cu elemente de tip char, în care fiecare linie, în ordine, memorează succesiunea de plăcuțe aflate pe un rând al mozaicului, notându-se cu litera R cele roșii și cu litera A cele albe. Liniile și coloanele sunt numerotate începând de la 0.

    Indicați expresia care poate înlocui punctele de suspensie astfel încât, în urma executării secvenței C/C++ obținute, variabila ok să aibă valoarea 1, dacă mozaicul are un model în zig-zag, sau valoarea 0 în caz contrar.

    Exemplu: în urma executării secvenței pentru tabloul alăturat, unde există două zone în care nu se respectă modelul, ok=0.

    ok=1;
    for(j=0;j<11;j++)
      if(........) ok=0;
    RAARARARARAR
    ARRARARARRRA
    • a)a[0][j]==a[0][j-1] || a[0][j]==a[1][j-1]
    • b)a[0][j]==a[0][j+1] || a[0][j]==a[1][j+1]
    • c)a[0][j]==a[0][j-1] || a[0][j]==a[1][j+1]
    • d)a[0][j]==a[0][j+1] || a[0][j]==a[1][j]
    Vezi rezolvarea

    Răspuns corect: d) a[0][j]==a[0][j+1] || a[0][j]==a[1][j]

    j merge de la 0 la 10, deci se poate compara cu coloana j+1, dar nu cu j-1: pentru j=0, a[0][j-1] ar ieși din tablou (a. și c. cad). Pentru zig-zag, fiecare plăcuță de sus trebuie să difere de vecina din dreapta, a[0][j+1], și de cea de sub ea, a[1][j]. Dacă sus totul alternează și fiecare coloană are culori diferite, alternează și rândul de jos. Coloana 11 nu e verificată, dar se știe că plăcuțele din dreapta au culori diferite. b. compară cu plăcuța de jos din dreapta, a[1][j+1], care trebuie să aibă aceeași culoare, nu alta.

  3. Exercițiul 3 4p Recursivitate

    Subprogramul f este definit alăturat, iar variabila x este de tip întreg.

    Indicați ce se afișează în urma executării secvenței C/C++ de mai jos.

    x=3; f(x);

    void f(int &n)
    {  if(n>0) {cout<<n; | printf("%d",n);
               n=n-1; f(n);
               cout<<n; | printf("%d",n);
              }
    }
    • a)321000
    • b)321012
    • c)321123
    • d)3210123
    Vezi rezolvarea

    Răspuns corect: a) 321000

    n este transmis prin referință, deci toate apelurile lucrează cu aceeași variabilă, x. La coborâre se afișează 3, 2, 1, iar x scade la 0, unde recursivitatea se oprește. La întoarcere, fiecare dintre cele trei apeluri afișează n, care este tot x, adică 0. Rezultatul: 321000.

  4. Exercițiul 4 4p Backtracking

    La balul absolvenților se acordă șase premii pe baza unei tombole cu 30 de bilete, numerotate de la 30 la 1, în această ordine. Utilizând metoda backtracking, se generează toate variantele de a alege biletele celor șase câștigători, care sunt anunțați în ordine descrescătoare a numerelor de pe bilete. Două soluții diferă prin cel puțin un bilet. Primele trei soluții generate sunt, în această ordine:

    1. (30,29,28,27,26,25)
    2. (30,29,28,27,26,24)
    3. (30,29,28,27,26,23)

    Indicați penultima soluție generată.

    • a)(7,6,5,4,3,2)
    • b)(7,6,5,3,2,1)
    • c)(7,6,4,3,2,1)
    • d)(7,5,4,3,2,1)
    Vezi rezolvarea

    Răspuns corect: d) (7,5,4,3,2,1)

    Se generează combinări de câte 6 bilete, fiecare în ordine descrescătoare, iar generarea merge de la numerele mari spre cele mici. Ultima soluție este cea cu cele mai mici numere, (6,5,4,3,2,1). Înaintea ei, primul număr este 7, iar restul sunt cele mai mici 5 numere care încă se mai pot alege după 7: (7,5,4,3,2,1).

  5. Exercițiul 5 4p Arbori

    Într-un arbore cu 7 noduri, numerotate de la 1 la 7, nodul 3 este rădăcină și pentru orice nod numerotat cu i (i∈[1,7]), dacă se notează cu F(i) numărul de descendenți direcți („fii”) ai lui, atunci F(i)=0, dacă i este „frunză”, sau F(i)=i-1, în caz contrar.

    Indicați numărul maxim de „frați” ai nodului 1.

    • a)1
    • b)2
    • c)3
    • d)4
    Vezi rezolvarea

    Răspuns corect: c) 3

    Un arbore cu 7 noduri are 6 muchii, deci suma lui F(i) este 6. Rădăcina 3 are 2 fii, iar nodul 1 nu poate avea fii (F(1)=0), deci e frunză. Ceilalți fii trebuie să adune 4: fie nodul 5 (4 fii), fie nodurile 2 și 4 (1 + 3 fii). Ca 1 să aibă cât mai mulți frați, el e unul dintre cei 4 fii ai lui 5, deci are 3 frați.

Subiectul al II-lea

40 de puncte
  1. Exercițiul 1.a 6p Algoritmi în pseudocod

    Algoritmul alăturat este reprezentat în pseudocod.

    S-a notat cu a%b restul împărțirii numărului natural a la numărul natural nenul b și cu [c] partea întreagă a numărului real c.

    Scrieți ce se afișează în urma executării algoritmului dacă se citește numărul 250326.

    citește n
      (număr natural)
     x←0; y←0; p←1
    ┌repetă
    │ c←n%10; n←[n/10]
    │┌dacă c%2=0 atunci
    ││ x←x*10+c
    ││ y←c*p+y; p←p*10
    │└■
    └până când n=0
    ┌dacă x<y atunci scrie x
    │altfel scrie y
    └■
    Vezi rezolvarea

    Răspunsul din barem: 2026

    Cifrele lui n se iau de la dreapta la stânga, iar cele pare se adaugă în două numere: în x la coadă, deci x le are în ordine inversă, iar în y în față (c*p), deci y le are în ordinea din n. La final se afișează cel mai mic dintre ele. Cifrele pare ale lui 250326 sunt 2, 0, 2, 6. y = 2026, iar x = 6202, deci se afișează 2026.

  2. Exercițiul 1.b 6p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    S-a notat cu a%b restul împărțirii numărului natural a la numărul natural nenul b și cu [c] partea întreagă a numărului real c.

    Scrieți două numere din intervalul [1000,9999] care pot fi citite, astfel încât, pentru fiecare dintre acestea, în urma executării algoritmului, să se afișeze valoarea 64.

    Vezi rezolvarea

    Exemplu: 1064 4600

    Se afișează cel mai mic dintre numărul format din cifrele pare în ordinea din n și cel format din ele în ordine inversă. Ca acesta să fie 64, cifrele pare ale lui n trebuie să fie 6 și 4, eventual cu un 0, care nu schimbă valoarea doar când ajunge în fața numărului: 0, 6, 4 în ordinea din n (de exemplu 1064 → 064 și 460) sau 4, 6, 0 (de exemplu 4601 → 460 și 064). A patra cifră trebuie să fie impară, ca să nu fie luată în calcul, sau tot 0 (4600).

  3. Exercițiul 1.c 10p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    S-a notat cu a%b restul împărțirii numărului natural a la numărul natural nenul b și cu [c] partea întreagă a numărului real c.

    Scrieți programul C/C++ corespunzător algoritmului dat.

    Vezi rezolvarea
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n, x = 0, y = 0, p = 1, c;
        cin >> n;
        do
        {
            c = n % 10;
            n = n / 10;
            if (c % 2 == 0)
            {
                x = x * 10 + c;
                y = c * p + y;
                p = p * 10;
            }
        } while (n != 0);
        if (x < y) cout << x;
        else cout << y;
        return 0;
    }

    repetă…până când n=0 devine do…while cu condiția negată, n != 0. [n/10] este împărțirea întreagă din C/C++.

  4. Exercițiul 1.d 6p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    S-a notat cu a%b restul împărțirii numărului natural a la numărul natural nenul b și cu [c] partea întreagă a numărului real c.

    Scrieți în pseudocod un algoritm, echivalent cu cel dat, înlocuind adecvat structura repetă...până când cu o structură repetitivă cu test inițial.

    Vezi rezolvarea
    citește n (număr natural)
    x←0; y←0; p←1
    ┌cât timp n≠0 execută
    │ c←n%10; n←[n/10]
    │┌dacă c%2=0 atunci
    ││ x←x*10+c
    ││ y←c*p+y; p←p*10
    │└■
    └■
    ┌dacă x<y atunci scrie x
    │altfel scrie y
    └■

    repetă…până când verifică la sfârșit și se oprește când condiția devine adevărată, iar cât timp verifică la început și merge înainte cât timp condiția e adevărată: condiția n=0 devine deci n≠0. Diferența apare doar pentru n=0: algoritmul dat execută corpul o dată, cu c=0, iar cel nou deloc. Dar x și y rămân 0 în ambele cazuri, deci amândouă afișează 0.

  5. Exercițiul 2 6p Grafuri neorientate

    Un graf neorientat, fără cicluri, are 26 de muchii și două componente conexe.

    Pentru fiecare dintre cele două componente, scrieți un exemplu de număr de noduri, respectiv de număr de muchii.

    Vezi rezolvarea

    Exemplu: 10 9 18 17

    Fiecare componentă conexă fără cicluri este un arbore, deci are cu o muchie mai puțin decât noduri. Cu două componente, graful are 26 + 2 = 28 de noduri. Prima componentă poate avea orice număr de noduri n1 de la 1 la 27, cu n1-1 muchii, iar a doua restul de 28-n1 noduri, cu 27-n1 muchii. De exemplu: 10 noduri și 9 muchii, respectiv 18 noduri și 17 muchii.

  6. Exercițiul 3 6p Tipul înregistrare (struct)

    Pentru o sală de examen se memorează următoarele date specifice: numărul de locuri disponibile și durata examenului, exprimată în ore. Variabila s memorează datele specifice pentru fiecare dintre cele 10 săli ale unui centru de testare, iar expresiile de mai jos au valori întregi și reprezintă numărul de locuri ale primei săli, respectiv durata examenului din această sală. Definiți o structură C/C++ cu eticheta sala, care să permită memorarea datelor pentru o sală de examen, și declarați corespunzător variabila s.

    s[0].nrLocuri  s[0].durata
    Vezi rezolvarea
    struct sala
    {   int nrLocuri;
        int durata;
    } s[10];

    Expresiile din enunț dau numele câmpurilor, nrLocuri și durata, amândouă întregi. s[0] arată că s este un tablou, cu 10 elemente, câte unul pentru fiecare sală; prima sală este s[0], fiindcă indicii încep de la 0.

Subiectul al III-lea

30 de puncte
  1. Exercițiul 1 10p Subprograme

    Într-un depozit se montează un raft cu trei polițe de aceeași lungime și de lățimi x, y respectiv z. Pe fiecare poliță se plasează, una lângă alta, cutii de forma unui cub cu latura egală cu lățimea poliței. În depozit există suficiente cutii de fiecare tip, iar raftul este echilibrat doar dacă fiecare poliță este ocupată complet de cutii.

    Subprogramul depozit are trei parametri, x, y și z, prin care primește trei numere naturale din intervalul [10,100], reprezentând lățimile celor trei polițe, exprimate în centimetri. Subprogramul returnează un număr natural, reprezentând lungimea minimă, exprimată în centimetri, a unei polițe a raftului echilibrat.

    Scrieți definiția completă a subprogramului C/C++.

    Exemplu: pentru x=40, y=20 și z=30, subprogramul returnează valoarea 120 (raftul are trei polițe, fiecare cu lungime de 120 cm: prima poate conține 3 cutii cu latura de 40 cm, a doua 6 cutii cu latura de 20 cm, iar a treia 4 cutii cu latura de 30 cm).

    Vezi rezolvarea
    int depozit(int x, int y, int z)
    {
        int L = x;
        while (L % y != 0 || L % z != 0) L = L + x;
        return L;
    }

    O poliță e ocupată complet dacă lungimea ei este un multiplu al laturii cutiilor, deci lungimea căutată este cel mai mic multiplu comun al lui x, y și z. Se încearcă pe rând multiplii lui x, până la primul care se împarte și la y, și la z. Merge și cu cmmdc: cmmmc(a,b) = a*b/cmmdc(a,b), aplicat de două ori.

  2. Exercițiul 2 10p Șiruri de caractere

    O metodă de criptare a unui text se bazează pe un cifru format din mai multe coduri, numere naturale. Prin criptare se elimină spațiile, apoi la fiecare pas se ia în considerare o pereche formată dintr-o literă a textului și un cod al cifrului, iar această literă se înlocuiește cu cea obținută prin deplasarea circulară, spre dreapta, în alfabetul limbii engleze, cu un număr de poziții egal cu codul din pereche. Prima pereche este formată din prima literă a textului și primul cod al cifrului, iar după fiecare pereche urmează cea formată din litera următoare a textului, parcurs de la stânga la dreapta, respectiv din codul următor din cifru, parcurs circular, spre dreapta, ca în exemplu.

    Într-un text de cel mult 100 de caractere cuvintele sunt formate din litere mari ale alfabetului limbii engleze și sunt separate prin unul sau mai multe spații. Alfabetul limbii engleze are 26 de litere.

    Scrieți un program C/C++ care citește de la tastatură trei numere naturale din intervalul [0,25], reprezentând, în această ordine, codurile unui cifru, apoi un text de tipul precizat. Programul modifică textul în memorie, criptându-l cu cifrul dat, apoi afișează pe ecran textul obținut.

    Exemplu: pentru cifrul cu codurile 3, 1, 6 și textul PIXEL BINE MAPAT se obține textul SJDHMHLOKPBVDU (primele patru perechi sunt P-3, I-1, X-6, E-3).

    Vezi rezolvarea
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        char t[101];
        int c[3], i, j, k = 0;
        cin >> c[0] >> c[1] >> c[2];
        cin.get();
        cin.getline(t, 101);
        for (i = 0; t[i] != '\0'; i++)
            if (t[i] == ' ')
            {
                strcpy(t + i, t + i + 1);
                i--;
            }
        for (i = 0; t[i] != '\0'; i++)
        {
            j = t[i] - 'A' + c[k];
            t[i] = 'A' + j % 26;
            k = (k + 1) % 3;
        }
        cout << t;
        return 0;
    }

    După citirea codurilor, cin.get() consumă sfârșitul de rând, ca textul să fie citit întreg cu getline. Spațiile se elimină din text mutând restul șirului cu o poziție la stânga (strcpy), iar i-- face ca un spațiu următor să fie verificat și el. Apoi fiecare literă se mută cu codul curent: t[i]-'A' este poziția literei în alfabet (de la 0), iar % 26 face deplasarea circulară. k trece prin codurile 0, 1, 2, apoi o ia de la capăt.

  3. Exercițiul 3.a 2p Algoritmi eficienți

    Fișierul bac.txt conține numere naturale din intervalul [1,10^9]: pe prima linie două numere, x și y (x<y), iar pe a doua linie un șir de cel mult 10^6 numere, ordonate crescător, separate prin câte un spațiu.

    Se cere să se afișeze pe ecran numărul de valori pare distincte, din șirul aflat pe a doua linie a fișierului, care aparțin intervalului [x,y]. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.

    Exemplu: dacă fișierul are conținutul 6 11 1 1 1 2 2 3 5 5 5 5 6 6 7 8 10 10 12 15 15 21 21 pe ecran se afișează 3

    Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.

    Vezi rezolvarea

    Timp de executare: O(n) · Memorie: O(1)

    Șirul este ordonat crescător, deci valorile egale stau una lângă alta și ajunge să se compare fiecare număr cu cel citit înaintea lui.

    Se citesc x și y, apoi numerele din șir unul câte unul, ținând minte doar valoarea anterioară, ant (inițial 0), și numărul cerut, nr. Pentru fiecare valoare curentă crt: dacă este diferită de ant, pară și în intervalul [x,y], nr crește cu 1. Apoi ant devine crt. Citirea se poate opri la prima valoare mai mare decât y, fiindcă după ea vin doar valori și mai mari. La final se afișează nr.

    Eficiență: fiecare număr se citește o singură dată, deci timpul este liniar, iar memoria folosită este constantă, fiindcă șirul nu se memorează, se rețin doar câteva variabile simple.

  4. Exercițiul 3.b 8p Algoritmi eficienți

    Fișierul bac.txt conține numere naturale din intervalul [1,10^9]: pe prima linie două numere, x și y (x<y), iar pe a doua linie un șir de cel mult 10^6 numere, ordonate crescător, separate prin câte un spațiu.

    Se cere să se afișeze pe ecran numărul de valori pare distincte, din șirul aflat pe a doua linie a fișierului, care aparțin intervalului [x,y]. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.

    Exemplu: dacă fișierul are conținutul 6 11 1 1 1 2 2 3 5 5 5 5 6 6 7 8 10 10 12 15 15 21 21 pe ecran se afișează 3

    Scrieți programul C/C++ corespunzător algoritmului proiectat.

    Vezi rezolvarea
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        ifstream fin("bac.txt");
        int x, y, ant = 0, crt, nr = 0;
        fin >> x >> y;
        while (fin >> crt && crt <= y)
        {
            if (crt != ant && crt >= x && crt % 2 == 0) nr++;
            ant = crt;
        }
        fin.close();
        cout << nr;
        return 0;
    }

    Programul face pașii de la 3.a. Condiția crt <= y din while oprește citirea după ultima valoare din interval; fără ea rezultatul e același, doar că se citește tot fișierul.

Vrei să vezi ce notă ai lua la examen?

Intră în modul simulare: ai cronometru de 3 ore, codul ți se compilează pe loc, iar la final primești nota conform baremului.

Începe simularea3 ore

Ai găsit o problemă sau ai o idee?

Despre ce este vorba?