Problemă rezolvată

Acum că știm să citim și să scriem în fișiere folosind C++, să vedem cum se leagă totul într-un program complet.

Enunț. În fișierul text numere.txt se află mai multe numere naturale din intervalul [0, 10000], scrise pe un singur rând. Să se creeze fișierul pare.out, care să conțină, câte una pe linie, doar acele valori din numere.txt care au suma cifrelor un număr par.


Rezolvare

Începem, ca de obicei, cu includerea bibliotecii <fstream> și cu declararea celor două fișiere: unul de citire și unul de scriere. Pentru că nu folosim tastatura, nu avem nevoie de <iostream>.

#include <fstream>
using namespace std;

ifstream in ("numere.txt");
ofstream out ("pare.out");

int main() {
    int n;
    while (in >> n) {
        int s = 0, aux = n;
        while (aux) {
            s += aux % 10; // adunam ultima cifra
            aux /= 10;     // eliminam ultima cifra
        }
        if (s % 2 == 0)
            out << n << '\n';
    }
    return 0;
}

Structura repetitivă while sub forma while (in >> n) se execută cât timp mai avem valori de citit din fișier. Citirea in >> n întoarce o valoare „falsă” în momentul în care s-a ajuns la sfârșitul fișierului, iar bucla se oprește.

La fiecare pas calculăm suma cifrelor numărului citit, folosind o a doua buclă: luăm pe rând ultima cifră (aux % 10) și o eliminăm (aux /= 10) până când nu mai rămâne nicio cifră. Dacă suma obținută este pară, scriem numărul în fișierul pare.out, urmat de un rând nou.

Lucrăm pe o copie aux a numărului, ca să nu pierdem valoarea originală n de care avem nevoie la scriere.


Publicitate

Exemple date de intrare - ieșire

Exemplul 1. Fișierul de intrare conține numere cu sume de cifre atât pare, cât și impare:

// numere.txt
3 10 5405 30 35 112 5123
// pare.out
5405
35
112

Au fost scrise doar 5405 (suma cifrelor 14), 35 (suma 8) și 112 (suma 4), în ordinea în care apar în fișierul de intrare.

Exemplul 2. Dacă niciun număr nu are suma cifrelor pară, fișierul de ieșire rămâne gol:

// numere.txt
900 456 8436 3684 1 412

Toate numerele de mai sus au suma cifrelor impară, așa că fișierul pare.out este creat, dar nu conține nicio valoare.