Documente Academic
Documente Profesional
Documente Cultură
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
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
Algoritmi şi programare
Primul program C++
void main(){}
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
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
•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
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;
}
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
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;
Algoritmi şi programare
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
Valoarea expresiilor logice ||
<> 0 nu se evaluează 1
Algoritmi şi programare
Valoarea expresiilor logice &&
=0 nu se evaluează 0
Algoritmi şi programare
Exemple
• O condiţie de forma a ≤ x ≤ b se scrie în limbajul C++:
Algoritmi şi programare
Operatorul condiţional ?:
exp1 ? exp2 : exp3
• Se evaluează exp1
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ă
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
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
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
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