Bac informatică 2026 Varianta 3, rezolvată

Lucrarea „2026 Varianta 3” de la Bacalaureatul la informatică, specializarea Mate-Info, limbajul C/C++: 3 subiecte, 90 de puncte și 3 ore de lucru la examen. Sub fiecare exercițiu ai răspunsul și explicația, închise până le deschizi, ca să încerci întâi singur.

Enunțurile sunt cele oficiale, publicate de Ministerul Educației pe subiecte.edu.ro. Răspunsurile și explicațiile sunt scrise de subac.

Subiectul I20 de puncte

  1. Exercițiul 14p

    Variabilele x și y sunt întregi.

    Indicați o expresie C/C++ care are valoarea 1 dacă și numai dacă numerele naturale memorate în variabilele x și y au aceeași paritate.

    • a)(x*y)%2==0
    • b)x%2==0 && y%2==0
    • c)(x+y)%2==0
    • d)!(x%2==y%2)
    Arată răspunsul și explicația

    Răspuns corect: c) (x+y)%2==0

    Suma a două numere este pară exact atunci când cele două numere au aceeași paritate — deci (x+y)%2==0 e adevărată doar când x și y sunt ambele pare sau ambele impare.

  2. Exercițiul 24p

    Subprogramul alăturat, f, este incomplet definit.

    Indicați expresia cu care pot fi înlocuite punctele de suspensie, astfel încât, în urma apelului de mai jos, să se afișeze 7.

    f(35,17);

    void f(int n, int d)
    { if(n%d==0)
        cout<<d; | printf("%d",d);
      else f(........);
    }
    • a)n+1,d+1
    • b)n-1,d-1
    • c)n,d+1
    • d)n,d-1
    Arată răspunsul și explicația

    Răspuns corect: d) n,d-1

    La fiecare apel d scade cu 1 până devine un divizor al lui n. Pornind de la d=17, primul divizor al lui 35 întâlnit coborând este 7.

  3. Exercițiul 34p

    Variabila p, declarată alăturat, memorează primul termen și rația unei progresii aritmetice.

    Știind că diferența dintre un termen al progresiei și termenul anterior este egală cu rația, indicați expresia a cărei valoare este egală cu cel de al 10-lea termen al progresiei.

    struct progresie
    {  int prim;
       int ratie;
    }p;
    • a)prim.p+ratie.p*9
    • b)p.prim+9*p.ratie
    • c)progresie.prim.p+9*progresie.ratie.p
    • d)p.progresie.prim+9*p.progresie.ratie
    Arată răspunsul și explicația

    Răspuns corect: b) p.prim+9*p.ratie

    Al n-lea termen al unei progresii aritmetice este prim + (n-1) · rație. Pentru n=10, expresia corectă e p.prim + 9*p.ratie.

  4. Exercițiul 44p

    Un graf orientat cu 5 vârfuri, numerotate de la 1 la 5, este reprezentat prin matricea de adiacență alăturată.

    Indicați numărul de vârfuri ale grafului cu proprietatea că valoarea absolută a diferenței gradelor intern și extern este 1.

    01001
    10000
    11010
    00101
    00110
    • a)2
    • b)3
    • c)4
    • d)5
    Arată răspunsul și explicația

    Răspuns corect: a) 2

    Fiecare vârf are gradul intern egal cu 2. Gradele externe sunt 2,1,3,2,2 — doar vârfurile 2 și 3 au |intern − extern| = 1, deci răspunsul este 2.

  5. Exercițiul 54p

    Un graf neorientat cu 6 noduri, numerotate de la 1 la 6, este reprezentat alăturat.

    Indicați numărul maxim de muchii care pot fi adăugate, astfel încât graful obținut să fie eulerian.

    Figura din enunț
    • a)9
    • b)6
    • c)3
    • d)2
    Arată răspunsul și explicația

    Răspuns corect: b) 6

    Nodul 4 e izolat, iar vârfurile 1 și 3 au grad impar. Legând 4 de restul grafului și corectând paritatea tuturor vârfurilor se pot adăuga cel mult 6 muchii păstrând graful simplu, conex și cu toate gradele pare.

Subiectul al II-lea40 de puncte

  1. Exercițiul 1.a6p

    Se consideră algoritmul alăturat, reprezentat în pseudocod.

    Scrieți valoarea afișată dacă se citesc, în această ordine, numerele 8, 3, 1, 5, 2, 4, 5, 5, 7.

    citește n
       (număr natural nenul)
     s←0; x←0; p←1
    ┌repetă
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    │ p←p+1
    └până când p>n
    scrie s
    Arată răspunsul și explicația

    Răspunsul din barem: 5

    5
    
    n=8, deci se citesc 8 valori. Pornim cu s=0, x=0:
      y=3 → 3>0, deci s=3, x=3
      y=1 → nici mai mare, nici egal cu x: nimic
      y=5 → 5>3, deci s=8, x=5
      y=2 → nimic
      y=4 → 4<5 și 4≠5: nimic
      y=5 → x=y, deci s=8-5=3
      y=5 → x=y, deci s=3-5=-2
      y=7 → 7>5, deci s=-2+7=5, x=7
    Se afișează 5.
  2. Exercițiul 1.b6p

    Se consideră algoritmul alăturat, reprezentat în pseudocod.

    Dacă pentru n se citește numărul 3, scrieți un set de date care pot fi citite în continuare, astfel încât, în urma executării algoritmului, să se afișeze 0.

    citește n
       (număr natural nenul)
     s←0; x←0; p←1
    ┌repetă
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    │ p←p+1
    └până când p>n
    scrie s
    Arată răspunsul și explicația
    Exemplu: 4 4 2
    
    Se acceptă orice set de trei numere naturale nenule de forma x, x, y sau x, y, x cu y<x.
    Pentru 4 4 2: y=4 > x=0 → s=4, x=4; y=4 = x → s=4-4=0; y=2 e mai mic decât x și diferit de el → s rămâne 0.
  3. Exercițiul 1.c10p

    Se consideră algoritmul alăturat, reprezentat în pseudocod.

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

    citește n
       (număr natural nenul)
     s←0; x←0; p←1
    ┌repetă
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    │ p←p+1
    └până când p>n
    scrie s
    Arată răspunsul și explicația
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n, y, s = 0, x = 0, p = 1;
        cin >> n;
        do
        {
            cin >> y;
            if (y > x) { s = s + y; x = y; }
            else if (x == y) s = s - y;
            p = p + 1;
        } while (p <= n);
        cout << s;
        return 0;
    }
    
    repetă…până când p>n se traduce prin do…while cu condiția negată (p<=n): structura se execută cel puțin o dată, iar testul se face la final.
  4. Exercițiul 1.d6p

    Se consideră algoritmul alăturat, reprezentat în pseudocod.

    Scrieți în pseudocod un algoritm, echivalent cu cel dat, înlocuind structura repetitivă cu o structură de tip pentru...execută.

    citește n
       (număr natural nenul)
     s←0; x←0; p←1
    ┌repetă
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    │ p←p+1
    └până când p>n
    scrie s
    Arată răspunsul și explicația
    citește n (număr natural nenul)
    s←0; x←0
    ┌pentru p←1,n execută
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    └■
    scrie s
    
    Contorul p nu se mai inițializează și nu se mai incrementează manual — de asta se ocupă structura pentru — iar condiția de oprire p>n devine limita finală n.
  5. Exercițiul 26p

    Utilizând metoda backtracking se generează toate seturile de câte cel mult trei materiale de promovare turistică din mulțimea ordonată {broșură, ghid, pliant, revistă}, astfel încât din același set să nu facă parte simultan un pliant și o revistă. Două seturi sunt distincte dacă diferă prin cel puțin un material. Primele cinci soluții generate sunt, în această ordine:

    1. (broșură)
    2. (broșură, ghid)
    3. (broșură, ghid, pliant)
    4. (broșură, ghid, revistă)
    5. (broșură, pliant)

    Scrieți a șasea și a șaptea soluție generată.

    Arată răspunsul și explicația

    Răspunsul din barem: (broșură, revistă) (ghid)

    (broșură, revistă)
    (ghid)
    
    După (broșură, pliant) ar urma (broșură, pliant, revistă), dar pliantul și revista nu pot sta în același set. Se trece la (broșură, revistă) — a șasea.
    Seturile care încep cu broșura se termină aici (mai departe nu mai există material după revistă), deci urmează primul set care începe cu ghid: (ghid).
  6. Exercițiul 36p

    Variabilele i și j sunt de tip întreg, iar variabila a memorează un tablou bidimensional cu 5 linii și 5 coloane, numerotate de la 0 la 4, având inițial toate elementele nule.

    Fără a utiliza alte variabile, scrieți secvența C/C++ de mai jos, înlocuind punctele de suspensie cu instrucțiuni adecvate, dintre care cel mult patru atribuiri, astfel încât, în urma executării secvenței obținute, tabloul memorat în variabila a să aibă elementele alăturate.

    for(i=0;i<5;i++)
      for(j=0;j<5;j++)
       ..................
    09101920
    18111821
    27121722
    36131623
    45141524
    Arată răspunsul și explicația
    for(i=0;i<5;i++)
      for(j=0;j<5;j++)
        if(j%2==0) a[i][j]=5*j+i;
        else a[i][j]=5*j+4-i;
    
    Tabloul se completează pe coloane, în șerpuire: coloana j conține valorile de la 5*j la 5*j+4. Pe coloanele pare (0, 2, 4) valorile cresc de sus în jos, deci a[i][j]=5*j+i; pe cele impare (1, 3) cresc de jos în sus, deci a[i][j]=5*j+4-i. Sunt două atribuiri, sub limita de patru.

Subiectul al III-lea30 de puncte

  1. Exercițiul 110p

    Numim număr uniform asociat unei valori naturale numărul obținut din aceasta prin eliminarea fie a tuturor cifrelor sale pare, fie a tuturor cifrelor sale impare.

    Exemplu: lui 19472 i se asociază numerele uniforme 197 și 42.

    Subprogramul ImparPar are un singur parametru, n, prin care primește un număr natural cu toate cifrele nenule (n∈[11,109)), având cel puțin o cifră pară și cel puțin o cifră impară. Subprogramul returnează un număr obținut din cifrele numărului uniform impar asociat lui n, urmate de cifrele numărului uniform par asociat lui n, ca în exemplu.

    Scrieți definiția completă a subprogramului.

    Exemplu: dacă n=19472, subprogramul returnează numărul 19742.

    Arată răspunsul și explicația
    int ImparPar(int n)
    {
        int imp = 0, par = 0, pi = 1, pp = 1, c;
        while (n != 0)
        {
            c = n % 10;
            if (c % 2 == 1)
            {
                imp = imp + c * pi; pi = pi * 10;
            }
            else
            {
                par = par + c * pp; pp = pp * 10;
            }
            n = n / 10;
        }
        return imp * pp + par;
    }
    
    Cifrele se parcurg de la dreapta la stânga. Fiecare cifră impară se adaugă în fața numărului imp (pi ține puterea lui 10 la care a ajuns), iar fiecare cifră pară în fața lui par (cu pp). Așa, în fiecare dintre cele două numere, cifrele rămân în ordinea din n.
    La final cifrele lui par se lipesc după cele ale lui imp: imp * pp mută imp la stânga cu atâtea cifre câte are par. Pentru 19472: imp = 197, par = 42, pp = 100, deci 197 * 100 + 42 = 19742.
  2. Exercițiul 210p

    Scrieți un program C/C++ care citește de la tastatură un cuvânt format din cel puțin două și cel mult 100 de caractere, numai litere mici ale alfabetului englez, și afișează pe ecran mesajul alterneaza, dacă în text nu există două vocale sau două consoane pe poziții consecutive, sau mesajul nu alterneaza, în caz contrar.

    Exemplu: pentru cuvintele imunopolizaharide sau pas se afișează mesajul alterneaza iar pentru cuvântul aer se afișează mesajul nu alterneaza

    Arată răspunsul și explicația
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        char s[101];
        int i, ok = 1;
        cin >> s;
        for (i = 0; s[i + 1] != '\0'; i++)
            if ((strchr("aeiou", s[i]) != NULL) == (strchr("aeiou", s[i + 1]) != NULL))
                ok = 0;
        if (ok) cout << "alterneaza";
        else cout << "nu alterneaza";
        return 0;
    }
    
    Se compară fiecare literă cu următoarea. strchr("aeiou", litera) spune dacă litera e vocală; dacă două litere vecine sunt amândouă vocale sau amândouă consoane, cele două comparații dau același rezultat și cuvântul nu alternează.
    Bucla se oprește când s[i + 1] e sfârșitul șirului, deci ultima pereche verificată este penultima și ultima literă.
  3. Exercițiul 3.a2p

    De-a lungul timpului, o persoană a participat la mai multe concursuri de șah și de go. Un rezultat motivant corespunde unei poziții mai bune (cu un număr mai mic) în clasamentul unui concurs, comparativ cu poziția obținută la concursul anterior de același tip.

    Fișierul bac.txt conține un șir de cel mult 104 numere naturale, reprezentând rezultatele obținute la concursurile la care a participat, în ordine cronologică: pentru fiecare dintre rezultate, câte o pereche formată din poziția ocupată în clasamentul concursului corespunzător (un număr din intervalul [1,300]), urmată de valoarea 1, dacă acesta a fost concurs de șah, sau de valoarea 2, dacă acesta a fost concurs de go. Fiecare pereche se află pe câte o linie a fișierului, cu valorile separate printr-un spațiu.

    Se cere să se afișeze pe ecran, separate printr-un spațiu, două valori naturale, reprezentând, în această ordine, numărul de rezultate motivante obținute la concursurile de șah, respectiv la cele de go. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al spațiului de memorie utilizat.

    Exemplu: dacă fișierul conține numerele alăturate, pe ecran se afișează 3 2 pentru că la șah a obținut trei rezultate motivante (poziția 3 după poziția 7, poziția 1 după poziția 5 și poziția 1 după poziția 2), iar la go două rezultate motivante (poziția 5 după poziția 8, poziția 1 după poziția 5).

    61
    82
    71
    52
    31
    41
    51
    12
    42
    11
    21
    11

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

    Arată răspunsul și explicația
    Datele se prelucrează pe măsura citirii, pereche cu pereche, fără să fie memorate. Se păstrează doar poziția de la ultimul concurs de șah (ups) și de la ultimul concurs de go (upg), ambele pornite de la -1, plus cele două numărări, ns și ng, pornite de la 0.
    
    Pentru fiecare pereche citită (p, c): dacă c = 1, se crește ns când p < ups, apoi ups devine p; dacă c = 2, se face la fel cu ng și upg. Valoarea inițială -1 face ca primul concurs de fiecare tip să nu fie numărat, pentru că nicio poziție nu e mai mică decât -1. La final se afișează ns și ng.
    
    Eficiență: fiecare pereche se citește și se prelucrează o singură dată, în timp constant, deci algoritmul este liniar în numărul de valori din fișier. Se folosesc doar câteva variabile simple, fără tablou, deci memoria folosită este constantă.
  4. Exercițiul 3.b8p

    De-a lungul timpului, o persoană a participat la mai multe concursuri de șah și de go. Un rezultat motivant corespunde unei poziții mai bune (cu un număr mai mic) în clasamentul unui concurs, comparativ cu poziția obținută la concursul anterior de același tip.

    Fișierul bac.txt conține un șir de cel mult 104 numere naturale, reprezentând rezultatele obținute la concursurile la care a participat, în ordine cronologică: pentru fiecare dintre rezultate, câte o pereche formată din poziția ocupată în clasamentul concursului corespunzător (un număr din intervalul [1,300]), urmată de valoarea 1, dacă acesta a fost concurs de șah, sau de valoarea 2, dacă acesta a fost concurs de go. Fiecare pereche se află pe câte o linie a fișierului, cu valorile separate printr-un spațiu.

    Se cere să se afișeze pe ecran, separate printr-un spațiu, două valori naturale, reprezentând, în această ordine, numărul de rezultate motivante obținute la concursurile de șah, respectiv la cele de go. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al spațiului de memorie utilizat.

    Exemplu: dacă fișierul conține numerele alăturate, pe ecran se afișează 3 2 pentru că la șah a obținut trei rezultate motivante (poziția 3 după poziția 7, poziția 1 după poziția 5 și poziția 1 după poziția 2), iar la go două rezultate motivante (poziția 5 după poziția 8, poziția 1 după poziția 5).

    61
    82
    71
    52
    31
    41
    51
    12
    42
    11
    21
    11

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

    Arată răspunsul și explicația
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        ifstream fin("bac.txt");
        int p, c, ups = -1, upg = -1, ns = 0, ng = 0;
        while (fin >> p >> c)
        {
            if (c == 1)
            {
                if (p < ups) ns++;
                ups = p;
            }
            else
            {
                if (p < upg) ng++;
                upg = p;
            }
        }
        fin.close();
        cout << ns << ' ' << ng;
        return 0;
    }
    
    Programul face exact pașii de la 3.a: citește perechi până la sfârșitul fișierului și compară fiecare poziție cu cea de la concursul anterior de același tip. O poziție egală cu cea anterioară nu e un rezultat motivant, de aceea comparația este strictă (p < ups).

Vrei să vezi cât ai lua?

În test ai cronometrul de la examen, codul tău se compilează pe loc, iar la final primești nota.

Rezolv-o cu timpul de la examen