Înapoi la curs

Curs de pregătire a examenului de bacalaureat la informatică

  1. Informații administrative
    Prezentarea instructorului
  2. Despre conținutul cursului
  3. Status teme
  4. Cursuri
    1. Abordarea examenului de bacalaureat la informatică
    5 Subiecte
    |
    1 Evaluare
  5. 2. Tipuri de date simple, operații în limbajul C / C++ și logică matematică
    7 Subiecte
    |
    1 Evaluare
  6. 3. Anatomia unui program; pseudocod
    7 Subiecte
    |
    1 Evaluare
  7. 4. Algoritmi elementari
    4 Subiecte
    |
    1 Evaluare
  8. 5. Vectori, vectori de frecvență, vectori predefiniți
    9 Subiecte
  9. 6. Matrici, bordarea matricilor, vectori de direcție
    8 Subiecte
    |
    1 Evaluare
  10. 7. Aplicații vectori și matrici
    5 Subiecte
    |
    1 Evaluare
  11. 8. Structuri și subprograme
    4 Subiecte
    |
    1 Evaluare
  12. 9. Recursivitate, divide et impera și backtracking
    5 Subiecte
    |
    1 Evaluare
  13. 10. Aplicații
    3 Subiecte
  14. 11. Caractere și lucrul cu șiruri de caractere
    5 Subiecte
    |
    1 Evaluare
  15. 12. Tipuri de date abstracte și liste
    6 Subiecte
    |
    1 Evaluare
  16. 13. Recapitulare și evaluare
    1 Subiect
  17. 14. Grafuri neorientate
    5 Subiecte
  18. 15. Exerciții și probleme cu grafuri
    2 Subiecte
  19. 16. Grafuri orientate și arbori
    6 Subiecte
    |
    1 Evaluare
  20. 17. Implementarea unui algoritm de tip backtracking (suplimentar)
    5 Subiecte
  21. 18. Recapitulare și evaluare (2)
    4 Subiecte
  22. 19. Recapitulare și evaluare (3)
    2 Subiecte
    |
    1 Evaluare
  23. 20. Recapitulare și evaluare (4)
    4 Subiecte
Parcursul lecției
0% Finalizat

Exercițiul 1

S-a notat cu x%y restul împărţirii numărului natural x la numărul natural nenul y şi cu [z] partea întreagă a numărului real z .
a) Scrieţi valoarea afişată dacă pentru x se citeşte valoarea 4589 şi pentru y se citeşte valoarea 723. (6p.)
b) Scrieţi toate perechile de valori care pot fi citite pentru x şi y astfel încât valoarea afişată să fie 200. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat în care să se înlocuiască structura repetă…până când cu o structură repetitivă cu test iniţial. (6p.)

citeşte x,y (numere naturale nenule)
t←0
u←1
┌repetă
│┌dacă x%10 > y%10
││atunci
││ z ← x%10
││altfel
││ z ← y%10
│└■
│t←t+z*u
│u←u*10
│x←[x/10]
│y←[y/10]
└până când x=0 şi y=0
scrie t

Rezolvare

Punctul a).

După cum se observă, algoritmul păstrează în variabila z cea mai mare ultima cifră dintre numerele x și y . Apoi, construiește în t un număr format din cele mai mari cifre ale lui x și y , păstrând ordinea acestora. Numărul t va avea tot atâtea cifre cât cel mai mare număr dintre cele două.

Deci, în cazul x = 4589 și y = 723 , numărul t = 4789 .

Punctul b).

Pentru t = 200 , trebuie ca

  • cifra maximă a unităților și zecilor să fie 0.
  • cifra maximă a sutelor să fie 2.

Deci, sunt doar două posibilități: 100 și 200. Trebuie perechi formate din aceste 2 numere: (100, 200), (200, 100).

Punctul c).

#include <iostream>
using namespace std;
int main()
{
int x, y, t, u, z;
cin >> x >> y;
t = 0;
u = 1;
do {
if( x % 10 > y % 10 )
z = x % 10;
else
z = y % 10;
t = t + z * u;
u = u * 10;
x = x / 10;
y = y / 10;
} while (x != 0 || y != 0); //in pseudocod este pana cand, 
//deci folosim valoare de adevar opusa
cout << t;
return 0;
}

Punctul d).

Vom folosi structura cât timp….execută. Atenție, atunci când trecem de la până când la cât timp să nu greșim. Toate condițiile din testul de adevăr trebuie să fie negate!

citeşte x,y (numere naturale nenule)
t←0
u←1
┌cât timp x≠0 sau y≠0 execută
│┌dacă x%10 > y%10
││atunci
││ z ← x%10
││altfel
││ z ← y%10
│└■
│t←t+z*u
│u←u*10
│x←[x/10]
│y←[y/10]
└■
scrie t

Se observă că nu este nevoie să facem nimic special pentru această modificare, decât să avem grijă la condiție. De ce oare?

Exercițiul 2

S-a notat cu x%y restul împărţirii numărului natural x la numărul natural nenul y .
a) Scrieţi valoarea afişată în urma executării algoritmului dacă se citesc, în ordine, valorile: 5, 14, 6, 15, 16, 90. (6p.)
b) Ştiind că valoarea citită pentru x este 7, scrieţi un şir de numere distincte care pot fi citite în continuare astfel încât valoarea afişată să fie 0. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat în care să se înlocuiască structura pentru…execută cu o structură repetitivă cât timp…execută. (6p.)

citeşte x
(număr natural nenul)
nr ← 0
┌pentru i←1,x execută
│ citeşte n (număr întreg)
│┌dacă n%x=0 atunci
││ nr←nr+1
│└■
└■
scrie nr

Rezolvare

Punctul a).

Este un exercițiu simplu. Se citesc x numere și se contorizează divizibilitatea acestora la x . Pentru x = 5 , răspunsul este nr = 2 .

Punctul b).

Orice șir de 7 numere care nu sunt divizibile cu 7.

Exemplu: 1 2 3 4 5 6 8

Punctul c).

#include <iostream>
using namespace std;
int main()
{
int x, n, nr, i;
cin >> x;
nr = 0;
for ( i = 1; i <= x; i++) {
cin >> n;
if ( n % x == 0 )
nr = nr + 1;
}
cout << nr;
return 0;
}

Punctul d).

Vom transform structura pentru…execută cu cât timp…execută.

citeşte x
(număr natural nenul)
nr ← 0
i ← 1
┌cât timp i <= x execută
│ citeşte n (număr întreg)
│┌dacă n%x=0 atunci
││ nr←nr+1
│└■
└■
scrie nr

Exercițiul 3

S-a notat cu [x] partea întreagă a numărului real x şi cu a%b restul împărţirii numărului întreg a la numărul întreg nenul b .

a) Scrieţi valoarea care se va afişa pentru n=8291 . (6p.)
b) Scrieţi o valoare de 5 cifre distincte care poate fi citită pentru variabila n astfel încât numărul afişat să fie 7080. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat, în care să se înlocuiască structura repetă…până când cu o structură repetitivă de alt tip. (6p.)

citeşte n (număr natural)
r←0
┌repetă
│ r←(r*10+n%10)*10
│ n←[n/100]
└până când n<10
scrie r

Rezolvare

Punctul a).

Acest algoritm este o modificare a algoritmului de răsturnare. În loc să răsturnăm cifră cu cifră, luăm doar jumătate din ele ( n / 100 ) și la formarea răsturnatului, fiecare adăugăm un 0 (înmulțirea cu 10 de la final).

Astfel că, r = 1020 .

Punctul b).

Având explicația anterioară, trebuie să găsim numere care să obțină r = 7080 . Deci, trebuie să aibă cifra unităților 7 și cea a sutelor 8, de forma ab8c7.

Exemplu: 12837

Punctul c).

#include <iostream>
using namespace std;
int main()
{
int n, r;
cin >> n;
do {
r = ( r * 10 + n % 10 ) * 10;
n = n / 100;
} while (n >= 10); //atentie la implementare, era pana cand
cout << r;
return 0;
}

Punctul d).

În pseudocod, varianta inițială avea structura repetă…până când. Deci, la modificare, trebuie să negăm condiția. Nu trebuie să facem alte modificări. De ce?

citeşte n (număr natural)
r←0
┌cât timp n >= 10 execută
│ r←(r*10+n%10)*10
│ n←[n/100]
└■
scrie r

Exercițiul 4

S-a notat cu a%b restul împărţirii numărului natural a la numărul natural nenul b , iar cu [a/b] câtul împărţirii întregi a numărului natural a la numărul natural nenul b .

a) Scrieţi numărul care se va afişa dacă se citesc pentru n valoarea 528791 şi pentru k valoarea 6. (6p.)
b) Dacă pentru k se citeşte valoarea 9 scrieţi toate valorile formate din exact 5 cifre care se pot citi pentru variabila n , astfel încât rezultatul afişat să fie, de fiecare dată, 2008. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat care să utilizeze în locul structurii cât timp…execută o structură repetitivă condiţionată posterior. (6p.)

x ← 0
citeşte n,k
(numere naturale nenule)
┌cât timp n≠0 execută
│ ┌dacă n%10<k atunci
│ │ x ← x*10 + n%10
│ └■
│ n ← [n/10]
└■
scrie x

Rezolvare

Punctul a).

O altă variație a răsturnatului unui număr, doar că vom folosi doar cifrele mai mici decât k .

Deci, pentru n = 528791 și k = 6 , x = 125 .

Punctul b).

Pentru a obține x = 2008 , iar k = 9 , trebuie să îl punem pe 9 undeva unde să nu ne afecteze. Iar 2008, trebuie să fie inversat, adică 8002. Iată numerele din 5 cifre care respectă condițiile date: 80020, 80029, 80092, 80902, 89002, 98002.

Punctul c).

#include <iostream>
using namespace std;
int main()
{
int n, k, x;
cin >> n >> k;
while ( n != 0 ){
if ( n % 10 < k )
x = x * 10 + n % 10;
n = n / 10;
}
cout << x;
return 0;
}

Punctul d).

x ← 0
citeşte n,k
(numere naturale nenule)
┌repetă
│ ┌dacă n%10<k atunci
│ │ x ← x*10 + n%10
│ └■
│ n ← [n/10]
└cât timp n≠0
scrie x

Exercițiul 5

S-a notat cu x%y restul împărţirii numărului natural x la numărul natural nenul y .
a) Scrieţi ce se va afişa pentru x=8 . (6p.)
b) Scrieţi toate numerele naturale, de câte o singură cifră, care, citite pentru x , determină afişarea valorii 4. (6p.)
c) Scrieţi în pseudocod un algoritm echivalent cu cel dat care să nu utilizeze nicio structură repetitivă. (4p.)
d) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)

citeşte x (număr întreg)
┌dacă x<0 atunci
│ x ← -x
└■
p ← 1
┌pentru i←1,x execută
│ p ← (p*4)%10
└■
scrie p

Rezolvare

Punctul a).

Ne suflecăm mânecile și scriem primele valori de calcul:

 x = 1; p = ( 1 * 4 ) % 10 = 4
x = 2; p = ( 4 * 4 ) % 10 = 6
x = 3; p = ( 6 * 4 ) % 10 = 4 // hopa se repetă

Deci, observăm deja o repetiție în cod. Pare că pentru x par, returnăm 6, altfel returnăm 4.

De ce am ignorat prima parte? Pentru că x trebuie să fie pozitiv orice ar fi.

Cât ne va da dacă x = 8 ? p = 6 .

Punctul b).

Am răspuns deja mai sus. Orice x impar.

Punctul c).

Dacă am înțeles algoritmul la punctul a)., rezolvarea este banală.

citeşte x (număr întreg)
┌dacă x = 0 atunci
│ scrie 1
│ altfel
│ ┌dacă x % 2 = 0 atunci
│ │ scrie 6
│ │ altfel
│ │ scrie 4
│ └■
└■
scrie p

Punctul d).

#include <iostream>
using namespace std;
int main()
{
int n, k, x;
cin >> n >> k;
do {
if ( n % 10 < k )
x = x * 10 + n % 10;
n = n / 10;
}  while ( n != 0 );
cout << x;
return 0;
}

Răspunsuri