Sunteți pe pagina 1din 69

Algoritmi i programare

2011 2012

Cristian Gau
Mdlina Rschip
www.infoiasi.ro/~ap

Organizare
Lector dr. Cristian Gau
e-mail: cgatu@info.uaic.ro
cabinet: C212 (corp C, parter); tel: 0232-201546
url: www.infoiasi.ro/~cgatu
consultaii: vineri, 10:00-12:00

Asist. dr. Mdlina Rschip

e-mail: mionita@info.uaic.ro
cabinet: C416 ; tel: 0232-202469
url: www.info.uaic.ro/~mionita
consultaii: luni, 10:00-12:00

Algoritmi i programare

Pagina cursului
www.info.uaic.ro/~ap

Algoritmi i programare

Obiective
Algoritmi
nsuirea unei gndiri algoritmice
dezvoltarea abilitilor de proiectare de soluii
algoritmice
nsuirea tehnicilor de utilizare a principalelor
structuri de date
evaluarea timpului de execuie n cazul cel mai
nefavorabil

Programare
iniiere n utilizarea unui limbaj de programare
implementarea principalelor structuri de date
nsuirea tehnicilor de baz n proiectarea
programelor

Algoritmi i programare

Coninutul disciplinei
Algoritmi
limbaj algoritmic, tablouri, structuri statice,
structuri nlnuite
liste liniare
arbori binari, heap-uri, union-find
grafuri (ca structuri de date)
sortare, cutare
paradigme

Programare
prezentarea graduat a limbajului C (ISO
Standard) cu accent pe implementarea
structurilor de date i a soluiilor prezentate n
partea de algoritmic

Algoritmi i programare

Evaluare

condiii:
activitatea la laborator (AL)
testele scrise (TS)

criterii de promovare:
numr de teme de laborator: 5
AL >= 6, TS >= 4

forme:
AL
fiecare tem de laborator va fi punctat (note 1-10)
ntrebri, participare la discuii, soluii originale (bonus!)

TS:
2 teste scrise (spt. 8, 16), fiecare test coninnd 8 ntrebri de tip
gril i o problem

Algoritmi i programare

Evaluare
normele ECTS (European Credit Transfer System)
Punctaj Final (PF) = 50% AL +50% TS
Nota final:
<= 4 dac sunt ndeplinite condiiile i NU sunt
ndeplinite criteriile de promovare,
= 10 dac PF este n primii 5% din cei promovai (A)
= 9 urmtorii 10% din cei promovai (B)
= 8 urmtorii 20% din cei promovai (C)
= 7 urmtorii 30% din cei promovai (D)
= 6 urmtorii 25% din cei promovai (E)
= 5 ultimii 10% din cei promovai

Algoritmi i programare

Bibliografie
D. Lucanu, M. Craus: Proiectarea algoritmilor,
Polirom, 2008.
T.H. Cormen, C.E. Leiserson, R.L. Rivest:
Introducere in algoritmi, Libris Agora, 2000.
L. Livovschi, H. Georgescu: Sinteza si analiza
algoritmilor, Ed. Stiintifica si enciclopedica, 1986.
H. Schildt: C Manual complet, Teora, 1998.
B.W. Kernighan, D.M. Ritchie: The C Programming
Language, 2nd edition, Prentice Hall, 1988
A. Kelley, I. Pohl: A book on C: Programming in C,
4th edition, Addison Wesley, 1998
Algoritmi i programare

Curs 1
limbaj algoritmic
modelarea memoriei
tipuri de date elementare
(cu prezentarea elementelor de
limbaj C corespunztoare)
Algoritmi i programare

Algoritmi, limbaj algoritmic


Problem, Soluie
Algoritm: o secven finit de pai aranjat ntr-o
ordine logic specific, cu proprietatea c, atunci
cnd este executat, produce o soluie pentru o
problem dat.
Exemplu: reeta culinar
Algoritm calculator (computer algorithm) = un
algoritm pentru care secvena de pai este
executat de un calculator
Limbaj Algoritmic = un limbaj folosit pentru
descrierea algoritmilor
Etimologie: Muhammad ibn Musa al-Khwarizmi
Algoritmi i programare

10

Algoritmi - proprieti
intrare (input) zero sau mai multe entiti de
date furnizate din exterior
ieire (output) algoritmul produce informaie
terminare pentru orice intrare, algoritmul
execut un numr finit de pai
corectitudine algoritmul se termin i produce
ieirea corect pentru orice intrare. Spunem c
algoritmul rezolv problema dat.
Algoritmi i programare

12

Primul program C

void main(){}

You dont have to know every detail of C++ to write


good programs. (B. Stroustrup)
Algoritmi i programare

13

Primul program C
/*
* first program in C
*/
#include <stdio.h>
int main(void)
{
printf(Salut!\n);
printf(Primul program C!);
return (0);
}

Algoritmi i programare

14

Primul program C
/*
* first program in C
*/
#include <stdio.h>
int main(void)
{
printf(Salut!\n);
printf(Primul program C!);
return (0);
}

Algoritmi i programare

15

Primul program C
OUTPUT:
Salut!
Primul program C!Press any key to continue

Algoritmi i programare

16

Caracterele limbajului C
Litere:
A B C D X Y Z
a b
c d x y z
Cifre:
0 1 2 3 4 5 6 7 8 9
Alte caractere:
+ - * / = ( ) { } [ ] < > !
# % & _ |^ ~ \ . , ; : ?
Caractere spaiu: blank, newline, tab, etc.
Algoritmi i programare

17

Cuvintele cheie (rezervate)


auto
const
double
extern
float
inline
register
restrict
sizeof
typedef
volatile

break
continue
else

case
default
do
enum

char

for
int

goto
long

if

return
static
union
while

short
struct
unsigned

Algoritmi i programare

signed
switch
void

18

Limbaj algoritmic
modelarea memoriei
tipuri de date elementare
instruciuni
tipuri de date structurate de nivel jos
calcul
timp de execuie

Algoritmi i programare

19

Variabil
Nume
Adres
Atribute (tip de date asociat valorilor
memorate)
x

int

adr

Instan a variabilei
Algoritmi i programare

20

Memoria
Structur liniar de celule
Variabile
adr
x

int

Pointeri

adr

adr
p

int*
*p

Algoritmi i programare

int
21

Tip de date
Domeniul tipului (colecia de obiecte)
Operaiile tipului
Categorii de tipuri de date:
Tipuri de date elementare
Tipuri de date structurate de nivel jos
Operaiile la nivel de component

Tipuri de date de nivel nalt


Operaiile implementate de algoritmi utilizator

Algoritmi i programare

22

Tip de date
O valoare memorat sau returnat de o funcie este
determinat de tipul expresiei utilizate pentru a o
accesa (un identificator cel mai simplu exemplu
de expresie are tipul specificat n declaraia sa)
Tipuri
obiect: descriu valori
funcie: descriu funcii
incomplete: descriu obiecte dar pentru determinarea
dimensiunii lor mai trebuiesc informaii

Algoritmi i programare

23

Tipuri standard
Tipul char
Tipurile standard ntregi:
5 tipuri ntregi cu semn: signed char, short int,
int, long int i long long int.
5 tipuri ntregi fr semn: desemnate de cuvntul
unsigned (tipuri ce ocup aceeai cantitate de
memorie)

Tipuri reale flotante:


float, double i long double.

Algoritmi i programare

24

Echivalene
signed short int
unsigned short int
signed int
unsigned int
signed long int
unsigned long int

Algoritmi i programare

short
unsigned short
int
unsigned
long
unsigned long

25

Declaraii
Forma unei declaraii:
tip variabila;
tip var1, var2, , varn;
tip variabila = expresie_constanta;

Variabile globale: declararea lor se face n afara


oricrei funcii.
Variabile locale: declararea se face n corpul funciei.
char c;
signed char sc;

Algoritmi i programare

int i;
int suma = 0;
long j;

float x1, x2, x3;


float pi = 3.14;
double y;
26

Tipul ntreg
int
sizeof(int) = 2 sau 4 octei

short int sau short


sizeof(short)=2, {-32768, , 32767}

long int sau long


sizeof(long)=4
{-2 147 483 648, , 2 147 483 647}

signed int, signed short int, signed long


int
Algoritmi i programare

27

ntregi fr semn
unsigned int
unsigned short int
{0, , 65535}

unsigned long int


Nu exist overflow (depire) calculul se
efectueaz modulo 2n, unde n este numrul
de bii

Algoritmi i programare

28

ntregi foarte scuri: char


Tipul char este o submulime a tipului int
char reprezint, n funcie de main,
domeniul de valori:
{-128, , 127} sau {0, , 255}

unsigned char {0, , 255}


signed char {-128, , 127}
sizeof(char) = 1

Algoritmi i programare

29

Constante ntregi n <limits.h>


INT_MAX
INT_MIN
LONG_MAX
LONG_MIN

16 bii

32 bii

215 1

231 1

215
231 1
231

231
263 1
263

Atenie la reprezentarea circular!


INT_MAX + 1 == INT_MIN
INT_MIN 1 == INT_MAX
LONG_MAX + 1 == LONG_MIN
LONG_MIN 1 == LONG_MAX
Algoritmi i programare

30

Constante ntregi
Octale: au prefixul 0 (zero)
032 = 26
077 = 63
Hexazecimale: au prefixul 0x sau 0X
0x32 = 50
0x3F = 63
ntregi long: au sufixul l sau L
2147483647L
0xaf9Fl = 44959
ntregi unsigned au sufixul u sau U
345u 0xffffu = 65535
Caractere ntre apostrof: A, +, n
Caractere n zecimal: 65, 42
Caractere n octal: \101, \52
Caractere n hexazecimal: \x41, \x2A
Notaii pentru caractere speciale: \n, \t, \r, \\, \a,\,
\0, \
Algoritmi i programare

31

Citiri, afiri
citirea unui int

printf(a: );
scanf(%d, &a);

afiarea unui int

int a = 10;
printf(a = %d, a);

citirea unui char

printf(a: );
scanf(%c, &a);

afiarea unui char

Algoritmi i programare

char a = a;
printf(a = %c, a);

32

Constante - exemplu
/* Exemple de constante caracter */
#include <stdio.h>
int main(){
char a, b, c, d;
a = 'A'; b = 65; c = '\101'; d = '\x41';
printf("%c %c %c %c\n", a, b, c, d);
printf("%c %d %o %x\n", a, a, a, a);
return 0;
}
A A A A
A 65 101 41
Algoritmi i programare

33

Codurile ASCII
#include <stdio.h>
int main (void){
short c;
for(c = 0; c <= 127; c++){
printf("cod ASCII: %d",c);
printf(" caracter: %c\n",c);
}
return 0;
}
/* for(c=a; c<=z; c++) */

Algoritmi i programare

34

Macrourile getchar() i putchar()


Sunt definite n <stdio.h>
Citire caracter de la tastatur
Scriere caracter pe ecran
#include <stdio.h>
int main (void){
char c;
while ((c=getchar()) != EOF)
{putchar(c); putchar(c);}
return 0;
}
Sirul de intrare: 123456abcd
va produce sirul: 112233445566aabbccdd
Algoritmi i programare

35

Operaii; Funcii n biblioteci


Operaii pentru tipurile ntregi:
+ - * /
>= ++ - Funcii:

==

!=

<

<=

>

cele de la tipul flotant


cele din biblioteca <ctype.h>: tolower,
toupper, isalpha, isalnum, iscntrl, isdigit,
isxdigit, islower, isupper, isgraph, isprint,
ispunct, isspace

Algoritmi i programare

36

Operatorii ++ i - Se aplic doar unei expresii ce desemneaz


un obiect din memorie (L-value):
Expresie

++i i++ --i i--

Valoare

i+1 i

i-1 i

i dup evaluare i+1 i+1 i-1 i-1


++5

--(k+1)

Algoritmi i programare

++i++

nu au sens

37

Exemplu ++ (tem)
#include <stdio.h>
int* f(int* a){
int b = 2;
(*a) += b;
return a;
}
int main (void){
int a = 5;
(*f(&a))++;
printf("%d \n", a);
return 0;
}
Algoritmi i programare

38

Tipul flotant (real)


float
Numere reale n simpl precizie
sizeof(float) = 4
10 37 abs( f ) 1038
6 cifre semnificative

double
Numere reale n dubl precizie
sizeof(double) = 8
10 307 abs( f ) 10308
15 cifre semnificative
Algoritmi i programare

39

Tipul flotant (real)


long double

Numere reale n extra dubl precizie


sizeof(long double) = 12
10 4931 abs( f ) 10 4932
18 cifre semnificative
Limitele se gsesc n <float.h>
Operaii:

Algoritmi i programare

/ ==

!=

<

<=

>

>=
40

Constante reale
Constantele reale sunt implicit double
125.435

1.12E2

123E-2

.45e+6

13.

.56

Pentru a fi float trebuie sa aib sufixul f sau F


.56f

23e4f

45.54E-1F

Pentru long double trebuie sa aib sufixul l sau L


123.456e78L

Algoritmi i programare

41

Citire, afiare
citirea unui float

printf(x: );
scanf(%f, &x);

afiarea unui float

float pi = 3.14;
printf(pi = %f, pi);

citirea unui double

printf(x: );
scanf(%lf, &x);

afiarea unui double

Algoritmi i programare

double pi = 3.14L;
printf(pi = %lf, pi);

42

Funcii
(n biblioteca <math.h>)
sin
acos
tanh
pow
fabs
fmod

cos
atan
exp
sqrt
ldexp

Algoritmi i programare

tan
sinh
log
ceil
frexp

asin
cosh
log10
floor
modf

43

Utilizare typedef
Mecanism prin care se asociaz un tip unui
identificator:
typedef char litera_mare;
typedef short varsta;
typedef unsigned long size_t;

Identificatorul respectiv se poate utiliza pentru


a declara variabile sau funcii:
litera_mare u, v=a;
varsta v1, v2;
size_t dim;
Algoritmi i programare

44

Date booleene (logice)

Nu exist un tip special pentru date logice


Domeniul de valori: {false, true}
false = 0
true = 1 dar i orice ntreg nenul
Operaii:
!
&&
||
==
!=
Declaraii posibile:
typedef enum {false = 0, true = 1} bool;
bool x, y;

Algoritmi i programare

45

Expresii logice
expresie_relationala ::=
expr < expr | expr > expr
| expr <= expr | expr >= expr
| expr == expr | expr != expr
expresie_logica ::=
! expr
| expr || expr
| expr && expr

Algoritmi i programare

46

Valoarea expresiilor relaionale


a-b

a<b a>b

a<=b

a>=b

a==b a!=b

positiv 0

zero

negativ 1

Algoritmi i programare

47

Valoarea expresiilor logice ||


exp1

exp2

exp1 || exp2

<> 0

nu se
evalueaz

se evalueaz

1 dac exp2 <> 0


0 dac exp2 = 0

= 0

Algoritmi i programare

48

Valoarea expresiilor logice &&


exp1

exp2

exp1 && exp2

= 0

nu se
evalueaz

se evalueaz

1 dac exp2 <> 0


0 dac exp2 = 0

<> 0

Algoritmi i programare

49

Exemple
O condiie de forma a x b se scrie n
limbajul C:
(x >= a) && (x <= b)

(a <= x) && (x <= b)

O condiie de forma a > x sau x > b se


scrie n limbajul C:
(x < a) || (x > b)
Algoritmi i programare

!(x >= a && x <= b)


50

Operatorul condiional ?:
exp1 ? exp2 : exp3
Se evalueaz exp1
Dac exp1 are valoare true (nenul) atunci
valoarea expresiei este valoarea lui exp2; exp3 nu
se evalueaz
Dac exp1 are valoare false (nul) atunci valoarea
expresiei este valoarea lui exp3; exp2 nu se
evalueaz
Operatorul ?: este drept asociativ
Algoritmi i programare

51

Operatorul condiional ?:
Exemple
x
x
x

>= 0 ? x : y
> y ? x : y
> y ? x > z ? x : z : y > z ? y : z

#include <stdio.h>
int main(void){
int a=1, b=2, c=3;
int x, y, z;
x = a?b:c?a:b;
y = (a?b:c)?a:b; /*
z = a?b:(c?a:b); /*
printf("x = %d, y =
}
/* x = 2, y = 1, z = 2
Algoritmi i programare

asociere stanga */
asociere dreapta */
%d, z = %d\n", x, y, z);
*/
52

Operatorul = (Expresia de atribuire)


exp1 = exp2
exp1 este o L-value (obiect din memorie: variabil,
variabil tablou cu indici, etc.)
Tipul expresiei este tipul lui exp1
Se evalueaz exp2, apoi exp1 capat valoarea lui exp2,
eventual convertit
Aadar, operatorul = modific valoarea operandului stang
Valoarea expresiei este valoarea lui exp1 dup evaluare
Operatorul = este drept asociativ

Algoritmi i programare

53

Operatorul = (Exemple)
x = sqrt(9);
a = ( b = 2 ) + ( c = 3 );
a = b = c = 0; /* echivalenta
a = (b = (c = 0));
while((c = getchar()) != EOF)

cu */
putchar(c);

Nu confundai e1 = e2 cu e1 == e2 !
a = 0;
if ( a == 0 ) printf(nul);
else printf(nenul); /* nul */
if ( a = 0) printf(nul);
else printf(nenul); /* nenul */
Algoritmi i programare

54

Operatori de atribuire compus


O expresie de atribuire compus are forma:

exp1 op= exp2

unde op= este unul din:

+=

-=

*=

/=

%=

&=

|=

^=

>>=

<<=

Expresia este echivalent cu

exp1 = exp1 op (exp2)

cu precizarea c exp1 se evalueaz o singur dat.


j *= k + 3;
j = j * (k + 3);

/* echivalent cu: */

j *= k = m + 5;
/* echivalent cu: */
j = (j * (k = (m + 5)));
Algoritmi i programare

55

Operatorul virgul ,
expresia_virgula ::= expresie, expresie
Se evalueaz prima expresie apoi cea de-a doua.
Valoarea i tipul ntregii expresii este valoarea i tipul
operandului drept.
Operatorul virgul are cea mai mic preceden.
a = 1, b = 2;
i = 1, j = 2, ++k + 1;
k != 1, ++x * 2.0 + 1;
for(suma = 0, i = 1; i <= n; suma += i, ++i);
Algoritmi i programare

56

Tipul void
Conversia n tip void a unei expresii semnific
faptul c valoarea sa este ignorat
Utilizat pentru tipul pointer; nu se face controlul
tipului la un pointer de tip void
Utilizat pentru funcii fr valoare returnat sau
pentru funcii fr parametri
Este un tip incomplet ce nu poate fi completat
Algoritmi i programare

57

Operatorul sizeof()
Operator unar ce permite gsirea numrului
de octei pe care se reprezint un obiect
(tip,expresie)
sizeof(int),
sizeof(b*b-4*a*c),

sizeof(double);
sizeof(i);

sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
sizeof(signed) = sizeof(unsigned) = sizeof(int)
sizeof(float)<=sizeof(double)<=sizeof(long double)

Algoritmi i programare

58

Operatorul sizeof()
#include <stdio.h>
int main(void){
int x = 1; double y = 9; long z = 0;
printf("Operatorul sizeof()\n\n\n");
printf("sizeof(char) = %2u\n",sizeof(char));
printf("sizeof(int) = %2u\n",sizeof(int));
printf("sizeof(short) = %2u\n",sizeof(short));
printf("sizeof(long) = %2u\n",sizeof(long));
printf("sizeof(float) = %2u\n",sizeof(float));
printf("sizeof(double) = %2u\n",sizeof(double));
printf("sizeof(long double) = %2u\n",sizeof(long double));
printf("sizeof(x +y + z) = %2u\n",sizeof(x+y+z));
return 0;
}

Algoritmi i programare

59

Operatorul sizeof()
Rezultatul executiei Visual C++:
sizeof(char)
=
sizeof(int)
=
sizeof(short)
=
sizeof(long)
=
sizeof(float)
=
sizeof(double)
=
sizeof(long double)
sizeof(x + y + z)

Algoritmi i programare

1
4
2
4
4
8
= 8
= 8

60

Precedena operatorilor
Operatori

Asociere

()

stnga

++

-- (postfix)

dreapta

++ -- (prefix) ! & (adresa)


* (deref) + - (unari) sizeof()
*

<

<=

==

stnga

stnga
>

stnga

>=

stnga

!=

&&

stnga

||

stnga
dreapta

?:
=

+=

-=

*=

/=

, (operatorul virgula)
Algoritmi i programare

dreapta

%=
stnga

61

Compatibilitatea tipurilor predefinite


Toate tipurile aritmetice (caractere, ntregi,
reale) sunt compatibile ntre ele;
compilatorul admite orice combinaie de
obiecte de diverse tipuri ntr-o expresie
La evaluarea unei expresii n care apar tipuri
diferite compilatorul face conversii implicite

Algoritmi i programare

62

Reguli pentru conversia implicit


n absena unui unsigned obiectele se convertesc
la tipul cel mai nalt n ordinea (descrescatoare):
long double, double, float, long int, int
Regulile pentru operanzii unsigned depind de
implementare.
Conversia la unsigned se face doar n caz de
necesitate (de ex. valoarea din unsigned nu
ncape n cellat operand).

Algoritmi i programare

63

Reguli pentru conversia implicit


Regula integer promotion : operaiile se fac cel
puin n int, deci char i short sunt promovai la
int.
La o asignare (v = exp) tipul membrului drept se
convertete la tipul membrului stng (care este i
tipul rezultatului).
ATENIE: se pot produce
Pierderea preciziei (double float long int)
Pierderea unor bii semnificativi (long int)
Nedeterminri

Algoritmi i programare

64

Exemplu
#include <stdio.h>
int main(void){
char c1 = -126, c2;
/* c1 = 10000010
unsigned char c3, c4 = 255; /* c4 = 111111111
short s1, s2 = -32767; /* s2=10000000 00000001
short s3 = -1, s4;
/* s3 = 11111111 11111111
s1 = c1;
printf("c1 = %d, s1 = %d\n", c1, s1);
c2 = s2;
printf("c2 = %d, s2 = %d\n", c2, s2);
c3 = s3;
printf("c3 = %d, s3 = %d\n", c3, s3);
s4 = c4;
printf("c4 = %d, s4 = %d\n", c4, s4);
return 0;
}
Algoritmi i programare

*/
*/
*/
*/

65

Exemplu (rezultatul execuiei)


c1 = 10000010
c1 = -126, s1 = -126
s2=10000000 00000001
c2 = 1, s2 = -32767
s3 = 11111111 11111111
c3 = 255, s3 = -1
c4 = 111111111
c4 = 255, s4 = 255
Algoritmi i programare

s1 = c1;
c2 = s2;
c3 = s3;
s4 = c4;

66

Forarea tipului - cast


Conversia explicit la tipul numetip:
(numetip) expresie
Exemple:
(long)(A + 1.0)
(int)(b*b-4*a*c)
(double)(x+y)/z
(float)x*y/z
x / (float)2

Algoritmi i programare

67

Exemplu cast
#include <stdio.h>
int main(void){
int i, j; double x, y, z, t;
i = 5/2; x = 5/2; y = (double)(5/2);
j = (double)5/2; z = (double)5/2;
t = 5./2;
printf(%d, %g, %g, %d, %g, %g\n,
i, x, y, j, z, t);
return 0;
}
/* 2, 2, 2, 2, 2.5, 2.5 */
Algoritmi i programare

68

Fiiere n bibliotec relative la tipuri


<limits.h> - pentru tipurile ntregi
ntregul min/max: INT_MIN, INT_MAX
Numrul de bii pe caracter CHAR_BIT
Etc.

<float.h> - pentru tipurile flotante:


Exponentul maxim
Precizia zecimal, etc.

<stdlib.h> - conine funcii de conversie:


ir de caractere n int: atoi(const char*)
ir de caractere n float:atof(const char*)
Algoritmi i programare

69

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