Sunteți pe pagina 1din 6

Curs 1- Programarea calculatoarelor i limbaje de programare

Bibliografie

- Java - o perspectiva pragmatic, Irina Athanasiu, et al., ed. Agora 2000
- Java de la 0 la Expert, tefan Tanasa, Cristian Olaru, tefan Andrei, ed. Polirom 2003
- Programarea calculatoarelor i limbaje de programare aplicaii de laborator, Nirvana
Popescu, Bogdan ignoaia, ed. Universitar, 2013
- Data Structures and Algorithms using Java, Nirvana Popescu, ed. Politehnica Press,
2008
- Java Tutorial, http://download.oracle.com/javase/tutorial

- Thinking in Java, Bruce Eckel, www.ibiblio.org/pub/docs/books/eckel
www.mindview.net/Books


1. Introducere.

De-a lungul timpului, tehnicile i metodele de programare a calculatoarelor au
evoluat, ncepnd cu programarea clasic, continund cu cea structurat, trecnd la
programarea orientat pe obiecte i la cea condus de evenimente i ajungnd astzi la
modelul programrii vizuale, implementat n majoritatea mediilor moderne de programare.
Diferenele dintre aceste moduri nu se afl n rezultatele furnizate de programe, ci n
modul de concepere a programelor respective. Cu alte cuvinte, aceeai operaie care se
execut pe un sistem de calcul se poate realiza prin oricare dintre modelele amintite . Difer,
n schimb, efortul necesar realizrii programului care s rezolve problema, timpul consumat,
viteza de execuie.
Matematica lucreaz cu secvene logice de pai pentru rezolvarea problemelor i
demonstrarea teoremelor.
Atunci cnd ordonm un proces, l programm.
Calculatorul este un dispozitiv programabil care poate pstra, regsi i procesa date.
Astfel un program descrie aciunile care trebuie executate pentru a atinge un scop, un
program de calculator descrie paii pe care trebuie s i execute calculatorul pentru a rezolva
o problem. Deci, un program de calculator este o list de instruciuni care trebuie urmate de
calculator.


Cum scriem un program?
Pentru a scrie un program trebuie s parcurgem trei faze:

1. Analiza problemei - nseamn nelegerea, definirea problemei;
2. Realizarea algoritmului presupune stabilirea pailor care trebuie urmai pentru
rezolvarea problemei;

Un algoritm nseamn n matematic i informatic o metod sau o procedur de calcul,
alctuit din paii elementari necesari pentru rezolvarea unei probleme sau categorii de
probleme. De obicei algoritmii se implementeaz n mod concret prin programarea adecvat a
unui calculator, sau a mai multora. Algoritmul este noiunea fundamental a informaticii.
Totul este construit n jurul algoritmilor (i al structurilor de date, cum ar
fi listele sau grafurile).

3. Scrierea programului este parcurgerea pailor algoritmului prin instruciuni sau
comenzi ce s execute paii de rezolvare a problemei.

Programatorul ncepe prin a analiza problema i a dezvolta o soluie general numit
algoritm.
Dupa elaborarea algoritmului, acesta poate fi translatat ntr-un program scris ntr-un
limbaj de programare.
Limbajul de programare este un set de reguli, simboluri i cuvinte speciale folosite
pentru a construi un program.
Limbajele de programare (C/ C++/ Java/ etc) folosesc cuvinte din limba englez i au
un set strict de reguli de scriere i formulare a comenzilor.
Execuia programului este rularea programului pe calculator (RUN).
Depanarea este faza de determinare i corectare a erorilor (COMPILE).
O parte important a programrii este scrierea indicaiilor pentru utilizarea
programului creat. Acesta este un text scris (instruciuni) destinat nelegerii de ctre
utilizatorul programului scris de programator.
Ce este un limbaj de programare?
Programatorii scriu instruciuni n diverse limbaje de programare, unele care sunt
nelese n mod direct de calculator, altele care necesit mai muli pai de translatare. n
prezent exist sute de limbaje de programare care pot fi mprite n trei tipuri generale:
1. Limbaje main
2. Limbaje de asamblare
3. Limbaje de nivel nalt


Singurul limbaj pe care calculatorul l poate nelege este un set primitiv de
instruciuni numite limbaj main sau cod main.

Tehnici de rezolvare a problemelor

n faza de rezolvare a unei probleme de programare va trebui s proiectm algoritmi.
Este important s ne punem ct mai multe ntrebri pn cnd nelegem exact ce
avem de fcut.
a. Rescriei problema cu propriile voastre cuvinte.
b. ncercai s o descompunei n subprobleme individuale. Acest lucru v va ajuta s
extragei componente mai uor de rezolvat. De asemenea, vei putea s sintetizai
mai uor algoritmul de rezolvare a problemei.


2. Timpul de execuie al algoritmilor
Timpul de execuie al unui program depinde de urmtorii factori :
-volumul datelor de intrare
-calitatea codului generat de compilator
-natura si viteza de execuie a instruciunilor programului (dependent i de performanele
calculatorului pe care acesta ruleaz)
-complexitatea algoritmului care st la baza programului.
In condiiile n care algoritmii sunt rulai pe calculatoare cu performane similare, utilizndu-
se acelai compilator, practic timpul de execuie devine funcie doar de volumul datelor de
intrare i complexitatea algoritmului. In aceste condiii simplificate, evaluarea experimental
a performanelor unui algoritm este cu adevarat relevant.
Comparaiile ntre algoritmi se face pe baza managementului de resurse, un factor esenial
fiind timpul de execuie. Nu este necesar s estimm cu exactitate timpul de execuie care
poate s depind att de volumul de date ct i de maina pe care este executat. Diferenele
timpilor de execuie ntre dou abordri ae rezolvrii aceleiai problem pot fi mici pentru un
volum mic de date, iar pentru mulimile mari de date, timpul de execuie poate s creasc
rapid.

n general, complexitatea unui program se refer la numrul de pai necesari pentru a rezolva
problema sau algoritmul. O complexitate sczut semnific un numr mai mic de pai i
astfel programul este mai eficient. Eficiena este foarte important pentru orice specialist n
calculatoare sau inginer software pentru c ei trebuie s translateze n cod milioane de metode
ntr-un singur program. Creterea timpului de execuie ca funcie de setul de date al problemei
reprezint baza comparaiilor ntre metodele/algoritmii ce pot fi folosite n rezolvarea unei
probleme

O abordare simpl. S considerm un fragment de program:

[declaraia 1]
for i=1 to n do
[declaraia 2]
[declaraia 3]
next i

Analiza poate ncepe presupunnd c [declaraia k] necesit o unitate de timp k=1,2,3. Atunci
segmentul de program necesit o unitate de timp pentru [declaraia 1] urmat de dou uniti
de timp pentru fiecare trecere prin bucla for. De aceea, timpul de execuie este:
T(n)= 1+2n

Aceasta poate fi uor generalizat dac presupunem c [declaraia i] necesit t
i
uniti de
timp:
T(n)=t
1
+(t
2
+ t
3
) n

Aceast ecuaie rmne valid i dac [declaraia 2] este ea nsi o bucl ce necesit aceeai
perioad de timp pentru a fi executat. De exemplu, dac [declaraia 2] este
[declaraia 2] : for j=1 to m do
[declaraia 4]
next j

atunci: t
2
= m* t
4

Complicaiile apar totui atunci cnd execuia [declaraia 2] depinde de i:
[declaraia 2] : for j=1 to i do
[declaraia 4]
next j

S presupunem c m = i, atunci: t
2
= i * t
4
, iar ecuaia va avea forma:
3
1
4 1
1
3 4 1
* * ] * [ ) ( t n i t t t t i t n T
n
i
n
i
+
(

+ = + + =

= =


n acest moment, este bine s ne reamintim cteva proprieti ale adunarii, pentru c timpul de
execuie al ntregii bucle este o sum a timpilor necesari la fiecare pas.
i de functii sunt b si a unde b k n i f a b i f a v
i de depinde f si n k unde n f k f k f i f iv
n n n
n i iii
n n
n i ii
n i
n
k i
n
k i
n
i
n
i
n
i
n
i
* ) 1 ( ) ( ] ) ( * [ ) (
) ( ... ) 1 ( ) ( ) ( ) (
6
) 1 2 )( 1 (
... 2 1 ) (
2
) 1 (
... 2 1 ) (
1 ... 1 1 1 ) (
1
2 2
1
2
1
1
+ +
(

= +
< + + + + =
+ +
= + + + =
+
= + + + =
= + + + =

= =
=
=
=
=


Din ecuaia ii, valoarea lui T(n) este:
3 4 1
*
2
) 1 (
) ( t n
n n
t t n T +
+
+ =

Dac se presupune c t
1
= t
3
= t
4
= 1, atunci:
1
2
3
2 2
) 1 (
1 ) (
2
+ + =
+
+ + =
n n n n
n n T o funcie ptratic depinznd de n.

Aceast analiz a timpului de execuie reliefeaz comportamentul algoritmului si determin
complexitatea lui. Astfel, complexitatea unui algoritm devine un factor important n alegerea
soluiei optime pentru rezolvarea unei probleme.

3. Complexitatea algoritmilor

Nu toate funciile de timp sunt liniare n raport cu cantitatea de date procesate. Multe dinte ele
ptratice, logaritmice sau exponeniale. Acestea cresc brusc odat cu valoarea lui n. Iata
tabelul de mai jos!

Algoritm 1 N 1 2 4 16 256
Algoritm 2 ln n 0 1 2 4 16
Algoritm 3 n*ln n 0 2 8 64 4096
Algoritm 4 n
2
1 4 16 256 65536

S presupunem c procedurile A i B reprezint soluii pentru aceeai problem, iar funciile de
timp sunt:

( ) ( )
2
ln n n TB n n n TA = =

Dac vom considera o unitate de timp de 1 microsecund (10
-6
secunde), atunci cnd n=1024,
TA(n) are valoarea 0.01 secunde, iar TB (n) este 1 secund. Dac aceste proceduri sunt
folosite de mai multe ori pentru a realize o anumit sarcin a problemei, atunci procedura B
devine impracticabil pentru seturi mari de date.

Atunci cnd trebuie calculat rata de cretere a unei funcii, este util s se elimine ct mai
multe detalii. Dac n crete mult, orice funcie liniar este depit de o funcie ptratic.
Aadar, ntr-un polinom, factorul important este dat de cea mai mare putere a lui n.

DEFINIIE:
f(n)=O(g(n)) dac i numai dac exist constantele c i m astfel nct ) ( ) ( n g c n f s pentru
toate valorile n > m

Declaraia f(n)=O(g(n)) spune de fapt c g(n) crete la fel de repede ca f(n).
Un exemplu formal de utilizare este: a*n + b = O(n). Pentru demonstraie considerm:

( ) n c n b a b n a b n a = + s + s + pentru toate n>1.

Trebuie doar s extragem nucleul acestei abordri i obinem:

) 2 ( 2
) (ln ln
) (
) (
) (
3 2 3
2 2
n n
O b a
n O b n a
n O d n c n b n a
n O c n b n a
n O b n a
= +
= +
= + + +
= + +
= +


Ordinea ratelor de cretere este urmtoarea:

O(ln n) <O(n) <O(n ln n) <O(n
2
) <O(n
3
) < < O(2
n
)

Din fericire, complexitatea unui algoritm se poate gasi de cele mai multe ori fr o analiz att
de detaliat. Dac vom considerar:
[declaraia 1]
for i=1 to n do
[declaraia 2]
[declaraia 3]
next i

Complexitatea este O(n) atta timp ct declaraiile 1, 2 i 3 se realizeaz n uniti de timp.
Dac ele apeleaz la rndul lor alte procedure, este nevoie poate de aplicarea unor tehnici de
analiz a timpului.

Pentru c n acest curs se va studia limbajul Java, este important de tiut c timpul de rulare
poate fi determinat uor n Java folosind metoda:
java.lang.System.currentTimeMillis().
Ea returneaz timpul n milisecunde.