Ce vei învăța astăzi?
După această lecție vei ști să transformi un șir de cifre într-un număr (adică să convertești textul „12" în valoarea numerică 12), să transformi un număr într-un șir de cifre și să prelucrezi cifrele dintr-un text, folosind relația dintre caractere și cifre.
Caracterele cifră și cifrele numerice
Definiție: Caracterul '7' nu este cifra 7! El are codul ASCII 55. Relația de bază a conversiilor este: cifra = caracter - '0' (de exemplu '7' - '0' = 7) și caracter = cifra + '0' (de exemplu 7 + '0' = '7').
| Caracter | Cod ASCII | Caracter - '0' | Cifra numerică |
|---|---|---|---|
| '0' | 48 | 0 | 0 |
| '5' | 53 | 5 | 5 |
| '9' | 57 | 9 | 9 |
Observă: cifrele au coduri consecutive, de la 48 ('0') la 57 ('9'); de aceea diferența caracter - '0' dă exact cifra numerică.
Din șir de cifre în număr
Pentru a transforma șirul "2026" în numărul 2026 folosim formula numar = numar * 10 + cifra, aplicată pentru fiecare caracter din stânga în dreapta.
Exemplu ghidat: șirul „2026" devine 2026
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int numar = 0;
for (int i = 0; i < strlen(s); i++)
{
numar = numar * 10 + (s[i] - '0');
}
cout << "Numarul este " << numar << endl;
return 0;
}
Construirea numărului din „2026"
numarDin număr în șir de cifre
Conversia inversă se face de la dreapta la stânga: extragem ultima cifră cu n % 10, o transformăm în caracter cu + '0' și eliminăm cifra cu n / 10. La final inversăm șirul.
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
char s[101];
int k = 0;
while (n > 0)
{
s[k] = (n % 10) + '0';
k++;
n = n / 10;
}
s[k] = '\0';
for (int i = 0; i < k / 2; i++)
{
char aux = s[i];
s[i] = s[k - 1 - i];
s[k - 1 - i] = aux;
}
cout << s << endl;
return 0;
}
Ce învățăm: cifrele se extrag în ordine inversă (ultima mai întâi), deci șirul trebuie inversat; fără inversare, 2026 ar deveni "6202".
Exercițiu de completare
Completează enunțul despre conversii:
Un caracter cifră se transformă în cifra numerică scăzând caracterul ______. Invers, o cifră numerică se transformă în caracter adăugând ______. Ultima cifră a unui număr n se obține cu operația ______.
Bancă de cuvinte:
Exercițiu de completare a codului
Completează programul care calculează suma cifrelor unui șir:
Bancă de cuvinte:
Test de înțelegere
Test rapid - șiruri și cifre:
1. Cum transformăm caracterul '7' în cifra 7?
2. Cum transformăm cifra 7 în caracterul '7'?
3. La transformarea șirului „2026" în număr, ce facem la fiecare pas?
'5' cu valoarea 5: '5' are codul ASCII 53, iar valoarea 5 se obține cu '5' - '0'. O sumă sau o comparație făcută pe codurile caracterelor dă rezultate complet greșite.Aprofundare
Cazuri particulare și detalii avansate:
- De ce
s[i] - '0'? Codurile ASCII ale cifrelor sunt consecutive (48 pentru '0', 49 pentru '1' ... 57 pentru '9'); diferența dintre caracter și'0'dă exact valoarea numerică a cifrei. - Formula de construire:
numar = numar * 10 + cifra„mută" cifrele existente cu o poziție la stânga și adaugă cifra nouă. Pentru"2026": 2, apoi 20, apoi 202, apoi 2026. - Caractere care nu sunt cifre: dacă șirul poate conține și alte caractere, testăm
s[i] >= '0' && s[i] <= '9'înainte de conversie; altfel rezultatul este greșit. - Număr în șir: extragem cifrele cu
n % 10de la coadă la cap, le transformăm în caractere cucifra + '0'și, la final, inversăm șirul obținut (sau scriem înapoi cu o parcurgere inversă). - Numărul 0 produce șirul
"0"printr-un caz particular: dacăn = 0, șirul rezultat este chiar'0'.
Conversia șir-cifră apare la fiecare problemă cu numere scrise ca text (numere de telefon, CNP, coduri), iar conversia inversă apare la afișarea rezultatelor cu un anumit format.
PbInfo - Suma cifrelor
Enunț:
Cerință: Se citește un șir format doar din cifre. Să se afișeze suma cifrelor din șir.
Date de intrare:
Programul citește de la tastatură șirul de cifre.
Date de ieșire:
Programul va afișa suma cifrelor.
Restricții și precizări:
Șirul are cel mult 100 de caractere și conține doar cifre.
Exemplu:
Intrare:
2026
Ieșire:
10
Cum gândim soluția:
- Citim șirul cu
cin >> s - Parcurgem fiecare caracter și adunăm
s[i] - '0' - Afișăm suma
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int suma = 0;
for (int i = 0; i < strlen(s); i++)
{
suma = suma + (s[i] - '0');
}
cout << suma;
return 0;
}
Ce învățăm: s[i] - '0' transformă fiecare caracter-cifră în valoarea numerică pe care o putem aduna.
PbInfo - Numărul și dublul său
Enunț:
Cerință: Se citește un șir de cifre care reprezintă un număr natural n. Să se afișeze dublul numărului n.
Date de intrare:
Programul citește de la tastatură șirul de cifre.
Date de ieșire:
Programul va afișa valoarea 2 * n.
Restricții și precizări:
Șirul are cel mult 100 de caractere și conține doar cifre.
Exemplu:
Intrare:
2026
Ieșire:
4052
Cum gândim soluția:
- Transformăm șirul în număr cu formula
numar = numar * 10 + (s[i] - '0') - Afișăm
numar * 2
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int numar = 0;
for (int i = 0; i < strlen(s); i++)
{
numar = numar * 10 + (s[i] - '0');
}
cout << numar * 2;
return 0;
}
Ce învățăm: odată transformat șirul în număr, putem folosi toate operațiile aritmetice cunoscute.
Exercițiul Practic: conversii între șiruri și numere
Sarcini de lucru
Completează următoarele sarcini pentru a exersa conversiile
Sarcina 1: Numărul inversat
Cerință: Scrie un program C++ complet care citește un șir de cifre, îl transformă în număr și afișează numărul inversat. Pentru intrarea 1234 se afișează 4321.
Soluție pentru Sarcina 1:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin >> s;
int numar = 0;
for (int i = 0; i < strlen(s); i++)
{
numar = numar * 10 + (s[i] - '0');
}
int invers = 0;
while (numar > 0)
{
invers = invers * 10 + numar % 10;
numar = numar / 10;
}
cout << invers;
return 0;
}
Verifică: pentru intrarea 1234, programul afișează 4321.
Sarcina 2: Cifrele dintr-un text mixt
Cerință: Scrie un program C++ complet care citește un text format din litere și cifre și afișează suma tuturor cifrelor din text. Pentru intrarea bac2si6cifre1 se afișează 9 (2 + 6 + 1).
Soluție pentru Sarcina 2:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[101];
cin.getline(s, 101);
int suma = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
suma = suma + (s[i] - '0');
}
}
cout << suma;
return 0;
}
Verifică: condiția s[i] >= '0' && s[i] <= '9' selectează doar caracterele cifră dintr-un text mixt.