Sunteți pe pagina 1din 77

nvmntul profesional i tehnic n domeniul TIC Proiect cofinanat din Fondul Social European n cadrul POS DRU 2007-2013

Beneficiar Centrul Naional de Dezvoltare a nvmntului Profesional i Tehnic


str. Spiru Haret nr. 10-12, sector 1, Bucureti-010176, tel. 021-3111162, fax. 021-3125498, vet@tvet.ro

Proiectarea algoritmilor Material de predare

Domeniul: informatic Calificarea: Analist Programator Nivel 3 avansat

2009

AUTOR: STAN CLAUDIA Profesor grad didactic II STNIC GIOVANNA Profesor grad didactic I

COORDONATOR:

MARIANA VIOLETA CIOBANU profesor grad didactic I

CONSULTAN: IOANA CRSTEA expert CNDIPT ZOICA VLDU expert CNDIPT ANGELA POPESCU expert CNDIPT DANA STROIE expert CNDIPT

Acest material a fost elaborat n cadrul proiectului nvmntul profesional i tehnic n domeniul TIC, proiect cofinanat din Fondul Social European n cadrul POS DRU 20072013

Cuprins
I. Introducere....................................................................................................................................4 II. Documente necesare pentru activitatea de predare.....................................................................6 III. Resurse.......................................................................................................................................7 Tema 1. Organizarea datelor. Elemente specifice algoritmilor ..................................................7 Fia suport 1.1. Organizarea datelor. Date. Informaii............................................................7 Fia suport 1.2. Elemente specifice algoritmilor: date, variabile, constante; tip de date; expresii, operaii, operatori; comentarii.................................................................................10 Fia suport 1.3. Structuri de date: structuri statice (articol, tablouri unidimensionale i bidimensionale, fiiere, iruri de caractere), structuri dinamice (liste simplu i dublu nlnuite, stive, cozi, arbori, grafuri)....................................................................................15 Tema 2. Algoritmi: caracteristici, reprezentare, implementare ................................................26 Fia suport 2.1. Etapele rezolvrii problemelor. Algoritmi. Caracteristicile algoritmilor. ...26 Fia suport 2.2. Reprezentarea algoritmilor: Scheme logice. Limbaj pseudocod. ................29 Fia suport 2.3. Programarea structurat: structuri liniare, structuri alternative, structuri repetitive (cu test final, cu test iniial, cu numr cunoscut de pai), teorema de structur Bohm-Jacopini.......................................................................................................................33 Fia suport 2.4. Proiectarea algoritmilor: top-down, bottom-up, modular, structurat........48 Fia suport 2.5. Algoritmi elementari ce folosesc structuri fundamentale ...........................51 Tema 3. Corectitudinea algoritmilor..........................................................................................61 Fia suport 3.1. Surse de erori n elaborarea algoritmilor (erori n datele iniiale, erori de rotunjire, erori de metod, erori reziduale, erori de sintax).................................................61 Fia suport 3.2. Verificarea corectitudinii algoritmilor (numr finit de pai, definirea corect a datelor, asigurarea valorilor pentru toate variabilele utilizate n operaii)..........................65 Fia suport 3.3. Analiza algoritmilor. Complexitatea algoritmilor (necesar de memorie, timpul de execuie al algoritmului, optimalitatea algoritmului, numr de operaii) .............69 IV. Fia rezumat.............................................................................................................................75 V. Bibliografie...............................................................................................................................76

I. Introducere
Materialele de predare reprezint o resurs suport pentru activitatea de predare, instrumente auxiliare care includ un mesaj sau o informaie didactic. Prezentul material de predare se adreseaz cadrelor didactice care predau n cadrul colilor postliceale, domeniul Informatic, calificarea Analist - programator. Modulul Proiectarea algoritmilor pentru care a fost elaborat materialul are alocate un numr de 48 ore, din care: Activiti de predare 24 de ore Laborator tehnologic 24 de ore Parcurgerea modulului Proiectarea algoritmilor se face n sptmnile S1-S4 din anul I de studiu, n paralel cu modulul Sisteme de calcul i reele de calculatoare.

Competena / Rezultatul nvrii Elaboreaz specificaiile problemei.

Teme Tema 1. Organizarea datelor. Elemente specifice algoritmilor

Fie suport Fia suport 1.1. Organizarea datelor. Date. Informaii. Fia suport 1.2. Elemente specifice algoritmilor: date, variabile, constante; tip de date; expresii, operaii, operatori; comentarii Fia suport 1.3. Structuri de date: structuri statice (articol, tablouri unidimensionale i bidimensionale, fiiere, iruri de caractere), structuri dinamice (liste simplu i dublu nlnuite, stive, cozi, arbori, grafuri).

Reprezint formal i grafic algoritmii de rezolvare a problemelor.

Tema 2. Algoritmi: caracteristici, reprezentare, implementare

Fia suport 2.1. Etapele rezolvrii problemelor. Algoritmi. Caracteristicile algoritmilor. Fia suport 2.2. Reprezentarea algoritmilor: Scheme logice. Limbaj pseudocod. Fia suport 2.3. Programarea structurata: structuri liniare, structuri alternative, structuri repetitive (cu test final, cu test iniial, cu numr cunoscut de pai), teorema de structur Bohm-Jacopini. 4

Competena / Rezultatul nvrii

Teme

Fie suport Fia suport 2.4. Proiectarea algoritmilor: top-down, bottom-up, modular, structurat Fia suport 2.5. Algoritmi elementari ce folosesc structuri fundamentale

Verific corectitudinea algoritmilor.

Tema 3. Corectitudinea algoritmilor

Fia suport 3.1. Surse de erori n elaborarea algoritmilor (erori n datele iniiale, erori de rotunjire, erori de metod, erori reziduale, erori de sintax) Fia suport 3.2. Verificarea corectitudinii algoritmilor (numr finit de pai, definirea corect a datelor, asigurarea valorilor pentru toate variabilele utilizate n operaii) Fia suport 3.3. Analiza algoritmilor. Complexitatea algoritmilor (necesar de memorie, timpul de execuie al algoritmului, optimalitatea algoritmului, numr de operaii)

Absolventul nvmntului postliceal cu specialitatea Analist-programator trebuie s fie capabil s utilizeze tehnologiile informatice i ale comunicrii pentru conceperea, proiectarea, elaborarea, testarea, implementarea i dezvoltarea sistemelor informatice, a programelor i a documentaiei tehnice aferente.

II. Documente necesare pentru activitatea de predare


Pentru predarea coninuturilor abordate n cadrul materialului de predare cadrul didactic are obligaia de a studia urmtoarele documente: Standardul de Pregtire Profesional pentru calificarea Analist - programator, nivelul 3 avansat www.tvet.ro, seciunea SPP sau www.edu.ro, seciunea nvmnt preuniversitar Curriculum pentru calificarea Analist - programator, nivelul 3 avansat www.tvet.ro, seciunea Curriculum sau www.edu.ro, seciunea nvmnt preuniversitar

III. Resurse
Tema 1. Organizarea datelor. Elemente specifice algoritmilor
Fia suport 1.1. Organizarea datelor. Date. Informaii.

Organizarea intern a datelor. Informaii. Date. Informaiile prelucrate sau reinute n memoria calculatorului se numesc date. Toate datele care intr, sunt prelucrate sau sunt memorate n calculator sunt reprezentate n form binar (codificate numeric prin 0 i 1) astfel nct procesorul s le poat interpreta. Reprezentarea intern a datelor se face difereniat, n funcie de tipul lor. Unitatea elementar de msura pentru informaie este Bitul (Binary digiT = cifr binar). Cea mai mic unitate de memorare adresabil de ctre procesor este octetul (BYTE-ul). Un octet are 8 bii numerotai de la 0 la 7 (bitul cel mai puin semnificativ este bitul 0). n cadrul memoriei, octeii sunt numerotai. Numrul de ordine al unui octet constituie adresa lui n memorie. Adresele de memorie sunt necesare n vederea accesului la informaii. 1KB 210 B Multiplii BYTE-ului 1MB 1GB 10 2 KB 210 MB 1TB 210 GB

Datele din memoria intern pot fi alfanumerice i numerice.

Date alfanumerice Datele alfanumerice se reprezint n memorie pe cte un Byte i sunt alctuite din litere mari i mici ale alfabetului englez, cifre, spaii, caractere speciale (precum ?, @, #, $, %, ^, &, *, (, ), <, >, ! etc), caractere greceti i alte semne. Codificarea acestor caractere se face folosind un cod numit cod ASCII (acronim de la American Standard Code for Information Interchange). Conform acestui cod, setul de caractere de baz primete coduri ntre 0-127, iar setul extins ntre 128-255. 7

Se observ ca numrul 255 reprezentat n binar este 1111 1111, deci este cel mai mare numr pe care il putem reprezenta pe 8 bii, de unde rezult intervalul 0-255 folosit pentru codurile ASCII. Este important pentru problemele ce se vor rezolva parcurgand modulele urmtoare s reinem ordinea n care sunt aezate pe axa codurilor ASCII caracterele litere mici, litere mari i cifrele. Se observ din graficul de mai jos c cifrele ncep de la codul 48, fiind plasate naintea literelor. Urmeaz literele mari (ncepand cu codul 65) i abia apoi literele mici.
CoduriASCII 0 48 49 5 7 65 66 97 98 255

0 Caractere

Asupra datelor de tip alfanumeric se pot face de regula operaii de concatenare (din dou iruri de caractere se obine un singur ir) i operaii de comparare (comparaia se execut prin compararea codurilor ASCII). Urmarind imaginea de mai sus, se pot observ urmatoarelel inegaliti: A> 0, a> A sau a> 0.

Date numerice Reprezentarea numerelor ntregi Numerele ntregi pot avea semn sau nu. n funcie de acest lucru avem dou reprezentri: reprezentarea n virgul fix fr semn (aritmetic dupa unii autori) i reprezentarea n virgul fixa cu semn (n cod complementar sau algebric). Reprezentarea numerelor reale Numerele reale sunt numerele care sunt formate din: semn, parte ntreag i parte fracionar. Ele pot fi reprezentate n 2 moduri: - n virgul fix (binary fixed point) - n virgul mobil (binary floating point)

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor 8

cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi:

O prezentare multimedia care s cuprind noiunile prezentate mai sus. Activiti interactive, de genul urmator:
o Activiti de asociere a numerelor cu sistemul numeric de reprezentare o Activiti de tip rebus, mperechere, completare cu noiunile nvate

Ca materiale de evaluare se pot folosi: o Probe practice i scrise

Fia suport 1.2. Elemente specifice algoritmilor: date, variabile, constante; tip de date; expresii, operaii, operatori; comentarii

Date, variabile, constante Am vzut c informaiile prelucrate de calculator se numesc date. Putem s clasificm datele n constante i variabile. Variabilele sunt date care i modific valoarea pe parcursul execuiei programului. Unei variabile i se atribuie patru entiti: nume (cu ajutorul cruia ne putem referi pe parcursul execuiei programului), valoare (la un moment dat), tip (valorile pe care le poate avea variabila la momente diferite trebuie s aparin aceluiai tip) i adresa n memorie. Corespondena ntre tip i nume se face cu ajutorul unei declaraii. Constantele sunt date care nu i modific valoarea. Aceste valori fixe reprezint caractere, iruri de caractere, numere ntregi sau raionale. Ca i n cazul variabilelor, constantele au un nume, o valoare (dar care nu se poate modifica), un tip i o adres de memorie. Este necesar, ca i la variabile, o declarare pentru a specifica tipul, numele i valoarea constantei. Tipuri de date Prin tip de date se intelege o mulime pentru care se definesc urmatoarele proprieti: - dimensiunea zonei de memorie asociate unui element - timpul de via asociat datei - mulimea operaiilor prin care valorile tipului pot fi modificate - operatorii utilizai i restriciile asupra acestora Tipurile de date pot fi predefinite (tipuri fundamentale) i definite de utilizator. n funcie de limbajul folosit, tipurile fundamentale de date au alte denumiri, ns conceptual ele vizeaz aceleai domenii de valori. n modulele urmatoare vom prezenta comparativ, tipurile fundamentale de date pentru mai multe limbaje de programare. Expresii, operaii, operatori O expresie este format dintr-unul sau mai muli operanzi asupra crora acioneaz operatori.

10

De exemplu, n expresia 2 * a b + c / 2, a, b, c sunt operanzii iar *, -, +, / sunt operatorii. Operaiile sunt prelucrarile n care intr datele. Ele pot fi aritmetice i nearitmetice (logice, relaionale, cu iruri de caractere, de conversie dintr-un tip de date n altul). Vom studia pe rand operatorii care se folosesc n cadrul acestor operaii. Operatori aritmetici Operatorii aritmetici sunt: +, -, *, /, %, unde semnul de mprire / are sensul de ct al mpririi (n cazul mpririlor cu ct i rest) sau de mprire real iar semnul % reprezint restul mpririi a dou numere ntregi.

Ordinea de efectuare a operaiilor este dat de prioritatea operatorilor aritmetici (cea cunoscut n matematic: nmuliri i mpriri i apoi adunri i scderi). Acetia sunt operatori binari adic acioneaz asupra a doi operanzi. n plus exist i operatorii unari plus i minus (+, -), care acioneaz asupra unui singur operand i au sensul de semn al numrului (pozitiv sau negativ). Operatori relaionali Sunt cei folositi i n matematic: > (mai mare), < (mai mic), (mai mare sau egal), (mai mic sau egal), = (egal), (diferit). Ei precizeaz o relaie de ordine sau de egalitate ntre date, care poate fi ndeplinit sau nu. Expresiile construite cu operatorii relaionali pot fi evaluate la o valoare de adevar: adevarat sau fals, dup cum este ndeplinit relaia sau nu. n funcie de limbajul de programare folosit, apar convenii de notaie specifice pentru operatori (de exemplu semnul diferit va fi implementat n C++ ca != iar n Pascal ca <> , pe cnd semnele i vor fi implementate ca <= i >=, la fel, n ambele limbaje).

= ,

Operatorii relaionali sunt operatori binari i se pot aplica numai operanzilor numerici, logici i de tip caracter (ordinea caracterelor fiind cea data de codul ASCII, despre care am vorbit n fia anterioar). Nu exist o ordine specific a operaiilor atunci cnd folosim operatorii relaionali. Operaiile se efectueaz n ordinea apariiei operatorilor, de la stanga la dreapta. 11

Operatori logici Operatorii logici sunt folosii pentru determinarea valorii de adevar a propoziiilor logice i anume adevarat sau fals, n unele limbaje codificate cu 1 respectiv 0.

and

5+ 8 5>

6+ 10 2<

adevrat
Operatorii logici sunt: negatia logic (not), i logic (and), sau logic (or). Operatorul not este unar, n timp ce and i or sunt binari. Rezultatul expresiilor ce conin operatori logici este cel prezentat n logic matematic i descris n tabelul urmator: p 0 0 1 1 Q 0 1 0 1 not p 1 1 0 0 p or q 0 1 1 1 p and q 0 0 0 1

Evaluarea unei expresii O expresie se evalueaz respectand regulile nvaate la matematic: n primul rand se evalueaz expresiile din parantezele rotunde, apoi se efectueaz operaiile n ordinea prioriatii lor. Tabelul urmator prezint prioritatea operatorilor, n ansamblul lor: Prioritate* Operatori 1 Negatia logic Aritmetici 2 multiplicativi 3 Aritmetici aditivi 4 Relationali 5 Conjunctia logic 6 Disjunctia logic * 1 este prioritatea maxim 12 Simbol ! *, /, % +, <, >, <=, >=, =, si (and) sau (or) Asociativitate* De la drepta la stanga De la stanga la dreapta De la stanga la dreapta De la stanga la dreapta De la stanga la dreapta De la stanga la dreapta * ordinea n care se execut, dac exist mai multe operaii cu aceeai

prioritate

Greeli frecvente n scrierea expresiilor Sunt cteva greeli care se fac n mod frecvent atunci cnd se scriu expresii matematice pentru a fi evaluate de calculator. Se omite semnul de nmulire. De exemplu se scrie 5a+3 (greit) n loc de 5*a+3 (corect) Se omit parantezele, de exemplu la scrierea unor fracii sau la calcularea mediei aritmetice: a+b/2 (greit) n loc de (a+b)/2 (corect) O alta greeal este utilizarea nlanuit a operatorilor relaionali. De exemplu se scrie a<b<c (greit) n loc de a<b i b<c (corect)

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi:

O prezentare multimedia care s cuprind noiunile prezentate mai sus. Activiti interactive, de genul urmator:
o Activiti de rezolvare de probleme (ex: aflarea valorii de adevr a unei

expresii logice, transformarea unei expresii matematice n expresie logic)


o Activiti de identificare a ordinii operaiilor ntr-o expresie

o Activiti de tip rebus, mperechere, completare cu noiunile nvate

Ca materiale de evaluare se pot folosi: o Probe practice i scrise

13

14

Fia suport 1.3. Structuri de date: structuri statice (articol, tablouri unidimensionale i bidimensionale, fiiere, iruri de caractere), structuri dinamice (liste simplu i dublu nlnuite, stive, cozi, arbori, grafuri).

Structuri de date Doar rareori programele prelucreaz numai date simple (numere ntregi, reale, caractere). De cele mai multe ori programele prelucreaz volume mari de date i pentru c prelucrarea s se realizeze eficient este necesar organizarea datelor n structuri. Structurile de date sunt modalitati de stocare a datelor ntr-un calculator astfel nct ele s poat fi folosite n mod eficient. Uneori, dac se face o alegere optim a structurii de date, implementarea va conduce la un algoritm eficient, care utilizeaz mai puine resurse (ca de exemplu memoria necesar i timpul de execuie). Pentru o structur de date trebuie specificate trei caracteristici: descrierea tipului de baza al componentelor metoda de structurare modul de acces la componente

Deoarece aceste caracteristici, n limita unor restricii, sunt la alegerea programatorului, tipurile structurate nu se mai pot numi tipuri de date standard, recunoscute i alocate automat de ctre compilator la simpla apariie a unui cuvnt rezervat tipului respectiv. Structurile de date pot fi clasificate dup diferite criterii:

15

Duptipul elem ente lor

om ene(componentele sunt de acelasi tip) og neom ene(componentele sunt de tipuri diferite) og cuacces direct (componentele se acceseaya prin numarul de ordine) cuacces s ecvential (accesareaunei componentae se face parcurgand toate componentele care o preced n structura)

Dupm odul delocalizarea elem ente lor structurii

Duplocul unde S tructuri interne (n memoria interna) sunt create S tructuri externe(n memoria externa) (tipul de m orie) em

Duptim pul deutilizare

Structuri de datetem porare Structuri de date perm anente s tatice(se aloca un anumit spatiu in memorie la inceputul ex ecutiei programului, care nu se va mai modifica n timpul rularii programului) dinam (numarul de componente se modifica n timpul ex ice ecutiei programului)

Dup stabilitatea structurii

Asupra unei structuri de date se pot efectua mai multe operaii: Operaia Crearea Consultarea Actualizarea Sortarea Copierea Mutarea Redenumirea Divizarea Reuniunea (concatenarea) tergerea Efectul operaiei se realizeaz structur de date n forma iniial, pe suportul de memorie utilizat se realizeaz accesul la componentele structurii, n vederea prelucrrii valorilor acestora i a extragerii de informaii se face prin trei operaii: adaugrea unor noi componente, tergerea unor componente i modificarea valorii componentelor. se rearanjeaza componentele structurii n funcie de anumite criterii de ordonare se realizeaz o imagine identic a structurii, pe acelai suport sau pe suporturi diferite de memorie se transfer structura, pe acelai suport, la o alta adresa, sau pe un suport de memorie diferit se schimb numele structurii se realizeaz dou sau mai multe structuri din una se realizeaz o singur structur de date, prin combinarea a dou sau mai multe structuri de date de acelai tip prin care se distruge structur de date.

Structuri statice de date Structurile statice de date folosite sunt: - structura de tip tablou - structura de tip ir de caractere - structura de tip articol 16

- structura de tip fiier Primele trei tipuri se refer la structurarea datelor n zone de lungime fix ale memoriei interne. Al patru-lea tip se refer la structurarea datelor pe suport extern, care, fa de memoria intern, se poate considera nelimitat. Structura de tip TABLOU Exist mai multe situatii cnd sunt necesare mai multe date de prelucrat n cadrul unei probleme. Iat dou exemple: Se citesc 100 de numere. - S se precizeze dac sunt distincte sau nu. - S se afieze n ordine invers citirii. Pentru rezolvare este necesar s reinem o sut de variabile de tip ntreg. Denumirea acestora prin nume diferite ar fi greu de realizat. Cea mai bun soluie este de a da un nume unic tuturor acestor valori i de a ne referi la grupul lor prin acest nume, specificand numrul de elemente din grup. Fiecare element va fi adresat printr-un numr de ordine, numit indice. Dac adresarea unui element din tablou se face dup un singur indice, atunci tabloul se numete unidimensional (mai pe scurt vector); dac adresarea se face dup doi indici (linia i coloana), atunci tabloul se numeste bidimensional (matrice).

1 24

Vectorul V 2 3 4 5 -9 17

5 88

Exemplu de vector unde elementul al 3-lea poate fi accesat prin: V[3]

Matricea A(3x5) 1 2 3 4 5 1 2 3 24 0 56 5 34 3 -9 8 4 17 -7 1 88 -2 -9

Exemplu de matrice unde elementul al 3-lea de pe linia 2 poate fi accesat prin: A[2][3]

17

Un tablou este deci o structur omogen de date indexat, care cuprinde un numr finit de componente, toate avnd acelai tip, pe care l numim tip de baz. Structura de tip tablou impune ca elementele s fie asezate n memorie n succesiune continua de octei, fiecare component ocupnd acelai numr de octei ct specific tipul de baza. Indicele este o valoare ordinal care identific n mod unic o componet (un element) a tabloului. Prelucrarea unui tablou se bazeaz, n general, pe execuia unor operaii asupra componentelor sale. Operaiile sunt cele permise de tipul de baz al tabloului. Pentru definirea unui tablou este necesar s se tie numrul maxim de componente care pot aprea n prelucrarile din cadrul problemei, n scopul declarrii corecte a spaiului pe care l va ocupa acesta.

Structura de tip IR DE CARACTERE Se comport ca un vector de caractere, avnd ns operaii specifice tipului de date ir de caractere. Aceste operaii difer n funcie de limbajul de programare folosit.

decaractere:6,7_ si, @ litere sir


Exemplu de ir de caractere: conine att litere, cifre ct i caractere speciale Structura de tip ARTICOL Articolul este o structur de date eterogen (cu elemente de tipuri diferite), cu acces direct la elementele sale, ntre care exist o relaie de ordine ierarhic. Variabilele de tip articol se reprezint intern ca succesiuni de cmpuri elementare, ce pot fi de tipuri diferite, cu reprezentarea intern i lungimea fizic specifice tipurilor lor. Lungimea zonei de memorie rezervat pentru variabila de tip articol rezult din nsumarea lungimilor cmpurilor. Aceasta nu poate depi 65520 octei (ca orice variabil de tip structurat).

18

ELEV nume vrst medie

In figura de mai sus avem un exemplu de articol cu trei campuri de tipuri diferite: nume de tip ir de caractere, vrst de tip ntreg i medie de tip real. Adresarea cmpurilor (prin numele lor) se face folosind operatorul . (punct). Dac se declar o variabil e de tip ELEV, atunci un element ar putea fi accesat pe cmpuri astfel: e.nume, e.varsta, e.medie Datele de tip articol pot fi adresate n dou moduri: global sau pe cmpuri (cum am vzut n exemplul anterior). Adresarea global este permis numai n operaia de atribuire, cu condiia ca ambele variabile (surs i destinaie) s fie articole de acelai tip. Structura de tip FISIER Fisierele sunt structuri externe de date create n memoria extern i care dau posibilitatea pstrarii datelor n mod permanent, chiar i dup terminarea executrii programului.

Structuri dinamice de date Structurile dinamice de date sunt: structura de tip LIST structura de tip STIV structura de tip COAD structura de tip GRAF structura de tip ARBORE Structura de tip LIST Lista este o structur dinamic de date, nelegnd prin aceasta faptul c ea are un numr variabil de elemente. La nceput lista este o mulime vid. n timpul execuiei programului se pot aduga elemente noi sau se pot terge elemente din list. Elementele unei liste sunt de acelai tip, i anume un tip utilizator. Exist situaii n care este dificil s se evalueze numrul maxim al elementelor unei liste, precum i situaii cnd numrul lor difer de la execuie la execuie. n aceste situaii nu

19

este potrivit s se aleag ca structuri de date cele alocate static (de tipul vector sau matrice). n schimb este avantajoas structur alocat dinamic (de tip list). Legatura elementelor unei liste se face cu ajutorul pointerilor (adrese ctre elementele urmtoare) care intr n compunerea elementelor listei. Listele organizate n acest fel se numesc liste nlnuite. Elementele unei liste se numesc noduri. Nodul este un articol declarat de utilizator i contine campuri cu informaia util i un camp ce conine adresa unde se va regsi elementul urmator n list.

Informatia utila

14

Adresaspre urmatorul element

Dac ntre nodurile unei liste exist o singur legatur (spre elementul urmtor), atunci lista se numete simplu nlnuit.

14

29

n mod analog, lista este dublu nlnuit dac ntre nodurile ei sunt definite dou legturi (i spre elementul urmtor i spre cel precedent).

14

29

Operaiile ce se pot efectua ntr-o list nlnuit sunt: a) crearea listei nlnuite; b) accesul la un nod oarecare al listei; c) inserarea unui nod ntr-o list nlnuit; d) tergerea unui nod dintr-o list nlnuit; e) tergerea unei liste nlnuite. Structura de tip STIV

20

O stiva este o list simplu nlnuit gestionat conform principiului LIFO (Last n First Out). Conform acestui principiu, ultimul nod pus n stiv este primul nod care este scos din stiv. Stiva, ca i lista, are dou capete: baza stivei i vrful stivei. Cu alte cuvinte stiva este un caz particular al listelor nlnuite.

Exemple de stive din viata reala. Asupra unei stive se definesc operaiile: 1. adaugre element n stiv (numit de regul PUSH); 2. extragere element din stiv (numit de regula POP); Pentru crearea stivei se va folosi operaia PUSH n mod repetat, iar pentru tergerea stivei se va folosi operatia POP n mod repetat. Cele dou operaii se realizeaz n varful stivei. Astfel, dac se scoate un element din stiv, atunci acesta este cel din vrful stivei. Dac se adaug un element n stiv, atunci acesta se pune n vrful stivei.

PUSH Vrful stivei

POP

Stiva: LIFO
Structura de tip COAD O coad este o list simplu nlnuit gestionat conform principiului FIFO (First n First Out). Conform acestui principiu, primul nod pus n coad este primul nod care este scos din coad. Coada, ca i lista, are dou capete: primul i ultimul element.

21

Asupra unei cozi se definesc operaiile: 1. adaugre element la coad; 2. extragere element din coad; Pentru crearea cozii se va folosi operaia de adugare n mod repetat, iar pentru tergerea cozii se va folosi operaia de extragere n mod repetat. Cele dou operaii se realizeaz n locuri bine stabilite: adaugrea se face dup ultimul element al listei iar extragerea se face din capul listei.

Coada: FIFO

Extragere

Adugare

Structura de tip GRAF Grafurile sunt structuri de date care se pot implemente atat ca structuri de date alocate static ct i alocate dinamic. Grafurile sunt utilizate n modelarea problemelor legate de activitati ntlnite n realitatea de zi cu zi. Structura unui graf reflect structur unei probleme reale. Grafurile sunt formate din puncte (numite noduri sau vrfuri - engleza = nodes / vertices) i conexiuni ntre noduri (numite muchii eng;eza edges). De exemplu, n figura de mai jos avem dou grafuri A i B, fiecare cu cte 5 noduri i numr diferit de muchii.

22

Se numete graf neorientat, o pereche ordonat de multimi notat G = (V,E), unde V = {v1, v2, , vn} este o mulime finit i nevid de elemente numite noduri sau vrfuri iar E = {e1,e2,,en} este o mulime de perechi neordonate de elemente din E numite muchii. Se numete graf orientat o pereche ordonat de mulimi G=(V,E), unde unde V = {v1, v2, , vn} este o multime finit i nevid, numit mulimea nodurilor sau vrfuri, iar E = {e1,e2,,en} este o mulime format din perechi ordonate de elemente ale lui E, numit mulimea arcelor. Un exemplu de graf orientat este: reeaua de strzi a unui ora. Strzile sunt muchii n graf, iar interseciile reprezint vrfurile grafului. ntruct mergnd pe jos ne putem deplasa pe orice strad n ambele sensuri, vom spune c din punctul de vedere al pietonilor, graful unui ora este neorientat.

Cu totul altfel stau lucrurile n ceea ce privete conductorii auto, pentru c n orice ora exist strzi cu sens unic. Pentru un ofer strzile trebuie s primeasc n graf o anumit orientare. Desigur c acele strzi pe care se poate circula n ambele sensuri vor primi orientare dubl. Am ajuns astfel la noiunea de graf orientat.

23

Alte exemple de grafuri din viaa real Pentru a defini notiunea de ARBORE, vom defini numai cateva notiuni legate de grafuri (restul se vor studia la modulul respectiv) Lan = este o secven de noduri ale unui graf neorientat cu proprietatea c oricare dou noduri consecutive din lant au o extremitate comuna (spunem ca sunt adiacente) Ciclu = Un lan n care primul nod coincide cu ultimul Graf conex = graf n care ntre oricare 2 noduri exist un lan. Structura de tip ARBORE Un arbore cu radacin este un graf neorientat conex fr cicluri n care unul din noduri este desemnat ca rdcin. Nodurile pot fi aezate pe niveluri ncepnd cu rdcina care este plasat pe nivelul 1. Radacina este un nod special care genereaz asezarea 3 unui arbore pe niveluri; Aceast operaie se efectueaz 2 n funcie de lungimea lanurilor prin care celelalte noduri 1 4 sunt legate de rdcin. 5 Un nod y este descendentul nodului x ntr-un arbore cu rdcin dac este situat pe un nivel mai mare dect nivelul lui x i exist un lan care le unete i nu trece prin rdcin.

24

Exemplu de graf cu 5 niveluri, radacina fiind pe nivelul 1 ntr-un arbore cu rdcin, un nod este frunz dac nu are nici un descendent direct. n modulele urmatoare se vor trata amnunit toate aceste structuri de date, specificnd instruciunile folosite n limbajele de programare studiate.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi: O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator: o Activiti drag & drop cu tipurile de date i exemple de utilizare o Activiti de asociere ntre tipurile de date i caracteristicile lor o Activiti de asociere a problemelor reale cu structura de date potrivit o Activiti de tip rebus, mperechere, completare cu noiunile nvate o Studii de caz: plecnd de la o situaie real dat, elevii trebuie s identifice structurile de date cele mai potrivite. o Eseu cu teme de genul: S se compare tipul de date alocate static cu cele alocate dinamic, sau Paralel ntre tipul de date graf si lista alocata dinamic Ca materiale de evaluare se pot folosi: o Probe practice i scrise

25

Tema 2. Algoritmi: caracteristici, reprezentare, implementare


Fia suport 2.1. Etapele rezolvrii problemelor. Algoritmi. Caracteristicile algoritmilor.
Algoritmi Noiunea de algoritm este prezent azi n contexte diferite. Termenul algoritm vine de la numele matematicianului persan Abu JaFar Mohamed ibn Musa al Khowarizmi (circa 825 e.n.), care a scris o carte cunoscuta sub denumirea latina de Liber algorithmi. Tot el a introdus denumirea de algebra n matematic. n trecut, termenul de algoritm era folosit numai n domeniul matematicii, nsa datorit dezvoltrii calculatoarelor, astzi gndirea algoritmic nu mai este un instrument specific matematicii ci folosit n diverse domenii. Prin algoritm nelegem o succesiune finit de operaii cunoscute care se execut ntr-o succesiune logic bine stabilit astfel nct plecand de la un set de date de intrare, s obtinem ntr-un interval de timp finit un set de date de ieire.

Caracteristicile algoritmilor Finitudine proprietatea algoritmilor de a furniza datele de ieire ntr-un timp finit (adica dupa un numr finit de pai). De exemplu, dac avem urmtoarea problem: Se citete un numr n natural. S se efectueze operaia de extragere a radicalului i s se afieze rezultatul. Aceast problem nu este un proces finit, deoarece nu s-a specificat precizia cu care se va furniza rezultatul. Claritatea - algoritmul trebuie s descrie operaiile clar i fr ambiguii. Generalitatea proprietatea algoritmilor de a rezolva o intreag clas de probleme de acelai fel. De exemplu adunarea 2+8 este o problem care adun numai aceste dou numere, ns dac elaboram o metod de rezolvare care va aduna a+b, unde a i b pot avea orice valori ntregi, spunem ca am realizat un algoritm general. Corectitudinea spunem c un algoritm este corect dac el furnizeaz n mod corect datele de ieire pentru toate situaiile regsite n datele de intrare. 26

De exemplu, trebuie s evaluam expresia E=a/b+c. O succesiune de pai pentru evaluarea expresiei este: - se citete a, b, c - se calculeaz a/b, apoi rezultatul se adun cu c. - se atribuie lui E valoarea calculat - se afieaz E Acest algoritm NU furnizeaza rezultatul corect pentru toate valorile de intrare. n cazul n care b=0, mprirea nu se poate efectua dar algoritmul nu verific acest lucru. Exist totui algoritmi care sunt coreci, clari, generali i furnizeaz soluia ntr-un timp finit ns mai lung sau folosesc mai mult memorie dect ali algoritmi. Aceasta nseamn c atunci cnd elaborm un algoritm, nu ne oprim la prima soluie gsit. Vom ncerca s gasim algoritmi care s dea soluia ntr-un timp ct mai scurt, cu ct mai puin memorie folosit. Cu alte cuvinte vom ncerca s elaboram algoritmi eficieni. Numim deci eficien - capacitatea algoritmului de a da o soluie la o problema ntrun timp de executie ct mai scurt, folosind ct mai puin memorie.

Etapele rezolvrii problemelor Rezolvarea unei probleme este un proces complex, care are mai multe etape. 1. Analiza problemei, pentru a stabili datele de intrare i de ieire. 2. Elaborarea unui algoritm de rezolvare a problemei. 3. Implementarea algoritmului ntr-un limbaj de programare. 4. Verificarea corectitudinii algoritmului implementat. 5. Analiza complexitatii algoritmului.

ET APELE REZ VRII UNEI PROBLEME OL

Analiza problemei

Elaborarea algoritmului

Implementare n limbaj de programare

Verificare corectitudine

Analiza complexitii

27

Toate aceste etape vor fi evidentiate pe algoritmii ce vor fi prezentai n fiele suport i modulele urmtoare.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi:

O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator:
o Activiti drag & drop de ordonare a etapelor de rezolvare a problemelor

o Activiti de tip rebus, mperechere, completare despre caracteristicile algoritmilor

Ca materiale de evaluare se pot folosi: o Probe practice i scrise

28

Fia suport 2.2. Reprezentarea algoritmilor: Scheme logice. Limbaj pseudocod.


Reprezentarea algoritmilor Dup etapa de analiz a problemei n care s-au stabilit datele de intrare i cele de ieire, urmeaz etapa de elaborare a algoritmului. Acesta trebuie reprezentat ntr-un mod inteligibil. ntrebarea este cum putem s reprezentm algoitmul astfel nct s fie nteles de cei ce l citesc? Un posibil rspuns ar fi printr-un limbaj de programare. Este un raspuns bun pentru cei ce cunosc acel limbaj de programare, nsa ceilali nu vor ntelege nimic. Nu putem s impunem altora s nvete acel limbaj doar pentru a intelege algoritmii descrii de noi. n plus, se observ c nu exist niciun limbaj de progamare care s dureze sau care s fie acceptat de toata lumea. Este deci necesar utilizarea unui limbaj comun de repezentare a algoritmilor, dnd apoi posibilitatea fiecarui programator s traduc algoritmul n ce limbaj de programare dorete. De-a lungul timpului s-au remarcat dou modaliti de reprezentare a algoritimilor: schemele logice i limbajul pseudocod.

Schemele logice reprezint un algoritm n mod grafic, folosind blocuri diferite pentru operaii diferite. Aceast metod are unele dezavantaje: schemele sunt stufoase, greu de urmrit. n tabelul urmator prezentm tipurile de blocuri folosite n reprezentarea algoritmilor. Schemele logice sunt mai utile celor care abia nva s programeze i deci sunt n faza de formare a gndirii algoritmice. Recomandm ca la scrierea schemelor logice s se scrie mai nti coninutul blocului i apoi s se deseneze blocul corespunztor.

29

Blocurile specifice schemelor logice SIMBOL DENUMIRE Bloc terminal SEMNIFICAIE Marcheaz nceputul algoritmului Marcheaz sfritul algoritmului

S ART T

Bloc terminal

S OP T
C itetea ,b

Bloc de intrare / citire a Se face transferul de date datelor de intrare de la utilizator ctre algoritm Bloc de ieire / scriere aSe face transferul de date datelor de ieire ctre utilizator

S a crie ,b

Bloc de atribuire

x expresie
Bloc de prelucrare O prelucrare este compus din mai multe instruciuni elementare

Variabilei x i se atribuie valoarea expresiei

prelucra re

n interior se scriu instruciunile sau un nume ce desemneaz un grup de instruciuni

NU

C ondiie

D A

Bloc de decizie n care se Dac condiia este evalueaz condiia adevrat se execut obinndu-se o valoare ramura DA, altfel se logic Adevarat sau execut ramura NU Fals Bloc conector logic Conecteaz mai multe puncte din algoritm

Bloc conector de pagin Specific pagina cu care se continu schema

30

Limbajul Pseudocod Limbajul pseudocod este un ansamblu de convenii (codificri) care definesc operaiile (instruciunile) permise pentru reprezentarea algoritmilor. Respectand aceste convenii, chiar n forme diferite, algoritmii reprezentai n pseudocod pot fi citii de orice persoan, indiferent c este sau nu programator. Limbajul pseudocod nu respect o sintaxa anume, nu are un standard. Sunt doar nite convenii pe care trebuie s le respectm atunci cnd reprezentm un algoritm. nstructiunile se pot scrie n limba englez sau n limba romn. n acest material i n cele ce urmeaz vom adopta un limbaj cu instruciuni n limba romn. n pseudocod putem scrie declarri de variabile, specificnd numele i tipul lor. Pe lng declaraiile de variabile, limbajul pseudocod conine cuvinte cheie, instruciuni (nceput, sfrit, intrare/ieire, atribuire, decizie, selecie, repetitive), proceduri/funcii. Toate acestea vor fi prezentate pe larg n fia suport urmtoare. Prezentm mai jos corespondena ntre instruciunile pseudocod i blocurile din schemele logice. INSTRUCIUNE PSEUDOCOD a, b, c intregi x,z reale Citete a,b DENUMIRE Declaratii de variabile SIMBOL SCHEM LOGIC

C itetea ,b

Citirea datelor de intrare

Scrie a,b

Scrierea datelor de ieire

S a crie ,b

x 10 a a+1 | instructiune1 | instructiune2 | instructiune3 |_ dac c atunci | execut p |altfel | execut q |

Instruciune de atribuire Bloc de Instruciuni O prelucrare este compus din mai multe instruciuni elementare Instruciune de decizie n care se evalueaz condiia obinndu-se o valoare logic Adevarat sau Fals
NU

x expresie

prelucrare

C ondiie

DA

31

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi:

O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator:
o Activiti

de mperechere, completare, instruciunilor i reprezentrile lor ndeplinit

asociere

ntre

numele

o Activiti de asociere a rolului unui bloc sau instruciuni cu aciunea

Ca materiale de evaluare se pot folosi: o Probe practice i scrise

32

Fia suport 2.3. Programarea structurat: structuri liniare, structuri alternative, structuri repetitive (cu test final, cu test iniial, cu numr cunoscut de pai), teorema de structur Bohm-Jacopini.
Principiile programrii structurate Programarea structurat are ca scop dezvoltarea unor programe uor de realizat n echip, uor de depanat i de actualizat. Apar deci cteva principii de care un programator trebuie s in seama. Acestea se numesc principiile programrii structurate. Primul principiu este modularizarea. n cadrul unor probleme complexe este necesar descompunerea acestora n subprobleme mai simple, pentru care se pot scrie module de program mai simple. Fiecare modul este independent de celelalte, n final ele interacionnd printr-un program principal, un fel de interfa. Modulele pot fi implementate de programatori diferii din cadrul unei echipe. Ele pot fi testate, modificate, depanate n mod independent, neafectnd i celelalte module. Modulele au aceeai structur ca i programele principale, putnd declara variabile att n module (numite variabile locale) ct i n programul principal (numite variabile globale). Modulele create sunt proceduri i funcii i vor fi studiate n cadrul unui limbaj de programare. Un al doilea principiu este structurarea datelor i a prelucrrilor. Datele se pot grupa n structuri de date aa cum am aratat mai sus. Prelucrrile asupra datelor se pot grupa i ele n structuri despre care vorbim n teorema Bohm-Jacopini.

Teorema Bohm-Jacopini Teorema Bohm-Jacopini afirm ca orice algoritm se poate reprezenta folosind 3 tipuri de structuri fundamentale: structur liniar, structur alternativ i structur repetitiv. Structura liniar Structura liniar (numit i secvential) este alcatuit din urmatoarele instruciuni: comentarii declararea variabilelor instruciunea de citire instruciunea de scriere instruciunea de atribuire instruciunea compus (sau blocul de instruciuni) 33

Comentarii Putem adaug comentarii n cadrul algoritmului pentru a descrie operaiile efectuate sau a da indicaii necesare la implementare. Adeseori, cnd se lucreaz n echip, comentariile sunt foarte necesare. Sunt mai multe variante n care putem s scriem comentarii. n general, fiecare programator va folosi ceea ce crede c este mai uor de nteles sau mai rapid de scris. n algoritmii prezentai n acest modul, comentariile ncep cu semnul // i se vor scrie la nceputul fiecarui rnd de comentariu. Nu este necesar scrierea semnului i la sfritul rndului. Prezentam ca exemplu dou tipuri de comentarii Exemplu 1 // Acesta este un comentariu // Fiecare rnd de comentariu ncepe cu semnul // Exemplu 2 /* Acest comentariu se poate scrie pe mai multe linii, iar sfarsitul comentariului se face cu */ Declararea variabilelor La nceputul algoritmului trebuie s se precizeze datele de intrare, datele de ieire, datele de manevr i tipul lor. O variabil nu se poate declara de mai multe ori n cadrul aceluiai algoritm. variabila tip //Exemple a ntreg b real x caracter Instruciunea de citire Efectul instruciunii este de a da valori (de la tastatur sau dintr-un fiier) variabilelor de intrare cu care lucrm. Citete expresie1, expresie2, expresie3 //Exemplu Citeste a, b, x Instruciunea de scriere Instruciunea afieaz pe ecran sau n fiier valorile variabilelor. Scrie expresie1, expresie2, expresie3 34

//Exemplu Scrie a, b Instruciunea de atribuire Efectul instruciunii este acela de a atribui valoarea din dreapta sgeii variabilei specificat n stanga. n cazul n care n dreapta avem o expresie, aceasta se va evalua i apoi valoarea va fi atribuit variabilei din stanga. variabil expresie //Exemplu: a 56 b a-2*a c c+1 Ultima atribuire are un sens deosebit, adic variabila c va lua valoarea avut la pasul anterior al algoritmului marit cu 1. Blocul de instruciuni Este folosit pentru a efectua mai multe instruciuni, n ordinea n care sunt scrise. Sunt mai multe variante de marcare a nceputului i sfaritului de bloc de instruciuni. Mai jos prezentm dou dintre ele, urmnd ca pe parcursul modulului s folosim varianta cu paranteze. //Exemplu 1 | instructiune1 | instructiune2 | instructiune3 |_ //Exemplu 2 { instructiune1 instructiune2 instructiune3 } APLICAII: Prezentm n continuare doi algoritmi liniari importani:

Interschimbarea a dou valori (numit i regula celor trei pahare) Fie dou variabile ntregi a i b. Valorile lor se citesc de la tastatur. S se interschimbe valorile celor dou variabile apoi s se afieze noile valori, pe acelai rnd cu un spaiu ntre ele. Exemplu: dac pentru variabilele a i b se citesc valorile 5 i 8, se va afia: 8 5

35

a, b ntregi //date de intrare aux ntreg //date de manevr citete a, b aux a a b b aux scrie a, b Explicarea algoritmului: Pentru a interschimba valorile, se folosete o variabil auxiliar, care preia valoarea lui a, apoi a ia valoarea lui b, urmnd ca n final b ia valoarea lui aux, adic valoarea lui a avut iniial. Algoritmul de interschimbare se mai numete i Regula celor trei pahare, deoarece este necesar o a treia variabil pentru a face interschimbarea. Algoritmul reprezentat cu ajutorul schemei logice este urmatorul: Acest algoritm este ntlnit n algoritmi precum sortarea numerelor.

S ART T C itetea ,b a a ux a b b a ux S a crie ,b S OP T


s

Cifrele unui numr Fie x un numr ntreg format din exact 5 cifre. S se afieze cifra unitilor i cea a sutelor, pe acelai rnd, cu un spaiu ntre ele. Exemplu: dac pentru x se citete valoarea 12345 se va afia 5 3. x ntreg //date de intrare c1,c2 ntregi //date de manevr citete x //rein cifra unitilor n c1 c1 x % 10 x x/100 //elimin cifra unitilor i a zecilor //rein cifra sutelor n c2 c2 x % 10 scrie c1, c2 Explicarea algoritmului: Pentru a obine cifrele unui numr trebuie s efectum mpriri la 10. Am artat c operatorul % returneaz restul mpririi. n cazul n care un numr se mparte la 10, atunci restul este chiar ultima cifr, iar ctul mpririi este numrul far ultima cifra. n cazul mpririi la 100 restul returneaz ultimele 2 cifre, iar ctul este numrul far ultimele 2 cifre. Pentru a afia cifra sutelor este suficient s eliminm ultimele 2 cifre (prin mprire la 100) i s afim ultima cifr a numrului nou obinut. 36

Structura alternativ Auzim n viaa de zi cu zi afirmaii de genul: DAC obin note de promovare la toate examenele, ATUNCI voi lua diploma, ALTFEL trebuie s mai nv. Se remarc trei cuvinte ce au un rol deosebit: DAC, ATUNCI, ALTFEL. Propoziia are trei componente i anume: condiie, transcris prin obin note de promovare la toate examenele, condiie pe care o notm cu c; aciune transcris prin voi lua diploma, notat cu p, aciune asociat cu ATUNCI, adic se execut doar dac obin note de promovare la toate examenele; aciune transcris prin trebuie s mai nv, notat cu q, aciune asociat cu ALTFEL, adic se execut dac NU obin note de promovare la toate examenele; Folosind notaiile fcute, afirmaia se poate transcrie n pseudocod sau schem logic. Secvena de instruciuni se numete structur alternativ i se poate reprezenta i grafic. Structura alternativ admite i o form particular, caz n care avem o ramur vid (adic nu se execut nici o operaie): dac c atunci | execut p |altfel | execut q | dac c atunci | execut p |

NU a ltfel

C ondiie

D A atunci

NU altfel

C ondiie

DA atunci

E xecutq

E xecutp

E xecutp

Exista cazuri n care condiia poate fi mai complex, de genul: DACA obin note de promovare la toate examenele I toate notele sunt peste 9, ATUNCI voi putea beneficia de burs, ALTFEL nu. Notnd prima condiie cu c1 (obin note de promovare la toate examenele), cu c2 a dou condiie (toate notele sunt peste 9), cu p aciunea voi putea gsi un job cu salariu mai mare i cu q aciunea salariul va fi mai mic, se va folosi operatorul logic and iar condiia va fi compus: c1 and c2. 37

Observaii Att ramura ATUNCI ct i ALTFEL permit executrea unei singure instruciuni. n cazul n care este necesar efectuarea mai multor instruciuni, acestea se grupeaz ntr-o singur instruciune compus. Uneori avem o instruciune de decizie subordonat unei alte instruciuni (de decizie sau de alt fel). Este important ca instruciunea subordonat s fie scris identat fa de instruciunea care o subordoneaz. Acest mod de scriere nu este obligatoriu pentru funcionarea algoritmului ns face programele mai uor de urmrit i de actualizat.

APLICAII: Prezentm n continuare doi algoritmi alternativi importani:

Paritatea unui numr Se introduce de la tastatur un numr ntreg x. S se testeze dac numrul este par sau nu i s se afieze un mesaj corespunztor. Exemplu: dac pentru x se citete valoarea 4123 se va afia Nu este par iar pentru valoarea 588 se va afia Este par. x ntreg //date de intrare citete x dac x%2=0 atunci | scrie Este par |altfel | scrie Nu este par | Explicarea algoritmului: Pentru a verific dac un numr este par trebuie s verificm dac restul mpririi lui la 2 este 0. n caz afirmativ rezulta ca numrul este par, altfel el este impar.

Maximul intre dou numere Se introduc de la tastatura dou numere ntregi x i y. s se afiseze numrul care este mai mare intre cele dou. n caz ca sunt egale, se va afia un mesaj corespunzator. Exemplu: dac pentru x i y se citesc valoarile 612 i 3129 se va afia 3129 iar pentru valoarile 58 i 58 se va afia Numerele sunt egale. x, y ntregi //date de intrare citete x, y 38

dac x=y atunci | scrie Numerele sunt egale |altfel | dac x>y atunci | | scrie x | |altfel | | scrie y | | | Explicarea algoritmului: Pentru a afia maximul intre dou numere le vom compara. Dac cele dou numere sunt egale vom afia mesajul Sunt egale, altfel verificm dac x>y, situatie n care vom afia pe x, altfel vom afia pe y.

Structura repetitiv O structur repetitiv se caracterizeaz prin posibilitatea efecturii repetitive a unei secvene de instruciuni, ct timp este ndeplinit o anumit condiie sau pna cnd se ndeplinete o anumit condiie. Repetiia secvenei de instruciuni se numete iteraie. Structurile repetitive se mai ntalnesc sub numele de structuri ciclice sau cicluri. Exist trei tipuri de structuri repetitive: - Structura cu numr necunoscut de repetiii cu test iniial (CT TIMP sau WHILE) - Structura cu numr necunoscut de repetiii cu test final (EXECUTA - CT TIMP sau DO-WHILE) - Structura cu numr cunoscut de repetiii (PENTRU sau FOR)

Structura repetitiv cu test iniial - CT TIMP sau WHILE Structura repetitiv cu test iniial are dou componente: conditia, o expresie logic ce poate fi evaluat prin valoarea TRUE sau FALSE, condiie pe care o notm cu c; actiune, o secven de instruciuni ce se vor execut repetat, notat cu a, aciune asociat cu EXECUT;

Folosind notaiile fcute, structur repetitiv cu test iniial se poate scrie astfel: ct timp c execut | a |

39

Principiul de executre este urmtorul: Ct timp condiia c este adevarat, se execut secvena de instruciuni a. Execuia se oprete cnd condiia c nu mai este adevarat.

Observaii: Pentru ca structur repetitiv s nu intre ntr+un ciclu infinit, trebuie ca secvena de instruciuni s modifice cel puin una din variabilele care intervin n condiie astfel nct aceasta s poat deveni fals la un moment dat. Dac de la bun nceput condiia are valoarea fals, secvena de instruciuni nu se execut nici mcar o data.

Exemplu: Suma cifrelor S consideram urmatoarea problem: Se citete un numr n, ntreg, cu cel mult 9 cifre. Se cere s se afieze suma cifrelor numrului n.

Explicarea algoritmului: Rezolvarea presupune c se extrag pe rnd cifre din numr i se adaug la sum. Soluia se poate exprima n cuvinte astfel: CAT TIMP numrul este diferit de zero (deci mai sunt cifre de extras), EXECUT extrage i elimin ultima cifr din numrul n apoi adaug cifra la sum. Soluia are dou componente: condiia, trascris prin numrul este diferit de zero; aciune transcris prin extrage i elimin ultima cifr din numrul n apoi adaug cifra la sum;

Notnd numrul dat cu n, cifra eliminat cu c i suma cifrelor cu s, algoritmul de rezolvare va fi:

40

SA T TR C n ite te S 0

n ntreg //date de intrare c ntreg //date de manevr S ntreg //date de ieire citete n S 0 ct timp | c n | n n | S S | scrie s
c n% 0 1 n [ / 1 ] n 0 S S+ c

n>0 execut % 10 //extrag cifra / 10 //elimin cifra + c //adun la sum

n> 0 N U

D A

Sr S c ie SO TP

Structura repetitiv cu test final EXECUT CT TIMP sau DO - WHILE Ca i structur repetitiv cu test iniial, structur repetitiv cu test final are aceleai dou componente: condiia, o expresie logic ce poate fi evaluat prin valoarea TRUE sau FALSE, condiie pe care o notm cu c; actiune, o secven de instruciuni ce se vor executa repetat, notat cu a, aciune asociat cu EXECUT;

n structur repetitiv cu test final mai nti se execut secvena de instruciuni a i apoi se evalueaz condiia. De aici i numele de structur cu test final. n pseudocod forma general a structurii repetitive cu test final este: execut | a ct timp c Denumim aceast structur n mod obinuit EXECUT CT TIMP sau DO WHILE, nsa exist variante la fel de utilizate ale acestei structuri i anume: REPET PN CND sau REPEAT UNTIL. 41

Observaii: Pentru ca structur repetitiv s nu intre ntr+un ciclu infinit, trebuie ca secvena de instruciuni s modifice cel puin una din variabilele care intervin n condiie astfel nct aceasta s poat deveni fals la un moment dat. Spre deosebire de structur repetitiv cu test iniial, structur repetitiv cu test final efectueaz o data secvena de instruciuni nainte de a testa condiia.

Exemplu: numrul de vocale S considerm urmatoarea problem: Se citete de la tastatur o propoziie scris cu litere mici, terminat cu . (punct) . Se cere s se afieze numrul de vocale din prpoziie.

Explicarea algoritmului: Rezolvarea problemei se face citind succesiv caracterele din propoziie n variabila c, pna citim caracterul . . Pentru fiecare caracter citit verificm dac este vocal (a, e, i, o, u) i dac da, il numram. Soluia se poate exprima n cuvinte astfel: EXECUT citete un caracter i dac este vocal se crete contorul CT TIMP caracterul citit este diferit de . . Avem dou componente: condiie, trascris prin caracterul citit este diferit de punct ; aciune transcris prin citete un caracter i dac este vocal se crete contorul;

Rezolvarea algoritmului din exemplu este:

42

SA T TR n 0 r

c caracter //date de intrare nr ntreg //date de ieire nr 0 execut | citete c | dac (c=asau c=esau | | c=isau c=osau c=u) | | atunci | | nr nr + 1 //numar vocala | | ct timp c. scrie nr

C c ite te N U C= v c la oa D A

n n+ r r 1

C. N U

D A

S rie n c r SO TP

Structura repetitiv cu numr cunoscut de repetiii PENTRU sau FOR n pseudocod forma general a structurii repetitive cu numr cunoscut de repetiii este: pentru contor exp_i, exp_f execut | a | unde: exp_i i exp_f sunt expresii ale cror valori sunt evaluate n cadrul repetiiilor; contor este o variabil ce va lua prima dat valoarea expresiei iniiale exp_i, urmnd apoi s se modifice pn la valoarea expresiei finale exp_f; a este secven de instruciuni ce se va executa repetat;

Principiul de funcionare al structurii repetitive cu numr cunoscut de repetiii este urmtorul (am fcut presupunerea c exp_i <= exp_f): Pasul 1: Se evalueaz exp_i (expresia iniial); Pasul 2: Se atribuie variabilei contor valoarea expresiei exp_i; Pasul 3: Se evalueaz exp_f (expresia final); 43

Pasul 4: Dac valoarea variabilei contor este mai mare dect valoarea expresiei exp_f, atunci se iese din structur repetitiv. Dac valoarea varibilei contor este mai mic sau egal cu valoarea expresiei exp_f, atunci se execut secvena de instruciuni a i se incrementeaz (i mrete valoarea cu 1) valoarea variabilei contor, dup care se reia pasul 3.

Observaii: Exp_i i exp_f pot fi expresii de evaluat sau doar variabile simple ce au valori date. De regul folosim structuri repetitive cu numr cunoscut de repetiii n care dorim ca variabila contor s creasca de la exp_i la exp_f, caz n care evident valoarea exp_i trebuie s fie mai mica dect exp_f. ntr-o astfel de structur, secvena de instruciuni se execut de (exp_f exp_i +1) ori. Dac ns folosind acest tip de structur, valoarea iniial a lui exp_i este mai mare dect exp_f, atunci secvena de instruciuni a nu se execut niciodat. Dac forma structurii PENTRU este: pentru contor exp_i, exp_f, x execut | a | unde x este o variabil numeric, atunci contorul va crete din x n x. Cnd x lipsete din structur PENTRU, contorul, crete cu 1. n structurile repetitive cu numr cunoscut de repetiii n care dorim ca variabila contor s scad de la exp_i la exp_f, trebuie ca exp_i >= exp_f, iar variabila contor va scdea din x n x sau cu cte o unitate. Dac ns folosind acest tip de structur, valoarea iniiala a lui exp_i este mai mica dect exp_f, atunci secvena de instruciuni a nu se execut niciodat.

Exemplu: Suma primelor n numere naturale Se consider urmatoarea problem: Se citete un numr natural n. S se afieze suma primelor n numere naturale. De exemplu dac n =10 atunci algoritmul va afia 55, deoarece S=1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55.

44

Explicarea algoritmului: Se observ ca trebuie s calculm o sum cu numr cunoscut de termeni. Rezolvarea problemei se face deci folosind o structur repetitiv cu numr cunoscut de repetiii. Algoritmul va fi urmtorul: S AR T T
C n ite te S 0 i1

n ntreg //date de intrare S ntreg //date de ieire i ntreg //date de manevr citete n S 0 i 1 pentru i = 1, n execut | S S + i | scrie S

i< n = N U

D A

S S+i i i +1

S rie S c SO T P

Se observ c folosind scheme logice nu se poate reprezenta structur PENTRU dect cu ajutorul uneia din structurile repetitive cu testare iniial sau final.

Transformri dintr-un tip de structur repetitiv n altul

Simularea structurii repetitive WHILE cu DO-WHILE se face astfel: ct timp c execut | a | Dac c atunci |execut || a |ct timp c |

Se observ c este necesar testarea iniial a condiiei deoarece, spre deosebire de structur WHILE, structur DO-WHILE efectueaz cel puin o dat secvena nainte de a testa condiia. 45

Simularea structurii repetitive DO-WHILE cu WHILE se face astfel: execut | a ct timp c a //se execut secvena a ct timp c execut | a |

Se observ c n acest caz este necesar s executm o dat secvena de intruciuni n afara ciclului. Cele dou structuri (WHILE i DO - WHILE) sunt echivalente (nefiind necesar existena ambelor), ns n funcie de problem, vom alege structur repetitiv adecvat, care este mai potrivit pentru descrierea clar a algoritmului.

Simularea structurii repetitive FOR cu WHILE se face astfel: pentru contor vi,vf execut | a; | Contor vi ct timp contor<=vf execut | a; | contor contor + 1; |

Se observ c n acest caz este necesar s scriem explicit instruciunea care crete contorul cu 1.

Simularea structurii repetitive FOR cu DO - WHILE se face astfel: pentru contor vi,vf execut | a; | Contor vi Dac contor<=vf atunci | execut | | a; | | contor contor + 1; | ct timp contor<=vf |

Dintre toate aceste structuri repetitive, singura indispensabil este cea cu test iniial (CT TIMP sau WHILE), celelalte putnd fi obinute din aceasta, dup cum am vzut mai sus.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor 46

cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi:

O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator: o Exerciii de recunoatere a structurilor o Rezolvare de probleme simple
o Activiti

de

mperechere,

completare,

asociere

ntre

noiunile

prezentate o Activiti de urmrire a execuiei unui algoritm pas cu pas i notarea valorilor variabilelor la fiecare pas
o Exerciii cu ntrebri structurate (de la simplu la complex)

Ca materiale de evaluare se pot folosi: o Probe practice i scrise

47

Fia suport 2.4. Proiectarea algoritmilor: top-down, bottom-up, modular, structurat


Proiectarea algoritmilor Exist dou metode generale de proiectare a algoritmilor, a cror denumire provine din modul de abordare a rezolvrii problemelor: metoda top-down (descendent) i metoda ascendent (bottom-up). Metoda top-down Proiectarea descendent (top-down) pornete de la problema de rezolvat, pe care o descompune n mai multe probleme ce se pot rezolva separat. De obicei aceste pari sunt subprobleme independente, care la rndul lor pot fi descompuse n subprobleme. Primul pas al metodei descompune algoritmul principal n subprobleme, ns n acest moment nu ne intereseaz amanunte legate de rezolvarea subproblemelor, presupunem c tim cum se rezolv. Pasul urmtor este s considerm pe rnd fiecare subproblem n parte i s elaborm un subalgoritm pentru rezolvarea ei, urmnd aceeai metod. n final, soluiile se vor combina astfel nct s formeze soluia problemei iniiale.
Algoritmul principal

Problem ainiial

Descom puneren 3 m odule

Modul Citire date

Modul Calcul

Modul Scriere date

Descom punerea m odulului de calcul n 2 subprogram e

Subprogramul 1

Subprogramul 2

Avantajele proiectrii top-down (cunoscut i sub denumirea "Divide et impera") sunt multiple. - Avantajul principal const n faptul c ea permite programatorului s reduc complexitatea problemei, subproblemele n care a fost descompus fiind mai simple, i s amne detaliile pentru mai trziu. n momentul n care descompunem problema n subprobleme nu ne gandim cum se vor rezolva subproblemele ci doar care sunt ele i conexiunile dintre ele. - Proiectarea top-down permite lucrul n echipe mari. Prin descompunerea problemei n mai multe subprobleme, fiecare subproblem poate fi dat spre rezolvare unei subechipe. 48

Metoda bottom-up n cazul metodei ascendente (bottom-up) va fi scris mai intai subalgoritmul apelat i apoi cel care apeleaz. Se ajunge astfel la o mulime de subalgoritmi care se apeleaza ntre ei. Este important s se cunoasc care subalgoritm apeleaz pe care, lucru redat printr-o structur arborescent, ca i n cazul programarii descendente. Aceast metod are ca principal dezavantaj faptul c erorile vor fi detectate trziu, abia n faza de asamblare. Se poate ajunge chiar la concluzia c anumii subalgoritmi implementai, dei sunt corecti, nu sunt utili. De cele mai multe ori proiectarea algoritmilor combin cele dou metode, ajungnd astfel la o proiectare mixt. Proiectarea modular Prin proiectare / programare modular un algoritm se va rezolv prin folosirea modulelor. Ce este un modul? Modulul este considerat o unitate structural de sine stttoare, care poate fi un program, un subprogram, sau o unitate de program. Un modul poate fi format din mai multe submodule. Fiecare modul realizeaz o funcie bine precizat n cadrul ntregului program. El apare n mod natural n descompunerea top-down. Modulele sunt independente, dar pot comunica ntre ele prin transmitere de parametri sau prin apeluri. Rezult c programarea modular se bazeaz pe descompunerea problemei n subprobleme i proiectarea i programarea separat a subalgoritmilor corespunztori. Deci programarea modular se refer n primul rnd la proiectarea modular a algoritmilor i apoi la traducerea lor n limbajul de programare ales, innd seama de specificul acestui limbaj. Programarea modular este strns legat de programarea ascendent i de programarea descendent, ambele presupunnd folosirea subalgoritmilor pentru toate subproblemele ntlnite. Avantajele programarii modulare sunt multiple. Menionam n cele ce urmeaz cteva dintre ele: - Descompunerea unei probleme complexe n subprobleme este un mijloc convenabil i eficient de a reduce complexitatea - Probabilitatea apariiei erorilor n conceperea unui subprogram este mult mai mic dect dac s-ar lucra cu tot programul iniial. - Rezolvnd o problem mai simpl (un modul), testarea acestui modul se poate face mult mai uor dect testarea ntregului algoritm. 49

Permite munca n echip, modalitate prin care se ajunge la scurtarea termenului de realizare a programului. Modulele se pot refolosi de cte ori avem nevoie de ele. Astfel, s-a ajuns la compilarea separat a subprogramelor i la pstrarea subprogramelor obtinute n biblioteci de subprograme, de unde ele se pot refolosi la nevoie. Reutilizabilitatea acestor subprograme este o proprietate foarte important n activitatea de programare. Ea duce la mrirea productivitii n programare, dar i la creterea siguranei n realizarea unui produs corect. Uneori, n timpul proiectrii algoritmului sau a implementrii lui, se ajunge la concluzia c proiectarea a fost incomplet sau ca unele module sunt ineficiente. n aceast situaie programarea modular este avantajoas, ea permind adaugarea unui modul sau nlocuirea lui cu altul mai performant. Modulele se pot verifica cu atat mai uor cu ct sunt mai mici. Abilitatea omului de a verifica corectitudinea unui subalgoritm este mult mai mare pentru algoritmi mici. Programarea structurat n loc de concluzie

Despre programare structurat am vorbit n fia anterioar. Practic, programarea structurat presupune o disciplin n activitatea de programare, nglobnd toate metodele de proiectare a algoritmilor descrise mai sus.. Knuth considera programarea structurat ca fiind un mijloc de a face produsele program mai uor de citit. De asemenea, programarea structurat este definit ca fiind programarea n care abordarea este top-down, organizarea muncii este facut pe principiul echipei, iar n proiectarea algoritmilor se folosesc cele trei structuri de calcul definite de Bohm-Jacopini.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi: O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator: o Studii de caz cu teme de genul: Comparaie ntre metodele de proiectare sau Avantajele proiectrii modulare o Activiti de tip rebus, mperechere, completare cu noiunile nvate Ca materiale de evaluare se pot folosi: o Probe practice i scrise 50

Fia suport 2.5. Algoritmi elementari ce folosesc structuri fundamentale


n continuare vom prezenta civa algoritmi utili care prelucreaz numere ntregi i naturale.

1. Divizibilitate Se citesc dou numere ntregi a i b. S se realizeze un algoritm care s verifice dac cele dou numere sunt divizibile (a divizibil cu b sau b divizibil cu a). De exemplu dac se citesc numerele a = 25 i b = 5 atunci algoritmul va afia DA, iar n cazul n care se citesc a = 25 i b = 10 se va afia NU. n pseudocod algoritmul de rezolvare este: a, b ntregi citete a, b dac (a % b = 0 sau b % a = 0) atunci | scrie DA | altfel | scrie NU | Explicarea algoritmului: Se folosete o structur alternativ, n care se verific a este divizibil cu b (dac restul mparirii lui a la b = 0) sau invers.

2. Paritate Se citete un numr ntreg a. S se realizeze un algoritm care s verifice dac numrul a este par, afiandu-se un mesaj corespunzator. De exemplu dac se citete pentru a valoarea 88 atunci algoritmul va afia PAR, iar n cazul n care se citete a = 15 se va afia IMPAR. n pseudocod algoritmul de rezolvare este: a ntreg citete a dac (a % 2 = 0) atunci | scrie PAR | altfel | scrie IMPAR |

51

Explicarea algoritmului: Se foloseste o structur alternativa, n care se verific dac a este divizibil cu 2 (daca restul mpririi lui a la 2 = 0).

3. Divizorii unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s afiseze toti divizorii numrului a. De exemplu dac se citete pentru a valoarea 12 atunci algoritmul va afia 1 2 3 4 6 12, iar n cazul n care se citete a = 13 se va afia 1 13. n pseudocod algoritmul de rezolvare este: a,i ntreg citete a pentru i 1, a execut | dac (a % i = 0) atunci | | scrie i | | | Explicarea algoritmului: Se foloseste o structur repetitiv cu numr cunoscut de repetiii, n care se verific dac a este divizibil cu i (dac restul mpririi lui a la i = 0), unde i ia toate valorile de la 1 la a.

4. Divizorii proprii ai unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s afieze toti divizorii proprii ai numrului a. De exemplu dac se citete pentru a valoarea 12 atunci algoritmul va afia 2 3 4 6, iar n cazul n care se citete a = 13 se va afia mesajul nu exist divizori proprii. n pseudocod algoritmul de rezolvare este: a, i, sem ntreg sem 0 //folosit pentru a reine dac am gsit divizori citete a pentru i 2, [a/2] execut | dac (a % i = 0) atunci | | scrie i | | sem 1 //marchez faptul ca am gsit divizori | | | daca sem = 0 atunci | scrie nu exist divizori proprii 52

| Explicarea algoritmului: Se cunoate faptul c divizorii proprii ai unui numr se afl n intervalul nchis [2, [a/2] ], unde [a/2] este partea ntreag a lui a/2. Se folosete o structur repetitiv cu numr cunoscut de repetiii, n care se verific dac a este divizibil cu i (dac restul mpririi lui a la i = 0), unde i ia toate valorile de la 2 la [a/2].

5. Primalitatea unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s verifice dac numrul a este prim. De exemplu dac se citete pentru a valoarea 12 atunci algoritmul va afia numar NEPRIM, iar n cazul n care se citete a = 13 se va afia mesajul numar PRIM. n pseudocod algoritmul de rezolvare este: a, i, prim ntreg citete a dac a <= 1 atunci | scrie numar NEPRIM | altfel | | prim 1 //presupunem ca numrul este prim | | pentru i 2, [a/2] execut | | | dac (a % i = 0) atunci | | | | prim 0 //am gsit divizori deci nr nu e prim | | | | | | | | | dac prim = 1 atunci | | | scrie numar PRIM | | |altfel | | |scrie numar NEPRIM | | | | | | Explicarea algoritmului: Se cunoate faptul c un numr este prim dac NU are divizori proprii. De asemenea se tie c numrul 1 NU este prim, de aceea vom trata separat cazul a=1. Algoritmul folosete o structur repetitiv cu numr cunoscut de repetiii, n care se caut divizori proprii. n caz c se gasesc divizori, numrul nu este prim altfel numrul este prim. Se foloseste o variabil semafor numit prim care iniial are valoarea 1 i se modific n 0 doar dac se gsesc divizori.

53

6. Descompunerea n factori primi ai unui numr a Se citete un numr ntreg a. S se realizeze un algoritm care s afieze factorii primi i puterile lor pentru numrul citit. De exemplu dac se citete pentru a valoarea 36 atunci algoritmul va afia 2^2, 3^2. n pseudocod algoritmul de rezolvare este: a, d, p ntreg citete a d 2 //primul factor prim este 2 ct timp a > 1 execut | p 0 //puterea factorului d este 0 | ct timp (a % d = 0) execut | | p p + 1 | | a a / d | | | dac p 0 atunci | | scrie d, ^, p, , | | | d d + 1 | 36 18 9 3 1 2 2 3 3

Explicarea algoritmului: Algoritmul urmrete pas cu pas procedeul matematic de descompunere n factori primi. Se folosesc dou structuri repetitive cu test iniial, imbricate. Prima structur asigur repetarea instruciunilor ct timp numrul nu a ajuns la 1. A doua structur numr n variabila p (care se iniializeaz cu 0 pentru fiecare nou valoare a lui d) de cte ori se poate face mparirea numrului la divizorul d. n cazul n care s-a putut mpari a la d (deci p este diferit de 0), se afieaz divizorul i puterea lui. Apoi se crete d i se repet instruciunile pentru a se verifica dac acest nou numr este divizor i a afla puterea.

7. Cel mai mare divizor comun intre 2 numere ntregi a i b Se citesc dou numere ntregi a i b. S se realizeze un algoritm care s afieze cmmdc(a,b). De exemplu dac se citete pentru a valoarea 36 i pentru b valoarea 24 atunci algoritmul va afia 12. n pseudocod algoritmul de rezolvare este: 54

a, b, r ntreg citete a, b r a % b //r reine restul mpririi lui a la b ct timp r 0 execut | a b | b r | r a % b | scrie cmmdc este , b

Explicarea algoritmului: Algoritmul folosit este algoritmul lui EUCLID. Exista i algoritmul care afla cmmdc prin scadere nsa nu este eficient (despre eficiena algoritmilor vom vorbi tema urmtoare). Algoritmul lui Euclid folosete o structur repetitiv cu test iniial. Mai nti aflm restul mpririi lui a la b i ct timp acest rest este diferit de 0, vom nlocui pe a cu b i pe b cu restul obinut, dup care recalculm restul mpririi noului a la noul b. Euclid a demonstrat c oricare ar fi numerele a i b iniiale, repetnd operaiile descrise mai sus, gsim restul = 0. n acel moment putem afirma c cmmdc(a,b) este ultimul rest nenul. Deoarece variabila b ia mereu valoarea restului, afiam pe b ca fiind cmmdc.

8. Numere perfecte Se citete un numr ntreg n. S se realizeze un algoritm care s afiseze toate numerele perfecte mai mici sau egale cu n. Spunem c un numr este perfect dac este egal cu suma divizorilor si, far el nsui. De exemplu dac se citete pentru n valoarea 30 atunci algoritmul va afia 6 28, deoarece aceste dou numere sunt singurele pentru care putem scrie: 6 = 1 + 2 + 3 i 28 = 1 + 2 + 4 + 7 + 14. n pseudocod algoritmul de rezolvare este: n, i, d, s ntreg citete n pentru i 1, n execut | s 0 // verificm fiecare i dac este perfect | pentru d 1, i/2 execut | dac i % d = 0 atunci // dac d este divizor | | s s + d // l adaug la sum | | | dac s = i atunci //dac suma = i atunci i este perfect | | scrie i | | | 55

Explicarea algoritmului: Algoritmul verific fiecare numr cuprins ntre 1 i n dac este numr perfect. Aceast verificre se face iniializnd suma cu 0 pentru fiecare numr i cutnd divizorii de la 1 la jumatatea numrului. Divizorii se adaug la sum iar la final aceasta este comparat cu numrul testat.

9. Numere prietene Se citesc dou numere ntregi a i b. S se realizeze un algoritm care s verifice dac cele doau numere sunt prietene. Spunem ca dou numere sunt prietene dac suma divizorilor proprii ai unui numr este egal cu celalalt i invers. De exemplu dac se citete pentru a valoarea 284 i pentru b valoarea 220 atunci algoritmul va afia mesajul numere prietene. n pseudocod algoritmul de rezolvare este: a, b, sa, sb ntreg citete a, b sa 0 sb 0 pentru i 2, [a/2] execut | dac (a % i = 0) atunci | | s s + i //suma divizorilor proprii numrului a | | | pentru i 2, [b/2] execut | dac (b % i = 0) atunci | | sb sb + i // suma divizorilor proprii numrului b | | | daca sa = b i sb = a atunci | scrie numere prietene | altfel | scrie NU sunt numere prietene |

Explicarea algoritmului: Algoritmul calculeaz suma divizorilor lui a n sa i suma divizorilor lui b n sb. Apoi verific dac sa = b i sb = a. Dac condiia este adevarat se afieaz numere prietene altfel se afieaz Nu sunt numere prietene.

56

10. Factorial Se citete un numr ntreg a. S se realizeze un algoritm care s afiseze n! Factorial de n (notat n!) este produsul numerelor de la 1 la n. De exemplu dac se citete pentru a valoarea 4 atunci algoritmul va afia 24, deoarece 4! = 1 * 2 * 3 * 4 = 24. n pseudocod algoritmul de rezolvare este: a, i, p ntreg citete a p 1 pentru i 1, a execut | p p * i //calculm produsul | scrie p

Explicarea algoritmului: Algoritmul calculeaz produsul numerelor de la 1 la a n variabila p. Iniial variabila p = 1 deoarece produsul se iniializeaz cu elementul neutru de la nmultire, adic 1.

11. Sirul lui Fibonacci Se citete un numr ntreg n (2< n <= 20). S se realizeze un algoritm care s afieze al n-lea termen din irul lui Fibonacci. De exemplu dac se citete pentru n valoarea 8 atunci algoritmul va afia 21, deoarece al 8-lea termen din irul lui Fibonacci este 21. n pseudocod algoritmul de rezolvare este: n, f1, f2, f3, i ntreg citete n f1 1 f2 2 // iniializarea primilor termeni din ir pentru i 3, n execut | f3 f2 + f1 //calculul termenului curent din ir | f1 f2 | f2 f3 | scrie f3

57

Explicarea algoritmului: irul lui Fibonacci se formeaz dup urmatoarea formul: 1 Fibo(n) = Fibo (n-1) + Fibo (n-2) dac n > 2 Algoritmul calculeaz fiecare termen i cnd ajunge la al n-lea se oprete i l afieaz. Se folosete o structur repetitiv cu numr cunoscut de repetiii, unde variabila contor i ia valori de la 3 la n, deoarece primii doi termeni sunt deja calculai, iar noi trebuie s calculm termenii ncepand cu al 3-lea. 12. Numrul invers Se citete un numr ntreg a. S se realizeze un algoritm care s afiseze numrul invers. Numim numr invers (sau oglindit) numrul format cu cifrele citite de la dreapta la stanga. De exemplu dac se citete pentru a valoarea 327 atunci algoritmul va afia numrul invers 723. n pseudocod algoritmul de rezolvare este: a, inv ntreg citete a inv 0 //initial inv este nul ct timp a 0 execut | inv inv * 10 + a % 10 | a a / 10 | scrie inv dac n = 1 sau n = 2

Explicarea algoritmului: Algoritmul descompune n cifre numrul a i adaug fiecare cifr la numrul invers.

13. Numrul palindrom Se citete un numr ntreg a. S se realizeze un algoritm care s verifice dac numrul citit este sau nu palindrom. Numim palindrom un numr care este egal cu oglinditul su.

58

De exemplu dac se citete pentru a valoarea 323 atunci algoritmul va afia PALINDROM, iar dac va citi 123 va afia NU. n pseudocod algoritmul de rezolvare este: a, inv, aux ntreg citete a aux a //salvez valoarea iniial a lui a n aux inv 0 //iniial inv este nul ct timp aux 0 execut | inv inv * 10 + aux % 10 | aux aux / 10 | Dac inv = a atunci | scrie PALINDROM |altfel | scrie NU |

Explicarea algoritmului: Algoritmul se bazeaz pe problema anterioar, de calcul al numrului invers. Un numr este palindrom dac numrul iniial citit este egal cu inversul sau. De aceea algoritmul descompune n cifre numrul a i formeaz numrul invers, dupa care compar acest numr invers cu numrul iniial citit. Am descompus n cifre o copie a numrului a deoarece n structura repetitiv se modific valoarea numrului introdus, iar noi avem nevoie de valoarea iniiala pentru verificare.

14. Maximul ntr-un ir de numere Se citete un numr n ntreg i apoi n numere ntregi. S se realizeze un algoritm care s afiseze cel mai mare numr citit. De exemplu dac se citete pentru n valoarea 5 i apoi valorile 12, 220, 23, 89, 146 atunci algoritmul va afia mesajul 220, deoarece 220 este valoarea maxim citit. n pseudocod algoritmul de rezolvare este: n, i, x, max ntreg citete n citete x//citesc primul numr din ir separat de celelalte max x //iniial max = primul numr citit din ir pentru i 2, n execut | //de la 2 pentru c am citit deja un numr din ir | citete x 59

| dac (x > max) atunci | | max x //max = noua valoare a lui x | | | scrie max

Explicarea algoritmului: Algoritmul citete pe rnd n numere de la tastatur i afieaz n final cel mai mare numr dintre ele. Se citete primul numr din ir n afara structurii repetitive iar max se iniializeaz cu acea valoare. Variabila max se poate iniializa cu orice valoare din ir, ns pentru comoditate iniializm cu prima valoare. Apoi, n structura repetitiv, pe masur ce cititm n x alte valori, le comparm cu variabila max. Dac gsim un numr mai mare dect max, atunci nlocuim valoarea lui cu numrul x.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi: O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator: o Activiti drag & drop cu ordonarea corect a instruciunilor dintr-un algoritm pentru care se tie ce execut o Urmrirea execuiei algoritmilor pas cu pas i aflarea valorii afiate o Interpretarea efectelor unui algoritm folosind mai multe seturi de date de intrare o Activiti de tip rebus, mperechere, completare cu noiunile nvate o Elaborare de algoritmi o Exerciii cu ntrebri structurate Ca materiale de evaluare se pot folosi: o Probe practice i scrise

60

Tema 3. Corectitudinea algoritmilor


Fia suport 3.1. Surse de erori n elaborarea algoritmilor (erori n datele iniiale, erori de rotunjire, erori de metod, erori reziduale, erori de sintax)
n elaborarea algoritmilor apar frecvent erori ce vor trebui descoperite i remediate. Prezentm cteva dintre cele mai ntlnite tipuri de erori i cteva metode de tratare a lor. Erori n datele iniiale Acest tip de erori provin din introducerea, ca valori de intrare, a unor date de tip diferit de cel prevazut la elaborarea algoritmului. n aceste situatii algoritmul nu se comport n modul ateptat, genernd erori sau eventuale date de ieire eronate. Variabile globale i locale O alt eroare frecvent este confuzia ntre variabilele globale i locale, atunci cnd se dorete de exemplu a utiliza n exteriorul unei funcii o variabil care a fost declarat n interiorul unei funcii. Erori de trunchiere, erori de rotunjire i erori de calcul Eroare de trunchiere este diferena dintre rezultatul exact (pentru datele de intrare curente) i rezultatul furnizat de un algoritm dat utiliznd aritmetica exact. Eroare de rotunjire este diferena dintre rezultatul produs de un algoritm dat utiliznd aritmetica exact i rezultatul produs de acelai algoritm utiliznd o aritmetic cu precizie limitat (de exemplu aritmetica virgulei mobile). Eroarea de calcul este suma dintre eroarea de trunchiere i eroarea de rotunjire, dar de obicei una dintre acestea predomin. Erori reziduale Erorile reziduale sunt acele erori care rezult din diferena ntre valorile obinute efectiv i cele asteptate a fi obinute. Erori de sintax Erorile de sintax sunt erorile cele mai frecvente i cel mai uor de corectat. De cele mai multe ori, la rularea programelor se identific corect sursa erorilor n programele pe care le-am realizat. n general, erorile de sintax provin din: greeli de tastare confuzia ntre majuscule i minuscule; 61

inversarea literelor;

greeli de punctuaie inchiderea incorecta a parantezelor, a blocurilor de instruciuni; ghilimele i apostrofuri plasate greit;

greeli de plasare a instruciunilor confuzia ntre irurile de caractere i numere numerele sunt tratate ca iruri de caractere; irurile de caractere sunt tratate ca numere. Erori de logic Erorile de logic se genereaz atunci cnd nu se obin rezultatele ateptate. Dei codul surs este corect din punct de vedere sintactic, dei nu sunt generate erori n timpul execuiei programului (apeluri de funcii incorecte; atribuiri de valori pentru variabile nedeclarate; imposibiliti aritmetice mprire la zero etc.), totui programul conine erori de logic (semantice). Identificarea erorilor de logic constituie o etap dificil pentru nceptori, dar nu de nedepait. Foarte multe erori de logic sunt generate de o analiz superficial a aplicaiei, o proiectare defectuoas a programului, i ca urmare de un cod surs incorect! Atribuire i egalitate n programare una dintre erorile cele mai frecvente comise de ctre nceptori este confuzia ntre operatorul de atribuire i operatorul de egalitate. Aceste erori sunt cteodat dificil de identificat n msura n care ele nu genereaz ntotdeauna un mesaj de eroare.

Tehnici de depanare a erorilor Urmarirea secvential a algoritmului (logica programului) folosind reprezentarea n pseudocod a algoritmului s-a dovedit a fi indispensabil atunci cnd dorim s localizam zona n care ar putea fi eroarea generat.

Utilizarea comentariilor Pentru a ne crea primele reflexe de programare este bine s inserm ct mai multe comentarii n algoritmi.

62

De asemenea pentru a elimina anumite poriuni din algoritm (pn la eliminarea erorilor) se utilizeaz comentariile conform procedurii de mai jos: se transform n comentariu una sau mai multe linii ale programului; se salveaz programul; se ruleaz programul se analizeaz rezultatul (efectul); se modific codul surs sau se transform n comentariu mai multe linii de cod; se repet aceast procedur pn cnd se elimin eroarea. Adaugarea de instruciuni i afiarea valorilor variabilelor pas cu pas O alt tehnic de depanare frecvent folosit este aceea de a aduga instruciuni pentru a putea cunoate strile programului. n acest sens, se utilizeaza n mod frecvent adaugrea instruciunilor de afiare a unor variabile, a rezultatelor unor expresii sau a unor mesaje pentru a verifica executarea corect a acelor poriuni de program. De asemenea, se pot afia valorile variabilelor algoritmului, pas cu pas, ntr-o alt fereastr numit fereastr de depanare. Interpretarea valorilor obinute la fiecare pas conduce la identificarea erorilor. Descompunerea programelor complexe n mai multe module Pentru a mri gradul de localizare a erorilor dar i de reutilizare a codului este bine s limitm dimensiunea funciilor pe care urmeaz s le crem. Cu ct dimensiunile unei funcii sunt mai mici cu att mai mult cresc ansele de identificare a erorilor sau de reutilizare a acesteia n diferite zone ale programului.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi: O prezentare multimedia care s cuprind noiunile de mai sus. Activiti interactive, de genul urmator: o Activiti de recunoatere a tipurilor de erori (de ex. Se d un algoritm i se cere s se identifice eroarea i s se ncadreze n unul din tipurile de erori studiate) o Activiti de categorisire a tipurilor de erori Ca materiale de evaluare se pot folosi: 63

o Probe practice i scrise

64

Fia suport 3.2. Verificarea corectitudinii algoritmilor (numr finit de pai, definirea corect a datelor, asigurarea valorilor pentru toate variabilele utilizate n operaii)
Verificarea corectitudinii algoritmului implementat. Un algoritm realizat trebuie s fie corect, clar, sigur n funcionare, uor de modificat, portabil, eficient, nsoit de o documentaie corespunztoare. Exist numeroase tehnici de verificre i validare a algoritmilor, adresate n general programatorilor experimentai, dar i uor accesibile unui nceptor n programare. Dintre acestea amintim tehnica testarii programelor i depanarea programelor. Tehnica testarii programelor Aciunea de testare a programelor se deosebete de celelalte faze prin care trec acestea (proiectare, programare, documentaie, etc.) prin caracterul ei n aparen demolator. Astfel, n timp ce alte faze au o esen constructiv, testarea are n aparen un caracter distructiv, deoarece scopul ei este de a pune n eviden proasta funcionare a programului, de a gsi defectele acestuia i nu prile sale bune. Analiznd problema mai atent, realizm de fapt c scopul testrii este n realitate tot constructiv, acela de a pune n funciune un program care s funcioneze la parametri prevzui. Se tie c, ntr-un algoritm este oricnd posibil prezena unei/unor erori, orict de precis i laborioas ar fi metodologia de elaborare. Procesul de detectare i apoi de eliminare a erorilor unui algoritm are dou componente, numite: verificare validare

Aceste dou activiti ar trebui s caracterizeze practic toate etapele prin care trece un program, de la formularea cerinei de rezolvare a unei probleme, la analiza acesteia, la identificarea i apoi descrierea algoritmului de rezolvare a problemei, a codificrii datelor i validarea rezultatelor obinute. n acest sens, activitatea de verificre i validare a unui produs program urmrete n principal, urmtoarele: descoperirea defectelor programului certificarea faptului c programul va funciona corect n condiii de exploatare curent. Testarea programului pe diverse seturi de date de test Testarea programului rmne metoda de baz pentru verificrea corectitudinii unui program, succesul ei fiind condiionat n primul rnd de experiena programatorului, de

65

complexitatea i completitudinea setului de date folosite n procesul testrii, de analiza riguroas, atent a rezultatelor obinute n urma fiecrui test. Prin testarea programului se nelege deci executrea programului respectiv cu scopul de a descoperi o anomalie sau eroare. Ea se bazeaz pe construirea unor eantioane de date de intrare care s conduc la depistarea unor erori n functionarea programului, ntr-un timp ct mai scurt i cu efort ct mai mic. Practic, pornind de la nite date de test construite de el, programatorul ateapt s obin la final sau pe parcurs, anumite rezultate. Putem spune c succesul testrii depinde de arta programatorului de a-i construi setul de date de test. Seturile de date de test trebuie elaborate cu atenie, astfel nct s acopere, pe ct posibil, toate variantele de executie a algoritmului, inclusiv situatii de exceptie, i s verifice dac fiecare subproblem a problemei date este rezolvat corect (dac este posibil, se va testa separat fiecare modul de program). Metode de testare a programelor n acest sens, au aprut, n ultimul timp, o serie de metode de elaborare a datelor de test, care ajut programatorul, oferindu-i posibilitatea de a aborda sistematic activitatea de testare a programelor, cu o probabilitate crescut de depistare a erorilor. Aceste metode pot fi denumite: testarea funcional sau metoda cutiei negre, care presupune construirea datelor de test astfel nct s permit testarea fiecrei funciuni a programului; testarea structural sau rnetoda cutiei transparente, care presupune construirea datelor de test astfel nct toate prile programului s poat fi testate.

Succesul activitii de testare const deci n conceperea unor date de intrare prin prelucrarea crora defectele algoritmului i deci i ale programului s fie puse n eviden prin observarea i analiza rezultatelor obinute. De aceea el este n mare msura dependent de experiena i ndemnarea programatorului, de abilitatea lui de a-i construi datele de test ct mai complete, complexe, cuprinztoare din punct de vedere al situaiilor sau valorilor de excepie ce pot apare n execuia corect a programului. Testarea unui program trebuie s se finalizeze, pentru a fi util, cu semnalarea erorii i localizarea ei. De aceea, testarea programului este urmat de depanarea lui. Depanarea unui program Depanarea const n localizarea erorii, determinarea naturii sale i corectitudinea ei. Ea se poate face n mod: static, dup executrea programului dinamic, n timpul execuiei acestuia 66

Limbajele de programare ofer, n ultimile lor versiuni, un depanator simbolic integrat, care permite depanarea uoar, plcut i eficient a programelor prin urmtoarele operaii: - executarea pas cu pas a programului (un pas nseamn de fapt o instruciune executbil); - observarea, n timpul execuiei, a valorilor unor variabile sau expresii specificate de programator (care apar ntr-o fereastr special - Watch Window); - specificarea unor puncte de suspendare a execuiei programului; - modificarea valorilor unor variabile. n activitatea de testare i depanare a programelor, erorile datorate variabilelor neiniializate sunt greu de semnalat i de localizat, mai ales atunci cnd aparent totul funcioneaz corect. n acest sens amintim variabila cu rol de contor. Aceasta trebuie iniializat (de regul cu 0). De asemenea, expresia care stabilete dac un ciclu se execut sau nu trebuie astfel formulat sau iniializat nct s asigure sau nu prima execuie, aa cum necesit algoritmul de prelucrare descris. n acest sens, trebuie s facem precizarea c adeseori, suntem nevoii s facem noi, prin program, iniializarea variabilei care controleaz execuia ciclului, pentru a asigura execuia lui pentru prima dat. Deci, ciclul cu testarea iniial a condiiei trebuie s fie bine analizat, verificat i testat din punctul de vedere al expresiei care-i controleaz reluarea. Practica a dovedit, n timp, c orict de numeroase ar fi testele efectuate asupra unor programe foarte complexe, ele nu pot garanta funcionarea corect a acestora. Ele rmn deosebit de utile pentru semnalarea multora dintre erori i deasemenea pentru familiarizarea programatorului cu algoritmul, cu modul su de lucru.

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi: O prezentare multimedia care s cuprind noiunilor de mai sus. Activiti interactive, de genul urmator: o Activiti de testare a algoritmilor pe diverse tipuri de date de intrare o Activiti de elaborare de algoritmi i identificare a seturilor de date de intrare pentru care algoritmul se comport diferit Ca materiale de evaluare se pot folosi: 67

o Probe practice i scrise

68

Fia suport 3.3. Analiza algoritmilor. Complexitatea algoritmilor (necesar de memorie, timpul de execuie al algoritmului, optimalitatea algoritmului, numr de operaii)
n situaia n care se gsesc mai muli algoritmi care rezolv corect aceeai problem, ne putem pune ntrebarea pe care dintre ei i vom alege pentru a scrie programul? Aceast alegere este o cerin critic pe care un algoritm trebuie s o satisfac, pentru c un algoritm care are nevoie de un an ca s ruleze, sau necesit un GB de memorie intern nu este utilizabil. Pentru a alege cel mai bun algoritm, trebuie s analizm aceti algoritmi n scopul determinrii eficienei lor i, pe ct posibil, a optimalitii lor. Analiza algoritmilor Complexitatea unui algoritm se refer la cantitatea de resurse consumate la execuie adic timp de executie i spaiu de memorie. Din aceast cauz putem spune c eficiena unui algoritm se evalueaz din dou puncte de vedere: din punctul de vedere al spaiului de memorie necesar pentru memorarea valorilor variabilelor care intervin n algoritm (complexitatea spaiu); din punctul de vedere al timpului de execuie (complexitate timp).

Complexitatea spaiu depinde mult de tipurile de date i de structurile de date folosite. Pentru a estima complexitatea timp vom presupune c se lucreaz pe un calculator clasic, n sensul c o singur instruciune este executat la un moment dat. Astfel, timpul necesar execuiei programului depinde de numrul de operaii elementare efectuate de algoritm. S ne amintim faptul c un algoritm efectueaz trei operaii de baz: intrare/ieire, atribuire i decizie. n general, operaiile de intrare / ieire sunt o constant pentru algoritmii care rezolv o anumit problem. De exemplu, dac citim n ntregi i afiam pe cel mai mare dintre ei, indiferent de algoritmul ales pentru implementare, se vor execut n operaii de intrare i una de ieire. Adic numrul de operaii de intrare / ieire este constant, indiferent de algoritm. Din acest motiv nu vom analiza aceste operaii. ntre celelalte dou operaii (de atribuire i de decizie) vom considera c una dintre ele este cea de baz i vom estima de cte ori se execut aceasta. O vom alege pe cea a carui numr de executri este mai usor de estimat, sau pe cea care necesit mai mult timp de execuie.

69

Se poate msura complexitatea exact (cantititativ), adic numrul de operaii elementare sau se poate msura aproximativ (calitativ), rezultnd clasa de complexitate din care face parte algoritmul. Msurarea cantitativ / exact a complexitii. Numrul de operaii elementare Vom ncerca s calculam ntr-o funcie f(n) numrul de operaii elementare executate de algoritm. S luam ca exemplu sortarea unui vector de n elemente .... pentru i 1, n-1 execut | pentru j i+1, n execut | | dac (v[i] > v[j]) atunci | | |aux v[i] | | |v[i] v[j] | | |v[j] aux | | | | | | .... Vom avea trei cazuri: cazul cel mai favorabil, cel mai defavorabil i cazul mediu. Aici, cazul cel mai bun este vectorul gata sortat, deci: f1(n) = (n-1) + (n-2) + ... + 3 + 2 + 1 = (n-1)*n/2 (se efectueaz numai comparaia de (n-1)*n/2). Cazul cel mai defavorabil este vectorul sortat invers, deci: f2(n) = 4* [(n-1) + (n-2) + ... + 3 + 2 + 1] = 4*(n-1)*n/2 = 2(n-1)*n (se efectueaz toate cele patru operaii de (n-1)*n/2 ori, adica 2(n-1)*n) Cazul mediu se ia ca medie aritmetic a celorlalte dou cazuri, adic: f3(n) = [ (n-1)*n/2 + 4*(n-1)*n/2 ] / 2= 5(n-1)*n/4. Asa se poate calcula complexitatea exact. Calculele sunt destul de laborioase i din aceast cauz metoda se foloseste n acei algoritmi unde este usor de calculat. De obicei se folosete complexitatea aproximativ - aproximarea asimptotic a funciilor de complexitate exact. Aici putem estima c f1(n) = f2(n) = f3(n) = O(n2). Aceast notaie (O(n2)) o vom explica n rndurile ce urmeaz.

70

Masurarea calitativ / aproximativ a complexitii. Clase de complexiti. Notaii n practic sunt folosite diferite notaii care sunt utile pentru analiza performantei i a complexitii unui algoritm. Aceste notaii marginesc valorile unei funcii f date cu ajutorul unor constante i al altei funcii. Exist trei notaii cunoscute n acest sens: Notaia O (margine superioar upper bound) T(n) = O(f(n)), dac exist constantele c i n0 astfel nct T ( n ) cf ( n) , pentru n n0 . Notaia (margine inferioar lower bound) T ( n ) = ( g ( n )) , dac exist constantele c i n0 astfel nct T ( n ) cg ( n) , pentru n n0. Notaia (categorie constant same order) T ( n ) = ( h ( n )) dac i numai dac T ( n ) = ( h ( n )) i T ( n ) = ( h ( n )) . Ideea acestor definiii este de a stabili o ordine relativ ntre funcii, lund n considerare rata lor de cretere, i nu valori n anumite puncte. De exemplu, dei 10.000*n este mai mare dect n 2 pentru valori ale lui n<100, rata de cretere a funciei n2 este mai mare, ceea ce ne permite s afirmm c pentru valori ale lui n mari (n>100) funcia n2 este mai mare. Complexitatea algoritmilor este deci o funcie g(n) care limiteaz superior numrul de operaii necesare pentru dimensiunea n a problemei. Exist dou interpretri ale limitei superioare: - complexitatea n cazul cel mai defavorabil: timpul de execuie pentru orice dimensiune dat va fi mai mic sau egal dect limita superioar - timpul de execuie pentu orice dimensiune dat va fi media numrului de operaii pentru toate instanele posibile ale problemei. Deoarece este dificil s se estimeze o comportare statistic ce depinde de dimensiunea intrrii, de cele mai multe ori este folosit prima interpretare, cea a cazului cel mai defavorabil. n majoritatea cazurilor, complexitatea lui f(n) este aproximat de familia sa O(g(n)), unde g(n) este una dintre functiile: - n (complexitate liniar) - Log(n) (complexitate logaritmic) - na , cu a>=2 (complexitate polinomial) - an (complexitate exponential) - n! (complexitate factorial) O( g(n) ) este deci clasa de complexitate cu care se aproximeaz complexitatea unui algoritm. Pentru n suficient de mare au loc inegalitaile: log(n) < n < n*log(n) < n2 < n3 < 2n ceea ce implic 71

O(log(n)) < O(n) < O(n*log(n)) < O(n2) < O(n3) < O(2n) n situaia n care gsim mai muli algoritmi pentru rezolvarea unei probleme, stabilim complexitatea fiacarui algoritm, apoi, pentru a opta pentru un algoritm optimal, vom alege dintre toi algoritmii pe cel cu ordinul de complexitate mai mic. Reguli generale de estimare a complexitii Pentru a putea determina funcia care modeleaz timpul de execuie al unui algoritm, trebuie s prezentm mai nti cteva reguli generale de calcul a complexitii unui algoritm. Cicluri Timpul de execuie al unui ciclu este cel mult timpul de execuie al instruciunilor din interiorul ciclului nmulit cu numrul de iteraii. De regul se estimeaz ca o structur repetitiv este de ordinul O(n). Cicluri imbricate Analiza se realizeaz din interior spre exterior. Timpul de execuie al instruciunilor din interiorul unui grup de cicluri imbricate este dat de timpul de execuie al instruciunilor nmulit cu produsul numrului de iteraii ale tuturor ciclurilor. Cu alte cuvinte, dac avem dou cicluri imbricate (for n for spre exemplu) putem aproxima complexitatea la O(n2). Structuri secveniale n acest caz timpii de execuie se adun, ceea ce nseamn c maximul lor conteaz, adic gradul lui n va fi dat de gradul cel mai mare. Structuri decizionale Timpul de execuie al instruciunii decizionale este cel mult timpul de execuie al testului plus maximul dintre timpii de rulare pe ramura ATUNCI, respectiv ALTFEL. Dac exist apeluri de funcii, acestea trebuie analizate primele. Exemplu de alegere a algoritmului optim S presupunem c avem urmatoarea problem: Se citete o matrice de la tastatur cu n linii i n coloane. Se cere s se realizeze un program care afieaz suma elementelor de pe diagonala principal. Avem dou variante de algoritmi: ALGORITM NEEFICIENT citete n //citire matrice pentru i 1, n execut | pentru j 1, n execut | | citete a[i][j] | | ALGORITM EFICIENT citete n //citire matrice pentru i 1, n execut | pentru j 1, n execut | | citete a[i][j] | | 72

| S 0 pentru i 1, n execut | pentru j 1, n execut | | dac (i = j) atunci | | |s s + a[i][j] | | | | | | scrie s

| S 0 pentru i 1, n execut | s s + a[i][i] | scrie s

Explicarea algoritmului: Observm c amndou variantele citesc matricea folosind dou structuri for (pentru) imbricate. Aceast secven de algoritm are complexitatea O(n2), dup cum am artat mai sus. Algoritmul din stanga (cel descris ca neeficient) parcurge apoi toat matricea i doar n cazul n care i=j adun elementul curent din matrice la sum. Instruciunea de decizie o execut de nxn ori, rezultnd o complexitate de O(n2). Ar nsemna c pentru n=100 (s lum exemplu o valoare mic), instruciunea de decizie se va execut de 100x100 ori adic de 10000 ori. Pe de alt parte, algoritmul din dreapta, folosete faptul c pe diagonala principal elementele au indicii egali astfel: Se folosete o structur repetitiv n care se parcurge fiecare linie, adunnd la sum elementul a[i][i]. Rezult c aceast secven de algoritm are complexitatea doar de O(n). Cu alte cuvinte, n cazul lui n=100, atribuirea se execut de 100 de ori, cte o dat pentru fiecare linie. Se observ cum un mic artificiu conduce la un algoritm mult mai eficient. n modulele urmtoare vei nva diferite tehnici de programare care v vor ajuta s realizai algoritmi din ce n ce mai performani.

73

Sugestii metodologice
UNDE PREDM? Coninutul poate fi predat n laboratorul de informaic sau ntr-o sal care are videoproiector sau flipchart. CUM PREDM? Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor cunotine. Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi. Ca materiale suport se pot folosi: O prezentare multimedia care s cuprind urmtoarele noiuni: o Diferenele i asemnrile dintre cele dou modele Activiti interactive, de genul urmator: o Determinarea complexitii unui algoritm dat o Recunoaterea unui algoritm eficient fa de altele neeficiente o Elaborarea unor algoritmi eficieni pentru diverse probleme o Elaborarea unor algoritmi de o anumit complexitate o Ordonarea complexitii algoritmilor dup timpul de execuie o Activiti de tip rebus, mperechere, completare cu noiunile nvate Ca materiale de evaluare se pot folosi: o Probe practice i scrise

74

IV. Fia rezumat


Unitatea de nvmnt __________________

Fia rezumat
Clasa ________________ Nume i prenume elev Competena 1 A1 zz.ll.aaaa1 A2 AX A1 Competena 2 A2 A3 A1 Profesor______________________ Competena 3 A2 A3 Observaii

Nr. Crt. 1 2 3 4 ... Y

zz.ll.aaaa reprezint data la care elevul a demonstrat c a dobndit cunotinele, abilitile i atitudinile vizate prin activitatea respectiv

75

V. Bibliografie
1. Cristian Georgescu, 1999. Analiza si proiectarea sistemelor informatice, Editura Radial, Galai 2. Mihaela Georgescu, 2002, Structuri de date si baze de date, Editura Pax Aura Mundi, Galai 3. Popescu T.& colectiv, 1999, Dictionar de informatica, Editura stiintifica si enciclopedica, Bucureti 4. Maxim I., 1997, Metodica predrii informaticii, Universitatea tefan cel Mare, Suceava, curs litografiat 5. Ionescu C., 1999, Metodica predrii informaticii, Universitatea Babe- Bolyai, Cluj, curs litografiat, 6. Wirth N., 1976, Algorithms+Data Structures=Programs, Prentice Hall, Inc 7. Sorin, T., Cerchez E., erban M., 1999, Informatica, Varianta C++, manual pentru clasa a IX-a, Ed L&S Infomat, Bucureti 8. Sorin, T., Cerchez E., erban M., 1999, Informatica, Varianta Pascal, manual pentru clasa a IX-a, Ed L&S Infomat, Bucureti 9. Sorin, T., 1997, Bazele programrii n C++, Ed. L&S Infomat, Bucureti 10. Sorin, T ., 1996, Tehnici de programare, Ed. L&S Infomat

11. Tomescu I., 1994, Bazele informaticii (Manual pentru clasa a X), Ed. Didactic i Pedagogic 12. Stoilescu D., 1998, Manual de C/C++ pentru licee, Ed. Radial, Galai, 13. Ptru B., Miloescu M., 1999, Informatic - manual pentru clasa a IX-a, Ed. Teora, 14. Lica D., Onea E., 1999, Informatica, manual pentru clasa a IX-a, Ed. L&S Infomat, 15. Knuth D. E., 1973, Tratat de programarea calculatoarelor, vol. I, II, III, Ed. Tehnic, Bucureti,

76

16. Ivac C., Prun M., Mateescu E., 1997, Bazele Informaticii (Grafuri i elemente de combinatoric) - Caiet de laborator, Ed. Petrion 17. Ivac C., Prun M., 1995, Bazele informaticii, Ed. Petrion

18. Giumare C., Negreanu L., Clinoiu S., 1997, Proiectarea i analiza algoritmilor. Algoritmi de sortare, Ed. All 19. Cormen T., Leiserson Ch., Rivest R., 1990, Introduction to Algorithms, MIT Press, 20. Andonie R., Grbacea I., 1995, Algoritmi fundamentali, o perspectiv C++, Ed. Libris, 21. ***.La 08.05.2009 22. http://www.allaboutcircuits.com/vol_4/chpt_2/3.html

***. La http://www.wikipedia.org/. 04-12.05.2009

23. ***.La http://www.ecvale.com/index.php? main_page=pub_eind_info&pubs_id=290807217 . 08.05.2009 24. ***. La http://hal.archivesouvertes.fr/docs/00/28/14/29/PDF/floating-point-article.pdf 28.04.2009 25. 26. 27. 28. 29. *** La http://profu.info/limbajul-c/ 05.05.2009 ***. La http://www.structuri.ase.ro/ 09.05.2009 ***. La http://corina.doit.ro/graf/ 02.05.2009 ***. La http://en.wikipedia.org/wiki/Big_O_notation 23.04.2009 ***.La http://www.stud.usv.ro 12.05.2009

77

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