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)