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:

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