RSS

Fisiere – prelucrarea valorilor

21 Nov

Despre preluarea datelor dintr-un fisier, o problema ne poate anunta ca avem

  • un numar determinat de valori: “Se citesc dintr-un fisier o valoare N si apoi N valori de tip…”
  • un numar nedeterminat de valori: “Fisierul contine un maxim 10000 de valori de tip… “

Prelucrarea unui numar determinat de valori

Evident, intai trebuie citita valoarea N si apoi, pe rand fiecare valoare din fisier, de exact N ori. Imediat dupa citire, valoarea citita poate fi prelucrata.

fin>>N;
for(I=1;I<=N;I++)
{fin>>X;
PREL X;}

Pe acest sablon se pot lucra toate problemele de la siruri de valori:

  • numarul de valori pare/impare din sir
  • de cate ori apare in sir o valoare data Y?
  • care este valoarea maxima/minima din sir?
  • cate valori din sir au o proprietate anume (numar prim, palindrom, …)

Prelucrarea unui numar nedeterminat de valori

In cazul unui sir nedeterminat de valori, problema este ca nu stim cand anume ne oprim din citit si prelucrat. Pentru aceasta, C/C++ ne vine in intampinare cu doua posibilitati de a rezolva situatia.

Varianta 1

while (fin>>X) PREL X;

Asa cum stim, instructiunea WHILE cicleaza conform rezultatului unei conditii. In acest caz, se incearca citirea din fisier a valorii X. Daca instructiunea se executa cu succes, se returneaza valoarea 1 (ADEVARAT) si putem prelucra valoarea citita. Daca citirea din fisier nu se poate realiza, se va returna valoarea 0 (FALS).

Cu aceasta situatie ne-am mai intalnit la situatii de genul

A=7;
if (A=5) cout <<” este 5″; else cout<<“nu este 5”;
 

Rezultatul acestui cod este intotdeauna “este 5“. Care este motivul? Asa cum vedeti , la intrarea in test variabila A are valoarea 7. In test A primeste valoarea 5; Instructiunea se executa corect (A poate primi valoarea 5) si sistemul returneaza valoarea 1, pentru executie corecta; In consecinta. instructiunea care se executa este cout <<” este 5″. Corect ar fi fost sa se scrie:

A=7;
if (A==5) cout <<” este 5″; else cout<<“nu este 5”;
 

Varianta 2

Aceasta varianta foloseste o functie atasata variabilelor tip fisier de intrare, functia EOF (End Of File = Sfarsit De Fisier) Aceasta functie verifica daca mai exista valori pana la sfarsitul fisierului.

  • fin.eof() are valoarea 1 daca pana la sfarsitul fisierului nu mai exista nici o valoare
  • fin.eof() are valoarea 0 daca pana la sfarsitul fisierului mai exista valori
//cat timp nu este sfarsitul fisierului….
while (! fin.eof() )
{ fin>>x;
PREL X;}
 

Probleme propuse:

  • numarul de valori pare/impare din sir
  • de cate ori apare in sir o valoare data Y?
  • care este valoarea maxima/minima din sir?
  • cate valori din sir au o proprietate anume (numar prim, palindrom, …)
  • numarul de schimbari de semn din sir
  • numarul de schimbari de paritate (par-impar si impar=par)
  • numarul de “vai” si “dealuri” (o vale este o succesiune de tipul 7-3-5; un deal este o sucesiune de tipul 3-7-5)
  • lungimea maxima a unui subsir crescator
  • lungimea maxima a unui subsir de valori cu aceeasi paritate
 
 

Tags:

4 responses to “Fisiere – prelucrarea valorilor

  1. Radu

    16/09/2016 at 02:52

    Buna seara, domnule profesor!

    Incercand sa aflu cate din numerele dintr-un sir sunt egale cu oglinditul lor, am compus urmoatorul cod:
    #include
    #include

    using namespace std;

    int n,i,x,og=0,nr=0,y,cif=0;
    ifstream fin(“date.in”);
    ofstream fout(“date.out”);

    int main()
    {
    fin>>n;
    for(i=1;i>x;y=x;
    do{cif=y%10;og=og*10+cif;y=y/10;} while(y!=0);
    if(og==x) nr++;

    cout<<"Numarul de valori care indeplinesc conditia de palindrom este = "<<nr<<endl;
    fout<<"Numarul de valori care indeplinesc conditia de palindrom este = "<<nr<<endl;
    fin.close();
    fout.close();
    return nr;
    }

    Din pacat, orice date as include in fisierul date.in, numarul returnat este 0.
    "nr" returneaza valoarea 1 doar cand primul numar din fisiser de dupa valoarea n este palindrom, dar nu numara si urmatoarele numere avand aceeasi proprietate.
    Fisierul "data.in" are urmatorul continut:

    10
    15
    22
    44
    22

    Va puteti uita, va rog, unde este greseala?

    Cu stima,

    Mica Radu

     
  2. mchelariu71

    16/09/2016 at 07:03

    1. nu il fol pe n => for(i=1;i<=n;i++)
    2. Cine e X? tb citit si apoi prelucrat
    3. pentru fiecare x trebuie sa incepi cu OG=0. altfel pornesti cu OG-ul numarului anterior
    4. mai trebuie niste acolade dar presupun ca e din cauza wordpress-ului.

     
  3. Radu

    19/09/2016 at 09:42

    Va multumesc!

    Citirea lui x era in algortimul din codeblocks, dar nu am idee de ce cand i-am dat paste s-a pierdut. In egala masura, acoladele par sa fi fost ok, dar greseala mea a fost ca nu am resetat og dupa fiecare iesire din repetitia “do”.
    Va multumesc inca o data, merge acum.
    Vroiam sa va intreb si daca exista cumva lectii referitoare la preluarea valorilor dintr-o matrice sau dintr-un vector.
    Am gasit ceva intr-un manual de clasa a IX-a, dar din pacate, modul in care se explica lasa de dorit, si cum nu studiez informatica in nicio forma de invatamant, e ceva mai greu de gasit o sursa in care explicatiile sa fie mcomplete.

    Cu stima,

    Radu Mica

     
  4. mchelariu71

    19/09/2016 at 14:13

    https://mchelariu.wordpress.com/clasa-a-10-a-info/ aici ai tot ce am facut. restul, cand am timp (dispozitie)

     

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: