Subiect și barem BAC 2024 Informatică C/C++ (științe ale naturii)
2024
Sesiune specială
Varianta 4
Rezolvare explicată

Rezolvare BAC 2024 Informatică C/C++ (științe ale naturii) — Sesiune specială, varianta 4, 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 specială, varianta 4. 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 – d, 3 – d, 4 – b, 5 – c (câte 4 puncte).

1. Echivalent cu !(x>25 || y<6) → a. x<=25 && y>=6

Legea lui De Morgan: negația unei disjuncții este conjuncția negațiilor, A∨B‾=A‾∧B‾\overline{A \lor B} = \overline{A} \land \overline{B}. !(x>25) devine x<=25, !(y<6) devine y>=6, iar || devine &&.

  • b. neagă corect comparațiile, dar păstrează || în loc de &&. Greșit.
  • c, d. neagă greșit a doua condiție (y<6).

2. Interclasarea descrescătoare → d. (49,25,21,17,15,10,10,7,4,1)

Rezultatul conține toate cele 10 elemente, ordonate descrescător: 49, 25, 21, 17, 15, 10, 10, 7, 4, 1.

  • a. are doar 5 elemente.
  • b, c. nu sunt ordonate (21 înaintea lui 25).

3. Expresia cu valoarea 1 → d. 20.24+1<ceil(20.24)+1

ceil(20.24) = 21, deci comparăm 21,24<2221{,}24 < 22 → adevărat ✔.

  • a. ceil(1.2024) = 2 și ceil(0.2024)+1 = 2 → 2 > 2 e fals.
  • b. 1*1 > 1 e fals.
  • c. ceil(-20.24) = -20 ≠ 20.24.

4. Ce memorează z → b. cel mai mare divizor comun

d parcurge crescător 1..x și z primește fiecare divizor comun al lui x și y; ultima atribuire se face pentru cel mai mare divizor comun. Variantele c, d sunt greșite pentru că z poate fi și neprim (de ex. x = y = 4 → z = 4), iar a ar fi mereu 1.

5. Ultima cifră a sumei → c. (s+x)%10

Păstrăm în s doar ultima cifră a sumei parțiale: ultima cifră a lui s+xs + x depinde numai de ultima cifră a lui s.

  • a. s+x%10 adună cifrele unităților, dar rezultatul poate depăși 9.
  • b. x%10 reține doar ultima cifră a ultimului număr.
  • d. s%10+x%10 poate ajunge la 18.

Subiectul al II-lea (40 de puncte)

1. Algoritmul în pseudocod

Pentru fiecare i de la 1 la n, m devine i împărțit la 2 de câte ori se poate (partea impară a lui i). Valoarea se afișează doar dacă m ≠ i, adică pentru i par.

a) Pentru n = 10 → 1 1 3 1 5

im (după împărțiri)Se afișează?
1, 3, 5, 7, 9m = inu
211
411
633
811
1055

Se afișează 1 1 3 1 5. (6p)

b) Exact patru valori egale cu 1

Se afișează 1 pentru i = puteri ale lui 2 (2, 4, 8, 16, 32, …). Vrem exact patru: 2, 4, 8, 16 → 16≤n≤3116 \le n \le 31. Exemplu: 16 și 31. (câte 3p)

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

cppcod
#include <iostream>
using namespace std;

int main()
{
    int n, i = 1, m;
    cin >> n;
    while (i <= n)
    {
        m = i;
        while (m % 2 == 0)
            m = m / 2;
        if (m != i)
            cout << m << ' ';
        i = i + 1;
    }
    return 0;
}

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

textcod
citește n (număr natural, n ≥ 2)
┌pentru i ← 1, n execută
│  m ← i
│ ┌cât timp m%2 = 0 execută
│ │  m ← [m/2]
│ └■
│ ┌dacă m ≠ i atunci
│ │  scrie m, ' '
│ └■
└■

Inițializarea i ← 1 și actualizarea i ← i + 1 sunt preluate de structura „pentru”.

2. Valori ale lui x comparate cu trei elemente (6p)

Tabloul (48, 24, 16, 14, 9, 8, 4) are 7 elemente, deci căutarea binară are cel mult 3 niveluri: poziția 4 (14); apoi 2 (24) sau 6 (8); apoi 1, 3, 5 sau 7 (48, 16, 9, 4). Exact trei comparații se fac dacă x este unul dintre 48, 16, 9, 4, sau dacă x nu apare în tablou. Exemple: 9 și 16 (sau, de exemplu, 100).

3. Ultimul telefon achiziționat (6p)

Dacă lunile diferă, ultimul telefon este cel cu luna mai mare; afișăm sistemul lui de operare.

cppcod
char tip1, tip2;
if (luna1 == luna2)
    cout << "Aceeasi luna";
else
{
    char t;
    if (luna1 > luna2) t = tip1;
    else t = tip2;
    if (t == 'A') cout << "Android";
    else cout << "Windows";
}

Verificare: tip1 = 'A', luna1 = 4, tip2 = 'W', luna2 = 1 → ultimul este primul telefon → Android ✔.

Subiectul al III-lea (30 de puncte)

1. Aglomerare de fulgi de nea — pseudocod (10p)

Numărul trebuie să aibă exact 9 cifre, toate din {1, 2, 3, 4}, și fiecare dintre cele patru cifre să apară cel puțin o dată. Parcurgem cifrele, le numărăm și marcăm ce cifre au apărut.

textcod
citește n (număr natural)
nc ← 0; ok ← 1
a1 ← 0; a2 ← 0; a3 ← 0; a4 ← 0
┌cât timp n ≠ 0 execută
│  c ← n%10; nc ← nc + 1
│ ┌dacă c = 1 atunci a1 ← 1
│ │altfel ┌dacă c = 2 atunci a2 ← 1
│ │       │altfel ┌dacă c = 3 atunci a3 ← 1
│ │       │       │altfel ┌dacă c = 4 atunci a4 ← 1
│ │       │       │       │altfel ok ← 0
│ │       │       │       └■
│ │       │       └■
│ │       └■
│ └■
│  n ← [n/10]
└■
┌dacă ok = 1 și nc = 9 și a1 = 1 și a2 = 1 și a3 = 1 și a4 = 1 atunci
│  scrie 1
│altfel
│  scrie 0
└■

Verificare: 112243413 → 1 ✔; 12314 (5 cifre) → 0; 112253513 (cifra 5) → 0; 112243457 (5, 7) → 0; 111122223 (lipsește 4) → 0 ✔.

2. Cea mai mică valoare generată (10p)

Pentru fiecare i, calculăm q=[k/i]q = [k/i] (cu k ≤ 50, q are cel mult 2 cifre; poate fi și 0). Cele două valori generate sunt i urmat de cifrele lui q, adică i⋅10c(q)+qi \cdot 10^{c(q)} + q, și q urmat de i, adică q⋅10c(i)+iq \cdot 10^{c(i)} + i, unde c(⋅)c(\cdot) este numărul de cifre. Păstrăm minimul.

cppcod
#include <iostream>
using namespace std;

int main()
{
    int n, k, v[51], i, q, p1, p2, x, y;
    cin >> n >> k;
    for (i = 1; i <= n; i++)
    {
        q = k / i;
        // p1 = 10 la puterea (numărul de cifre ale lui q), p2 = la fel pentru i
        p1 = 10; if (q >= 10) p1 = 100;
        p2 = 10; if (i >= 10) p2 = 100;
        x = i * p1 + q;            // cifrele lui q alipite la dreapta lui i
        y = q * p2 + i;            // cifrele lui q alipite la stânga lui i
        if (x < y) v[i] = x;
        else v[i] = y;
    }
    for (i = 1; i <= n; i++)
        cout << v[i] << ' ';
    return 0;
}

Verificare: n = 7, k = 4 → 14 22 13 14 5 6 7 ✔ (de ex. i = 3: q = 1 → 31 sau 13 → 13; i = 5: q = 0 → 50 sau 05 = 5 → 5). Pentru k = 10 → 101 25 33 24 25 16 17 ✔.

3. Primul număr care conține cifra maximă

a) Descrierea algoritmului (2p)

Numerele au cel mult două cifre, deci cifra maximă a lui x este max⁡(x%10,[x/10])\max(x \% 10, [x/10]). Citim numerele pe rând și păstrăm cifMax (cea mai mare cifră întâlnită) și p (primul număr care o conține). Actualizăm doar când cifra maximă a numărului curent este strict mai mare decât cifMax — astfel p rămâne prima apariție.

Eficiență: o singură parcurgere → timp liniar O(n); fără tablouri → memorie O(1).

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

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

int main()
{
    ifstream f("numere.in");
    int x, cm, cifMax = -1, p = 0;
    while (f >> x)
    {
        cm = x % 10;
        if (x / 10 > cm) cm = x / 10;   // x are cel mult două cifre
        if (cm > cifMax)
        {
            cifMax = cm;
            p = x;
        }
    }
    cout << p;
    f.close();
    return 0;
}

Verificare pe exemplu: cifra maximă din fișier este 8, iar primul număr care o conține este 38 ✔.

Ce merită reținut din varianta 4

  • De Morgan: !(A || B) ⇔ !A && !B, iar fiecare comparație se neagă (> ↔ <=, < ↔ >=).
  • ceil rotunjește în sus, și pentru negative: ceil(-20.24) = -20.
  • Ultima cifră a unei sume: s = (s + x) % 10 la fiecare pas.
  • Căutare binară pe 7 elemente: cel mult 3 comparații.
  • Alipirea a două numere: a⋅10c(b)+ba \cdot 10^{c(b)} + b.

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