Subiect și barem BAC 2025 Informatică C/C++ (științe ale naturii)
2025
Model oficial
Rezolvare explicată

Rezolvare BAC 2025 Informatică C/C++ (științe ale naturii) — Model oficial, pas cu pas

Subiectul și baremul sunt documentele oficiale ale Ministerului Educației; rezolvarea de mai jos este explicația echipei MeditatiiDirect.ro, cu punctajul din barem pentru fiecare cerință.

Rezolvarea completă a subiectului de Bacalaureat 2025 la Informatică, limbajul C/C++, profil științe ale naturii, modelul oficial publicat de CNCE. Pentru fiecare item ai răspunsul, raționamentul pas cu pas, codul C++ complet și punctajul din baremul oficial.

Sfat: încearcă întâi singur fiecare cerință, apoi verifică aici. La programe, baremul punctează orice soluție corectă — nu trebuie să scrii exact codul de mai jos.

Subiectul I (20 de puncte)

Răspunsuri: 1 – c, 2 – b, 3 – c, 4 – a, 5 – d (câte 4 puncte).

1. Intervalul lui x → c. [2005, 2024]

Simplificăm fiecare negație:

  • !(x<2004) ⇔ x≥2004x \ge 2004;
  • !(x<2005 || x>2024) ⇔ 2005≤x≤20242005 \le x \le 2024 (legea lui De Morgan);
  • !(x>2025) ⇔ x≤2025x \le 2025.

Intersecția celor trei condiții este [2005, 2024]. Variantele a, b, d conțin valori (2004 sau 2025) care fac falsă condiția din mijloc.

2. x comparat cu două elemente → b. 5, 25

Tabloul (2, 5, 10, 15, 16, 25, 50), pozițiile 1..7. Prima comparație: poziția 4 → 15. A doua comparație: în stânga, poziția 2 → 5; în dreapta, poziția 6 → 25. Căutarea se încheie după exact două comparații doar dacă x este găsit la al doilea pas, deci x = 5 sau x = 25.

  • a, c, d. valorile 2, 10, 16, 50 se află la al treilea nivel al căutării (3 comparații).

3. Expresia cu valoarea −3 → c. floor(x-y)

floor rotunjește în jos (spre −∞): x−y=2,5−5,2=−2,7x - y = 2{,}5 - 5{,}2 = -2{,}7 → −3 ✔.

  • a. −7,7-7{,}7 → −8. b. 2,72{,}7 → 2. d. 7,77{,}7 → 7.

4. Suma numerelor ≥ 2025 → a. if(x>=2025) s=s+x;

Adunăm la s doar numerele care respectă condiția; celelalte se ignoră (și 0, ultimul citit, nu influențează suma).

  • b, d. scad numerele mici din sumă. Greșit.
  • c. else s=0 resetează suma la fiecare număr mic — inclusiv la 0 de la final. Greșit.

5. Ce reprezintă x → d. cel mai mare divizor comun

Este algoritmul lui Euclid prin scăderi repetate: se scade numărul mai mic din cel mai mare până când devin egale; valoarea comună este cmmdc(2025, 280) = 5.

Subiectul al II-lea (40 de puncte)

1. Algoritmul în pseudocod

Pentru fiecare i de la n la 1, nr crește dacă i este divizibil cu exact unul dintre x și y (cu x dar nu cu y, sau cu y dar nu cu x).

a) Pentru 15, 3, 4 → 6

  • multipli de 3 din 1..15: 3, 6, 9, 12, 15;
  • multipli de 4: 4, 8, 12;
  • 12 se divide cu amândouă → nu se numără.

Rămân 3, 6, 9, 15, 4, 8 → 6. (6p)

b) Două seturi pentru care se afișează 0

Dacă x = y, orice număr este divizibil fie cu amândouă, fie cu niciunul, deci nr rămâne 0. Exemple: n = 10, x = 2, y = 2 și n = 5, x = 3, y = 3. (câte 3p)

c) Programul C/C++ (10p)

cppcod
#include <iostream>
using namespace std;

int main()
{
    int n, x, y, nr = 0, i;
    cin >> n >> x >> y;
    for (i = n; i >= 1; i--)
        if (i % x == 0 && i % y != 0)
            nr = nr + 1;
        else if (i % x != 0 && i % y == 0)
            nr = nr + 1;
    cout << nr;
    return 0;
}

d) „pentru” înlocuit cu test inițial (6p)

Inițializăm contorul cu n, testăm i ≥ 1 și scădem contorul la sfârșitul corpului:

textcod
citește n, x, y (numere naturale nenule, x ≤ n, y ≤ n)
nr ← 0
i ← n
┌cât timp i ≥ 1 execută
│ ┌dacă i%x = 0 și i%y ≠ 0 atunci
│ │  nr ← nr + 1
│ │altfel
│ │ ┌dacă i%x ≠ 0 și i%y = 0 atunci
│ │ │  nr ← nr + 1
│ │ └■
│ └■
│  i ← i − 1
└■
scrie nr

2. Elementele tabloului B (6p)

Rezultatul interclasării conține toate elementele lui A și toate ale lui B. Eliminând din (3, 4, 7, 8, 21, 25, 37, 45, 55, 70) elementele lui A = (3, 21, 25, 37, 55), rămâne B = (4, 7, 8, 45, 70) (B este crescător, pentru că interclasarea a fost crescătoare).

3. Data primei expoziții (6p)

Lunile sunt ianuarie ('I') și februarie ('F'). Dacă expozițiile sunt în aceeași lună, prima este cea cu ziua mai mică; altfel, prima este cea din ianuarie.

cppcod
char luna1, luna2;
int z; char l;
if (luna1 == luna2)
{
    if (ziua1 < ziua2) z = ziua1;
    else z = ziua2;
    l = luna1;
}
else if (luna1 == 'I') { z = ziua1; l = luna1; }
else { z = ziua2; l = luna2; }
cout << z << ' ';
if (l == 'I') cout << "IANUARIE";
else cout << "FEBRUARIE";

Verificare: (15, I) și (20, I) → 15 IANUARIE; (15, I) și (10, F) → 15 IANUARIE ✔.

Subiectul al III-lea (30 de puncte)

1. Numere par-oglindite — pseudocod (10p)

Păstrăm doar cifrele pare nenule (2, 4, 6, 8). Din x construim numărul a cu aceste cifre în ordinea lor (adăugăm fiecare cifră în față, cu o putere a lui 10). Din y construim b cu cifrele în ordine inversă (b ← b*10 + c cât timp parcurgem de la dreapta). x și y sunt par-oglindite dacă a = b. Dacă niciun număr nu are cifre pare nenule (a = b = 0), răspunsul este 0, ca în exemplul x = 15, y = 510.

textcod
citește x, y (numere naturale)
a ← 0; p ← 1; b ← 0
┌cât timp x ≠ 0 execută
│  c ← x%10
│ ┌dacă c%2 = 0 și c ≠ 0 atunci
│ │  a ← c*p + a; p ← p*10
│ └■
│  x ← [x/10]
└■
┌cât timp y ≠ 0 execută
│  c ← y%10
│ ┌dacă c%2 = 0 și c ≠ 0 atunci
│ │  b ← b*10 + c
│ └■
│  y ← [y/10]
└■
┌dacă a = b și a ≠ 0 atunci
│  scrie 1
│altfel
│  scrie 0
└■

Verificare: 814 → a = 84; 7003485 → cifrele 4, 8, inversate → b = 84 → 1 ✔. Pentru y = 7003465 → b = 64 → 0; y = 7003845 → b = 48 → 0; x = 15, y = 510 → a = b = 0 → 0 ✔ (toate exemplele au fost verificate și în C++).

2. Tabloul cu multipli și numere descrescătoare (10p)

Pe poziția pară i (0, 2, 4, …) se pune al (i/2+1)(i/2+1)-lea multiplu al lui k. Pozițiile impare sunt în număr de [n/2][n/2] și trebuie să conțină [n/2]−1,…,1,0[n/2]-1, \dots, 1, 0.

cppcod
#include <iostream>
using namespace std;

int main()
{
    int k, n, v[101], i, d;
    cin >> k >> n;
    d = n / 2 - 1;                 // prima valoare de pe pozițiile impare
    for (i = 0; i < n; i++)
        if (i % 2 == 0)
            v[i] = (i / 2 + 1) * k;
        else
        {
            v[i] = d;
            d--;
        }
    for (i = 0; i < n; i++)
        cout << v[i] << ' ';
    return 0;
}

Verificare: k = 5, n = 9 → 5 3 10 2 15 1 20 0 25 ✔.

3. Colecționarul ultimei mașini din anul x

a) Descrierea algoritmului (2p)

Anul are 4 cifre, deci pentru un cod crt anul este crt % 10000, iar identificatorul colecționarului este [crt / 10000]. Citim codurile pe rând și, de fiecare dată când anul este x, actualizăm u = [crt/10000] (inițial −1). Cum suprascriem mereu, la final u corespunde ultimei mașini din anul x; dacă u = −1, afișăm „nu exista”.

Eficiență: o singură parcurgere a fișierului → timp liniar; nu memorăm codurile → memorie O(1).

b) Programul C/C++ (8p)

cppcod
#include <fstream>
#include <iostream>
using namespace std;

int main()
{
    ifstream f("bac.txt");
    int x, crt, u = -1;
    f >> x;
    while (f >> crt)
        if (crt % 10000 == x)
            u = crt / 10000;
    if (u == -1) cout << "nu exista";
    else cout << u;
    f.close();
    return 0;
}

Verificare pe exemplu: codurile din 1925 sunt 21925, 8931925, 201925, 31925, 151925, 201925 → ultima este 201925 → se afișează 20 ✔.

Ce merită reținut din model

  • De Morgan: !(a || b) ⇔ !a && !b; !(x<a) ⇔ x>=a.
  • floor pe numere negative rotunjește spre −∞: floor(-2.7) = -3.
  • Euclid prin scăderi → cmmdc.
  • Interclasare: B = rezultatul fără elementele lui A.
  • Coduri alipite: %10000 și /10000 separă ultimele 4 cifre de restul numărului.

Vrei să iei nota pe care ți-o dorești la BAC 2025?

Ai lucrat subiectul de Informatică C/C++ (științe ale naturii)? Pe MeditatiiDirect.ro îl poți relua cu un profesor sau cu Profesorul AI, exact pe punctele unde ai pierdut puncte la barem.

Alte subiecte BAC Informatică C/C++ (științe ale naturii) rezolvate