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
| Pseudocod | C++ |
|---|---|
x ← 5 | x = 5; |
a = b (în condiții) | a == b |
a ≠ b, a ≤ b, a ≥ b | a != b, a <= b, a >= b |
și, sau | &&, || |
[a/b] (a, b întregi) | a / b |
[x] (x real, pozitiv) | (int)x |
a % b | a % b |
citește a, b | cin >> a >> b; |
scrie a, ' ', b | cout << a << ' ' << b; |
dacă c atunci … altfel … | if (c) { … } else { … } |
cât timp c execută … | while (c) { … } |
repetă … până când c | do { … } 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:
- „număr natural” sau „număr întreg” →
int, dacă valorile încap (până la circa 2·10⁹); - dacă algoritmul construiește un număr nou din cifre sau înmulțește valori mari, gândește-te dacă nu ai nevoie de
long long; - „număr real” →
double. Atenție: dacă x e real,[x]nu se mai traduce prin împărțire întreagă, ci prin conversie:(int)x.
Ș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.
#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
- ●
←devine=, iar=devine==;≠devine!=;și/saudevin&&/||. - ●
[a/b]pe întregi este pur și simplua / b; pentru un real x,[x]devine(int)x(pe valori pozitive). - ●
repetă … până când cdevinedo { … } while (!(c));. - ●
pentru i←a,bdevinefor (i = a; i <= b; i++); cu pas negativ:i >= bșii--. - ● Declară toate variabilele, alege
long longsaudoublecând enunțul o cere și păstrează exact formatul afișării.