Școala Româno-Britanică
Modulul 2 Clasa a X-a | C++

Ora 7: Șiruri și cifre - conversii

Ce vei învăța astăzi: Cum transformăm un șir de cifre într-un număr și un număr într-un șir de cifre, fără funcții speciale

Rezultat practic: Scrii programe C++ care convertesc (adică transformă date dintr-o formă în alta, de exemplu textul „12" în numărul 12) între șiruri de caractere și valori numerice, rezolvând probleme cu cifre și numere (Competența 4.4).

Competența 4.4 Săptămâna 8

Înainte de a începe

De ce contează? Datele reale vin adesea ca text — coduri, CNP, numere citite dintr-un fișier — și trebuie transformate în valori numerice pentru calcul sau invers, pentru afișare. Conversiile apar în aproape fiecare subiect de examen cu șiruri.

Ce știi deja?

La ora 6 ai comparat șiruri lexicografic. Știi că 12 + 3 = 15, dar dacă „12" este un șir de caractere, nu un număr: cum ai transforma caracterele '1' și '2' în valoarea numerică 12?

Ideea-cheie: Caracterele '0''9' au coduri ASCII consecutive (fiecare caracter are un cod numeric propriu, de exemplu '0' are codul 48), deci s[i] - '0' transformă un caracter-cifră în valoarea lui numerică, iar relația numar = numar * 10 + cifra construiește numărul întreg dintr-un șir de cifre, din stânga în dreapta.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

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.

Caracterul '7' și cifra 7
Din șir de cifre în număr
Din număr în șir de cifre
Suma cifrelor dintr-un șir

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

Algoritm șirÎnNumăr citește s (șir de cifre) numar = 0 pentru i = 0 cât timp s[i] != '\0' execută cifra = s[i] - '0' numar = numar * 10 + cifra i = i + 1 sfârșit pentru scrie numar Sfârșit algoritm
C++ - conversia șir de cifre în număr
#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"
numar
s[0]='2' numar = 0 * 10 + 2 = 2
s[1]='0' numar = 2 * 10 + 0 = 20
s[2]='2' numar = 20 * 10 + 2 = 202
s[3]='6' numar = 202 * 10 + 6 = 2026

Din 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.

C++ - conversia unui număr în șir de cifre
#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:
'0' n % 10

Exercițiu de completare a codului

Completează programul care calculează suma cifrelor unui șir:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[101];
    cin >> s;
    int suma = ______;
    for (int i = 0; i < strlen(s); i++)
    {
        suma = suma + (s[i] - ______);
    }
    cout << ______;
    return 0;
}
Bancă de cuvinte:
0 '0' suma

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?

Ai grijă la: nu confunda caracterul '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 % 10 de la coadă la cap, le transformăm în caractere cu cifra + '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.

APLICARE ȘI REZOLVARE DE PROBLEME

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:
  1. Citim șirul cu cin >> s
  2. Parcurgem fiecare caracter și adunăm s[i] - '0'
  3. 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:
  1. Transformăm șirul în număr cu formula numar = numar * 10 + (s[i] - '0')
  2. 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ȚII PRACTICE

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.

Scrie pe caiet - De reținut

Titlul lecției

Ora 7: Șiruri și cifre - conversii

Definiția lecției

Conversiile transformă date dintr-o formă în alta: un șir de cifre poate deveni un număr, iar un număr poate deveni un șir de cifre. Cheia conversiilor este relația dintre caracter și cifră: s[i] - '0' transformă un caracter-cifră în valoarea numerică, iar cifra + '0' face transformarea inversă. Un șir de cifre se transformă în număr parcurgându-l de la stânga la dreapta, cu relația numar = numar * 10 + cifra. Un număr se transformă în șir extragând cifrele de la coadă cu n % 10, apoi inversând rezultatul. Cifrele au coduri ASCII consecutive, ceea ce face ca diferența caracter - '0' să dea exact cifra. Conversiile apar în probleme cu CNP, coduri și numere citite din texte.

Definiții esențiale

Algoritmul cheie - pseudocod

Algoritm șirÎnNumăr citește s numar = 0 pentru i = 0 cât timp s[i] != '\0' execută cifra = s[i] - '0' numar = numar * 10 + cifra sfârșit pentru scrie numar Sfârșit algoritm

Algoritmul cheie - cod C++

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char s[101];
    cin.getline(s, 101);

    int numar = 0;

    for (int i = 0; i < strlen(s); i++)
    {
        int cifra = s[i] - '0';
        numar = numar * 10 + cifra;
    }

    cout << numar << endl;

    return 0;
}

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Scrie un program care citește un șir de cifre și afișează numărul corespunzător, apoi dublul lui. Pentru șirul 2026, programul afișează: 2026 și 4052.

#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 << endl;
    cout << numar * 2 << endl;

    return 0;
}