Sunteți pe pagina 1din 2

PROGRAMAREA CALCULATOARELOR SI LIMBAJE DE PROGRAMARE CURS 7

{
FILE *lista;
lista=fopen(nume,"a"); //deschide fiierul temporar pentru
adugare
oferta of;
cprintf("Cate inregistrari doresti sa adaugi? ");
unsigned char nr;
cscanf("%d",&nr);
int i;
for(i=0;i<nr;i++)
{
cprintf("\nOferta %3i: investitie: ",i+1);
cscanf("%f",&(of.inv));
cprintf("\n
profit: ");
cscanf("%f",&(of.prf));
of.str=0;
fwrite(&of,sizeof(oferta),1,lista); //scrie n fiier
}
fclose(lista);
//nchide fiierul
}

BACKTRACKING
Prezentarea structurilor de date utilizate
Unul dintre tipurile de date folosite n program este
structura:
typedef struct{float inv;
float prf;
float str;} oferta;
typedef struct{float inv;
float prf;} ofefis;
O structur este un conglomerat de tipuri de date. Fiecare
element al unei structuri poate avea propriul su tip
care poate diferi de tipul oricarui alt element.
Structura din program e compus din 3 variabile:
inv este o variabila de tip float i stocheaz investiia;
prf este o variabil de tip float i stocheaz profitul;
str este o variabil de tip float i are valoarea 1 n cazul
n care nregistrarea este marcat ca fiind tears i 0 n
caz contrar.
Tipul de date float ocupa 4 bytes de memorie, iar domeniul
de valori este de la 3.4E-38 la 3.4E+38.
Cu ajutorul comenzi typedef se poate defini un nou tip de
date numit oferta.

void sterge(char*nume)
//marcheaz sau demarcheaz nregistrri ca sterse
FILE *lista;
lista=fopen(nume,"r+"); //deschide fiierul temporar
//pentru citire i modificare
int i;
cprintf("A cata inregistrare vrei sa o marchezi (demarchezi)
pentru stergere? ");
cscanf("%d",&i);
fseek(lista,sizeof(oferta)*(i-1),SEEK_SET); //caut
//nregistrarea dorit
oferta of;
fread(&of,sizeof(oferta),1,lista);
cprintf("\n Nr. Investitie Profit\n\r");
if(of.str) cprintf("*");
else
cprintf(" ");
printf("%3d%12.2f%10.2f\n\r",i,of.inv,of.prf);
cprintf("Doresti sa marchez (demarchezi) pentru stergere"
"inregistrarea afisata? ");
char confirm;
cscanf("%c%c",&confirm,&confirm);
while((confirm!='d')&&(confirm!='n'))
{
cprintf("\n\rd sau n?");
cscanf("%c",&confirm);
}
if(confirm=='d')
{
fseek(lista,sizeof(oferta)*(i-1),SEEK_SET);
of.str=!of.str;
fwrite(&of,sizeof(oferta),1,lista);
}
fclose(lista);
//nchide fiierul
}

Funcii importante folosite n program


La rularea programului, acesta genereaz cu funcia mktemp
un nume pentru un fiier temporar n care depoziteaz
nregistrrile. La intrarea n meniul evalurii, programul
creeaz un tabel dinamic n care citete toate nregistrrile
care nu sunt marcate pentru tergere pentru a putea fi
prelucrate. n acest fel s-a realizat ca numrul nregistrrilor
citite s nu fie limitat de program, cum ar fi fost n cazul
alocrii statice a memoriei.
void afiseaza(char*nume)
//afieaz nregistrrile din fiierul temporar
{
FILE *lista;
lista=fopen(nume,"r"); //deschide fiierul temporar
//pentru citire
int i;
i=0;
while(!feof(lista))
{
oferta of;
i+=1;
if(i==1) cprintf(" Nr. Investitie Profit\n\r");
else
{
if(of.str) cprintf("*");
else
cprintf(" ");
cprintf("%3d%12.2f%10.2f\n\r",I-1,of.inv,of.prf);
}
fread(&of,sizeof(oferta),1,lista); //citete din fiier
}
fclose(lista);
//nchide fiierul
getch();
}

void stergefisier(char*nume)
{
FILE *lista;
FILE *listas;
char *numes;
char tipnume[12];
strcpy(tipnume,"temp");

void adauga(char*nume)
//adaug nregistrri n fiierul tempor
1

PROGRAMAREA CALCULATOARELOR SI LIMBAJE DE PROGRAMARE CURS 7


numes=mktemp(tipnume); //caut un nume pentru al doilea
fiier temporar
if(numes==NULL)
{
printf("Nu pot creea al doilea fisier temporar (1).");
return;
}
listas=fopen(numes,"w"); //deschide al doilea fiier
//temporar pentru scriere
if(listas==NULL)
{
printf("Nu pot creea al doilea fisier temporar (2).");
return;
}
lista=fopen(nume,"r"); //deschide primul fiier
temporar //pentru citire
oferta of, ofs;
int i;
i=0;
while(!feof(lista))
{
i+=1;
if(i!=1)
if (!of.str)
//copiaz din primul n al doilea
//fiier doar nregistrrile care
{
//nu sunt marcate pentru tergere
ofs.inv=of.inv;
ofs.prf=of.prf;
ofs.str=of.str;
fwrite(&ofs,sizeof(oferta),1,listas);
}
fread(&of,sizeof(oferta),1,lista);
}
fclose(listas);
//nchide fiierele temporare
fclose(lista);
remove(nume);
//terge fiierul vechi
strcpy(nume,numes); //pstreaz numele fiierului nou
}

{
cprintf("\n\rOferta %3i: investitie: ",i);
cscanf("%f",&(of.inv));
cprintf("\n
profit: ");
cscanf("%f",&(of.prf));
of.str=0;
rewind(lista);
fseek(lista,sizeof(oferta)*(i-1),SEEK_SET);
fwrite(&of,sizeof(oferta),1,lista);
for(j=0;j<(i-1);j++) fread(&aux,sizeof(oferta),1,lista);
fwrite(&of,sizeof(oferta),1,lista);
}
fclose(lista);
//nchide fiierul
}
void imprim(char*nume, char*imprimanta)
//imprim nregistrrile
{
cprintf("Care este portul imprimantei la care trebuie"
" sa trimit datele?\n\r");
cprintf("
implicit: %s\n\r",imprimanta);
fflush(stdin);
//citete portul imprimantei
char fis[12];
strcpy(fis,"");
gets(fis);
if (!(stricmp("",fis)==0)) strcpy(imprimanta,fis);
cprintf("\n\rEste imprimanta pregatita? ");
char confirm;
cscanf("%c",&confirm);
while((confirm!='d')&&(confirm!='n'))
{
cprintf("\n\rd sau n?");
cscanf("%c",&confirm);
}
if(confirm=='d')
{
FILE *print;
FILE *lista;
print=fopen(imprimanta,"w");
//deschide fiierul ataat imprimantei
lista=fopen(nume,"r"); //deschide fiierul temporar
int i;
i=0;
while(!feof(lista))
{
oferta of;
i+=1;
if(i==1) fprintf(print," Nr. Investitie Profit\n\r");
//transmite datele la imprimant
else
{
if(of.str) fprintf(print,"*");
else
fprintf(print," ");
fprintf(print,"%3d%12.2f%10.2f\n\r",i-1,
of.inv, of.prf);
}
fread(&of,sizeof(oferta),1,lista);
}
fclose(print);
//nchide fiierele deschise
fclose(lista);
}
}

void modifica(char*nume) //modific o nregistrare


{
FILE *lista;
lista=fopen(nume,"r+");//deschide fiierul temporar
//pentru citire i adugare
int i, j;
cprintf("A cata inregistrare vrei sa o modifici? ");
cscanf("%d",&i);
oferta of, aux;
fseek(lista,sizeof(oferta)*(i-1),SEEK_SET);
//caut nregistrarea dorit
fread(&of,sizeof(oferta),1,lista);
cprintf("\n Nr. Investitie Profit\n\r");
if(of.str) cprintf("*");
else
cprintf(" ");
cprintf("%3d%12.2f%10.2f\n\r",i,of.inv,of.prf);
cprintf("Doresti sa modifici inregistrarea afisata? ");
char confirm;
cscanf("%c%c",&confirm,&confirm);
while((confirm!='d')&&(confirm!='n'))
{
cprintf("\n\rd sau n?");
cscanf("%c",&confirm);
}
if(confirm=='d')
2