Professional Documents
Culture Documents
2011 2012
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
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/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 8
Curs 1
limbaj algoritmic modelarea memoriei tipuri de date elementare (cu prezentarea elementelor de limbaj C corespunztoare)
Algoritmi i programare 9
Algoritmi - Etimologie
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
Algoritmi i programare
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 Pointeri int
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
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
23
Echivalene
signed short int unsigned short int signed int unsigned int signed long int unsigned long int
Algoritmi i programare
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
Tipul ntreg
int
sizeof(int) = 2 sau 4 octei
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
27
Algoritmi i programare
28
32 bii
231 1
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 30
Citiri, afiri
citirea unui int afiarea unui int citirea unui char afiarea unui char
printf(a: ); scanf(%d, &a); int a = 10; printf(a = %d, a); printf(a: ); scanf(%c, &a); char a = a; printf(a = %c, a);
Algoritmi i programare
31
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 32
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
33
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
35
Operatorii ++ i - Se aplic doar unei expresii ce desemneaz un obiect din memorie (L-value): Expresie Valoare ++i i++ --i i-i+1 i i-1 i
i dup evaluare i+1 i+1 i-1 i-1 ++5 --(k+1) ++i++ nu au sens
Algoritmi i programare
36
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 37
double
Numere reale n dubl precizie sizeof(double) = 8 10 307 abs( f ) 10308 15 cifre semnificative
Algoritmi i programare 38
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: + * / == != < <= > >=
39
Algoritmi i programare
Constante reale
Constantele reale sunt implicit double 125.435 1.12E2 123E-2 .45e+6 13. .56
Algoritmi i programare
40
Citire, afiare
citirea unui float afiarea unui float citirea unui double afiarea unui double
printf(x: ); scanf(%f, &x); float pi = 3.14; printf(pi = %f, pi); printf(x: ); scanf(%lf, &x); double pi = 3.14L; printf(pi = %lf, pi);
Algoritmi i programare
41
Algoritmi i programare
42
Funcia printf
int printf(const char *format, ...);
Apelul returneaz numrul de conversii realizate cu succes n irul format apar specificatorii de conversie introdui prin caracterul % La apel, corespondena argument --- specificator de conversie Caracterele ce nu fac parte din specificatorii de conversie sunt scrise n stream-ul de ieire printf(a = %d, b = %f, c = %s.\n, a, b, c); Funciile sprintf, fprintf
Algoritmi i programare 43
Funcia printf
specificator_de_conversie ::= %{modificator}opt {marime_camp}opt {.precizie}opt caracter_de_conversie caracter_de_conversie ::= c|d|i|u|o|x|X|e|E|f|g|G|s|p|n|% modificator ::= h|l|L|-|+|#|0 marime_camp ::= numar_intreg_fara_semn precizie ::= numar_intreg_fara_semn
Algoritmi i programare
44
Funcia printf
Tip char int unsigned int long int unsigned long float double long double Specificator %c, %d %d %u %ld %lu %f, %g, %e, %E %lf, %lg, %le, %lE %Lf, %Lg, %Le, %LE
float pa = 2.568; printf(a = %10f\n, a); /* printf(a = %6g\n, a); /* printf(a = %10.2f\n, a);/*
Algoritmi i programare
a a a
= = =
Funcia printf
Cmpul mrime sau/i precizie poate fi nlocuit prin * : valoarea va fi luat dintr-un argument: printf(x= %*.*f\n, m, n, x);
Algoritmi i programare
46
Funcia scanf
int scanf(const char *format, ...);
Apelul returneaz numrul de conversii realizate cu succes, respectiv EOF dac stream-ul de intrare este vid n irul format apar specificatorii de conversie introdui prin caracterul % La apel, corespondena argument --- specificator de conversie. Argumentele trebuie sa fie pointeri sau adrese Caracterele ce nu fac parte din specificatorii de conversie trebuie s apar n stream-ul de intrare Funciile sscanf, fscanf
Algoritmi i programare 47
Funcia scanf
int i; char c; char sir[15]; scanf(%d , %*s %% %c %7s &i, %s, &c, sir, &sir[7]);
Algoritmi i programare
48
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 49
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
51
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
52
positiv 0 zero 0
negativ 1
Algoritmi i programare
53
1
1 dac exp2 <> 0 0 dac exp2 = 0
Algoritmi i programare
54
Algoritmi i programare
55
Exemple
O condiie de forma a x b se scrie n limbajul C:
(x >= a) && (x <= b) (a <= x) && (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 57
#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
Algoritmi i programare
59
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 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 60
+=
-=
*=
/=
^=
>>=
<<=
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 62
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);
Algoritmi i programare
63
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
64
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) 1 4 2 4 4 8 = 8 = 8
Algoritmi i programare
65
Precedena operatorilor
Operatori
() ++ -- (postfix) ++ -- (prefix) ! & (adresa) * (deref) + - (unari) sizeof() * + < == && || ?: = += -= *= /= %= stnga 66 , (operatorul virgula) Algoritmi i programare / <= != > >= % stnga stnga stnga stnga stnga stnga dreapta dreapta
Asociere
stnga dreapta
Algoritmi i programare
67
Algoritmi i programare
68
Algoritmi i programare
69
Conversii la asignare
Tipul rezultatului signed char char char short int int (32 biti) int float double Tipul expresiei char short int int (32 bii) / long int int (32 bii) long int float double long double Posibile pierderi daca valoarea > 127, rezultat negativ 8 bii semnificativi 24 bii semnificativi 16 bii semnificativi nimic partea fracionar (i posibil mai mult) precizia (rotunjire) precizia (rotunjire)
double int: double float, float int conversia int float, float double nu aduce precizie sau acuratee (doar se schimb forma n care valoarea este reprezentat). Algoritmi i programare 70
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 c3 = s3; printf("c3 = %d, s2 = %d\n", c2, s2); = %d, s3 = %d\n", c3, s3); */ */ */ */
Algoritmi i programare }
71
s1 = c1;
c2 = s2; c3 = s3;
s4 = c4;
72
Exemplu
int i; long l; float f; double d = char c = 'c'; i = 2.9; f = d; f = 'A'; i i l l = = = = /* f=65.0 (codul ASCII) */ calcul expr - in int, i=30099 */ /* 'depasire', i=-25536 */ /* -25536 convertit la long */ /* rezultat corect, l=40000 */
.45e+6;
Algoritmi i programare
74
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 75