Sunteți pe pagina 1din 78

1. 1.

Subprograme Subprograme definite de definite de utilizator utilizator p g p g


1.1. Subprograme.
M i d f i i di l il Mecanisme de transfer prin intermediul parametrilor
Subprograme Subprograme (Pascal Pascal) : Subprograme Subprograme (Pascal Pascal) :
proceduri Procedure Procedure,
functii [Function Function].
Parametri (tipuri/clasificari),
Vizibilitate Vizibilitate,
Parametri de tip Functie, Procedura,
Apelul recursiv (subpr. recursive),
33/80 /80
p ( p ),
Definire simultana (Forward).
Subalgoritmi: Subalgoritmi: rezolv o anumit subproblem rezolv o anumit subproblem
Subalgoritm Subalgoritm
Parametri de Intrare
Parametri de iesire
Apel:
[Cheam] Nume Subalgoritm (Lista parametri actuali); [Cheam] Nume_Subalgoritm (Lista_parametri_actuali);
Def : Def.:
Subalgoritmul Nume_Subalgoritm (Lista_parametri_formali) Este : {Antet}
. . . { Corp subalgoritm }
Sf_Subalgoritm. { sau Sf_Nume_Subalgoritm. }
44/80 /80
Parametri de Intrare Parametri de Intrare Expresii Expresii
Parametri de iesire Parametri de iesire Variabile Variabile
Exemplu: Exemplu: pentru trei mulimi date A, B i C calculm AB, AC i BC
Algoritmul Reuniuni Este :
R:=XY
X , Y R
Date A,B,C;
Cheam Reuniune (A,B,R1);
Cheam Reuniune (A C R2);
Subalgoritmul Reuniune ( X,Y, R ) Este :
R:=X;
Cheam Reuniune (A,C,R2);
Cheam Reuniune (B,C,R3);
Rezultate R1;
Pentru fiecare yY Execut
Dac y yXX Atunci R:=R{y}
Sf Dac
Rezultate R2;
Rezultate R3;
Sf Algoritm.
Sf_Dac
Sf_Pentru
Sf_Reuniune.
f_ g
Subalgoritmul Reuninune determin mulimea R = X Y astfel :
R X (Y \ X) di d i i ti l t l di li
55/80 /80
R := X (Y \ X), adic depune n reuniune mai nti elementele din mulimea
X, la care apoi mai adaug acele elemente din Y care nu aparin aparin lui X.
Functii: ~ Functii: ~ Subalgoritm + Val. functiei 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; Nume_Funcie := Expresie; { Corpul funciei }
. . .
Sf_Funcie. { sau Sf_Nume_funcie.}
66/80 /80
Parametri de Intrare Parametri de Intrare Expresii Expresii
Parametri de iesire Parametri de iesire Variabile Variabile
Exemple: Exemple: Exist & Apart
Funcia Exist ( b A n p ) Este : Funcia Exist ( b, A, n, p ) Este :
p:=1;
Ct_Timp (p<=n) i (b<>ap) Execut p:=p+1 Sf_Ct_Timp;
Exist := (p<=n) Exist : (p 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 ( C d(A)) Apart := (p<=Card(A))
Sf_Apart.
Funcia Card (A) Este : ( )
Card := a
0
Sf_Card.
77/80 /80
Dac yX Atunci R:=R{y} Sf_Dac;
Dac Not Apart (y,X) Apart (y,X) Atunci R:=R{y} Sf_Dac;
Exemplu: Exemplu: determin maximul dintr determin maximul dintr- -un ir X cu n componente un ir X cu n componente ..
Funcia Max (X,k) Este : ( )
Dac k=1 Atunci Max:=x
1
{Consistena}
Altfel Dac Max(X,k-1) < x
k
Atunci Max:= x
k
Altfel Max:= Max(X,k-1)
Sf_Dac
Sf_Dac
Sf_Max.
Apelul:
Max(X,n)
Exemplu: Exemplu: decide dac b aparine primelor k elemente din irul A 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=a
k
) )
Sf_Apart.
88/80 /80
Apelul:
Apart(b,A,Card(A))
Subprograme Pascal : Procedure, Function Subprograme Pascal : Procedure, Function : :
<Def_subprogram> ::= <Def_funcie> | <Def_procedur>
<Def_funcie> ::= <Antet_funcie> ; <Bloc>
<Def_procedur> ::= <Antet_procedur> ; <Bloc>
<A t t f i > :: F ti <N > [ (L f ) ] : <Ti f> <Antet_funcie> ::= Function <Nume> [ (L_p_f ) ] : <Tip_f>
<Antet_procedur> ::= Procedure <Nume> [ (L_p_f ) ]
Real, Integer, Byte, Boolean, Char, String Real, Integer, Byte, Boolean, Char, String, ,
A l A l Apel Apel:
P: <Nume> [ (Lista_parametri_actuali)];
F: <Nume> [ (List parametri actuali)] { expr expr. instr instr. }
99/80 /80
[ ( _p _ )] { pp }
Parametri Parametri : :
Date de iesire
Adr. (Var.) Adr. (Var.)
Date de intrare
Val. (Expr.) Val. (Expr.)
Subprogram Subprogram
<L_p_f.> ::= <spf> { ; <spf> }
< l> <li t id> <id ti >
<spf> ::= <sp_val> | <sp_var> | <p_functie> | <p_procedura>
<sp_val> ::= <lista_id> : <id_tip>
<sp_var> ::= Var Var <lista_id> : <id_tip>
Reuniune
AA
BB
CC
10 10/80 /80
Procedure Reuniune (A,B:Multime; Var C:Multime);
Vizibilitate Vizibilitate : :
Domeniu de vizibilitate:
Var. locale
Var globale ( !! )
S
2a
n
3
Var. globale ( ! ! )
Proceduri,
Functii,
S
S
1
n
2
S
2
n
2
S
2b
n
23

P
( i l l 0)
n
1
n
2
Function Apart (b:Integer; A:Multime) : Boolean; {Apartine b multimii A?}
Var i,n : Integer;
n
0
(nivelul 0)
Var i,n : Integer;
Begin
i:=1; n:=A[0];
While (i<=n) And (b<>A[i]) Do i:=i+1;
11 11/80 /80
While (i n) And (b A[i]) Do i: i+1;
Apart := i<=n {Apartine, daca i<=n }
End;
Program AuB_AuC_BuC;
Type Multime = Array[0 100] Of Integer; Type Multime Array[0..100] Of Integer;
Procedure Citeste (Var A:Multime); { Citeste o multime de la tastatura }
Var c,p,n : Integer; s : String;
Begin Begin
Write (' Dati elementele multimii : '); Readln (s); n:=0;
While s<>'' Do Begin
n:=n+1; Val(s A[n] p); n: n+1; Val(s,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); { Tipareste pe ecran o multime A }
Var n i : Integer; Var n,i : Integer;
Begin
n:=A[0]; Write (' {');
For i:=1 To n Do Write (A[i],',');
12 12/80 /80
W ( [ ], , );
Writeln (Chr(8),'}') { Rescrie peste ultima virgula, acolada }
End;
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] q: B[0] r: C[0] Begin C:=A; p:=A[0]; q:=B[0]; r:=C[0];
For i:=1 To q Do
If Not Apart(B[i],A) Then Begin
r:=r+1; C[r]:=B[i] End C[0]:=r r: r+1; C[r]: B[i] End C[0]: r
End;
Var A, B, C, AuB, AuC, BuC : Multime;
Begin { Modulul principal } Begin { Modulul principal }
Citeste (A); Citeste (B); Citeste (C);
Reuniune(A,B,AuB); Tipareste (AuB);
Reuniune(A C AuC); Tipareste (AuC);
13 13/80 /80
Reuniune(A,C,AuC); Tipareste (AuC);
Reuniune(B,C,BuC); Tipareste (BuC); Readln
End.
Parametri de tip Function, Parametri de tip Function, Procedure 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 f E d Begin f p End;
Apelul: Apelul:
Function f1 (): Procedure metoda1();
Function f2 (): Procedure metoda2();
14 14/80 /80
. . . <nume_subpr> ( ... f1, ... ,metoda1, ... ) ...
. . . <nume_subpr> ( ... f2, ... ,metoda2, ... ) ...
. . .
Program Parametri_Functie_Procedura; {$F+}
Type Sir = Array [1..30] Of Integer;
F ti F ti ( I t ) I t Functie = Function (x:Integer) : Integer;
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 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 b:Integer):Boolean; Begin DesCresc:=a>b End; Function DesCresc(a,b:Integer):Boolean; Begin DesCresc:=a>b End;
Procedure Ordonez Procedure Ordonez (Var X:Sir; n:Integer; Relatie : FctBool );
Var Ordonat : Boolean; k, i, v : Integer;
Begin k:=1; Begin k:=1;
Repeat Ordonat:=True;
For i:=1 To n-k Do
If Not Relatie(X[i],X[i+1]) Then Begin 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
15 15/80 /80
Until Ordonat;
End;
Procedure OrdCresc (Var A:Sir; n:Integer);
Begin Ordonez ( A, n, Cresc ) End; g ( , , ) ;
Procedure OrdDesCresc (Var A:Sir; n:Integer);
Begin Ordonez ( A, n, DesCresc ) End;
Procedure Gen_Ord_Tip 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}
O d (A ) {O d } Ordonare (A,n); {Ordonare}
For i:=1 To n-1 Do Write (A[i],','); Writeln(A[n]) { Tiparire }
End;
Var X, Y : Sir;
Begin
Gen Ord Tip Gen Ord Tip (X,10, f, OrdCresc ); { Prel X }
16 16/80 /80
_ _ p _ _ p ( f, ) { }
Gen_Ord_Tip Gen_Ord_Tip (Y,11, g, OrdDesCresc ); Readln { Prel Y }
End.
Apelul recursiv 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!)
Ex : Fiind date dou numere naturale de maxim 30 de cifre sub forma a dou
Recursivitate RecursivitateIteratie Iteratie !!
Ex.: Fiind date dou numere naturale de maxim 30 de 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) Dac m > n (1)
m 0 n 0 t 0 (2)
Ad(A,m,B,n,Tr) =
m=0, n=0, t=0 (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)
17 17/80 /80
Ad(A,m-1,B,n-1,Tr(a[m],B[n]))Cifra(a[m],b[n]) m>0, n>0 (5)
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) : Numar; { Aduna primele m resp. n cifre } ( y ) { p p 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 0 Th If 0 Th Ad '' { C l (2) } If n=0 Then If t=0 Then Ad:='' { Cazul (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 { (5) }
18 18/80 /80
Else Ad:=Ad(m-1,n-1,Tr(a[m]))+c { (5) }
End;
Begin
If Length(a)>Length(b)
Then Adun := Adun (b,a) { Cazul (1), m>n }
Else Adun := Ad (Length(a),Length(b),0) { Initial Transportul = 0 }
End; {Adun }
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) ;
Write (' Dati b : '); Readln (b) ; ( ) ( )
Writeln(Sp(a)+' + '); { Tipareste : 1234 + }
Writeln(Sp(b)); { 123 }
Write (Sp(Adun (a,b))); { 1357 }
19 19/80 /80
Write (Sp(Adun (a,b))); { 1357 }
Readln
End.
Definire simultan (Forward ) Definire simultan (Forward ) ::

Function / Procedure S2 ( . . . ) ; { Subprogramul S2 apeleaz S1 }


B i S1 E d
Function Function / / Procedure Procedure SS11 (( .. .. .. )) ;; Forward Forward;; { { Antetul Antetul lui lui S S11 }}
Begin ... S1... End;
Function / Procedure S1 ( . . . ); { Subprogramul S1 apeleaz S2 }
Begin ... S2... End;
Ce functie (procedur) se va scrie prima ??
Ex Ex.. Pentru Pentru aa compara compara dou dou numere numere (a<b, (a<b, a>b, a>b, a=b) a=b) reprezentate reprezentate prin prin irul irul
(caracterelor) (caracterelor) cifrelor, cifrelor, vom vom utiliza utiliza trei trei funcii funcii simultane simultane (mutuale) (mutuale)::
aa<<bb b>a b>a aa<<bb b>a, b>a,
aa==bb Not Not a<b a<b i i Not Not a>b, a>b,
aa>>bb NrCif( NrCif(aa)) >> NrCif( NrCif(bb)) sau sau
20 20/80 /80
NrCif( NrCif(aa)) == NrCif( NrCif(bb)) Cat( Cat(aa)>Cat( )>Cat(bb)) sau sau {/ {/10 10}}..
Cat( Cat(aa)=Cat( )=Cat(bb)) i i Rest( Rest(aa)>Rest( )>Rest(bb))
Program Comparare_Numere_Str_cifre_baza_10; { < , > , = , n<=10 }
Const n=10;
Type Numar = String[n]; Type Numar = String[n];
Function MaiMare(a,b : Numar) : Boolean; Forward;
Function MaiMic (a,b : Numar) : Boolean;
Begin MaiMic:=MaiMare(b a) End; Begin MaiMic: MaiMare(b,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 { Cat(A) > Cat(B) } (MaiMare(Copy(a,1,m-1),Copy(b,1,n-1)) Or { 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 M iM ( b) Th W it (' > b ') El
21 21/80 /80
If MaiMare(a,b) Then Write (' a > b ') Else
If Egale (a,b) Then Write (' a = b ') Else Write (' a ? b '); Readln
End.
1.2. Proceduri i funcii predefinite
Citirea i scrierea datelor Citirea i scrierea datelor ::
p
Read ( <list variabile> )
Nu exista instructiuni Apel Proceduri
Read ( <list_variabile> )
Readln (a,b,c); // 1 2 3 xxx
Readln (v); // Simpla, Nu enum enum,
Write ( <list_expresii> )
Writeln (a,b,c); // 1 2 3
( ) // Writeln (''); //
Writeln (3.1415::5 5::2 2, 7.1::5 5::2 2, 9::3 3);// _3.14__7.10__9
22 22/80 /80
Readln (a::5 5::2 2, b::5 5::2 2, k::3 3); // _3.14__7.10__9
La definirea expresiilor se folosesc i funcii. La definirea expresiilor se folosesc i funcii.
Tabelul urmtor conine cteva funcii predefinite (Pascal). Tabelul urmtor conine cteva funcii predefinite (Pascal).
Functia Functia S e m n i f i c a t i a S e m n i f i c a t i a
abs ( i ) abs ( i ) valoarea (ntreag) absolut a ntregului i
abs ( x ) abs ( x ) valoarea (real) absolut a realului x
sqr ( i ) sqr ( i ) ptratul ntregului i (dac i*i < Maxint) (valoare ntreag)
sqr ( x ) sqr ( x ) ptratul numrului real x
sqrt ( x ) sqrt ( x ) radical din x, x>=0
int (x) int (x) partea ntreag a numrului real x int (x) int (x) partea ntreag a numrului real x
trunc (x) trunc (x) ntregul obinut din numrul real x prin eliminarea prii fracionare
round ( x ) round ( x ) cel mai apropiat ntreg de numrul real x
frac ( x ) frac ( x ) valoarea x - int(x) , pentru x real
exp ( x ) exp ( x ) e la puterea x x ntreg sau real exp ( x ) exp ( x ) e la puterea x, x ntreg sau real
ln ( x ) ln ( x ) logaritm natural din x, x ntreg sau real>0
sin ( x ) sin ( x ) sinusul lui x, x reprezint msura n radiani a unui unghi
cos ( x ) cos ( x ) cosinusul lui x,
arctan ( x ) arctan ( x ) arctangenta din x,
succ ( i ) succ ( i ) succesorul valorii ordinale i
pred ( i ) pred ( i ) predecesorul valorii ordinale i
ord ( e ) ord ( e ) numrul de ordine al valorii lui e n tipul expresiei ordinale e
23 23/80 /80
chr ( i ) chr ( i ) caracterul de ordin i n tipul Char
odd ( i ) odd ( i ) funcie logic cu valoarea True dac i este impar i False dac este par
Tipul ir_caractere Tipul ir_caractere (String ) (String ) : :
Util.: ~~ Array Of Char
[[ ]] Decl.: String [[ [m] ]] Lung. Max. = m <= 255 255.
a) Operaia de concatenare a dou iruri este notat cu ++ . De exemplu
Operatori pentru String :
Algoritmica, ++ Programare are valoarea Algoritmica, Programare.
b) Operatorii relaionali permit compararea a dou iruri utiliznd ordinea
lexicografic (utilizat n dicionare, cri de telefon, etc.) : g ( )
== i <> <> pentru egalitatea respectiv neegalitatea a dou iruri ,
<, <, >, >, <=, <=, >= >= pentru compararea lexicografic.
Ex. :
24 24/80 /80
Ex. :
Alb < Albastru;
Ionescu < Popescu ; 0... < 9... < A... < Z... < a... < z....
Faciliti (4F & 4P) ale tipului String String ( n plus fa de Array Of Char ) :
Valorile variabilelor i expresiilor de tip String pot fi citite respectiv tiprite, ex.: Valorile variabilelor i expresiilor de tip String pot fi citite respectiv tiprite, ex.:
Mesaj:=Numele autorului; Write (Dati +Mesaj+ : ); Readln (s);
- Length Length (S) (=Ord(S[0]) ) returneaz lungimea irului S (Length(mare)=4),
Copy Copy (S p l) returneaz subirul (lui S) de lungime l ncepnd din pozitia p - Copy Copy (S,p,l) returneaz subirul (lui S) de lungime l ncepnd din pozitia p
( Copy(Marinescu,2,4)=arin ),
- Concat Concat (S1,S2,...,Sn) (=S1+S2+...+Sn) ( Concat(Con,Cat)=ConCat),
-- Pos Pos (x S) det poz subirului x n irul S sau 0 dac irul S nu conine ca subir pe x Pos Pos (x,S) det. 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 Delete (s,p,l) terge din s ncepnd din poz. p , l caractere, ex.secventa :
s:=Ionescu; Delete (s 4 4); Write (s); va tipari Ion; s:= Ionescu ; Delete (s,4,4); Write (s); va tipari Ion ;
- Insert 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 Str (e S) depune n S irul cifrelor val Expr e care poate avea ataat un format Str Str (e,S) depune n S, irul cifrelor val. 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 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
25 25/80 /80
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).
Problema pe care o vom rezolva utiliznd tipul string este urmtoarea :
S se calculeze valoarea unei expresii aritmetice de forma : n1n2[=] unde :
n1 2 sunt dou numere reale este un operator aritmetic (+ * / sau : ) iar n1,2 sunt dou numere 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 va afia cu dou 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
fi b i d V l i i i l poate fi obtinut cu procedura Val, iar apoi se sterg primele 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
26 26/80 /80
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.
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]; Delete (e 1 p); Val (Copy(e 1 Length(e)-1) n2 er); o: e[p]; Delete (e,1,p); Val (Copy(e,1,Length(e)-1),n2,er);
Case o Of
'+' : Str (n1+n2:8:2,r); '-' : Str (n1-n2:8:2,r);
' ' '*' S ( 1* 2 8 2 ) ' ' '/' S ( 1/ 2 8 2 ) 'x','*' : Str (n1*n2:8:2,r); ':','/' : Str (n1/n2:8:2,r)
Else r:=' Operator necunoscut.'+o
End; p:=Pos('.',r); If p>0 Then r[p]:=','; Writeln (r) End
27 27/80 /80
Until e=''
End.
F i i e r e F i i e r e
3. 3. Fiiere Fiiere text text
Fiiere Pascal. Fiiere Pascal.
Utilizarea fiierelor text. Utilizarea fiierelor text.
Fiiere cu tip Fiiere cu tip p p
Operaii Operaii cu cu fiiere fiiere
Fiiere fara tip Fiiere fara tip binare binare
28 28/80 /80
3.1 3.1 Fiiere Fiiere text ~ text ~ Tipuri Tipuri de de acces acces
Fi i l Fi i l fi id l i l i dd dd ( Fiierul Fiierul poate fi considerat oo colecie colecie de de date date stocate stocate pe pe un un suport suport extern 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 Accesul la componentele unui
fiier poate fi secvenial sau
Memoria intern Memoria intern
Art.: Art.:
direct. n acces secvenial,
articolele sunt prelucrate
(accesate) succesiv (unul dup
l l) d i l l
Write Write
Memoria intern Memoria intern
Articol Articol
0
1
2
3
Fis. Fis.
29 29/80 /80
altul), ncepnd cu primul pan la
ultimul (Art.0, Art.1,...,Art.n-1).
Read Read
3
Fiiere Pascal 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 citire-
i ) i i i I di l d l scriere) este poziionat pe prima component. Indicatorul se deplaseaz 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: 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 Assign (Variabila Fiier (Variabila Fiier Specificator Fiier) Specificator Fiier) Acest asociere fiind procedura Assign Assign (Variabila_Fiier, (Variabila_Fiier, Specificator_Fiier) Specificator_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) Rewrite(F) sau
30 30/80 /80
- Deschiderea propriuzis se va efectua prin apelul procedurii Rewrite(F) Rewrite(F) sau
Reset(F) Reset(F) dup cum fiierul care va fi deschis urmeaz s se creeze sau s se
consulte .
Fiiere Pascal Fiiere Pascal
Operaiile de intrare / ieire sunt:
Read(F,Art) Read(F,Art) respectiv
Write(F,Art) Write(F,Art)
unde am notat prin Art variabila din memoria intern (declarat n program) n sau 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
E f(F) E f(F) Eof(F) Eof(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)..
De asemenea, este posibil schimbarea numelui unui fiier n timpul execuiei
31 31/80 /80
, p p
unui program. Aceast redenumire se poate realiza prin apelul:
Rename(F, Rename(F, Noul_Specificator_de_Fiier) Noul_Specificator_de_Fiier) .
3.2 3.2.. Proceduri Proceduri i i funcii funcii predefinite predefinite pentru pentru fiiere fiiere text text
Coninutul unui fiier fiier text text poate fi neles ca un text dintr o carte organizat pe un Coninutul unui fiier fiier text text poate fi neles ca un text dintr-o 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 CR (de la Carriage
Return) i LF LF (de la Line Feed) Avantajul folosirii acestor fiiere const n faptul c Return) i LF LF (de la Line 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 Read (F, (F, List_Var_Intrare List_Var_Intrare) );; sau
Readln Readln(F, (F, List Var Intrare List Var Intrare));; ( , ( , _ _ _ _ ));;
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( Write(FList Expresii Ieire FList Expresii Ieire));; sau
32 32/80 /80
Write( Write(F,List_Expresii_Ieire F,List_Expresii_Ieire));; sau
Writeln Writeln(F (F List_Expr List_Expr.._Ieire _Ieire) ); ;
scrierea fcndu-se n fiierul F ca i pe ecran.
Fiiere Text Fiiere Text
Un prim exemplu l constituie o procedur care citete o matrice (dimensiunile i 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 Begin
Assign (F,Matrice.Txt); Reset (F);
Readln (F,m,n);
3 4
For i:=1 To m Do
For j:= 1 To n Do
Read (F,A[i,j]);
1 2 3 4
5 6 7 8
9 0 1 2
33 33/80 /80
Close (F)
End;
9 0 1 2
Fiiere Text Fiiere Text
Urmtorul exemplu este un program Pascal care traduce un text aflat ntr-un fiier Urmtorul exemplu este un program Pascal care traduce un text aflat ntr 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) i se Dicionarul este compus dintr-un ir de perechi de cuvinte de forma (St,Dr) i se
construiete citind cte un rnd de forma Stnga=Dreapta din fiierul text.
Program=Algoritmul De exemplu, coninutul fiierului Dictio.Txt, tiprit n og a lgo it ul
Readln=Date
Read=Date
Writeln=Rezultate
p , , p
continuare, poate traduce un Program Pascal in
Pseudocod Pseudocod.
P li d i d di
Writeln Rezultate
Write=Rezultate
For=Pentru
Do=Executa
Pentru a realiza o traducere, se citeste cte un rnd din
fiierul iniial, se traduce conform dicionarului, dup care
se depune (rndul tradus) n fiierul final (tradus).
Do Executa
Repeat=Repeta
Until=Pana_Cand
While=Cat Timp
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
34 34/80 /80
While Cat_Timp
End.=Sfarsit.
. . .
nlocui n rnd cuvntul gsit cu perechea acestuia (partea
dreapt din dictionar).
Fiiere Text Fiiere Text
Programul Pascal este urmtorul :
Program Traducere Text; g _ ;
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 R d N B t { N l d i t di di ti } Dict : Record Nrc : Byte; { Numarul de cuvinte din dictionar }
Cuv : Array [1..Mc] Of Rd
End;
Rnd : String;{ un rnd din dictionar de forma St = Dr } g { f }
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 Dictionarul n memorie n variabila Dict } With Dict Do Begin { Constr. Dictionarul n memorie n variabila 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 p+1 Length(Rnd)-p) { Dr := p }
35 35/80 /80
Dr: Copy(Rnd,p+1,Length(Rnd) p) { Dr : p ... }
End
End
End;
Write (' Numele fiierului de tradus : '); Readln (Numei); { Fi. de tradus }
W (' N l f l l ') R dl (N f) { F d }
Fiiere Text Fiiere Text
Write (' Numele fiierului rezultat : '); Readln (Numef); { Fi. tradus }
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 ? } 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;
Cl (F ) Cl (T ) { I h d f l }
36 36/80 /80
Close (Fis); Close (Tra) { Inchide fiierele }
End.
3.3 3.3.. Operaii Operaii cu cufiiere fiiere
Principalele operaii asupra fiierelor sunt : Principalele operaii asupra fiierelor sunt :
Creere (generarea unui fiier, care se execut o singur dat, cnd ia fiin
fiierul),
Actualizare (corectarea fiierului punerea la punct n cazul n care datele nu Actualizare (corectarea 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 : se poate efectua :
Adugarea de noi articole,
Modificarea unor articole (prin modificri de cmpuri ale acestora), sau
St d ti l Stergerea de articole.
Operaiile descrise anterior vor fi exemplificate n cele ce urmeaz prin programe
P l
37 37/80 /80
Pascal.
Operaii cu Operaii cufiiere fiiere
n e empl l rmtor se dorete fiier l i Gr pa111 Dat c articole de n exemplul urmtor se dorete creerea fiierului Grupa111.Dat, cu articole de
forma:
Nr_Leg Nume Medie
Word Word String[25] String[25] Real 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 Creere
Grupa111 Dat
38 38/80 /80
Grupa111.Dat
Operaii cu Operaii cufiiere 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 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 actualizrii) conform crora se corecteaz fiierul.
...............
...............
...............
...............
Actualizare
39 39/80 /80
................. .................
ctualiza e
Grupa111.Dat
Operaii cu Operaii cufiiere 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 articole este necasar utilizarea unui fiier temporar, aa cum se poate vedea n
figura urmtoare:
...............
...............
.................
...............
...............
.................
Stergere /
Adugare
Grupa111.Dat Grupa111.Tmp
Dac se dorete tergerea aleatoare a unor articole din fiier, numrul curent al g
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
40 40/80 /80
(Rename(Fis_Temporar,Nume_Fiier)) aa cum se poate vedea n exemplul
urmtor.
Operaii cu Operaii cufiiere 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 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).
...............
...............
.................
...............
...............
.................
Adugare Adugare
Grupa111.Dat 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.
41 41/80 /80
Aa cum s-a procedat i la Stergere, se vor depune datele obinute n fiierul
iniial (apelnd Erase Erase... i Rename Rename...) .
11..33.. Funcii Funcii
O funcie funcie este format dintr-un antet antet i un bloc bloc (corp corp). Ea poate fi
apelat dac a fost definit n ntregime sau doar antetul su.
Antetul Antetul unei funcii are urmtorul format:
Tip Tip Nume Nume ( (List_parametri_formali List_parametri_formali))
d unde:
Tip Tip este tipul valorilor funciei (codomeniul);
Nume Nume este un identificator (liter urmat eventual de litere sau cifre); ( );
List_parametri_formali List_parametri_formali conine parametrii formali separai prin ,,.
Exemplu Exemplu: : pp
int Min (int a, int b)
{ if (a<b) return a; else return b; }
42 42/80 /80
Obs. Prototipul Prototipul unei funcii este antetul antetul acesteia urmat de ;; .
Corpul Corpul unei funcii are urmtoarea structur:
{{
D l ii Declaraii
Instruciuni
}}
Exemple Exemple: :
int Cmmdc Cmmdc (int a, int b) // Cmmdc(a,b)
{
if (b= =0) return a;
else return Cmmdc(b,a % b); // Cmmdc(b,a Mod b);
}}
int cmmdc cmmdc (int a, int b) // cmmdc(a,b)
{ int rest;
do {rest=a%b;
a=b;
b=rest; }
hil ( t! 0) // t 0 hil hil ( t) ( t)
43 43/80 /80
while (rest!=0); // rest 0; sau while while (rest) (rest) ;;
return a;
}
2.3. 2.3. Operaii Operaii de de intrare intrare//ieire ieire
2 3 1 F i P i tf 2.3.1. Funcia Printf
2.3.2. Funcia Scanf
2.3.3. Funcia PutChar
2.3.2.3. Funcia GetChar
2.3.5. Funcia GetChe
2 3 6 Funcia GetCh 2.3.6. Funcia GetCh
2.3.7. Funcia KbHit
2.3.8. Funciile PutS, GetS
2 3 9 St i 2.3.9. Stream-uri
44 44/80 /80
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
n limbajul C nu nu exist exist instruciuni instruciuni de intrare intrare/ /ieire ieire,
aceste operaii ralizndu-se prin funcii funcii aflate n bibliotecile
standard.
Implicit, unui program i se ataeaz fiierele:
stdin stdin (intrare standard),
stdout stdout (ieire standard),
stderr stderr (ieire standard pentru erori),
stprn stprn (ieire pentru imprimant),
stdoux stdoux (intrare/ieire serial)
45 45/80 /80
stdoux stdoux (intrare/ieire serial).
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.1 2.3.1. . Funcia Funcia Printf Printf
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 :
%% [] [mm[..nn] ] [ll] [ ff ] . %% [ ] [ [ ] ] [ ] [ ff ]
unde:
[] - determin alinierea la stnga, implicit fiind la dreapta,
[mm] - precizeaz lungimea cmpului,
[..nn] - precizeaz lungimea prii zecimale, respectiv numrul de caractere,
[ ll ] conversia se va efectua din format intern long
46 46/80 /80
[ ll ] - conversia se va efectua din format intern long,
[ ff ] - determin tipul conversiei.
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.1 2.3.1. . Funcia Funcia Printf Printf
Tipul Tipul conversiei conversiei [ff ] este precizat prin unul din urmtoarele caractere:
d i i l t d - int zecimal extern,
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), 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,
fl t d bl i l t f ti l (b*10
e
) e - float sau double zecimal extern forma exponentiala (b*10
e
),
E - float sau double zecimal extern forma exponentiala (b*10
E
),
g - se alege dintre variantele f sau e reprezentarea minima,
47 47/80 /80
G - se alege dintre variantele f sau E reprezentarea minima.
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.1 2.3.1. . Funcia Funcia Printf Printf ff
Funcia printf 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;
printf(" Zi:%%dd, Luna:%%33..33ss., An:%%uu \n",Zi,Luna,An Zi,Luna,An); // Zi:1, Luna:Ian., An:2003 p ( , , , ); , ,
printf(" Inaltime(m):%%2 2..33..22ff \n",Ina Ina); // Inaltime(m):1.80
48 48/80 /80
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.2 2.3.2. . Funcia Funcia Scanf Scanf
Aceasta functie realizeaza citirea datelor dupa un sablon, avnd urmatorul
f t format:
int int scanf scanf ((Control Control ,, List Lista a__Adr Adrese ese_de_ _de_Variabile 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 prezentati la functia printf, realiznd nsa conversiile inverse: p p f,
% [*] [m] [l] [ f ] ,
unde:
[*] - un caracter optional,
[m] - precizeaza lungimea maxima a cmpului,
[ l ] - conversia se va efectua din format intern long,
49 49/80 /80
[ l ] conversia se va efectua din format intern long,
[ f ] - determina tipul conversiei.
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.2 2.3.2. . Funcia Funcia Scanf Scanf
Tipul Tipul conversiei conversiei [ff ] este precizat prin unul din urmtoarele caractere:
d - int zecimal extern,
o - int octal extern,
x - int hexa extern (0...9,a...f),
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),
t i i d t t i t l ti di i s - string sir de caractere terminat la spatiu sau dimensiunea m,
f - float flotant extern.
50 50/80 /80
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.2 2.3.2. . Funcia Funcia Scanf Scanf
Adresele variabilelor de intrare sunt date prin operatorul de adrese & plasat
naintea identificatorului fiecarei variabile (simple!):
[&&] Variabila (nu nu este este necesar 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 f(" %d % % %f" &&Zi L &&A &&I )) i tf("Ct l/Z")
51 51/80 /80
if (EOF==scanf(" %d %s %u %f", &&Zi, Luna, &&An, &&Ina)) printf("Ctrl/Z");
else { printf(" Zi:%d, Luna:%3.3s., An:%u \n",Zi,Luna,An); printf(" Inaltime(m):%2.3.2f \n",Ina); }
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.3 2.3.3. . Funcia Funcia PutChar PutChar
Aceast funcie realizeaz tiprirea unui caracter al crui cod ASCII este
precizat printr-o expresie :
t h (E i ) putchar (Expresie);
2 3 2 3 2 3 2 3 Funcia Funcia GetChar GetChar 2.3.2.3. 2.3.2.3. Funcia Funcia GetChar GetChar
Aceasta, returneaz codul ASCII al caracterului citit (pentru Ctrl/Z EOF=-1):
getchar ( );
Exemplu:
char c;
getchar ( );
char c;
do putchar (((c=getchar())>'Z')? c^' ' : c); // Litere mici LITERE MARI
while (c!='.');

Litere Litere mici mici in in Litere Litere MARI MARI !! getchar getchar
LITERE LITERE MICI MICI IN IN LITERE LITERE MARI MARI !! putchar putchar
52 52/80 /80
pp
Se Se termina termina la la .. (Punct) (Punct) getchar getchar
SE SE TERMINA TERMINALA LA.. putchar putchar
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.5 2.3.5. . Funcia Funcia GetChe GetChe
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 LLiItTeErReE mMiIcCiI mMiIcCiI iInN iInN LLiItTeErReE LLiItTeErReE MMAARRII MMAARRII LLiItTeErReE LLiItTeErReE mMiIcCiI mMiIcCiI iInN iInN LLiItTeErReE LLiItTeErReE MMAARRII MMAARRII.. ..
2.3.6 2.3.6. . Funcia Funcia GetCh GetCh
Funcia returneaz codul caracterului citit direct fr a mai fi afiat:
int getch ( );
Exemplu:
int ReadKey()
{ int car=getch();
if (car) return car;
53 53/80 /80
if (car) return car;
else return getch(); // a fost apsat o tast functional (0,cod ASCII)
}
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.7 2.3.7. . Funcia Funcia KbHit KbHit
Aceast funcie returneaz starea tastaturii (a fost apsat o tast ?):
int kbhit kbhit ( ); ( );
Exemplu:
# include <conio h> # include <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 P d K P d do {while (!kbhit kbhit()) { putchar(random(27)+'A'); putchar('\b'); } // kbhit kbhit()=KeyPressed KeyPressed
if ((c[++i]=getch())!='\r') putchar('*'); else putchar(' '); }
while (c[i]!='\r'); c[i]=0;
cout << " Password = " << c; getch();
54 54/80 /80
cout Password c; getch();
}
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.8 2.3.8.. Funciile Funciile PutS PutS, , GetS 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:
#include <stdio.h>
#include <conio.h>
Dati Dati oo propozitie propozitie ... ... <Cr> <Cr>
I/E I/E pt pt.. str str..
#include <iomanip.h>
#include <iostream.h>
void main ()
{ l ()
20 20 49 49 22ff 45 45 99 70 70 74 74 22ee 20 20 73 73 74 74 72 72 22ee
{ clrscr();
puts(" Dati o propozitie ... <Cr> ");
char s[100]; gets (s);
int i=0; do cout <<hex<<setw(3)<<int(s[i]); while (s[++i]); getche();
55 55/80 /80
int i 0; do cout <<hex<<setw(3)<<int(s[i]); while (s[++i]); getche();
}
2.3. 2.3. Operaii Operaii de de intrare intrare/ /ieire ieire
2.3.9 2.3.9.. Stream Stream--uri uri
Dispozitivelor standard de intrare-iesire li s-au atasat streamurile (flux de
date) standard cin (pentru stdin) si respectiv cout (pentru stdout) care permit date) standard cin (pentru stdin) si respectiv cout (pentru stdout), care permit
efectuarea operatiilor de intrare-iesire aplicnd operatorul >> >> streamului cin,
respectiv << << streamului cout. Ierarhiile necesare sunt n fisierul iostream.h .
Exemplu:
#i ncl ude <iostream. h>
#i l d #i l d t di t di hh #i ncl ude #i ncl ude <st di o <st di o.. h> h>;;
#i ncl ude #i ncl ude <coni o <coni o.. h> h>;;
voi d mai n ( voi d)
{ int i ; cout << " Dat i i : "; cin >> i ; { int i ; cout << Dat i i : ; cin >> i ;
cout << " Val . i = " << i +1 << endl; // endl=<Cr>
char s[ 10] ; cout << " Dat i s : "; cin >> s;
cout << " Si r . s = " << s << endl; get ch( ) ;
56 56/80 /80
cout << Si r . s << s << endl; get ch( ) ;
}
2.4. 2.4. Apelul Apelul unei unei funcii funcii pp
I t i d l i f ii t ti l l i t i ii Instruciunea de apel a unei funcii este un caz particular al instruciunii
expresie:
Nume_funcie (List_parametri_actuali); Nume_funcie (List_parametri_actuali);
O funcie poate fi apelat i n cadrul unei expresii dintr-o instruciune:
... Nume_funcie (List_parametri_ actuali) ... ; ... Nume_funcie (List_parametri_ actuali) ... ;
57 57/80 /80
2.4. 2.4. Apelul Apelul unei unei funcii funcii
O funcie poate fi utilizat doar dac a fost definit, sau cel puin a fost
declarat prototipul prototipul ( antet antet ;; ) ei ntr una din urmtoarele moduri: declarat prototipul prototipul ( antet antet ;; ) ei ntr-una din urmtoarele moduri:
)) Ti Ti f i f i NN f i f i (Li il f li) (Li il f li) a) a) Tip_ Tip_ funcie funcie Nume_ Nume_ funcie funcie (Lista_parametrilor_formali) (Lista_parametrilor_formali);;
b) b) Tip_funcie Tip_funcie Nume_funcie Nume_funcie (Lista_tipurilor_parametrilor_formali) (Lista_tipurilor_parametrilor_formali);;
)) Ti Ti f i f i NN f i f i ( id) ( id) // // tt t i t i f li f li c) c) Tip_ Tip_ funcie funcie Nume_ Nume_ funcie funcie (void) (void);; // // nu nu sunt sunt parametri parametri formali formali
d) d) Tip_ Tip_ funcie funcie Nume_ Nume_ funcie funcie ( ( ));; // // nu nu se se fac fac verificrile verificrile de de tip tip
58 58/80 /80
2.4. 2.4. Apelul Apelul unei unei funcii funcii
Apelul Apelul implicit pentru variabile simple (de baz) este prin prin valoare valoare, iar pentru
tablouri prin prin referin referin. Apelul Apelul prin prin referin referin se obine prin intermediul
i bil l d i l i d d && variabilelor de tip pointer pointer sau a operatorului de adres &&.
F ti F ti
Parametri de intrare Parametri de iesire
Functie Functie
a amet i de int a e Parametri de iesire
Parametri de intrare Expresii Expresii Parametri de iesire Variabile Variabile
s=a+b s=a+b
a, b a, b ss
22
s= s=22+x +x**yy
22, x , x**yy ss
void void suma suma (int (int a, a, int int b, b, int& int& s) s)
{{
{{
suma suma ((22 x*y x*y s) s);;
59 59/80 /80
{{
s=a+b s=a+b; ;
}}
suma suma ((22,, x*y, x*y, s) s);;

}}
2.4. 2.4. Apelul Apelul unei unei funcii funcii
Revenirea Revenirea dintr-o funcie se poate realiza fie prin instruciunea return return, fie
automat dup ultima instruciune a funciei
(situaie n care nu se returneaz situaie n care nu se returneaz nicio nicio valoare valoare):
return return [[ eexp xprreessiiee ]] ;;
(situaie n care nu se returneaz situaie n care nu se returneaz nicio nicio valoare valoare):
[[ pp ]]
fiind returnat valoarea expresiei expresiei (dac dac exist exist).
Citeste Citeste
aa
Tipareste Tipareste
x+y x+y
void void citeste citeste (int& (int& a) a)
{{
cin cin >> >> a a; ;
}}
int int citeste citeste ((void void))
{{ int int a a; ;
cin cin >> >> a a; ; return return aa; ;
}}
void void tipareste tipareste ((int int a a))
{{
cout cout << << a a; ;
}}
60 60/80 /80
}} }} }}
Exemplul 1:
2.4. 2.4. Apelul Apelul unei unei funcii 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 (fl t ) { t (( d)/( d)*( 2 1)+ 1) } int v (float y) { return ((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);*/ } u2=x2; v2=y2; /*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 y1 float x2 float y2) { bar(u(x1) v(y1) u(x2) v(y2)); } void Bar(float x1,float y1,float x2,float 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)); }
void Trag(float x,float y) { lineto(u(x),v(y)); } g( , y) { ( ( ), (y)); }
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;
61 61/80 /80
x = xp;
}
E l l 2
2.4. 2.4. Apelul Apelul unei unei funcii funcii
Exemplul 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 () { clrscr();
int n; 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();
62 62/80 /80
g ();
}
Exemplul 3: // Calc. AB, AB \\
2.4. 2.4. Apelul Apelul unei unei funcii funcii
Exemplul 3: // Calc. AB, AB \\
#include <iostream.h>; #include <conio.h>;
int Card(int A[]) { return A[0]; }
int Apart (int x, int A[])
{ f (i t i 1 i< C d(A) i++) if ( A[i]) t 1 t 0 } { for (int i=1; i<=Card(A); i++) if (x==A[i]) return 1; return 0; }
void nn (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]; }
void uu (int A[], int B[], int C[]) ( [], [], [])
{ 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(); { clrscr();
int A[]={5, 1,3,5,7,9}; Tip (" A : ",A);
int B []={5, 1,2,3,4,5}; Tip (" B : ",B);
int AuuB[10]; uu (A,B,AuB); Tip (" AuB = ",AuB);
63 63/80 /80
int AnnB[10]; nn (A,B,AnB); Tip (" AnB = ",AnB); getche();
}
2.4.1 2.4.1.. Operatorul Operatorul de de adres adres ((&&)) pp (( ))
Acest operator (&&) se poate utiliza i pentru a defini un tip referin printr-o
declaraie de forma tip tip && (asemntor cu o construcie de forma tip tip ** pentru declaraie de forma tip tip && (asemntor cu o construcie de forma tip tip **, pentru
pointer).
Cu ajutorul acestui operator putem: j p p
redenumi o variabil,
realiza realiza un un apel apel prin prin referin, referin,
d l i bil d f i tf l s declarm o variabil de referin astfel:
f l f l // // f ( d ) f ( d ) tip tip& & parametru_formal parametru_formal // // par. ref. (adres) par. ref. (adres)
ti ti && ff // d ti f i // d ti f i
64 64/80 /80
tip tip&& nume_var_ref ; nume_var_ref ; // var. de tip referin // var. de tip referin
2.4.1 2.4.1.. Operatorul Operatorul de de adres adres ((&&))
Exemplul 4: // Apel prin Referin
#include <iostream.h>;
id (i t i t i t * ) { * * } // void suma (int x, int y, int * 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) void main (void)
{
int x,y, z;
" D " cout << " Dati 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 mai simplu! simplu!
}
65 65/80 /80
}
2.5. 2.5. Functii Functii standard standard
Macrouri Macrouri de de clasificare clasificare ( (ctype ctype..hh))::
int int isascii isascii ( (int int car) car);; car car [[0 0,,127 127] ] ??
int int isalpha isalpha (int (int car) car);; car car este este codul codul unui unui caracter caracter alfanumeric alfanumeric ??
int int isalnum isalnum ( (int int car) car); ; car car este este codul codul unei unei litere litere ??
int int isupper isupper ( (int int car) car);; car car este este codul codul unei unei litere litere mari mari ? ?
int int islower islower ((int int car) car);; car car este este codul codul unei unei litere litere mici mici ?? int int islower islower ((int int car) car);; car car este este codul codul unei unei litere litere mici mici ??
int int isdigit isdigit ( (int int car) car);; car car este este codul codul unei unei cifre cifre zecimale zecimale ? ?
int int isxdigit isxdigit (int (int car) car);; car car este este codul codul unei unei cifre cifre hexa hexa ? ?
int int isgraph isgraph (int (int car) car);; car car este este codul codul unui unui caracter caracter afi afis sabil abil ??
int int isprint isprint (int (int car) car);; car car este este codul codul unui unui caracter caracter imprimabil imprimabil ??
int int isspace isspace (int (int car) car);; car car este este spa spattiu iu tab tab Cr Cr Lf Lf Vt Vt sau sau Np Np ??
66 66/80 /80
int int isspace isspace (int (int car) car);; car car este este spa spattiu iu,, tab, tab, Cr, Cr, Lf, Lf, Vt Vt sau sau Np Np ??
Macrouri Macrouri de de transformare transformare a a simbolurilor simbolurilor ( (ctype ctype..hh))::
int int toascii toascii((int int car) car);; car car [[00,,127 127]] (returneaz (returneazt t ultimii ultimii 7 7 bi bit ti) i)
int int toupper toupper ((int int car) car);; car car liter literaa mare mare ( (transforma transforma din din l l n n L) L)
int int tolower tolower ((int int car) car);; car car liter literaa mica mica ((transforma transforma din din LL n n l) l) int int tolower tolower ((int int car) car);; car car liter literaa mica mica ((transforma transforma din din LL n n l) l)
Conversii Conversii ((stdlib stdlib hh)):: Conversii Conversii ((stdlib stdlib..hh))::
Format Format intern intern Format Format ( (zecimal zecimal)) extern extern
int int atoi atoi((const const char char **ptr ptr));; binar binar (int) (int) zecimal zecimal extern extern int int atoi atoi((const const char char **ptr ptr));; binar binar (int) (int) zecimal zecimal extern extern
long long atol atol((const const char char **ptr ptr)); ; binar binar (long) (long)zecimal zecimal extern extern
double double atof atof((const const char char *ptr) *ptr);; flotant flotant ( (dubla dubla precizie precizie) ) zecimal zecimal extern extern
Format Format extern extern Format Format intern intern
char char **itoa itoa ((int int v, v,char char *s, *s, int int b) b);; ss vv
bb
(val (val.. v v de de tip tip int int,, scris scrisa a n n baza baza b) b)
67 67/80 /80
char char **ltoa ltoa ((long long v, v,char char *s, *s, int int b) b);; ss vv
bb
(val (val.. v v de de tip tip long long scris scrisa a n n baza baza b) b)
Prelucrarea Prelucrarea s sirurilor irurilor de de caractere caractere ( (String String..hh))::
char char ** str str[[nn]]cpy cpy ((char char **destinatie destinatie, , const char const char **sursa sursa [[, , unsigned unsigned nn]])) ;;
char char ** str str[[nn]]cat cat ((char char **destina destinattie ie const char const char **sursa sursa [[ unsigned unsigned nn]])) ;; char char str str[[nn]]cat cat ((char char destina destinattie ie, , const char const char sursa sursa [[, , unsigned unsigned nn]])) ;;
int int str str[[nn][ ][ii]]cmp cmp ((char char **ssir ir1, 1, const char const char **ssir ir2 2 [[, , unsigned unsigned nn]])) ;;
unsigned unsigned strlen strlen ((char char **ssir ir)) ;;
char char** strrev strrev (char (char **ssir ir)) ;;
char char** strstr strstr ((const char const char **sir sir, , const char const char **subsir subsir) ; ) ;
char char strrev strrev (char (char ssir ir)) ;;
char char** strtok strtok (char (char **ssir ir, , const char const char **sub subssir ir)) ;;
char char** strchr strchr (const char (const char **ssir ir, , int int car car)) ;;
68 68/80 /80
char char** strset strset (char (char **ssir ir, , int int car car)) ;;
Func Funct tii ii de de calcul calcul ( (math math..hh))::
Prototip Prototip Semnif. Semnif.
double double sin sin ((double double x x));; sin(x) sin(x)
double double log log ((double double x x));; ln(x) ln(x)
double double cos cos ((double double x x)); ; cos(x) cos(x)
double double asin asin ((double double x x)); ; Arcsin(x) Arcsin(x)
double double acos acos ((double double xx));; Arccos(x) Arccos(x)
gg (( ));; ( ) ( )
double double log log10 10 ((double double x x));; lg(x) lg(x)
double double ceil ceil ((double double x x));; [ [xx]]
double double acos acos ((double double xx));; Arccos(x) Arccos(x)
double double atan atan ((double double x x)); ; arctg(x) arctg(x)
double double sinh sinh ((double double x x));; sh(x) sh(x)
double double floor floor ((double double x x));; trunc trunc((xx))
double double fabs fabs ((double double x x)); ; | |xx| |
int int abs abs ((int int xx));; ** | |xx| |
double double cosh cosh ((double double x x)); ; ch(x) ch(x)
double double tanh tanh ((double double x x));; th th(x) (x)
double double sqrt sqrt ((double double x x));; xx
int int abs abs ((int int xx));; | |xx| |
long long labs labs ((long long x x));; ** | |xx| |
double double atan atan22 ((double double y,double y,double x x)); ; arctg(y/x) arctg(y/x)
double double exp exp ((double double x x)); ; ee
xx
double double pow pow ((double double x,double x,double y y));; x x
yy
double double cabs cabs ((struct struct complex complex z z)); ; | |zz| |
double double poly poly ((d bl d bl x int x int nn d bl d bl aa[]) []);; P(x) P(x)
69 69/80 /80
double double poly poly ((double double x,int x,int n, n,double double aa[]) []);; P(x) P(x)
Func Funct tii pentru controlul proceselor ii pentru controlul proceselor ((process process..hh))::
void void abort abort ((void void));; termin termina a un un program program la la eroare eroare
void void exit exit ((int int cod_retur cod_retur));; termin termina a un un program program cu cu un un cod cod de de retur retur
int int system system ((const const char char *comand *comandaa));; execut executaa oo cc--da da ssii ret ret cod retur cod retur ((00=Ok =Ok)) int int system system ((const const char char comand comandaa));; execut executaa oo cc da da ssii ret ret.. cod_retur cod_retur ((00 Ok Ok))..
Func Functtii pentru timp ii pentru timp ((dos dos hh)):: Func Functtii pentru timp ii pentru timp ((dos dos..hh))::
struct struct date date {{
int int da_year da_year;;
struct struct time time {{
unsigned unsigned char char ti_min ti_min;;
int int da_day da_day;;
int int da_mon da_mon;;
}}
unsigned unsigned char char ti_hour ti_hour;;
unsigned unsigned char char ti_hund ti_hund;;
unsigned unsigned char char ti_sec ti_sec;; }}
Cite Cites ste te Data Data curent curenta a :: void void getdate getdate ((struct struct date date *Data *Data));;
Modific Modifica a Data Data curent curenta a :: void void setdate setdate ((const const struct struct date date *Data *Data));;
Ci Ci OO EE id id ii (( ii *O E *O E ))
70 70/80 /80
Cite Citea ate te Ora Ora Exact Exacta a :: void void gettime gettime ((struct struct time time *OraExact *OraExacta a));;
Modific Modifica a Ora Ora Exact Exacta a :: void void settime settime ((const const struct struct time time * *OraExact OraExacta a));;
Ecranul n mod grafic Ecranul n mod grafic ( (graphics graphics..hh))::
void far void far initgraph initgraph ( ( int far int far *graphdriver, *graphdriver, int far int far *graphmode, *graphmode, char far char far *path) *path) ; ;
void void closegraph closegraph ((void void)) ;;
void far void far setbkcolor setbkcolor ((int int culf culf ) ; ) ;
void far void far setcolor setcolor ((int int culs culs ) ; ) ;
int far int far getbkcolor getbkcolor ((void void )) ;;
int far int far getcolor getcolor ((void void )) ; ;
Num Numa arr de de pixeli pixeli ( ( Oriz Oriz../Vert /Vert..))
getmaxx getmaxx () ();; getmaxy getmaxy () ();;
Coordonatele Coordonatele LPR LPR (Ult (Ult.. Pct Pct Ref Ref..) )
getx getx () ();; gety gety () ();;
Mut Mutaa LPR LPR (Abs (Abs../Rel /Rel..) )
moveto moveto ((xx,,yy)); ; moverel moverel ((dx dx,,dy dy));;
Traseaz Traseazaa segment segment din din LPR LPR
lineto lineto ((xx,,yy));; linerel linerel ((dx dx,,dy dy));;
Traseaza Traseaza segment segment
line line ((xx yy xx yy ));;
Traseaza Traseaza segment segment
line line ((xx
11
,,yy
11
,, xx
22
,,yy
22
));;
Deseneaza Deseneaza dreptunghi dreptunghi
rectangle rectangle ((xx
11
,,yy
11
,, xx
22
,,yy
22
));;
Deseneaza Deseneaza cerc cerc
circle circle ((x,y,r x,y,r));;
71 71/80 /80
Scrie Scrie mesaj mesaj [[ din din LPR LPR ]]
outtext outtext[[xy xy]] ([ ([xx,,yy,] ,] mesaj mesaj));;
Pagina Pagina activa activa / / Pagina Pagina vizuala vizuala
setactivepage setactivepage ((pag pag));; setvisualpage setvisualpage ((pag pag));;
3 3 Utilizarea fisierelor 3.3. Utilizarea fisierelor
Prelucrarea fisierelor se poate efectua la doua nivele:
Nivelul inferior - face apel direct la sistemul de operare; N f p p ;
Nivelul superior - utilizeaza proceduri speciale
pentru operatii de intrare/iesire. pentru operatii de intrare/iesire.
72 72/80 /80
a) a) Nivelul Nivelul inferior inferior a) a) Nivelul Nivelul inferior inferior
Deschiderea unui fisier (Open/Creat) :
int open ( const char * cale cale, int acces acces ) ;
unde:
cale cale - este specificatorul de fisier,
acces acces poate fi o combinatie (operatorul |) a urmatoarelor valori: acces 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;
73 73/80 /80
Lun = open (Fisier.Dat,O_RDONLY);
...
Citirea dintr-un fisier (Read) :
int read read ( int Lun, void *buffer, unsigned lung ) ;
Scrierea ntr-un fisier (Write) :
int write write ( int Lun, void *buffer, unsigned lung ) ;
Pozitionarea ntr-un fisier (LSeek) :
long lseek lseek ( int Lun, long depl., int orig.) ; // o=0,1,2
nchiderea fis. (Close) :
int close close ( int Lun) ;
74 74/80 /80
Stergerea fis. (UnLink) :
int unlink unlink (const char * cale) ;
// Creare \\
#include <io.h>
#include <fcntl h> #include <fcntl.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h> #include 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);
rite(L n "Al Doilea\n" 10); write(Lun,"Al Doilea\n",10);
}
else cout << " Open Incorect ! ";
close(Lun);
75 75/80 /80
close(Lun);
getchar();
}
// Citire \\
#include <io.h>
#include <fcntl.h>
#include <stdio h> #include <stdio.h>
#include <conio.h>
#include <iostream.h>
void main (void) 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);
t h ()
76 76/80 /80
getchar();
}
b) b) Nivelul Nivelul superior superior b) b) Nivelul Nivelul superior superior
Deschiderea unui fisier (FOpen ) :
FILE * fopen fopen ( const char * cale, const char * mod ) ;
unde:
mod mod - poate fi r pentru citire, w - scriere, a - adaugare,
r+ modificare (citire/scriere) rb citire binara r+ - modificare (citire/scriere), rb - citire binara,
wb - scriere binara, sau r+b - citire/scriere binara .
...
FILE * Pf;
77 77/80 /80
Pf = fopen (Fisier.Dat,w);
...
Prelucrarea pe caractere:
( * )
#i l d di h
int putc putc ( int c, FILE * Pf ) ;
int getc getc (FILE * Pf ) ;
#include <stdio.h>
void main (void)
{ int c;
while ((c=getc(stdin))!=EOF)
int fclose fclose ( FILE * Pf ) ;
while ((c=getc(stdin))!=EOF)
putc(c,stdout);
}
Citirea / scrierea cu format:
int fscanf fscanf ( FILE * Pf control lista var ) ; int fscanf fscanf ( FILE * Pf , control, lista_var. ) ;
int fprintf fprintf ( FILE * Pf , control, lista_expr.) ;
Intrari / iesiri de siruri de caractere :
char * fgets fgets ( char *s int n FILE * Pf ) ;
78 78/80 /80
char fgets fgets ( char s, int n, FILE Pf ) ;
int fputs fputs ( char *s, FILE * Pf ) ;
// Scriere Scriere cu cu Stream Stream--uri uri \\
#i l d < #i l d <f t h f t h>> #include < #include <fstream.h fstream.h>>

void main (void)


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

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

void main (void)


{
cmp1, cmp2, ;
ifstream ifstream f f(" ("Fiier.Txt Fiier.Txt"); "); // // sau sau ::
while ( while (ff >> cmp >> cmp11 >> cmp >> cmp22 )) // // while ( while ( !!f.eof() f.eof() )) while ( while (ff >> cmp >> cmp11 >> cmp >> cmp22 ) ) // // while ( while ( !!f.eof() f.eof() ))
// // if ( if ( f >> f >> cmp cmp11>>cmp >>cmp22) )
cout cout << << cmp cmp11<<' '<< cmp <<' '<< cmp22 << <<
f l f l () () f.close f.close(); ();

}
80 80/80 /80