Sunteți pe pagina 1din 12

Algoritmi seminar 10

Pb. 1 Scrieti un program care determin elementul maxim din fisier (fisier binar) si toate pozitiile
pe care apare el (pozitiile relative n fisier).
!"S# $eoarece numrul de aparitii ale maximului poate fi foarte mare% pozitiile pe care apare
acesta vor fi retinute ca vector cu elemente de tip int memorat ntr&un fisier binar.
Se va realiza si o func'ie care va prelua con'inutul unui fi(ier binar (i il va scrie ntr&un fi(ier text.
)xemplu
Vector: {9,4,10,10};
Rezultat:
a) se va afisa mesajul care contine valoarea maximului si se va meniona numele fisierului inar in
care sunt scrise valorile !oziiilor !e care a!are "in acest caz #is$%ozitii):
) continutul fisierului #is$!oz&est'txt in care este scris continutul fisierului inar #is$%ozitii'(at'
#is$!oz&est'txt
*ndicatii
a) se creeaz) fi*ierul +#is$Vector$'(at+ si se scrie ,n el vectorul' -e !oate folosi secvena:
FILE *f;
f=fopen("Fis2Vector.dat", "wb");
float x!"#= {9,4,10,10};
fwrite(x, si$eof(x"#), si$eof(x)%si$eof(x"#), f);
) se scrie !or.ramul care rezolva cerina (in enunt "al.oritmul !ro.ramului se afla in seminarul 9)
cu urmatoarele oservatii:
/#is$Vector$'(at0 1 conine valorile vectorului "elemente (e ti! float)
+#is$%ozitii'(at+ 1 conine !ozitiile "elemente (e ti! intre. )
1
+#is$%oz&est'txt+ 1 contine valorile ,ntre.i (in +#is$%ozitii'(at+'
c) se scrie funcia care !reia coninutului unui fi*ier inar *i ,l scrie ,ntr2unul text' -e va verifica
a!oi coninutul fisierului text'
3n(icatie:
2 antet: &oid afis'in(inIn)ext (c*ar *n+,e(in, c*ar *n+,e)ext)
2 se (esc4i(e fisierul inar !entru citire
2 se (esc4i(e fisierul text !entru scriere
2 se verifica (aca cele (ou fisiere se !ot (esc4i(e
2 (aca se !ot (esc4i(e cele (oua fisiere atunci:
2 se citeste un element (in fi*ierul inar " fread(-.,si$eof(int),!,f); )
2 atat tim! cat nu este sf5r*itul fi*ierului inar, se !une ,n fi*ierul text elementul citit (in f "fprintf
(/, "0d1n", .); ) *i se cite*te urm)torul element (in fi*ierul inar'
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Pb 0+ Scrie'i un program care va con'ine o func'ie ce va determina suma elementelor de pe
diagonala principal, (i suma elementelor de pe diagonala secundar, a matricei aflate intr&un fi(ier
binar daca matricea e patratica (matricea are elemente de tip real).
!bs# 3n ceea ce !riveste matricea: la ,nce!utul fi*ierului este memorat numarul de linii al matricei, su
forma (e numar intre. "(e ti! int); ,n continuare se afl) !e linie elementele matricei, in or(ine
lexico.rafica "ex: coor(onatele elementelor: 617617, 6176$7, ''',6$7617, 6$76$7, ''')' 8 (oua (imensiune va
treui (eterminat)'
)xemplu#
9imensiuni matrice:
m:;
n:; << (at !entru a !utea fi creat) matricea *i scris) ,n fi*ierul inar
=atricea:
9u!a rulare, se creeaz) urm)toarele fi*iere ,n (irectorul !roiectului:
$
>oninutul fi*ierelor text:
#is&ext=1'txt
#isier-um&ext'txt
*ndica'ii
a) se scriu funciile !entru:
1' alocare matrice:
float **alocare2 (int ,, int n)
3float **,!;
int i;
,! = (float**),alloc(,*si$eof(float*));
for(i=";i4,;i55)
*(,!5i)= (float*),alloc(n*si$eof(float));
ret+rn ,!;
6
$' citire matrice
&oid citire2'ina,ic (float **,!, int ,, int n)
3 int i,7;
for(i=";i4,;i55)
for(7=";74n;755)
3printf("p0d#0d#=",i,7);
scanf("0f", *(,!5i)57);
6
;
6

;' afisare matrice
&oid afisare2'ina,ic (float **,!, int ,, int n)
3 int i,7;
for(i=";i4,;i55)
3for(7=";74n;755)
printf("p0d#0d#=0f ",i,7, *(*(,!5i)57));
printf("1n");
6
6
4' (ezalocare memorie
&oid de$alocare2e, (float **,at, int ,)
3 int i;
for (i=";i4,;i55)
free (*(,at5i));
free (,at);
6
) se scrie o functie care creez) matricea si o scrie intr2un fisier inar -atr1.dat
2 antet:
&oid creare2atInFis(inar (c*ar *Fis2at) %%para,etr+ de I89 n+,ele fi:ier+l+i
2 se (eclar):
FILE *f;
int ,, n;
int i, 7;
float **,at;
2 se citesc: nr (e linii "m) si nr' (e coloane "n)
printf ("'ati nr de linii9 ");
scanf ("0d", -,);
printf ("'ati nr de coloane9 ");
scanf ("0d", -n);

2 se a!eleaza functiile (e la !asul anterior:
,at = alocare2 (,, n);
citire2'ina,ic (,at, ,, n);
afisare2'ina,ic (,at,,,n);
; se creeaz) fisierul aferent !arametrului "#is=at)
f=fopen (Fis2at, "wb");

2 in fisierul inar creat se scrie numarul (e linii m
fwrite(-,, si$eof(int), !,f); %%nr de linii
2 in acelasi fisier se scrie matricea mat' 8&?@A3? la mo(ul (e scriere !entru matrice
for(i="; i4,; i55)
for(7="; 74n; 755)
fwrite((*(,at5i)57), si$eof(float), !, f);
4
2 se (ezaloc) memoria si se inc4i(e fisierul
de$alocare2e, (,at,,);
fclose(f);

c) se scrie o functie care s) calculeze sumele (e !e (ia.onala !rinci!ala *i cea secun(ara' Rezultatul
se scrie intr2un fisier inar numit .isierSum"in.dat.
3 2 nume fisier, a(resele un(e se (e!un cele $ sume
? 2 co( eroare: 0 2 succes, 1 2 nu s2a !utut (esc4i(e fisierul, $ 2 matricea nu e !atrata'
2 antet:
int <+,e'ia/onale(c*ar *n+,e, c*ar *n+,e2) %% =n+,e> ; pt fis din care se ia, =n+,e2> ; pt fisier+l
in care se scrie infor,atia pentr+ s+,e
2 (eclarari:
int er;
FILE *f, */;
float x, sp, ss;
int ,,n,i;
2 (eterminarea celei (e2a (oua (imensiuni si calcul (e sume !entru cele (oua (ia.onale
er=!;
f=fopen(n+,e,"rb");
if(f)
3 fread(-,,si$eof(int),!,f); %%se citeste nr de linii de pe pri,a linie
fsee?(f,",<EE@AE8'); %%po$itionare c+rsor in fisier la sfarsit
n=(ftell(f);si$eof(int))%(,*si$eof(float)); %% calc+l pentr+ nr de coloane

if(,B=n)
er=2;
else
3 er="; %%,atrice patratica si fisierele s;a+ desc*is c+ s+cces
sp=";
ss=";
for(i=";i4,;i55)
3
fsee?(f,si$eof(int)5(i*,5i)*si$eof(float),<EE@A<E)); %%acesare ele,ent i#7#
fread(-x,si$eof(float),!,f);
sp5=x;
fsee?(f,si$eof(int)5(i*,5n;i;!)*si$eof(float),<EE@A<E));
fread(-x,si$eof(float),!,f);
ss5=x;
6
6

2 se ,nc4i(e fi*ierul f
2 se (esc4i(e fisierul . !entru a scrie in el sumele ss si s!' -e ,nc4i(e .'
/=fopen(n+,e2, "wb");
fwrite(-sp, si$eof(float), !,/);
fwrite(-ss, si$eof(float), !,/);
B
fclose(/);
}
ret+rn er;
() se scrie o functie care trece continutul fisierului inar -atr1.dat ,ntr2un fisier text .is/ext-1.txt

2 antet funcie
&oid afis'in(inarIn)ext (c*ar *n+,eFis(in, c*ar *n+,eFis)ext) <<afisare matrice (in inar in text

2 (eclarare variaile "FILE *f,*/; float .; int ,,n; )
2 se (esc4i(e fisierul inar "n+,eFis(in) !entru citire " cu 0r0)
2 se (esc4i fisierul text "n+,eFis)ext) !entru scriere "cu 0C0);
2 se verific) (aca se (esc4i(e f' 9aca nu se (a mesaj (e eroare' 9aca (a, atunci:
o se verifica (aca se (esc4i(e .' 9aca nu, se (a mesaj (e eroare' 9aca (a, atunci:

{ fread(-,,si$eof(int),!,f);
<<citesc !rimul element "nr (e linii), a!oi !rimul element (in matrice
fprintf (/, "0d1n", ,);
fread(-.,si$eof(float),!,f);
w*ile (Bfeof(f))
3 fprintf (/, "0C.2f", .);
fread(-.,si$eof(float),!,f);
6
6

2 se inc4i( f, .
e) se scrie o functie care trece continutul fisierului inar .isierSum"in.dat (at intr2un fisier text
.isierSum/ext.txt
2 antet
&oid afis'in(inarIn)ext! (c*ar *n+,eFis(in, c*ar *n+,eFis)ext) %%citesc fisier+l binar c+ s+,ele

2 (eclarari " FILE *f,*/; float .; int ,,n;)
2 se (esc4i(e fisierul inar "n+,eFis(in) !entru citire " cu 0r0)
2 se (esc4i fisierul text "n+,eFis)ext) !entru scriere "cu 0C0);
2 se verific) (aca se (esc4i(e f' 9aca nu se (a mesaj (e eroare' 9aca (a, atunci:
o se verifica (aca se (esc4i(e .' 9aca nu, se (a mesaj (e eroare' 9aca (a, atunci:
3
fread(-.,si$eof(float),!,f); %%citesc dia/ principala
fprintf (/, "0C.2f1n", .);
fread(-.,si$eof(float),!,f); %%citesc dia/ sec+ndara
fprintf (/, "0C.2f1n", .);
6

D
2 se inc4i( f *i .'
f) in functia main:
2 se (eclara o variaila (e ti! int " (e ex':eroare) care va lua valoarea intoarsa (e funcia <+,e'ia/onale
2 se creeaz) matricea folosin( funcia creare2atFis(inar ' Rezultat !us in fisierul =atr1'(at
2 se scrie coninutul lui 2atr!.dat ,n Fis)ext2!.txt folosin( funcia afis'in(inarIn)ext
2 se face testul !entru valoarea !rimita (e Eeroare0' 9aca eroare :: 0 atunci se scrie conintului lui
Fisier<+,(in.dat in Fisier<+,)ext.txt folosin( funcia afis'in(inarIn)ext!

2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Pb. 00 Scrie'i un program care realizeaza produsul a dou, matrice memorate n fi(iere binare.
!bs# 3n ceea ce !riveste matricile: la ,nce!utul fi*ierului este memorat num)rul (e linii al matricei, su
forma (e numar ,ntre. "(e ti! int); ,n continuare se afl) !e linie elementele matricei, in or(ine
lexico.rafica' @r' (e coloane treuie (eterminat'
)xemplu
=atricile *i valoarea ,ntoars) (e funcia Drod+s:
9u!a rulare, se creeaz) in (irectorul !roiectului fisierele:
>oninutul fi*ierelor text:
F
#is&ext=1'txt
#is&ext=$'txt
#is&extRez=atrice'txt
*ndica'ii
a) se !ot (efini
Edefine 2! "2atr!.dat"
Edefine 22 "2atr2.dat"
Edefine 2F "2atrFe$.dat"
) funcie !entru afi*are "matrice alocata static)
voi( afisare=atrice "float mat676$7, int m, int n)
{
int i, j;
for "i:0;iGm;iHH)
{
for "j:0;jGn;jHH)
!rintf"+IB'$f +, mat6i76j7);
!rintf"+Jn+);
}
!rintf"+Jn+);
}
c) funcie !entru creare matrici in fi*iere inare "!arametrii mat1 si mat$ sunt fi*ierele in care se scriu
cele (oua matrici)' %e !rima linie "in fiecare fi*ier) este scris num)rul (e linii al matricii'
&oid creare2atInFis(inar (c*ar *,at!, c*ar *,at2)
3
FILE *f, */;
int ,=2;

f=fopen (,at!, "wb");
K
/=fopen (,at2, "wb");

%%ca$ b+n
float x#2#= 332,G6,3H,266;
float .#2#=33G,I6,32,G66;

%%ca$ di,ensi+ni nepotri&ite
%%float x#H#= 332,G,J6,3H,2,266;
%%float .#2#=33G,I6,32,G66;
fwrite (-,,si$eof(int),!,f);
fwrite(x, si$eof(x"#"#), si$eof(x)%si$eof(x"#"#), f);

fwrite (-,,si$eof(int),!,/);
fwrite(., si$eof(."#"#), si$eof(.)%si$eof(."#"#), /);

fclose(f);
fclose(/);
f=fopen (,at!, "rb");
/=fopen (,at2, "rb");

afisare2atrice (x, 2, 2); %%pt ca$+l b+n
printf("1n");
afisare2atrice (., 2, 2);%%pt ca$+l b+n
6
() funcie care realizez) produsul !entru matricile (in cele (oua fi*iere inare =atr1'(at *i =atr$'(at
2 antet
int %ro(us"c4ar Lnume1, c4ar Lnume$, c4ar Lnume;)

2 (eclarare variaile: int er; #3M? Lf,L.,L4; float x,N,z; int m,n,!,O,i,j,P;
2 se (esc4i(e nume1 !entru citire "cu Er0) folosin( f
2 (aca f nu se (esc4i(e cu succes, atunci mesaj (e eroare "er:1)' 9aca f se (esc4i(e cu succes, atunci:
{
2 se (esc4i(e nume$ !entru citire "cu Er0) folosin( .' 9ac) . nu se (esc4i(e cu succes, atunci
mesaj (e eroare "er:$)' 9aca se (esc4i(e cu succes, atunci:
{
o se citeste m (in fi*ierul f , se !oziioneaz) cursorul ,n fi*ier la sf5r*it
fread(-,,si$eof(int),!,f);
fsee?(f,",<EE@AE8');
o se calculeaz) n
n=(ftell(f);si$eof(int))%(,*si$eof(float));
o se citeste ! (in fi*ierul .
fread(-p,si$eof(int),!,/);
9
o se testeaz) (aca n este (iferit (e !' 9aca (a, atunci mesaj (e eroare c) (imensiunile nu
sunt !otrivite' 9aca nu "(imensiunile sunt e.ale) atunci se !oate face inmulirea *i avem
succesiunea (e instruciuni:
{ er=";
fsee?(/,",<EE@AE8');
K=(ftell(/);si$eof(int))%(p*si$eof(float));
*=fopen(n+,eH, "wb");
fwrite(-,,si$eof(int),!,*);
o se realizeaz) ,nmulirea' 8&?@&3? la mo(ul (e accesare a elementelor (in matrici
for(i=";i4,;i55)
for(7=";74K;755)
3 $=";
fsee?(f,si$eof(int)5i*,*si$eof(float),<EE@A<E));
for(?=";?4n;?55)
3 fread(-x,si$eof(float),!,f);
fsee?(/,si$eof(int)5(?*p57)*si$eof(float),<EE@A<E));
fread(-.,si$eof(float),!,/);
$5=x*.;
6
fwrite(-$,si$eof(float),!,*);
6
o se ,nc4i(e 4
}
o se ,nc4i(e .
}
o se ,nc4i(e f
}
ret+rn er;

e) funcie (e afisare fi*ier inar in fi*ier text
&oid afis'in(inarIn)ext (c*ar *n+,eFis(in, c*ar *n+,eFis)ext)
3
FILE *f,*/;
float .;
int ,;
'''''(aca amele fi*iere se (esc4i( cu succes, atunci:
3 fread(-,,si$eof(int),!,f);
fprintf (/, "0d1n", ,);
fread(-.,si$eof(float),!,f);
w*ile (Bfeof(f))
3 fprintf (/, "0C.2f", .);
fread(-.,si$eof(float),!,f);
6
}
'''''
}
10
f) in funcia main:
2 se (eclar) o variail) numit) GeroareQ (e ti! int;
2 se creeaz) matricile =1 si =$ a!el5n( funcia creare2atInFis(inar
2 !entru control se !ot afisa cele (ou) matrici in fisere text folosin( funcia afis'in(inarIn)ext
; se oine valoare intoars) (e funcia %ro(us si se atriuie variailei GeroareQ
2 se testeaza valoarea atriuita GeroriiQ' 9aca este zero atunci se a!eleaz) funcia afis'in(inarIn)ext
(2F, "Fis)extFe$2atrice.txt") !entru a se verifica rezultatul !us in fi*ierul inar 2atrFe$.dat.
/eme pentru acasa
1' #ie un fi*ier inar ,n care este memoratR o matrice cu elemente reale "(e ti! float)' Ma ,nce!utul
fi*ierului sunt memorate numRrul (e linii *i numRrul (e coloane ale matricei, su formR (e numRr ,ntre.
"(e ti! int); ,n continuare se aflR elementele matricei, ,n or(ine lexico.raficR'
-criei un su!ro.ram care (eterminR in(icii liniilor care au elementele ,n or(ine strict crescRtoare'
Rezultatul se va !une ,ntr2un fi*ier inar "!entru control, se va vizualiza coninutul fi*ierului rezultat ,ntr2
unul text)'
ST-: -e cunosc amele (imensiuni, nu mai treuie calculat num)rul (e coloane'
$' 8ceea*i !rolema ca la !unctul 1 ,ns) se (ore*te (eterminarea in(iciilor coloanelor care au elementele
,n or(ine strict cresc)toare'
;' -criei un su!ro.ram care (etermin) suma a (ou) matrice memorate ,n fiiere inare' Rezultatul va fi
!us ,ntr2un fi*ier inar'
4' -crieti un su!ro.ram care calculeaza !ro(usul (intre o matrice cu elemente reale "memorat) ,ntr2un
fi*ier inar) si un vector cu elemente reale "memorat ,ntr2un fi*ier inar)'
B' -criei un su!ro.ram care elimin) (intr2un fiier inar valorile cu!rinse ,ntr2un interval (at 6a,7'
"3n(icatie: toate valorile care se afl) ,n afara intervalului (at vor fi co!iate ,ntr2un fiier nou, a!oi fiierul
iniial se ter.e iar numele s)u este atriuit noului fiier creat' ?ste !osiil ca noul fiier s) nu conin)
nici un element')
D' -criei un su!ro.ram care (etermin) (ac) o matrice memorat) ,ntr2un fi*ier inar este su!erior
triun.4iular)' 3n caz afirmativ, se va calcula *i (eterminantul ei'
"S matrice !atratica cu n linii L n coloane se numeste su!erior triun.4iulara (aca toate elementele aflate
su (ia.onala !rinci!ala sunt nule')
F' -criei un !ro.ram care a(au.) un vector memorat ,ntr2un fi*ier inar ca ultim) coloan) a unei matrice
memorate ,ntr2un fi*ier inar, (ac) (imensiunea este !otrivita'
!bs# in ceea ce !riveste matricea<matricile un(e nu se s!ecific) nr' (e coloane: la ,nce!utul fi*ierului este
memorat num)rul (e linii al matricei, su forma (e num)r intre. "(e ti! int); ,n continuare se afl) !e linie
elementele matricei, ,n or(ine lexico.rafica "ex: coor(onatele elementelor: 617617, 6176$7, ''',6$7617, 6$76$7,
''')' @um)rul (e coloane treuie (eterminat'
11
1$

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