Pseudocod BAC: trasare și transformare în C++
Învață să urmărești pseudocodul la BAC, să transformi buclele corect și să scrii programul C++ echivalent, cu exemple și întrebări explicate.
În acest material
Pseudocodul descrie pașii unui algoritm fără toate detaliile sintactice ale unui limbaj de programare. La rezolvare trebuie să păstrezi ordinea operațiilor, tipurile numerice și momentul verificării condițiilor. Traducerea în C++ nu înseamnă doar înlocuirea cuvintelor românești cu instrucțiuni.
Exemplele de aici sunt originale și servesc exercițiului de trasare. Pentru o variantă de examen, citește convențiile și cerințele documentului respectiv din arhiva BAC. Nu presupune că orice notație are aceeași semnificație în toate materialele.
Cum construiești tabelul de execuție
Scrie o coloană pentru fiecare variabilă care se schimbă și o coloană pentru ieșire. Notează starea inițială înainte de prima instrucțiune repetată. La fiecare pas actualizează numai variabilele atribuite, folosind valorile curente, nu valorile de la începutul întregii iterații dacă între timp s-au schimbat.
De exemplu, după x←x+1 și apoi y←x*2, a doua atribuire folosește noul x. Dacă x era 3, devine 4 și y primește 8. Execuția secvențială este importantă mai ales când două variabile par să își schimbe valorile reciproc. Pentru o interschimbare, o atribuire directă urmată de alta poate pierde una dintre valorile inițiale.
Exemplu: suma cifrelor
Considerăm n natural între zero și un miliard. Inițializăm suma cu zero. Cât timp n>0, adăugăm restul împărțirii la zece și înlocuim n cu câtul întreg al aceleiași împărțiri. La final afișăm suma.
citește n
s ← 0
cât timp n > 0 execută
s ← s + n % 10
n ← [n / 10]
scrie s
Pentru n=407, stările după iterații sunt (n=40,s=7), (n=4,s=7), apoi (n=0,s=11). La zero, bucla nu mai intră și rezultatul este 11. Pentru intrarea zero, bucla nu execută niciun pas, dar suma inițială zero este deja răspunsul corect.
Programul C++ echivalent
#include <iostream>
int main() {
int n;
std::cin >> n;
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
std::cout << sum << '\n';
}
Împărțirea n/=10 este între întregi și, pentru domeniul nenegativ declarat, corespunde eliminării ultimei cifre. Programul modifică n; dacă enunțul cere și valoarea inițială la final, păstrează o copie înainte de buclă. Timpul este proporțional cu numărul cifrelor, iar memoria auxiliară este constantă.
Transformarea structurilor repetitive
O buclă „cât timp C execută” verifică C înaintea corpului și poate avea zero iterații. O structură „repetă ... până când P” execută corpul cel puțin o dată și se oprește când P devine adevărată. Echivalentul C++ este do...while(!P), deoarece condiția lui while exprimă continuarea, nu oprirea.
Pentru a transforma un while într-o repetare cu test final, păstrează un test exterior dacă prima execuție nu este garantată. Altfel introduci o iterație care nu exista în algoritmul inițial. Pentru o buclă cu număr cunoscut de pași, un for poate fi echivalent dacă inițializarea, limitele și actualizarea contorului au aceeași semnificație.
Verifică echivalența pe un caz în care corpul nu se execută, unul cu o singură iterație și unul cu mai multe. Apoi justifică de ce aceleași stări se succed pentru toate intrările permise. Câteva exemple pot găsi greșeli, dar nu demonstrează singure echivalența generală.
Exersează
O structură repetă corpul până când x>=10. Ce condiție scrii la finalul unui do...while C++? Răspuns: x<10. Dacă scrii x>=10, inversezi continuarea și oprirea. Separat, verifică dacă algoritmul inițial garantează cel puțin o execuție a corpului.
Continuă cu buclele, cifrele unui număr și ghidul de pregătire BAC.
Întrebări frecvente
Pseudocodul poate fi compilat direct?
Nu în forma generală. Este o descriere algoritmică, iar pentru compilare trebuie exprimat într-un limbaj concret, respectând semantica operațiilor.
Ce notez într-un tabel de execuție?
Valorile variabilelor relevante după pași bine definiți și ieșirea produsă. Păstrează aceeași convenție pentru fiecare linie a tabelului.
De ce până când P devine while(!P)?
P exprimă oprirea în structura cu test final. Condiția while exprimă continuarea, deci trebuie negată.
Pot înlocui orice while cu do...while?
Nu fără să tratezi cazul de zero iterații. do...while execută corpul cel puțin o dată, iar while poate să nu îl execute deloc.
Este suficient să verific două exemple pentru echivalență?
Exemplele pot descoperi o eroare, dar nu oferă o demonstrație pentru toate intrările. Urmărește condițiile și succesiunea stărilor în mod general.