Documente Academic
Documente Profesional
Documente Cultură
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
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
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(){}
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
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
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)
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;
Algoritmi i programare
int i;
int suma = 0;
long j;
Tipul ntreg
int
sizeof(int) = 2 sau 4 octei
27
ntregi fr semn
unsigned int
unsigned short int
{0, , 65535}
Algoritmi i programare
28
Algoritmi i programare
29
16 bii
32 bii
215 1
231 1
215
231 1
231
231
263 1
263
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);
int a = 10;
printf(a = %d, a);
printf(a: );
scanf(%c, &a);
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
35
==
!=
<
<=
>
Algoritmi i programare
36
Valoare
i+1 i
i-1 i
--(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
double
Numere reale n dubl precizie
sizeof(double) = 8
10 307 abs( f ) 10308
15 cifre semnificative
Algoritmi i programare
39
Algoritmi i programare
/ ==
!=
<
<=
>
>=
40
Constante reale
Constantele reale sunt implicit double
125.435
1.12E2
123E-2
.45e+6
13.
.56
23e4f
45.54E-1F
Algoritmi i programare
41
Citire, afiare
citirea unui float
printf(x: );
scanf(%f, &x);
float pi = 3.14;
printf(pi = %f, pi);
printf(x: );
scanf(%lf, &x);
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;
44
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
a<b a>b
a<=b
a>=b
a==b a!=b
positiv 0
zero
negativ 1
Algoritmi i programare
47
exp2
exp1 || exp2
<> 0
nu se
evalueaz
se evalueaz
= 0
Algoritmi i programare
48
exp2
= 0
nu se
evalueaz
se evalueaz
<> 0
Algoritmi i programare
49
Exemple
O condiie de forma a x b se scrie n
limbajul C:
(x >= a) && (x <= b)
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
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
+=
-=
*=
/=
%=
&=
|=
^=
>>=
<<=
/* 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
<
<=
==
stnga
stnga
>
stnga
>=
stnga
!=
&&
stnga
||
stnga
dreapta
?:
=
+=
-=
*=
/=
, (operatorul virgula)
Algoritmi i programare
dreapta
%=
stnga
61
Algoritmi i programare
62
Algoritmi i programare
63
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
s1 = c1;
c2 = s2;
c3 = s3;
s4 = c4;
66
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
69