Documente Academic
Documente Profesional
Documente Cultură
Algoritmi in Programare - Aplicatii
Algoritmi in Programare - Aplicatii
Exerciţii comentate
Program suma_elemente_vector;
Var
x:array[1..100] of real;
n,i:byte;
s:real;
Begin
write('Dimensiunea vectorului: ');
readln(n);
write('Elementele vectorului: ');
for i:=1 to n do read(x[i]);
s:=0;
for i:=1 to n do s:=s+x[i];
writeln('Suma = ',s:10:2)
End.
Algoritmi în programare. Aplicaţii
Program suma_elemente_rang_impar_1;
Var
x:array[1..100] of real; n,i:byte; s:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do readln(x[i]);
s:=0; i:=1;
while i<=n do
Begin
s:=s+x[i];
i:=i+2;
End;
writeln('Suma = ',s:10:2)
End.
Program suma_elemente_rang_impar_2;
Var
x:array[1..100] of real; n,i:byte; s:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do readln(x[i]);
s:=0;
for i:=1 to n do if odd(i) then s:=s+x[i];
writeln('Suma = ',s:10:2)
End.
Program suma_elemente_rang_impar_3;
Var
x:array[1..100] of real; n,i:byte; s:real;
Exerciţii comentate
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do readln(x[i]);
s:=0;
for i:=1 to round(n/2) do s:=s+x[2*i-1];
writeln('Suma = ',s:10:2)
End.
! formula de start: P = 1;
! formula recursivă: P = P Η x(i); i=1,k; x(i)>0.
Pentru economie de memorie internă, produsul se calculează direct în
variabila MEDG. Media geometrică se poate determina numai dacă numărul
elementelor pozitive (k) este mai mare decât 2.
Deoarece în limbajul Pascal nu există operatori (sau funcţii) pentru radicali
şi ridicări la putere (mai mari de ordinul doi) se utilizează formula
m (m*lna)/n
n
a =e , a > 0 , pentru determinarea căreia există funcţiile standard EXP(x)
şi LN(x).
Program media_geometrica;
Var
x:array[1..100] of real;
n,i,k:byte; medg:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin write('X(',i,') = '); readln(x[i]); end;
medg:=1; k:=0;
for i:=1 to n do
if x[i] > 0 then
begin medg:=medg * x[i]; k:=k+1 end;
if k > 1 then
begin
medg:=Exp(Ln(medg)/k);
writeln('Media geometrica = ',medg:10:2)
end
else writeln('Nu se poate calcula !');
End.
Algoritmi în programare. Aplicaţii
1.4. Determinarea poziţiei primei apariţii a unei valori date într-un vector
neordonat, de dimensiune n.
Program cautare_prima_aparitie;
Var
x:array[1..100] of real; n,i:byte; a:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = '); readln(x[i]);
end;
Write('Valoarea cautata: '); readln(a);
i:=1;
while (i<=n) and (x(i)<>a) do i:=i+1;
if i<=n then writeln('Pozitia = ',i)
else writeln('Valoare neregasita !');
End.
1.5. Determinarea poziţiei ultimei apariţii a unei valori date într-un vector
neordonat, de dimensiune n.
Program cautare_ultima_aparitie;
Var x:array[1..100] of real; n,i,poz:byte; a:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do begin
write('X(',i,') = ');
readln(x[i])
end;
write('Valoarea cautata: '); readln(a);
poz:=0;
for i:=1 to n do if x[i] = a then poz:=i;
if poz <> 0 then writeln('Pozitia = ',poz)
else writeln('Valoare neregasita!')
End.
Exerciţii comentate
1.6. Determinarea poziţiei tuturor apariţiilor unei valori date într-un vector
neordonat, de dimensiune n.
Program cautare_toate_aparitiile;
Var
x:array[1..100] of real; poz:array[1..100] of byte;
n,i,k:byte; a:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = '); readln(x[i]);
end;
write('Valoarea cautata: '); readln(a);
k:=0;
for i:=1 to n do
if x[i] = a then
begin
k:=k+1;
poz[k]:=i
end;
if k > 0 then
begin
write('Pozitiile = ');
for i:=1 to k do write(poz[i],', ')
end
else writeln('Valoare neregasita!');
End.
1.7. Căutarea unei valori date într-un şir de numere, ordonat crescător, de
dimensiune n.
Program cautare_in_vector_ordonat;
Var
x:array[1..100] of real;
n,i,s,d:byte;
a:real;
vb:boolean;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = ');
readln(x[i])
end;
write('Valoarea cautata: '); readln(a);
s:=1; d:=n; vb:=false;
repeat
i:=(s+d) div 2;
if x[i] = a then vb:=true
else if x[i] < a then s:=i+1
else d:=i-1;
until (d < s) or vb;
if vb then writeln('Pozitia = ',i)
else writeln('Valoare neregasita!');
End.
Program determinare_maxim;
Var
x:array[1..100] of real; n,i,poz:byte; max:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = ');
readln(x[i])
end;
max:=x[1]; poz:=1;
for i:=2 to n do
if x[i] > max then begin max:=x[i]; poz:=i end;
writeln('Maximul = ',max:10:2,' pe pozitia ',poz)
End.
Program determinare_pozitii_maxim_1;
Var
x:array[1..100] of real;
poz:array[1..100] of byte;
n,i,k:byte; max:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
Algoritmi în programare. Aplicaţii
for i:=1 to n do
begin
write('X(',i,') = ');
readln(x[i])
end;
max:=x[1];
for i:=2 to n do if x[i] > max then max:=x[i];
k:=0;
for i:=1 to n do
if x[i] = max then
begin
k:=k+1;
poz[k]:=i
end;
write('Maximul = ',max:10:2,' pe pozitiile ');
for i:=1 to k do write(poz[i],' ')
End.
Program determinare_pozitii_maxim_2;
Var
x:array[1..100] of real; poz:array[1..100] of byte;
n,i,k:byte; max:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = ');
readln(x[i])
end;
max:=x[1]; k:=0;
for i:=1 to n do
if x[i] >= max then
begin
if x[i] > max then begin max:=x[i]; k:=1 end
else k:=k+1;
poz[k]:=i
end;
Exerciţii comentate
Program sortare_prin_interschimbare;
Var
x:array[1..100] of real; n,i:byte; aux:real; vb:boolean;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = '); readln(x[i])
end;
repeat
vb:=false;
for i:=1 to n-1 do
if x[i] > x[i+1] then
begin
aux:=x[i];
x[i]:=x[i+1];
x[i+1]:=aux;
vb:=true
end
until not vb;
writeln(' Vectorul ordonat este:');
for i:=1 to n do writeln('X(',i,') = ',x[i]:10:2)
End.
Program sortare_prin_selectie;
Var
x:array[1..100] of real; n,i,j:byte; aux:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = ');
readln(x[i])
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if x[i] > x[j] then
begin
aux:=x[i]; x[i]:=x[j]; x[j]:=aux
end;
writeln(' Vectorul ordonat este:');
for i:=1 to n do writeln('X(',i,') = ',x[i]:10:2)
End.
Program sortare_prin_insertie;
Var
x:array[1..100] of real; n,i,j,k,poz:byte; aux:real;
Begin
write('Dimensiunea vectorului: '); readln(n);
writeln('Elementele vectorului: ');
for i:=1 to n do
begin
write('X(',i,') = ');
readln(x[i])
end;
for i:=2 to n do
if x[i] < x[i-1] then
begin
poz:=0; j:=1;
Exerciţii comentate
Prin interclasare se înţelege procesul de obţinere din două sau mai multe
mulţimi ordonate o nouă mulţime, ordonată după acelaşi criteriu. Există mai multe
variante de interclasare, exemplificate în continuare pe doi vectori, sortaţi crescător.
Program interclasare_vectori_metoda_1;
Var
x:array[1..100] of real;
y:array[1..150] of real;
z:array[1..250] of real;
m,n,i,j,k,l:byte;
Begin
write('Dimensiunea vectorului 1: '); readln(m);
writeln('Elementele vectorului 1: ');
for i:=1 to m do
begin write('X(',i,') = '); readln(x[i]) end;
write('Dimensiunea vectorului 2: '); readln(n);
writeln('Elementele vectorului 2: ');
for i:=1 to n do
begin write('Y(',i,') = '); readln(y[i]) end;
k:=0; i:=1; j:=1;
while (i <= m) and (j <= n) do
begin
k:=k+1;
if x[i] < y[j] then
begin z[k]:=x[i]; i:=i+1 end
else
begin z[k]:=y[j]; j:=j+1 end
end;
if i>m then
for l:=j to n do
Algoritmi în programare. Aplicaţii
begin
k:=k+1; z[k]:=y[l]
end
else
for l:=i to m do
begin
k:=k+1; z[k]:=x[l]
end;
writeln(' Vectorul interclasat este:');
for i:=1 to m+n do
writeln('Z(',i,') = ',z[i]:10:2)
End.
Program interclasare_vectori_metoda_2;
Var
x:array[1..101] of real;
y:array[1..151] of real;
z:array[1..250] of real;
m,n,i,j,k:byte;
Const
hv=1E10;
Begin
write('Dimensiunea vectorului 1: '); readln(m);
writeln('Elementele vectorului 1: ');
for i:=1 to m do begin
write('X(',i,') = '); readln(x[i])
end;
write('Dimensiunea vectorului 2: '); readln(n);
writeln('Elementele vectorului 2: ');
for i:=1 to n do begin
write('Y(',i,') = '); readln(y[i])
end;
k:=0; i:=1; j:=1;
while (x[i]<>hv) or (y[j]<>hv) do
begin
k:=k+1;
if x[i] < y[j] then begin
z[k]:=x[i];
i:=i+1;
Exerciţii comentate
S=0
-------------------------
j=1 S = S + a11 = a11
j=2 S = S + a12 = a11 + a12
i=1 ...
j=n S = S + a1n = a11 +...+ a1n
-------------------------
j=1 S = S + a21 = a11 +...+ a21
i=2 ...
j=n S = S + a2n = a11 +...+ a2n
…………………….
j=1 S = S + am1 = a11 +...+ am1
i=m ...
j=n S = S + amn = a11 +...+ amn
-------------------------
Algoritmi în programare. Aplicaţii
Program suma_elemente_matrice;
Var a:array[1..10,1..20] of real; m,n,i,j:byte; s:real;
Begin
write('Numarul de linii: '); readln(m);
write('Numarul de coloane: '); readln(n);
writeln('Elementele matricei: ');
for i:=1 to m do
for j:=1 to n do
begin
write('A(',i,',',j,') = ');
readln(a[i,j]);
end;
s:=0;
for i:=1 to m do
for j:=1 to n do
s:=s+a[i,j];
writeln(' Suma: ',s:15:3)
End.
Program minim_maxim_din_matrice;
Var
a:array[1..10,1..20] of real;
m,n,i,j:byte;
min,max:real;
Begin
write('Numarul de linii: ');
readln(m);
write('Numarul de coloane: ');
readln(n);
writeln('Elementele matricei: ');
for i:=1 to m do
begin
write('Linia ',i,': ');
for j:=1 to n do
read(a[i,j])
end;
max:=a[1,1];
min:=max;
for i:=1 to m do
for j:=1 to n do
if a[i,j] > max then max:=a[i,j]
else if a[i,j] < min then min:=a[i,j];
writeln(' Minim = ',min:15:3);
writeln(' Maxim = ',max:15:3)
End.
Program sume_pe_coloane;
Var
a:array[1..10,1..20] of real; s:array[1..20] of real;
m,n,i,j:byte; max:real;
Begin
write('Numarul de linii: '); readln(m);
write('Numarul de coloane: '); readln(n);
writeln('Elementele matricei: ');
for i:=1 to m do
for j:=1 to n do
begin write('A(',i,',',j,') = '); readln(a[i,j]) end;
for j:=1 to n do
begin s[j]:=0;
for i:=1 to m do s[j]:=s[j]+a[i,j];
if j = 1 then max:=s[j]
else if s[j] > max then max:=s[j]
end;
writeln('Sumele pe coloane sunt:');
for j:=1 to n do writeln(' Coloana ',j,' = ',s[j]:15:3);
writeln(' Maximul = ',max:15:3)
End.
Program maxime_pe_linii;
Var
a:array[1..10,1..20] of real; max:array[1..10] of real;
m,n,i,j:byte; maxm:real;
Exerciţii comentate
Begin
write('Numarul de linii: '); readln(m);
write('Numarul de coloane: '); readln(n);
writeln('Elementele matricei: ');
for i:=1 to m do
for j:=1 to n do
begin
write('A(',i,',',j,') = '); readln(a[i,j]);
end;
for i:=1 to m do
begin
max[i]:=a[i,1];
for j:=2 to n do
if max[i] < a[i,j] then
max[i]:=a[i,j];
if (i=1) or (maxm < max[i]) then
maxm:=max[i]; {formula de start sau recursiva}
end;
writeln(' Maximele pe linii sunt:');
for i:=1 to m do writeln('Linia ',i,' = ',max[i]:10:2);
writeln('Maximul din matrice = ',maxm:10:2)
End.
Program numarare_linii;
Var
a:array[1..10,1..20] of real; m,n,i,j,nr:byte;
Begin
write('Numarul de linii: '); readln(m);
write('Numarul de coloane: '); readln(n);
writeln('Elementele matricei: ');
for i:=1 to m do
for j:=1 to n do
begin
write('A(',i,',',j,') = ');
readln(a[i,j])
end;
nr:=0;
Algoritmi în programare. Aplicaţii
for i:=1 to m do
begin
j:=1;
while (j<=n-1) and (a[i,j]>a[i,j+1]) do j:=j+1;
if j > n-1 then nr:=nr+1;
end;
if nr > 0 then
writeln('Nr. de linii: ',nr)
else
writeln('Nu exista linii cu elemente descrescatoare !');
End.
1.17. Determinarea poziţiei primei apariţii a unei valori date într-o matrice
dreptunghiulară, de dimensiuni mΗn.
Program pozitia_primei_aparitii;
Var
a:array[1..10,1..20] of real;
m,n,i,j:byte; x:real; vb:boolean;
Begin
Write('Numarul de linii: '); Readln(m);
Write('Numarul de coloane: '); Readln(n);
Writeln('Elementele matricei: ');
For i:=1 to m do
For j:=1 to n do
begin
write('A(',i,',',j,') = ');
readln(a[i,j])
end;
Write('Valoarea cautata: '); readln(x);
vb:=false; i:=1;
While (i<=m) and not vb do
begin
j:=1;
while (j<=n) and not vb do
if a[i,j] = x then
begin
vb:=true;
Exerciţii comentate
Program inmultire_matrice;
Var
a:array[1..10,1..20] of real;
b:array[1..20,1..30] of real;
c:array[1..10,1..30] of real;
m,n,p,i,j,k:byte; x:real;
vb:boolean;
Begin
Write('Nr. de linii ale matricei deinmultit: '); Readln(m);
Write('Nr. de coloane ale matricei deinmultit: '); Readln(n);
Write('Nr. de coloane ale matricei inmultitor: '); Readln(p);
Writeln('Elementele matricei deinmultit: ');
For i:=1 to m do
For j:=1 to n do
begin
write('A(',i,',',j,') = '); readln(a[i,j])
end;
Writeln('Elementele matricei inmultitor: ');
For i:=1 to n do
For j:=1 to p do
begin
write('B(',i,',',j,') = ') readln(b[i,j])
end;
For i:=1 to m do
For j:=1 to p do
begin
c[i,j]:=0;
for k:=1 to n do c[i,j]:=c[i,j]+a[i,k]*b[k,j]
end;
Algoritmi în programare. Aplicaţii
Program ecuatie;
Var a,b,c,x,x1,x2,r,im,d:real;
Begin
Write('Coeficientii ecuatiei: '); Readln(a,b,c);
If a<>0 then
begin
d:=b*b-4*a*c;
if d>=0 then
begin
if d>0 then
begin
x1:=(-b+sqrt(d))/2/a; x2:=(-b-sqrt(d))/2/a;
writeln('X1=',x1:6:2,' X2=',x2:6:2)
end
else
begin
x:=-b/2/a; writeln('X1 = X2 = ',x:6:2)
end;
end
else
Exerciţii comentate
begin
r:=-b/2/a; im:=abs(sqrt(-d)/2/a);
write('X1=',r:6:2,'+',im:6:2,'i; X2=',
r:6:2,' -',im:6:2,'i')
end;
end
else if b<>0 then
begin
x:=-c/b;
writeln('Ecuatie de gradul I: X=',x:6:2)
end
else if c<>0 then writeln('Ecuatie imposibila !')
else writeln('Ecuatie nedeterminata !')
End.
Program cmmdc_al_doua_numere;
Var
a,b,d,i,r:word;
Begin
write('Numerele: '); readln(a,b);
d:=a; i:=b;
repeat
r:=d mod i;
if r=0 then writeln('C.m.m.d.c. = ',i)
else if r=1 then writeln('Numere prime intre ele !')
else begin d:=i; i:=r end
until r < 2
End.
Program cmmdc_al_unui_sir_de_numere;
Var
x:array[1..20] of word; k,n,d,i,r:word;
Begin
write('Dimensiunea sirului: '); readln(n);
write('Numerele: ');
for i:=1 to n do read(x[i]);
d:=x[1]; r:=0; k:=2;
while (r<>1) and (k<=n) do
begin
i:=x[k];
repeat
r:=d mod i; d:=i; i:=r
until r < 2;
k:=k+1
end;
if r<>1 then writeln('C.m.m.d.c. = ',d)
else writeln('Numere prime intre ele !')
End.
program note;
uses crt;
var a:array[1..15,1..20] of 0..10;
med:array[1..20] of real;
dsp:array[1..20] of 1..20;
stb:array[1..15] of real;
sti:array[1..15] of 1..15;
m,n,i,j,k,maxr,nr:byte;
Exerciţii comentate
vb:boolean;
begin
clrscr;
write('Nr. de studenti:');readln(m);
write('Nr. de discipline:');readln(n);
for i:=1 to m do
for j:=1 to n do begin
write('Nota studentului ',i,' la disciplina ',
j,' :');
readln(a[i,j])
end;
k:=0;
for i:=1 to m do begin
j:=1;
while (j<=n) and (a[i,j]>=5) do inc(j);
if j>n then
begin
k:=k+1;
sti[k]:=i
end
end;
if k=0 then writeln('Nu exista studenti integralisti!')
else begin
writeln('Studentii integralisti sunt:');
for i:=1 to k do write(sti[i]:4)
end;
writeln('STUDENTII BURSIERI');
writeln;
if k=0 then writeln('Nu exista bursieri!')
else
begin
vb:=false;
for i:=1 to k do begin
stb[i]:=0;
for j:=1 to n do
stb[i]:=stb[i]+a[sti[i],j];
stb[i]:=stb[i]/n;
if stb[i]>=8.5 then
begin
vb:=true;
writeln('Studentul ',sti[i],
' este bursier cu media',stb[i]:6:2);
readln
end
end;
if not vb then writeln('Nu exista bursieri!');
readln
end;
writeln;
writeln('DISCIPLINELE CU CEI MAI MULTI RESTANTIERI');
Algoritmi în programare. Aplicaţii
writeln;
for j:=1 to n do begin
k:=0;
for i:=1 to m do if a[i,j]<5 then inc(k);
if j=1 then begin
maxr:=k;
nr:=1;
dsp[nr]:=j
end
else if k>maxr then begin
maxr:=k;
nr:=1;
dsp[nr]:=j
end
else if k=maxr then begin
nr:=nr+1;
dsp[nr]:=j
end
end;
writeln('Disciplinele sunt:');
for i:=1 to nr do write(dsp[i]:4);
readln;
writeln;
writeln('MEDIA PE FIECARE DISCIPLINA');
writeln;
for j:=1 to n do begin
med[j]:=0;
k:=0;
for i:=1 to m do
if a[i,j]>=5 then
begin
inc(k);
med[j]:=med[j]+a[i,j]
end;
if k>0 then med[j]:=med[j]/k
end;
for j:=1 to n do
if med[j]<>0 then
writeln('La disciplina ',j,
' - media a fost',med[j]:6:2)
else
writeln('La disciplina ',j,
' nu a promovat nici-un student');
readln
end.
2. Subprograme interne
program consumuri;
type matrice=array[1..15,1..20] of real;
vector=array[1..15] of byte;
var a:matrice; r:vector; m,n,i,j,k:byte;
procedure consumuri_constante(m,n:byte; a:matrice;
var p:byte; var v:vector);
var i,j:byte; x:real;
begin
p:=0;
for i:=1 to m do
begin
x:=a[i,1]; j:=2;
while (j<=n) and (a[i,j]=x) do inc(j);
if j>n then begin inc(p); v[p]:=i end
end
end;
{program principal}
begin
write(’Nr. de produse:’); readln(m);
write(’Nr. de zile: ’); readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write(’consum [’,i,’,’,j,’]= ’);
readln(a[i,j])
end;
consumuri_constante(m,n,a,k,r);
if k<>0 then begin
write(’Produsele cu consumuri constante:’);
for i:=1 to k do write(r[i]:3)
end
else
writeln(’Nu exista produse cu consumuri constante!’)
end.
Algoritmi în programare. Aplicatii
program vanzari;
uses crt;
type matrice=array[1..15,1..20] of real;
vector=array[1..20] of byte;
var a:matrice; r:vector; m,n,i,j,k:byte;
procedure zile_fara_vanzari(m,n:byte; a:matrice;
var p:byte; var v:vector);
var i,j:byte;
begin
p:=0;
for j:=1 to n do
begin
i:=1;
while (i<=m) and (a[i,j]=0) do inc(i);
if i>m then begin
inc(p);
v[p]:=j
end
end
end;
{program principal}
begin
clrscr;
write(’Nr. de produse:’); readln(m);
write(’Nr. de zile: ’); readln(n);
for i:=1 to m do
for j:=1 to n do begin
write(’vanzari [’,i,’,’,j,’]=’);
readln(a[i,j])
end;
zile_fara_vanzari(m,n,a,k,r);
if k<>0 then begin
write(’Zilele fara vanzari sunt:’);
for i:=1 to k do write(r[i]:3)
end
else
writeln(’Nu exista zile fara vanzari!’);
readln
end.
Subprograme interne
program note_discipline;
uses crt;
type
matrice=array[1..15,1..20] of 0..10;
vector=array[1..15] of byte;
vector1=array[1..15] of real;
var a:matrice;
r:vector1;
s:vector;
m,n,i,j,k:byte;
procedure medii_integralisti(m,n:byte; a:matrice;
var p:byte; var v:vector1; var s:vector);
var i,j:byte; ss:real;
begin
p:=0;
for i:=1 to m do
begin
j:=1;
ss:=0;
while (j<=n) and (a[i,j]>4) do begin
ss:=ss+a[i,j];
inc(j)
end;
if j>n then
begin
inc(p);
v[p]:=ss/n;
s[p]:=i
end
end
end;
{program principal}
begin
clrscr;
write(’Nr. de studenti: ’); readln(m);
write(’Nr. de discipline:’); readln(n);
for i:=1 to m do
Algoritmi în programare. Aplicatii
begin
writeln(’Studentul ’,i);
for j:=1 to n do begin
write(’nota la disciplina ’,j,’= ’);
readln(a[i,j])
end;
end;
medii_integralisti(m,n,a,k,r,s);
if k<>0 then
begin
writeln(’Mediile studentilor integralisti sunt:’);
for i:=1 to k do
writeln(’studentul’,s[i]:2,’ cu media’,r[i]:6:2)
end
else writeln(’Nu exista studenti integralisti!’);
readln
end.
program profituri_nete;
uses crt;
type
matrice=array[1..15,1..20] of real;
vector=array[1..15] of byte;
vector1=array[1..15] of real;
var
a:matrice;
r:vector1;
s:vector;
m,n,i,j,k:byte;
c:real;
procedure profit_maxim(m,n:byte; a:matrice; var p:byte;
var max:real; var s:vector);
var
i,j:byte;
x:vector1;
Subprograme interne
begin
for i:=1 to m do
begin
x[i]:=0;
for j:=1 to n do x[i]:=x[i]+a[i,j];
if i=1 then max:=x[i]
else if x[i]>max then max:=x[i];
end;
p:=0;
for i:=1 to m do
if x[i]=max then begin inc(p); s[p]:=i end
end;
{program principal}
begin
clrscr;
write(’Nr. de societati:’); readln(m);
write(’Nr. de ani: ’); readln(n);
for i:=1 to m do begin
writeln(’Societatea ’,i);
for j:=1 to n do begin
write(’profitul net in anul ’,j,’= ’);
readln(a[i,j])
end
end;
profit_maxim(m,n,a,k,c,s);
writeln(’Profitul net maxim este ’,c:8:2);
write(’Societatile care l-au inregistrat: ’);
for i:=1 to k do write(s[i]:4)
end.
program determinare_linii_in_progresie;
uses crt;
type
matrice=array[1..10,1..15] of real;
vector=array[1..10] of boolean;
var a:matrice;
v:vector;
Algoritmi în programare. Aplicatii
vb:boolean;
i,j,k,m,n:byte;
procedure linii_pa(m,n:byte; a:matrice; var v:vector;
var er:boolean);
var i,j:byte;
begin
if n<3 then er:=true
else
begin
er:=false;
for i:=1 to m do begin
v[i]:=false;
j:=2;
while (j<=n-1)and(a[i,j]=(a[i,j-1]+a[i,j+1])/2) do
inc(j);
if j>n-1 then v[i]:=true
end {for}
end {else}
end;
{programul principal}
begin
clrscr;
write('Nr. de linii: '); readln(m);
write('Nr. de coloane:'); readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('el[',i,',',j,']=');
readln(a[i,j])
end;
linii_pa(m,n,a,v,vb);
if vb then
writeln('Matricea are mai putin de 3 coloane!')
else begin
k:=0;
for i:=1 to m do
if v[i] then
begin
writeln('Linia ',i);
inc(k)
end;
if k<>0 then
writeln('Au elementele in progresie aritmetica')
else
writeln('Nu exista linii cu elemente in progresie!')
end {else};
readln
end.
Subprograme interne
program determinare_coloane_in_progresie;
uses crt;
type
matrice=array[1..10,1..15] of real;
vector=array[1..15] of boolean;
var
a:matrice; v:vector;
vb:boolean;
i,j,k,m,n:byte;
procedure coloane_pg(m,n:byte; a:matrice; var v:vector;
var er:boolean);
var
i,j:byte;
q:real;
begin
if m<3 then er:=true
else
begin
er:=false;
for j:=1 to n do
begin
v[j]:=false; i:=3;
while i<=m do
begin
if a[1,j]<>0 then
begin
q:=a[2,j]/a[1,j];
if a[i,j]=a[i-1,j]*q then inc(i)
else i:=m+3
end
else i:=m+5;
if i=m+1 then v[j]:=true
end {while}
end {for}
end {else}
end;
Algoritmi în programare. Aplicatii
{programul principal}
begin
clrscr;
write('Nr. de linii: '); readln(m);
write('Nr. de coloane:'); readln(n);
for i:=1 to m do
for j:=1 to n do begin
write('el[',i,',',j,']=');
readln(a[i,j])
end;
coloane_pg(m,n,a,v,vb);
if vb then
writeln('Matricea are mai putin de 3 linii!')
else
begin
k:=0;
for j:=1 to m do
if v[j]=true then
begin
writeln('coloana ',j);
inc(k)
end;
if k<>0 then
writeln('Au elementele in progresie geometrica.')
else
writeln('Nu exista linii cu elemente in progresie!')
end {else}
end.
program triunghi_inferior_diagonala_principala;
uses crt;
type matrice=array[1..15,1..15] of real;
vector=array[1..120] of real;
var a:matrice;
v:vector;
i,j,m,n:byte;
procedure creare_vector(n:byte; a:matrice; var v:vector;
var k:byte);
var i,j:byte;
Subprograme interne
begin
k:=0;
for i:=1 to n do
for j:=1 to i do
if a[i,j]>0 then begin inc(k); v[k]:=a[i,j] end
end;
{programul principal}
begin
clrscr; write('Dimensiunea matricei:'); readln(n);
for i:=1 to n do
for j:=1 to n do begin
write('el[',i,',',j,']='); readln(a[i,j])
end;
creare_vector(n,a,v,m);
if m>0 then begin
writeln('Elementele vectorului sunt:');
for i:=1 to m do write(v[i]:6:2)
end
else writeln('Nu exista elemente > 0!')
end.
program triunghi_superior_diagonala_secundara;
uses crt;
type matrice=array[1..15,1..15] of word;
vector=array[1..120] of word;
var a:matrice; v:vector; i,j,m,n:byte;
procedure creare_vector(n:byte; a:matrice; var v:vector;
var k:byte);
var i,j:byte;
begin
k:=0;
for i:=1 to n do
for j:=1 to n-i+1 do
if a[i,j] mod 2=0 then begin
inc(k); v[k]:=a[i,j]
end
end;
Algoritmi în programare. Aplicatii
{programul principal}
begin
clrscr; write('Dimensiunea matricei:'); readln(n);
for i:=1 to n do
for j:=1 to n do begin
write('el[',i,',',j,']=');
readln(a[i,j])
end;
creare_vector(n,a,v,m);
if m>0 then begin
writeln('Elementele vectorului sunt:');
for i:=1 to m do write(v[i]:4)
end
else writeln('Nu exista elemente pare inferior!')
end.
program quick_sort;
uses crt;
var x:array[1..100] of real; n,i:byte;
procedure poz(p,u:byte; var k:byte);
{ procedura returneaza pozitia finala pe care o va
ocupa elementul x[k] in vectorul sortat.}
var
i,j:byte;
l,di,dj:shortint; {di, dj = pasii de incrementare pentru
i si j, indicand sensul parcurgerii}
v:real;
begin
i:=p; j:=u; di:=0; dj:=-1;
while i<j do
if x[i]>x[j] then
begin
v:=x[i]; x[i]:=x[j]; x[j]:=v;
l:=di; di:=-dj; dj:=-l;
i:=i+di; j:=j+dj
end
else begin i:=i+di; j:=j+dj end;
k:=i
end;
procedure quick(p,u:byte);
var i:byte;
begin
if p<u then
begin
poz(p,u,i); quick(p,i-1); quick(i+1,u)
end
end;
Subprograme interne
{programul principal}
begin
clrscr; write('Dimensiunea vectorului:'); readln(n);
write('Elementele vectorului:');
for i:=1 to n do begin
write('x[', i , ']= ');
readln(x[i])
end;
quick(1,n);
for i:=1 to n do write(x[i]:6:2,' ')
end.
program inter_sort;
uses crt;
var v, par:array[1..1000] of real; n,i:word;
procedure interc(l,m,r:word);
var i,j,k:word;
begin
if l<r then begin
i:=l; j:=m+1; k:=1;
while(i<=m) and (j<=r) do
begin
if v[i]<v[j] then begin
par[k]:=v[i]; i:=i+1; k:=k+1
end
else begin
par[k]:=v[j]; j:=j+1; k:=k+1
end
end;
if i<=m then
for j:=i to m do
begin par[k]:=v[j]; k:=k+1 end
Algoritmi în programare. Aplicatii
else
for i:=j to r do begin par[k]:=v[i]; k:=k+1 end
end;
for i:=0 to r-l do v[l+i]:=par[i+1]
end;
procedure inters(l,r:word);
var i:word;
begin
if l<r then begin
i:=(l+r)div 2; inters(l,i);inters(i+1,r);interc(l,i,r)
end
end;
{programul principal}
begin
clrscr;
write('Dimensiunea vectorului:'); readln(n);
write('Elementele vectorului:');
for i:=1 to n do begin
write('v[', i , ']= '); readln(v[i])
end;
inters(1,n);
for i:=1 to n do write(v[i]:8:2,' ')
end.
program verificare_matrice_simetrica;
type
matrice=array[1..10,1..10] of real;
var
a:matrice;
m,i,j:byte; {i si j sunt variabile globale}
function simetrica(m:byte; a:matrice):boolean;
var
i,j:byte; {i si j sunt variabile locale}
begin
simetrica:=true;
for i:=1 to m do
for j:=1 to i-1 do
if a[i,j] <> a[j,i] then simetrica:=false
end;
{program principal}
begin
write('Nr. de linii: '); readln(m);
write('Nr. de coloane: '); readln(n);
Subprograme interne
for i:=1 to m do
for j:=1 to n do
begin
write('(',i,',',j,')=' );
readln(a[i,j])
end;
if simetrica(m,n,a) then
writeln('Matricea este simetrica !')
else writeln('Matricea nu este simetrica !')
end.
program urma_matricei;
type matrice=array[1..10,1..10] of real;
var a:matrice; m,i,j:byte;
function urma(m:byte; a:matrice):real;
var i:byte; s:real;
begin
s:=0;
for i:=1 to m do s:=s+a[i,i];
urma:=s
end;
{program principal}
begin
write('Dimensiunea matricei: '); readln(m);
for i:=1 to m do
for j:=1 to m do begin
write('(',i,',',j,')=' ); readln(a[i,j])
end;
writeln('Urma matricei = ',urma(m,a):10:2)
end.
program amplitudine;
uses crt;
type vector=array[1..100] of real;
var v:vector; n,i:byte;
function amplit(n:byte; v:vector):real;
var max,min:real; i:byte;
function maxim(m:byte; x:vector):real;
var r:real; i:byte;
begin
r:=x[1];
for i:=2 to m do if x[i]>r then r:=x[i];
maxim:=r
end;
begin
max:=maxim(v,n);
for i:=1 to n do v[i]:=-v[i];
min:=-maxim(v,n);
amplit:=abs(max-min)
end;
{programul principal}
begin
clrscr; write('Nr. de elemente:'); readln(n);
for i:=1 to n do
begin write('v[',i,']='); readln(v[i]) end;
writeln('Amplitudinea vectorului =',amplit(v,n):8:2);
readln
end.
program cmmdc_mat;
uses crt;
type
matrice=array[1..10,1..15] of word;
Subprograme interne
vector=array[1..15] of word;
var a:matrice;
m,n,i,j:byte;
c:word;
function cmmdc(m,n:byte; a:matrice):word;
var x,y:vector;
i,j:byte;
function cmmdc_vect(n:byte; v:vector):word;
var i:byte;
deim,imp,rest:word;
begin
deim:=v[1]; rest:=0; i:=2;
while (i<=n) and (rest<>1) do
begin
imp:=v[i];
repeat
rest:=deim mod imp;
deim:=imp;
imp:=rest
until rest<2;
inc(i)
end;
if rest<>1 then cmmdc_vect:=deim
else cmmdc_vect:=1
end;
begin
for i:=1 to m do
begin
for j:=1 to n do x[j]:=a[i,j]; {salvare linie i}
y[i]:=cmmdc_vect(n,x) {cmmdc de pe linia i}
end;
cmmdc:=cmmdc_vect(m,y)
end;
{programul principal}
begin
clrscr;
write('Nr. de linii:'); readln(m);
write('Nr. de coloane:'); readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln(a[i,j])
end;
c:=cmmdc(m,n,a);
if c<>1 then writeln('CMMDC din matrice =',c:4)
else writeln('Numere prime intre ele!');
readln
end.
Algoritmi în programare. Aplicatii
program p_a_c;
var
n,k:byte;
function permutari(n:byte):real;
var
i:byte;
r:real;
begin
r:=1;
for i:=2 to n do r:=r*i;
permutari:=r
end;
function aranjamente(n,k:byte):longint;
begin
aranjamente:=trunc(permutari(n)/permutari(n-k))
end;
function combinari(n,k:byte):longint;
begin
combinari:=trunc(aranjamente(n,k)/permutari(k))
end;
{programul principal}
begin
write('n = '); readln(n);
write('k (0<k≤n) = '); readln(k);
writeln('Permutari de',n,' = ',permutari(n):10:0);
writeln('Aranjamente de ',n,' luate cate ',k,' = ',
aranjamente(n,k));
writeln('Combinari de ',n,' luate cate ',k,' = ',
combinari(n,k))
end.
program siruri;
uses crt;
var s1,s2,s:string;
function interclasare(var s1,s2:string):string;
var
rez:string;
i,j,k,l:byte;
procedure sortare_sir(var s:string);
var
i,j:byte; c:char;
begin
for i:=1 to length(s)-1 do
for j:=i+1 to length(s) do
if s[i]>s[j] then begin
c:=s[i];
s[i]:=s[j];
s[j]:=c
end
end;
begin
sortare_sir(s1);
sortare_sir(s2);
i:=1; j:=1; k:=0;
while (i<=length(s1)) and (j<=length(s2)) do
if s1[i]<s2[j] then begin
inc(k);
rez[k]:=s1[i];
inc(i)
end
else begin
inc(k);
rez[k]:=s2[j];
inc(j)
end;
if i>length(s1) then
for l:=j to length(s2) do
begin
inc(k);
rez[k]:=s2[l]
end
else
for l:=i to length(s1) do
begin
inc(k);
rez[k]:=s1[l]
end;
{memorare lungime efectiva}
rez[0]:=chr(length(s1)+length(s2));
interclasare:=rez
end;
Algoritmi în programare. Aplicatii
{programul principal}
begin
clrscr;
writeln('Primul sir (maxim 126 de caractere):');
readln(s1);
write('Al doilea sir (maxim 126 de caractere):');
readln(s2);
writeln('Sirul rezultat este:');
writeln(interclasare(s1,s2))
readln
end.
3. Subprograme externe
IMPLEMENTATION
procedure sortare(n:byte; var v:multime);
var i:byte; aux:integer; vb:boolean;
begin
repeat
vb:=false;
for i:=1 to n-1 do
if v[i]>v[i+1] then begin
aux:=v[i];
v[i]:=v[i+1];
v[i+1]:=aux;
vb:=true
end
until not vb
end;
procedure compactare(var n:byte; var v:multime);
var i,j,k:byte;
begin
sortare(n,v);
k:=0; i:=1;
while i<=n-k do
if v[i]=v[i+1] then begin
k:=k+1;
for j:=i to n-k+1 do v[j]:=v[j+1]
end
else inc(i);
n:=n-k
end;
procedure reuniune;
const hv=maxint;
var i,j,k,l:byte;
begin
k:=0; i:=1; j:=1;
while (a[i]<>hv) or (b[j]<>hv) do
if a[i]<b[j] then begin
inc(k);
c[k]:=a[i];
inc(i);
if i>m then a[i]:=hv
end
else if a[i]>b[j] then begin
inc(k);
c[k]:=b[j];
inc(j);
if j>n then b[j]:=hv
end
else begin inc(i); if i>m then a[i]:=hv end;
card:=k
end;
Subprograme externe
procedure intersectie;
var i,j,k:byte;
begin
k:=0; i:=1; j:=1;
while (i<=m) and (j<=n) do
if a[i]=b[j] then begin
inc(k);
c[k]:=a[i];
i:=i+1
end
else if a[i]>b[j] then inc(j) else inc(i);
card:=k
end;
procedure diferenta;
var i,j,k:byte;
begin
k:=0;
for i:=1 to m do
begin
j:=1;
while (a[i]<>b[j]) and (j<=n) do inc(j);
if j>n then begin inc(k);
c[k]:=a[i]
end
end;
card:=k
end;
procedure produs_cartezian;
var i,j,k:byte;
begin
k:=0;
for i:=1 to m do
for j:=1 to n do
begin
inc(k);
c[k].x:=a[i];
c[k].y:=b[j]
end
end;
BEGIN
END.
∑ x i ⋅ fi ∑ (x i − x )2 ⋅ f i
Media aritmetica ponderata: x = i =1
n
, dispersia: s =
2 i =1
n
si
∑fi
i =1
∑ fi
i =1
urmatoarea:
• n = numarul de observatii statistice (parametru de intrare) ;
• x = sirul initial de observatii statistice (parametru de intrare) ;
• y = multimea valorilor unice ale caracteristicii (parametru de iesire);
• f = vectorul de frecvente asociat multimii y (parametru de iesire);
• k = numarul de valori unice identificate în x - cardinalul multimii y
(parametru de iesire) .
unit statist;
INTERFACE
type vector=array[1..50] of real;
vector1=array[1..50] of byte;
procedure frecvente_1(n:byte; var x,y:vector; var f:vector1;
var k:byte);
procedure frecvente_2(n:byte; var x,y:vector; var f:vector1;
var k:byte);
function media(n:byte; var x:vector):real;
function dispersia(n:byte; var x:vector):real;
function abaterea_medie_patratica(n:byte; var x:vector):real;
IMPLEMENTATION
var
y:vector; f:vector1;
dim:byte;
Subprograme externe
function dispersia;
var
m:real; dim,i:byte; s:real;
begin
m:=media(n,x,y,f);
frecvente_2(n,x,y,f,dim);
s:=0;
for i:=1 to dim do s:=s+sqr(y[i]-m)*f[i];
dispersia:=s/n
end;
function abaterea_medie_patratica;
begin
abaterea_medie_patratica:=sqrt(dispersia(n,x,y,f))
end;
end.
unit masive;
INTERFACE
uses crt;
type {tipuri publice}
masiv3d=array[1..10,1..10,1..10] of real;
matrice=array[1..20,1..20] of real;
matrice1=array[1..20,1..20] of word;
matrice2=array[1..20,1..20] of boolean;
vector=array[1..100] of real;
vector1=array[1..20] of byte;
vector2=array['A'..'Z'] of byte;
{determinarea valorii unui polinom intr-un punct dat}
function polinom(grad:byte; x:real; var coef:vector):real;
{determinarea numarului de elemente pare de pe fiecare linie
a unei matrice}
procedure el_pare(m,n:byte; a:matrice1; var rez:vector1);
{insumarea elementelor strict negative ale unui masiv
tridimensional}
function suma_tridim(m,n,p:byte; var t:masiv3d):real;
{inserarea valorii 0 intre oricare doua elemente ale unui
vector}
procedure inserare_0(var n:byte; var v:vector);
{determinarea liniilor cu elementele in ordine strict
crescatoare dintr-o matrice dreptunghiulara – 2 variante}
procedure linii_cresc1(m,n:byte; a:matrice;
var nr:byte; var v:vector1);
procedure linii_cresc2(m,n:byte; a:matrice; var v:vector1);
{cautarea unei valori intr-un vector neordonat – 2 variante}
function cautare1(n:byte; v:vector; x:real):boolean;
function cautare2(n:byte; v:vector; x:real):byte;
{determinarea valorii maxime din fiecare plan al unui masiv
tridimensional}
procedure maxim_plan3d(m,n,p:byte; var t:masiv3d;
var v:vector);
Algoritmi în programare. Aplicatii
IMPLEMENTATION
var {variabile globale unitatii, nepublice}
i,j,k:byte;
function polinom;
var
val,temp:real;
begin
temp:=1; val:=coef[1];
for i:=2 to grad+1 do
begin
temp:=temp*x;
val:=val+coef[i]*temp
end;
polinom:=val
end;
procedure el_pare;
{matricea trebuie sa aiba elemente naturale}
begin
for i:=1 to m do begin
rez[i]:=0;
for j:=1 to n do
if (a[i,j] mod 2)=0 then inc(rez[i])
end
end;
function suma_tridim;
{daca rezultatul este 0 inseamna ca masivul nu contine
elemente strict negative}
var s:real;
begin
s:=0;
for i:=1 to m do
for j:=1 to n do
for k:=1 to p do
Algoritmi în programare. Aplicatii
end
else inc(i)
end;
procedure maxim_plan3d;
{masivul tridimensional este tratat ca un vector
de matrice, de maxim 10 componente}
begin
for i:=1 to m do
begin
v[i]:=t[i,1,1];
for j:=1 to n do
for k:=1 to p do
if t[i,j,k]>v[i] then v[i]:=t[i,j,k]
end
end;
procedure litere;
{nu se fac deosebiri intre litere mari si mici}
var i:char;
begin
for i:='A' to 'Z' do v[i]:=0;
for j:=1 to length(s) do inc(v[upcase(s[j])])
end;
function cautare_binara;
{vectorul are elementele obligatoriu sortate}
var cb,prim,ultim:byte;
begin
prim:=1; ultim:=n; cb:=0;
repeat
i:=(prim+ultim) div 2;
if v[i]=x then cb:=i
else if x<v[i] then ultim:=i-1
else prim:=i+1
until (cb<>0) or (prim>ultim);
cautare_binara:=cb
end;
procedure transpusa;
{transpusa se construieste invers lexicografic}
begin
for i:=1 to m do
for j:=1 to n do
at[j,i]:=a[i,j]
end;
procedure compactare;
{dupa compactare vectorul v are n>=0 componente}
var min,max:real;
begin
min:=v[1]; max:=v[1]; {se determina min si max}
for i:=2 to n do
if v[i]<min then min:=v[i]
else if v[i]>max then max:=v[i];
Algoritmi în programare. Aplicatii
k:=0; i:=1;
while i<=n-k do {se elimina elem. egale cu min sau max}
begin
if (v[i]=min) or (v[i]=max) then
begin
for j:=i to n-k-1 do v[j]:=v[j+1];
inc(k);
end
else inc(i)
end;
n:=n-k {nr. de componente dupa compactare}
end;
procedure matrice_la_putere;
{puterea este p>=0}
var b:matrice;
l:byte;
begin
for i:=1 to n do {initializare matrice unitate}
for j:=1 to n do
if i=j then ap[i,j]:=1 else ap[i,j]:=0;
for k:=1 to p do {ridicare la puterea p}
begin
for i:=1 to n do
for j:=1 to n do
begin
b[i,j]:=0;
for l:=1 to n do b[i,j]:=b[i,j]+ap[i,l]*a[l,j]
end;
for i:=1 to n do
for j:=1 to n do
ap[i,j]:=b[i,j]
end
end;
procedure transformare_litere;
begin
for i:=1 to length(s) do s[i]:=upcase(s[i])
end;
procedure maxim_coloane;
begin
for j:=1 to n do {vectorul poate avea max. 20 de elem.}
begin
v[j]:=a[1,j];
for i:=2 to m do if a[i,j]>v[j] then v[j]:=a[i,j]
end
end;
procedure medie_geom;
begin
er:=false; mg:=1;
for i:=1 to n do mg:=mg*v[i];
if mg>=0 then mg:=exp(ln(mg)/n)
Subprograme externe
var l:byte;
begin
k:=0; i:=1; j:=1;
while (i<=m) and (j<=n) do begin
inc(k);
if a[i]<b[j] then begin c[k]:=a[i]; inc(i) end
else begin c[k]:=b[j]; inc(j) end
end;
if i>m then for l:=j to n do begin
inc(k); c[k]:=b[l]
end
else for l:=i to m do begin
inc(k); c[k]:=a[l]
end
end;
procedure vector_x_matrice;
begin
for j:=1 to n do begin
x[j]:=0;
for i:=1 to m do x[j]:=x[j]+v[i]*a[i,j]
end
end;
procedure citire_vector; {cate un element pe rand}
begin
write('Nr. de elemente:'); readln(n);
for i:=1 to n do begin
write('el[',i,']='); readln(v[i])
end
end;
procedure afisare_vector; {pe acelasi rand al monitorului}
begin
for i:=1 to n do write(v[i]:6:2)
end;
end;
BEGIN
END.
3.4. Sa se realizeze programul Pascal care apeleaza subprograme din unitatea
conceputa la exercitiul 3.3.
Programul principal care apeleaza unitatea masive este conceput
multifunctional (modularizat), astfel încât utilizatorul sa poata opta pentru una din
functiuni, având posibilitatea reluarii prin citirea de la tastatura a optiunii dorite.
program apelator_masive;
uses masive,crt;
var a,b,c:matrice;
x,y,z:vector;
a1:matrice1;
v1:vector1;
v2:vector2;
t:masiv3D;
s:string;
cc:char;
i,j,k,l,m,n,opt:byte;
p:real;
vb:boolean;
procedure meniu;
begin
clrscr;
textcolor(yellow+blink);
gotoxy(25,1); write(' « APLICATIE CU SUBPROGRAME »');
textcolor(white);
gotoxy(1,5); write(' 1 ? Valoare polinom intr- un punct dat');
gotoxy(1,6); write(' 2 ? Elemente pare pe linie matrice');
gotoxy(1,7); write(' 3 ? Suma elemente negative masiv 3D');
gotoxy(1,8); write(' 4 ? Inserare 0 intre elemente vector');
gotoxy(1,9); write(' 5 ? Linii cu elemente crescatoare var1');
gotoxy(1,10); write(' 6 ? Linii cu elemente crescatoare var2');
gotoxy(1,11); write(' 7 ? Cautare in vector oarecare var1');
gotoxy(1,12); write(' 8 ? Cautare in vector oarecare var2');
gotoxy(1,13); write(' 9 ? Maxim din fiecare plan masiv 3D');
gotoxy(1,14); write('10 ? Aparitii litere in text');
gotoxy(1,15); write('11 ? Cautare in vector ordonat');
gotoxy(1,16); write('12 ? Transpusa unei matrice');
gotoxy(1,17); write('13 ? Compactare vector eliminand max/min');
gotoxy(1,18); write('14 ? Matrice la o putere data');
gotoxy(41,5); write(' |15 ? Transformare litere mici in mari');
gotoxy(41,6); write(' |16 ? Maxim pe fiecare coloana matrice');
gotoxy(41,7); write(' |17 ? Medie geometrica elemente vector');
gotoxy(41,8); write(' |18 ? Medie aritmetica elemente < 0');
gotoxy(41,9); write(' |19 ? Produs vectorial intre diagonale');
gotoxy(41,10); write('|20 ? Produs scalar intre diagonale');
gotoxy(41,11); write('|21 ? Produs elemente > 0 din vector');
gotoxy(41,12); write('|22 ? Medie aritmetica elemente nenule');
gotoxy(41,13); write('|23 ? Medie armonica elemente vector');
gotoxy(41,14); write('|24 ? Inmultirea a doua matrice');
gotoxy(41,15); write('|25 ? Sortare vector prin interschimbare');
Subprograme externe
citire_matrice(n,n,a);
write('Puterea la care se va ridica matricea:');
readln(l);
matrice_la_putere(n,l,a,b);
writeln('Matricea rezultat este:');
afisare_matrice(n,n,b);
readln
end;
15: begin
clrscr;
writeln('Textul de prelucrat:'); readln(s);
transformare_litere(s);
writeln('Textul transformat in litere mari este:');
writeln(s);
readln
end;
16: begin
clrscr;
citire_matrice(m,n,a);
maxim_coloane(m,n,a,x);
writeln('Elementele maxime pe fiecare coloana sunt:');
afisare_vector(n,x);
readln
end;
17: begin
clrscr;
citire_vector(n,x);
medie_geom(n,x,p,vb);
if vb then
writeln('Media geometrica nu se poate calcula!')
else writeln('Media geometrica este',p:6:2);
readln
end;
18: begin
clrscr;
citir e_vector(n,x);
p:=medie_aritm_negative(n,x);
if p<0 then writeln('Media aritmetica este',p:6:2)
else writeln('Nu exista elemente negative in vector!');
readln
end;
19: begin
clrscr;
citire_matrice(n,n,a);
produs_vectorial_diagonale(n,a,x);
writeln('Rezultatul este:');
afisare_vector(n,x);
readln
end;
20: begin
clrscr;
citire_matrice(n,n,a);
writeln('Produsul scalar este',
produs_scalar_diagonale(n,a):6:2);
readln
Subprograme externe
end;
21: begin
clrscr;
citire_vector(n,x);
p:=produs_elem_pozitive(n,x);
if p>0 then writeln('Produsul este',p:6:2)
else writeln('Nu exista elemente pozitive!');
readln
end;
22: begin
clrscr;
citire_vector(n,x);
p:=ma_nenule(n,x);
if p<>0 then writeln('Media aritmetica este',p:6:2)
else writeln('Nu exista elemente nenule in vector!');
readln
end;
23: begin
clrscr;
citire_vector(n,x);
medie_armonica(n,x,p,vb);
if vb then
writeln('Media armonica nu se poate calcula!')
else writeln('Media armonica este',p:6:2);
readln
end;
24: begin
clrscr;
citire_matrice(m,n,a);
citire_matrice(k,l,b);
if n<>k then writeln('Dimensiuni incompatibile!')
else begin
produs_matrice(m,n,l,a,b,c);
writeln('Matricea rezultat este:');
afisare_matrice(m,l,c)
end;
readln
end;
25: begin
clrscr;
citire_vector(n,x);
sortare1(n,x);
writeln('Vectorul sortat prin interschimbare este:');
afisare_vector(n,x);
readln
end;
26: begin
clrscr;
citire_vector(n,x);
sortare2(n,x);
writeln('Vectorul sortat prin selectie este:');
afisare_vector(n,x);
readln
end;
27: begin
Algoritmi în programare. Aplicatii
clrscr;
writeln('ATENTIE! Vectorii trebuie sa fie sortati !!!');
writeln('Primul vector');
citire_vector(n,x);
writeln('Al doilea vector');
citire_vector(m,y);
interclasare(n,m,x,y,z);
writeln('Vectorul rezultat al interclasarii este:');
afisare_vector(n+m,z);
readln
end;
28: begin
clrscr;
citire_vector(n,x);
citire_matrice(m,k,a);
if n<>m then writeln('Dimensiuni incompatibile!')
else begin
vector_x_matrice(m,k,x,a,y);
writeln('Rezultatul inmultirii este:');
afisare_vector(k,y)
end;
readln
end
else begin
gotoxy(48,22);clreol;
textcolor(red+blink);
write('OPTIUNE ERONATA!',#7);
readln;
textcolor(white)
end
end;
meniu
end
end.
program citire_afisare_matrice_booleana;
var
a:array[1..10,1..20] of boolean;
i,j,m,n,x:byte;
begin
write('Nr. de linii: ');
readln(m);
write('Nr. de coloane: ');
readln(n);
unit recursiv;
INTERFACE
type
{tipuri publice}
vector=array[1..100] of real;
matrice=array[1..20,1..20] of real;
{suma elementelor unui vector}
function suma(n:byte; var v:vector):real;
{produsul elementelor unui vector}
function produs(n:byte; var v:vector):real;
{factorialul unui numar natural}
function factorial(n:byte):real;
{generarea unui termen din sirul lui Fibonacci}
function fibonacci(n:byte):longint;
program apelator_recursiv;
uses recursiv,masive,crt;
var
a,b:matrice;
x,y:vector;
i,j,m,n,opt:byte;
p:real;
procedure meniu;
begin
clrscr;
textcolor(yellow+blink);
gotoxy(20,1); write('« APLICATIE CU SUBPROGRAME RECURSIVE »');
textcolor(white);
gotoxy(1,5); write(' 1 ? Suma elementelor unui vector');
gotoxy(1,6); write(' 2 ? Produsul elementelor unui vector');
gotoxy(1,7); write(' 3 ? Factorialul unui numar natural');
gotoxy(1,8); write(' 4 ? Generarea unui termen Fibonacci');
gotoxy(1,9); write(' 5 ? Minimul dintr-un vector');
gotoxy(1,10); write(' 6 ? Maximul dintr-un vector');
gotoxy(1,11); write(' 7 ? Produsul scalar dintre doi vectori');
gotoxy(1,12); write(' 8 ? Sortarea unui vector');
gotoxy(1,13); write(' 9 ? Valorea unui polinom intr -un punct');
gotoxy(1,14); write('10 ? Ridicarea unei matrice la o putere');
textcolor(magenta+blink);
gotoxy(27,20);
write('Pentru iesire tastati 0');
textcolor(yellow+blink);
gotoxy(30,22);
clreol;
write('Alegeti optiunea: ');
textcolor(white);
readln(opt)
end;
{programul principal}
begin
meniu;
while opt<>0 do begin
case opt of
1: begin
clrscr;
citire_vector(n,x);
writeln('Suma elementelor este', suma(n,x):8:2);
readln
end;
Subprograme recursive
2: begin
clrscr;
citire_vector(n,x);
writeln('Produsul elementelor este', produs(n,x):8:2);
readln
end;
3: begin
clrscr;
write('Numarul:'); readln(n);
writeln(n,'!=',fact orial(n):8);
readln
end;
4: begin
clrscr;
write('Termenul Fibonacci de generat:'); readln(n);
writeln('Al ',n,'-lea termen este',fibonacci(n):6);
readln
end;
5: begin
clrscr;
citire_vector(n,x);
writeln('Minimul din vector este', min(n,x):8:2);
readln
end;
6: begin
clrscr;
citire_vector(n,x);
maxim(n,x,p);
writeln('Maximul din vector este', p:8:2);
readln
end;
7: begin
clrscr;
citire_vector(n,x); {citire vector 1}
citire_vector(m,y); {citire vector 2}
if n<>m then writeln('Dimensiuni incompatibile!')
else writeln('Produsul scalar este', ps(n,x,y):8:2);
readln
end;
8: begin
clrscr;
citire_vector(n,x);
sort(n,x);
writeln('Vectorul sortat este:');
afisare_vector(n,x);
readln
end;
9: begin
clrscr;
write('Gradul polinomului:'); readln(n);
writeln('Coeficientii polinomului:');
for i:=1 to n+1 do begin
write('coeficientul lui x la puterea ',i-1,' = ');
readln(x[i])
end;
Algoritmi în programare. Aplicatii
Una din aplicaţiile des întâlnite în lucrul cu fişiere este memorarea masivelor
de date de dimensiuni mari, care fac imposibilă aducerea integrală a lor în memoria
internă. Problema principală a prelucrării masivelor (vectori, matrice etc.) memorate
în fişiere binare o constituie determinarea poziţiei unui anumit element din masiv în
cadrul fişierului. Indiferent de numărul de dimensiuni ale masivului şi de modalităţile
de memorare a elementelor sale în cadrul fişierului, legătura între elementul de masiv
care se referă şi numărul relativ al articolului care îl conţine se realizează pe baza
funcţiei rang, similară celei implementate pentru datele de tip ARRAY.
În cazul masivelor memorate în fişiere, prelucrarea acestora depinde de
unele caracteristici particulare: numărul de dimensiuni ale masivului; ordinea de
memorare în fişier (lexicografică sau invers lexicografică); modul de memorare (dens
sau nedens); ordinea de parcurgere a masivului.
unit unit_vec;
INTERFACE
uses crt;
type tipfis=file of real;
procedure creare_vector(var f:tipfis; var nume:string);
procedure listare_vector(var f:tipfis; var nume:string);
procedure sortare_vector(var f:tipfis; var nume:string);
procedure min_max_vector(var f:tipfis; var nume:string;
var min,max:real);
procedure interclasare(var f,g,h:tipfis;
var nume1,nume2,nume3: string);
procedure produs_vectorial(var f:tipfis; var nume:string);
IMPLEMENTATION
var n,i,j:word; x,y,z,hv:real;
procedure creare_vector;
begin
clrscr; assign(f,nume); rewrite(f);
write('Dimensiune vector: '); readln(n);
for i:=1 to n do
begin
write('x(',i:2,') = '); readln(x); write(f,x)
end;
close(f)
end;
procedure listare_vector;
begin
clrscr; assign(f,nume); reset(f);
for i:=1 to filesize(f) do
begin read(f,x); writeln('x(',i:2,') = ',x:10:2) end;
close(f)
end;
procedure sortare_vector;
begin
clrscr; assign(f,nume); reset(f); n:=filesize(f);
for i:=1 to n-1 do
begin
seek(f,i-1); read(f,x);
for j:=i+1 to n do
begin
seek(f,j-1); read(f,y);
if x>y then
begin
seek(f,i-1); write(f,y);
seek(f,j-1); write(f,x);
x:=y
end
end
end;
close(f)
end;
Masive memorate în fişiere
procedure min_max_vector;
begin
assign(f,nume); reset(f);
read(f,max);
min:=max;
for i:=2 to filesize(f) do
begin
read(f,x);
if x>max then max:=x
else if x<min then min:=x
end;
close(f)
end;
procedure interclasare;
begin
hv:=1000000;
sortare_vector(f,nume1);
sortare_vector(g,nume2);
reset(f); reset(g);
assign(h,nume3);
rewrite(h);
read(f,x);
read(g,y);
while (x<>hv) or (y<>hv) do
if x<y then
begin
write(h,x);
if eof(f) then x:=hv else read(f,x)
end
else
begin
write(h,y);
if eof(g) then y:=hv else read(g,y)
end;
close(f); close(g); close(h)
end;
procedure produs_vectorial;
begin
assign(f,nume); reset(f);
n:=filesize(f) div 2;
for i:=1 to n do
begin
seek(f,i-1); read(f,x);
seek(f,n+i-1); read(f,y);
z:=x*y;
seek(f,2*n+i-1); write(f,z)
end;
close(f);
end;
end.
Algoritmi în programare. Aplicaţii
linii este accesat direct pe baza funcţiei rang, celelalte elemente fiind accesate
secvenţial. Rezultatul se depune într-un vector, memorat în memoria principală.
• Transpusa determină transpusa unei matrice dreptunghiulare, memorată
într-un fişier binar. Rezultatul este depus într-un alt fişier binar, cu structură similară
fişierului iniţial. Fişierul de intrare este parcurs în acces direct, iar cel de ieşire este
creat în acces secvenţial.
• Adunare_matrice determină suma a două matrice dreptunghiulare,
memorate în câte un fişier binar. Rezultatul este memorat similar, într-un alt fişier
binar. Fişierele de intrare, precum şi cel de ieşire, sunt parcurse secvenţial.
• Produs_matrice realizează înmulţirea a două matrice dreptunghiulare,
memorate în câte un fişier binar. Rezultatul este memorat similar, într-un alt fişier
binar. Fişierele de intrare sunt parcurse în acces direct, iar cel de ieşire este creat în
acces secvenţial.
• Coloane_progr_aritm determină coloanele cu elemente în progresie
aritmetică ale unei matrice dreptunghiulare, memorată într-un fişier binar. Fişierul de
intrare se parcurge în acces direct, iar rezultatul de depune într-un vector, memorat în
memoria principală. Pentru ca problema să aibă sens, matricea trebuie să aibă minim
trei linii.
unit unit_mat;
INTERFACE
uses crt;
type art=record
case boolean of
false:(dim:word);
true:(a:real)
end;
tipfis=file of art;
vector=array[1..100] of real;
procedure creare_matrice(var f:tipfis; var nume:string);
procedure listare_matrice(var f:tipfis; var nume:string);
procedure maxime_pe_coloane(var f:tipfis; var nume:string;
var nrc:word; var max:vector);
procedure determinare_linii(var f:tipfis; var nume:string;
var k:word; var v:vector);
procedure coloane_progr_aritm(var f:tipfis; var nume:string;
var k:word; var v:vector);
procedure transpusa(var f,g:tipfis; var nume1,nume2:string);
procedure adunare_matrice(var f,g,h:tipfis; var nume1,nume2,
nume3 :string);
procedure produs_matrice(var f,g,h:tipfis; var nume1,nume2,
nume3 :string);
IMPLEMENTATION
var
m,n,p,i,j,k:word;
x,y,z:art; vb:boolean;
r:real;
Algoritmi în programare. Aplicaţii
procedure creare_matrice;
begin
clrscr; assign(f,nume); rewrite(f);
write('Nr. linii: '); readln(m);
write('Nr. coloane: '); readln(n);
x.dim:=m; write(f,x);
for i:=1 to m do
for j:=1 to n do
begin
write('a(',i,',',j,') = '); readln(x.a);
write(f,x)
end;
close(f)
end;
procedure listare_matrice;
begin
clrscr; assign(f,nume); reset(f);
read(f,x); m:=x.dim;
n:=(filesize(f)-1) div m;
for i:=1 to m do
begin
for j:=1 to n do
begin
read(f,x); write(x.a:5:2,' ')
end;
writeln
end;
close(f)
end;
procedure maxime_pe_coloane;
begin
assign(f,nume); reset(f);
read(f,x); m:=x.dim; nrc:=(filesize(f)-1) div m;
for j:=1 to nrc do
begin
seek(f,j); read(f,x);
max[j]:=x.a;
for i:=2 to m do
begin
seek(f,(i-1)*nrc+j); read(f,x);
if x.a>max[j] then max[j]:=x.a
end
end
end;
procedure determinare_linii;
begin
assign(f,nume); reset(f);
read(f,x); m:=x.dim; n:=(filesize(f)-1) div m;
k:=0;
for i:=1 to m do
Masive memorate în fişiere
begin
j:=1; vb:=false; seek(f,(i-1)*n+1); read(f,x);
while (j<=n-1) and not vb do
begin
read(f,y);
if x.a<>y.a then vb:=true else inc(j)
end;
if j=n then begin inc(k); v[k]:=i end
end
end;
procedure transpusa;
Begin
assign(f,nume1); assign(g,nume2);
reset(f); rewrite(g);
read(f,x); m:=x.dim; n:=(Filesize(f)-1) div m;
x.dim:=n; Write(g,x);
for i:=1 to n do
for j:=1 to m do
begin
seek(f,(j-1)*n+i);
read(f,x);
write(g,x)
end;
close(f); close(g)
end;
procedure adunare_matrice;
begin
assign(f,nume1); assign(g,nume2); assign(h,nume3);
reset(f); reset(g); rewrite(h);
read(f,x);
m:=x.dim; n:=(Filesize(f)-1) div m;
seek(g,1); write (h,x);
for i:=1 to m do
for j:=1 to n do
begin
read(f,x); read(g,y);
z.a:=x.a+y.a;
write(h,z)
end;
close(f); close(g); close(h)
end;
procedure produs_matrice;
begin
assign(f,nume1); assign(g,nume2); assign(h,nume3);
reset(f); reset(g); rewrite(h);
read(f,x); m:=x.dim; read(g,y); n:=y.dim;
p:=(Filesize(g)-1) div n; write(h,x);
for i:=1 to m do
for j:=1 to p do
begin
Algoritmi în programare. Aplicaţii
z.a:=0;
for k:=1 to n do
begin
seek(f,(i-1)*n+k); Read(f,x);
seek(g,(k-1)*p+j); read(g,y);
z.a:=z.a+x.a*y.a
end;
write(h,z)
end;
close(f); close(g); close(h)
end;
procedure coloane_progr_aritm;
begin
assign(f,nume); reset(f);
read(f,x); m:=x.dim; n:=(Filesize(f)-1) div m;
k:=0;
for j:=1 to n do
begin
vb:=false;
for i:=1 to m-2 do
begin
seek(f,i*n+j); read(f,x);
seek(f,(i-1)*n+j); read(f,y);
seek(f,(i+1)*n+j); read(f,z);
if 2*x.a<>(y.a+z.a) then vb:=true
end;
if not vb then
begin
k:=k+1;
v[k]:=j
end
end;
close(f)
end
end.
unit unit_m2;
INTERFACE
uses crt;
type tipfis=file of real; tipfisi=file of word;
vector=array[1..100] of real;
procedure creare_mat_real(var f:tipfis; var nume:string);
procedure creare_mat_intreg(var f:tipfisi; var nume:string);
procedure listare_mat_real(var f:tipfis; var nume:string);
procedure listare_mat_intreg(var f:tipfisi; var nume:string);
function medie_a(var f:tipfis; var nume:string):real;
function medie_g(var f:tipfis; var nume:string):real;
function urma(var f:tipfis; var nume:string):real;
function numar(var f:tipfisi; var nume:string):word;
IMPLEMENTATION
var n,i,j,k,x:word; a,med,tr:real;
procedure creare_mat_real;
begin
clrscr; assign(f,nume); rewrite(f);
write('Nr.linii/coloane: '); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('a(',i,',',j,')='); readln(a); write(f,a)
end;
close(f)
end;
procedure creare_mat_intreg;
begin
clrscr; assign(f,nume); rewrite(f);
write('Nr.linii/coloane: '); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('a(',i,',',j,')='); readln(x); write(f,x)
end;
close(f)
end;
Algoritmi în programare. Aplicaţii
procedure listare_mat_real;
begin
clrscr; assign(f,nume); reset(f);
n:=trunc(sqrt(filesize(f)));
for i:=1 to n do begin
for j:=1 to n do
begin read(f,a); write(a:5:2,' ') end;
writeln
end;
close(f)
end;
procedure listare_mat_intreg;
begin
clrscr; assign(f,nume); reset(f);
n:=trunc(sqrt(filesize(f)));
for i:=1 to n do begin
for j:=1 to n do
begin read(f,x); write(x,' ') end;
writeln
end;
close(f)
end;
function medie_a;
begin
assign (f,nume); reset (f); n:=trunc(sqrt(filesize(f)));
med:=0; k:=0;
for i:=1 to n do
for j:=i to n do
begin
seek (f,(i-1)*n+j-1); read (f,a);
med:=med+a; k:=k+1
end;
if k>=2 then medie_a:=med/k;
close (f)
end;
function medie_g;
begin
assign(f,nume); reset(f); n:=trunc(sqrt(filesize(f)));
med:=1; k:=0;
for i:=1 to n do
begin
seek(f,i*(n-1)); read(f,a);
if a>0 then begin
med:=med*a;
k:=k+1
end
end;
if k>=2 then medie_g:=exp(ln(med)/k);
close (f)
end;
Masive memorate în fişiere
function urma;
begin
assign (f,nume); reset (f);
n:=trunc(sqrt(filesize(f)));
tr:=0;
for i:=1 to n do
for j:=1 to n do
begin
seek (f,(j-1)*n+j-1);
read (f,a);
tr:=tr+a
end;
urma:=tr;
close (f)
end;
function numar;
begin
assign (f,nume); reset (f);
n:=trunc(sqrt(filesize(f)));
k:=0;
for j:=2 to n do
for i:=n-j+2 to n do
begin
seek (f,(i-1)*n+j-1);
read (f,x);
if (x mod 3)=0 then inc(k)
end;
numar:=k;
close (f)
end
end.
begin
assign(matrice,'matrice.dat'); reset(matrice);
read(matrice,linie); {citirea numarului de coloane}
n:=trunc(linie[1]);
m:=filesize(matrice)-1;
for j:=1 to n do
begin
seek(matrice,1); {pozitionare pe prima linie}
read(matrice,linie);
max[j]:=linie[j];
for i:=2 to m do
begin
read(matrice,linie);
if linie[j] > max[j] then max[j]:=linie[j]
end
end;
writeln('Maximele pe fiecare coloana sunt:');
for j:=1 to n do
writeln('Coloana ',j,' = ',max[j]:10:2);
close(matrice)
end.
♦ Popularea fişierelor se realizează prin preluarea datelor fie din alte fişiere,
fie de la tastatură (popularea interactivă). În ultimul caz, cel mai des întâlnit în
practică, fişierul conducător corespunde mulţimii datelor introduse de la tastatură.
Articolele sunt preluate câmp cu câmp, neexistând posibilitatea citirii unei variabile de
tip articol şi, în plus, introducerea unei date este adesea însoţită de proceduri de
validare specifice, cu reintroducerea ei în cazul unei erori.
Sfârşitul introducerii datelor de la tastatură (şi implicit a procesului de
populare a fişierului) poate fi:
- De tip chestionar, prin consultarea utilizatorului, privind continuarea sau nu
a introducerii articolelor. Pentru un volum mare de date, varianta prezintă dezavan-
tajul măririi timpului de prelucrare.
- Convenţional, prin introducerea pentru primul câmp din articol a unei valori
prestabilite, cu semnificaţie de sfârşit de prelucrare.
- Standard, prin tastarea caracterului CTRL/Z, cu rol de sfârşit de fişier
TEXT, caz în care variabilei standard CheckEof (definită în unitatea standard CRT)
trebuie să i se atribuie în program valoarea TRUE.
O altă problemă a populării fişierelor binare o reprezintă aşezarea articolelor
pe suportul extern. Din acest punct de vedere se întâlnesc două modalităţi:
• Populare densă, prin care articolele se scriu unul după altul, în ordinea în
care au fost furnizate, fără a se lăsa locuri libere (acces secvenţial). Pentru fişierele
care nu necesită actualizare acesta este tipul recomandat.
• Populare aleatoare, prin care articolele sunt scrise pe poziţiile al căror
număr relativ este furnizat explicit de programator (acces direct). Scrierea unui articol
se realizează după poziţionarea pe numărul relativ dorit, cu procedura
Seek(f,nr_relativ). La populare, nr_relativ nu este limitat decât de spaţiul existent pe
suportul extern.
Metoda are dezavantajul că necesită evidenţa "articolelor vide". În cazul
fişierelor care nu necesită actualizare, popularea aleatoare se recomandă numai dacă,
după creare, fişierul este dens.
Algoritmi în programare. Aplicaţii
Exerciţiul 6.1. Să se realizeze programul pentru crearea unui fişier secvenţial care
memorează datele referitoare la facturile emise de către o societate comercială,
într-un anumit an. Structura articolului este următoarea:
Program Creare;
Uses crt;
Type
data = record
luna:1..12;
zi:1..31
end;
art_fact = record
nr_fact:string[10];
data_emit:data;
den_benef:string[20];
cod_fiscal:longint;
valoare,tva:real
end;
Var
f:file of art_fact; factura:art_fact;
Begin
Assign(f,'facturi.dat'); Rewrite(f);
checkeof:=true; clrscr;
With factura do begin
Gotoxy(15,10); Write('Nr. factura: '); Gotoxy(40,10);
While not eof do
begin
Readln(nr_fact);
Gotoxy(15,11); Writeln('Data emiterii');
Gotoxy(22,12); Writeln('luna:');
Gotoxy(40,12); Readln(data_emit.luna);
Gotoxy(22,13); Writeln('ziua:');
Gotoxy(40,13); Readln(data_emit.zi);
Gotoxy(15,14); Writeln('Denumire benef.:');
Gotoxy(40,14); Readln(den_benef);
Gotoxy(15,15); Writeln('Cod fiscal:');
Gotoxy(40,15); Readln(cod_fiscal);
Gotoxy(15,16); Writeln('Valoare facturata:');
Gotoxy(40,16); Readln(valoare);
Gotoxy(15,17); Writeln('TVA facturat:');
Algoritmi de prelucrare a fişierelor organizate secvenţial
Gotoxy(40,17); Readln(tva);
Write(f,factura);
clrscr; Gotoxy(15,9); Write('Nr. factura: ');
Gotoxy(40,9)
End {while};
Close(f)
End {with}
End.
1
Figurile 15.2 - 15.6, capitolul Algoritmi de prelucrare a fişierelor binare din lucrarea
Algoritmi în programare, B. Ghilic-Micu (coord.), Ed. ASE, Bucureşti 2002, pag. 235-238
Algoritmi în programare. Aplicaţii
Raportul final este listat la imprimantă, fie direct, ca fişier de ieşire, fie creat
pe suport magnetic, ca fişier TEXT, în vederea imprimării ulterioare. Structura unei
pagini a raportului şi controlul trecerii la o nouă pagină trebuie asigurate de
programator.
În continuare se prezintă structura de principiu2 a unui program de obţinere a
unui raport final, cu control după două caracteristici şi trei grade de total, unde
camp_1 şi camp_2 sunt caracteristicile de control (câmpuri din articol), v1 şi v2 sunt
variabile de lucru pentru salvarea caracteristicilor, iar totg, tot1 şi tot2 sunt
variabile pentru calculul gradelor de total. Analog, se poate extinde pentru oricâte
caracteristici şi grade de total.
procedure inceput;
begin
(* citire nume fisiere externe *)
assign(f,nume_fisier);reset(f); assign(g,lista); rewrite(g);
sf:=false; totg:=0;
(* scriere in lista a antetului si capului de tabel *)
read(f,x);
end;
procedure inceput_1;
begin
tot1:=0; v1:=x.camp_1
end;
procedure inceput_2;
begin
tot2:=0; v2:=x.camp_2
end;
procedure sfarsit_1;
begin
writeln('total 1 = ',tot1); totg:=totg+tot1
end;
procedure sfarsit_2;
begin
writeln('total 2 = ',tot2); tot1:=tot1+tot2
end;
procedure sfarsit;
begin
writeln('total general = ',totg);
close(f); close(g)
end;
procedure prel_art_x;
begin
(* prelucrarea articolului x *)
if eof(f) then sf:=true else read(f,x)
end;
2
În exemple, comentariile incluse între perechile de caractere (* şi *) sugerează existenţa
unei secvenţe de program, iar cele incluse între caracterele { } sunt comentarii propriu-zise.
Algoritmi de prelucrare a fişierelor organizate secvenţial
procedure prel_2;
begin
inceput_2;
while (v1=x.camp_1) and (v2=x.camp_2) and not sf
do prel_art_x;
sfarsit_2
end;
procedure prel_1;
begin
inceput_1;
while (v1=x.camp_1) and not sf do prel_2;
sfarsit_1
end;
{programul principal}
begin
inceput;
while not sf do prel_1;
sfarsit
end.
CONSULTARE
Facturi.dat Tabel.txt
1 2 3
Manevra.tmp
Program Consultare;
Uses crt;
Type data = record
luna:1..12;
zi:1..31
end;
art_fact = record
nr_fact:string[10];
data_emit:data;
den_benef:string[20];
cod_fiscal:longint;
valoare,tva:real
end;
art_man = record
data_emit:data;
den_benef:string[20];
valoare,tva:real
end;
Var f:file of art_fact;
factura:art_fact;
manevra:file of art_man;
aux:art_man;
lista:text;
Procedure Creare_manevra;
Begin
Assign(f,'facturi.dat'); Reset(f);
Assign(manevra,'manevra.tmp'); Rewrite(manevra);
While not eof(f) do
begin
Read(f,factura);
aux.data_emit:=factura.data_emit;
aux.den_benef:=factura.den_benef;
aux.valoare:=factura.valoare;
aux.tva:=factura.tva;
Write(manevra,aux)
end;
Close(f);
Close(manevra)
End;
Procedure Sortare_manevra;
Var
art1,art2:art_man;
i,j:word;
Begin
Assign(manevra,'manevra.tmp'); Reset(manevra);
For i:=1 to filesize(manevra)-1 do
Begin
Seek(manevra,i-1); Read(manevra,art1);
For j:=i+1 to filesize(manevra) do
Begin
Algoritmi de prelucrare a fişierelor organizate secvenţial
Seek(manevra,j-1); Read(manevra,art2);
If art1.den_benef > art2.den_benef then
Begin
Seek(manevra,i-1); Write(manevra,art2);
Seek(manevra,j-1); Write(manevra,art1);
art1:=art2
End
End
End;
Close(manevra)
End;
Procedure Listare;
Var
sf:boolean; i:1..12;
c:string[20];
tot_val,tot_tva:array[1..12] of real;
Const
luni:array[1..12] of string[3]=
('Ian','Feb','Mar','Apr','Mai','Iun','Iul','Aug','Sep','Oct',
'Nov','Dec');
Begin
Assign(manevra,'manevra.tmp'); Reset(manevra);
Assign(lista,'tabel.txt'); Rewrite(lista);
sf:=false;
Writeln(lista,
'Tabel cu valorile facturate lunar, pe beneficiari');
Writeln(lista);
Writeln(lista,’Valoare TVA’);
With aux do begin
Read(manevra,aux);
While not sf do
begin
c:=den_benef;
for i:=1 to 12 do begin
tot_val[i]:=0;
tot_tva[i]:=0
end;
While (c=den_benef) and not sf do
begin
tot_val[data_emit.luna]:=
tot_val[data_emit.luna]+valoare;
tot_tva[data_emit.luna]:=
tot_tva[data_emit.luna]+tva;
{$I-} Read(manevra,aux); {$I+}
If IOresult <> 0 then sf:=true
end;
Writeln(lista,c);
for i:=1 to 12 do Writeln(lista,
' ':5,luni[i],':',tot_val[i]:12:0,tot_tva[i]:10:0)
end;
Algoritmi în programare. Aplicaţii
Close(manevra);
Erase(manevra);
Close(lista)
end
End;
{programul principal}
Begin
Creare_manevra;
Sortare_manevra;
Listare
End.
Exemplu:
begin
(* citire nume fisier extern *)
checkeof:=true;
assign(f,nume_fisier);
reset(f);
write('nr. relativ: ');
while not eof do
begin
readln(r); {citire numar relativ}
seek(f,r);
{$i-} read(f,art); {$i+} {citire articol in acces direct}
if ioresult = 0 then (* prelucrare articol *)
else writeln('Articol inexistent !');
write('Nr. relativ (sau ctrl-z): ')
end;
close(f)
end.
Exemplu:
begin
(* citire nume fisier extern *)
assign(f,nume_fisier);
reset(f);
write('limita inferioara: ');
readln(li); { citirea nr. relativ al primului articol }
write('limita superioara: ');
readln(ls); { citirea nr. relativ al ultimului articol }
if (0<=li) and (li<=ls) and (ls<filesize(f)) then
begin
seek(f,li);
for i:=li to ls do
begin
read(f,art);
(* prelucrare articol *)
end
end
else
writeln('>> Nu este indeplinita conditia de limite');
close(f)
end.
Exemplu:
begin
(* citire nume fisier extern *)
assign(f,nume_fisier); reset(f);
{pozitionare dupa ultimul articol scris}
seek(f,filesize(f));
checkeof:=true;
write('camp 1: ');
while not eof do
begin
readln(art.camp_1);
(* preluare de la tastatura a celorlalte
campuri din articol *)
write(f,art);
write('camp 1 (sau ctrl-z): ')
end;
close(f)
end.
Algoritmi în programare. Aplicaţii
Exemplu:
{articolele sunt in ordinea crescatoare a valorii campului 1}
begin
(* citire nume fisier extern *)
assign(f,nume_fisier);
reset(f);
checkeof:=true;
write('camp 1: ');
while not eof do {se pot adauga mai multe articole}
begin
{introducerea campului dupa care sunt sortate articolele}
readln(art_nou.camp_1);
(* preluare de la tastatura a celorlalte
campuri din articolul de adaugat *)
{cautarea pozitiei in care se va insera articolul}
seek(f,0); { pozitionare pe inceput de fisier }
sf:=false;
read(f,art_existent);
while not sf and (art_existent.camp_1<art_nou.camp_1) do
begin
{$I+} read(f,art_existent); {$I-}
if ioresult <> 0 then sf:=true
end;
if not sf then begin
k:=filepos(f)-1;{articolul se va insera in pozitia k }
for i:=filesize(f)-1 downto k do
begin
seek(f,i);
read(f,art_existent);
write(f,art_existent)
end
end
else k:=filesize(f); {articolul se adauga la sfarsit}
seek(f,k);
write(f,art_nou);
write('camp 1: ')
end;
close(f)
end.
Algoritmi de prelucrare a fişierelor organizate secvenţial
Exemplu:
(* cautare articol de modificat *)
read(f,art);
write('Codul: ',art.cod,' '); {afisare vechea valoare}
readln(cods); {citire noua valoare; cods este de tip string}
if length(cods)<>0 then
val(cods,art.cod,err); {conversie din ASCII in binar}
write('Denumire: ',art.den,' '); {afisare vechea valoare}
readln (dens); {citire noua valoare}
if length(dens) <> 0 then
art.den:=dens; {atribuire noua valoare}
(* introducerea celorlalte campuri din articol *)
seek(f,filepos(f)-1); {repozitionare pe articol}
write(f,art) {rescriere articol modificat }
O altă variantă se poate realiza prin folosirea unei machete de ecran în care se
afişează valorile actuale ale fiecărui câmp de modificat, se poziţionează succesiv
cursorul la începutul fiecărui câmp, cu două răspunsuri posibile ale utilizatorului:
<ENTER>, caz în care se menţine actuala valoare, respectiv o tastă diferită de
<ENTER>, reprezentând primul caracter al noii valori.
program creare_fisier_secvential;
uses crt;
type
produs=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
art:produs;
f:file of produs;
er:boolean;
i,l:byte;
s:string[100];
const
alfabet=['A'..'Z','a'..'z',' '];
procedure eroare;
begin
er:=true; gotoxy(10,25);
write(s,' tastati <ENTER>',#7);
repeat until readkey=#13;
gotoxy(10,25); clreol;
end;
procedure cit_cod;
begin
repeat
er:=false; gotoxy(38,5);
{$i-}; readln(art.cod); {$i+};
if ioresult <> 0 then
begin
s:='Valoare nenumerica !';
eroare; gotoxy(38,5);
clreol
end
until not er
end;
Algoritmi de prelucrare a fişierelor organizate secvenţial
procedure cit_den;
begin
repeat
er:=false; gotoxy(38,6); clreol;
readln(art.den); l:=length(art.den);
for i:=1 to l do
if not (art.den[i] in alfabet) then er:=true;
if er then
begin
s:='Caractere nealfabetice !';
eroare
end
until not er
end;
procedure cit_dep;
begin
repeat
er:=false; gotoxy(38,7); clreol;
readln(art.dep);
if not (upcase(art.dep)in ['A'..'Z']) then
begin
s:='Cod depozit eronat !';
eroare
end
until not er
end;
procedure cit_pret;
begin
repeat
er:=false; gotoxy(38,8); clreol;
{$i-} readln(art.pu); {$i+}
if ioresult<>0 then
begin
s:='Caractere nenumerice !';
eroare
end
else if art.pu < 100 then
begin
s:='Pret < 100 !';
eroare
end
until not er
end;
procedure cit_cant;
begin
repeat
er:=false; gotoxy(38,i+8); clreol;
{$i-} readln(art.cant[i]); {$i+}
if ioresult<>0 then
begin
Algoritmi în programare. Aplicaţii
program consultare_dupa_camp_cu_valoare_unica;
uses crt;
type
produs=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
art:produs;
f:file of produs;
vb:boolean;
cod_t,i:byte;
v:real;
begin
assign(f,'produse.dat'); reset(f);
clrscr; checkeof:=true; gotoxy(27,5);
write('Codul produsului: ');
while not eof do
begin
gotoxy(50,5); readln(cod_t);
seek(f,0);
vb:=false;
while not vb and not eof(f) do
begin
read(f,art);
if art.cod = cod_t then
begin
v:=0;
for i:=1 to 12 do v:=v+art.cant[i];
v:=v*art.pu;
gotoxy(27,12);
writeln('Denumire',' ':10,'Valoare');
gotoxy(25,15);
writeln(art.den,' ':5,v:10:0,' lei');
readln; vb:=true
end
end;
if not vb then
begin
gotoxy(30,15);
writeln('Cod produs eronat !',#7)
end;
clrscr; gotoxy(27,5);
write('Codul produsului (sau ^Z): ')
end;
close(f)
end.
Algoritmi în programare. Aplicaţii
program consultare_dupa_camp_cu_valoare_duplicata;
uses crt;
type
produs=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
art:produs;
f:file of produs;
sir:string[30];
dep_t:char;
i,k:byte;
v:real;
begin
assign(f,'produse.dat'); reset(f);
clrscr; checkeof:=true;
gotoxy(27,5);
write('Codul depozitului: ');
while not eof do
begin
gotoxy(50,5); readln(dep_t);
seek(f,0);
k:=0;
while not eof(f) do
begin
fillchar(sir,31,' ');
read(f,art);
if art.dep=dep_t then
begin
inc(k); v:=0;
for i:=1 to 12 do v:=v+art.cant[i];
v:=v*art.pu;
gotoxy(10,12);
Algoritmi de prelucrare a fişierelor organizate secvenţial
writeln('Cod',' ':10,'Denumire',
' ':25,'Valoare');
gotoxy(10,14+k);
sir:=art.den; sir[0]:=#30;
writeln(art.cod:3,' ':10,sir,' ',
v:10:0,' lei')
end
end;
if k=0 then
begin
gotoxy(30,15);
writeln('Cod depozit eronat !',#7)
end;
readln; clrscr; gotoxy(27,5);
write('Codul depozitului (sau ^Z): ')
end;
close(f)
end.
program consultare_cu_control_dupa_caracteristica;
uses crt;
type
artf=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
artm=record
depm:char;
v:real
end;
var
z:artf; x,y:artm; f:file of artf; m:file of artm;
i,j:byte; totgen,totdep:real;
vb,sf:boolean; c:char;
Algoritmi în programare. Aplicaţii
procedure copiere;
begin
assign(f,'produse.dat'); reset(f);
assign(m,'manevra.tmp'); rewrite(m);
with z,x do
begin
while not eof(f) do
begin
read(f,z);
v:=0;
for i:=1 to 12 do v:=v+cant[i];
v:=v*pu;
depm:=dep;
write(m,x)
end
end;
close(f)
end;
procedure sortare;
begin
repeat
vb:=false;
for i:=1 to filesize(m)-1 do
begin
seek(m,i-1); read(m,x,y);
if x.depm>y.depm then
begin
seek(m,i-1);
write(m,y,x);
vb:=true
end
end
until not vb
end;
procedure afisare;
begin
seek(m,0); sf:=false; totgen:=0; i:=0; clrscr;
gotoxy(5,3); writeln('Stocul valoric pe depozite');
gotoxy(9,6); writeln('Depozit Stoc');
read(m,x);
while not sf do
begin
totdep:=0;
c:=x.depm;
while (x.depm=c) and not sf do
begin
totdep:=totdep+x.v;
if eof(m) then sf:=true
else read(m,x)
end;
Algoritmi de prelucrare a fişierelor organizate secvenţial
inc(i);
gotoxy(12,7+i);
writeln(c,' ':5,totdep:10:0,' lei');
totgen:=totgen+totdep
end;
gotoxy(9,9+i);
writeln('Total = ',totgen:10:0,' lei');
close(m)
end;
{programul principal}
begin
copiere;
sortare;
afisare
end.
program afisare_integrala;
uses crt;
type
art=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
z:art;
f:file of art;
l:text;
linie:string[76];
d:string[30];
cant_tot:longint;
valoare:real;
i:byte;
begin
clrscr;
assign(f,'produse.dat'); reset(f);
assign(l,'lista.txt'); rewrite(l);
with z do begin
fillchar(linie,77,'='); linie[0]:=#76;
writeln(l,' ':25,'TABEL CU STOCURILE DE PRODUSE');
Algoritmi în programare. Aplicaţii
Indicator de
Articol propriu-zis
stare (is)
Indicatorul de stare (notat is) va avea o valoare din două posibile (de exemplu
0 pentru articol inactiv - inexistent sau şters - şi 1 pentru articol prezent). Cu această
structură, operaţiile de acces la articole se realizează în următoarele condiţii: scrierea
în fişier este permisă numai pentru articolele cu is=0; citirea din fişier este permisă
numai pentru articolele cu is=1.
• Preformarea presupune deschiderea fişierului ca nou şi crearea unui număr
de articole (la limită, zero) cu is=0. Includerea operaţiei de preformare conduce la
dispariţia distincţiei dintre populare şi adăugare. Datorită faptului că fişierul se
deschide ca existent, orice operaţie de scriere a unui nou articol se tratează ca
adăugare. Într-un sistem de programe, deschiderea cu Rewrite a unui fişier se
realizează o singură dată, în procedura de preformare.
• Scrierea în acces direct presupune furnizarea numărului relativ (nr) al
articolului. În funcţie de valoarea lui nr se disting următoarele situaţii:
Algoritmi în programare. Aplicaţii
Observaţii:
1. Programul oferă utilizatorului funcţiuni de Creare, Adăugare, Modificare şi
Ştergere, realizate în acces direct după cheia relativă. În meniul afişat pe ecran
există şi funcţiunea de terminare a programului.
2. Funcţiunile de Creare şi Adăugare sunt identice, cu deosebirea că pentru prima
fişierul se deschide ca nou (cu Rewrite), iar pentru cea de-a doua fişierul se
deschide ca existent (cu Reset).
3. La opţiunea de ştergere s-a inclus o confirmare suplimentară din partea
utilizatorului, pentru cazul în care cheia relativă introdusă de la tastatură există
în fişier, dar nu aparţine angajatului care se doreşte a fi şters.
4. Funcţiunea de modificare prevede posibilitatea modificării valorii oricărui
câmp sau combinaţie de câmpuri. Prin convenţie, tastarea doar a lui <ENTER>
semnifică nemodificarea câmpului respectiv.
5. Fiecare funcţiune a programului prevede posibilitatea reluării ei în interior, fără
a mai ieşi în meniul principal. Terminarea unei funcţiuni se realizează prin
tastarea caracterului CTRL/Z în câmpul marca (sfârşit standard al tastaturii).
De aceea, la revenirea în meniul principal şi la apelul unei noi funcţiuni,
tastatura (fişier TEXT standard de intrare) trebuie deschisă cu procedura
Reset(Input).
program actualizare_fisier_relativ;
uses crt;
type
art=record
is:0..1;
nume:string[20];
prof:string[10];
loc:byte;
sal:longint
end;
Algoritmi în programare. Aplicaţii
var
f:file of art; x:art; opt,r:char;
marca,i,err:word; aux:string[20];
procedure meniu;
begin
reset(input); clrscr;
gotoxy(30,7); write('Functiunile programului');
gotoxy(36,9); write('1. Creare');
gotoxy(36,10); write('2. Adaugare');
gotoxy(36,11); write('3. Modificare');
gotoxy(36,12); write('4. Stergere');
gotoxy(36,13); write('5. Terminare');
gotoxy(30,16); write('Functia aleasa:');
gotoxy(46,16); readln(opt)
end;
procedure citire_campuri;
begin
write('Nume si prenume: '); readln(x.nume);
write('Profesie: '); readln(x.prof);
write('Loc de munca: '); readln(x.loc);
write('Salariu: '); readln(x.sal);
x.is:=1
end;
procedure preformare;
begin
seek(f,filesize(f));
x.is:=0;
for i:=filesize(f) to marca-1 do write(f,x)
end;
procedure creare;
begin
reset(input); assign(f,'pers.dat');
if opt='1' then rewrite(f) else reset(f);
checkeof:=true; clrscr;
with x do begin
write('Marca: ');
while not eof do
begin
readln(marca);
if marca<filesize(f) then
begin
seek(f,marca); read(f,x);
if is=0 then
begin
citire_campuri;
seek(f,marca);
write(f,x)
end
else writeln('Marca alocata !')
end
Algoritmi de prelucrare a fişierelor organizate relativ
else begin
preformare;
citire_campuri;
write(f,x)
end;
write('Marca (sau ^Z): ')
end
end;
close(f)
end;
procedure stergere;
begin
reset(input); assign(f,'pers.dat'); reset(f);
checkeof:=true; clrscr;
with x do begin
write('Marca: ');
while not eof do
begin
readln(marca);
if marca<filesize(f) then
begin
seek(f,marca); read(f,x);
if is=1 then
begin
writeln(nume,' ',loc,' ',prof);
write('Confirmati stergerea ? (d/n): ');
readln(r);
if upcase(r)='D' then
begin
is:=0;
seek(f,marca);
write(f,x)
end
end
else writeln('Angajat inexistent in fisier !')
end
else writeln('Marca eronata !');
write('Marca (sau ^Z): ')
end
end;
close(f)
end;
procedure modif_campuri;
begin
with x do begin
write('Nume si prenume: ',nume,' '); readln(aux);
if aux<>'' then nume:=aux;
write('Profesie: ',prof,' '); readln(aux);
if length(aux)<>0 then prof:=aux;
write('Loc de munca: ',loc,' '); readln(aux);
Algoritmi în programare. Aplicaţii
program vizualizare_angajat;
uses crt;
type
art=record
is:0..1;
nume:string[20];
prof:string[10];
loc:byte;
sal:longint
end;
var
f:file of art;
x:art;
marca:word;
vb:boolean;
begin
assign(f,'pers.dat'); reset(f);
checkeof:=true; clrscr;
with x do begin
gotoxy(30,10); write('Marca: ');
while not eof do
begin
readln(marca);
if marca<filesize(f) then
begin
seek(f,marca);
read(f,x);
if is=1 then
begin
gotoxy(25,15);
writeln(nume,' ',prof,' ',loc,' ',sal)
end
else
begin
gotoxy(30,12);
writeln('Angajat inexistent!',#7)
end
end
else
begin
gotoxy(30,12);
writeln('Marca eronata !',#7)
end;
readln; clrscr; gotoxy(30,10);
write('Marca(sau ^Z): ')
end
end;
close(f)
end.
Algoritmi în programare. Aplicaţii
program vizualizare_profesie;
uses crt;
type art=record
is:0..1;
nume:string[20]; prof:string[10];
loc:byte; sal:longint
end;
var
f:file of art; x:art; prof_t:string[10]; aux:string[20];
vb,sw:boolean; i:byte;
begin
assign(f,'pers.dat'); reset(f);
checkeof:=true; clrscr; i:=0;
with x do begin
write('Profesia: ');
while not eof do
begin
readln(prof_t);
seek(f,0); sw:=true; i:=0; vb:=false;
while not eof(f) do
begin
read(f,x);
if (is=1) and (prof=prof_t) then
begin
if sw then begin {prima scriere in tabel}
gotoxy(20,10);
writeln('Marca Nume si prenume Loc Salariu');
sw:=false
end;
inc(i); gotoxy(20,12+i); fillchar(aux,21,' ');
aux:=nume; aux[0]:=#20;
writeln((filepos(f)-1):5,' ',aux,' ',loc:3,
' ',sal:7);
vb:=true
end
end;
Algoritmi de prelucrare a fişierelor organizate relativ
if not vb then
begin
gotoxy(30,15);
writeln('Profesie inexistenta !',#7)
end;
readln; clrscr;
write('Profesia (sau ^Z): ')
end {while}
end {with};
close(f)
end.
program sortare_dupa_doua_campuri;
uses crt;
type
artf=record
is:0..1;
nume:string[20];
prof:string[10];
loc:byte;
sal:longint
end;
artm=record
marca:word;
nume:string[20];
prof:string[10];
loc:byte;
sal:longint
end;
var
f:file of artf;
m:file of artm;
z:artf; x,y:artm;
Algoritmi în programare. Aplicaţii
n,i,j:word;
aux1:string[10];
aux2:string[20];
procedure creare_manevra;
begin
assign(f,'pers.dat');
reset(f);
assign(m,'manevra.tmp');
rewrite(m);
while not eof(f) do
begin
read(f,z);
if z.is=1 then
begin
x.marca:=filepos(f)-1;
x.nume:=z.nume;
x.prof:=z.prof;
x.loc:=z.loc;
x.sal:=z.sal;
write(m,x)
end
end;
close(f)
end;
procedure sortare_manevra;
begin
n:=filesize(m);
for i:=1 to n-1 do
begin
seek(m,i-1); read(m,x);
for j:=i+1 to n do
begin
seek(m,j-1); read(m,y);
if x.prof>y.prof then
begin
seek(m,i-1); write(m,y);
seek(m,j-1); write(m,x);
x:=y
end
else if x.prof=y.prof then
if x.nume>y.nume then
begin
seek(m,i-1); write(m,y);
seek(m,j-1); write(m,x);
x:=y
end
end
end
end;
Algoritmi de prelucrare a fişierelor organizate relativ
procedure listare_manevra;
begin
with x do begin
seek(m,0); i:=0;
clrscr; gotoxy(25,2);
writeln('Tabel cu angajatii pe profesii');
gotoxy(17,4);
writeln(' PROFESIE MARCA NUME SI PRENUME LOC',
' SALARIU');
while not eof(m) do
begin
read(m,x);
fillchar(aux1,11,#32); aux1:=prof; aux1[0]:=#10;
fillchar(aux2,21,#32); aux2:=nume; aux2[0]:=#20;
gotoxy(17,6+i); inc(i);
writeln(aux1,' ',marca:4,' ',aux2,
' ',loc:3,' ',sal:7)
end
end;
close(m); erase(m)
end;
{programul principal}
begin
creare_manevra;
sortare_manevra;
listare_manevra
end.
program modificare_secventiala;
uses crt;
type
art=record
is:0..1;
nume:string[20];
prof:string[10];
loc:byte;
sal:longint
end;
var
f:file of art; x:art; indice:real;
begin
assign(f,'pers.dat'); reset(f);
with x do begin
write('Indicele de crestere (%): '); readln(indice);
Algoritmi în programare. Aplicaţii
Procedura de preformare
F este fişierul, nume este identificatorul său extern, iar n este numărul relativ
al ultimului articol preformat. Ivk este indicator de eroare şi are valorile: FALSE, dacă
fişierul se poate deschide ca nou (nu există în directorul precizat, implicit sau explicit,
prin identificatorul extern) sau TRUE, dacă fişierul nu se poate deschide ca nou
(există în directorul precizat prin identificatorul extern).
Procedura deschide ca nou un fişier inexistent şi scrie articolele cu numerele
relative cuprinse în domeniul 0..n, făcând, pentru ele, is=0.
Algoritmi de prelucrare a fişierelor organizate relativ
F este fişierul, z este articolul care se scrie în poziţia relativă nr. Ivk este
indicator de eroare şi are valorile: FALSE, dacă articolul s-a putut scrie sau TRUE,
dacă articolul nu s-a putut scrie (este prezent în fişier). Procedura verifică inexistenţa
articolului şi realizează înscrierea lui în fişier.
Dacă nr<FileSize(f), se citeşte articolul din poziţia nr, într-o zonă z1 şi dacă
z1.is=0, se scrie articolul z în poziţia nr şi se face ivk:=FALSE, iar dacă z1.is=1 se
face ivk:=TRUE. Citirea se face în zona z1, pentru a nu se distruge articolul care este
constituit în z, pentru adăugare. Dacă nr≥FileSize(f), se preformează articolele cu
numerele relative cuprinse în intervalul FileSize(f)..nr-1, se scrie articolul z în poziţia
nr şi se face ivk:=FALSE.
F este fişierul, iar z este zona din care se preia articolul care se scrie. Scrierea
se face fără nici o verificare. De aceea, procedura se foloseşte numai la popularea
iniţială a fişierului sau la adăugarea compactă de articole la sfârşitul lui. Pentru
articolul scris se face z.is=1. După scriere, pointerul indică următorul articol din fişier.
F este fişierul, z este zona în care se transferă articolul şi nr este numărul său
relativ. Ivk este indicator de eroare şi are valorile: FALSE, dacă articolul s-a citit (este
prezent în fişier) sau TRUE, dacă articolul nu s-a citit logic (este absent din fişier).
Procedura verifică existenţa articolului şi realizează citirea lui din fişier.
Dacă nr<FileSize(f), se citeşte articolul şi dacă z.is=1, se face ivk:=FALSE,
iar dacă z.is=0, se face ivk:=TRUE. Dacă nr≥Filesize(f), se face ivk:=TRUE.
F este fişierul, iar z este zona în care se citeşte primul articol prezent în fişier,
începând de la pointerul curent. Sf este un indicator de semnalare a atingerii sfârşitului
de fişier şi are valorile: FALSE, dacă articolul s-a citit (şi nu este sfârşit de fişier) sau
TRUE, dacă s-a ajuns la sfârşit de fişier. Procedura citeşte secvenţial, începând de la
pointerul curent până la primul articol care are z.is=1 sau până se ajunge la sfârşit de
Algoritmi în programare. Aplicaţii
fişier. După citirea articolului, pointerul indică următorul articol fizic din fişier
(prezent sau nu logic).
Procedura de rescriere
F este fişierul, iar z este articolul care se scrie în poziţia FilePos(f)-1. Ivk este
indicator de eroare şi are valorile: FALSE, dacă articolul se poate rescrie (articolul din
poziţia FilePos(f)-1 este prezent în fişier) sau TRUE, dacă articolul nu se poate rescrie
(articolul din poziţia FilePos(f)-1 este absent).
Procedura presupune execuţia anterioară a unei citiri (cu ReadD sau ReadS).
Ea rescrie un articol în poziţia anterioară pointerului curent, dacă acesta are câmpul
is=1 şi dacă FilePos(f)-1<FileSize(f).
unit relativ;
INTERFACE
type
tipa=record
is:byte;
np:string[20];
prof:string[10];
loc:byte;
sal:longint
end;
tipf=file of tipa;
procedure opennew(var f:tipf; var nume:string; n:word;
var ivk:boolean);
procedure writed(var f:tipf; var z:tipa; nr:word;
var ivk: boolean);
procedure writes(var f:tipf; var z:tipa);
procedure readd(var f:tipf; var z:tipa; nr:word;
var ivk:boolean);
procedure reads(var f:tipf; var z:tipa; var sf:boolean);
procedure deleted(var f:tipf; nr:word; var ivk:boolean);
procedure rewrites(var f:tipf; var z:tipa; var ivk:boolean);
Algoritmi de prelucrare a fişierelor organizate relativ
IMPLEMENTATION
procedure opennew;
var
i:word; z1:tipa;
begin
ivk:=false;
assign(f,nume);
{$i-} reset(f); {$i+}
if ioresult <>0 then
begin
rewrite(f);
z1.is:=0;
for i:= 0 to n do write(f,z1);
close(f)
end
else ivk:=true
end;
procedure writed;
var
z1:tipa;
i:word;
begin
ivk:=false;
if nr < filesize(f) then
begin
seek(f,nr);
read(f,z1);
if z1.is=0 then
begin
z.is:=1;
seek (f,nr);
write (f,z)
end
else
ivk:=true
end
else
begin
seek(f,filesize(f));
z1.is:=0;
for i:=filesize(f) to nr-1 do write(f,z1);
z.is:=1;
write(f,z)
end
end;
procedure writes;
begin
z.is:=1;
write(f,z)
end;
Algoritmi în programare. Aplicaţii
procedure readd;
begin
ivk:=false;
if nr < filesize(f) then
begin
seek(f,nr);
read(f,z);
if z.is=0 then ivk:=true
end
else
ivk:=true
end;
procedure reads;
begin
sf:=false;
repeat
{$i-} read(f,z); {$i+}
if ioresult <>0 then sf:=true
until (z.is=1) or sf
end;
procedure deleted;
var
z1: tipa;
begin
ivk:=false;
if nr < filesize(f) then
begin
seek(f,nr);
read(f,z1);
if z1.is=0
then ivk:=true
else
begin
z1.is:=0;
seek(f,nr);
write(f,z1)
end
end
else ivk:=true
end;
procedure rewrites;
var
z1:tipa;
begin
ivk:=false;
if (filepos(f)-1) < filesize(f) then
begin
seek(f,filepos(f)-1);
read(f,z1);
if z1.is=0
Algoritmi de prelucrare a fişierelor organizate relativ
then ivk:=true
else
begin
seek(f,filepos(f)-1);
z.is:=1;
write(f,z)
end
end
else ivk:=true
end
end.
program vizualizare_persoana;
uses crt,relativ;
var
f:tipf;
x:tipa;
marca:word;
ivk:boolean;
begin
assign(f,'pers.dat'); reset(f);
checkeof:=true; clrscr;
with x do begin
gotoxy(30,10); write('Marca: ');
while not eof do
begin
readln(marca);
readD(f,x,marca,ivk);
if not ivk then begin
gotoxy(25,15);
writeln(np,' ',prof,' ',loc,' ',sal)
end
else begin
gotoxy(30,12);
writeln('Angajat inexistent!')
end;
readln; clrscr; gotoxy(30,10);
write('Marca(sau ^Z): ')
end
end;
close(f)
end.
Algoritmi în programare. Aplicaţii
program vizualizare_loc_de_munca;
uses crt,relativ;
var
f:tipf; x:tipa; loc_t,i:byte; aux:string[20];
vb,sw,sf:boolean;
begin
assign(f,'pers.dat'); reset(f);
checkeof:=true; clrscr;
with x do begin
write('Loc de munca: ');
while not eof do {repetitiva dupa sfarsit de tastatura}
begin
readln(loc_t);
seek(f,0);
sw:=true; i:=0;
vb:=false;
sf:=false;
readS(f,x,sf);
while not sf do {repetitiva dupa sfarsit fisier magnetic}
begin
if (is=1) and (loc=loc_t) then begin
if sw then begin {prima scriere in tabel}
gotoxy(20,10);
writeln('Marca Nume si prenume Loc Salariu');
sw:=false
end;
{scriere rand curent in tabel}
inc(i); gotoxy(20,12+i);
fillchar(aux,21,' ');
aux:=np; aux[0]:=#20;
writeln((filepos(f)-1):5,' ',aux,' ',loc:3,
' ',sal:7);
vb:=true
end;
readS(f,x,sf)
end;
Algoritmi de prelucrare a fişierelor organizate relativ
if not vb then
begin
gotoxy(30,15);
writeln('Loc de munca eronat !',#7)
end {while dupa sf};
readln; clrscr; write('Loc de munca (sau ^Z): ')
end {dupa eof}
end {with};
close(f)
end.
program actualizare_fisier_relativ;
uses crt,relativ;
var
f:tipf;
x:tipa;
opt,r:char;
ivk:boolean;
marca,i,err:word;
aux:string[20];
const
numefis:string='pers.dat';
procedure meniu;
begin
reset(input);
clrscr;
gotoxy(30,7); write('Functiile programului');
gotoxy(36,9); write('1. Creare');
gotoxy(36,10); write('2. Adaugare');
gotoxy(36,11); write('3. Modificare');
gotoxy(36,12); write('4. Stergere');
gotoxy(36,13); write('5. Terminare');
gotoxy(30,16); write('Functia aleasa:');
gotoxy(46,16);
readln(opt)
end;
procedure citire_campuri;
begin
write('Nume si prenume: ');
readln(x.np);
write('Profesie: ');
readln(x.prof);
Algoritmi în programare. Aplicaţii
readln(r);
if upcase(r)='D' then deleteD(f,marca,ivk)
end
else
writeln('Angajat inexistent in fisier !');
write('Marca (sau ^Z): ')
end {while}
end {with};
close(f);
end;
procedure modif_campuri;
begin
with x do begin
write('Nume si prenume: ',np,' ');
readln(aux);
if aux<>'' then np:=aux;
write('Profesie: ',prof,' ');
readln(aux);
if length(aux)<>0 then prof:=aux;
write('Loc de munca: ',loc,' ');
readln(aux);
if aux[0]<>#0 then val(aux,loc,err);
write('Salariu: ',sal,' ');
readln(aux);
if aux[0]<>#0 then val(aux,sal,err);
rewrites(f,x,ivk)
end
end;
procedure modificare;
begin
reset(input);
assign(f,'pers.dat');
reset(f);
checkeof:=true;
clrscr;
with x do begin
write('Marca: ');
while not eof do
begin
readln(marca);
readd(f,x,marca,ivk);
if not ivk then modif_campuri
else writeln('Angajat inexistent in fisier !');
write('Marca (sau ^Z): ')
end {while}
end {with};
close(f);
end;
Algoritmi în programare. Aplicaţii
{programul principal}
begin
meniu;
while opt<>'5' do
begin
case opt of
'1','2': creare;
'3' : modificare;
'4' : stergere
else
begin
gotoxy(25,23);
write('Functie inexistenta !',#7)
end
end;
meniu
end
end.
8. Algoritmi de prelucrare a fişierelor organizate indexat
Indicator de
Cheie Număr relativ (nr)
stare (is)
Fig. 8.1. Structura articolului din tabela de indexuri
Indicatorul de stare (is) are rol identic cu cel prezentat în capitolul referitor la
fişierele organizate relativ (capitolul 7). Cheie este un câmp în care se memorează
valoarea cheii articolului existent logic în fişierul de date, al cărui număr relativ
corespunzător este memorat în câmpul nr. Articolele tabelei de indexuri sunt, în orice
moment, sortate crescător după valorile câmpului cheie. Articolele din fişierul de date
sunt memorate aleator şi conţin câmpurile de date ale utilizatorului (pot conţine,
redundant, pentru o eventuală refacere după incidente, şi valorile cheii). O parte dintre
acestea nu-şi regăsesc corespondent în tabela de indexuri, fiind considerate şterse.
Orice operaţie de acces la articolele fişierului de date se realizează numai prin
intermediul tabelei, gestionată automat de procedurile unui unităţi specializate şi care
este netransparentă utilizatorului.
tentativa de scriere a unui articol a cărui cheie este egală cu una din cele prezente în
fişier.
• Consultarea în acces secvenţial presupune regăsirea articolelor în ordinea
strict crescătoare a valorilor cheii. Ea se realizează cu ajutorul procedurii de citire în
acces secvenţial, care detectează şi sfârşitul fişierului de date.
• Consultarea în acces mixt permite selectarea unui grup de articole, memo-
rate logic contiguu în fişier, selecţie realizată pe baza valorilor cheii primului şi
ultimului articol din grupul dorit. Accesul mixt presupune poziţionarea pe primul
articol prin citirea în acces direct (sau poziţionare şi citire în acces secvenţial), urmată
de exploatarea în acces secvenţial, până la găsirea cheii ultimului articol dorit, sau
până la sfârşitul fişierului.
• Adăugarea de articole se realizează utilizând procedura de scriere în acces
direct. Articolele pot fi furnizate în orice ordine a valorilor cheii. Eroarea de cheie
invalidă apare la tentativa de scriere a unui articol a cărui cheie este egală cu una deja
existentă.
• Modificarea unor câmpuri din articol se realizează în următoarele etape:
- citirea articolului de modificat (în acces secvenţial sau direct);
- modificarea, în zona articol corespunzătoare, a câmpurilor dorite, cu excep-
ţia câmpului cheie;
- rescrierea articolului, cu procedura de rescriere.
Eroarea de cheie invalidă apare în cazul tentativei de rescriere a unui articol a
cărui cheie este diferită de cea a articolului citit anterior.
• Ştergerea în acces secvenţial elimină articolul curent din fişierul de date. În
general, articolul trebuie mai întâi identificat printr-o citire (în acces secvenţial sau
direct) sau prin poziţionare. Procedura returnează eroare în cazul tentativei de ştergere
după ultimul articol existent.
• Ştergerea în acces direct elimină articolul a cărui cheie este precizată.
Operaţia nu trebuie precedată de citirea articolului şi returnează eroare în cazul
furnizării unei chei inexistente în fişier. În aplicaţii este preferabilă ştergerea în acces
secvenţial, deoarece permite (datorită citirii care o precede), vizualizarea articolului şi
luarea unei decizii în condiţii de siguranţă.
Unitatea indexate cuprinde o serie de proceduri (primitive), cu rol de
instrucţiuni de intrare/ieşire la nivel de fişier şi articol, necesare realizării algoritmilor
de prelucrare specifici operaţiilor de gestiune a fişierelor, când se utilizează
corespondenţa internă între valorile unui anumit câmp din articole - numit cheie - şi
numerele relative ale acestora. Tabela de corespondenţă între chei şi numerele relative
este memorată într-un fişier cu tip, a cărui gestiune este transferată integral
procedurilor aparţinând unităţii, astfel încât programele utilizatorului vor lucra
exclusiv cu fişierul de date. Totuşi, utilizatorul trebuie să ţină cont de existenţa tabelei
de indexuri în vederea asigurării spaţiului necesar pe disc şi manipulării concomitente
a celor două fişiere (salvare, restaurare, ştergere etc.).
În unitate sunt făcute publice următoarele tipuri: TipFis, pentru tipul
fişierului de date; TipArt, pentru tipul articolului din fişierul de date; TipCheie,
pentru tipul cheii.
Algoritmi de prelucrare a fişierelor organizate indexat
F este fişierul de date şi nume este identificatorul său extern. Ivk este indi-
cator de eroare, care returnează valoarea FALSE, dacă fişierul nu există sau valoarea
TRUE, dacă fişierul există deja pe disc. Procedura deschide, pentru creare, fişierul de
date (ca fişier nou). Concomitent, se deschide şi tabela de indexuri, al cărei nume
extern este identic cu al fişierului de date, dar cu extensia .IDX.
Observaţie: la deschiderea tabelei de indexuri ca fişier nou nu se verifică
existenţa acestuia în suport. Fişierul va fi şters şi recreat.
F este fişierul de date şi nume este identificatorul său extern. Ivk este indi-
cator de eroare, care returnează valoarea FALSE, dacă ambele fişiere (de date şi de
indexuri) există sau valoarea TRUE, dacă unul din ele nu există. Procedura deschide,
pentru consultare sau actualizare, ambele fişiere.
CloseFile(VAR f:TipFis)
F este fişierul şi z este zona în care se citeşte articolul prezent în fişier. Sf este
un indicator de semnalare a atingerii sfârşitului fişierului de date şi are valorile:
FALSE, dacă articolul s-a citit (şi nu este sfârşit de fişier) sau TRUE, dacă s-a ajuns la
sfârşit de fişier.
Procedura returnează articolul curent din fişierul de date (articolul următor
ultimului accesat printr-o operaţie de intrare/ieşire). Citirea unui articol din fişierul de
date se realizează prin intermediul tabelei de indexuri. De fapt se citeşte un articol din
tabelă de la poziţia indicată de pointerul curent şi apoi se citeşte articolul cu numărul
relativ y.nr din fişierul de date (y este zona articol a tabelei de indexuri).
Dacă pointerul indică marcatorul de sfârşit al tabelei, parametrul sf va returna
valoarea TRUE. Execuţia repetată a acestei proceduri are ca efect furnizarea
articolelor din fişierul de date în ordinea strict crescătoare a valorilor cheii.
Algoritmi în programare. Aplicaţii
F este fişierul de date şi z este zona articol ataşată lui. Key precizează
valoarea cheii articolului care se citeşte. Ivk este indicator de eroare, care returnează
valoarea FALSE, dacă articolul a fost regăsit sau valoarea TRUE, dacă articolul este
absent. Procedura caută, prin procedura Start, cheia cu valoarea key şi dacă o
găseşte, citeşte în z articolul cu numărul relativ y.nr şi face ivk=FALSE; dacă nu o
găseşte, face ivk:=TRUE.
F este fişierul de date şi z este zona articol ataşată lui. Ivk este indicator de
eroare, care returnează valoarea FALSE, dacă articolul a fost scris, sau valoarea
TRUE, în caz contrar. Procedura adaugă un articol în fişierul de date, concomitent cu
extinderea tabelei de indexuri cu o nouă înregistrare, a cărei cheie este mai mare decât
cele existente. În cazul în care cheia este mai mică sau egală cu a ultimului articol din
tabelă, se returnează eroare (ivk=TRUE) şi articolul nu se scrie.
F este fişierul de date şi z este zona articol ataşată lui. Key precizează
valoarea cheii articolului care se scrie. Ivk este indicator de eroare, care returnează
valoarea FALSE, dacă articolul a fost scris sau valoarea TRUE, în caz contrar.
Procedura adaugă un articol la sfârşitul fişierului de date. Cheia acestuia poate
avea orice valoare, inexistentă în tabela de indexuri. Iniţial, tabela se extinde cu un
nou articol şi apoi se reordonează (pentru a satisface cerinţele citirii secvenţiale). În
cazul în care cheia furnizată de apelator se regăseşte în tabelă, articolul nu se scrie şi
se returnează eroare de cheie invalidă (ivk=TRUE). Căutarea se face cu procedura
Start.
Procedura de rescriere
F este fişierul de date şi z este zona articol ataşată lui. Ivk este indicator de
eroare, care returnează valoarea FALSE, dacă articolul a fost rescris sau valoarea
TRUE, în caz contrar.
Algoritmi de prelucrare a fişierelor organizate indexat
Procedura transferă datele din z în fişierul de date, în aceeaşi poziţie din care
s-a citit anterior (printr-o operaţie de citire în acces secvenţial sau direct). Tabela de
indexuri nu se modifică. Procedura verifică dacă valoarea cheii s-a modificat faţă de
momentul citirii sale precedente, caz în care se semnalează eroare de cheie invalidă
(ivk=TRUE).
F este fişierul de date, iar ivk este indicator de eroare, care returnează valoa-
rea FALSE, dacă articolul a fost şters sau valoarea TRUE, în caz contrar.
Procedura şterge logic articolul curent din fişierul de date. Ştergerea se reali-
zează fizic în tabela de indexuri. Iniţial se face y.is=0 şi apoi se elimină articolul din
tabelă, prin procedura de sortare. Eroarea de cheie invalidă (ivk=TRUE) este
semnalată în cazul în care pointerul curent al tabelei de indexuri indică marcatorul de
sfârşit de fişier.
Procedura de poziţionare
unit indexate;
INTERFACE
type
tipcheie= word;
tipart=record
nrm:tipcheie;
nume:string[25];
grupa:word;
nrd:1..20;
nota:array[1..20] of 0..10
end;
tipfis=file of tipart;
procedure opennew(var f:tipfis; var nume_fis:string;
var ivk:boolean);
procedure openold(var f:tipfis; var nume_fis:string;
var ivk:boolean);
procedure closefile(var f:tipfis);
procedure readseqrec(var f:tipfis; var z:tipart;
var sf:boolean);
procedure readkeyrec(var f:tipfis; var z:tipart;
key:tipcheie; var ivk:boolean);
procedure writeseqrec(var f:tipfis; var z:tipart;
var ivk:boolean);
procedure writekeyrec(var f:tipfis; var z:tipart;
key:tipcheie; var ivk:boolean);
procedure rewriterec(var f:tipfis; var z:tipart;
var ivk:boolean);
procedure deleteseqrec(var f:tipfis; var ivk:boolean);
procedure deletekeyrec(var f:tipfis; key:tipcheie;
var ivk:boolean);
procedure start(var f:tipfis; key:tipcheie; var ivk:boolean);
IMPLEMENTATION
type
tipindex=record
is:0..1;
cheie:tipcheie;
nr:word
end;
tabela=file of tipindex;
var
g:tabela;
y:tipindex;
procedure sort(var g:tabela);
var
h:tabela; a,b:tipindex; i,j:word;
begin
assign(h,'temp.dat'); rewrite(h); seek(g,0);
for i:=1 to filesize(g) do
begin
read(g,a);
Algoritmi de prelucrare a fişierelor organizate indexat
procedure closefile;
begin
close(f);
close(g)
end;
procedure readseqrec;
begin
sf:=false;
{$i-} read(g,y) {$i+};
if ioresult <> 0 then sf:=true;
if not sf then
begin
seek(g,filepos(g)-1);
read(g,y);
seek(f,y.nr);
read(f,z)
end
end;
procedure readkeyrec;
begin
start(f,key,ivk);
if not ivk then
begin
seek(g,filepos(g)-1);
read(g,y);
seek(f,y.nr);
read(f,z)
end
end;
procedure writeseqrec;
begin
ivk:=false;
if filepos(g) > 0 then
begin
seek(g,filesize(g)-1);
read(g,y);
if y.cheie >= z.nrm then ivk:=true
end;
if not ivk then
begin
y.is:=1;
y.cheie:=z.nrm;
y.nr:=filesize(f);
write(g,y);
seek(f,filesize(f));
write(f,z)
end
end;
Algoritmi de prelucrare a fişierelor organizate indexat
procedure writekeyrec;
begin
start(f,key,ivk);
if ivk then
begin
y.is:=1; y.cheie:=z.nrm; y.nr:=filesize(f);
seek(g,filesize(g)); write(g,y);
seek(f,filesize(f)); write(f,z);
sort(g); ivk:=false
end
else ivk:=true
end;
procedure rewriterec;
begin
start(f,z.nrm,ivk);
if not ivk then
begin
seek(f,filepos(f)-1); write(f,z)
end
end;
procedure deleteseqrec;
begin
if filepos(g) <= filesize(g) then
begin
ivk:=false; seek(g,filepos(g)-1);
y.is:=0; write(g,y); sort(g)
end
else ivk:=true
end;
procedure deletekeyrec;
begin
start(f,key,ivk);
if not ivk then deleteseqrec(f,ivk)
end;
procedure start;
var
i,ld,ls:word; vb:boolean;
begin
ivk:=false; vb:=false; ls:=1; ld:=filesize(g);
while not vb and (ld>=ls) do
begin
i:=(ls+ld) div 2;
seek(g,i-1); read(g,y);
if y.cheie = key then
vb:=true
else if y.cheie < key then ls:=i+1 else ld:=i-1
end;
if not vb then ivk:=true
end;
end.
Algoritmi în programare. Aplicaţii
program creare_fisier_indexat;
uses crt,indexate;
var
art:tipart; f:tipfis; er,ivk,ivk1:boolean;
i,l:byte; s:string[100]; nume_fis:string;
Algoritmi de prelucrare a fişierelor organizate indexat
const
alfabet=['a'..'z','a'..'z',' '];
procedure eroare;
begin
er:=true; gotoxy(10,25);
write(s,' Tastati <enter>',#7);
repeat until readkey=#13;
gotoxy(10,25); clreol
end;
procedure citire_nrm;
begin
repeat
er:=false; gotoxy(38,5);
{$i-}; readln(art.nrm); {$i+};
if ioresult <> 0 then
begin
s:='Valoare nenumerica !';
eroare; gotoxy(38,5);
clreol
end
until not er
end;
procedure citire_nume;
begin
repeat
er:=false; gotoxy(38,6); clreol;
readln(art.nume);
l:=length(art.nume);
for i:=1 to l do
if not (art.nume[i] in alfabet) then er:=true;
if er then
begin
s:='Caractere nealfabetice !';
eroare
end
until not er
end;
procedure citire_grupa;
begin
repeat
er:=false;
gotoxy(38,7); clreol;
{$i-}; readln(art.grupa); {$i+};
if ioresult <> 0 then
begin
s:='Valoare nenumerica !';
eroare; clreol
end
until not er
end;
Algoritmi în programare. Aplicaţii
procedure citire_nrd;
begin
repeat
er:=false; gotoxy(38,8); clreol;
{$i-} readln(art.nrd); {$i+}
if ioresult<>0 then
begin
s:='Caractere nenumerice !';
eroare
end
until not er
end;
procedure citire_note;
begin
for i:=1 to art.nrd do
begin
gotoxy(20,i+8);
write('Nota ',i:2,' : ');
repeat
er:=false; gotoxy(38,i+8); clreol;
{$i-} readln(art.nota[i]); {$i+}
if ioresult<>0 then
begin
s:='Caractere nenumerice !';
eroare
end
until not er
end
end;
procedure inceput;
begin
textbackground(blue); textcolor(yellow); clrscr;
repeat
write('Numele fisierului: ');
readln(nume_fis);
opennew(f,nume_fis,ivk)
until not ivk;
clrscr; checkeof:=true;
gotoxy(20,5); write('Nr. matricol: ');
gotoxy(20,6); write('Nume si prenume: ');
gotoxy(20,7); write('Grupa: ');
gotoxy(20,8); write('Nr. discipline: ');
gotoxy(38,5)
end;
procedure prelucrare;
begin
citire_nrm;
start(f,art.nrm,ivk);
if ivk then
begin
Algoritmi de prelucrare a fişierelor organizate indexat
citire_nume; citire_grupa;
citire_nrd; citire_note;
writekeyrec(f,art,art.nrm,ivk1)
end;
if not ivk or ivk1 then
begin
s:='Articol existent !';
eroare
end;
for i:=5 to 8 do begin gotoxy(38,i); clreol end;
for i:=9 to 24 do begin gotoxy(20,i); clreol end;
gotoxy(38,5);
end;
procedure sfarsit;
begin
closefile(f);
end;
{programul principal}
begin
inceput;
while not eof do prelucrare;
sfarsit
end.
program consultare_acces_direct;
uses crt,indexate;
var
x:tipart; f:tipfis; nrm,i:word;
ivk:boolean; nume_fis:string;
begin
clrscr;
repeat
write('Numele fisierului: ');
readln(nume_fis);
openold(f,nume_fis,ivk)
until not ivk;
clrscr; checkeof:=true;
with x do begin
gotoxy(10,5);
Algoritmi în programare. Aplicaţii
write('Numar matricol:');
while not eof do
begin
gotoxy(35,5); readln(nrm);
readkeyrec(f,x,nrm,ivk);
if not ivk then
begin
gotoxy(15,8); write(nume);
gotoxy(10,11); write('Grupa ',grupa);
gotoxy(10,13); write('Note obtinute:');
for i:=1 to nrd do
begin
gotoxy(10,14+i);
write('Nota ',i:2,': ',nota[i]:2)
end
end
else begin
gotoxy(10,10); write('Articol inexistent !',#7)
end;
readln; clrscr; gotoxy(10,5);
write('Numar matricol:')
end
end {with};
closefile(f)
end.
program consultare_grupa;
uses crt,indexate;
var
x:tipart;
f:tipfis;
gr,i:word;
sf,vb,ivk:boolean;
nume_fis:string;
Algoritmi de prelucrare a fişierelor organizate indexat
begin
clrscr;
write('Numele fisierului: ');
readln(nume_fis);
clrscr; checkeof:=true;
with x do begin
gotoxy(10,1);
write('Grupa (sau ^Z):');
while not eof do
begin
openold(f,nume_fis,ivk);
gotoxy(27,1); readln(gr);
sf:=false; vb:=false; i:=0;
readseqrec(f,x,sf);
while not sf do
begin
if grupa=gr then
begin
inc(i); gotoxy(10,2+i);
write(i:2,'. ',nrm:4,' ',nume);
vb:=true
end;
readseqrec(f,x,sf)
end;
if not vb then begin
gotoxy(25,10);
write('Numar grupa eronat !',#7)
end;
readln; clrscr;
closefile(f);
gotoxy(10,1); write('Grupa (sau ^Z): ')
end
end {with}
end.
program actualizare_fisier_indexat;
uses crt,indexate;
var
f:tipfis;
x:tipart;
t:text;
opt,r:char;
ivk:boolean;
nrm,i,err:word;
aux:string[25];
numefis:string;
procedure meniu;
begin
clrscr; reset(input);
gotoxy(30,8); write('Functiunile programului');
gotoxy(36,10); write('1. Adaugare');
gotoxy(36,11); write('2. Modificare');
gotoxy(36,12); write('3. Stergere');
gotoxy(36,13); write('4. Terminare');
gotoxy(30,16); write('Functia aleasa:');
gotoxy(46,16); readln(opt)
end;
procedure citire_campuri;
begin
write('Nume si prenume: ');
readln(x.nume);
write('Grupa: ');
readln(x.grupa);
write('Nr. discipline: ');
readln(x.nrd);
for i:=1 to x.nrd do
begin
write('Nota ',i,': ');
readln(x.nota[i])
end
end;
Algoritmi de prelucrare a fişierelor organizate indexat
procedure adaugare;
begin
reset(input); checkeof:=true; clrscr;
with x do begin
write('Nr. matricol: ');
while not eof do
begin
readln(nrm);
readkeyrec(f,x,nrm,ivk);
if ivk then
begin
citire_campuri;
writekeyrec(f,x,nrm,ivk)
end
else writeln('Numarul matricol exista in fisier !');
write('Nr. matricol (sau ^Z): ')
end
end
end;
procedure stergere;
begin
reset(input);
checkeof:=true; clrscr;
with x do begin
write('Nr. matricol: ');
while not eof do
begin
readln(nrm);
readkeyrec(f,x,nrm,ivk);
if not ivk then
begin
writeln(nume,' ',grupa);
write('Confirmati stergerea ? (d/n): ');
readln(r);
if upcase(r)='D' then deleteseqrec(f,ivk)
end
else writeln('Student inexistent in fisier !');
write('Nr. matricol (sau ^Z): ')
end
end
end;
procedure modif_campuri;
begin
with x do begin
write('Nume si prenume: ',nume,' '); readln(aux);
if aux<>'' then nume:=aux;
write('Grupa: ',grupa,' '); readln(aux);
if length(aux)<>0 then val(aux,grupa,err);
write('Nr. discipline: ',nrd,' '); readln(aux);
if aux[0]<>#0 then val(aux,nrd,err);
Algoritmi în programare. Aplicaţii
1
Capitolul 4 – Etapele rezolvării problemelor cu calculatorul, în lucrarea Algoritmi în
programare, B. Ghilic-Micu (coord.), Ed. ASE, Bucureşti 2002, pg. 65
Algoritmi în programare. Aplicaţii
4
Determinarea datelor de intrare pornind de la transformările necesare pentru obţinerea
datelor de ieşire se realizează utilizând tehnica analizei concordanţei ieşiri-intrări (intrările
sunt condiţionate de ieşiri).
5
În acest context, prin format se înţelege modul în care vor fi reprezentate extern (pe ecran
sau pe hârtie) câmpurile pentru citirea datelor de intrare şi cele pentru afişarea rezultatelor.
De asemenea, formatele de intrare/ieşire sunt parte integrantă din interfaţa aplicaţiei
informatice cu utilizatorul, în proiectarea căreia trebuie să fie luate în calcul şi elemente de
estetică şi “ergonomie vizuală” (sarcina responsabilului cu proiectarea interfeţei).
Algoritmi în programare. Aplicaţii
6
Paragraful 3.8 – Proiectarea algoritmilor, în lucrarea Algoritmi în programare, B. Ghilic-
Micu (coord.), Ed. ASE, Bucureşti 2002, pg. 60
Aplicaţie informatică cu prelucrare de fişiere
Analiza
Echipa de analiză-concepţie-programare a identificat, pe baza cerinţelor
formulate în proiect, datele de ieşire şi principalele prelucrări necesare pentru
obţinerea acestor date.
Datele de ieşire:
a) facturile emise ca urmare a scadenţei contractelor de închiriere auto;
b) oferta integrală a societăţii (prezentată pe tipuri de autoturisme);
c) venitul înregistrat pe fiecare maşină din parcul auto.
Prelucrări:
a) compararea datei curente din sistem cu data scadenţei contractelor
neonorate, calculul valorii facturii emise luând în calcul numărul de
kilometri parcurşi de client de la momentul închirierii auto; de asemenea,
la calculul valorii facturate se va ţine cont de fidelitatea clientului;
b) ordonarea alfabetică a datelor despre autoturismele din parcul auto în
funcţie de tipul acestora (problemă cu control după caracteristică);
c) calculul valorii închirierilor auto pentru fiecare maşină din parcul auto.
De asemenea, au fost stabilite condiţiile iniţiale şi restricţiile referitoare la
soluţie:
- o maşină nu poate fi închiriată dacă apare într-un contract neonorat;
Algoritmi în programare. Aplicaţii
7
Pentru validare a se vedea capitolul 11 – Validarea datelor, din lucrarea Algoritmi în
programare, B. Ghilic-Micu (coord.), Ed. ASE, Bucureşti 2002, pg. 183
Aplicaţie informatică cu prelucrare de fişiere
Finalizarea proiectului
Pentru această fază, proiectul a fost testat în ansamblu, verificându-se
astfel funcţionalitatea acestuia. Testarea s-a realizat utilizând date de test. După
testare, proiectul informatic este livrat beneficiarului, unde va fi implementat şi
pregătit pentru exploatare.
Exploatarea şi mentenanţa
Aplicaţia va fi exploatată la beneficiar, urmărindu-se comportamentul
acesteia pe parcursul utilizării.
Documentarea
Documentaţia proiectului cuprinde manualele de prezentare şi de
utilizare/exploatare. Pentru tehnoredactarea acestora a fost folosit editorul de texte
Microsoft Word 2002, editorul de ecuaţii Microsoft Equation 3.0 şi editorul grafic
Microsoft Word Picture 2002.
Algoritmi în programare. Aplicaţii
funcţia 1 A
funcţia 2 B
funcţia 3 C
M en iu
principal funcţia 4 D
funcţia 5 E
funcţia 6 F
G
funcţia 7
funcţia 8 H
Fig. 9.1. Schema de sistem a proiectului
Aplicaţie informatică cu prelucrare de fişiere
numărul de număr de
tipul auto, anul de tariful la starea maşinii:
Semnificaţie înmatriculare auto km la
marca fabricaţie 100 km închiriată sau nu
(cheia primară) bord
Codificare nrm marca an tarif stare nrkm
Tip string[7] string[15] word real 0..1 longint
numărul starea
data număr data
numărul codul auto al contractului:
Semnificaţie încheierii de km stingerii
contractului clientului maşinii în derulare
contractului parcurşi contractului
închiriate sau stins
Codificare nrc codc nrm dataem nrkm scadenta on
Tip word word string[7] data* longint data* 0..1
* a fost definit tipul data, de forma: an (word), luna (1..12), zi (1..31).
numărul starea
număr
numărul numărul numele auto al valoarea facturii:
Semnificaţie de km
facturii contractului clientului maşinii facturii achitată sau
parcurşi
închiriate nu
Codificare nrf nrc nume nrm nrkm val achitat
Tip word word string[40] string[7] longint real 0..1
TipCheie= string[7];
TipArt=record
nrm:TipCheie;
marca:string[15];
an:word;
tarif:real;
stare:0..1;
nrkm:longint
end;
Algoritmi în programare. Aplicaţii
tipa=record
is:BYTE;
nume:string[40];
adr:string[30];
nrc:byte;
end;
data=record
an:word;
luna:1..12;
zi:1..31
end;
contr=record
nrc:word;
codc:word;
nrm:tipcheie;
dataem:data;
nrkm:longint;
scadenta:data;
on:0..1
end;
facturi=record
nrf:word;
nrc:word;
nume:string[40];
nrm:tipcheie;
nrkm:longint;
val:real;
achitat:0..1
end;
manevra=record
nrauto:string[7];
marca:string[15];
tarif:real;
nrkm:longint
end;
Aplicaţie informatică cu prelucrare de fişiere
OFERTA.TXT
MANEVRA.TMP
codc
AUTO.DAT CLIENTI.DAT
nume
MENIU PRINCIPAL
nrm
CONTR.DAT FACTURI.DAT
nrc
Utilizatorul poate alege una din cele opt opţiuni, iar pentru fiecare opţiune
se deschide un ecran special în care sunt preluate datele de intrare şi sunt afişate
rezultatele.
Dacă este aleasă opţiunea 2 şi clientul care urmează să închirieze maşina
este nou (nu există în fişierul clienti.dat), ecranul aplicaţiei va arăta astfel:
DOSAR DE PREZENTARE
program creare;
uses crt, relativ, indexate;
type data=record
an:word;
luna:1..12;
zi:1..31
end;
contr=record
nrc:word;
codc:word;
nrm:tipcheie;
dataem:data;
nrkm:longint;
scadenta:data;
on:0..1
end;
facturi=record
nrf:word;
nrc:word;
nume:string[40];
nrm:tipcheie;
nrkm:longint;
val:real;
achitat:0..1
end;
var f:tipfis; g:tipf;
h1:file of contr; h2:file of facturi;
numef,numeg,numeh1,numeh2:string;
ivk:boolean;
begin
clrscr;
write('Numele fisierului de masini:');
readln(numef);
opennew(f,numef,ivk);
write('Numele fisierului de clienti:');
readln(numeg);
open(g,numeg,0,ivk);
write('Numele fisierului de contracte:');
readln(numeh1);
assign(h1,numeh1); rewrite(h1);
write('Numele fisierului de facturi:');
readln(numeh2);
assign(h2,numeh2); rewrite(h2);
end.
Algoritmi în programare. Aplicaţii
DOSAR DE PREZENTARE
program simulare;
uses dos,crt,relativ,indexate;
type data=record
an:word;
luna:word;
zi:word
end;
contr=record
nrc:word;
codc:word;
nrm:tipcheie;
dataem:data;
nrkm:longint;
scadenta:data;
on:0..1
end;
facturi=record
nrf:word;
nrc:word;
nume:string[40];
nrm:tipcheie;
nrkm:longint;
val:real;
achitat:0..1
end;
manevra=record
nrauto:string[7];
marca:string[15];
tarif:real;
nrkm:longint
end;
const numef:string='auto.dat';
numeg:string='clienti.dat';
numeh1:string='contr.dat';
numeh2:string='facturi.dat';
var f:tipfis; g:tipf; h1:file of contr; h2:file of facturi;
m:file of manevra; l:text;
a:tipart; b:tipa; c:contr; d:facturi; t,z:manevra;
ivk,sf,vb:boolean; opt:0..8; i:byte;
datas:data; codc,sapt:word; nrm_t:tipcheie;
c1,marca_t:string[15]; r:char; n:longint; tot:real;
procedure meniu;
begin
reset(input); clrscr;
gotoxy(30,7); write('Aplicatie multifunctionala RENT A CAR');
gotoxy(26,9); write('1. Achizitie auto');
gotoxy(26,10); write('2. Inchiriere auto');
gotoxy(26,11); write('3. Cresterea pretului carburantului cu 10%');
gotoxy(26,12); write('4. Radiere auto');
gotoxy(26,13); write('5. Emitere automata factura');
Aplicaţie informatică cu prelucrare de fişiere
c.on:=0;
write(h1,c); clrscr
end
end;
write('Marca sau ^Z:')
end;
close(h1); close(g)
end;
procedure functia3;
begin
openold(f,numef,ivk);
clrscr; writeln('Tarifele la inchirieri auto vor creste cu 10%');
sf:=false;
readseqrec(f,a,sf);
while not sf do
begin
a.tarif:=a.tarif*1.1;
rewriterec(f,a,ivk);
readseqrec(f,a,sf)
end;
gotoxy(20,20); write('Sfarsit de operatie. Apasati ENTER'); readln;
closefile(f)
end;
function dme(var d1,d2:data):boolean;
begin
if d1.an>=d2.an then
if (d1.an=d2.an) and (d1.luna>=d2.luna) then
if (d1.an=d2.an) and (d1.luna=d2.luna) and (d1.zi>=d2.zi)
then dme:=true
else dme:=false
end;
procedure functia4;
begin
clrscr; checkeof:=true;
openold(f,numef,ivk);
write('Nr. de inmatriculare al masinii de radiat sau ^Z:');
while not eof do
begin
readln(nrm_t);
for i:=1 to length(nrm_t) do nrm_t[i]:=upcase(nrm_t[i]);
readkeyrec(f,a,nrm_t,ivk);
if ivk then begin
gotoxy(26,18);
writeln('Masina neinmatriculata sau radiata!');
gotoxy(26,18); readln; clrscr
end
else begin
if a.stare=1 then writeln('Pentru masina cu numarul ',
nrm_t,' exista contracte neonorate!')
else begin
writeln;
writeln('Nr. de inmatriculare: ',a.nrm);
writeln('Marca: ',a.marca);
writeln('Anul fabricatiei: ',a.an);
writeln('Tarif la 100 km: ',a.tarif:6:0,' USD');
Algoritmi în programare. Aplicaţii
writeln;
write('Confirmati radierea (d/n)?');
readln(r);
if upcase(r)='D' then deletekeyrec(f,nrm_t,ivk)
end
end;
write('Nr. inmatriculare al masinii de radiat sau ^Z:')
end;
closefile(f)
end;
procedure functia5;
begin
clrscr;
assign(h2,numeh2); reset(h2); seek(h2,filesize(h2));
assign(h1,numeh1); reset(h1);
assign(g,numeg); reset(g);
openold(f,numef,ivk);
getdate(datas.an,datas.luna,datas.zi,sapt);
while not eof(h1) do
begin
vb:=false;
read(h1,c);
if (dme(datas,c.scadenta)) and (c.on=0) then
begin
vb:=true;
d.nrf:=filesize(h2)+1;
d.nrc:=c.nrc;
readd(g,b,c.codc,ivk);
d.nume:=b.nume;
d.nrm:=c.nrm;
writeln('Factura aferenta contractului nr. ',d.nrc,
' pentru masina ',d.nrm);
repeat
write('Nr. de km: '); readln(n);
if n<c.nrkm then writeln('Km mai putini decat la '
'inchiriere!')
until n>=c.nrkm;
d.nrkm:=n;
readkeyrec(f,a,c.nrm,ivk);
d.val:=(d.nrkm-c.nrkm)*a.tarif/100;
if b.nrc>=5 then d.val:=0.9*d.val;
d.achitat:=0;
write(h2,d);
readkeyrec(f,a,d.nrm,ivk);
a.stare:=0;
rewriterec(f,a,ivk);
clrscr;
gotoxy(20,2); write('FACTURA FISCALA nr. ',d.nrf:5);
gotoxy(15,4); write('S.C. RENT A CAR S.R.L. BUCURESTI');
gotoxy(12,7); write('Contravaloarea contractului nr. ',
d.nrc:6);
gotoxy(12,8); write('Numele clientului: ',d.nume);
gotoxy(12,9); write('Nr. masinii inchiriate: ',d.nrm);
gotoxy(12,11); write('Valoare factura: ',d.val:10:2,
' USD');
Aplicaţie informatică cu prelucrare de fişiere
gotoxy(20,15); write('Emitent');
gotoxy(50,15); write('Beneficiar');
readln;
clrscr
end
end;
if not vb then writeln('Nu sunt contracte scadente astazi!');
readln;
closefile(f);
close(g);
close(h1);
close(h2)
end;
procedure functia6;
begin
clrscr;
assign(h2,numeh2); reset(h2);
assign(h1,numeh1); reset(h1);
openold(f,numef,ivk);
while not eof(h2) do
begin
read(h2,d);
vb:=false;
if d.achitat=0 then begin
vb:=true;
writeln('Nr. factura: ',d.nrf);
writeln('Nr. contract: ',d.nrc);
writeln('Nr. auto: ',d.nrm);
writeln('Valoare: ',d.val:10:2,' USD');
writeln;
write('Platiti factura (d/n)?');
readln(r);
if upcase(r)='D' then begin
d.achitat:=1;
seek(h2,filepos(h2)-1);
write(h2,d);
reset(h1);
while not eof(h1) do begin
read(h1,c);
if c.nrc=d.nrc then begin
c.on:=1;
seek(h1,filepos(h1)-1);
write(h1,c)
end
end
end
end
end;
if not vb then writeln('Nu exista facturi de platit!');
readln;
closefile(f);
close(h1);
close(h2)
end;
Algoritmi în programare. Aplicaţii
procedure functia7;
begin
openold(f,numef,ivk);
assign(m,'manevra.tmp');
rewrite(m);
readseqrec(f,a,sf);
while not sf do
begin
if a.stare=0 then
begin
t.nrauto:=a.nrm;
t.marca:=a.marca;
t.tarif:=a.tarif;
t.nrkm:=a.nrkm;
write(m,t)
end;
readseqrec(f,a,sf)
end;
closefile(f);
{sortarea dupa marca}
repeat
vb:=false;
for i:=1 to filesize(m)-1 do
begin
seek(m,i-1);
read(m,t,z);
if t.marca>z.marca then begin
seek(m,i-1);
write(m,z,t);
vb:=true
end
end
until not vb;
{obtinerea ofertei}
assign(l,'oferta.txt');
rewrite(l);
clrscr;
seek(m,0);
writeln(l,' Oferta de masini');
writeln(l,'_____________________________________');
writeln(l,'| Nr. auto | Tarif | Nr. km la bord |');
writeln(l,'_____________________________________');
writeln(' Oferta de masini');
writeln('_____________________________________');
writeln('| Nr. auto | Tarif | Nr. km la bord |');
writeln('_____________________________________');
sf:=false;
fillchar(t.nrauto,8,' ');
read(m,t);
while not sf do
begin
c1:=t.marca;
writeln(l,c1);
writeln(c1);
while (not sf) and (t.marca=c1) do
Aplicaţie informatică cu prelucrare de fişiere
begin
t.nrauto[0]:=#7;
writeln(l,'|',t.nrauto,' |',t.tarif:7:2,'|',
t.nrkm:16,'|');
writeln('|',t.nrauto,' |',t.tarif:7:2,'|',
t.nrkm:16,'|');
fillchar(t.nrauto,8,' ');
{$I-} read(m,t) {$I+};
if ioresult<>0 then sf:=true
end;
writeln(l,'_____________________________________');
writeln('_____________________________________')
end;
close(m);
erase(m);
close(l);
readln
end;
procedure functia8;
begin
clrscr;
checkeof:=true;
openold(f,numef,ivk);
assign(h2,numeh2);
reset(h2);
write('Nr. de inmatriculare al masinii sau ^Z:');
while not eof do
begin
readln(nrm_t);
for i:=1 to length(nrm_t) do nrm_t[i]:=upcase(nrm_t[i]);
start(f,nrm_t,ivk);
if ivk then begin
gotoxy(26,18);
writeln('Masina neinmatriculata sau radiata!');
gotoxy(26,18);
readln; clrscr
end
else begin
seek(h2,0);
tot:=0;
while not eof(h2) do
begin
read(h2,d);
if (d.nrm=nrm_t) and (d.achitat=1) then
tot:=tot+d.val
end;
writeln('Masina ',nrm_t:7,' a inregistrat o valoare a'+
' inchirierilor de ',tot:7:2,' USD');
readln
end;
write('Nr. de inmatriculare sau ^Z:')
end;
closefile(f);
close(h2)
end;
Algoritmi în programare. Aplicaţii
{programul principal}
begin
meniu;
while opt<>0 do begin
case opt of
1: functia1;
2: functia2;
3: functia3;
4: functia4;
5: functia5;
6: functia6;
7: functia7;
8: functia8
end;
meniu
end
end.