Bacalaureat 2027 la informatică: modelul oficial, mate-info

Subiectul oficial din 2027, cu baremul, pe 90 de puncte. Grilele și răspunsurile scurte le verifici pe loc; restul le scrii aici sau pe caiet, apoi te verifici pe barem.

Arată cum va arăta subiectul de la Bac.

3 ore · 90 de puncte + 10 din oficiu

Subiectul (PDF)Baremul (PDF)

Pe timp, ca la examen

Ceasul merge și dacă închizi pagina. Poți lua o singură pauză. La final, nota estimată după barem.

Subiectul ISubiectul al II-leaSubiectul al III-lea

Subiectul I 20 p

I.14 p

Indicați expresia C/C++ a cărei valoare este 0.

Vezi rezolvarea

Răspuns: a) 27==27/(3*3*3)\texttt{27==27/(3*3*3)}

Declarația: struct pantof { int marime; float pret; } p[100];

I.24 p

Variabila p, declarată alăturat, memorează mărimea și prețul pentru fiecare dintre cele 100 de perechi de pantofi dintr-un magazin. Indicați expresia C/C++ prin care se accesează prețul celei de a treia perechi.

Vezi rezolvarea

Răspuns: d) p[2].pret\texttt{p[2].pret}

Subprogramul f: int f(int n, int k) { if(n==0) return 0; else if(k*k<=n) return k+f(n/2,k+1); else return k+f(n/2,n); }

I.34 p

Subprogramul f este definit alăturat. Indicați valoarea f(97,0).

Vezi rezolvarea

Răspuns: c) 1919

I.44 p

Utilizând metoda backtracking se generează toate seturile de echipamente pentru drumeție din mulțimea ordonată astfel: {rucsac (100 de lei), bocanci (200 de lei), lanternă (50 de lei), bidon (20 de lei), pelerină (100 de lei), busolă (50 de lei), hartă (30 de lei)}. Într-un set, echipamentele sunt distincte și costă, în total, 200 de lei. Două soluții diferă prin cel puțin un echipament. Primele trei soluții generate sunt, în această ordine: (rucsac, lanternă, bidon, hartă), (rucsac, lanternă, busolă), (rucsac, bidon, busolă, hartă). Indicați a șasea soluție.

Vezi rezolvarea

Răspuns: d) (lanternă, bidon, pelerină, hartă)

I.54 p

Într-un arbore cu rădăcină considerăm că un nod se află pe nivelul x, dacă lanțul elementar care are o extremitate în nodul respectiv și cealaltă extremitate în rădăcina arborelui are lungimea x. Pe nivelul 0 se află un singur nod (rădăcina). Un arbore cu rădăcină are cinci niveluri. Nodurile de pe nivelul 2 au câte patru descendenți direcți („fii”), toate nodurile de pe același nivel au același număr de descendenți direcți și oricare două noduri aflate pe niveluri diferite au număr diferit de descendenți direcți. Indicați numărul de noduri de pe ultimul nivel, astfel încât numărul total de noduri ale arborelui să fie minim.

Vezi rezolvarea

Răspuns: b) 2424

Subiectul al II-lea 40 p

Algoritmul de la II.1

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.

Algoritmul în pseudocod: citește x,y; n←1; cât timp x>0: ok←1; cât timp ok=1: dacă x%2=0 atunci y←y*y; x←[x/2], altfel x←x-1; ok←0; apoi n←n*y; la final scrie n.

II.1.a6 p

algoritmul de la II.1

a. Scrieți valoarea afișată în urma executării algoritmului dacă se citesc, în această ordine, numerele 11, 2.

Vezi rezolvarea

Răspuns: 2048

II.1.b6 p

algoritmul de la II.1

b. Dacă primul număr citit este 3, scrieți două numere din intervalul [1,10] care pot fi citite pentru variabila y astfel încât, în urma executării algoritmului, pentru fiecare dintre acestea, numărul afișat să fie din intervalul [27,127].

Verifică-te pe barem

Un exemplu de răspuns

Oricare două dintre 3, 4, 5 (de exemplu 3 și 4).

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. Pentru răspuns corect: câte 3p. pentru fiecare dintre cele două numere conform cerinței (oricare două numere dintre 3, 4, 5)6 p

II.1.c10 p

algoritmul de la II.1

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

Verifică-te pe barem

Un exemplu de răspuns

#include <iostream>
using namespace std;
int main()
{
    int x, y, n = 1, ok;
    cin >> x >> y;
    while (x > 0)
    {
        ok = 1;
        while (ok == 1)
            if (x % 2 == 0) { y = y * y; x = x / 2; }
            else { x = x - 1; ok = 0; }
        n = n * y;
    }
    cout << n;
    return 0;
}

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. declarare a tuturor variabilelor, conform cerinței1 p
  2. citire a datelor, conform cerinței1 p
  3. afișare a datelor, conform cerinței1 p
  4. instrucțiune de decizie, cu expresie condițională și cuvinte cheie conform cerinței2 p
  5. instrucțiuni repetitive, cu expresii condiționale inițiale de repetare și cuvinte cheie conform cerinței (se acordă numai 2p. dacă doar una dintre instrucțiunile repetitive este conform cerinței)3 p
  6. atribuiri, conform cerinței1 p
  7. corectitudine globală a programului1 p

II.1.d6 p

algoritmul de la II.1

d. Scrieți în pseudocod un algoritm echivalent cu cel dat, înlocuind adecvat prima structură cât timp...execută cu o structură repetitivă cu test final.

Verifică-te pe barem

Un exemplu de răspuns

citește x,y (numere naturale)
n←1
dacă x>0 atunci
repetă
ok←1
cât timp ok=1 execută
dacă x%2=0 atunci y←y*y; x←[x/2]
altfel x←x-1; ok←0
■
■
n←n*y
până când x=0
■
scrie n

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. utilizare a unei structuri repetitive de tipul cerut, înlocuind-o pe cea indicată (se acordă punctajul chiar dacă algoritmul obținut nu este echivalent cu cel dat; se punctează orice formă de structură repetitivă explicită, conform cerinței)2 p
  2. aspecte specifice pentru secvența obținută prin înlocuire, conform cerinței (se acordă numai 2p. dacă doar unul dintre următoarele două aspecte specifice este conform cerinței: tratare a cazului x=0, expresie condițională finală de repetare/oprire)3 p
  3. algoritm complet, corectitudine globală a algoritmului1 p

II.26 p

Un graf orientat are 5 vârfuri, numerotate de la 1 la 5 și arcele (4,5), (2,1), (3,1), (1,4), (1,2), (5,3). Scrieți un drum cu lungimea minimum 3 și un circuit care nu este elementar.

Verifică-te pe barem

Un exemplu de răspuns

Drum: 2, 1, 4, 5. Circuit neelementar: 1, 2, 1, 4, 5, 3, 1.

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. drum, conform cerinței (se acordă numai 2p. dacă s-a precizat un drum, dar nu cu lungimea cerută)3 p
  2. circuit, conform cerinței (se acordă numai 2p. dacă s-a precizat un circuit, dar elementar)3 p
Tabloul cu 8 linii, fiecare linie fiind 2 2 0 0 2 2 7 7.

II.36 p

Variabilele i și j sunt de tip întreg, iar variabila a memorează un tablou bidimensional cu 8 linii și 8 coloane, numerotate de la 0, având inițial toate elementele egale cu -1. Scrieți secvența de instrucțiuni C/C++ de mai jos, înlocuind punctele de suspensie cu instrucțiuni adecvate, dintre care cel mult trei de atribuire, astfel încât, în urma executării secvenței obținute, variabila a să memoreze tabloul alăturat.

for(i=0;i<8;i++)

for(j=0;j<8;j++)

. . . . . . . . . . . . . . . .

Verifică-te pe barem

Un exemplu de răspuns

for(i=0;i<8;i++)
  for(j=0;j<8;j++)
    if(j==2 || j==3) a[i][j]=0;
    else if(j<6) a[i][j]=2;
    else a[i][j]=7;

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. expresie de accesare a unui element al tabloului1 p
  2. valori ale elementelor tabloului atribuite conform cerinței (pentru algoritm care conduce la o rezolvare parțială, se acordă numai 2p. pentru următorul aspect conform cerinței: identificare a cel puțin unei relații între valoarea elementului și poziția acestuia în tablou)4 p
  3. secvență completă, corectitudine globală a secvenței1 p

Subiectul al III-lea 30 p

III.110 p

Un grădinar are un teren dreptunghiular pe care îl împarte în parcele pătrate, toate de latură egală, număr natural. Subprogramul parcele are doi parametri, x și y, prin care primește câte un număr natural din intervalul [1,10⁴], reprezentând lățimea, respectiv lungimea terenului, măsurate în metri. Subprogramul afișează pe ecran, pentru fiecare variantă de împărțire a terenului, o pereche formată din numărul de parcele obținute și latura unei astfel de parcele, în această ordine. Valorile din pereche sunt separate prin expresia cu latura, iar fiecare pereche este urmată de simbolul punct și virgulă (;), ca în exemplu.

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

Exemplu: pentru x=18 și y=24, se afișează pe ecran, cu perechile nu neapărat în această ordine:

432 cu latura 1;108 cu latura 2;48 cu latura 3;12 cu latura 6;

Verifică-te pe barem

Un exemplu de răspuns

void parcele(int x, int y)
{
    for (int d = 1; d <= x && d <= y; d++)
        if (x % d == 0 && y % d == 0)
            cout << (x / d) * (y / d) << " cu latura " << d << ";";
}

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. antet al subprogramului (pentru antet parțial corect, se acordă numai câte 1p. pentru fiecare dintre următoarele două aspecte conform cerinței: structură cu nume și tip rezultat, parametri de intrare)2 p
  2. determinare a valorilor cerute (pentru algoritm care conduce la o rezolvare parțială se acordă numai câte 1p. pentru fiecare dintre următoarele patru aspecte conform cerinței: identificare a unei laturi posibile/divizor al unui număr, identificare a unei laturi valide/divizor comun, identificare a numărului de parcele posibile pe lungimea sau lățimea terenului/divizor complementar, configurații suport analizate/divizori comuni suport)5 p
  3. afișare a datelor, conform cerinței (se acordă numai 1p. dacă au fost afișate valorile numerice determinate, dar nu în formatul cerut)2 p
  4. declarare a tuturor variabilelor locale, corectitudine globală a subprogramului1 p

III.210 p

Într-un text de cel mult 200 de caractere, cuvintele sunt separate prin câte un spațiu și sunt formate din litere mici ale alfabetului englez, cifre și simboluri din mulțimea parantezelor: (, ), [, ], {, }.

Scrieți un program C/C++ care citește de la tastatură un text de tipul precizat și afișează pe ecran numărul cuvintelor care conțin atât paranteze, cât și litere, în număr egal.

Exemplu: pentru textul a(b5) xyz [x1]y2 (x) {a6bc} 27 pq {ba}a) se afișează pe ecran 3

Verifică-te pe barem

Un exemplu de răspuns

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[201], *p;
    int nr = 0;
    cin.getline(s, 201);
    p = strtok(s, " ");
    while (p != NULL)
    {
        int lit = 0, par = 0;
        for (int i = 0; p[i] != 0; i++)
            if (p[i] >= 'a' && p[i] <= 'z') lit++;
            else if (strchr("()[]{}", p[i]) != NULL) par++;
        if (lit > 0 && lit == par) nr++;
        p = strtok(NULL, " ");
    }
    cout << nr;
    return 0;
}

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. declarare a unei variabile care să permită memorarea unui șir de caractere, conform cerinței1 p
  2. citire a datelor, conform cerinței1 p
  3. determinare a numărului cerut (pentru algoritm care conduce la o rezolvare parțială se acordă numai câte 1p. pentru fiecare dintre următoarele patru aspecte specifice: algoritm de bază pentru numărarea unei serii de valori cu inițializarea și actualizarea rezultatului, identificare a unei litere/cel puțin unui tip de paranteze, litere/paranteze suport numărate într-un cuvânt, cuvinte suport numărate)6 p
  4. afișare a datelor, conform cerinței1 p
  5. declarare a variabilelor simple, corectitudine globală a programului1 p
Concursul de la III.3

La un concurs, fiecare echipă are câte un indicativ, număr natural din intervalul [10,99]; indicativele sunt acordate la rând, în ordinea înscrierii. Fiecare echipă are de rezolvat câte trei probleme și fiecare problemă este evaluată cel mult o dată și notată cu un punctaj, număr natural din intervalul [0,99]. Rezultatul pentru fiecare problemă trimisă spre evaluare este înregistrat sub forma unui număr natural, format prin concatenarea, în această ordine, a numărului problemei (1, 2 sau 3), a punctajului obținut și a indicativului echipei. Problemele pentru care nu se trimit rezolvări spre evaluare sunt notate implicit cu câte 0 puncte. Clasamentul se face în funcție de punctajul total obținut, în ordine descrescătoare, la punctaj egal departajarea fiind în funcție de numărul de probleme cu punctaj 99, iar în caz de egalitate în funcție de ordinea înscrierii.

Fișierul bac.txt conține cel mult 10⁶ numere naturale din intervalul [10³,10⁵), reprezentând rezultatele obținute la problemele evaluate. Numerele sunt separate prin câte un spațiu.

Se cere să se afișeze pe ecran indicativul primei echipe din clasament. Proiectați un algoritm eficient din punctul de vedere al timpului de executare.

Exemplu: dacă fișierul are conținutul alăturat, pe ecran se afișează 12 (primele cinci echipe din clasament sunt, în această ordine, 12, 15, 11, 10, 30, primele trei obținând câte 259 de puncte, primele două cu câte o problemă de punctaj 99 și prima echipă fiind înscrisă înaintea celei de-a doua).

Conținutul fișierului bac.txt: 19912 19910 28012 38012 29011 3010 19015 38011 37015 22030 29915 29910 18911.

III.3.a2 p

concursul de la III.3

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

Verifică-te pe barem

Un exemplu de răspuns

Folosesc doi vectori de frecvență indexați după indicativ (10..99): p[i] = punctajul total al echipei i și nr[i] = câte probleme de 99 are. Citesc numerele din fișier unul câte unul: indicativul e x%100, punctajul e (x/100)%100 dacă x/100>99, altfel (x/100)%10; îl adun la p[i] și, dacă e 99, cresc nr[i]. La final parcurg indicativele crescător și rețin echipa cu p mai mare sau, la egalitate, cu nr mai mare; la egalitate totală rămâne cea cu indicativ mai mic, adică înscrisă mai devreme.

Eficiență: fiecare număr din fișier e citit o singură dată și prelucrat în timp constant, fără a memora șirul; parcurgerea finală are doar 90 de pași. Algoritmul e liniar în numărul de valori din fișier.

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. descriere coerentă a algoritmului (se acordă punctajul chiar dacă algoritmul ales nu este eficient)1 p
  2. justificare a elementelor de eficiență, conform cerinței1 p

III.3.b8 p

concursul de la III.3

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

Verifică-te pe barem

Un exemplu de răspuns

#include <fstream>
#include <iostream>
using namespace std;
int p[100], nr[100];
int main()
{
    ifstream f("bac.txt");
    int x, i, pct, em = 10;
    while (f >> x)
    {
        i = x % 100;
        if (x / 100 > 99) pct = (x / 100) % 100;
        else pct = (x / 100) % 10;
        p[i] += pct;
        if (pct == 99) nr[i]++;
    }
    for (i = 11; i < 100; i++)
        if (p[i] > p[em] || (p[i] == p[em] && nr[i] > nr[em])) em = i;
    cout << em;
    return 0;
}

Exemplu scris de Zece, nu singurul răspuns bun.

Barem oficial

  1. operații cu fișiere: declarare, pregătire în vederea citirii, citire din fișier conform cerinței1 p
  2. determinare a valorii cerute (se acordă punctajul chiar dacă algoritmul ales nu este eficient; pentru algoritm care conduce la o rezolvare parțială se acordă numai câte 1p. pentru fiecare dintre următoarele patru aspecte specifice: identificare a elementelor componente ale unui rezultat, algoritm de bază pentru suma unei serii de valori cu inițializarea și actualizarea rezultatului, algoritm de bază pentru numărarea unei serii de valori cu inițializarea și actualizarea rezultatului, algoritm de bază pentru determinarea maximului dintr-o serie de valori cu inițializarea și actualizarea rezultatului)5 p
  3. utilizare a unui algoritm eficient (se acordă punctajul numai pentru un algoritm liniar)1 p
  4. declarare a variabilelor, afișare a datelor, corectitudine globală a programului1 p
Ai terminat? Bifează pe barem ce ai făcut și află câte puncte ai fi luat. Alte subiecte de informatică.