Lucrarea de laborator nr 2
Fisiere in ingineria programarii in C
Problema
Sa se creeze un fisier care sa contina coeficientii necunoscutelor si termenii liberi dintr-un sistem de n ecuatii cu n necunoscute.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main(void)
printf("\n b(%d)=",i);
scanf("%f",&b[i]) 555c21f ;
}
printf("\n dati specifiactorul fiserului de creat:");
scanf("%s",specfis);
if((ptrfile=fopen(specfis,"wb"))==NULL)
/* scrierea dimensiunii n a sistemului */
fwrite(&n,sizeof(int),1,ptrfile);
for(i=0;i<n;i++)
fclose(ptrfile);
}
Problema
Sa se afiseze pe ecran sistemul de n ecuatii cu n necunoscute ai caror coeficienti si termeni liberi se gasesc in fisierul creat in problema precedenta.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main(void)
{
FILE *ptrfile;
float a[10][10],b[10];
int n,i,j;
char specfis[15];
printf("\ spec fis cu necunoscutele si termenii liberi:");
scanf("%s",&specfis);
if((ptrfile=fopen(specfis,"rb"))==NULL)
/* citirea din fisier a dimensiunii sistemului */
fread(&n,sizeof(int),1,ptrfile);
/* citirea matricii coeficientilor necunoscutelor si termenilor liberi */
for(i=0;i<n;i++)
/* afisarea sistemului citit din fisier */
for(i=0;i<n;i++)
fclose(ptrfile);
}
In cele doua probleme anterioare s-au folosit fisiere de tip binar ale caror componente apartineau tipului float.
In problemele care urmeaza se va concretiza folosirea unor fisiere binare ale caror componente apartin tipului structurat de date si anume, tipului struct.
Problema 3.
Sa se creeze un fisier de studenti pe disc continand articole cu structura: cod student, un camp numeric de la 1 la 1000, nume un camp de 10 caractere alfabetice, prenume un camp de 10 caractere alfabetice, numar de note un camp intreg de la 1 la 15 si notele studentului un tablou de intregi cuprins intre 1 si 10.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <process.h>
void main(void)
s; /* s este un articol de tip structura tipstud */
FILE *ptrfile;
int n,i;
char specfis[15],r;
printf("\n specificatorul fisierului de note:");
scanf("%s",&specfis);
if((ptrfile=fopen(specfis,"wb"))==NULL)
printf("\n continuati introducerea de articole?(d/n):");
r=getche();
while((r=='d') || (r=='D'))
while ((s.cm<=0) || (s.cm>1000));
printf("\n numele studentului:");
scanf("%s",s.nume);
printf("\n prenumele studentului:");
scanf("%s",s.prenume);
do
while ((s.nrn<=0) || (s.nrn>15));
for(i=0;i<s.nrn;i++)
do
while ((s.nota[i]<=0) || (s.nota[i]>10));
fwrite(&s,sizeof(struct tipstud),1,ptrfile);
printf("\n continuati introducerea de articole?(d/n):");
r=getche();
}
fclose(ptrfile);
}
Problema
Sa se creeze, pornind de la fisierul de note anterior creat, un fisier cu mediile studentilor pe disc continand articole cu structura:cod student - un camp numeric de la 1 la 1000, nume - un camp de 10 caractere alfabetice, prenume - un camp de 10 caractere alfabetice si media - un camp real de la 1 la 10, apoi sa se listeze fisierul de medii ordonat crescator dupa codurile matricole si dupa medii.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <process.h>
void main(void)
s; /* s este un articol de tip structura tipstud */
/* definirea structurii articolelor cu mediile studentilor */
struct tipmedie
m,tabmedii[20],aux; /* m este un articol de tip structura tipmedie */
FILE *ptrfnote; /* tabmedii este un vector cu artcolele de medii */
FILE *ptrfmedii;
int ns,nc,i,ok;
char specfisn[15],specfism[15],r;
printf("\n specificatorul fisierului de note:");
scanf("%s",&specfisn);
if((ptrfnote=fopen(specfisn,"rb"))==NULL)
printf("\n specificatorul fisierului de medii:");
scanf("%s",&specfism);
if((ptrfmedii=fopen(specfism,"w+b"))==NULL)
ns=0;
fread(&s,sizeof(struct tipstud),1,ptrfnote);
while(!feof(ptrfnote))
fclose(ptrfnote);
fclose(ptrfmedii);
/* citirea fisierului de medii in tabloul de medii pentru sortare */
if((ptrfmedii=fopen(specfism,"r+b"))==NULL)
nc=0;i=0;
fread(&m,sizeof(struct tipmedie),1,ptrfmedii);
while(!feof(ptrfmedii))
/* ordonarea crescatoare a vectorului studentilor dupa cod matricol */
ok=1;
while(ok==1)
}
printf("\n lista studentilor ordonata dupa cod matricol");
printf("\n ============================================");
printf("\n matricol nume si prenume media ");
printf("\n ==============================");
for(i=0;i<nc;i++)
printf("\n %d %-10s %-10s %5.2f",tabmedii[i].cm,
tabmedii[i].nume,tabmedii[i].prenume,tabmedii[i].media);
printf("\n ==============================");
fclose(ptrfmedii);
/* citirea fisierului de medii in tabloul de medii pentru sortare */
if((ptrfmedii=fopen(specfism,"r+b"))==NULL)
nc=0;i=0;
fread(&m,sizeof(struct tipmedie),1,ptrfmedii);
while(!feof(ptrfmedii))
/* ordonarea descrescatoare a vectorului studentilor dupa medie */
ok=1;
while(ok==1)
}
printf("\n lista studentilor ordonata dupa media ");
printf("\n ============================================");
printf("\n matricol nume si prenume media ");
printf("\n ============================================");
for(i=0;i<nc;i++)
printf("\n %d %-10s %-10s %5.2f",tabmedii[i].cm,
tabmedii[i].nume,tabmedii[i].prenume,tabmedii[i].media);
printf("\n ============================================");
fclose(ptrfmedii);
}
Problema
Sa se afiseze pe ecran, cautandu-se aleator in fisierul de medii creat anterior, informatiile referitoare la studentul gasit in mod aleator (folosindu-se functia de randomizare rand()) impreuna cu pozitia ocupata in fisier de acesta.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <process.h>
struct tipmedie
m; /* m este un articol de tip structura tipmedie */
void main(void)
poz=0;
printf("\n lista cu mediile studentilor in ordinea din fisier ");
printf("\n ====================================================");
printf("\n pozitia matricol nume si prenume media ");
printf("\n ====================================================");
poz=0; nc=0;
/* citirea unui articol de medii */
fread(&m,sizeof(struct tipmedie),1,ptrfmedia);
while (!feof(ptrfmedia))
printf("\n ====================================================");
rewind(ptrfmedia);
printf("\n lista cu mediile studentilor in ordine aleatoare ");
printf("\n continuati pozitionarea aleatoare in fisier?(d/n):");
r=getche();
while(r=='d')
rewind(ptrfmedia); /* repozitionarea pe inceputul fisierului */
fclose(ptrfmedia);
}
Problema
Sa se proiecteze o aplicatie care sa rezolve urmatoarele probleme: crearea, intr-o functie adecvat definita, a unui fisier cu mediile studentilor pe disc continand articole cu structura:cod student - un camp numeric de la 1 la 1000, nume - un camp de 10 caractere alfabetice, prenume - un camp de 10 caractere alfabetice si media - un camp real de la 1 la 10, actualizarea fisierului de medii (adaugari printr-o functie de adaugare , modificari printr-o functie de modificare si stergeri printr-o functie de stergere), listarea fisierului de medii (cu o functie de listare).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <process.h>
struct tipmedie
m; /* m este un articol de tip structura tipmedie */
int pozmedia[20],wpozmedia[20];
FILE *ptrfmedia;
FILE *ptrfmediaw;
FILE *ptrtindex;
int n,i;
long nrocteti,pozmodif; /* pozitii in fisier in octeti */
int wcod,poz=0,nc,wnc=0,first; /* pozitia in fisier in numar de articole */
char r,rp;
char specfism[15];
void creare(void)
printf("\n este prima creare a fisierului de medii?(d/n):");
rp=getche();
if((rp=='d')||(rp=='D'))
while ((m.cm<=0) || (m.cm>1000));
printf("\n numele studentului:");
scanf("%s",m.nume);
printf("\n prenumele studentului:");
scanf("%s",m.prenume);
do
while ((m.media<=0) || (m.media>10));
fwrite(&m,sizeof(struct tipmedie),1,ptrfmedia);
pozmedia[i]=m.cm;
i++;
printf("\n continuati introducerea de articole?(d/n):");
r=getche();
}
fwrite(&pozmedia,20*sizeof(int),1,ptrtindex);
}
else
fclose(ptrtindex);
}
void adaugare()
fread(&pozmedia,20*sizeof(int),1,ptrtindex);
fclose(ptrtindex);
fseek(ptrfmedia,0,SEEK_END);
printf("\n continuati adaugarea de articole?(d/n):");
r=getche();i=nc;;
while((r=='d') || (r=='D'))
while ((wcod<=0) || (wcod>1000));
ok=0;
for(i=0;i<nc;i++)
}
if(ok==0)
{
m.cm=wcod;
printf("\n numele studentului:");
scanf("%s",m.nume);
printf("\n prenumele studentului:");
scanf("%s",m.prenume);
do
while ((m.media<=0) || (m.media>10));
fwrite(&m,sizeof(struct tipmedie),1,ptrfmedia);
pozmedia[i]=m.cm;
printf("\n continuati introducerea de articole?(d/n):");
r=getche();
}
if((ptrtindex=fopen("tabindex","wb"))==NULL)
rewind(ptrtindex);
fwrite(&pozmedia,20*sizeof(int),1,ptrtindex);
fclose(ptrtindex);
}
void modificare()
while ((wcod<=0) || (wcod>1000));
ok=0;
for(i=0;i<nc;i++)
if (wcod==pozmedia[i])
if(ok==0)
printf("\n stud. de modif. cu codul %d nu este in fisier",wcod);
else
{
ok=0;
nrocteti=(wnc)*sizeof(struct tipmedie);
rewind(ptrfmedia);
fseek(ptrfmedia,0,SEEK_SET);
fseek(ptrfmedia,nrocteti,SEEK_SET);
pozmodif=ftell(ptrfmedia);
fread(&m,sizeof(struct tipmedie),1,ptrfmedia);
m.cm=wcod;
printf("\n numele studentului:");
scanf("%s",m.nume);
printf("\n prenumele studentului:");
scanf("%s",m.prenume);
do
while ((m.media<=0) || (m.media>10));
rewind(ptrfmedia);
fseek(ptrfmedia,0,SEEK_SET);
fseek(ptrfmedia,pozmodif,SEEK_SET);
fwrite(&m,sizeof(struct tipmedie),1,ptrfmedia);
printf("\n continuati modificarea de articole?(d/n):");
r=getche();
}
}
void stergere()
{
int ok;
if((ptrtindex=fopen("tabindex","w+b"))==NULL)
remove("fmediaw");
if((ptrfmediaw=fopen("fmediaw","wb"))==NULL)
fread(&pozmedia,20*sizeof(int),1,ptrtindex);
fclose(ptrtindex);
printf("\n continuati stergerea de articole?(d/n):");
r=getche();
while((r=='d') || (r=='D'))
while ((wcod<=0) || (wcod>1000));
ok=0;wnc=-1;
for(i=0;i<nc;i++)
}
if(ok==0)
printf("\n stud.de sters cu mat=%d nu este fis",wcod);
else
else
fwrite(&m,sizeof(struct tipmedie),1,ptrfmediaw);
i++;
}
fclose(ptrfmediaw);
for(i=0;i<20;i++)
for(i=0;i<20;i++) pozmedia[i]=0;
for(i=0;i<20;i++) pozmedia[i]=wpozmedia[i];
if((ptrfmediaw=fopen("fmediaw","r*b"))==NULL)
remove(specfism);
rewind(ptrfmedia);
if((ptrfmedia=fopen(specfism,"w+b"))==NULL)
rewind(ptrfmediaw);
fread(&m,sizeof(struct tipmedie),1,ptrfmediaw);
while (!feof(ptrfmediaw))
}
printf("\n continuati stergerea de articole?(d/n):");
r=getche();
}
if((ptrtindex=fopen("tabindex","wb"))==NULL)
rewind(ptrtindex);
fwrite(&pozmedia,20*sizeof(int),1,ptrtindex);
fclose(ptrtindex);
rewind(ptrfmedia);
}
void listare()
fread(&pozmedia,20*sizeof(int),1,ptrtindex);
fclose(ptrtindex);
rewind(ptrfmedia);
printf("\n lista cu mediile studentilor in ordinea din fisier ");
printf("\n ================================================");
printf("\n pozitia matricol nume si prenume media ");
printf("\n ================================================");
poz=0;
/* citirea unui articol de medii */
fseek(ptrfmedia,0,SEEK_SET);
fread(&m,sizeof(struct tipmedie),1,ptrfmedia);
while (!feof(ptrfmedia))
printf("\n ================================================");
printf("\n listarea tabelei de indexi:\n");
for(i=0;i<20;i++) printf("%d ",pozmedia[i]);
void main(void)
do
rewind(ptrfmedia);
printf("\n 1-crearea fisierului de medii si a tabelei de index");
printf("\n 2-adaugare in fisierul de medii si in tabela de index");
printf("\n 3-modificare in fisierul de medii si in tabela de index");
printf("\n 4-stergere in fisierul de medii si in tabela de index");
printf("\n 5-listarea fisierului de medii si a tabelei de index");
printf("\n 6-terminare aplicatie");
printf("\n optiunea aleasa (1-6):");
scanf("%d",&optiune);
}
while ((optiune<1)||(optiune>6));
fclose(ptrfmedia);
fclose(ptrtindex);
}
Problema
Sa se caute in directorul specificat toate programele sursa de tip *.CPP si sa se afiseze pe ecran, caracter cu caracter,aceste programe determinadu-se si afisandu-se pentru fiecare numarul de linii sursa.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
void main ()
printf("\n fisier:%s",specfis);
getchar();
numar_linii=0;
while (!feof(ptrfile))
putchar(c);
getchar();
}
getchar();
fclose(ptrfile);
printf("\n in fisierul %s sunt %d linii",specfis,numar_linii);
getchar();
gata=_dos_findnext(&f);
printf("\n continuati afisarea de programe *.CPP ?(d/n):");
r=getche();
}
Problema
Sa se copieze liniile unui fisier de tip text cuprinse intre numerele de secventa n1 si n2 (n1<n2) dupa a n-a linie folosidu-se o functie adecvata pentru aceasta.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
FILE *ptrfile;
FILE *ptrfman;
FILE *ptrftem;
char specfiss[20];
void mutare(int x1,int x2,int x)
if((ptrftem=fopen("ftemp","w"))==NULL)
/* citirea in gol a liniilor < n1*/
c=fgetc(ptrfile);
while((i<x1) && (!feof(ptrfile)))
if((c=='\n'))
c=fgetc(ptrfile);
i++;
}
printf("\n se copiaza liniile %d-%d in fis ftemp \n",x1,x2);
/* citirea si scrierea liniilor cuprinse intre n1 si n2 in FTEMP*/
while((i<=x2) && (i>=x1) && (!feof(ptrfile)))
if((c=='\n'))
i++;
}
c=fgetc(ptrfile);
while((i>x2) && (!feof(ptrfile)))
if((c=='\n')||(i>x2))
c=fgetc(ptrfile);
i++;
}
fclose(ptrftem);
fclose(ptrfile);
if((ptrfile=fopen(specfiss,"r"))==NULL)
if((ptrfman=fopen("fisman","w"))==NULL)
/* citirea si scrierea in FISMAN a primelor n1-1 randuri*/
i=1;
c=fgetc(ptrfile);
while((i<=x) && (!feof(ptrfile)))
if((c=='\n')||(i<x))
i++;
wc=c;
/* se citesc si se scriu randurile salvate in FTEMP */
if((ptrftem=fopen("ftemp","r"))==NULL)
c=fgetc(ptrftem);
while(!feof(ptrftem))
if (c=='\n')
}
fclose(ptrftem);
/* citirea si scrierea in FISMAN a rand. cu nr de secv>n*/
fputc(wc,ptrfman);
c=fgetc(ptrfile);
while((i>x) && (!feof(ptrfile)))
if((c=='\n')||(feof(ptrfile)))
i++;
}
fclose(ptrfile);
rewind(ptrfman);
if((ptrfman=fopen("fisman","r"))==NULL)
remove(specfiss);
if((ptrfile=fopen(specfiss,"w"))==NULL)
c=fgetc(ptrfman);
while(!feof(ptrfman))
if ((c=='\n'))
fclose(ptrfile);
fclose(ptrfman);
}
void main ()
while ((n1<1)||(n2<1)||(n1>n2)||(n<0));
mutare(n1,n2,n);
printf("\n continuati mutarea de linii ?(d/n):");
r=getch();
}
}
Probleme propuse pentru rezolvare - referat cu aceste probleme
Problema 1.
Sa se creeze, in directorul curent, mai multe fisiere text, caracter cu caracter, precizandu-se pentru fiecare, prin dialog, numele si extensia.
Problema 2.
Sa se concateneze (arhiveze) intr-un singur fisier, mai multe fisiere text, caracter cu caracter, precizandu-se pentru fiecare, prin dialog, numele si extensia.
Problema 3.
Sa se afiseze pe ecran, caracter cu caracter, mai multe fisiere text ai caror specificatori sunt furnizati prin dialog, determinandu-se si afisandu-se pentru fiecare numarul de linii.
Problema 4.
Sa se afiseze liniile unui fisier de tip text cuprinse intre numerele de secventa n1 si n2 (n1<n2) folosidu-se o functie adecvata pentru aceasta.
Problema 5.
Sa se includa, printr-o functie adecvata de includere include(), intr-un fisier text, dupa o linie al carei numar de secventa este precizat, un alt fisier text anterior creat.
Problema 6.
Sa se extraga dintr-un fisier text, printr-o functie adecvata extrage(), un grup de linii, definit prin numerele de secventa ale primei linii si ale ultimei linii din grup si sa se creeze cu aceste linii un alt fisier text.
Problema 7.
Sa se inlocuiasca intr-un fisier de tip text, printr-o functie adecvata inlocuire(), un grup de linii, delimitat de numerele de secventa ale liniilor de inceput si de sfarsit, cu un text introdus de la tastatura.
Problema 8.
Sa se mute, printr-o functie adecvata move(), un grup de linii, definit prin numerele de secventa ale primei si ultimei linii din grup, dupa o anumita linie precizata prin numarul sau de secventa.
Problema 9.
Sa se gaseasca intr-un fisier de tip text toate sirurile delimitate de separatori (definiti de programator) identice cu un sir precizat si sa se inlocuiasca cu un alt sir de asemenea precizat.
Problema 10.
Sa se stearga dintr-un fisier de tip text liniile cuprinse intre numerele de secventa n1 si n2 (n1<n2) folosidu-se o functie adecvata pentru aceasta.
Problema 11.
Sa se adauge intr-un fisier de tip text, dupa un anumit numar de linie, un grup de linii introduse de la tastatura folosidu-se o functie adecvata pentru aceasta.
Problema 12.
Sa se proiecteze o aplicatie care sa rezolve urmatoarele probleme: crearea, intr-o functie adecvat definita, a unui fisier cu automobilele dintr-un depozit de automobile, pe disc, continand articole cu structura:cod automobil - un camp numeric de la 1 la 1000, denumire automobil - un camp de 15 caractere alfabetice, cantitatea din stoc - un camp intreg de la 1 la 100, pretul automobilului, un camp intreg de la 5000 la 50000 lei, actualizarea fisierului de automobile (adaugari printr-o functie de adaugare , modificari printr-o functie de modificare si stergeri printr-o functie de stergere), listarea valorica a automobilelor din depozit (cu o functie de listare).
3. Tema de casa nr 1.
2.1. Sa se creeze un fisier de articole (materiale, produse, repere) de organizare secventiala, pornind de la informatiile introduse de la tastatura si efectuindu-se validarile corespunzatoare, cu urmatoarea structura a articolelor:
- tip material (articol) - camp numeric de o cifra zecimala cu semnificatiile: 0=articol de stoc, 1=articol de intrare, 2=articol de iesire material din stoc;
- cod gestiune- camp de tip numeric apartinand multimii gestiunilor (10,20,30,40,50,60,70,80,90);
- cod articol - camp de tip numeric apartinind multimii [100..999];
- denumirea articolului -
-
unitate masura -
- cantitatea - camp real cu 5 cifre partea intreaga si 3 cifre pentru zecimale;
- pret - camp de tip real pozitiv cu 7 cifre pentru partea intreaga si 2 cifre pentru partea fractionara;
- valoarea - camp de tip real si se obtine prin inmultirea dintre valoarea campului cantitate si valoarea campului pret;
- data de creare sau data ultimei actualizari despachetata luata din sistemul de operare.
2.2. Sa se sorteze crescator fisierul de articole de organizare secventiala creat anteror dupa cimpurile: cod gestiune, cod articol si tip articol (in aceasta ordine) creindu-se un fisier de articole sortat care se va lista, utilizindu-se algoritmul de sortare prin interschimbare.
Se va utiliza algoritmul de ordonare prin interschimbare (transpozitie).
2.3. Sa se creze fisierul de intrari articole pornind de la fisierul sortat la punctul 2.2, operandu-se pentru fiecare cod de articol toate intrarile, cu structura: cod de articol, denumire, unitatea de masura, intrari cantitative, intrari valorice. Apoi sa se listeze pe ecran continutul fisierului de intrari articole.
2.4. Sa se creze fisierul de iesiri articole pornind de la fisierul sortat la punctul operandu-se pentru fiecare cod de articol toate iesirile, cu structura: cod de articol, denumire, unitatea de masura, iesiri cantitative, iesiri valorice. Apoi sa se listeze pe ecran continutul fisierului de iesiri articole.
2.5. Sa se creze fisierul de stocuri articole pornind de la fisierul sortat la punctul 2.2 operandu-se pentru fiecare cod de articol intrarile si iesirile, cu structura: cod de articol, denumire, unitatea de masura, stoc initial, valoare stoc initial, intrari cantitative, intrari valorice, iesiri cantitative, iesiri valorice, stoc final, valoare stoc final. Apoi sa se listeze pe ecran continutul fisierului de stocuri articole.
|