Documente Academic
Documente Profesional
Documente Cultură
2011 2012
Cristian Gau
Mdlina Rschip
www.inoiasi.ro!"ap
Algoritmi i programare 2
#rgani$are
% &ector dr. Cristian Gau
e'mail( cgatu)ino.uaic.ro
ca*inet( C212 +corp C, parter-. tel( 02/2'201012
url( www.inoiasi.ro!"cgatu
consultaii( 3ineri, 10(00'12(00
% Asist. dr. Mdlina Rschip
e'mail( mionita)ino.uaic.ro
url( www.ino.uaic.ro!"mionita
INT_MAX
INT_MIN
LONG_MAX
LONG_MIN
Atenie la reprezentarea circular!
INT_MAX + 1 == INT_MIN
INT_MIN 1 == INT_MAX
LONG_MAX + 1 == LONG_MIN
LONG_MIN 1 == LONG_MAX
16 ii !" ii
1 2
31
15
2
31
2
1 2
31
1 2
63
31
2
63
2
Algoritmi i programare /1
Constante 6ntregi
% #ctale( au prei8ul 0 +$ero-
0/2 ? 22 0BB ? 2/
% Le8a$ecimale( au prei8ul 08 sau 0V
08/2 ? 00 08/D ? 2/
% Untregi OlongP( au sui8ul l sau &
211B1A/21B& 08a4Dl ? 11404
% Untregi OunsignedP au sui8ul u sau I
/10u 08u ? 200/0
% Caractere 6ntre apostro( WAX, WFX, WnX
% Caractere 6n $ecimal( 20, 12
% Caractere 6n octal( XY101X, WY02X
% Caractere 6n he8a$ecimal( WY811X, WY82AX
% Gotaii pentru caractere speciale( WYnX, WYtX, WYrX, WYYX, WYaX,WYXX,
WY0X, WYPX
Algoritmi i programare /2
Citiri, airi
citirea unui int
a#i$area unui int
citirea unui char
a#i$area unui char
printf(aI )
scanf(BdH Ca)
printf(aI )
scanf(BdH Ca)
int a > 1$
printf(a > BdH a)
int a > 1$
printf(a > BdH a)
printf(aI )
scanf(BcH Ca)
printf(aI )
scanf(BcH Ca)
char a > AaM
printf(a > BcH a)
char a > AaM
printf(a > BcH a)
Algoritmi i programare //
Constante ' e8emplu
=< N/emple de constante caracter <=
#include <stdio.h>
int main(){
char aH .H cH d
a > O'O . > 65 c > O\1$1O d > O\/41O
printf(PBc Bc Bc Bc\nPH aH .H cH d)
printf(PBc Bd Bo B/\nPH aH aH aH a)
return $
}
=< N/emple de constante caracter <=
#include <stdio.h>
int main(){
char aH .H cH d
a > O'O . > 65 c > O\1$1O d > O\/41O
printf(PBc Bc Bc Bc\nPH aH .H cH d)
printf(PBc Bd Bo B/\nPH aH aH aH a)
return $
}
' ' ' '
' 65 1$1 41
Algoritmi i programare /1
Codurile A;C::
#include <stdio.h>
int main (void){
short c
for(c > $ c <> 127 c::){
printf(Pcod 'S#QQI BdPHc)
printf(P caracterI Bc\nPHc)
}
return $
}
=< for(c>AaM c<>A0M c::) <=
#include <stdio.h>
int main (void){
short c
for(c > $ c <> 127 c::){
printf(Pcod 'S#QQI BdPHc)
printf(P caracterI Bc\nPHc)
}
return $
}
=< for(c>AaM c<>A0M c::) <=
Algoritmi i programare /0
Macrourile getchar+- i putchar+-
% ;unt deinite 6n 4stdio.h5
% Citire caracter de la tastatur
% ;criere caracter pe ecran
#include <stdio.h>
int main (void){
char c
Khile ((c>"etchar()) !> NRS)
{putchar(c) putchar(c)}
return $
}
#include <stdio.h>
int main (void){
char c
Khile ((c>"etchar()) !> NRS)
{putchar(c) putchar(c)}
return $
}
Sirul de intrareI 123456a.cd
va produce sirulI 112233445566aa..ccdd
Algoritmi i programare /2
#peraii. Duncii 6n *i*lioteci
% #peraii pentru tipurile 6ntregi(
: ; < = B >> !> < <> >
>> :: ;;
% Duncii(
cele de la tipul lotant
cele din *i*lioteca 4ct"*e.h56 tolo&er,
tou**er, isal*ha, isalnum, iscntrl, isdigit,
is7digit, islo&er, isu**er, isgra*h, is*rint,
is*unct, iss*ace
Algoritmi i programare /B
#peratorii FF i ''
% ;e aplic doar unei e8presii ce desemnea$
un o*iect din memorie +&'3alue-(
::5 ;;(&:1) ::i:: nu au sens
N/presie ::i i:: ;;i i;;
Taloare i:1 i i;1 i
i dupU evaluare i:1 i:1 i;1 i;1
Algoritmi i programare /A
<8emplu FF +tem-
#include <stdio.h>
int< f(int< a){
int . > 2
(<a) :> .
return a
}
int main (void){
int a > 5
(<f(Ca))::
printf(PBd \nPH a)
return $
}
#include <stdio.h>
int< f(int< a){
int . > 2
(<a) :> .
return a
}
int main (void){
int a > 5
(<f(Ca))::
printf(PBd \nPH a)
return $
}
Algoritmi i programare /4
=ipul lotant +real-
% )loat
Gumere reale 6n simpl preci$ie
si'eo).)loat/ ? 1
2 cire semniicati3e
% dou,le
Gumere reale 6n du*l preci$ie
si'eo).dou,le/ ? A
10 cire semniicati3e
38 37
10 ) ( abs 10
f
308 307
10 ) ( abs 10
f
Algoritmi i programare 10
=ipul lotant +real-
% long dou,le
Gumere reale 6n Oe8traP du*l preci$ie
si'eo).long dou,le/ ? 12
1A cire semniicati3e
% &imitele se gsesc 6n 4)loat.h5
% #peraii( : ; < = >> !> < <> > >>
4932 4931
10 ) ( abs 10
f
Algoritmi i programare 11
Constante reale
% Constantele reale sunt implicit dou,le
120.1/0 1.12<2 12/<'2 .10eF2 1/. .02
% 5entru a i )loat tre*uie sa ai* sui8ul sau D
.02 2/e1 10.01<'1D
% 5entru long dou,le tre*uie sa ai* sui8ul l sau &
12/.102eBA&
Algoritmi i programare 12
Citire, aiare
citirea unui float
a#i$area unui float
citirea unui double
a#i$area unui double
printf(/I )
scanf(BfH C/)
printf(/I )
scanf(BfH C/)
float pi > 3.14
printf(pi > BfH pi)
float pi > 3.14
printf(pi > BfH pi)
printf(/I )
scanf(BlfH C/)
printf(/I )
scanf(BlfH C/)
dou.le pi > 3.14V
printf(pi > BlfH pi)
dou.le pi > 3.14V
printf(pi > BlfH pi)
Algoritmi i programare 1/
Duncii
+6n *i*lioteca 4math.h5-
sin cos tan asin
acos atan sinh cosh
tanh e/p lo" lo"1$
poK sWrt ceil floor
fa.s lde/p fre/p modf
fmod
Algoritmi i programare 11
Itili$are t%pedef
Mecani%& prin care %e a%'ciaz un tip unui
i(enti#icat'r)
t%pedef char literaDmare
t%pedef short varsta
t%pedef unsi"ned lon" si0eDt
t%pedef char literaDmare
t%pedef short varsta
t%pedef unsi"ned lon" si0eDt
I(enti#icat'rul re%pecti* %e p'ate utiliza pentru
a (eclara *ariaile %au #uncii)
literaDmare uH v>AaM
varsta v1H v2
si0eDt dim
literaDmare uH v>AaM
varsta v1H v2
si0eDt dim
Algoritmi i programare 10
Kate *ooleene +logice-
% Gu e8ist un tip special pentru date logice
% Komeniul de 3alori( R)alse, trueT
% )alse ? 0
% true ? 1 dar i orice 6ntreg nenul
% #peraii( 8 CC 99 00 80
% Keclaraii posi*ile(
t%pedef enum {false > $H true > 1} .ool
.ool /H %
t%pedef enum {false > $H true > 1} .ool
.ool /H %
Algoritmi i programare 12
<8presii logice
expresie_relationala ((?
expr H expr | expr > expr
| expr H? expr | expr >? expr
| expr ?? expr | expr @? expr
expresie_logica ::=
@ expr
| expr ZZ expr
| expr CC expr
Algoritmi i programare 1B
Qaloarea e8presiilor relaionale
a;. a<. a>. a<>. a>>. a>>. a!>.
positiv $ 1 $ 1 $ 1
0ero $ $ 1 1 1 $
ne"ativ 1 $ 1 $ $ 1
Algoritmi i programare 1A
Qaloarea e8presiilor logice ZZ
e/p1 e/p2 e/p1 EE e/p2
<> $
nu se
evaluea0U
1
> $ se evaluea0U
1 dacU e/p2 <> $
$ dacU e/p2 > $
Algoritmi i programare 14
Qaloarea e8presiilor logice CC
e/p1 e/p2 e/p1 CC e/p2
> $
nu se
evaluea0U
$
<> $ se evaluea0U
1 dacU e/p2 <> $
$ dacU e/p2 > $
Algoritmi i programare 00
<8emple
% # condiie de orma a [ 8 [ * se scrie 6n
lim*a9ul C(
(/ >> a) CC (/ <> .) (/ >> a) CC (/ <> .) (a <> /) CC (/ <> .) (a <> /) CC (/ <> .)
% # condiie de orma a > 8 sau 8 > * se
scrie 6n lim*a9ul C(
(/ < a) EE (/ > .) (/ < a) EE (/ > .) !(/ >> a CC / <> .) !(/ >> a CC / <> .)
Algoritmi i programare 01
#peratorul condiional \(
exp1 : exp2 6 exp3
% ;e e3aluea$ exp1
% Kac exp1 are 3aloare true +nenul- atunci
3aloarea e8presiei este 3aloarea lui exp2. exp3 nu
se e3aluea$
% Kac exp1 are 3aloare alse +nul- atunci 3aloarea
e8presiei este 3aloarea lui exp3. exp2 nu se
e3aluea$
% #peratorul :6 este drept asociati3
Algoritmi i programare 02
#peratorul condiional \(
<8emple
/ >> $ J / I %
/ > % J / I %
/ > % J / > 0 J / I 0 I % > 0 J % I 0
/ >> $ J / I %
/ > % J / I %
/ > % J / > 0 J / I 0 I % > 0 J % I 0
#include <stdio.h>
int main(void){
int a>1H .>2H c>3
int /H %H 0
/ > aJ.IcJaI.
% > (aJ.Ic)JaI. =< asociere stan"a <=
0 > aJ.I(cJaI.) =< asociere dreapta <=
printf(P/ > BdH % > BdH 0 > Bd\nPH /H %H 0)
}
=< / > 2H % > 1H 0 > 2 <=
#include <stdio.h>
int main(void){
int a>1H .>2H c>3
int /H %H 0
/ > aJ.IcJaI.
% > (aJ.Ic)JaI. =< asociere stan"a <=
0 > aJ.I(cJaI.) =< asociere dreapta <=
printf(P/ > BdH % > BdH 0 > Bd\nPH /H %H 0)
}
=< / > 2H % > 1H 0 > 2 <=
Algoritmi i programare 0/
#peratorul ? +<8presia de atri*uire-
exp1 0 exp2
% exp1 este o O&'3alueP +o*iect din memorie( 3aria*il,
3aria*il ta*lou cu indici, etc.-
% =ipul e8presiei este tipul lui exp1
% ;e e3aluea$ exp2, apoi exp1 capat 3aloarea lui exp2,
e3entual con3ertit
% Aadar, operatorul ? modiic 3aloarea operandului stang
% Qaloarea e8presiei este 3aloarea lui exp1 dup e3aluare
% #peratorul ? este drept asociati3
Algoritmi i programare 01
#peratorul ? +<8emple-
/ > sWrt(9)
a > ( . > 2 ) : ( c > 3 )
a > . > c > $ =< echivalenta cu <=
a > (. > (c > $))
Khile((c > "etchar()) !> NRS) putchar(c)
/ > sWrt(9)
a > ( . > 2 ) : ( c > 3 )
a > . > c > $ =< echivalenta cu <=
a > (. > (c > $))
Khile((c > "etchar()) !> NRS) putchar(c)
Nu c'n#un(ai e1 = e2 cu e1 == e2 !
a > $
if ( a >> $ ) printf(nul)
else printf(nenul) =< nul <=
if ( a > $) printf(nul)
else printf(nenul) =< nenul <=
a > $
if ( a >> $ ) printf(nul)
else printf(nenul) =< nul <=
if ( a > $) printf(nul)
else printf(nenul) =< nenul <=
Algoritmi i programare 00
#peratori de atri*uire compus
# e8presie de atri*uire compus are orma(
exp1 op0 exp2
unde op? este unul din(
:> ;> <> => B> C> E> F> >>> <<>
<8presia este echi3alent cu
exp1 0 exp1 op .exp2/
cu preci$area c exp1 se e3aluea$ o singur dat.
L <> & : 3 =< echivalentU cuI <=
L > L < (& : 3)
L <> & > m : 5 =< echivalentU cuI <=
L > (L < (& > (m : 5)))
L <> & : 3 =< echivalentU cuI <=
L > L < (& : 3)
L <> & > m : 5 =< echivalentU cuI <=
L > (L < (& > (m : 5)))
Algoritmi i programare 02
#peratorul 3irgul ,
expresia_irgula ((? expresie, expresie
% ;e e3aluea$ prima e8presie apoi cea de'a doua.
% Qaloarea i tipul 6ntregii e8presii este 3aloarea i tipul
operandului drept.
% #peratorul 3irgul are cea mai mic preceden.
a > 1H . > 2
i > 1H L > 2H ::& : 1
& !> 1H ::/ < 2.$ : 1
for(suma > $H i > 1 i <> n suma :> iH ::i)
a > 1H . > 2
i > 1H L > 2H ::& : 1
& !> 1H ::/ < 2.$ : 1
for(suma > $H i > 1 i <> n suma :> iH ::i)
Algoritmi i programare 0B
=ipul 3oid
% Con3ersia 6n tip void a unei e8presii semniic
aptul c 3aloarea sa este ignorat
% Itili$at pentru tipul pointer. nu se ace controlul
tipului la un pointer de tip void
% Itili$at pentru uncii r 3aloare returnat sau
pentru uncii r parametri
% <ste un tip incomplet ce nu poate i completat
Algoritmi i programare 0A
#peratorul si0eof()
% #perator unar ce permite gsirea numrului
de octei pe care se repre$int un o*iect
+tip,e8presie-
si0eof(int)H si0eof(dou.le)
si0eof(.<.;4<a<c)H si0eof(i)
si0eof(int)H si0eof(dou.le)
si0eof(.<.;4<a<c)H si0eof(i)
si0eof(char)<>si0eof(short)<>si0eof(int)<>si0eof(lon")
si0eof(si"ned) > si0eof(unsi"ned) > si0eof(int)
si0eof(float)<>si0eof(dou.le)<>si0eof(lon" dou.le)
Algoritmi i programare 04
#peratorul si0eof()
#include <stdio.h>
int main(void){
int / > 1 dou.le % > 9 lon" 0 > $
printf(PRperatorul si0eof()\n\n\nP)
printf(Psi0eof(char) > B2u\nPHsi0eof(char))
printf(Psi0eof(int) > B2u\nPHsi0eof(int))
printf(Psi0eof(short) > B2u\nPHsi0eof(short))
printf(Psi0eof(lon") > B2u\nPHsi0eof(lon"))
printf(Psi0eof(float) > B2u\nPHsi0eof(float))
printf(Psi0eof(dou.le) > B2u\nPHsi0eof(dou.le))
printf(Psi0eof(lon" dou.le) > B2u\nPHsi0eof(lon" dou.le))
printf(Psi0eof(/ :% : 0) > B2u\nPHsi0eof(/:%:0))
return $
}
#include <stdio.h>
int main(void){
int / > 1 dou.le % > 9 lon" 0 > $
printf(PRperatorul si0eof()\n\n\nP)
printf(Psi0eof(char) > B2u\nPHsi0eof(char))
printf(Psi0eof(int) > B2u\nPHsi0eof(int))
printf(Psi0eof(short) > B2u\nPHsi0eof(short))
printf(Psi0eof(lon") > B2u\nPHsi0eof(lon"))
printf(Psi0eof(float) > B2u\nPHsi0eof(float))
printf(Psi0eof(dou.le) > B2u\nPHsi0eof(dou.le))
printf(Psi0eof(lon" dou.le) > B2u\nPHsi0eof(lon" dou.le))
printf(Psi0eof(/ :% : 0) > B2u\nPHsi0eof(/:%:0))
return $
}
Algoritmi i programare 20
#peratorul si0eof()
Re$ultatul e8ecutiei Qisual CFF(
si0eof(char) > 1
si0eof(int) > 4
si0eof(short) > 2
si0eof(lon") > 4
si0eof(float) > 4
si0eof(dou.le) > 8
si0eof(lon" dou.le) > 8
si0eof(/ : % : 0) > 8
Algoritmi i programare 21
5recedena operatorilor
;*eratori !sociere
() :: ;; (postfix) stXn"a
:: ;; (prefix) ! C (adresa)
< (deref) : ; (unari) si0eof()
dreapta
< = B stXn"a
: ; stXn"a
< <> > >> stXn"a
>> !> stXn"a
CC stXn"a
EE
stXn"a
JI dreapta
> :> ;> <> => B> dreapta
H (operatorul vir"ula)
stXn"a
Algoritmi i programare 22
Compati*ilitatea tipurilor predeinite
% =oate tipurile aritmetice +caractere, 6ntregi,
reale- sunt compati*ile 6ntre ele.
compilatorul admite orice com*inaie de
o*iecte de di3erse tipuri 6ntr'o e8presie
% &a e3aluarea unei e8presii 6n care apar tipuri
dierite compilatorul ace con3ersii implicite
Algoritmi i programare 2/
Reguli pentru con3ersia implicit
% Un a*sena unui unsi"ned o*iectele se con3ertesc
la tipul cel mai O6naltP 6n ordinea +descrescatoare-(
lon" dou.leH dou.leH floatH lon" intH int
% Regulile pentru operan$ii unsi"ned depind de
implementare.
% Con3ersia la unsi"ned se ace doar 6n ca$ de
necesitate +de e8. 3aloarea din unsi"ned nu
O6ncapeP 6n cellat operand-.
Algoritmi i programare 21
Reguli pentru con3ersia implicit
% Regula Ointeger promotionP ( operaiile se ac cel
puin 6n int, deci char i short sunt Opromo3aiP la
int.
% &a o asignare +3 ? e8p- tipul mem*rului drept se
con3ertete la tipul mem*rului st7ng +care este i
tipul re$ultatului-.
A=<G]:<( se pot produce
% 5ierderea preci$iei +dou.le float lon" int-
% 5ierderea unor *ii semniicati3i +lon" int-
% Gedeterminri
Algoritmi i programare 20
<8emplu
#include <stdio.h>
int main(void){
char c1 > ;126H c2 =< c1 > 1$$$$$1$ <=
unsi"ned char c3H c4 > 255 =< c4 > 111111111 <=
short s1H s2 > ;32767 =< s2>1$$$$$$$ $$$$$$$1 <=
short s3 > ;1H s4 =< s3 > 11111111 11111111 <=
s1 > c1
printf(Pc1 > BdH s1 > Bd\nPH c1H s1)
c2 > s2
printf(Pc2 > BdH s2 > Bd\nPH c2H s2)
c3 > s3
printf(Pc3 > BdH s3 > Bd\nPH c3H s3)
s4 > c4
printf(Pc4 > BdH s4 > Bd\nPH c4H s4)
return $
}
#include <stdio.h>
int main(void){
char c1 > ;126H c2 =< c1 > 1$$$$$1$ <=
unsi"ned char c3H c4 > 255 =< c4 > 111111111 <=
short s1H s2 > ;32767 =< s2>1$$$$$$$ $$$$$$$1 <=
short s3 > ;1H s4 =< s3 > 11111111 11111111 <=
s1 > c1
printf(Pc1 > BdH s1 > Bd\nPH c1H s1)
c2 > s2
printf(Pc2 > BdH s2 > Bd\nPH c2H s2)
c3 > s3
printf(Pc3 > BdH s3 > Bd\nPH c3H s3)
s4 > c4
printf(Pc4 > BdH s4 > Bd\nPH c4H s4)
return $
}
Algoritmi i programare 22
<8emplu +re$ultatul e8ecuiei-
c1 > 1$$$$$1$ s1 > c1
c1 > ;126H s1 > ;126
s2>1$$$$$$$ $$$$$$$1 c2 > s2
c2 > 1H s2 > ;32767
s3 > 11111111 11111111 c3 > s3
c3 > 255H s3 > ;1
c4 > 111111111 s4 > c4
c4 > 255H s4 > 255
Algoritmi i programare 2B
Dorarea tipului ' cast
% Con3ersia e8plicit la tipul numetip(
.numetip/ expresie
% <8emple(
(lon")(A'M : 1.$)
(int)(.<.;4<a<c)
(dou.le)(/:%)=0
(float)/<%=0
/ = (float)2
(lon")(A'M : 1.$)
(int)(.<.;4<a<c)
(dou.le)(/:%)=0
(float)/<%=0
/ = (float)2
Algoritmi i programare 2A
<8emplu cast
#include <stdio.h>
int main(void){
int iH L dou.le /H %H 0H t
i > 5=2 / > 5=2 % > (dou.le)(5=2)
L > (dou.le)5=2 0 > (dou.le)5=2
t > 5.=2
printf(BdH B"H B"H BdH B"H B"\nH
iH /H %H LH 0H t)
return $
}
=< 2H 2H 2H 2H 2.5H 2.5 <=
#include <stdio.h>
int main(void){
int iH L dou.le /H %H 0H t
i > 5=2 / > 5=2 % > (dou.le)(5=2)
L > (dou.le)5=2 0 > (dou.le)5=2
t > 5.=2
printf(BdH B"H B"H BdH B"H B"\nH
iH /H %H LH 0H t)
return $
}
=< 2H 2H 2H 2H 2.5H 2.5 <=
Algoritmi i programare 24
Diiere 6n *i*liotec relati3e la tipuri
% 4limits.h5 ' pentru tipurile 6ntregi
Untregul min!ma8( :G=^M:G, :G=^MAV
Gumrul de *ii pe caracter CLAR^J:=
<tc.
% 4)loat.h5 ' pentru tipurile lotante(
<8ponentul ma8im
5reci$ia $ecimal, etc.
% 4stdli,.h5 ' conine uncii de con3ersie(
_ir de caractere 6n intI atoi(const char<)
_ir de caractere 6n floatIatof(const char<)