of 92 /92
Metode de programare Asist.univ.dr. Simona Elena Vârlan

Metode de programare Proiectarea algoritmilor

  • Author
    others

  • View
    5

  • Download
    1

Embed Size (px)

Text of Metode de programare Proiectarea algoritmilor

Metode de programare Proiectarea algoritmilorStructura curs
1 ore de curs – ambele specializri, titular curs Simona Elena Vârlan (cabinet D213, vineri)
2 ore de laborator + 1 or de seminar
titular Simona Elena Vârlan
• Nota final: ( L + E ) /2 >= 5
Curs 1
Sumar
9. Structuri de date
13. Bibliografie i webografie
1. Noiunea de algoritm
• În procesul de rezolvare a unei probleme folosind calculatorul exist dou etape:
• 1. Definirea i analiza problemei
• 2. Proiectarea i implementarea unui algoritm care rezolv problema
• 1. Definirea i analiza problemei poate fi la rândul ei descompus în:
• specificarea datelor de intrare
• specificarea datelor de ieire
1. Noiunea de algoritm Specificarea datelor de intrare const în: 1. Ce date vor fi primite la intrare 2. Care este formatul (forma lor de reprezentare) datelor de intrare 3. Care sunt valorile permise sau nepermise pentru datele de intrare 4. Exist unele restricii (altele decât la 3) privind valorile de intrare 5. Câte valori vor fi la intrare, sau dac nu se poate specifica un numr fix de valori, cum se va ti când s-au terminat de introdus datele de intrare.
1. Noiunea de algoritm Specificarea datelor de ieire trebuie s in cont de urmtoarele aspecte:
1. Care din valorile rezultate în cursul aplicrii algoritmului de calcul, asupra datelor de intrare, vor fi afiate (necesare utilizatorului), în acest pas se face diferenierea clar între date intermediare i date de ieire.
2. Care va fi formatul datelor de ieire (de exemplu un numr real poate fi afiat cu trei sau cu cinci zecimale, sau un text poate fi afiat integral sau parial).
1. Noiunea de algoritm • O definiie a noiunii de algoritm poate fi:
O succesiune finit de operaii cunoscute care se execut într-o succesiune logic bine stabilit astfel încât plecand de la un set de date de intrare, s obtinem într-un interval de timp finit un set de date de ieire.
Un exemplu simplu de algoritm ar fi suita de operaii matematice fcut în rezolvarea unei ecuaii matematice de gradul II:
coeficienii a, b i c se schimb dar modul de procesare a valorilor lor, nu
0 2
cxbxa
1. Noiunea de algoritm • Proprietile unui algoritm sunt: 1. Generalitate. Un algoritm trebuie s poat fi utilizat pentru o clas
întreag de probleme, nu numai pentru o problem particular. Din aceast cauz, o metod de rezolvare a unei ecuaii particulare nu poate fi considerat algoritm.
2. Finitudine. Orice algoritm trebuie s permit obinerea rezultatului dup un numr finit de prelucrri (pai).
3. Determinism. Un algoritm trebuie s prevad, fr ambiguiti i fr neclariti, modul de soluionare a tuturor situaiilor care pot s apar în rezolvarea problemei. Dac în cadrul algoritmului nu intervin elemente aleatoare, atunci ori de câte ori se aplic algoritmul aceluiai set de date de intrare trebuie s se obin acelai rezultat.
1. Noiunea de algoritm
Prelucrrile care intervin într-un algoritm pot fi simple sau structurate.
• Prelucrrile simple sunt atribuiri de valori variabilelor, eventual prin evaluarea unor expresii;
• Prelucrrile structurate pot fi de unul dintre tipurile:
− Liniare. Sunt secvene de prelucrri simple sau structurate care sunt efectuate în ordinea în care sunt specificate;
− Alternative. Sunt prelucrri caracterizate prin faptul c în funcie de realizarea sau nerealizarea unei condiii se alege una din dou sau mai multe variante de prelucrare;
− Repetitive. Sunt prelucrri caracterizate prin faptul c aceeai prelucrare (simpl sau structurat) este repetat cât timp este îndeplinit o anumit condiie.
1. Noiunea de algoritm
•Concluzia:
Un algoritm este independent de tipul de limbaj în care este
transpus sau de tipul de calculator pe care este executat.
2. Reprezentarea unui algoritm
Modul de descriere a unui algoritm, este independent de un limbaj de programare, existând dou metode clasice:
1. metoda schemei logice
3. Elementele programrii structurate
•Structurile de control de baz – cu ajutorul lor se pot descrie algoritmii: secvena, decizia alternativ binar (if) i structura repetitiv cu test iniial (while)
•Care sunt cele derivate?
3. Elementele programrii structurate • Programarea pe baza celor trei structuri (i a celor auxiliare)
se numete programare structurat.
• Informaticienii Böhm i Jacopini au formulat un principiu al programrii structurate, sub forma unei teoreme: cele trei structuri (secvena, decizia i repetiia condiionat anterior) sunt suficiente pentru a descrie orice algoritm.
Teorema programrii structurate a lui Böhm i Jacopini care se poate enuna astfel:
Orice schem logic nestructurat poate fi înlocuit cu una echivalent, dar structurat, prin adugarea de noi aciuni i condiii.
Aadar, orice program poate fi pus sub o form structurat, adic s conin doar structurile de baz i/sau structurile auxiliare, prin utilizarea unor variabile boolene asociate unor funcii suplimentare
3. Elementele programrii structurate Exemplu: Algoritmul urmtor determin cel mai mic element (notat min) din irul de n elemente X i este într-o form nestructurat
Citeste n, X i = 1 min = X(0)
A: dac i>n atunci treci la pasul B -> instruciune de salt necondiionat, nu e secvenial
altfel dac X(i)<min atunci
min = X(i) i = i+1 treci la pasul A
B: Scrie min
Algoritmul rescris într-o form structurat, utilizând structurile de baz
Citeste n, X
dac X(i)<min atunci
4. Concepia unui algoritm
1. Problema care va fi rezolvat, trebuie citit cu atenie.
2. Apoi se stabilesc prelucrrile care sunt necesare obinerii rezultatelor dorite.
Pentru a crea un algoritm eficient trebuie evideniate datele de intrare i datele de ieire.
5. 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
Motoda 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 (care la rândul lor pot fi descompuse în subprobleme).
Primul pas al metodei descompune algoritmul principal în subprobleme.
Pasul doi – pentru fiecare subproblem în parte elaborm un subalgoritm de rezolvare, urmând aceeai metod.
În final se combin soluiile s formeze soluia problemei iniiale.
5. Proiectarea algoritmilor
Descompunere în 3 module
Problema iniial Algoritmul principal
Avantajele proiectrii top-down(cunoscut i sub denumirea "Divide et impera")
Permite programatorului s reduc complexitatea problemei: subproblemele în care a fost descompus fiind mai simple, i s amâne detaliile pentru mai târziu. Când descompunem problema în subprobleme nu ne gandim cum se vor rezolva subproblemele ci doar care sunt ele i conexiunile dintre ele.
Permite lucrul în echipe mari: Prin descompunerea problemei în mai multe subprobleme, fiecare subproblem poate fi dat spre rezolvare unei subechipe.
5. Proiectarea algoritmilor
Metoda bottom-up În cazul metodei ascendente (bottom-up) va fi scris mai întâi 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.
Principalul dezavantaj - faptul c erorile vor fi detectate târziu, abia în faza de asamblare.
De cele mai multe ori proiectarea algoritmilor combin cele dou metode, ajungând astfel la o proiectare mixt.
5. Proiectarea algoritmilor
Proiectarea modular
Prin proiectare / programare modular un algoritm se va rezolva prin folosirea modulelor.
Modulul este considerat o unitate structural de sine stttoare, care poate fi un program, un subprogram, sau o unitate de program. Poate fi format din mai multe submodule.
Fiecare modul realizeaz o funcie bine precizat în cadrul întregului program.
Modulele sunt independente, dar pot “comunica” între ele prin transmitere de parametri sau prin apeluri.
5. Proiectarea algoritmilor
Avantajele programarii modulare:
- Probabilitatea apariiei erorilor în conceperea unui subprogram este mult mai mic decât dac s-ar lucra cu tot programul iniial.
- Rezolvând o problem mai simpl (un modul), testarea acestui modul se poate face mult mai uor decât testarea întregului algoritm;
- Permite munca în echip, modalitate prin care se ajunge la scurtarea termenului de realizare a programului;
- Modulele se pot refolosi.
Înglobeaz toate metodele de proiectare a algoritmilor descrise anterior.
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 (secvenial, decizional, repetitiv ).
6. Corectitudinea algoritmilor
Corectitudinea – spunem c un algoritm este corect dac el furnizeaz în mod corect datele de ieire pentru toate situaiile regsite în datele de intrare.
Exist totui algoritmi care sunt coreci, clari, generali i furnizeaz soluia într- un timp finit îns mai lung sau folosesc mai mult memorie decât ali algoritmi.
Vom încerca s gsim algoritmi care s dea soluia într-un timp cât mai scurt, cu cât 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 problem într-un timp de executie cât mai scurt, folosind cât mai puin memorie.
În elaborarea algoritmilor apar frecvent erori. Prezentm câteva dintre cele mai întâlnite tipuri de erori i câteva metode de tratare a lor.
6. Corectitudinea algoritmilor
Erori în datele iniiale
• Provin din introducerea, ca valori de intrare, a unor date de tip diferit de cel prevazut la elaborarea algoritmului. În aceste situaii algoritmul nu se comport în modul ateptat, generând erori sau eventuale date de ieire eronate.
• O alt eroare frecvent este confuzia între variabilele globale i locale
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 utilizând aritmetica exact.
• Eroare de rotunjire este diferena dintre rezultatul produs de un algoritm dat utilizând aritmetica exact i rezultatul produs de acelai algoritm utilizând 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.
6. Corectitudinea algoritmilor
Erori reziduale
• Sunt acele erori care rezult din diferena între valorile obinute efectiv i cele asteptate a fi obinute.
Erori de sintax
• Sunt erorile cele mai frecvente i cel mai uor de corectat (greeli de tastare, de punctuaie, de plasare a instruciunilor, confuzia între irurile de caractere i numere).
Erori de logic (semantice)
• Se genereaz atunci când nu se obin rezultatele ateptate dei nu sunt generate erori în timpul execuiei programului sau erori sintactice.
6. Corectitudinea algoritmilor
Tehnici de depistare a erorilor Urmarirea secvential a algoritmului (logica programului) folosind reprezentarea în pseudocod a algoritmului.
Utilizarea comentariilor - este bine s inserm cât mai multe comentarii în algoritmi cu explicaii sau chiar transformarea liniilor de cod in comentarii i rularea programului pentru a urmri mai uor modul de execuie i rezultatele obinute.
Adaugarea de instruciuni de afiarea a valorilor variabilelor pas cu pas, a rezultatelor unor expresii sau a unor mesaje pentru a verifica execuia corect a programului.
Descompunerea programelor complexe în mai multe module pentru a mri gradul de localizare a erorilor dar i pentru reutilizarea codului.
7. Verificarea corectitudinii algoritmilor
- corect,
- clar,
Exist numeroase tehnici de verificre i validare a algoritmilor:
• tehnica testarii programelor i depanarea programelor
7. Verificarea corectitudinii algoritmilor
Tehnica testrii programelor
Prin testare se verific funcionarea programului, de a gsi posibilele defecte ale acestuia astfel încât programul s funcioneze la parametri prevzui.
Procesul de detectare i apoi de eliminare a erorilor unui algoritm are dou componente, numite:
• verificare
• Validare
Testarea programului pe diverse seturi de date de test
Se bazeaz pe construirea unor eantioane de date de intrare care s conduc la depistarea unor erori în funcionarea programului.
Seturile de date de test trebuie s acopere inclusiv situaii de excepie i s verifice dac fiecare subproblem a problemei date este rezolvat corect .
7. Verificarea corectitudinii algoritmilor
Metode de testare a programelor (teste software)
1. Testarea funcional sau metoda cutiei negre (black box) - presupune construirea datelor de test astfel încât s permit testarea fiecrei funciuni a programului (funcionalitatea programului);
• Tester-ul tie doar ce trebuie s fac programul nu i cum face;
• Cazurile de testare se construiesc cu ajutorul cerinelor i specificaiilor.
2. Testarea structural sau metoda cutiei transparente (white box) - presupune construirea datelor de test astfel încât toate prile programului s poat fi testate.
• Se testeaz structura intern i modul de prelucrare a datelor;
• Tester-ul trebuie s tie cum a fost fcut programul i s aib experien de programare
3. Testarea prin metoda cutiei gri (gray box) – presupune ca tester-ul s cunoasc algoritmii i structurile de date din program, dar s testeze ca un utilizator final.
7. Verificarea corectitudinii algoritmilor
Depanarea unui program (debugging)
Const în localizarea erorii, determinarea naturii sale. Ea se poate face în mod:
• static, dup executarea programului
• dinamic, în timpul execuiei acestuia
Mai toate mediile de programare ofera posibilitatea de debugg care permite execuia programului pas cu pas sau stabilirea unor puncte de întrerupere în care s inspectm starea programului.
8.Algoritmi elementari ce folosesc structuri fundamentale
1. S se scrie un program care verific dac un numr n este perfect sau nu.
Un numr perfect este egal cu suma divizorilor lui, inclusiv 1 (exemplu: 6 = 1 + 2 + 3).
Exemplu:
• Pentru n = 28, se va afia mesajul
Numar perfect (divizorii lui 28 sunt 1, 2, 4, 7, 14)
8.Algoritmi elementari ce folosesc structuri fundamentale
Pas 1: Stabilim care sunt datele de intrare, adic cele care vor fi prelucrate cu ajutorul algoritmului, împreun cu datele de ieire.
În cazul problemei date, avem:
•Date de intrare: n numr natural
•Date de ieire: mesaj corespunztor
8.Algoritmi elementari ce folosesc structuri fundamentale
Pas 2: Analiza problemei
1) La începutul problemei, vom iniializa o variabil de tip suma cu valoarea 0.
2) Pentru fiecare valoare i de la 1 la n-1 vom verifica dac i este divizor al numarului n. Daca este divizor atunci il insumam la valoarea s.
3) Verificam daca suma obtinuta este egala cu numarul n. Daca da atunci scriem mesajul
‘Numarul este perfect’.
8.Algoritmi elementari ce folosesc structuri fundamentale
natural n, i, s citete n i = 1 s = 0 repet
dac n % i = 0 atunci s = s + i
sfârit dac i = i + 1
pân când i > n-1 ->
dac s = n atunci
stop
8.Algoritmi elementari ce folosesc structuri fundamentale Se citesc dou numere întregi a i b. S se realizeze in pseudocod un algoritm care s verifice dac cele doua numere sunt prietene. Spunem ca dou numere sunt prietene dac suma divizorilor proprii ai unui numr este egal cu cellalt numr i invers.
Exemplu: Pentru n = 220, si m = 284 se vor afia valorile: Divizorii lui 220, sunt 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 i 110. Suma este 284 Divizorii lui 284, sunt 1, 2, 4, 71 i 142. Suma lor este 220
8.Algoritmi elementari ce folosesc structuri fundamentale
Pas 1: Stabilim care sunt datele de intrare, adic cele care vor fi prelucrate cu ajutorul algoritmului, împreun cu datele de ieire.
În cazul problemei date, avem:
•Date de intrare: n si m numere naturale
•Date de ieire: numerele sunt sau nu prietene
8.Algoritmi elementari ce folosesc structuri fundamentale
Pas 2: Analiza problemei
La începutul problemei, vom iniializa valoarea unei variabile pentru suma divizorilor lui n cu 0, iar apoi valoarea unei variabile pentru suma divizorilor lui m cu 0.
Apoi, într-un ciclu repetitiv avand n/2 pasi vom calcula suma divizorilor lui n.
Apoi, într-un ciclu repetitiv avand m/2 pasi vom calcula suma divizorilor lui m.
La sfarsit vom verifica daca suma divizorilor primului numar este egal cu cel de-al doilea numr, iar suma divizorilor celui de- al doilea numar este egal cu primul numr
8.Algoritmi elementari ce folosesc structuri fundamentale
natural n, m, i, j, suma_n, suma_m
citete n
suma_n = 0
suma_n = suma_n + 1
suma_m = suma_m + j
scrie “Numere prietene”
8.Algoritmi elementari ce folosesc structuri fundamentale
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.
De exemplu dac se citete pentru a valoarea 323 atunci algoritmul va afia „PALINDROM”, iar dac va citi 123 va afia „NU”.
Pas 1: Stabilim care sunt datele de intrare, adic cele care vor fi prelucrate cu ajutorul algoritmului, împreun cu datele de ieire.
• Date de intrare: a numr natural
• Date de ieire: mesaj corespunztor
8.Algoritmi elementari ce folosesc structuri fundamentale
Pas 2: Analiza problemei
Algoritmul se bazeaz pe problema de calcul a numrului invers.
De aceea algoritmul descompune în cifre numrul a i formeaz numrul invers, dupa care compar acest numr invers cu numrul iniial citit.
Pentru asta avem nevoie de o copie a numrului „a” deoarece în structura repetitiv se modific valoarea numrului introdus, iar noi avem nevoie de valoarea iniiala pentru verificare.
8.Algoritmi elementari ce folosesc structuri fundamentale
citeste a
aux = a // salvez valoarea iniial a lui a în aux
inv = 0 //initial inv este nul
cât timp aux ≠ 0 execut
inv = inv * 10 + aux % 10
aux = aux / 10
9. Structuri de date - recapitulare
O structur de date este o colecie de elemente asupra creia se pot efectua anumite operaii.
Clasificarea structurilor de date:
1.În funcie de tipul datelor memorate în cadrul structurii, structurile de date se pot
clasifica în:
•structuri de date omogene – toate datele componente sunt de acelai tip (de
exemplu tabloul);
•structuri de date neomogene – pot conine date de tipuri diferite (de
exemplu înregistrarea).
2.În funcie de modul de alocare a memoriei interne, structurile de date sunt
de dou tipuri:
•structuri de date statice (folosind vectori) – ocup o zon de memorie de
dimensiune fix, alocat pe întreaga durat a execuiei blocului în care este
declarat (de exemplu tabloul, fiierul, lista, stiva, coada);
•structuri de date dinamice (folosind pointeri) – ocup o zon de memorie
de dimensiune variabil, alocat pe parcursul execuiei programului, la cererea
explicit a programatorului (de exemplu lista, stiva, coada).
10. Structura de date de tip list
LISTA – structura de date logica, liniara, cu date omogene, in care fiecare
element are un succesor si un predecesor, exceptand primul element,
care nu are decat succesor si ultimul element care nu are decat
predecesor.
a) in functie de modul de alocare a memoriei interne:
- implementare statica (folosind vectori)
- implementare dinamica (folosind pointeri)
b) in functie de modul de aranjare a elementelor listei:
- secventiala – numai statica
Operaii elementare care se pot efectua asupra unei liste:
•crearea unei liste vide;
•afiarea elementelor unei liste.
Implementarea prin alocare înlnuit • Nodurile sunt aranjate aleatoriu in memorie.
• Necesita un mecanism prin care sa se precizeze ordinea reala a nodurilor adica:
- pozitia primului nod (prim)
- pozitia ultimului nod (ultim)
- succesorul fiecarui nod (urm)
• Metoda folosita este ca un nod al listei sa contina doua tipuri de informatii:
- informatia propriu-zisa
Clasificarea Listelor
Clasificarea listelor
Declararea listei
nod lista [NMAX+1];
Algoritmi pentru prelucrarea listelor
Se considera ca un nod al listei contine numai un camp cu informatie si campul pentru realizarea legaturii:
const unsigned NMAX=100; unde:
typedef unsigned adresa; prim – adresa primului nod
ultim – adresa ultimului nod
{int info; n – valoarea atribuita campului info
adresa urm;}; nr_el – lungimea listei
nod lista [NMAX+1]; liber – vector harta a nodurilor
- liber [p] are valoarea 1 daca
adresa prim, ultim, p; nodul p este liber si 0 daca
unsigned nr_el, liber[NMAX]; este ocupat
int n;
{ ultim = prim = NULL;
liber [ p ] = 1;
Algoritmi pentru prelucrarea listelor
Alocarea memoriei: se gaseste prima pozitie libera si se aloca memorie pentru noul nod.
adresa aloc_mem ( )
liber [ p ] = 0 ; nr_el ++;
{ prim = aloc_mem ( );
{ p = aloc_mem ( );
ultim = p;
void adaug_inainte_prim ( adresa &prim, adresa &ultim, int n )
{ p = aloc_mem ( );
prim = p; }
void adaug_dupa (int info_nod_q, int info_nod_nou )
{
lista [ q ] .urm = p;
Algoritmi pentru prelucrarea listelor
void adaug_in_fata (int info_nod_q, int info_nod_nou )
{ //aflam nod q
lista [ q ] . info = n;
lista [ q ] .urm = p;
ultim = p; }
// se prelucreaza lista [ p ] . info;
Exercitiu: Eliminarea unui element -> laborator
Alte probleme cu liste – EXERCIII laborator
1. S se creeze o list cu numere întregi folosind crearea prin adugarea elementelor la inceputul listei (stiva).
Se cere:
b) S se determine suma i maximul elementelor listei
• Exemplu:
Pentru n=4 i elementele {-3, 10, -7, 5}, se obtine suma = 5 si maximul = 10
Pas 1: Stabilim care sunt datele de intrare, împreun cu datele de ieire.
• Date de intrare: lista cu n elemente
• Date de ieire: suma i maximul
Pas 2: Analiza problemei
2. Afiarea listei
Gândim problema pe subprograme ce pot fi apelate.
1. Realizm o metod pentru crearea listei.
2. Realizm o metod care returneaz suma i o metod care returneaz maximul.
3. Realizm o metod de afiare a listei.
1. Crearea listei - dinamic utilizând pointeri
struct lista
{ int info;
lista *urm;
lista *p, *prim, *ultim; //nod curent, nod prim , nod ultim
void creare(lista *&prim, lista *&ultim) {
//avem nevoie de referin la pointer pentru a pointa ctre urmtoarea adres din memorie, altfel rmâne null
citeste n //se citete n – numrul de elemente dorit
citeste inf //informaia
//se adaug primul element i se atribuie prima informaie acestuia
prim=new lista //se aloc memorie
prim ->info = inf
ultim=prim
pentru i = 2 .. n
citeste inf
p = new lista //nodul curent considerat noul nod de introdus în list
p->info=inf
p->urm = prim
cat timp nodul_current (p) nu este NULL
scrie p->info
p=p->urm }
int suma (lista *prim) {
suma+=p->info
maxim = informatia primului nod
daca p->info > maxim
return maxim }
2. S se creeze o list cu numere întregi folosind crearea prin adugare la sfâritul listei. Se cere:
a) S se afieze coninutul listei
b) S se determine numrul de numere prime
• Exemplu:
Pentru n=4 i elementele {11, 10, 13, 5}, se obin 3 numere prime
Pas 1: Stabilim care sunt datele de intrare, împreun cu datele de ieire.
• Date de intrare: lista cu n elemente
• Date de ieire: numrul de numere prime
1. Crearea listei - dinamic utilizând pointeri
struct lista
{ int info;
lista *urm;
lista *p, *prim, *ultim; //nod curent, nodul prim , nod ultim
void creare(lista *&prim, lista *&ultim) {
//avem nevoie de referin la pointer pentru a pointa ctre urmtoarea adres din memorie, altfel rmâne null
citeste n //se citete n – numrul de elemente dorit
citeste inf //informaia
//se adaug primul element i se atribuie prima informaie acestuia
prim=new lista //se aloc memorie
prim ->info = inf
ultim=prim
pentru i = 2 .. n
citeste inf
p = new lista //nodul curent considerat noul nod de introdus in list
p->info=inf
ultim->urm = p
cat timp nodul_current (p) nu este NULL
scrie p->info
p=p->urm }
int verific_prim (int nr) {
daca nr%i =0 flag=0
return flag } //dac flag rmâne 1 atunci numrul nu este prim, altfel return 0
4. Verific dac elementele din list sunt numere prime
int prime (lista *prim) {
contor = 0 //pentru a numr numerele prime
cat timp nodul curent diferit de null
daca verific_prim (p->info ) = 1
contor ++
return contor
}
3.S se creeze o list cu primii n termeni din sirul lui Fibonacci. Se cere:
• Exemplu: Pentru n=7 se obtine lista cu elementele 1, 1, 2, 3, 5, 8, 13.
Pas 1: Stabilim care sunt datele de intrare, împreun cu datele de ieire.
• Date de intrare: lista cu primele dou elemente având informaia 1
• Date de ieire: celelalte elemente din irul lui Fibonacci
1. Crearea listei - dinamic utilizând pointeri
struct lista
{ int info;
lista *urm;
lista *p, *prim, *ultim; //nod curent, nod prim , nod ultim
void creare(lista *&prim, lista *&ultim, int numar_elem_fibonacci) {
//avem nevoie de referin la pointer pentru a pointa ctre urmtoarea adres din memorie, altfel rmâne null
prim=new lista // se aloc memorie
prim ->info = 1 // valoarea 1 la primul element din lista
prim->urm = NULL //primul nod va fi i ultimul
p=new lista // avem nevoie de un al doilea nod
p->info = 1
p->urm=NULL
ultim=p //acum avem dou noduri
// se citesc celelalte informaii pentru celelalte noduri
i=2, j=1, k=1 // pentru a calcula valoarea pentru nodul trei avem nevoie de doua valori 1, iar în i se va calcula elem Fibonacci
cât timp numar <= numar_elem_fibonacci
i = j + k
p = new lista //nodul curent considerat noul nod de introdus in list
p->info= i
ultim->urm = p
-singurul element din stiv la care avem acces direct este
stivei;
cel de la vârful
- stiva este utilizat atunci când programul trebuie s amâne execuia
unor operaii, pentru a le executa ulterior, în ordinea invers apariiei lor;
- stiva funcioneaz dup principiul LIFO (Last In First Out);
Stiva este un tip particular de list, pentru care atât operaia de inserare
a unui element în structur, cât i operaia de extragere a unui element
se realizeaz la un singur capt, denumit vârful stivei.
11. Structura de date de tip stiv
Operaii elementare care se pot efectua asupra unei
stive: • crearea unei stive vide; • înserarea unui element în stiv (PUSH); • extragerea unui element din stiv (POP);
• accesarea elementului de la vârful stivei (TOP).
Exemplu 14, 2, 6, 77
6
2
14
vârful
elementelor sale într-un vector.
o stiv const în memorarea
Declararea stivei: <tip>
1. Crearea unei stive vide
- se iniializeaz numrul de elemente din stiv cu 0;
Exemplu int vârf=0;
- se verific dac stiva nu este plin;
- se mrete vârful stivei;
Exemplu if(varf==10)
- se verific dac stiva nu este vid;
- se reine elementul din vârful stivei într-o variabil;
- se micoreaz cu o unitate vârful stivei;
Exemplu if(varf==0)
- se memoreaz elementul din vârful stivei într-o variabil;
Exemplu e=STIVA[varf];
- singurul element din coad la care avem acces direct este
început;
cel de la
-coada este utilizat atunci când informaiile trebuie prelucrate exact
în ordinea în care “au sosit” i ele sunt reinute în coad pân când
pot fi prelucrate;
- coada funcioneaz dup principiul FIFO (First In First Out);
Coada este un tip particular de list, pentru care operaia de inserare a
unui element se realizeaz la un capt, iar operaia de extragere a unui
element se realizeaz la cellalt capt.
12. Structura de date de tip coad
Operaii elementare care se pot efectua asupra unei
cozi:
Exemplu 14,2, 6, 77
Reprezentarea cozilor
Cel mai simplu mod de a implementa o coad const în memorarea
elementelor sale într-un vector.
1. Crearea unei cozi vide
- se iniializeaz numrul de elemente din coad cu 0, pentru aceasta se iniializeaz variabilele început i sfârit;
Exemplu
2. Inserarea unui element în coad
-se verific dac coada nu este plin;
-se mrete sfâritul cozii cu o unitate;
-se plaseaz la sfârit noul element;

-se verific dac coada nu este vid;
-se reine elementul de la începutul cozii într-o variabil;
-se mrete cu o unitate începutul cozii;
Exemplu
- se memoreaz elementul de la începutul cozii într-o variabil;
Exemplu e=COADA[inceput];
1.Cerchez E., erban M., Informatic. Manual pentru clasa a X-a,
Editura Polirom, Iai, 2000
4.http://en.wikipedia.org/wiki/Stack_(abstract_data_type)