Sunteți pe pagina 1din 17

LIMBAJE DE PROGRAMARE

2
Programare C

Cursul 4
Fisiere text
• Limbajul C considera ca orice fisier este o colectie de octeti care vor fi interpretati
de program.
Declararea si deschiderea fisierelor
FILE * fopen (const char * nume_fisier, const char *
mod_deschidere);
mod_deschidere poate fi:
- pentru citire: 'r' - deschide un fisier existent. Pointerul de pozitie se afla la
inceputul fisierului;
- pentru scriere: 'w' - deschide un fisier nou, ori suprascrie in fisierul cu acelasi
nume. Pointerul de pozitie se afla la inceputul fisierului.
- pentru adaugare: 'a' - daca fisierul nu exista, sistemul de operare il creeaza.
Pointerul de pozitie se afla la sfarsitul fisierului.
Functia fopen returneaza un pointer de fisier. Daca fisierul indicat nu a putut fi
deschis, pointerul va avea valoarea NULL.
Exemplu:
FILE *f;
f = fopen("matrice.in", "r");
Citirea si scrierea in fisier
• Prelucrarea datelor din fisiere se poate face: caracter cu caracter sau
linie cu linie.
Prelucrarea caracter cu caracter
Vor fi utilizate functiile: fgetc() si fputc().Sintaxa:
int fgetc(FILE * pointer_fisier); // pentru citire
int fputc(int c, FILE * pointer_fisier); // pentru afisare

< Este necesara includerea fisierului antet stdio.h.


fgetc returneaza caracterul citit, dupa conversia acestuia intr-un
intreg fara semn. In caz de eroare sau sfarsit de fisier, functia va
returna EOF.
fputc returneaza caracterul c. In caz de eroare, aceasta
returneaza EOF.
• Prelucrarea linie cu linie
Vor fi utilizate functiile: fgets() si fputs(). Sintaxa:
char * fgets (char * sir, int n, FILE * pointer_fisier);
// pentru citire
int fputs (const char * sir, FILE * pointer_fisier);
// pentru scriere

Dupa citirea/scriere unei linii de text, pointerul de pozitie


avanseaza la inceputul liniei urmatoare.
Functia fgets() citeste datele din fisier si le pune in bufferul
de caractere sir. Citirea se va efectua pana la n=-1 sau pana
la primul caracter '\n' (linie noua). Daca citirea se efectueaza
cu succes, functia va returna un pointer la sirul de caractere,
altfel (daca apare o eroare sau s-a ajuns la sfarsitul de fisier)
functia va returna NULL.
Functia fputs() scrie caracterele in sir pana la NULL. Daca
operatia se incheie cu succes, functia va returna o valoare
pozitiva, in caz contrar va returna EOF.
• Afisare cu format
Pentru a afisa informatiile conform unui format de afisare, se
utilizeaza specificatorii de format de care dispune functia fprintf.
Valorile acestora sunt cele cunoscute pentru printf.
Exemplu:
#include
FILE *f;
int main(void)
{
int n=20;
f = fopen("date.out", "w");
fprintf(f, "Valoarea lui n: %d", n);
fclose(f);
}
Dupa rularea acestui program se va creea un fisier cu numele
"date.out" in care va aparea textul:
Valoarea lui n: 20
Inchiderea fisierelor text
• Pentru inchiderea unui fisier se utilizeaza
functia fclose(). Sintaxa este urmatoarea:

int fclose (FILE * pointer_fisier);


Functii utile
• Cu fisiere text se pot efectua si alte operatii cum ar fi: redenumirea si
stergerea acestora.
Pentru schimbarea numelui unui fisier se foloseste functia rename().
Sintaxa:
int rename (const char *fisier_vechi, const char
*fisier_nou);
Redenumirea poate fi utilizata si pentru a muta un fisier dintr-un director in
altul. Daca operatia s-a incheiat cu succes, functia va returna valoarea 0,
altfel va returna -1.
Pentru stergerea fisierelor se poate utiliza functia remove(). Sintaxa este
urmatoarea:
int remove (const char *nume_fisier);
Inainte de stergere, asigurati-va ca ati inchis fisierul!
Daca operatia s-a incheiat cu succes, functia va returna valoarea 0, altfel va
returna valoarea -1.
• Exemplu:

#include <stdio.h>
int main(int argument, char *p[])
{
while(*++p)
if(remove(*p))
printf("Eroare! %s \n", *p);
getch();
}
Exemplu
Programul citeste un sir de numere, le elimina zerourile, apoi le afiseaza din nou.
• #include <stdio.h> int main()
#include <conio.h> {
#define NMAX 100 int n, i;
long nr, numere[NMAX];
long eliminare_zero(long nr) printf("Cate numere vor fi
{ citite? ");
int uc; scanf("%d", &n);
long x=0, inv=0; printf("Introduceti cele %d
while(nr!=0) numere:\n", n);
{ for(i=0; i < n; i++)
uc=nr%10; {
if(uc!=0) printf("nr%d = ", i+1);
x=x*10+uc; scanf("%ld", &nr);
nr/=10; numere[i]=eliminare_zero(nr);
} }
while(x!=0) printf("\n\nDupa eliminarea
{ zerourilor, numerele
inv=inv*10+(x%10); sunt:\n\n");
x/=10; for(i=0; i < n; i++)
} printf("%ld \n", numere[i]);
return inv; printf("Apasa o tasta pentru a
} inchide...");
getch();
return 0;
}
Recursivitate
• Recursivitatea este un mecanism general de elaborare a programelor.
Mecanismul recursivitatii consta in posibilitatea ca un subprogram sa se
autoapeleze.
Recursivitatea s-a utilizat initial pentru transcrierea formulelor matematice descrise
recursiv, ulterior extinzandu-se pentru elaborarea multor algoritmi.
Exemple:
1. La un televizor se cupleaza o camera video care filmeaza ecranul televizorului.
Pe ecran se va vedea un televizor care va prezenta un televizor... Vom vedea o serie
de televizoare din ce in ce mai mici.
2. Un descendent al unei persoane este un copil al sau un descendent al unui copil al
sau.
In exemplul 2 pentru a defini notiunea de "descendent" am folosit notiunea insasi.

• Spunem ca o notiune este definita recursiv daca in cadrul definitiei intervine insasi
notiunea care se defineste.
Intalnim procese care se exprima in termeni recursivi, sau in matematica apar
frecvent relatii recursive, denumite si relatii de recurenta.
• 1. Cea mai simpla si mai familiara functie
exprimata in termeni recursivi este factorialul:

n! = 1 daca n=0 sau n! = n * (n - 1)! daca n >


0.

unsigned long fact (int n)


{
if (n==0)
return 1;
return n * fact (n-1);
}
• 2.Sirul Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, ..., in care
primii doi termeni sunt 0 si 1, iar in rest, fiecare termen se
obtine insumand cei doi termeni care il preced.
Prin urmare, o definitie recursiva pentru sirul
lui Fibonacci este:
fib: N -> N
fib(n) = n daca n<=1 si fib(n) = fib(n-1) + fib(n-2) daca n >
1.
unsigned long fibo ( int x)
{
if (x <= 1)
return x;
return fibo (x-2) + fibo(x-1);
}
Observatie:
Este absolut necesar sa se asigure iesirea din recursivitate.
Pentru aceasta va exista o conditie de iesire.
Recursivitatea in cascada
• Daca analizam mecanismul apelurilor pentru a
calcula termenul fib(5) observam ca trebuie
calculate fib(4) o data, fib(3) de doua ori, ....
fib(1) de 5 ori...
Aceasta se numeste recursivitate in cascada si
apare in cazul in care functia se autoapeleaza de
cel putin doua ori pentru a calcula un termen. In
acest calculul este ineficient, timpul de calcul este
exponential si se recomanda utilizarea unei
metode iterative sau stocarea rezultatelor obtinute
intr-un vector.
Recursivitate indirecta
• Recursivitatea se poate realiza si in mod indirect, atunci
cand in cadrul blocului unei functii apare apelul unei
alte functii care la randul sau apeleaza direct sau
indirect functia respectiva.
De exemplu, sa presupunem ca in functia A() intervine
un apel al functiei B(). In functia B() intervine un apel
al functiei A(). Observati ca functia A() se
autoapeleaza, prin intermediul functiei B(). Prin urmare
functia A() este indirect recursiva.
Observatii
• 1. Recursivitatea constituie o tehnica de a
descrie intr-o maniera eleganta si concisa
prelucrari de maniera repetitiva.
2. In comparatie cu abordarea iterativa,
abordarea recursiva prezinta avantajul scrierii
concentrate.
3. O aplicatie implementata recursiv se
depaneaza mai greu decat una implementata
iterativ.
Exemple
• #include<stdio.h>
#include <conio.h>
void f(long int n)
{
if(n!=0)
{
if(n%2==0)
printf("%d", n%10);
f(n/10);
}
}
int main( void )
{
printf("Apel functie f(12345):\n");
printf("rezultat = ");
f(12345);
getch();
return 0;
}
• #include <stdio.h>
#include <conio.h>
int f(long int n, int k)
{
if(n!=0)
if(n%10==k)
return 1+f(n/10, k);
else return 0;
}
int main( void )
{
printf("Apel functie f(1213111,1): \n");
printf("rezultat = %d", f(1213111,1));
getch();
return 0;
}

S-ar putea să vă placă și