Informatică Liceu (9-12)

Probleme de simulare si prelucrare a fisierelor text (Bac)

Problemele de simulare si prelucrare a fisierelor text sunt frecvente in cadrul examenului de Bacalaureat la Informatica, atat la nivel de teorie, cat si la proba practica. Un fisier text este o colectie de caractere (litere, cifre, spatii, semne de punctuatie) organizata pe linii, fiecare linie terminandu-se cu caracterul newline ('\n'). In limbajul C++, lucrul cu fisiere text se realizeaza prin biblioteca <fstream>, utilizand clasele ifstream (pentru citire) si ofstream (pentru scriere).

Este esential sa intelegem cum se deschid, se inchid si se parcurg fisierele, precum si modurile de citire: caracter cu caracter (get), linie cu linie (getline), sau pe baza tipurilor de date (>>). Simularea presupune executarea pas cu pas a unui algoritm pe un set de date citit dintr-un fisier, urmarind modificarea variabilelor si a continutului fisierului. Prelucrarea implica transformarea datelor: filtrare, numarare, cautare, sortare, sau generarea unui nou fisier.

Un aspect important este tratarea corecta a spatiilor si a liniilor goale. De exemplu, citirea cu >> sare peste spatii si newline-uri, in timp ce getline citeste intreaga linie, inclusiv spatiile, dar nu si caracterul newline. Pentru a citi numere separate prin spatii, se poate folosi >>, iar pentru a citi text cu spatii, se recomanda getline.

Problemele de simulare necesita atentie la schimbarea starii: daca un fisier contine comenzi, trebuie interpretat fiecare cuvant sau numar. De asemenea, trebuie gestionata deschiderea fisierului: daca acesta nu exista, fluxul va fi in stare de eroare. Examenul Bac presupune rezolvarea unor cerinte precum: determinarea numarului de cuvinte dintr-un fisier, calcularea sumei numerelor, extragerea liniilor care contin anumite pattern-uri, sau simularea unui proces (de exemplu, parcurgerea unui sir de instructiuni scrise in fisier).

In cazul problemelor de simulare, se da un fisier de intrare, iar programul trebuie sa execute operatiile descrise si sa produca un fisier de iesire. Recomand sa desenati pe hartie evolutia variabilelor. Pentru prelucrare, se parcurge fisierul o singura data sau de mai multe ori, in functie de cerinta.

Un exemplu tipic: se citeste un fisier cu numere reale, iar programul scrie in alt fisier numai numerele pozitive. O alta cerinta comuna este sa se numere cate linii dintr-un fisier contin exact o vocala. In concluzie, stapanirea acestor tehnici presupune practica intensa cu fisiere text, intelegerea modurilor de citire/scriere si a diferentelor dintre acestea, precum si capacitatea de a simula mental executia unui algoritm.

Exemple

  • Exemplul 1: Se da fisierul 'date.in' cu urmatorul continut: '5 12 8 3'. Sa se scrie un program care citeste numerele din fisier, le inmulteste pe toate si scrie rezultatul in 'rezultat.out'. Rezolvare: #include <iostream>, #include <fstream> using namespace std; int main() { ifstream fin('date.in'); ofstream fout('rezultat.out'); int x, prod = 1; while (fin >> x) { prod *= x; } fout << prod; fin.close(); fout.close(); return 0; } Explicatie: se citeste pe rand fiecare numar intreg, se acumuleaza produsul, iar la sfarsit se scrie. Atentie: daca fisierul nu exista, programul va esua; de aceea se verifica starea fluxului.
  • Exemplul 2: Se da fisierul 'text.in' care contine mai multe linii de text. Sa se scrie un program care numara cate cuvinte sunt in fisier (un cuvant este o secventa de caractere separate printr-un spatiu sau newline). Rezolvare (varianta cu getline): #include <iostream>, #include <fstream>, #include <string>, #include <sstream> using namespace std; int main() { ifstream fin('text.in'); string linie; int nrCuv = 0; while (getline(fin, linie)) { stringstream ss(linie); string cuv; while (ss >> cuv) { nrCuv++; } } cout << nrCuv; fin.close(); return 0; } Explicatie: se citeste cate o linie, apoi se parseaza linia in cuvinte cu ajutorul stringstream. Alternativ, se poate citi caracter cu caracter si numara tranzitiile spatiu-litera.
  • Exemplul 3: Se da fisierul 'comenzi.in' care contine pe fiecare linie o comanda de forma 'ADD numar' sau 'PRINT'. Sa se simuleze comportamentul: la ADD se adauga numarul intr-o lista, la PRINT se scrie in 'output.out' suma numerelor din lista. Exemplu continut: ADD 10, ADD 5, PRINT, ADD 3, PRINT. Rezolvare: #include <iostream>, #include <fstream>, #include <string>, #include <sstream> using namespace std; int main() { ifstream fin('comenzi.in'); ofstream fout('output.out'); string linie; int suma = 0; while (getline(fin, linie)) { stringstream ss(linie); string comanda; ss >> comanda; if (comanda == 'ADD') { int nr; ss >> nr; suma += nr; } else if (comanda == 'PRINT') { fout << suma << endl; } } fin.close(); fout.close(); return 0; } Explicatie: se simuleaza o masina simpla care retine o suma. Fiecare linie este interpretata. La ADD se actualizeaza suma, la PRINT se scrie suma curenta in fisierul de iesire.

Concepte cheie: Deschiderea si inchiderea fisierelor (ifstream, ofstream, close), Citirea cu >> vs getline (diferente privind spatiile si newline), Parcurgerea fisierului pana la EOF (end-of-file) folosind while (fin >> var), Scrierea in fisier cu << si endl, Simularea unui proces pe baza comenzilor din fisier (interpretare secventiala)

Vrei exerciții pe lecția asta + AI care te ajută pas cu pas?
Cont gratuit — 20 întrebări AI/zi, exerciții nelimitate.

Creează cont