Sunteți pe pagina 1din 58

Algoritmi şi programare

2010 – 2011

Cristian Gaţu
Marian Baltă

www.infoiasi.ro/~ap
Organizare
• Lector dr. Cristian Gaţu
– e-mail: cgatu@info.uaic.ro
– tel: 0232-201546
– cabinet: C212 (corp C, parter)
– url: www.infoiasi.ro/~cgatu

• Consultaţii: miercuri, 14:00-16:00

• Pagina cursului: www.infoiasi.ro/~ap


Algoritmi şi programare
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
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++ cu
accent pe implementarea structurilor de date şi
a soluţiilor prezentate în partea de algoritmică

Algoritmi şi programare
Evaluare
• condiţii:
– activitatea la laborator (AL)
– testele scrise (TS)
• criterii de promovare:
– număr de teme de laborator “acceptate” >= 5
– AL >= 6, TS >= 4
• forme:
– AL
• fiecare temă de laborator va fi apreciată cu calificativul “acceptat”
sau “respins”
• întrebări, participare la discuţii, soluţii originale (bonus!)
– TS:
• 2 teste scrise (săpt. 8, 16), fiecare test conţinând 10
întrebări/probleme
• Testele scrise vor conține și un modul separat de evaluare a
laboratorului notat de la 1 la 10. La această notă se adaugă
eventualul bonus de laborator.

Algoritmi şi programare
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
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, 2000.
B. Stroustrup: The C++ Programming Language,
Adisson-Wesley, 3rd ed., 1997.
L. Negrescu:Limbajele C şi C++ pentru începători.
Volumul II: Limbajul C++, Ed. Albastră, 2006.
Algoritmi şi programare
Curs 1

• limbaj algoritmic
• modelarea memoriei
• tipuri de date elementare

(cu prezentarea elementelor de


limbaj C++ corespunzătoare)
Algoritmi şi programare
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: Muḥammad ibn Musa al-Khwarizmi
Algoritmi şi programare
al-Khwarizmi
Algoritmi şi programare
Algoritmi - proprietăţi
• intrare (input) – zero sau mai multe entităţi de
date furnizate din exterior

• ieşire (output) – algoritmul produce informaţie

• terminare – pentru orice intrare, algoritmul


execută un număr finit de paşi

• corectitudine – algoritmul se termină şi produce


ieşirea corectă pentru orice intrare. Spunem că
algoritmul rezolvă problema dată.

Algoritmi şi programare
Primul program C++

void main(){}

“You don’t have to know every detail of C++ to write


good programs.” (B. Stroustrup)

Algoritmi şi programare
Primul program C++
/*
* first program in C++
*/
#include <iostream>

int main()
{
std::cout << “Salut!\n”;
std::cout << “Primul program C++!”;
return 0;
}
Algoritmi şi programare
Primul program C++
/*
* first program in C++
*/
#include <iostream>
using namespace std;
int main()
{
cout << “Salut!\n”;
cout << “Primul program C++!”;
return 0;
}
Algoritmi şi programare
Primul program C++

OUTPUT:

Salut!
Primul program C++!Press any key to continue

Algoritmi şi programare
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
Variabilă
• Nume
• Adresă
• Atribute (tip de date asociat valorilor
memorate)
x int
adr

• Instanţă a variabilei

Algoritmi şi programare
Memoria
• Structură liniară de celule
– Variabile

adr
x int

– Pointeri
adr
adr

p int*

*p int
Algoritmi şi programare
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
Tip de date (C++)
• 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
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
Echivalenţe

signed short int ≡ short


unsigned short int ≡ unsigned short
signed int ≡ int
unsigned int ≡ unsigned
signed long int ≡ long
unsigned long int ≡ unsigned long

Algoritmi şi programare
Declaratii
• 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
Constante întregi în <limits.h>
16 biti 32 biti
INT_MAX 215  1 231  1
INT_MIN  215  231
LONG_MAX 231  1 263  1
LONG_MIN  231  263

Atenţie 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
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
Citiri, afişări

std::cout << “a:”;


•citirea unui int std::cin >> a;

int a = 10;
•afişarea unui int std::cout << a;

Algoritmi şi programare
Constante - exemplu
/* Exemple de constante caracter */
#include <iostream>
int main(){
char a, b, c, d;
a = 'A'; b = 65; c = '\101'; d = '\x41';
cout << a << b << c << d << endl;
cout << a << (int)a;
cout << oct << (int)a << hex << (int)a;
return 0;
}
A A A A
A 65 101 41
Algoritmi şi programare
Codurile ASCII
#include <iostream>
int main (){
short c;
for(c = 0; c <= 127; c++){
cout << "cod ASCII: " << (int)c;
cout << "caracter: ";
cout << (char)c << endl;
}
return 0;
}

/* for(c=‘a’; c<=‘z’; c++) */


Algoritmi şi programare
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
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 dupa
i+1 i+1 i-1 i-1
evaluare

++5 --(k+1) ++i++ nu au sens


Algoritmi şi programare
Exemplu ++ (temă)
#include <iostream>
int* f(int* a){
int b = 2;
(*a) += b;
return a;
}
int main (){
int a = 5;
(*f(&a))++;
cout << a << endl;
return 0;
}
Algoritmi şi programare
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
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
Constante reale

• Constantele reale sunt implicit double


125.435 1.12E2 123E-2 .45e+6 13. .56

• Pentru a fi float trebuie sa aiba sufixul f sau F


.56f 23e4f 45.54E-1F

• Pentru long double trebuie sa aibă sufixul l sau L


123.456e78L

Algoritmi şi programare
Funcţii
(în biblioteca <math.h>)
sin cos tan asin
acos atan sinh cosh
tanh exp log log10
pow sqrt ceil floor
fabs ldexp frexp modf
fmod

Algoritmi şi programare
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 funcţii:
litera_mare u, v=‘a’;
varsta v1, v2;
size_t dim;
Algoritmi şi programare
Date booleene (logice)
• Tipul bool
• Domeniul de valori: {false, true}
• false = 0
• true = 1 dar şi orice întreg nenul
• Operaţii: ! && || == !=
• Declaraţii posibile:

bool x = 7; // x devine “true”


int y = true; // y devine 1
Algoritmi şi programare
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
Valoarea expresiilor
relaţionale

a-b a<b a>b a<=b a>=b a==b a!=b

positiv 0 1 0 1 0 1

zero 0 0 1 1 1 0

negativ 1 0 1 0 0 1

Algoritmi şi programare
Valoarea expresiilor logice ||

exp1 exp2 exp1 || exp2

<> 0 nu se evaluează 1

1 dacă exp2 <> 0


=0 se evaluează
0 dacă exp2 = 0

Algoritmi şi programare
Valoarea expresiilor logice &&

exp1 exp2 exp1 && exp2

=0 nu se evaluează 0

1 dacă exp2 <> 0


<> 0 se evaluează
0 dacă exp2 = 0

Algoritmi şi programare
Exemple
• O condiţie de forma a ≤ x ≤ b se scrie în limbajul C++:

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

• O condiţie de forma a > x sau x > b se


scrie în limbajul C++:
(x < a) || (x > b) !(x >= a && x <= b)

Algoritmi şi programare
Operatorul condiţional ?:
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
Operatorul condiţional ?:
Exemple
x >= 0 ? x : y
x > y ? x : y
x > y ? x > z ? x : z : y > z ? y : z
#include <iostream>
void main(){
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 */
cout<< "x="  << x << "y="  << y << "z=" << z;
}
/* x=2 y=1 z=2 */
Algoritmi şi programare
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
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 funcţii fără valoare returnată sau


pentru funcţii fără parametri

• Este un tip incomplet ce nu poate fi completat

Algoritmi şi programare
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
Operatorul sizeof()
#include <iostream>

void main(){
int x = 1; double y = 9; long z = 0;
cout << "Operatorul sizeof()\n\n\n";
cout << "sizeof(char) = " << sizeof(char) << endl;
cout << "sizeof(int) = " << sizeof(int)) << endl;
cout << "sizeof(short) = " << sizeof(short)) << endl;
cout << "sizeof(long) = " << sizeof(long)) << endl;
cout << "sizeof(float) = " <<sizeof(float)) << endl;
cout << "sizeof(double) = " << sizeof(double)) << endl;
cout << "sizeof(long double) = " << sizeof(long double))
<< endl;
cout << "sizeof(x +y + z) = " << sizeof(x+y+z)) << endl;
}

Algoritmi şi programare
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
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 virgulă) stânga
Algoritmi şi programare
Compatibiltatea tipurilor
predefinite
• Toate tipurile aritmetice (caractere, întregi,
reale) sunt compatibile între ele;
compilatorul admite orice combinaţie de
obiecte de diverse tipuri într-o expresie

• La evaluarea unei expresii în care apar


tipuri diferite compilatorul face conversii
implicite

Algoritmi şi programare
Reguli pentru conversia
implicită
• În absenţa 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 celalat operand).

Algoritmi şi programare
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.
• La o asignare (v = exp) tipul membrului drept se
converteşte la tipul membrului stâng (care este şi
tipul rezultatului).
– ATENŢIE: se pot produce
• Pierderea preciziei (double ->float ->long
int)
• Pierderea unor biţi semnificativi (long ->int)
• Nedeterminări

Algoritmi şi programare
Exemplu
#include <iostream>
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;
cout << "c1=" << (int)c1 << " s1=" << s1 << endl;
c2 = s2;
cout << "c2=" << (int)c2 << " s2=" << s2 << endl;
c3 = s3;
cout << "c3=" << (int)c3 << " s3=" << s3 << endl;
s4 = c4;
cout << "c4=" << (int)c4 << " s4=" << s4 << endl;
return 0;
}
Algoritmi şi programare
Exemplu (rezultatul execuţiei)
c1 = 10000010 s1 = c1;
c1 = -126, s1 = -126

s2=10000000 00000001 c2 = s2;


c2 = 1, s2 = -32767

s3 = 11111111 11111111 c3 = s3;


c3 = 255, s3 = -1

c4 = 111111111 s4 = c4;
c4 = 255, s4 = 255
Algoritmi şi programare
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
Exemplu cast
#include <iostream>
Using namespace std;
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;
cout << i << ", " << x << ", ";
cout << y << ", " << j << ", ";
cout << z << ", " << t << ", " << endl;
return 0;
}
/* 2, şi2,
Algoritmi 2, 2, 2.5, 2.5 */
programare
Fişiere în bibliotecă relative
la tipuri
• <limits.h> - pentru tipurile întregi
– Întregul min/max: INT_MIN, INT_MAX
– Numărul de biţi pe caracter CHAR_BIT
– Etc.
• <float.h> - pentru tipurile flotante:
– Exponentul maxim
– Precizia zecimală, etc.
• <stdlib.h> - conţine funcţii de conversie:
– Şir de caractere în int: atoi(const char*)
– Şir de caractere în float:atof(const char*)

Algoritmi şi programare

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