Sunteți pe pagina 1din 78

1.

Subprograme
p g
definite de utilizator
1.1. Subprograme.
M
Mecanisme
i
d transfer
de
f prin
i intermediul
i
di l parametrilor
il
Subprograme (Pascal
Pascal) :

proceduri Procedure
Procedure,

functii
[Function
Function].
Parametri (tipuri/clasificari),
Vizibilitate,
Vizibilitate
Parametri de tip Functie, Procedura,
p
recursiv ((subpr.
p recursive),
),
Apelul
Definire simultana (Forward).
3/80

Subalgoritmi: rezolv o anumit subproblem


Parametri de Intrare

Parametri de iesire

Subalgoritm

Apel:

[Cheam] Nume_Subalgoritm
Nume Subalgoritm (Lista_parametri_actuali);
(Lista parametri actuali);

Def.::
Def
Subalgoritmul Nume_Subalgoritm (Lista_parametri_formali) Este : {Antet}
...
Sf_Subalgoritm.

{ Corp subalgoritm }
{ sau Sf_Nume_Subalgoritm. }

Parametri de Intrare Expresii


Parametri de iesire Variabile
4/80

Exemplu: pentru trei mulimi date A, B i C calculm AB, AC i BC


X,Y

R:=XY

Algoritmul Reuniuni Este :


Date A,B,C;
Cheam Reuniune (A,B,R1);
Cheam Reuniune (A,C,R2);
(A C R2);
Cheam Reuniune (B,C,R3);
Rezultate R1;
Rezultate R2;
Rezultate R3;
Sff_Algoritm.
g

Subalgoritmul Reuniune ( X,Y, R ) Este :


R:=X;
Pentru fiecare yY Execut
Dac yX Atunci R:=R{y}
Sf Dac
Sf_Dac
Sf_Pentru
Sf_Reuniune.

Subalgoritmul Reuninune determin mulimea R = X Y astfel :


R := X (Y \ X),
X) adic
di ddepune n reuniune
i
maii nti
ti elementele
l
t l din
di mulimea
li
X, la care apoi mai adaug acele elemente din Y care nu aparin lui X.
5/80

Functii: ~ Subalgoritm + Val. functiei


Apelul unei funcii:
se face scriind ntr-o expresie numele funciei urmat de lista parametrilor actuali.
Nume_Funcie (List_parametri_actuali)

{ expr.instr.}

Def.:
f
Funcia Nume_Funcie (List_parametri_formali) Este : { Antetul funciei }
...
Nume_Funcie := Expresie;
{ Corpul funciei }
...
Sf_Funcie.
{ sau Sf_Nume_funcie.}
Parametri de Intrare Expresii
Parametri de iesire Variabile
6/80

Exemple: Exist & Apart


Funcia Exist ( b,
b A,
A n,
n p ) Este :
p:=1;
Ct_Timp (p<=n) i (b<>ap) Execut p:=p+1 Sf_Ct_Timp;
Exist ::= (p
(p<=n)
n)
Sf_Exist.
Funcia Apart (b,A) Este :
p:=1;
{Card(A)=|A|}
Ct_Timp (p<=Card(A)) i (b<>A[p]) Execut p:=p+1
Sf_Ct_Timp;
A
Apart
:= (p<=Card(A))
(
C d(A))
Sf_Apart.
Funcia
Card ((A)) Este :
Card := a0
Sf_Card.
Dac yX Atunci R:=R{y} Sf_Dac;
Dac Not Apart (y,X) Atunci R:=R{y} Sf_Dac;

7/80

Exemplu: determin maximul dintrdintr-un ir X cu n componente .


Funcia
Max (X,k)
( ) Este :
Dac k=1 Atunci
Max:=x1
{Consistena}
Altfel Dac Max(X,k-1) < xk Atunci Max:= xk
Altfel Max:= Max(X,k-1)
Sf_Dac
Sf_Dac
Sf_Max.
Apelul:
Max(X,n)

Exemplu: decide dac b aparine primelor k elemente din irul A .


Funcia Apart (b,A,k) Este :
Apart := (k>0) i ( Apart(b,A,k-1) Sau (b=ak) )
Sf_Apart.
Apelul:
Apart(b,A,Card(A))
8/80

Subprograme Pascal : Procedure, Function :


<Def_subprogram> ::= <Def_funcie> | <Def_procedur>
<Def_funcie> ::= <Antet_funcie> ; <Bloc>
<Def_procedur> ::= <Antet_procedur> ; <Bloc>
<A t t f
<Antet_funcie>
i > ::=
:: Function
F
ti <Nume>
<N
> [ (L_p_f
(L
f ) ] : <Tip_f>
<Ti f>
<Antet_procedur> ::= Procedure <Nume> [ (L_p_f ) ]
Real, Integer, Byte, Boolean, Char, String,
String,

Apel:
A l
Apel
P:
F:

<Nume> [ (Lista_parametri_actuali)];
<Nume>

[ ((List_pparametri_actuali))]

{ expr.
expr
p instr
instr. }

9/80

Parametri :
Date de intrare

Subprogram

Date de iesire
Adr. (Var.)

Val. (Expr.)

<L_p_f.> ::= <spf> { ; <spf> }


<spf> ::= <sp_val>

| <sp_var> | <p_functie> | <p_procedura>

<
<sp_val>
l> ::= <lista_id>
<li t id> : <id_tip>
<id ti >
<sp_var> ::= Var <lista_id> : <id_tip>

A
B

Reuniune

Procedure Reuniune (A,B:Multime; Var C:Multime);


10/80

Vizibilitate :
Domeniu de vizibilitate:

Var. locale
Var globale ( ! )
Var.
Proceduri,
Functii,

S2a
n3

S
n1

S1
n2

S2
n2

S2b
n23

P
n0 (nivelul
( i l l 0)

Function Apart (b:Integer; A:Multime) : Boolean;


Var i,n : Integer;
Begin
i:=1; n:=A[0];
While (i
(i<=n)
n) And (b
(b<>A[i])
A[i]) Do i:
i:=i+1;
i+1;
Apart := i<=n
{Apartine, daca i<=n }
End;

{Apartine b multimii A?}

11/80

Program AuB_AuC_BuC;
Type Multime = Array[0..100]
Array[0 100] Of Integer;
Procedure Citeste (Var A:Multime);
{ Citeste o multime de la tastatura }
Var c,p,n : Integer;
s : String;
Begin
Write (' Dati elementele multimii : '); Readln (s); n:=0;
While s<>'' Do Begin
n:=n+1;
n:
n+1; Val(s
Val(s,A[n],p);
A[n] p);
If p>0 Then Val(Copy(s,1,p-1),A[n],c) Else p:=Length(s); Delete (s,1,p)
End;
A[0]:=n;
[ ]
;
{ n=Card(A)
( ) A[0]
[ ]}
End;
Procedure Tipareste (A:Multime);
Var n,i
n i : Integer;
Begin
n:=A[0]; Write (' {');
For i:=1 To n Do W
Write ((A[i],',');
[ ], , );
Writeln (Chr(8),'}')
End;

{ Tipareste pe ecran o multime A }

{ Rescrie peste ultima virgula, acolada }


12/80

Function Apart (b:Integer; A:Multime) : Boolean;


{Apartine b multimii A?}
Var i,n : Integer;
Begin
i:=1; n:=A[0];
While (i<=n) And (b<>A[i]) Do i:=i+1;
Apart := i<=n
{Apartine, daca i<=n }
E d
End;
Procedure Reuniune (A,B:Multime; Var C:Multime);{ C := A B }
Var i,p,q,r : Integer;
Begin
C: A p:=A[0];
C:=A;
p: A[0] q:=B[0];
q: B[0]
r: C[0]
r:=C[0];
For i:=1 To q Do
If Not Apart(B[i],A) Then Begin
r:=r+1;
r:
r+1; C[r]:=B[i]
C[r]: B[i] End
C[0]:=rr
C[0]:
End;
Var A, B, C, AuB, AuC, BuC : Multime;
Begin
Citeste (A); Citeste (B); Citeste (C);
Reuniune(A,B,AuB); Tipareste (AuB);
Reuniune(A C AuC); Tipareste (AuC);
Reuniune(A,C,AuC);
Reuniune(B,C,BuC); Tipareste (BuC);
End.

{ Modulul principal }

Readln
13/80

Parametri de tip Function, Procedure :


Ex.:

Grafic (f,a,b); Grafic (g,c,d);


Integrala (f,a,b,SumeR); Integrala (g,c,s,Trapeze);
Radac (f,a,b,eps,Coardei); Radac (g,c,d,0.01,Tangentei);

Program pfp;
{$F+}.
Type Functie
= Function ( x : Real ) : Real ;
Procedura = Procedure ( . . . ) ;
Function <nume_subpr> ( ... f:Functie; ... p:Procedura; ... ) :
Procedure

B i
Begin
f
p
E d
End;
Apelul:
Function f1 ():
Function f2 ():

Procedure metoda1();
Procedure metoda2();

. . . <nume_subpr> ( ... f1, ... ,metoda1, ... ) ...


. . . <nume_subpr> ( ... f2, ... ,metoda2, ... ) ...
. . .

14/80

Program Parametri_Functie_Procedura;
{$F+}
Type Sir
= Array [1..30] Of Integer;
F
Functie
ti = Function
F
ti (x:Integer)
( I t
) : Integer;
I t
FctBool = Function (a,b:Integer) : Boolean;
Procedura = Procedure(Var Z:Sir; n:Integer);
Function f (x:Integer) : Integer; Begin f:=Sqr(x+1)-x End;
Function g (x:Integer) : Integer; Begin g:=Sqr(x-1)+x End;
Function
Cresc(a,b:Integer):Boolean; Begin
Cresc:=a<b End;
Function DesCresc(a
DesCresc(a,b:Integer):Boolean;
b:Integer):Boolean; Begin DesCresc:=a>b End;
Procedure Ordonez (Var X:Sir; n:Integer; Relatie : FctBool );
Var
Ordonat : Boolean; k, i, v : Integer;
Begin
k:=1;
Repeat Ordonat:=True;
For i:=1 To n-k Do
If Not Relatie(X[i],X[i+1]) Then Begin
v:=X[i]; X[i]:=X[i+1]; X[i+1]:=v;
Ordonat:=False
End;
k:=k+1
Until Ordonat;
End;
15/80

Procedure OrdCresc (Var A:Sir; n:Integer);


g
Ordonez ( A,, n,, Cresc ) End;;
Begin
Procedure OrdDesCresc (Var A:Sir; n:Integer);
Begin

Ordonez

( A, n, DesCresc ) End;

Procedure Gen_Ord_Tip (Var A:Sir; n:Integer; r : Functie;


Ordonare : Procedura );
Var i:Integer;
Begin
For i:=1 To n Do A[i]:=r(i);
{Generare}
Od
Ordonare
(A )
(A,n);
{Ordonare}
{O
d
}
For i:=1 To n-1 Do Write (A[i],','); Writeln(A[n]) { Tiparire }
End;
Var

X, Y : Sir;

Begin
Gen_Ord_Tip
p ((X,10, f, OrdCresc ));
{ Prel X }
Gen_Ord_Tip (Y,11, g, OrdDesCresc ); Readln { Prel Y }
End.
16/80

Apelul recursiv :
Este permis apelul recursiv (un subprogram se autoapeleaza). Se ofera solutii simple
plecand de la (avand) definitii simple.
Ex.: Problema turnurior din Hanoi , n!=n*(n-1)! sau 1 (Consistenta!
Consistenta!)
Recursivitate
Recursivitate
Iteratie !

Ex : Fiind
Ex.:
Fiind date dou numere naturale de maxim 30 de cifre,
cifre sub forma a dou
iruri de caractere, s se determine irul cifrelor sumei :
Formul recursiv pentru a aduna numrul A de n cifre cu numrul B de m cifre :

Ad(B,n,A,m,Tr)
Ad(A,m,B,n,Tr) =

Dac

m>n

(1)

m 0 n=0,
m=0,
n 0 tt=00 (2)

'1'

m=0, n=0, t=1 (3)

Ad(A,m,B,n-1,Tr( '0'+B[n]))Cifra(0,B[n])

m=0, n>0

(4)

Ad(A,m-1,B,n-1,Tr(a[m],B[n]))Cifra(a[m],b[n]) m>0, n>0

(5)
17/80

Program Adunare_Numere_siruri_cifre_baza_10; { Adun_Str[n], n<=30 }


Const n=31;
Type Numar = String[n];
Function Adun (a, b : Numar) : Numar;
{ Adun := A+B }
Function Ad ((m, n, t : Byte)
y ) : Numar;
{ Aduna primele
p
m resp.
p n cifre
f }
Var c:Char;
Function Tr (a:Char):Byte;
{ Tr:=a+b[n] Div 10 ; a = 0 sau a[m] }
Var s : Byte;
y ;
Begin Tr:=0; { c:=a+b[n] Mod 10 }
s:= Ord(a)+Ord(b[n])-$60+t; { s=suma cifrelor 0..19 }
If s>9 Then Begin Tr:=1; s:=s-10 End;
c:= Chr(s Or $30);
{ c=caracterul sumei resturilor }
End;
Begin
If n=0
0 Th
Then If t=0
0 Th
Then Ad
Ad:=''''
{C
Cazull (2) }
Else
Ad:='1'
{
(3) }
Else If m=0 Then Ad:=Ad(m ,n-1,Tr( '0'))+c
{
(4) }
Else Ad:=Ad(m-1,n-1,Tr(a[m]))+c
Ad:=Ad(m 1 n 1 Tr(a[m]))+c
{
(5) }
End;
18/80

Begin
If Length(a)>Length(b)
Then Adun := Adun (b,a)
{ Cazul (1),
Else Adun := Ad (Length(a),Length(b),0)
End; {Adun }

m>n }
{ Initial Transportul = 0 }

Function Sp(a:Numar) : Numar;


{ Completeaza la stanga cu spatii }
Begin
If Length(a)<n
Then Sp:=Sp(' '+a)
Else Sp:=a
End;
Var
a, b : Numar;
Begin
Write (' Dati a : '); Readln (a) ;
) Readln ((b)) ;
Write ((' Dati b : ');
Writeln(Sp(a)+' + ');
{ Tipareste :
1234
+
}
}
Writeln(Sp(b));
{
123
Write (Sp(Adun (a,b)));
{
1357
}
Readln
End.
19/80

Definire simultan (Forward ) :


Function / Procedure S1 ( . . . ) ; Forward
Forward;;

{ Antetul lui S1 }

Function / Procedure S2 ( . . . ) ;
B i ... S1...
Begin
S1
E d
End;

{ Subprogramul S2 apeleaz S1 }

Function / Procedure S1 ( . . . );
Begin ... S2... End;

{ Subprogramul S1 apeleaz S2 }

Ce functie (procedur) se va scrie prima ?


Ex.. Pentru a compara dou numere (a<b, a>b, a=b) reprezentate prin irul
Ex
(caracterelor) cifrelor, vom utiliza trei funcii simultane (mutuale):
(mutuale):
a<b b>a,
b>a
a=b Not a<b i Not a>b,
a>b NrCif(
NrCif(a
a) > NrCif(
NrCif(b
b) sau
NrCif(a
NrCif(
a) = NrCif(
NrCif(b
b) Cat(
Cat(a
a)>Cat(
)>Cat(b
b) sau

{/10
{/
10}}.

Cat(a
Cat(
a)=Cat(
)=Cat(b
b) i Rest(a
Rest(a)>Rest(
)>Rest(b
b)
20/80

Program Comparare_Numere_Str_cifre_baza_10;
{ < , > , = , n<=10 }
Const n=10;
Type Numar = String[n];
Function MaiMare(a,b : Numar) : Boolean; Forward;
Function MaiMic (a,b : Numar) : Boolean;
Begin MaiMic:
MaiMic:=MaiMare(b
MaiMare(b,a)
a) End;
Function Egale (a,b : Numar) : Boolean;
Begin
Egale := Not MaiMic(a,b) And Not MaiMare(a,b) End;
Function MaiMare (a,b:Numar) : Boolean; Var m,n:Byte;
Begin
m:=Length(a); n:=Length(b);
MaiMare:=(m>n) Or
{ |A| > |B| }
(m=n) And (m>0) And
{ = }
(MaiMare(Copy(a 1 m 1) Copy(b 1 n 1)) Or
(MaiMare(Copy(a,1,m-1),Copy(b,1,n-1))
{ Cat(A) > Cat(B) }
(Egale (Copy(a,1,m-1),Copy(b,1,n-1)) And (a[m]>b[n])))
{ Am > Bn }
End;
Var
a,b : String;
Begin
Write (' Dati a : '); Readln (a) ;
Write (' Dati b : '); Readln (b) ;
If MaiMic (a,b) Then Write (' a < b ') Else
If MaiMare(a,b)
M iM ( b) Then
Th Write
W it (' a > b ') Else
El
If Egale (a,b) Then Write (' a = b ') Else
Write (' a ? b '); Readln
End.
21/80

1.2. Proceduri i funcii


ppredefinite
Citirea i scrierea datelor :
Nu exista instructiuni Apel Proceduri
Read ( <list_variabile>
<list variabile> )
Readln (a,b,c);
Readln (v);

// 1 2 3 xxx
// Simpla, Nu enum
enum,

Write ( <list_expresii> )
Writeln (a,b,c);
Writeln ('');
( )

// 1 2 3
//

Writeln (3.1415:5:2, 7.1:5:2, 9:3);// _3.14__7.10__9


Readln (a:5:2, b:5:2, k:3);

// _3.14__7.10__9
22/80

La definirea expresiilor se folosesc i funcii.


Tabelul urmtor conine cteva funcii predefinite (Pascal).
Functia
abs ( i )
abs ( x )
sqr ( i )
sqr ( x )
sqrt ( x )
int (x)
trunc (x)
round ( x )
frac ( x )
exp ( x )
ln ( x )
sin ( x )
cos ( x )
arctan ( x )
succ ( i )
pred ( i )
ord ( e )
chr ( i )
odd ( i )

Semnificatia
valoarea (ntreag) absolut a ntregului i
valoarea (real) absolut a realului x
ptratul ntregului i (dac i*i < Maxint) (valoare ntreag)
ptratul numrului real x
radical din x, x>=0
partea ntreag a numrului real x
ntregul obinut din numrul real x prin eliminarea prii fracionare
cel mai apropiat ntreg de numrul real x
valoarea x - int(x) , pentru x real
e la puterea x,
x x ntreg sau real
logaritm natural din x, x ntreg sau real>0
sinusul lui x, x reprezint msura n radiani a unui unghi
cosinusul lui x,
arctangenta din x,
succesorul valorii ordinale i
predecesorul valorii ordinale i
numrul de ordine al valorii lui e n tipul expresiei ordinale e
caracterul de ordin i n tipul Char
funcie logic cu valoarea True dac i este impar i False dac este par
23/80

Tipul ir_caractere (String ) :

Util.: ~ Array Of Char

Decl.: String

[ [m] ]

Lung. Max. = m <= 255

Operatori pentru String :


a)

Operaia de concatenare a dou iruri este notat cu + . De exemplu


Algoritmica, + Programare are valoarea Algoritmica, Programare.

b)

Operatorii relaionali permit compararea a dou iruri utiliznd ordinea


g
((utilizat n dicionare,

cri
de telefon, etc.)) :
lexicografic
= i <> pentru egalitatea respectiv neegalitatea a dou iruri ,
<, >, <=, >= pentru compararea lexicografic.

Ex. :
Alb < Albastru;
Ionescu < Popescu ; 0... < 9... < A... < Z... < a... < z....
24/80

Faciliti (4F & 4P) ale tipului String ( n plus fa de Array Of Char ) :
Valorile variabilelor i expresiilor de tip String pot fi citite respectiv tiprite, ex.:
Mesaj:=Numele autorului; Write (Dati +Mesaj+ : ); Readln (s);
- Length (S) (=Ord(S[0]) ) returneaz lungimea irului S (Length(mare)=4),
- Copy (S,p,l)
(S p l) returneaz subirul (lui S) de lungime l ncepnd din pozitia p
( Copy(Marinescu,2,4)=arin ),
- Concat (S1,S2,...,Sn) (=S1+S2+...+Sn)
( Concat(Con,Cat)=ConCat),
- Pos (x,S)
(x S) det.
det poz.
poz subirului x n irul S sau 0 dac irul S nu conine ca subir pe x
( Pos(in,Marinescu)=4 iar Pos(pop,Popescu)=0 ),
- Delete (s,p,l) terge din s ncepnd din poz. p , l caractere, ex.secventa :
s:=Ionescu;
s:=
Ionescu ; Delete (s,4,4);
(s 4 4); Write (s); va tipari Ion;
Ion ;
- Insert (x,S,p) insereaz irul x n irul S la poziia p. De ex.:
s:=Alg.Progr.; Insert( i ,s,5); Write (s); va tipari Alg. i Progr.;
- Str (e,S)
(e S) depune n S,
S irul cifrelor val.
val Expr.e
Expr e , care poate avea ataat un format
(:n:m ca i Write). Ex. : v:=5/2; Str (v:5:2,S); va depune n S irul 2.50.
- Val (S,v,Cr) examineaz irul S. Dac este corect atunci va depune n v valoarea iar
n Cr val. 0. Dac irul S conine caractere nepermise, atunci n v se depune
valoarea 0 iar n variabila Cr (de tip ntreg) poziia primului caracter nepermis.
Val (1234,v,Cr); are ca efect : v=1234 i Cr=0 , iar
Val (19d7,v,Cr); are ca efect : v=0 i Cr=3 ( pe poziia 3 se afl d).

25/80

Problema pe care o vom rezolva utiliznd tipul string este urmtoarea :


S se calculeze valoarea unei expresii aritmetice de forma : n1~n2[=] unde :
n1 2 sunt dou numere reale,
n1,2
reale ~ este un operator aritmetic (+,
(+ , *,
* ,
/ sau : ) iar
semnul egal la sfritul expresiei poate lipsi. Expresia (simpl, cu un singur
operator i fr paranteze) este dat sub forma unui ir de caractere, iar rezultatul se
va afia cu dou zecimale.
zecimale
De exemplu pentru 123+45 rezultatul este 168,00 , iar pentru 123.3:3=
rezultatul este 41,10 .
Problema o vom rezolva astfel :
e - reprezint expresia sub forma unui ir de caractere, iar r este rezultatul
(valoarea expresiei) dat tot sub forma unui ir de caractere n care se va nlocui
marca zecimal . cu , . Dac expresia nu se termina cu caracterul =, acesta va
fi adaugat irului introdus.
Se determin poziia operatorului (p). Inseamn c o=e[p] va fi caracterul ce va
desemna operaia ce urmeaz a fi facut. n1 este scris cu caracterele e1...ep-1 , deci
poate fi obtinut
bi
cu procedura
d
V l iar
Val,
i apoii se sterg primele
i l p caractere, ceea ce
nseamn c n expresia e mai ramane n2=. n continuare, se procedeaz analog,
extragnd pe n2, din irul rmas , mai puin ultimul caracter. Dup tiprirea
rezultatului (a irului r ) se va citi alt ir (alt expresie) pn cnd se va introduce
expresia vid (irul vid) adic se tasteaz doar Enter n momentul citirii expresiei.
26/80

Programul Pascal este urmtorul :


Program Valoarea_Expresiei; (* '123+22=' *) (* n1 o n2 = ? *) (* o {+,-,x,:,*,/} *)
Var e,r : String; o : Char;
n1, n2 : Real; p , er : Integer;
Begin
Repeat Write (' Dati expresia (n1 o n2 =) : '); Readln (e); If e>'' Then Begin
If Pos ('=',e)=0 Then e:=e+'=';
Val (e,n1,p); Val (Copy(e,1,p-1),n1,er);
{ p:=Poz(o) } {n1:=...}
o:=e[p];
o:
e[p];
Delete (e,1,p);
(e 1 p); Val (Copy(e
(Copy(e,1,Length(e)-1),n2,er);
1 Length(e)-1) n2 er);
Case o Of
'+' : Str (n1+n2:8:2,r);
'-' : Str (n1-n2:8:2,r);
' ' '*' : Str
'x','*'
S (n1*n2:8:2,r);
( 1* 2 8 2 )
'':','/'
' '/' : Str
S (n1/n2:8:2,r)
( 1/ 2 8 2 )
Else r:=' Operator necunoscut.'+o
End; p:=Pos('.',r); If p>0 Then r[p]:=',';
Writeln (r)
End
Until e=''
End.
27/80

Fiiere

3. Fiiere text
Fiiere Pascal.
Utilizarea fiierelor text.
Fiiere

cu tipp
Operaii cu fiiere
Fiiere fara tip binare

28/80

3.1 Fiiere text ~ Tipuri de acces


Fiierul
Fi i l poate fi considerat
id
o colecie
l i de
d date
d
stocate pe un suport extern (n
(
general magnetic) unde pot fi pstrate atta timp ct este necesar. Un fiier este
format dintr-o succesiune de elemente (nregistrri sau articole numerotate de la 0,
alctuite la rndul lor din cmpuri) avnd toate acelai tip, care constituie tipul de
baz al fiierului. Transferul informaiilor ntre memoria intern i cea extern
(fiier) se realizeaz la nivel de articol. Pentru aceasta, n memoria intern va trebui
s declaram o variabil avnd acelai tip cu tipul nregistrrilor fiierului iar prin
operaiile de intrare/ieire (Read/Write
Read/Write) se va realiza ctitirea din, respectiv scrierea
n, fiier.
Accesul la componentele unui
fiier poate fi secvenial sau
direct.
n acces secvenial,
articolele
sunt
prelucrate
(accesate) succesiv (unul dup
altul),
l l) ncepnd

d cu primul
i l pan la
l
ultimul (Art.0, Art.1,...,Art.n-1).

Art.:

Memoria intern
Write

Articol

0
1
2
3

Fis.

Read
29/80

Fiiere Pascal
Dac n cazul accesului secvenial ordinea de transfer a nregistrrilor este dat de
ordinea acestora n fiier, acessul direct permite transferul n orice ordine (aleator)
prin precizarea numrului de ordine din cadrul fiierului (0,1,...,n-1 , dac fiierul
are n articole).
n vederea prelucrrii, fiierul va trebui deschis iar la terminarea operaiilor
fiierul va trebui nchis. La deschiderea fiierului, indicatorul (capul de citirescriere)
i ) este poziionat
ii
pe prima
i
component.
Indicatorul
I di
l se deplaseaz
d l
automat cu
o poziie spre sfrit, la fiecare operaie de scriere sau citire din fiier.
Deschiderea unui fiier (pregatirea lui pentru lucru) se face n doua etape:
- n primul rnd va trebui s precizm ce fiier se deschide (se face asocierea ntre
variabila fiier i specificatorul de fiier, corespunzator fiierului dorit) utiliznd
procedura Assign (Variabila_Fiier,
(Variabila Fiier Specificator_Fiier)
Specificator
Specificator_Fiier).
Fiier). Acest asociere fiind
facut, de acum nainte vom utiliza doar Variabila_Fiier pentru a referi fiierul de
lucru (pe care o vom nota n continuare mai simplu cu F ).
- Deschiderea propriuzis se va efectua prin apelul procedurii Rewrite(F) sau
Reset(F) dup cum fiierul care va fi deschis urmeaz s se creeze sau s se
consulte .

30/80

Fiiere Pascal
Operaiile de intrare / ieire sunt:
Read(F,Art)

respectiv

Write(F,Art)
unde am notat prin Art variabila din memoria intern (declarat n program) n , sau
din care se face transferul din/n fiier.
Dup terminarea operaiilor de transfer, fiierul poate fi nchis prin:
Close(F)..
Close(F)
O functie util n programele care lucreaz cu fiiere este funcia boolean
Eof(F)
E
f(F)
care ne spune dac s-a ajuns la sfritul fiierului (dac a fost detectat marca de
sfrit de fiier).
n programele Pascal este posibil tergerea unui fiier apelnd procedura:
Erase(F).
Erase(F).
posibil schimbarea numelui unui fiier
n timpul
p execuiei

De asemenea,, este p
unui program. Aceast redenumire se poate realiza prin apelul:
Rename(F, Noul_Specificator_de_Fiier) .
31/80

3.2.. Proceduri i funcii predefinite pentru fiiere text


3.2
Coninutul unui fiier text poate fi neles ca un text dintr-o
dintr o carte,
carte organizat pe un
numr de linii compuse din caractere (rnduri de tip string). ntr-un fiier text
sfritul fiecrei linii este marcat prin dou caractere speciale CR (de la Carriage
Return) i LF (de la Line Feed).
Feed) Avantajul folosirii acestor fiiere const n faptul c
ele se pot vizualiza din Norton Commander sau Turbo Pascal i chiar pot fi
corectate folosind funcia de editare a acestora.
Declararea unui fiier text se realizeaz simplu prin scrierea cuvntului cheie Text.
De exemplu :
Var f, g : Text;
Text
Citirea datelor dintr-un fiier text se poate efectua prin apelul procedurii :
Read (F, List_Var_Intrare)
List_Var_Intrare); sau
((F,, List_Var_Intrare)
Intrare);
Readln(F,
Readln
transferul fcndu-se din fiierul F , n aceeai manier ca i de la tastaur.
Scrierea datelor ntr-un fiier text se poate efectua prin apelul procedurii :
Write(F
Write(F,List_Expresii_Ieire
Write(
F
F,List_Expresii_Ieire)
List Expresii Ieire)
Ieire); sau
Writeln(F
Writeln
(F List_Expr.
List_Expr._Ieire)
_Ieire);
scrierea fcndu-se n fiierul F ca i pe ecran.

32/80

Fiiere Text
Un prim exemplu l constituie o procedur care citete o matrice (dimensiunile i
valorile acesteia) dintr-un fiier text.
Considerm c aceste date sunt organizate n fiierul Matrice.Txt astfel :
- primul rnd conine numrul de linii i numrul de coloane (m i n),
- urmtoarele m rnduri conin valorile corespunzatoare fiecrei linii ale matricei.
Procedure Cit_Mat (Var A :matrice; Var m,n : Integer);
Var i, j : Integer; F : Text;
Begin
Assign (F,Matrice.Txt); Reset (F);
Readln (F,m,n);
For i:=1 To m Do
For j:= 1 To n Do
Read (F,A[i,j]);
Close (F)
End;

34
1234
5678
9012
33/80

Fiiere Text
Urmtorul exemplu este un program Pascal care traduce un text aflat ntr
ntr-un
un fiier
conform unui dicionar (care se afl stocat ntr-un fiier text avnd numele
Dictio.Txt).
Dicionarul este compus dintr-un ir de perechi de cuvinte de forma (St,Dr)
(St Dr) i se
construiete citind cte un rnd de forma Stnga=Dreapta din fiierul text.
De exemplu,
p , coninutul

fiierului

Dictio.Txt,, tiprit
p
n
continuare, poate traduce un Program Pascal in
Pseudocod.
Pseudocod
Pentru a realiza
P
li o traducere,
d
se citeste
i
cte
un rnd
d din
di
fiierul iniial, se traduce conform dicionarului, dup care
se depune (rndul tradus) n fiierul final (tradus).
Traducerea unui rnd se execut astfel: se ia fiecare
cuvnt din dicionar (aflat n partea stang) i se verific
dac acesta se afl n rndul curent. Dac da, atunci se va
nlocui n rnd cuvntul gsit cu perechea acestuia (partea
dreapt din dictionar).

Program=Algoritmul
og a
lgo it ul
Readln=Date
Read=Date
Writeln=Rezultate
Writeln
Rezultate
Write=Rezultate
For=Pentru
Do=Executa
Do
Executa
Repeat=Repeta
Until=Pana_Cand
While=Cat
While
Cat_Timp
Timp
End.=Sfarsit.
...
34/80

Fiiere Text

Programul Pascal este urmtorul :


Program
g
Traducere_Text;;
Const Mc = 100;
Type Sc = String[10];
Rd = Record St, Dr : Sc End;
{ (St,Dr) }
Var
Fis, Tra, Dic : Text; Numei,Numef : String[20];
Di t : Record
Dict
R
d Nrc
N : Byte;
B t
{ Numarul
N
l de
d cuvinte
i t din
di dictionar
di ti
}
Cuv : Array [1..Mc] Of Rd
End;
Rnd : String;{
g { un rnd din dictionar de forma
f
St = Dr }
p,i : Integer; { p memoreaza pozitia semnului = n Rnd }
Begin
{ ( delimiteaza partea stanga de partea drepta) }
Assign (Dic,'Dictio.Txt'); Reset (Dic);
{ Deschide Dictionarul }
With Dict Do Begin
{ Constr.
Constr Dictionarul n memorie n variabila Dict
Dict.}}
Nrc:=0;
While Not Eof(Dic) Do Begin
Readln (Dic,Rnd); p:=Pos('=',Rnd);
{ Cuv[Nrc] Dict }
Nrc:=Nrc+1;
With Cuv[Nrc] Do Begin
St:=Copy(Rnd,1,p-1);
{ St := ... p }
Dr:=Copy(Rnd
Dr:
Copy(Rnd,p+1,Length(Rnd)
p+1 Length(Rnd)-p)
p) { Dr :=
:
p ... }
End
End
End;

35/80

Fiiere Text
Write (' Numele fiierului de tradus : '); Readln (Numei);
{ Fi. de tradus }
W
Write
(' Numele
N
l fiierului
f
l rezultat
l
: ');
') Readln
R dl (Numef);
(N
f) { Fi.
F tradus
d }
Assign(Fis, Numei); Reset (Fis);
{ Deschide fiierele }
Assign(Tra, Numef); ReWrite(Tra);
While Not Eof(Fis) Do Begin
Readln (Fis,Rnd);
With Dict Do { Traduce Rnd }
For i:=1 To Nrc Do With Cuv[i] Do
Repeat
p := Pos (St,Rnd);
If p>0 Then Begin
{ Exista cuvantul St n Rnd ? }
Delete (Rnd,p,Length(St));
{ Inlocuieste St cu Dr }
Insert (Dr,Rnd,p)
End
Until p = 0;
Writeln(Tra,Rnd)
{ Scrie Rnd-ul tradus }
End;
Close (Fis);
Cl
(F ) Close
Cl
(Tra)
(T )
End.

{ Inchide
I h d fiierele
f
l }

36/80

3.3.. Operaii cu fiiere


3.3
Principalele operaii asupra fiierelor sunt :
Creere (generarea unui fiier, care se execut o singur dat, cnd ia fiin
fiierul),
Actualizare (corectarea fiierului,
fiierului punerea la punct n cazul n care datele nu
sunt corecte sau nu mai sunt actuale), i
Listare (etapa final de obinere a rezulatatelor, a situaiilor finale).
Actualizarea fiierelor poate fi efectuat secvenial (articol dup articol) sau direct
(aleator, preciznd numrul de ordine al unui articol). n operaia de actualizare
se poate efectua :
Adugarea de noi articole,
Modificarea unor articole (prin modificri de cmpuri ale acestora), sau
Stergerea
St
d articole.
de
ti l
Operaiile descrise anterior vor fi exemplificate n cele ce urmeaz prin programe
P
Pascal.
l
37/80

Operaii cu fiiere

n exemplul
e empl l urmtor
rmtor se dorete creerea fiierului
fiier l i Grupa111.Dat,
Gr pa111 Dat cu
c articole de
forma:
Nr_Leg

Nume

Medie

Word

String[25]

Real

Pentru a crea acest fiier, se citete de la tastatur cte un articol (care conine
informaiile despre un student) apoi acesta se scrie n fiier.

.........
.........
.........

Creere

Grupa111 Dat
Grupa111.Dat

38/80

Operaii cu fiiere

Urmtorul program realizeaz listarea (tiprirea articolelor) fiierului


Grupa111.Dat pe ecran.
Pentru a tipri acest fiier, se citete din acesta
cte un articol, apoi acesta se afieaz pe ecran :

Listare

... .......... ....


... .......... ....
... .......... ....

Grupa111.Dat

Urmtoarele exemple sunt dedicate actualizrii fiierului Grupa111.Dat. Pentru


aceasta, se citesc de la tastatur datele (care conin informaiile necesare
actualizrii) conform crora se corecteaz fiierul.
fiierul
...............
...............
.................

Actualizare
ctualiza e
Grupa111.Dat
39/80

Operaii cu fiiere

Att pentru tergerea de articole dintr-un fiier ct i pentru adugarea de noi


articole este necasar utilizarea unui fiier temporar, aa cum se poate vedea n
figura urmtoare:
...............
...............
.................

Grupa111.Dat

Stergere /
Adugare

Grupa111.Tmp

Dac se dorete
tergerea
g
aleatoare a unor articole din fiier,

numrul curent al
acestor articole va fi introdus de la tastatur. Aceste articole vor fi omise la
copierea articolelor din fiierul iniial (Grupa111.Dat) n fiierul temporar
(
(Grupa111.Tmp).
p
p)
Pentru ca fiierul actualizat s poarte acelai nume iniial, se va proceda astfel:
fiierul iniial se terge (Erase(Fis_Vechi)) iar fiierul final se va redenumi
(Rename(Fis_Temporar,Nume_Fiier)) aa cum se poate vedea n exemplul
urmtor.
40/80

Operaii cu fiiere

Programul pentru adugarea de noi articole n fiier este prezentat n continuare


i lucreaz n felul urmtor : citete de la tastatur cte un articol pe care l
adaug naintea articolului cu numrul de ordine Nr_Crt (introdus tot de la
tastatur).
...............
...............
.................

Grupa111.Dat

Adugare

Grupa111.Tmp

Toate articolele pn la cel precizat se copiaz din fiierul iniial n cel temporar,
apoi se scrie noul articol (citit anterior). Se citete din nou alt articol care va fi
adugat i aa mai departe pn cnd nu mai sunt articole de adugat. Restul
articolelor care au mai rmas n fiierul iniial se vor copia i ele n fiierul final.
Aa cum s-a procedat i la Stergere, se vor depune datele obinute n fiierul
iniial (apelnd Erase
Erase... i Rename
Rename...) .
41/80

1.3. Funcii
O funcie este format dintr-un antet i un bloc (corp
corp). Ea poate fi
apelat dac a fost definit n ntregime sau doar antetul su.
Antetul unei funcii are urmtorul format:
Tip Nume (List_parametri_formali)
List_parametri_formali)
unde:
d
Tip este tipul valorilor funciei (codomeniul);
Nume este un identificator ((liter urmat eventual de litere sau cifre);
);
List_parametri_formali conine parametrii formali separai prin ,,.
Exemplu
Exemplu:
p :
int Min (int a, int b)
{
if (a<b) return a; else return b; }
Obs. Prototipul unei funcii este antetul acesteia urmat de ; .
42/80

Corpul unei funcii are urmtoarea structur:


{
D l
Declaraii
ii
Instruciuni
}
Exemple::
Exemple
int Cmmdc (int a, int b)
//
{
if (b= =0) return a;
else return Cmmdc(b,a % b); //
}
int cmmdc (int a, int b)
//
{ int rest;
do {rest=a%b;
a=b;
b=rest; }
while
hil (rest!=0);
( t! 0)
// restt 00;
return a;
}

Cmmdc(a,b)
Cmmdc(b,a Mod b);
cmmdc(a,b)

sau while
hil (rest)
( t) ;
43/80

2.3. Operaii de intrare


intrare//ieire
22.3.1.
31
2.3.2.
2.3.3.
2.3.2.3.
2.3.5.
22.3.6.
36
2.3.7.
2.3.8.
239
2.3.9.

Funcia
F
i Printf
P i tf
Funcia Scanf
Funcia PutChar
Funcia GetChar
Funcia GetChe
Funcia GetCh
Funcia KbHit
Funciile PutS, GetS
St
Stream-uri
i

44/80

2.3. Operaii de intrare


intrare//ieire
n limbajul C nu exist instruciuni de intrare
intrare//ieire,
ieire
aceste operaii ralizndu-se prin funcii aflate n bibliotecile
standard.
Implicit, unui program i se ataeaz fiierele:

stdin (intrare standard),


stdout (ieire standard),
stderr (ieire standard pentru erori),
stprn (ieire pentru imprimant),
stdoux (intrare/ieire serial).
serial)
45/80

2.3. Operaii de intrare/


intrare/ieire

2.3.1.. Funcia Printf


2.3.1
Aceast funcie realizeaz afiarea dup un ablon, avnd urmtorul format:

int printf (Control [, List_Expresii]);


unde Control este ablonul (formatul) scris sub forma unui ir de caractere
care conine mesaje i specificatori de format corespunztori valorile expresiilor
din list. Un specificator de format se descrie astfel :
% [[
] [m
[m[[..n] ] [l
[l ] [ f ] .
unde:

[] - determin alinierea la stnga, implicit fiind la dreapta,

[m
m] - precizeaz lungimea cmpului,

[..n] - precizeaz lungimea prii zecimale, respectiv numrul de caractere,

[ l ] - conversia se va efectua din format intern long,


long

[ f ] - determin tipul conversiei.


46/80

2.3. Operaii de intrare/


intrare/ieire

2.3.1
2.3.1.. Funcia Printf

Tipul conversiei [ff ] este precizat prin unul din urmtoarele caractere:
d - int
i zecimal
i l extern,
t
o - int octal extern,
x - int hexa extern (0...9,a...f),
X - int Hexa extern (0...9,A...F),
u - unsigned zecimal extern (fara semn),
c - binar intern caracter (char),
s - string (sir de coduri ASCII terminat cu \0=NUL) sir de caractere,
f - float sau double zecimal extern [m[.n] ], implicit n=6,
e - float
fl t sau double
d bl zecimal
i l extern
t
f
forma
exponentiala
ti l (b*10e),
)
E - float sau double zecimal extern forma exponentiala (b*10E),
g - se alege dintre variantele f sau e reprezentarea minima,
G - se alege dintre variantele f sau E reprezentarea minima.
47/80

2.3. Operaii de intrare/


intrare/ieire

2.3.1
2.3.1.. Funcia
Printff
Funcia

printf

returneaz numrul de octei afiai dac operaia a decurs

corect, iar n caz contrar -1 (EOF):




if (EOF == printf (Control , Lista_Expresii))

... eroare ... ;

Exemple:
short Zi=1; char Luna[]="Ianuarie"; unsigned An=2003;
float Ina=1.8;
pprintf("
( Zi:%
%d, Luna:%
%3.3s.,, An:%
%u \n",Zi,Luna,An
,Zi,Luna,An);
);
printf(" Inaltime(m):%
%2.3.2f \n",Ina
Ina);

// Zi:1,, Luna:Ian.,, An:2003


// Inaltime(m):1.80

48/80

2.3. Operaii de intrare/


intrare/ieire

2.3.2.. Funcia Scanf


2.3.2
Aceasta functie realizeaza citirea datelor dupa un sablon, avnd urmatorul
f
format:
t
int scanf (Control , List
Lista
a_Adrese_de_Variabile );
.

unde Control este sablonul ((formatul)) scris sub forma unui sir de caractere
care contine eventual texte (obligatorii la intrare) si specificatori de format
corespunzatori tipurilor variabilelor din lista. Specificatorii de format sunt
asemanatori celor p
prezentati la functia p
printf,
f, realiznd nsa conversiile inverse:
%

[*] [m] [l] [ f ] ,

unde:

[*] - un caracter optional,


[m] - precizeaza lungimea maxima a cmpului,
[ l ] - conversia se va efectua din format intern long,
[ f ] - determina tipul conversiei.
49/80

2.3. Operaii de intrare/


intrare/ieire

2.3.2
2.3.2.. Funcia Scanf

Tipul conversiei [ff ] este precizat prin unul din urmtoarele caractere:

d - int zecimal extern,

o
x
X
u
c
s
f

- int octal extern,


- int hexa extern (0...9,a...f),
- int Hexa extern (0...9,A...F),
- unsigned zecimal extern (fara semn),
- binar intern caracter (char),
- string
t i sir
i de
d caractere
t terminat
t
i t la
l spatiu
ti sau dimensiunea
di
i
m,
- float flotant extern.

50/80

2.3. Operaii de intrare/


intrare/ieire

2.3.2
2.3.2.. Funcia Scanf
Adresele variabilelor de intrare sunt date prin operatorul de adrese
naintea identificatorului fiecarei variabile (simple!):

[&
&] Variabila

& plasat

(nu
nu este necesar pentru tablouri).

Exemplu:
p
short Zi; char Luna[13]; unsigned An; float Ina;
scanf(" %d %s %u %f ", &Zi, Luna, &An, &Ina);

// 1 Ianuarie 2003 1.80

Functia scanf returneaza numarul de cmpuri citite corect. Sfrsitul de fisier


(Ctrl/Z) poate fi verificat prin valoarea returnata EOF:
if (EOF == scanf (Control , Lista_Expresii)) ... Sfrsit ... ;
Exemplu:
if (EOF==scanf("
(EOF
f(" %d %s
% %u
% %f",
%f" &Zi,
Zi Luna,
L
&An,
A &Ina))
I )) printf("Ctrl/Z");
i tf("Ct l/Z")
else {

printf(" Zi:%d, Luna:%3.3s., An:%u \n",Zi,Luna,An); printf(" Inaltime(m):%2.3.2f \n",Ina);

}
51/80

2.3. Operaii de intrare/


intrare/ieire

2.3.3.. Funcia PutChar


2.3.3
Aceast funcie realizeaz tiprirea unui caracter al crui cod ASCII este
precizat printr-o expresie :
putchar
t h (Expresie);
(E
i )

2 3 2 3 Funcia GetChar
2.3.2.3.
Aceasta, returneaz codul ASCII al caracterului citit (pentru Ctrl/Z EOF=-1):
getchar ( );
Exemplu:
char c;
do putchar (((c=getchar())>'Z')? c^' ' : c);
// Litere mici LITERE MARI
while (c!='.');
Litere mici in Litere MARI !
getchar
LITERE MICI IN LITERE MARI !
putchar
p

Se termina la . (Punct)
SE TERMINA LA .

getchar
putchar

52/80

2.3. Operaii de intrare/


intrare/ieire

2.3.5.. Funcia GetChe


2.3.5
Funcia returneaz codul caracterului citit direct i l afieaz (n ecou):
int getche ( );
Exemplu:
do putchar (((c=getche())>'Z')? c^' ' : c); while (c!='.');

// se termina cu .

LLiItTeErReE mMiIcCiI iInN LLiItTeErReE MMAARRII


MMAARRII....

2.3.6.. Funcia GetCh


2.3.6
Funcia returneaz codul caracterului citit direct fr a mai fi afiat:
int getch ( );
Exemplu:

int ReadKey()
{
int car=getch();
if (car) return car;
else return getch(); // a fost apsat o tast functional (0,cod ASCII)
}
53/80

2.3. Operaii de intrare/


intrare/ieire

2.3.7.. Funcia KbHit


2.3.7
Aceast funcie returneaz starea tastaturii (a fost apsat o tast ?):
int kbhit ( );
Exemplu:
# include <conio.h>
<conio h>
# include <stdlib.h>
# include <stdio.h>
# include <iostream.h>
void main ()
{ char c[8],i=-1;
cout << " Password : ";
do {while (!kbhit
kbhit()) { putchar(random(27)+'A'); putchar('\b'); } // kbhit
kbhit() K
kbhit()=KeyPressed
KeyPressed
P
d
if ((c[++i]=getch())!='\r') putchar('*'); else putchar(' '); }
while (c[i]!='\r'); c[i]=0;
cout << " Password = " << c;
getch();
}
54/80

2.3. Operaii de intrare/


intrare/ieire

2.3.8..
2.3.8

Funciile PutS
PutS,, GetS

Acestea citesc (inclusiv spaiile i taburile pn la Enter


Enter), respectiv tipresc un
string:
g
char *gets (char *s);
int puts (const char *s); .
Exemplu:
Dati o propozitie ... <Cr>
#include <stdio.h>
I/E pt
pt.. str
str..
#include <conio.h>
#include <iomanip.h>
20 49 2f 45 9 70 74 2e 20 73 74 72 2e
#include <iostream.h>
void main ()
{
clrscr();
l ()
puts(" Dati o propozitie ... <Cr> ");
char s[100]; gets (s);
int ii=0;
0; do cout <<hex<<setw(3)<<int(s[i]); while (s[++i]);
getche();
}
55/80

2.3. Operaii de intrare/


intrare/ieire

2.3.9..
2.3.9

Stream--uri
Stream

Dispozitivelor standard de intrare-iesire li s-au atasat streamurile (flux de


date) standard cin (pentru stdin) si respectiv cout (pentru stdout),
stdout) care permit
efectuarea operatiilor de intrare-iesire aplicnd operatorul >> streamului cin,
respectiv << streamului cout. Ierarhiile necesare sunt n fisierul iostream.h .
Exemplu:
#include <iostream.h>
#i l d <stdio
#include
<stdio.
tdi .h>
h ;
h>;
#include <conio
<conio.
.h>;
h>;

void main (void)


{ int i;
cout
cout
char s[10]; cout
cout
}

<<
<<
<<
<<

"
"
"
"

Dati
Val.
Dati
Sir.

i
i
s
s

:
=
:
=

";
; cin >> i;
" << i+1 << endl; // endl=<Cr>
"; cin >> s;
" << s << endl;
getch();

56/80

2.4. Apelul
p
unei funcii

IInstruciunea
t i
d apell a uneii funcii
de
f ii este
t un caz particular
ti l all instruciunii
i t i ii
expresie:

Nume_funcie (List_parametri_actuali);
O funcie poate fi apelat i n cadrul unei expresii dintr-o instruciune:

... Nume_funcie (List_parametri_ actuali) ... ;

57/80

2.4.

Apelul unei funcii

O funcie poate fi utilizat doar dac a fost definit, sau cel puin a fost
declarat prototipul ( antet ; ) ei ntr-una
ntr una din urmtoarele moduri:

a)) Tip_
Ti funcie
f
i Nume_
N
f
funcie
i (Lista_parametrilor_formali)
(Li
(Lista_parametrilor_formali);
il f
li);
b) Tip_funcie Nume_funcie (Lista_tipurilor_parametrilor_formali)
(Lista_tipurilor_parametrilor_formali);;
c)) Tip_
Ti funcie
f i Nume_
N
f i (void)
funcie
((void);
id); // nu suntt parametri
t i formali
f
li
d) Tip_ funcie Nume_ funcie ( );

// nu se fac verificrile de tip

58/80

2.4.

Apelul unei funcii

Apelul implicit pentru variabile simple (de baz) este prin valoare
valoare, iar pentru
tablouri prin referin.
referin Apelul prin referin se obine prin intermediul
variabilelor
i bil l de
d tip
i pointer sau a operatorului
l i de
d adres
d &.
Parametri
a amet i de int
intrare
ae

Parametri de iesire

F ti
Functie

Parametri de intrare Expresii

Parametri de iesire Variabile

a, b

s=a+b

2, x*y

s=22+x*y
s=

void suma (int a, int b, int& s)


{
s=a+b;;
s=a+b
}

{
}

suma (2, x*y,


x*y s)
s);;

59/80

2.4.

Apelul unei funcii

Revenirea dintr-o funcie se poate realiza fie prin instruciunea return


return, fie
automat dup ultima instruciune a funciei
(situaie
situaie n care nu se returneaz nicio valoare
valoare):

return [ exppresie ] ;
fiind returnat valoarea expresiei (dac
dac exist
exist).

Citeste

x+y

void citeste (int& a)


{
cin >> a;
}

int citeste (void )


{ int a;
cin >> a; return a;
}

Tipareste

void tipareste (int a)


{
cout << a;
}
60/80

2.4.

Apelul unei funcii

Exemplul 1:
#include <graphics.h> #include <math.h>

int u1,v1, u2,v2;


float a, b, c, d ;
int u (float x) { return ((x-a)/(b-a)*(u2-u1)+u1); }
i t v (float
int
(fl t y)) { return
t
(( d)/( d)*( 2 1)+ 1) }
((y-d)/(c-d)*(v2-v1)+v1);
void InitGraf(void)
{ int Gd = DETECT, Gm; initgraph(&Gd, &Gm, "c:\\Bc\\Bgi"); }
void ViewPort(int x1,int y1,int x2,int y2)
{u1=x1; v1=y1;
u2=x2; v2=y2; /*rectangle(u1,v1,u2,v2);*/
/*rectangle(u1 v1 u2 v2);*/ }
void Window(float x1,float y1,float x2,float y2)
{ a=x1; d=y1; b=x2; c=y2; }
void Rectangle(float x1,float y1,float x2,float y2) { rectangle(u(x1),v(y1),u(x2),v(y2)); }
void Bar(float x1,float
x1 float y1,float
y1 float x2,float
x2 float y2)
{ bar(u(x1),v(y1),u(x2),v(y2));
bar(u(x1) v(y1) u(x2) v(y2)); }
void Linie(float x1,float y1,float x2,float y2)
{ line(u(x1),v(y1),u(x2),v(y2)); }
void Muta(float x,float y)
{ moveto(u(x),v(y)); }
g(
x,float
,
y)
{ lineto(u(x),v(y));
( ( ), (y)); }
void Trag(float
void Rot(float &x,float &y, float x0, float y0, float Alfa) {
float xp;
xp=(x-x0)*cos(Alfa)-(y-y0)*sin(Alfa)+x0;
y =(x-x0)*sin(Alfa)+(y-y0)*cos(Alfa)+y0;
x = xp;
}
61/80

2.4.

Apelul unei funcii

E
Exemplul
l l 2:
2
#include <iostream.h>;
#include <conio.h>;
int Sf (int& f, int k)
{ int p=0;
while (!(f%k)) { f/=k; p++; }
return p;
}
main () {
int n;

clrscr();
int f2=0; int Uc=1;

cout << " n : "; cin >> n;


for ((int i=2; i<=n; i++))

{ int f=i;

f2+=Sf(f,2); f2-=Sf(f,5); Uc=Uc*f%10; }


cout << " Uc= " << Uc*((f2&=3,int(f2?f2*1.4:3))<<1)%10;
getch();
g
();
}
62/80

2.4.

Exemplul 3:

Apelul unei funcii

// Calc. AB, AB \\
#include <iostream.h>;

#include <conio.h>;

int Card(int A[]) { return A[0]; }


int Apart (int x, int A[])
{ for
f (int
(i t i=1;
i 1 i<=Card(A);
i< C d(A) i++) if (x==A[i])
(
A[i]) return
t
1 return
1;
t
0 }
0;
void n (int A[], int B[], int C[])
{ C[0]=0; for (int i=1; i<=Card(A); i++) if (Apart(A[i],B)) C[++C[0]]=A[i]; }
[], int B[],
[], int C[])
[])
void u ((int A[],
{ int i; for (i=0; i<=Card(B); i++) C[i]=B[i];
for (i=1; i<=Card(A); i++) if (!Apart(A[i],B)) C[++C[0]]=A[i]; }
void Tip (char *Mult, int A[])
{ int i; cout << Mult << '{' ;
for (i=1; i<=Card(A); i++) cout << A[i] << ","; cout << "\b}" << endl; }
void main (void)
{
clrscr();
int A[]={5, 1,3,5,7,9}; Tip (" A : ",A);
int B []={5, 1,2,3,4,5}; Tip (" B : ",B);
int Au
uB[10]; u (A,B,AuB); Tip (" AuB = ",AuB);
int An
nB[10]; n (A,B,AnB); Tip (" AnB = ",AnB);
getche();
}
63/80

2.4.1..
2.4.1

Operatorul
p
de adres (&)

Acest operator (&


&) se poate utiliza i pentru a defini un tip referin printr-o
declaraie de forma tip & (asemntor cu o construcie de forma tip *, pentru
pointer).
Cu ajutorul
j
acestui operator
p
putem:
p

redenumi o variabil,
realiza un apel prin referin,
s declarm
d l o variabil
i bil de
d referin
f i astfel:
tf l

tip & parametru_formal


f
l
ti & nume_var_reff ;
tip

// par. ref.
f (adres)
( d )
// var. de
d tip
ti referin
f i
64/80

Exemplul 4:

2.4.1.. Operatorul de adres (&)


2.4.1
// Apel prin Referin

#include <iostream.h>;
void
id suma (int
(i t x, int
i t y, int
i t * z)) { *z
* = ++x * ++y; }

// x,y z

void Suma (int x,i nt y, int &z) { z = ++x * ++y; }

// x,y z

void main (void)


{
int x,y, z;
cout << " Dati
D x,y : ";
" cin >> x >> y;
suma(x,y,&z);
cout << "(x+1)*(y+1)=" << z << endl;
Suma(x,y, z);
cout << "(x+1)*(y+1)=" << z << endl;

// mai simplu!

65/80

2.5. Functii standard


Macrouri de clasificare (ctype
ctype..h):
int isascii (int car)
car);;

car [0,127]
127] ?

int isalpha (int car)


car);;

car este codul unui caracter alfanumeric ?

int isalnum (int car)


car);;

car este codul unei litere ?

int isupper (int car)


car);;

car este codul unei litere mari ?

int islower (int car)


car);;

car este codul unei litere mici ?

int isdigit (int car)


car);;

car este codul unei cifre zecimale ?

int isxdigit (int car)


car);;

car este codul unei cifre hexa ?

int isgraph (int car)


car);;

car este codul unui caracter afi


afissabil ?

int isprint (int car)


car);;

car este codul unui caracter imprimabil ?

int isspace (int car)


car);;

car este spa


spattiu
iu,, tab,
tab Cr,
Cr Lf,
Lf Vt sau Np ?

66/80

Macrouri de transformare a simbolurilor (ctype


ctype..h):
int toascii
toascii((int car)
car);;

car [0,127]
127] (returneaz
(returneaztt ultimii 7 bi
bitti)

int toupper (int car)


car);;

car liter
literaa mare (transforma din l n L)

int tolower (int car)


car);;

car liter
literaa mica (transforma din L n l)

Conversii (stdlib
stdlib..h):
Format intern Format (zecimal)
zecimal) extern
int

atoi((const char *ptr


atoi
ptr));

binar (int) zecimal extern

long atol
atol((const char *ptr
ptr));

binar (long) zecimal extern

double atof
atof((const char *ptr)
*ptr);;

flotant (dubla precizie


precizie)) zecimal extern

Format extern Format intern


char *itoa (int v,
v,char
char *s, int b)
b);;

s vb (val
(val.. v de tip int,
int, scris
scrisaa n baza b)

char *ltoa (long v,


v,char
char *s, int b)
b);; s vb (val
(val.. v de tip long scris
scrisaa n baza b)
67/80

Prelucrarea sirurilor de caractere (String


String..h):
char * str
str[[n]cpy

(char *destinatie, const char *sursa [, unsigned n]) ;

char * str
str[[n]cat (char *destina
destinattie, const char *sursa [, unsigned n]) ;
int

str[[n][
str
][ii]cmp (char *sir1, const char *sir2 [, unsigned n]) ;

unsigned

strlen (char *sir) ;

char**
char

strrev (char *sir) ;

char**
char

strstr (const char *sir, const char *subsir) ;

char**
char

strtok (char *sir, const char *sub


subssir) ;

char**
char

strchr (const char *sir, int car) ;

char**
char

strset (char *sir, int car) ;


68/80

Functtii de calcul (math


Func
math..h):
Prototip

Semnif.

double sin (double x);

sin(x)

double logg (double x);

ln(x)
( )

double cos (double x);

cos(x)

double log
log10
10 (double x);

lg(x)

double asin (double x);

Arcsin(x)

double acos (double x);

Arccos(x)

double atan (double x);

arctg(x)

double sinh (double x);

sh(x)

double cosh (double x);

ch(x)

double tanh (double x);

th(x)
th
(x)

double sqrt (double x);

double atan
atan22 (double y,double x);

double exp (double x);

ex

double pow (double x,double y);

xy

double cabs (struct complex z);

|z |

double ceil (double x);

[x]

double floor (double x);

trunc((x)
trunc

double fabs (double x);

|x|

int

|x|

long labs (long x); *

|x|

abs (int x);

double poly (double


d bl x,int
x int n,
n double
d bl a[])
[]);;

arctg(y/x)

P(x)

69/80

Functtii pentru controlul proceselor (process


Func
process..h):
void abort (void
void));

termina
termin
a un program la eroare

void exit (int cod_retur)


cod_retur);

termina
termin
a un program cu un cod de retur

int system (const char *comand


*comanda
comanda
comand
a );

executa
execut
a o c-da si ret
ret.. cod_retur
cod retur (0=Ok
=Ok)
Ok)).
Ok

Functtii pentru timp (dos


Func
dos..h):
struct date
int
int
int
}

{
da_year
da_year;
;
da_day
da_day;
;
da_mon
da_mon;
;

struct time {
unsigned
unsigned
unsigned
unsigned

char
char
char
char

ti_min
ti_min;
;
ti_hour;
ti_hour
;
ti_hund
ti_hund;
;
ti_sec
ti_sec;
;

Citesste Data curenta


Cite
curenta :

void getdate (struct date *Data


*Data));

Modifica
Modific
a Data curenta
curenta :

void setdate (const struct date *Data


*Data));

Ci ate Ora
Citea
Cite
O Exact
E
Exacta
a:

void
id gettime
i (struct time
i *OraExact
*O E
*OraExacta
a );

Modifica
Modific
a Ora Exacta
Exacta :

void settime (const struct time *OraExact


OraExacta
a );

70/80

Ecranul n mod grafic (graphics


graphics..h):
void far initgraph ( int far *graphdriver, int far *graphmode, char far *path) ;
void

closegraph (void
void)) ;

void far setbkcolor (int culf ) ;

int far getbkcolor (void ) ;

void far setcolor (int culs ) ;

int far getcolor (void ) ;

Numa
Num
ar de pixeli ( Oriz
Oriz../Vert
/Vert..)

getmaxx ()
();; getmaxy ()
();;

Coordonatele LPR (Ult.


(Ult. Pct Ref.
Ref.)

getx ()
();; gety ()
();;

Mutaa LPR (Abs


Mut
(Abs../Rel
/Rel..)

moveto (x,y); moverel (dx


dx,,dy
dy));

Traseazaa segment din LPR


Traseaz

lineto (x,y); linerel (dx


dx,,dy
dy));

Traseaza segment

line (x1,y1, x2,y2);

Deseneaza dreptunghi

rectangle (x1,y1, x2,y2);

Deseneaza cerc

circle (x,y,r
x,y,r));

Scrie mesaj [ din LPR ]

outtext[[xy
outtext
xy]] ([
([x
x,y,] mesaj
mesaj));

Pagina activa / Pagina vizuala

setactivepage (pag
pag)); setvisualpage (pag
pag));
71/80

3 3 Utilizarea fisierelor
3.3.

Prelucrarea fisierelor se poate efectua la doua nivele:

N
Nivelul inferior
f
- face apel
p direct la sistemul de operare;
p
;
Nivelul superior - utilizeaza proceduri speciale
pentru operatii de intrare/iesire.

72/80

a) Nivelul inferior
Deschiderea unui fisier (Open/Creat) :

int open ( const char * cale


cale, int acces ) ;
unde:

cale - este specificatorul de fisier,


acces - poate fi o combinatie (operatorul |)
| ) a urmatoarelor valori:
O_RDONLY, O_WRONLY sau O_CREAT (scriere - creare),
O_RDWR (citire/scriere), O_APPEND, O_BINARY, O_TEXT .
...
int Lun;
Lun = open (Fisier.Dat,O_RDONLY);
...
73/80

Citirea dintr-un fisier (Read) :

int read ( int Lun, void *buffer, unsigned lung ) ;


Scrierea ntr-un fisier (Write) :

int write ( int Lun, void *buffer, unsigned lung ) ;


Pozitionarea ntr-un fisier (LSeek) :

long lseek ( int Lun, long depl., int orig.) ; // o=0,1,2


nchiderea fis. (Close) :

int close ( int Lun) ;

Stergerea fis. (UnLink) : int unlink (const char * cale) ;


74/80

// Creare \\
#include <io.h>
#include <fcntl.h>
<fcntl h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
iostream.h
void main (void)
{
int Lun;
clrscr();
Lun=open("Fis.Txt",O_CREAT|O_TEXT);
if (Lun!=-1)
{
cout << "Open ..." << endl;
write(Lun,"Primul...\n",10);
write(Lun,"Al
rite(L n "Al Doilea\n",10);
Doilea\n" 10);
}
else cout << " Open Incorect ! ";
close(Lun);
getchar();
}
75/80

// Citire \\
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
<stdio h>
#include <conio.h>
#include <iostream.h>
void main (void)
{
int Lun;
char Rand[10];
textmode(1); textbackground(BLUE); textcolor(WHITE); clrscr();
Lun=open("Fis.Txt",O_TEXT);
if (Lun!=-1) { read(Lun,Rand,10); cout << Rand;
read(Lun,Rand,10); cout << Rand; }
else cout << " Open Incorect ! ";
close(Lun);
getchar();
t h ()
}
76/80

b) Nivelul superior
Deschiderea unui fisier (FOpen ) :

FILE * fopen ( const char * cale, const char * mod ) ;


unde:

mod - poate fi r pentru citire, w - scriere, a - adaugare,


r+
r+ - modificare (citire/scriere)
(citire/scriere), rb
rb - citire binara,
binara
wb - scriere binara, sau r+b - citire/scriere binara .

...
FILE * Pf;
Pf = fopen (Fisier.Dat,w);
...
77/80

Prelucrarea pe caractere:

int putc ( int c, FILE * Pf ) ;


int getc (FILE * Pf ) ;
int fclose ( FILE * Pf ) ;

#include
#i
l d <stdio.h>
di h
void main (void)
{ int c;
while ((c=getc(stdin))!=EOF)
putc(c,stdout);
}

Citirea / scrierea cu format:

int fscanf ( FILE * Pf , control,


control lista_var.
lista var ) ;
int fprintf ( FILE * Pf , control, lista_expr.) ;
Intrari / iesiri de siruri de caractere :
char * fgets ( char *ss, int n,
n FILE * Pf ) ;
int

fputs ( char *s, FILE * Pf ) ;


78/80

// Scriere cu Stream
Stream--uri \\
#include
#i l d <fstream.h
<
<fffstream.h>
t
h>
h>

void main (void)


{
cmp1, cmp2, ;
ofstream f(("
("Fiier.Txt
Fiier.Txt");
Fiier.Txt
");
);
while ((cin
cin >> cmp1
cmp1 >> cmp2
cmp2 )
f << cmp
cmp11 <<' '<< cmp2
cmp2 << << endl;
endl;
ff.close();
f.close
close();
close();

79/80

// Citire cu Stream
Stream--uri \\
#include <fstream.h
<fstream.h>
>

void main (void)


{
cmp1, cmp2, ;
ifstream f("
("Fiier.Txt
Fiier.Txt");
");
while (f
(f >> cmp1
cmp1 >> cmp2
cmp2 ))

//
//
//

sau :

while ( !f.eof() )
if ( f >> cmp
cmp11>>cmp
>>cmp22)

cout << cmp


cmp11<<' '<< cmp2
cmp2 <<
f l ();
f.close();
f.close
()

80/80

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