Subiect și barem BAC 2024 Informatică C/C++ (științe ale naturii)
2024
Iunie–Iulie
Varianta 3
Rezolvare explicată

Rezolvare BAC 2024 Informatică C/C++ (științe ale naturii) — Iunie–Iulie, varianta 3, 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 2024 la Informatică, limbajul C/C++, profil științe ale naturii, sesiunea iunie–iulie, varianta 3. 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 – a, 2 – c, 3 – d, 4 – b, 5 – c (câte 4 puncte).

1. x și y sunt pare → a. x%2==0 && (y+1)%2!=0

(y+1)%2!=0 înseamnă că y+1 este impar, adică y este par. Împreună cu x%2==0, expresia cere ca ambele să fie pare ✔.

  • b, c, d. sunt adevărate și când x și y sunt ambele impare (de ex. 3 și 5) — ele testează doar „aceeași paritate”. Greșit.

2. Comparațiile 14, 24, 16 → c. (4,8,9,14,16,24,48)

Căutarea binară cere un tablou sortat. În c, cu pozițiile 1..7: mijlocul 4 → 14; 16 > 14 → 5..7, mijlocul 6 → 24; 16 < 24 → poziția 5 → 16 ✔.

  • a, b, d. tablourile nu sunt sortate (iar b și d au doar 6 elemente).

3. x ∈ {−3, −1, 1, 3} → d. abs(x)<=3 && abs(x%2)==1

Mulțimea conține exact numerele impare cu ∣x∣≤3|x| \le 3. Folosim abs(x%2), pentru că în C/C++ restul unui număr negativ impar este −1 (de ex. -3%2 == -1).

  • a. adevărată pentru orice x ≠ 0. b. adevărată pentru orice x par. c. adevărată pentru orice x ≠ 3. Toate greșite.

4. Ultima cifră a produsului cifrelor → b. (u*x)%10

Ne interesează doar ultima cifră a produsului, deci după fiecare înmulțire păstrăm restul la 10. Cum u este o cifră, (u⋅x) mod 10=(u⋅(x mod 10)) mod 10(u \cdot x) \bmod 10 = (u \cdot (x \bmod 10)) \bmod 10 — se înmulțește practic cu ultima cifră a lui x ✔.

  • a. u*(x%10) calculează tot produsul, nu doar ultima cifră (de ex. 99 → 81).
  • c. u%10*x înmulțește cu tot numărul x.
  • d. (u%10)*(x%10) poate da la final o valoare ≥ 10.

5. Triunghiurile de 4 din colțuri → c. i+j<4 || i+j>12

Se afișează 4 în colțul stânga-sus (linia 0: coloanele 0..3, linia 3: coloana 0 → i+j≤3i + j \le 3) și în colțul dreapta-jos (linia 5: coloana 8, linia 8: coloanele 5..8 → i+j≥13i + j \ge 13). Cele două zone sunt unite cu ||.

  • d. descrie exact zona de 2 (din mijloc).
  • a, b. folosesc i-j, adică diagonale paralele cu diagonala principală — altă formă.

Subiectul al II-lea (40 de puncte)

1. Algoritmul în pseudocod

Pentru fiecare număr citit, structura „repetă” îl împarte la 3 (cel puțin o dată) până devine ≤ 3; dacă rezultatul nu este 0, se înmulțește în p.

a) Pentru 5, 15, 27, 10, 1, 17 → 9

xÎmpărțiri succesive la 3Finalp
155, 111
279, 333
10339
100 (ignorat)9
175, 119

Se afișează 9. (6p)

b) n = 2 și se afișează 4

Valorile finale sunt în {0, 1, 2, 3}, iar 4 = 2 · 2, deci ambele numere trebuie să ajungă la 2. Asta se întâmplă pentru numerele din [2⋅3k,3k+1)[2\cdot 3^k, 3^{k+1}): [6, 8], [18, 26], [54, 80], … Exemplu: 6 și 7 (atenție: 2 nu merge, pentru că se împarte o dată și devine 0). (6p)

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

cppcod
#include <iostream>
using namespace std;

int main()
{
    int n, p = 1, i, x;
    cin >> n;
    for (i = 1; i <= n; i++)
    {
        cin >> x;
        do
        {
            x = x / 3;
        } while (x > 3);
        if (x != 0)
            p = p * x;
    }
    cout << p;
    return 0;
}

d) „pentru” înlocuit cu „cât timp” (6p)

textcod
citește n (număr natural nenul)
p ← 1
i ← 1
┌cât timp i ≤ n execută
│  citește x (număr natural)
│ ┌repetă
│ │  x ← [x/3]
│ └până când x ≤ 3
│ ┌dacă x ≠ 0 atunci p ← p*x
│ └■
│  i ← i + 1
└■
scrie p

Barem: inițializarea contorului, condiția de continuare și actualizarea contorului — câte 1p.

2. Interclasarea crescătoare a lui A = (8, 4, 2) cu B = (3, 8, 10, 17) (6p)

A este descrescător, deci îl parcurgem de la dreapta la stânga (2, 4, 8). Rezultatul are 3 + 4 = 7 elemente:

(2, 3, 4, 8, 8, 10, 17)

3. Tipul ciocolatei și prețul (6p)

cppcod
char tip;
if (tip == 'N') cout << "ciocolata neagra";
else cout << "ciocolata cu lapte";
cout << endl;
if (pret > 10) cout << "scumpa";
else cout << "ieftina";

Pentru pret = 16, tip = 'N' se afișează ciocolata neagra și, pe linia următoare, scumpa ✔.

Subiectul al III-lea (30 de puncte)

1. Cel mai mic număr major impar din [a, b] — pseudocod (10p)

Parcurgem numerele x de la a la b, oprindu-ne la primul găsit. Pentru fiecare x calculăm suma divizorilor proprii impari (si) și pari (sp), cu d de la 2 la x−1.

textcod
citește a, b (numere naturale, 2 ≤ a ≤ b)
r ← 0; x ← a
┌cât timp x ≤ b și r = 0 execută
│  si ← 0; sp ← 0
│ ┌pentru d ← 2, x−1 execută
│ │ ┌dacă x%d = 0 atunci
│ │ │ ┌dacă d%2 = 1 atunci si ← si + d
│ │ │ │altfel sp ← sp + d
│ │ │ └■
│ │ └■
│ └■
│ ┌dacă si > sp atunci r ← x
│ └■
│  x ← x + 1
└■
scrie r

Verificare: a = 16, b = 30: 16 (impari: 0; pari: 2+4+8), 17 (prim, sume 0) nu convin; 18: 3+9=12>2+6=83 + 9 = 12 > 2 + 6 = 8 → se scrie 18 ✔.

2. Toate elementele au același număr de cifre (10p)

Numărăm cifrele fiecărui element; primul dă valoarea k, iar dacă un alt element are alt număr de cifre, răspunsul este NU.

cppcod
#include <iostream>
using namespace std;

int main()
{
    int n, v[51], i, k, c, x, ok = 1;
    cin >> n;
    for (i = 0; i < n; i++)
        cin >> v[i];
    for (i = 0; i < n; i++)
    {
        x = v[i]; c = 0;           // numărăm cifrele lui v[i]
        while (x != 0)
        {
            c++;
            x = x / 10;
        }
        if (i == 0) k = c;
        else if (c != k) ok = 0;
    }
    if (ok) cout << "DA " << k;
    else cout << "NU";
    return 0;
}

Valorile sunt ≥ 10, deci niciuna nu este 0 (care ar avea nevoie de tratare separată). Verificare: (123, 241, 896, 908, 100, 536) → DA 3 ✔; (123, 21, …, 1536) → NU ✔.

3. Lungimea maximă a unei scări

a) Descrierea algoritmului (2p)

Citim cotele pe rând și păstrăm doar ultima cotă (ult), lungimea scării curente (lgCrt) și maximul (lgMax). Dacă cota citită este ult + 1, scara continuă (lgCrt++); altfel începe o scară nouă (lgCrt = 1). Actualizăm lgMax și ult la fiecare pas. Dacă la final lgMax < 2, nu există nicio scară.

Eficiență: o singură parcurgere → timp liniar O(n); nu memorăm șirul → memorie O(1).

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

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

int main()
{
    ifstream f("bac.txt");
    int x, ult = 0, lgCrt = 0, lgMax = 0;
    while (f >> x)
    {
        if (x == ult + 1) lgCrt++;
        else lgCrt = 1;
        if (lgCrt > lgMax) lgMax = lgCrt;
        ult = x;
    }
    if (lgMax < 2) cout << "nu exista";
    else cout << lgMax;
    f.close();
    return 0;
}

Verificare pe exemplu: scările sunt 600 601, 569 570, 700 701 (lungime 2) și 625 626 627 (lungime 3) → se afișează 3 ✔.

Ce merită reținut din varianta 3

  • „Ambele pare” nu e același lucru cu „aceeași paritate”.
  • Rest negativ: în C/C++ -3%2 == -1, de aceea folosește abs(x%2) sau x%2!=0.
  • Ultima cifră a unui produs: păstrează doar %10 după fiecare înmulțire.
  • Zone dintr-o matrice: i+j constant descrie antidiagonale, i-j constant — diagonale.
  • Secvență maximă: contor curent resetat la 1 + maxim actualizat la fiecare pas.

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

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