La itemul II.1c de la BAC informatică ți se cere să scrii programul C++ corespunzător algoritmului dat în pseudocod. Nu trebuie să inventezi nimic — algoritmul există deja. Trebuie doar să-l traduci corect, instrucțiune cu instrucțiune, și să-l încadrezi într-un program complet. Partea bună: regulile de traducere sunt puține și fixe. Partea mai puțin bună: o singură regulă aplicată greșit strică echivalența și costă puncte.

Tabelul de traducere

PseudocodC++
x ← 5x = 5;
a = b (în condiții)a == b
a ≠ b, a ≤ b, a ≥ ba != b, a <= b, a >= b
și, sau&&, ||
[a/b] (a, b întregi)a / b
[x] (x real, pozitiv)(int)x
a % ba % b
citește a, bcin >> a >> b;
scrie a, ' ', bcout << a << ' ' << b;
dacă c atunci … altfel …if (c) { … } else { … }
cât timp c execută …while (c) { … }
repetă … până când cdo { … } while (!(c));
pentru i ← a, b execută …for (i = a; i <= b; i++) { … }
pentru i ← a, b, -1 execută …for (i = a; i >= b; i--) { … }

Exemplu rezolvat complet

Fie algoritmul:

citește n (număr natural nenul)
m ← 0; p ← 1
repetă
    c ← n % 10
    dacă c % 2 = 1 atunci
        m ← m + c * p
        p ← p * 10
    n ← [n/10]
până când n = 0
scrie m

Înainte de traducere, merită să înțelegi ce face. Pentru n = 52381, cifrele se iau de la dreapta: 1 este impară, deci m = 1 și p = 10; 8 e pară; 3 e impară, m = 1 + 3·10 = 31, p = 100; 2 e pară; 5 e impară, m = 31 + 5·100 = 531. Se afișează 531: algoritmul păstrează cifrele impare ale lui n, în ordinea lor inițială.

Traducerea, pas cu pas:

#include <iostream>
using namespace std;

int main() {
    int n, m = 0, p = 1, c;
    cin >> n;
    do {
        c = n % 10;
        if (c % 2 == 1) {
            m = m + c * p;
            p = p * 10;
        }
        n = n / 10;
    } while (n != 0);
    cout << m;
    return 0;
}

Observă trei lucruri: m ← 0; p ← 1 au devenit inițializări la declarare; corpul lui dacă are două instrucțiuni, deci are nevoie de acolade; condiția până când n = 0 a devenit while (n != 0).

Al doilea exemplu: pentru cu pas negativ

citește n (număr natural nenul)
pentru i ← n, 1, -1 execută
    dacă n % i = 0 atunci
        scrie i, ' '

Algoritmul afișează divizorii lui n în ordine descrescătoare; pentru n = 12 se afișează 12 6 4 3 2 1. Corpul buclei are o singură instrucțiune (dacă), deci acoladele sunt opționale:

#include <iostream>
using namespace std;

int main() {
    int n, i;
    cin >> n;
    for (i = n; i >= 1; i--)
        if (n % i == 0)
            cout << i << ' ';
    return 0;
}

Cele două detalii care contează aici sunt condiția i >= 1 (nu i <= 1, care ar opri bucla imediat) și spațiul afișat după fiecare divizor.

Capcana 1: condiția de la repetă

Este cea mai frecventă greșeală la acest item. repetă … până când se oprește când condiția devine adevărată; do … while continuă cât timp condiția e adevărată. Deci condiția se neagă. Dacă e compusă, folosește legile lui De Morgan sau, mai sigur, pune toată condiția între paranteze și neag-o cu !:

// până când x = 0 sau y > 10
} while (!(x == 0 || y > 10));
// echivalent: while (x != 0 && y <= 10);

Capcana 2: acoladele lipsă

În pseudocod, liniile verticale arată ce instrucțiuni aparțin unei structuri. În C++, dacă după if, while sau for urmează mai multe instrucțiuni, ai nevoie de acolade. Fără ele, doar prima instrucțiune aparține structurii, iar programul face altceva decât algoritmul. Pune acolade de fiecare dată când ai dubii — acoladele în plus nu sunt o greșeală.

Capcana 3: limitele lui pentru

pentru i ← 1, n include și valoarea n, deci condiția e i <= n, nu i < n. Când pasul e negativ, condiția se inversează: pentru i ← n, 1, -1 devine for (i = n; i >= 1; i--). La un pas diferit de ±1, de exemplu pentru i ← 2, n, 2, scrii for (i = 2; i <= n; i = i + 2).

Capcana 4: tipul variabilelor

Pseudocodul nu declară variabilele, dar tu trebuie să o faci. Uită-te la paranteza de lângă citește:

Și reversul: dacă în pseudocod apare [a/b] cu a și b întregi, iar tu ai declarat a ca double, împărțirea nu mai e întreagă. Păstrează întregii întregi.

Capcana 5: formatul afișării

Dacă algoritmul scrie mai multe valori, de exemplu într-o buclă cu scrie i, ' ', programul trebuie să afișeze și spațiile. Fără ele, 10 7 4 1 devine 10741 — alt rezultat. Tradu caracter cu caracter tot ce apare după scrie.

La BAC: nu uita structura completă a programului: #include <iostream>, using namespace std;, declararea variabilelor și funcția main. Cerința e un program, nu o secvență, iar fiecare dintre aceste elemente poate fi punctat.

Verificarea finală

După ce ai scris programul, rulează-l mental pe datele de la punctul a). Dacă obții același rezultat pe care l-ai găsit acolo, ai o confirmare bună că traducerea e corectă. Dacă nu, una dintre cele două e greșită — și merită să afli care, înainte să predai lucrarea.

De reținut