Î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

Să presupunem că vrem să rezolvăm următoarea problemă:

Aprinse

Dispunem de un calculator de buzunar care afișează cifrele în mod clasic, folosind 7 fante luminoase aprinse sau stinse. Astfel, cele zece cifre zecimale se reprezintă astfel:

Cifre afișaj electronic

Se cere ca, dat un număr de maximum 18 cifre la intrare să se afișeze numărul de fante aprinse necesare pentru a afișa acel număr pe ecranul calculatorului de buzunar.

Exemple: numărul 254 are 14 segmente aprinse (5 + 5 + 4), iar numărul 2083 are 23 de segmente (5 + 6 + 7 + 5).

Pentru a rezolva această problemă vom afla pe rând cifrele numărului, și pentru fiecare cifră în parte vom afla numărul său de segmente, pe care îl vom aduna la o sumă globală (variabilă acumulator). Întrebarea este ‘cum calculăm numărul de segmente al unei cifre date’?

Soluție fără vectori

Putem rezolva această problemă fără a folosi vectori. Pentru fiecare cifră vom avea nouă teste  if  pentru a decide ce număr adunăm:

s = 0;
while ( n > 0 ) {
cf = n % 10;
n /= 10;
if ( cf == 0 )
s += 6;
else if ( cf == 1 )
s += 2;
else if ( cf == 2 )
s += 5;
...
else if ( cf == 8 )
s += 7;
else
s += 6;
}
cout << s;

Putem scurta puțin această soluție grupând cifrele după numărul lor de segmente:

s = 0;
while ( n > 0 ) {
cf = n % 10;
n /= 10;
if ( cf == 0 || cf == 6 || cf == 9 )
s += 6;
else if ( cf == 1 )
s += 2;
else if ( cf == 2 || cf == 3 || cf == 5 )
s += 5;
else if ( cf == 4 )
s += 4;
else if ( cf == 7 )
s += 3;
else
s += 7;
}
cout << s;

Există o soluție mai bună?

Soluție cu vector

Desigur, folosind vectori. Am putea să păstrăm pentru fiecare cifră numărul ei de segmente. Vom păstra aceste numere într-un vector  nrseg[10] , pe care îl vom inițializa la începutul programului. În acest fel putem afla ușor câte segmente are o cifră: dacă cifra este  cf , atunci numărul său de segmente este  nrseg[cf] .

Iată un program posibil:

int nrseg[10];
...
nrseg[0] = 6;
nrseg[1] = 2;
nrseg[2] = 5;
nrseg[3] = 5;
nrseg[4] = 4;
nrseg[5] = 5;
nrseg[6] = 6;
nrseg[7] = 3;
nrseg[8] = 7;
nrseg[9] = 6;
s = 0;
while ( n > 0 ) {
cf = n % 10;
n /= 10;
s += nrseg[cf];
}
cout << s;

Precum observați, programul nu este cu mult mai scurt. Dar de data aceasta mare parte din program este inițializarea vectorului  nrseg[10] , instrucțiunile de atribuire. Calculul în sine ocupă doar șase linii, corpul instrucțiuni  while  este mult mai mic față de soluțiile anterioare.

Soluție cu vector preinițializat

Pentru astfel de situații, atunci când ne dorim să inițializăm un întreg vector cu multiple valori, limbajul C ne ajută să scriem ceva mai puțin. Putem atribui toate cele zece valori într-o singură linie! Această atribuire se face în aceeași linie în care declarăm vectorul. Astfel, în exemplul nostru, vom atribui cele zece valori astfel:

int nrseg[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };

Acest tip de declarație poartă denumirea de vector preinițializat. Astfel, programul nostru devine:

int nrseg[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
...
s = 0;
while ( n > 0 ) {
cf = n % 10;
n /= 10;
s += nrseg[cf];
}
cout << s;

Răspunsuri