You are on page 1of 4

Clasa a IX-a A, E

Prelucrarea valorilor din fiier cnd nu se cunoate numrul acestora

1. Prezentare general
Exist cazuri cnd nu tim exact cte valori conine fiierul de intrare. Enunul problemei apare sub urmtoarea
form: Fiierul de intrare conine valori de tipul separate printr-un spaiu (sau fiecare valoare pe o
linie). Din enun nu rezult numrul de valori coninut de fiierul de intrare, ci doar faptul c aceste valori apar
n fiier. Desigur,acestea fiind date de intrare vor trebui citite i prelucrate. n cazul unui ir nedeterminat de
valori, problema este c nu tim cnd anume ne oprim din citit i prelucrat.

Va trebui s citim i s prelucrm tot din fiier. Vom folosi o funcie ataat variabilelor tip fiier de intrare,
funcia eof (End Of File = Sfarsit De Fisier) Aceast funcie verific dac mai exist valori pn la sfritul
fiierului.

nume_logic_fisier.eof() are valoarea 1 daca pana la sfarsitul fisierului nu mai exista nici o
valoare nume_logic_fisier.eof() are valoarea 0 daca pana la sfarsitul fisierului mai exista valori.

Forma general pentru a citi i prelucra valorile din fiier este urmtoarea:

while (! nume_logic_fisier.eof() ) //cat timp nu este sfarsitul fisierului


{
nume_logic_fisier >>x;//citeste data din fisier
//prelucreaza data citita;
}

Exemplu:
.................. ..................
ifstream f(....... ); ifstream in(....... );
//fisier de intrare cu nume logic f //fisier intrare cu nume logic in
.................. ..................
while (!f.eof() ) while (!in.eof() )
//cat timp nu e sfarsitul fisierului //cat timp nu e sfarsitul fisierului
{ {
f >>n;//citeste data din fisier in>>n;//citeste data din fisier
//prelucreaza data citita; //prelucreaza data citita;
} }
.................. ..................

2. Aplicaii
Fiierul numere.in conine un numr natural k, iar pe a doua linie o serie de valori naturale, separate printr-un
spaiu. S se determine i s se afieze n fiierul numere.out, cte numere de pe a doua linie a fiierului de
intrare sunt multiplu de k.
Exemplu:
numere.in numere.out Explicaie
7 5 Exist 5 numere (49, 91, 0, 70, 35) n fiierul de intrare
17 49 8 91 0 12 100 70 35 99 13 care sunt multiplu de 7.

1
Clasa a IX-a A, E

Rezolvare: Se citete k i apoi se citesc valorile de pe a doua linie. Cum nu tim cte valori exist va trebui s
folosim modalitatea de citire i prelucrare descris mai sus. O variabil nr va reine numrul de valori multiplu
de k. Prelucrarea va nsemna faptul c, dac o valoare citit este multiplu de k, atunci valoarea variabilei nr va
crete cu o unitate.
..................//biblioteci,namespace

ifstream f(numere.in);//fisier de intrare cu nume logic f


ofstream g(numere.out);//fisier de iesire cu nume logic g

int k;//k-valoarea de pe prima linie


int n;//n-valorile citite de pe a doua linie
int nr;// numarul de valori multiplu de k

int main()
{

f>>k; //citim k-valoarea de pe prima linie


nr = 0; //numaratoarea incepe de la 0

while (!f.eof()) //cat timp nu e sfarsitul fisierului


{
f >>n;//citeste data din fisier
//prelucreaza data citita;
if(n % k == 0)//daca n este multiplu de k atunci
{
nr++; //creste numarul de valori multiplu de k
}//sfarsit if
}//sfarsit while

g<<nr;//afisez rezultatul in fisier

f.close();g.close();//inchidere fisiere

return 0;

Fiierul divpr.in conine o serie de numere naturale separate printr-un spaiu. Pentru fiecare valoare din fiierul
de intrare, s se afieze n fiierul divpr.out numrul de divizori proprii. Valorile vor fi afiate pe un singur rnd,
desprite printr-un spaiu.
Exemplu:
divpr.in divpr.out
10 23 100 17 18 15 2 2060420
Rezolvare: nu cunoatem cte valori avem n fiierul de intrare. Prin urmare, va trebui s citim toate valorile
pn la sfritul fiierului i s prelucrm fiecare valoare citit. Prelucrarea nseamn pentru aceast problem

2
Clasa a IX-a A, E

determinarea numrului de divizori proprii pentru fiecare valoare citit. Adic, s aplicm un algoritm de
prelucrare a divizorilor. V mai amintii lecia? Vom genera toate valorile care pot fi divizori proprii ai unui
numr, i dintre aceste valori vom numra acele valori care efectiv sunt divizori.
..................//biblioteci,namespace

..................;//fisier de intrare
..................;//fisier de iesire

.................. //declaratii date de intrare si date de iesire

int main()
{

..................//cat timp nu e sfarsitul fisierului


{
..................//citeste data din fisier
//prelucreaza data citita;
.......//initializare nr. divizori (de la ce valoare incepe numaratoarea?)
for(d=...;d<=;d++)//generam posibilii divizori proprii(intre ce valori?) {

........//daca valoarea citita este multiplu de d atunci


{
......... //creste numarul de divizori proprii
}//sfarsit if

}//sfarsit for

.....;//afisez numarul de divizori proprii urmat de un spatiu

}//sfarsit while

...............//inchidere fisiere

return 0;

Fiierul sumcif.in conine o serie de numere naturale separate printr-un spaiu. Pentru fiecare valoare din
fiierul de intrare, s se afieze n fiierul sumcif.out suma cifrelor. Valorile vor fi afiate pe un singur rnd,
desprite printr-un spaiu.
Exemplu:
sumcif.in sumcif.out
2552 131 79 7 989 232323 81100 14 5 16 7 26 15 10
Rezolvare: nu cunoatem cte valori avem n fiierul de intrare. Prin urmare, va trebui s citim toate valorile
pn la sfritul fiierului i s prelucrm fiecare valoare citit. Prelucrarea nseamn pentru aceast problem
determinarea sumei cifrelor pentru fiecare valoare citit. Adic, s aplicm un algoritm de prelucrare a cifrelor

3
Clasa a IX-a A, E

unui numr. V mai amintii lecia? Ct timp numrul are cifre, calculm ultima cifr, prelucrm
ultima cifr, i eliminm ultima cifr.
..................//biblioteci,namespace

..................;//fisier de intrare
..................;//fisier de iesire

.................. //declaratii date de intrare si date de iesire

int main()
{

..................//cat timp nu e sfarsitul fisierului


{
..................//citeste data din fisier
//prelucreaza data citita;
.......//initializare suma cifrelor (care e valoarea sumei daca nu am
adunat)
............//cat timp numarul are cifre
{
........//calculam ultima cifra
........//prelucram ultima cifra (ce inseamna prelucrare?)
......... //eliminare ultima cifra
}//sfarsit cat timp numarul are cifre

.....;//afisez suma cifrelor urmata de un spatiu

}//sfarsit while

...............;//inchidere fisiere

return 0;