Documente Academic
Documente Profesional
Documente Cultură
Algoritmi Si Programare PDF
Algoritmi Si Programare PDF
2011 – 2012
Cristian Gaţu
Mădălina Răschip
www.infoiasi.ro/~ap
Organizare
• Lector dr. Cristian Gaţu
– e-mail: cgatu@info.uaic.ro
– cabinet: C212 (corp C, parter); tel: 0232-201546
– url: www.infoiasi.ro/~cgatu
– consultaţii: vineri, 10:00-12:00
www.info.uaic.ro/~ap
Algoritmi şi programare 3
Obiective
• Algoritmi
– însuşirea unei gândiri algoritmice
– dezvoltarea abilităţilor de proiectare de soluţii
algoritmice
– însuşirea tehnicilor de utilizare a principalelor
structuri de date
– evaluarea timpului de execuţie în cazul cel mai
nefavorabil
• Programare
– iniţiere în utilizarea unui limbaj de programare
– implementarea principalelor structuri de date
– însuşirea tehnicilor de bază în proiectarea
programelor
Algoritmi şi programare 4
Conţinutul disciplinei
• Algoritmi
– limbaj algoritmic, tablouri, structuri statice,
structuri înlănţuite
– liste liniare
– arbori binari, heap-uri, union-find
– grafuri (ca structuri de date)
– sortare, căutare
– paradigme
• Programare
– prezentarea graduată a limbajului C (ISO
Standard) cu accent pe implementarea
structurilor de date şi a soluţiilor prezentate în
partea de algoritmică
Algoritmi şi programare 5
Evaluare
• condiţii:
– activitatea la laborator (AL)
– testele scrise (TS)
• criterii de promovare:
– număr de teme de laborator: 5
– AL >= 6, TS >= 4
• forme:
– AL
• fiecare temă de laborator va fi punctată (note 1-10)
• întrebări, participare la discuţii, soluţii originale (bonus!)
– TS:
• 2 teste scrise (săpt. 8, 16), fiecare test conţinând 8 întrebări de tip
grilă şi o problemă
Algoritmi şi programare 6
Evaluare
• normele ECTS (European Credit Transfer System)
• Punctaj Final (PF) = 50% AL +50% TS
• Nota finală:
– <= 4 dacă sunt îndeplinite condiţiile şi NU sunt
îndeplinite criteriile de promovare,
– = 10 dacă PF este în primii 5% din cei promovaţi (A)
– = 9 următorii 10% din cei promovaţi (B)
– = 8 următorii 20% din cei promovaţi (C)
– = 7 următorii 30% din cei promovaţi (D)
– = 6 următorii 25% din cei promovaţi (E)
– = 5 ultimii 10% din cei promovaţi
Algoritmi şi programare 7
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 8
Curs 1
• limbaj algoritmic
• modelarea memoriei
• tipuri de date elementare
Algoritmi şi programare 9
Algoritmi, limbaj algoritmic
• Problemă, Soluţie
• Algoritm: o secvenţă finită de paşi aranjată într-o
ordine logică specifică, cu proprietatea că, atunci
când este executată, produce o soluţie pentru o
problemă dată.
• Exemplu: reţeta culinară
• Algoritm calculator (“computer algorithm”) = un
algoritm pentru care secvenţa de paşi este
executată de un calculator
• Limbaj Algoritmic = un limbaj folosit pentru
descrierea algoritmilor
• Etimologie: Muhammad ibn Musa al-Khwarizmi
Algoritmi şi programare 10
Algoritmi - proprietăţi
• intrare (input) – zero sau mai multe entităţi de
date furnizate din exterior
Algoritmi şi programare 12
Primul program C
void main(){}
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 spaţiu: blank, newline, tab, etc.
Algoritmi şi programare 17
Cuvintele cheie (rezervate)
auto break case char
const continue default do
double else enum
extern
float for goto if
inline int long
register
restrict return short signed
sizeof static struct switch
typedef union unsigned void
volatile while
Algoritmi şi programare 18
Limbaj algoritmic
• modelarea memoriei
• tipuri de date elementare
• instrucţiuni
• tipuri de date structurate de nivel jos
• calcul
• timp de execuţie
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 int
Algoritmi şi programare 21
Tip de date
• Domeniul tipului (colecţia de obiecte)
• Operaţiile tipului
• Categorii de tipuri de date:
– Tipuri de date elementare
– Tipuri de date structurate de nivel jos
• Operaţiile la nivel de componentă
– Tipuri de date de nivel înalt
• Operaţiile implementate de algoritmi utilizator
Algoritmi şi programare 22
Tip de date
• O valoare memorată sau returnată de o funcţie este
determinată de tipul expresiei utilizate pentru a o
accesa (un identificator – cel mai simplu exemplu
de expresie – are tipul specificat în declaraţia sa)
• Tipuri
– obiect: descriu valori
– funcţie: descriu funcţii
– incomplete: descriu obiecte dar pentru determinarea
dimensiunii lor mai trebuiesc informaţii
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 fără semn: desemnate de cuvântul
unsigned (tipuri ce ocupă aceeaşi cantitate de
memorie)
• Tipuri reale flotante:
float, double şi long double.
Algoritmi şi programare 24
Echivalenţe
Algoritmi şi programare 25
Declaraţii
• Forma unei declaraţii:
tip variabila;
tip var1, var2, …, varn;
tip variabila = expresie_constanta;
• Variabile globale: declararea lor se face în afara
oricărei funcţii.
• Variabile locale: declararea se face în corpul funcţiei.
char c;
signed char sc; int i;
int suma = 0; float x1, x2, x3;
long j; float pi = 3.14;
double y;
Algoritmi şi programare 26
Tipul întreg
• int
sizeof(int) = 2 sau 4 octeţi
• 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 fără semn
• unsigned int
• unsigned short int
{0, …, 65535}
• unsigned long int
• Nu există overflow (depăşire) – calculul se
efectuează modulo 2n, unde n este numărul
de biţi
Algoritmi şi programare 28
Întregi “foarte scurţi”: char
• Tipul char este o submulţime a tipului int
• char reprezintă, în funcţie de maşină,
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>
16 biţi 32 biţi
INT_MAX 215 1 231 1
INT_MIN 215 231
LONG_MAX 231 1 263 1
LONG_MIN 231 263
•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’
• Notaţii pentru caractere speciale: ‘\n’, ‘\t’, ‘\r’, ‘\\’, ‘\a’,‘\’’,
‘\0’, ‘\”’
Algoritmi şi programare 31
Citiri, afişări
printf(“a: ”);
•citirea unui int scanf(“%d”, &a);
int a = 10;
•afişarea unui int printf(“a = %d”, a);
Algoritmi şi programare 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;
}
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
Operaţii; Funcţii în biblioteci
• Operaţii pentru tipurile întregi:
+ - * / % == != < <= >
>= ++ --
• Funcţii:
– 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):
Algoritmi şi programare 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 găsesc în <float.h>
• Operaţii: + - * / == != < <= > >=
Algoritmi şi programare 40
Constante reale
• Constantele reale sunt implicit double
125.435 1.12E2 123E-2 .45e+6 13. .56
Algoritmi şi programare 41
Citire, afişare
printf(“x: ”);
•citirea unui float scanf(“%f”, &x);
float pi = 3.14;
•afişarea unui float printf(“pi = %f”, pi);
Algoritmi şi programare 42
Funcţii
(în biblioteca <math.h>)
Algoritmi şi programare 43
Utilizare typedef
Mecanism prin care se asociază un tip unui
identificator:
typedef char litera_mare;
typedef short varsta;
typedef unsigned long size_t;
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
• Operaţii: ! && || == !=
• Declaraţii 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 relaţionale
positiv 0 1 0 1 0 1
zero 0 0 1 1 1 0
negativ 1 0 1 0 0 1
Algoritmi şi programare 47
Valoarea expresiilor logice ||
nu se
<> 0
evaluează 1
1 dacă exp2 <> 0
= 0 se evaluează
0 dacă exp2 = 0
Algoritmi şi programare 48
Valoarea expresiilor logice &&
Algoritmi şi programare 49
Exemple
• O condiţie de forma a ≤ x ≤ b se scrie în
limbajul C:
(x >= a) && (x <= b) (a <= x) && (x <= b)
Algoritmi şi programare 50
Operatorul condiţional ?:
exp1 ? exp2 : exp3
• Se evaluează exp1
#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; /* asociere stanga */
z = a?b:(c?a:b); /* asociere dreapta */
printf("x = %d, y = %d, z = %d\n", x, y, z);
}
/* x = 2, y = 1, z = 2 */
Algoritmi şi programare 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
Algoritmi şi programare 53
Operatorul = (Exemple)
x = sqrt(9);
a = ( b = 2 ) + ( c = 3 );
a = b = c = 0; /* echivalenta cu */
a = (b = (c = 0));
while((c = getchar()) != EOF) putchar(c);
Nu confundaţi 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:
+= -= *= /= %= &= |= ^= >>= <<=
j *= k + 3; /* echivalentă cu: */
j = j * (k + 3);
j *= k = m + 5; /* echivalentă cu: */
j = (j * (k = (m + 5)));
Algoritmi şi programare 55
Operatorul virgulă ,
expresia_virgula ::= expresie, expresie
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ă
Algoritmi şi programare 57
Operatorul sizeof()
• Operator unar ce permite găsirea numărului
de octeţi pe care se reprezintă un obiect
(tip,expresie)
sizeof(int), sizeof(double);
sizeof(b*b-4*a*c), 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) = 1
sizeof(int) = 4
sizeof(short) = 2
sizeof(long) = 4
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 8
sizeof(x + y + z) = 8
Algoritmi şi programare 60
Precedenţa operatorilor
Operatori Asociere
() ++ -- (postfix) stânga
++ -- (prefix) ! & (adresa) dreapta
* (deref) + - (unari) sizeof()
* / % stânga
+ - stânga
< <= > >= stânga
== != stânga
&& stânga
|| stânga
?: dreapta
= += -= *= /= %= dreapta
, (operatorul virgula) stânga
Algoritmi şi programare 61
Compatibilitatea tipurilor predefinite
Algoritmi şi programare 62
Reguli pentru conversia implicită
Algoritmi şi programare 63
Reguli pentru conversia implicită
• Regula “integer promotion” : operaţiile se fac cel
puţin în int, deci char şi short sunt “promovaţi” la
int.
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 execuţiei)
c1 = 10000010 s1 = c1;
c1 = -126, s1 = -126
c4 = 111111111 s4 = c4;
c4 = 255, s4 = 255
Algoritmi şi programare 66
Forţarea 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
Fişiere în bibliotecă relative la tipuri
Algoritmi şi programare 69