Documente Academic
Documente Profesional
Documente Cultură
FISIER TEXT
Un stream este asociat unui fiier prin executarea unei operaii open i este eliberat de un fiier prin executarea unei operaii close. Exist dou tipuri de fisiere: text i binar. Un fisier text este folosit pentru a manipula caractere ASCII. Cnd folosim un fisier text, poate apare translatarea anumitor caractere. De exemplu cnd este ntlnit caracterul new line acesta este convertit ntr-o secven de doua caractere carriage_return / line feed. Este deci posibil s nu existe o coresponden total ntre ceea ce este trimis ctre stream i ceea ce conine fiierul. Un fisier se poate deschide cu functia FILE *fis=fopen(char nume.extensie,char mod); si se poate inchide cu functia fclose(fis); Exista mai multe moduri in care poate fi deschis un fisier. w-Deschide/Creaza un fisier text pentru scriere. r-Deschide un fisier text pentru citire. a-Append la un fisier text. r+-Deschide un fisier text pentru citire/scriere. w+-Deschide/Creaza un fisier text pentru citire/scriere a+-Append sau crearea unui fisier text pentru citire/scriere
In care : nume[30]->numele clientului pren[30]->prenumele clientului sbul[10]->seria de buletin a clientului camera-> camera la care este cazat Urmeaza 2 structuri aseamanatoare structura data_venire cu campurile z(ziua),l(luna),a(an), si structura data_plecare cu campurile z,l,a. Variabilele dv si dp, sunt variabilele cu care se ajunge la campurile structurilor data_venire respective data_plecare. Acelasi tip de functie are si variabila ft cu care se ajunge la campurile din structura fisier_text.
In care variabila cl retine adresa la care se va crea fisierul clienti.txt, iar variabila r retine optiunea utilizatorului.
ADAUGARE IN FISIER
Pentru adaugarea in fisier s-a folosit functia aft(adaugare fisier text). Modul de lucru al functiei este urmatorul: -deschide fisierul text si se pozitioneaza dupa ultima inregistrare din acesta -se verifica daca fisierul este creat, in caz afiramativ functia continua cu citirea datelor noii inregistrari -este creat si fisierul binar pentru a face modificarile (functia cfb() despre care o sa vorbim in urmatoarele pagini) -se scrie la finaul fisierului clienti.txt De asemenea se deschide fisierul camere.dat in care se cauta camera la care este cazat noul client, iar statusul acesteia se schimba din Liber in Ocupat La final utilizatorul este intebat daca doreste sa mai adauge alte inregistrari sau nu. In cazul in care doreste sa nu mai adauge alte inregistrari functia inchide fisierele, iar programul revine la meniul anterior.
4
Noi functii care s-au folosit in stergere : remove(stream); sterge fisierul, rename(nume vechi,nume nou); redenumeste un fisier. Variabilele s si p s-au folosit pentru a memora numele respectiv prenumele.
MODIFICARE FISIER
Functia de modificare sau mft (modificare fisier text) lucreaza foarte simplu. Defapt este foarte asemanatoare cu functia de stergere. Modul de lucru: -se deschid 2 fisiere : clienti.txt si modi.txt -se citeste numele si prenumele clientului pe care utilizatorul doreste sa il modifice -ce citesc inregistrarile din fisierul clienti.txt,daca sunt diferite de cele cautate sunt scrise in fisierul modi.txt, cand se gasesc numele si prenumele cautate, inregistrarea este inlocuita cu alte date citite de la tastatura. -la final se sterge vechiul fisier, iar noul fisier se redenumese clienti.txt
void mft() { FILE *cl,*md; int n=0,i=1; char s[30],p[30]; printf("Dati numele clientului:"); scanf("%s",s);
LISTARE FISIER
Listarea fisierului se face cu ajutorul functiei lft(listare fisier text). Modul de lucru este urmatorul : se citeste o inregistrare din fisier apoi se afiseaza pe ecran, sub forma de tabel, cu campurile NUME ,PRENUME, SERIE BULETIN, CAMERA, DATA VENIRII, DATA PLECARII. Codul sursa este urmatorul:
9
10
FISIER BINAR
Un fisier binar este o secven de octei, iar corespondena ntre ceea ce este transmis ctre stream i ceea ce conine fiierul este total, nu apar translatri de caractere. Toate stream-urile au proprietari similare si sunt operate de aceleai funcii de intrare/iesire. Fiierul este entitatea fizica care primete datele. Modurile de deschidere ale unui fisier binar: -wb deschiderea unui fisier binar pentru scriere -rb deschiderea unui fisier binar pentru citire -ab append la un fisier binar -r+b deschiderea unui fisier pentru a fi citit/scris -w+b deschide/creaza un fisier binar pentru a fi citit/scris -a+b adauga/creaza un fisier binar pentru a fi citit/scris
Fisierul binar este camere.dat, si are urmatoarele campuri: camera,etaj, costul/noapte, tipul camerei, statusul camerei. Codul sursa este urmatorul:
11
12
14
De mentionat: S-au mai folosti functii ca : feof(stream) functia care returneaza daca s-a ajuns la sfarsitul fisierului sau nu, ftell(stream) returneaza pozitia curenta a cursorului, sizeof(variabila) returneaza cati octeti are variabila, strcpy(sir1,sir2) copiaza in sir1 informatia din sir2, strcmp(sir1, sir2) returneaza 1 daca sir1>sir2, 0 daca sir1=sir2, -1 daca sir1<sir2. Functia este de tip void si nu are parametrii.
Listarea se face cu functa lfb(listare fisier binar), iar modul de lucru este foarte usor: -se citeste din fisierul camere.dat apoi se afiseaza sub forma de tabel informatiile. -campurile tabelului sunt : CAMERA, ETAJ, COST/NOAPTE, TIP CAMERA, STAUS
15
16
LISTE
O lista liniara este o colectie de n noduri cu x1,x2,....xn aflate intr-o relatie de ordine. Astfel, x1 este primul nod al listei, x2 al doilea nod al listei,...xn este ultimul nod. Listele liniare sunt de mai multe tipuri: - liste simplu inaltuite (lista se poate parcurge doar dintr-o parte in cealalta) - liste dublu inlantuite(lista se poate parcurde si de la stanga la dreapta dar si de la dreapta la stanga) - liste simplu inlantuite circulare (lista se parcure intr-o singura directie dar nu se opreste la ultimul nod, ci continua parcurgerea), ultimul nod are succesor pe primul nod - liste dublu inlantuite cirulare(lista se parcurge de la stanga la dreapta si invers dar nu se opreste la ultimul sau primul nod), ultimul nod are succesor la dreapta primul nod , iar primul nod are succesor la stanga ultimul nod Operatiile permise sunt: - accesul la oricare nod al liste in scopul citirii sau modificarii informatiei continute de acesta - adaugarea unui nod, indiferet de pozitia pe care o ocupa in lista - stergerea unui nod, indiferent de pozitia pe care o ocupa in lista - schimbarea pozitiei unui nod in cadrul listei.
17
CREARE LISTA
Crearea listei se face cu ajutorul functiei crl(creare lista), modul de lucru al functiei este urmatorul: -citeste o inregistrare din fisierul clienti.txt -verifica daca lista a fost creata, in caz negativ creaza primul nod al listei -apoi continua cu adaugarea unui nou nod la dreapta pana cand se termina toate inregistrarile din fisierul clienti.txt -functia face legaturile intre noduri in felul urmator primul nod are la stanga adresa NULL la dreapta adresa urmatorului nod, un nod diferit de primul si de ultimul nod are la stanga adresa nodului pozitionat la stanga, iar la dreapta adresa nodului pozitionat la dreapta.Ultimul nod are la stanga adresa nodului pozitionat la stanga iar la dreapta are adresa NULL.
In care variabila ftt este te tip fisier_text , iar campurile se pot observa la subcapitolul STRUCTURA FISIER TEXT , variabilele *st, *dr sunt variabilele la care se memoreaza adresa de la stanga respectiv la dreapta a unui nod. Variabilele *prim si *ultim sunt variabilele care memoreaza primul si ultimul nod.
18
19
AFISAREA LISTEI
Afisarea listei se poate face in doua moduri : de la stanga la dreapta , apoi de la dreapta la stanga. Pentru primul mod de parcurgere folosim functia listl, in care unei variabile c i se atribuie adresa primului nod, apoi afiseaza informatia si contiuna procesul pana la intalnirea adresei NULL. Informatia se afiseaza sub forma de tabel, cu urmatoarele campuri: NUME , PRENUME, SERIE BULETIN, CAMERA, DATA VENIRII, DATA PLECARII. Codul sursa pentru aceasta functie este:
void listl() { nod_lista *c; int j; c=prim; if(prim==0) { clrscr(); printf("\nLista trebuie mai intai creata."); getch(); }else{ printf("\n"); for(j=0;j<80;j++) printf("="); printf("\nI I I I I I I"); printf("\nI Nume I Prenume I Serie Buletin I Camera I Data venire I Data plecare I"); printf("\nI I I I I I I");
20
Al doilea mod de parcurgere al listei este de la dreapta la stanga. Parcurgerea se face cu ajutorul functiei listld(listare lista dreapta). Modul de lucru este asemanator cu cel de la functia precedenta. Intr-o variabila c se memoreaza de aceasta data adresa ultimului nod , apoi se afiseaza informatia sub forma de tabel cu aceleasi campuri ca cel anterior, si procesul se intampla pana cand c intalneste adresa NULL. Codul sursa este :
void listld() { nod_lista *c; int j; c=ultim; if(ultim==0) { clrscr(); printf("\nLista trebuie mai intai creata."); getch(); } else{ printf("\n"); for(j=0;j<80;j++) printf("="); printf("\nI I I I I I I"); printf("\nI Nume I Prenume I Serie Buletin I Camera I Data venire I Data plecare I"); printf("\nI I I I I I I"); printf("\n"); for(j=0;j<80;j++) printf("="); while(c!=0) { printf("\nI%9sI%9sI%14s I%6d I %2d/%2d/%4d I %2d/%2d/%4d I",c->ftt.nume,c->ftt.pren,c->ftt.sbul,c>ftt.camera,c->ftt.dv.z,c->ftt.dv.l,c->ftt.dv.a,c->ftt.dp.z,c->ftt.dp.l,c->ftt.dp.a); printf("\n");
21
MODIFICARE LISTA
Modificarea listei se face cu ajutorul functiei mdl(modificare lista) si are urmatorul mod de lucru: -in 2 variabile de tip char se memoreaza numele si prenumele clientului pe care doreste ultilizatorul sa-l modifice -o variabila c primeste adresa primului nod apoi parcurgand lista de la stanga la dreapta cauta nodul cu numele si prenumele cautat -informatiile apoi sunt inlocuite cu altele primite de la tastatura -utilizatorul este intrebat daca doreste sa faca modificarile si in fisier. Modificarile in fisier se fac cu ajutorul functiei modi_fist_list(modificare fisier text lista) care are urmatorul mod de lucru: -creaza un alt fisier in care introduce informatiile nodurilor -apoi il sterge pe vechiul clienti.txt si modifica numele noului fisier in clienti.txt Codurile sursa sunt:
void mdl() { nod_lista *c; char n[30],p[30],s; int ok=0; if(prim==0) crl(); c=prim; printf("\nDati numele si prenumele clientului caruia doriti sa-i modificati datele."); printf("\nNume:");scanf("%s",n); printf("\nPrenume:");scanf("%s",p); while(c!=0)
22
23
ARANJARE LISTA
Lista poate fi aranjata crescator sau descrescator dupa numele si prenumele clientilor. Programul GUH face aceasta aranjare cu ajutorul functiei aranjare_lista. Metoda de sortare folosita este metoda interchimbarii directe. Practic functia ia fiecare nod in parte il compara cu celalalt nod si. daca sunt indeplinite conditiile dorite de utilizator, atunci ele se interschimba. Codul sursa este urmatorul :
void aranjare_lista() { char s; nod_lista *c,*d,*man; do { clrscr(); printf("\n1-Crescator dupa nume si prenume."); printf("\n2-Descrescator dupa nume si prenume."); printf("\n0-Iesire."); s=getch(); switch(s) { case '1': { c=prim; while(c->dr!=ultim) { d=c->dr; while(d!=0) { if(strcmp(c->ftt.nume,d->ftt.nume)>0) { man->ftt=c->ftt; c->ftt=d->ftt; d->ftt=man->ftt; } if(strcmp(c->ftt.nume,d->ftt.nume)==0) if(strcmp(c->ftt.pren,d->ftt.pren)>0) { man->ftt=c->ftt; c->ftt=d->ftt; d->ftt=man->ftt; }
24
25
ADAUGARE IN LISTA
Functia adaugare_list() este cea care indeplineste acest rol. Ea are 4 componente: - Adaugarea la inceputul listei - Adaugarea inaintea unui nod - Adaugarea dupa un nod - Adaugarea la finalul listei Codul sursa :
void adaugare_list() { char a,n[20],p[20]; nod_lista *c,*d; do { clrscr(); printf("\n1-Adaugare la inceput."); printf("\n2-Adauga inainte de un nod."); printf("\n3-Adaugare dupa un nod."); printf("\n4-Adaugare la final."); printf("\n0-Iesire."); a=getch(); switch(a) { case'1': { c=new nod_lista; printf("\nDati datele clientului:"); printf("\nNume:");scanf("%s",c->ftt.nume); printf("\nPrenume:");scanf("%s",c->ftt.pren); printf("\nSerie buletin:");scanf("%s",c->ftt.sbul); printf("\nCamera:");scanf("%d",&c->ftt.camera); printf("\nData venirii:");scanf("%d/%d/%d",&c->ftt.dv.z,&c->ftt.dv.l,&c->ftt.dv.a); printf("\nData plecarii:");scanf("%d/%d/%d",&c->ftt.dp.z,&c->ftt.dp.l,&c->ftt.dp.a); c->dr=prim; prim->st=c; c->st=0; prim=c; break; } case '2': {
26
27
STERGERE LISTA
Stergea unui nod din lista se face cu ajutorul functiei sterg_list. Aceasta are un mod de lucru foarte simplu: prin variabilele n si p,se memoreaza numele si prenumele clinetului care va fi sters, apoi este cautat cu ajutorul variabilei c. Cand este gasit acestuia ii se rup legaturile cu nodurile vecine, se fac leaga nodurile vecine iar apoi se sterge memoria alocata acestui nod. Codul sursa:
void sterg_list() { nod_lista *c; char p[10],n[10],s; c=prim; printf("\nDati numele si prenumele clientului pe care il doriti sters:"); printf("\nNume:");scanf("%s",n); printf("\nPrenume:");scanf("%s",p); while(strcmp(p,c->ftt.pren)!=0 && strcmp(n,c->ftt.nume)!=0) c=c->dr; c->st->dr=c->dr; c->dr->st=c->st;
28
ARBORI
Structurile arborescente sunt foarte des utilizate atat pe parcursul stocarii informatiei in memoria calculatorului cat si pe parcursul regasirii si prelucrarii acestei informatii. Ca atare, apare ca necesara detalierea modului in care sunt folosite aceste structuri de date. Un arbore este un graf orientat fara cicluri, format dintr-o multime de noduri, N, si o multime de arce R, notat A=(N,R) cu urmatoarele proprietati: 1) exista un singur nod rad din multimea nodurilor, numit radacina, pentru care i-gradul (numarul de arce ce intra in nod) este zero; 2) toate celelalte noduri au i-gradul 1; 3) orice nod este accesibil din radacina.
29
CREARE ARBORE
Inainte de a vorbi despre modul in care acest program creaza arborii, trebuie sa vorbim despre modul in care un arbore este structurat. Acesta are urmatoarea structura :
struct arb { fisier_text ftt; arb *st,*dr; }; arb *rad;
Variabila ftt este de tip fisier_text a fost explicata la Creare lista arb sunt variabile te tip arb(arbore) care memoreaza adresa fiilor unui nod al arborelui. St memoreaza adresa fiului stang, dr memoreaza adresa fiului drept. Crearea aborelui poate fi facuta in 2 moduri: direct din fisierul clienti.txt sau de la tastatura. Modul de lucru: -se creaza nodul radacina,memorat prin rad, acesta ia valoarea camerei primei inregistrari. -se trece la urmatoarea inregistrare, daca aceasta are numarul camerei mai mare ca radacina atunci acest nod devine fiul drept, daca este mai mic atunci el devine fiul stang. -in cazul in care radacina este deja creata atunci locul radacinii este luat de variabila p si se continua algoritmul anterior. Codul sursa:
void creare_arb() { FILE *cl; arb *p,*q; cl=fopen("clienti.txt","r"); fseek(cl,0,SEEK_SET); while(!feof(cl)) {
30
31
Acelasi algoritm este si la crearea prin tastatura, doar ca inregistrarile le da direct utilizatorul.
ADAUGARE IN ARBORE
Adaugarea se face dupa cum urmeaza: se insereaza un nou nod, informatia este comparata cu radacina, daca este mai mic atunci se trece la nodul din partea stanga si se face iar comparatie, daca este mai mare atunci se trece la nodul din partea dreapta si se face iar comparatie. Acest proces se intampla pana cand se gaseste un loc vid, sau adresa NULL, unde se insereaza noul nod. Pentru aceasta este utilizata functia adaugare_arb. Codul sursa este pe urmatoarea pagina:
32
De mentionat: Operatorii new si delete sunt operatori gasiti in limbajul c++, acesti doi operatori creaza respectiv sterg un spatiu de memorie alocat. Sunt foarte folositi in lucrul cu liste si arbori.
33
CAUTAREA IN ARBORE
Cautarea unui nod in arbore are acelasi principiu ca adaugarea in arbore. Un nod este introdus de la tastatura, se compara cu radacina daca este mai mic atunci se continua comparatia in partea stanga, daca este mai mare se continua comparatia in partea dreapta. Ajungand la nodul cautat acesta este afiasat impreuna cu datele pe care le detine. Rolul acesta este indeplinit de functia cautare() care are urmatorul cod sursa:
void cautare() { arb *p; int cheie; if(rad==0) creare_arb(); p=rad; clrscr(); printf("Dati camera:");scanf("%d",&cheie); while(p!=0 && cheie!=p->ftt.camera) { if(cheie>p->ftt.camera) p=p->dr; if(cheie<p->ftt.camera) p=p->st; } if(p==0) printf("Nu exista nici nu locatar la camera :%d",cheie); else { printf("In camera %d se afla:",cheie); printf("\nClientul %s %s cu seria de buletin:%s \nvenit la data de: %d/%d/%d pana la data de:%d/%d/%d",p->ftt.nume,p->ftt.pren,p->ftt.sbul,p->ftt.dv.z,p->ftt.dv.l,p->ftt.dv.a,p->ftt.dp.z,p->ftt.dp.l,p>ftt.dp.a); } getch(); }
34
AFISARE ARBORE
Exista 4 moduri de afisarea a unui arbore : - Inordine (subarbore stang,radacina,subarbore drept) - Postordine(subarbore stang, subarbore drept, radacina) - Preordine(radacina,subarbore stang,subarbore drept) - Afisare in forma arborescenta. Pentru afisare sunt folosite functiile inordine(), postordine(), preordine(), afiare_arbore_nivel();. Codul sursa este urmatorul:
void inordine(arb *m) { if(m!=0) { inordine(m->st); printf("%d ",m->ftt.camera); inordine(m->dr); } } void postordine(arb *m) { if(m!=0) { postordine(m->st); postordine(m->dr); printf("%d ",m->ftt.camera); } } void preordine(arb *m) { if(m!=0) { printf("%d ",m->ftt.camera); preordine(m->st); preordine(m->dr); } } void afisare_arbore_nivel(arb *m, int t) { int i; if(m!=NULL) { afisare_arbore_nivel(m->dr,t+5); for (i=0;i<t;i++) printf(" ");
35
PERMUTARI
Metoda backtraking se foloseste in rezolvarea problemelor care indeplinesc simultan urmatoarele conditii: - solutia lor poate fi pusa sub forma unui vetor S=x1,x2...xn cu x1 din A1 , x2 din A2 ....xn din An - multimile A1, A2...An sunt multimi finite, iar elementele lor se considera ca se afla intr-o relatie de ordine bine stabilita - nu se dispune de o alta metoda de rezolvare, mai rapida. Principiul metodei Metoda backtracking are la baza un principiu simplu: daca in procesul de generare a unui vector solutie S=x1,x2,...,xn pentru componenta k, atunci cand am generat deja x1,x2,...,xk constatam ca valoarea xk nu este bine aleasa( pastrand-o nu se la ajunge la o solutie), nu trecem la componeta k+1 ci reluam cautarea pentr alta valoare pentru componenta k, iar daca asceasta valoare nu exista, reluam cautarea pentru componenta k-1. Programul genereaza toate permutarile posibile ale camerelor ocupate din fisierul camere.dat. Numarul camerelor ocupate se memoreaza in vectorul vex.x*30+. Structura pentru backtracking este urmatoarea:
36
X memoreaza vectorul cu camerele, n numarul de componente din camere. In program s-a folosit metoda iterativa. Codul sursa este urmatorul:
void creare_vex() { FILE *ca; int k=0,i=1,man=0; ca=fopen("camere.dat","rb"); while(!feof(ca)) { fread(&fb,sizeof(fb),1,ca); man++; } fseek(ca,0,SEEK_SET); while(!feof(ca)&&i<man) { fread(&fb,sizeof(fb),1,ca); if(strcmp(fb.stare,"Ocupat")==0) vex.x[++k]=fb.camera; i++; } vex.n=k; printf("\n\n"); fclose(ca); } void init(int k) { sol[k]=0; } int succesor(int k) { if(sol[k]<vex.n) { sol[k]++; return 1; } else return 0; } int valid(int k) { int i,ev=1; for(i=1;i<k;i++) if(sol[k]==sol[i]) ev=0;
37
De mentionat: functia creare_vex creaza vectorul vex.x[30] si numara cate componete are.
38
MENIURI
In void main() exista 4 apelari ale unor functii. Aceste 4 apelari sunt : 1. Meniu fisiere. 2. Meniu liste. 3. Meniu arbori. 4. Permutari. La randul lor fiecare are mai multe optiuni pe care utilizatorul pe poate vedea cand ruleaza programul. Codul sursa al acestora este urmatorul:
void main4() { clrscr(); printf("\nAcest meniu afiseaza toate permutarile camerelor ocupate posibile din fisierul camere.dat"); creare_vex(); back(); getch(); } void main3() { char alege,al; do { clrscr(); printf("\n1-Creare arbore."); printf("\n2-Afisare."); printf("\n3-Cautare."); printf("\n4-Creare din tastatura."); printf("\n5-Adaugare."); printf("\n0-Iesire."); alege=getch(); switch(alege) { case '1': { creare_arb(); break; } case '2': { do { clrscr(); printf("\n1-Afisare pe nivel.");
39
40
41
42
43
44
De mentionat faptul ca pentru a evita orice eroare de genul function() should have a prototype s-au declarat antetele functiilor dupa cum urmeaza:
void cft(); void aft(); void sft(); void mft(); void lft(); void cfb(); void lfb(); void update_fis_bin(); void modi_fist_list(); void crl(); void mdl(); void listl(); void adaugare_list(); void main1(); void main2();
45
46
BIBLIOGRAFIE
CURSURI TEHNICI DE PROGRAMARE CURSURI PROGRAMAREA CALCULATOARELOR MANUAL INFORMATICA, PROFIL REAL, CLASA XI
http://www.cprogramming.com http://www.cplusplus.com
47