Sunteți pe pagina 1din 34

IX.

Aplicaii
Probleme rezolvate

1. Prelucrarea fiierelor 2. Recursivitate. Metode generale de proiectare a algoritmilor 3. Pointeri. Alocare dinamic

Aplicaii
Prelucrarea fiierelor
Problem: S se scrie un program care afieaz lungimea celei mai lungi linii din fiierul text numit TEST.txt. #include <stdio.h> void main(void) { FILE *f; int c; int lg_max, lg_curenta; lg_max=lg_curenta=0; if(!(f=fopen(TEST.txt,r))) { puts(Fisierul TEST nu poate fi deschis); return; }

Aplicaii
Prelucrarea fiierelor
while ((c=getc(f))!=EOF) if (c==\n) { if(lg_max < lg_curenta) lg_max=lg_curenta; lg_curenta=0; } else lg_curenta++; fclose(f); printf(\nLinia cea mai lunga are lung. %d, lg_max); }

Aplicaii
Prelucrarea fiierelor
Problem: S se scrie un program care copiaz un fiier binar surs n alt fiier binar destinaie. #include <stdio.h> void main(void) { FILE *fs, *fd; char c; if ((fs=fopen(sursa,rb))==NULL) { fprintf(stderr, Fisierul sursa nu poate fi deschis\n); return; }

Aplicaii
Prelucrarea fiierelor
if ((fd=fopen(dest,wb))==NULL) { fprintf(stderr, Fisierul dest. nu poate fi deschis\n); return; } c=getc(fs); while (!feof(fs)) { putc(c, fd); c=getc(fs); } fclose(fs); fclose(fd); }

Aplicaii
Prelucrarea fiierelor
Problem: Mai multe persoane au participat la un concurs i au obinut diferite punctaje. S se realizeze o aplicaie care s permit stocarea datelor persoanelor ntr-o baz de date (un fiier cu structuri), s se poat aduga noi persoane, s se caute i s se modifice punctajul unei persoane i s se ordoneze persoanele, descresctor dup punctaj. #include <stdio.h> #include <conio.h> #include <string.h> struct persoana { char nume[20]; int punctaj; };

Aplicaii
Prelucrarea fiierelor
void Citeste (struct persoana *p){ fflush(stdin); printf(Dati numele: ); gets((*p).nume); printf(Dati punctajul lui %s: , (*p).nume); scanf(%d, &(*p).punctaj); fflush(stdin); }

Aplicaii
Prelucrarea fiierelor
void Adauga (char nume_fis[13]) { FILE *f; struct persoana p; if (!strcmp(nume_fis, )) return; if ((f = fopen(nume_fis, ab)) == NULL) { printf(\nNu se poate deschide fis. %s.\n,nume_fis); return; } Citeste(&p); fwrite(&p, sizeof(p), 1, f); fclose(f); }

Aplicaii
Prelucrarea fiierelor
void CautaSiModifica(char nume_fis[13]) { FILE *f; struct persoana p, q; int gasit=0; long poz; if (!strcmp(nume_fis, )) return; if ((f = fopen(nume_fis, r+b)) == NULL) { printf(\nNu se poate deschide %s.\n,nume_fis); return; } Citeste(&p);

Aplicaii
Prelucrarea fiierelor
while ( !feof(f) && ( !gasit)) { poz=ftell(f); fread(&q, sizeof(struct persoana), 1, f); if (!strcmp(p.nume, q.nume)) { gasit=1; fseek(f, poz, SEEK_SET); fwrite(&p, sizeof(p), 1, f); } } fclose(f); if(!gasit) printf(\nPersoana inexistenta.\n); else printf(Persoana avea punctajul: %d si acum are: %d.\n, q.punctaj, p.punctaj); }

Aplicaii
Prelucrarea fiierelor
long FileSize (FILE *f) { long poz_curenta, lungime; poz_curenta = ftell(f); fseek(f, 0L, SEEK_END); lungime = ftell(f); fseek(f, poz_curenta, SEEK_SET); return lungime; } void Listeaza (char nume_fis[13]) { struct persoana p; FILE *f; long i=0; if (!strcmp(nume_fis, )) return; if ((f = fopen(nume_fis, rb)) == NULL) { printf(\nNu se poate deschide fisierul.\n); return;}

Aplicaii
Prelucrarea fiierelor
while ( !feof(f)) { fread(&p, sizeof(struct persoana), 1, f); if (!feof(f))printf(%ld, %s->%d\n, ++i, p.nume, p.punctaj); if (wherey() == 20) { printf(\nApasati o tasta pentru continuare \n); getch(); clrscr(); } } printf(\nIn total: %ld persoane.\n, FileSize(f)/sizeof(struct persoana)); fclose(f); }

Aplicaii
Prelucrarea fiierelor
void Sorteaza(char nume_fis[13]){ FILE *f; struct persoana p, q; size_t lung_pers = sizeof(struct persoana); long poz, i, lungime_fisier; int ordonat; if (!strcmp(nume_fis, )) return; if ((f = fopen(nume_fis, r+b)) = = NULL) { printf(\nNu se poate deschide fisierul. \n); return; } lungime_fisier = FileSize(f) / lung_pers;

Aplicaii
Prelucrarea fiierelor
do { ordonat = 1; rewind(f); for (i=1; i<=lungime_fisier-1; i++) { poz=ftell(f); fread(&p, sizeof(struct persoana), 1, f); fread(&q, sizeof(struct persoana), 1, f); if (p.punctaj < q.puntaj) { fseek(f, poz, SEEK_SET); ordonat = 0; fwrite(&q, sizeof(q), 1, f); fwrite(&p, sizeof(p), 1, f);} fseek(f, poz+lung_pers, SEEK_SET); } } while (!ordonat); fclose(f); }

Aplicaii
Prelucrarea fiierelor
void main(void) { FILE *f; char nf[13]; char c; strcpy(nf, ); do { clrscr(); printf(\nFISIER CONCURS -> %s\n\n, nf); printf(\n[D]enumire fisier, [A]daugare, [S]orteaza); printf(\n[C]autare/modificare,[L]istare, [O]prire\n ); c=tolower(getch()); printf(\n);

Aplicaii
Prelucrarea fiierelor
switch(c) { case d: printf(Dati numele fisierului: ); gets(nf); break; case a: Adauga(nf); getch(); break; case c: CautaSiModifica(nf); getch(); break; case l: Listeaza(nf); getch(); break; case s: Sorteaza(nf); Listeaza(nf); getch(); } } while (c!=o); }

Aplicaii
Recursivitate
Problem: S se scrie un program care caut un element ntr-un ir x=(x1, x2, ..., xn) ordonat cresctor. Se va folosi metoda cutrii binare. Obs: vom aplica metoda divide et impera. #include <stdio.h> #include <conio.h> typedef int vector[20]; void Citeste(vector x, int *n) { int p, i; printf(dati nr. de elemente:); scanf(%d, &p); *n=p; for ( i=0; i<p; i++ ) { printf(Dati x[ %d ]=, i); scanf(%d,&x[ i ]); } }

Aplicaii
Recursivitate
void Afiseaza (vector x, int n) { printf (Elementele lui x sunt: ); for (int i=0; i<n; i++) printf (%d,, x[ i ]); printf (\n\n); } Se va aplica metoda divide et impera n varianta recursiv, prin funcia recursiv CautareBinara. Se ncepe cutarea cu elementul din mijlocul irului, continndu-se apoi cutarea, dac este nevoie, cu elementele din jumtatea stng sau jumtatea dreapt a irului.

Aplicaii
Recursivitate
int CautareBinara(vector a, int elem, int inceput, int sfarsit) { if (inceput<sfarsit) { int mijloc=(inceput+sfarsit)/2; if (elem==a[mijloc]) return mijloc+1; // atentie la indici ! else if (elem<a[mijloc]) return CautareBinara(a, elem, inceput, mijloc-1); else return CautareBinara(a, elem, mijloc+1, sfarsit); } else return 0; }

Aplicaii
Recursivitate
void main ( ) { int n,p,e; vector a; clrscr( ); Citeste(a, &n); Afiseaza(a, n); printf(Dati numarul cautat: ); scanf(%d, &e); printf(\n); if (p=CautareBinara(a, e, 0, n-1)) printf(%d exista pe pozitia %d in sir !, e, p); else printf(%d nu exista in sir !, e); getch( ); }

Aplicaii
Pointeri. Alocare dinamic
Problem: S se scrie un program care gestioneaz date despre un
grup de studeni. Pentru fiecare student se memoreaz numele i numrul matricol. Programul trebuie s implementeze urmtoarele operaii: - citirea numrului de studeni i a datelor acestora; - afiarea datelor tuturor studenilor; - sortarea listei de studeni n ordinea alfabetic a numelor; - sortarea listei de studeni n ordinea cresctoare a numerelor matricole; - cutarea unui student pentru care se precizeaz numele i afiarea poziiei pe care o ocup acesta n lista ordonat alfabetic dup numele studenilor; - cutarea unui student pentru care se precizeaz numrul matricol i afiarea poziiei pe care o ocup acesta n lista ordonat cresctor dup numrul matricol al studenilor;

Aplicaii
Pointeri. Alocare dinamic
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> typedef struct { char *nume; int nr; } student;

Aplicaii
Pointeri. Alocare dinamic
#define SIZE sizeof(student) typedef int (*comp)(const void *, const void *); typedef student *pstud; void eroare(void) { puts(\n **** eroare alocare dinamica de memorie ****); exit(1); }

Aplicaii
Pointeri. Alocare dinamic
void citeste(int *n, pstud *tab) { pstud t; char sir[40]; int i; printf(\n dati numarul studentilor:); scanf(%d, &n); if(!(t=(pstud)malloc((*n)*SIZE))) eroare(); *tab=t;

Aplicaii
Pointeri. Alocare dinamic
for (i=0; i<*n; i++, t++) { printf(\n nume: ); scanf(%s, sir); /* aloca dinamic spatiu pentru numele studentului */ if (!(t->nume=(char *) malloc(strlen(sir)+1))) eroare (); strcpy(t->nume, sir); printf(\n numar matricol: ); scanf(%d, &t-> nr); } }

Aplicaii
Pointeri. Alocare dinamic
void afiseaza ( int n, pstud tab) { int i; puts(\n tabelul cu studenti ); for (i=0; i<n; i++, tab++) printf(\n%-30s %4d, tab->nume, tab->nr); }

Aplicaii
Pointeri. Alocare dinamic
int comp1(const void *p, const void *r) { return strcmp(((pstud) p) -> nume, ((pstud) r)->nume); }

int comp2(const void *p, const void *r) { return ((pstud) p) ->nr - ((pstud) r) -> nr; }

Aplicaii
Pointeri. Alocare dinamic
void cauta(pstud s, pstud tab, int n, comp f) { pstud t=NULL; int i; t=bsearch(s, tab, n, SIZE, f); if (t) { i=t-tab; printf(\n st. %s cu nr. mat. %d e al %d-lea in evid., t->nume, t->nr, i+1); } else printf(\n studentul nu se afla in evidenta); }

Aplicaii
Pointeri. Alocare dinamic
void elibereaza (pstud tabel, int n) { int i; for (i=0; i<n; i++) free(tabel[ i ].nume); free(tabel); }

Aplicaii
Pointeri. Alocare dinamic
void meniu(void) { puts(\n c, C --- citeste tabel studenti); puts(\n a, A --- afiseaza tabel studenti); puts(\n n, N --- ordoneaza dupa nume); puts(\n r, R --- ordoneaza dupa numar matricol); puts(\n f, F --- cauta dupa nume); puts(\n l, L --- cauta dupa numar matricol); puts(\n x, X --- iesire din program); }

Aplicaii
Pointeri. Alocare dinamic
void main(void) { char opt; int n; /* numarul de studenti */ char nume[30]; student s; pstud tabel=NULL; /* adresa tabloului cu studenti */ while (1) { meniu(); opt=tolower(getch());

Aplicaii
Pointeri. Alocare dinamic
switch(opt) { case c: if(tabel)/* daca a existat anterior un alt tabl. in mem.*/ elibereaza(tabel, n); citeste(&n, &tabel); break; case a: afiseaza(n, tabel); break; case n: qsort(tabel, n, SIZE, comp1); break; case r: qsort(tabel, n, SIZE, comp2); break;

Aplicaii
Pointeri. Alocare dinamic
case f: printf(\n dati numele:); scanf(%s, nume); if (!(s.nume=(char *)malloc(strlen(nume)+1))) eroare(); strcpy(s.nume, nume); cauta(&s, tabel, n, comp1); free(s.nume); break;

Aplicaii
Pointeri. Alocare dinamic
case l: printf(\n dati numarul matricol:); scanf(%d, &s.nr); cauta(&s, tabel, n, comp2); break; case x: exit(0); default: puts(Comanda gresita); } } }

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