Sunteți pe pagina 1din 31

Noțiunea de algoritm

Cuvântul algoritm provine din limba arabă, de la numele matematicianului


și astrologului arab Al-Khowarizmi care a trăit în secolul IX.
Definiția algoritmului: Un set de reguli care conduc de la datele problemei
la rezultat.
Proprietățile algoritmului.
1. Fiecare pas al algoritmului trebuie să conțină o operație bine
definită și care poate fi realizată prin mijloacele disponibile.
2. Fiecare pas trebuie să fie unic definit.
3. Algoritmul trebuie să poată fi aplicat oricărui set de date care face
parte din domeniul de date admisibil.
4. Algoritmul trebuie să conțină un număr finit de pași, astfel încât să
se termine într-un timp finit.
Algoritmii pot fi reprezentați prin schele logice sau prin pseudocod.

Pseudocodul
Este un limbaj de nivel înalt cu ajutorul căruia pot fi descriși algoritmii.
Deși folosește convenții structurale asemănătoare cu cele ale unui limbaj
de programare, pseudocodul a fost creat pentru a fi înțeles și interpretat
de către oameni și nu de către calculatoare. Un program scris în
pseudocod poate fi cu ușurință “tradus” în limbaj de programare de către
un informatician.

Structuri de bază în pseudocod și echivalentul lor în scheme


logice

Blocul de start
Este unic din cadrul unei scheme logice și reprezintă punctul de pornire
al schemei. In acesta se înscrie cuvântul predefinit start.

Blocul de stop
Este unic în cadrul unei scheme logice și trebuie atins într-un număr finit
de pași. In acesta se înscrie cuvântul predefinit stop
Blocul de intrare
Pentru citirea datelor, în pseudocod se folosește instrucțiunea:
citește variabile
Acestei operațiuni îi corespunde în schema logică blocul de intrare.

Exemple de utilizare

In primul exemplu, se citesc de la tastatură variabile simple x, y, z în


ordinea în care apar în listă.
In al doilea exemplu se citește de la tastatura elementul a[i] al unui șir
sau tablou unidimensional (vector).
In al treilea exemplu se citește de la tastatura a[i][j] care este un element
al unei matrice unde: i reprezintă indicele de linie, iar j indicele de
coloană pe care se găsește element citit.

Blocul de ieșire
Pentru afișarea pe monitor sau la imprimantă a valorilor unei variabile
sau a unei expresii, se folosește instrucțiunea:
scrie variabile
scrie expresie
Acestei operațiuni îi corespunde în schema logică blocul de ieșire.

Exemple de utilizare

Blocul de atribuire
Blocul de atribuire are rolul de a atribui valori noi unor variabile.

Acest bloc se execută în modul următor: se evaluează, în primul rând,


expresia din partea dreaptă a semnului „=” apoi valoarea acesteia este
reținută (memorată) de variabila specificată în partea stângă.
Exemplu
a=b+c
Se adună valorile din memorie a variabilelor b și c iar valoarea găsită se
atribuie variabilei a (se memorează în locația de memorie asociată
variabilei a).
Unele atribuiri se pot folosi de valorile “vechi” ale variabilei ce primește
astfel o nouă valoare.
Exemplu
i=i+1
La valoarea din memoria a variabilei i se adună o unitate și valoarea
găsită se atribuie tot variabilei i. Astfel, dacă i avea înainte de execuția
acestei instrucțiuni valoarea 5, după execuție va avea valoarea 6.
Exemple de utilizare

Blocul de decizie
Acest bloc presupune continuarea operațiilor pe două căi posibile în
funcție de îndeplinirea unei condiții.

Dacă condiția înscrisă în bloc este îndeplinită algoritmul este continuat


cu blocurile de pe ramura DA. În caz contrar se continuă cu ramura NU.
Exemple de utilizare
Structuri de control
Structurile de control sunt:
Secvența
Selecția
Ciclul cu test inițial
Ciclul cu test final
Ciclul cu contor
Să le luăm pe rând.

Secvența
Este reprezentată grafic prin următorul simbol

Selecția
Selecția este o structură de control care poate avea una sau două ramuri.
Selecția cu două ramuri.
Această structură de comanda selectează una dintre cele două secvențe
în funcție de condiția din blocul de decizie.
In pseudocod această structură se descrie în modul următor:

dacă condiție
atunci {
secvența 1
}
altfel {
secvența 2
}

Selecția cu o singură ramură.


In pseudocod:

dacă condiție
atunci{
secvență
}

Ciclul cu test inițial


O secvența este executată în mod repetat cât timp condiția din blocul de
decizie este adevărată.
Această structură se execută în modul următor: se evaluează condiția.
Dacă aceasta este îndeplinită, se execută secvența după care se
evaluează din nou condiția. Această situație se repetă cât timp condiția
este adevărată. Când condiția devine falsă se trece mai departe. Dacă,
de la bun început, condiția este falsă secvența nu va fi executată nici
măcar o dată.

In pseudocod:

cât timp condiție execută (while)


{
secvență
}

Ciclul cu test final


O secvența este executată în mod repetat cât timp condiția din blocul de
decizie este adevărată.

DA

NU

In pseudocod:

repetă {
Secvență
}
cât timp condiție (Do – While)

Această structură se execută în modul următor: se execută secvența


după care se evaluează condiția. Dacă aceasta este falsă se repetă
execuția secvenței; în caz contrar se trece mai departe. Se remarcă
faptul că, indiferent de valoarea condiției, secvența se execută cel puțin
o dată.

Ciclul cu contor
Execuția unui ciclu cu contor se bazează pe un contor i care, la intrarea
în ciclu primește o valoare inițială n1 și apoi, cu pasul de creștere n3, se
parcurg toate valorile unui interval definit, până ajunge la o valoare finală
n2. La fiecare pas se execută secvența indicată în corpul ciclului. Primul
bloc al structurii are rolul de a atribui contorului o valoare inițială.
Blocul de decizie, care urmează, verifică dacă contorul este mai mic
decât valoarea finală. În caz afirmativ se merge pe ramura DA și se
execută secvența. După executarea operațiilor din secvență se
întâlnește un bloc de atribuire care adună la valoarea contorului i
valoarea pasului n3. Pasul n3 poate să fie un număr pozitiv sau un număr
negativ. Dacă pasul este pozitiv înseamnă că valoarea contorului va
crește la fiecare trecere prin blocul de incrementare. Evident că pentru
ca o astfel de structură de control să funcționeze trebuie ca valoarea
inițială să fie mai mică decât valoarea finală.
Dacă pasul este negativ atunci contorul va descrește și este necesar ca
valoarea inițială să fie mai mare decât cea finală.
In pseudocod:

pentru i = n1, n2, n3 (for)


{
secvență
}

Ciclul cu contor se utilizează atunci când se cunoaște de la bun început


numărul de parcurgeri ale secvenței.
Parametrul n3 poate fi omis. În acest caz valoarea acestuia este
considerată, în mod implicit, egală cu 1.

i = m1

prelucrări

i = i + m3

i ≤ m2
DA

NU

Dacă contorul i a atins valoarea finală m2 se continuă cu ramura NU.

Exemple de algoritmi
1. Suma a două numere
Algoritmul care rezolvă această problemă este următorul:
- Se citește de la tastatura primul număr;
- Se citește de la tastatura al doilea număr;
- Se calculează suma celor două numere;
- Se afișează pe ecranul monitorului rezultatul.
Pseudocodul corespunzător acestui algoritm este:

citește a
citește b
s=a+b
scrie s

Schema logică este:

2. Calcularea ariei unui triunghi


Algoritmul
- Se citește de la tastatură lungimea unei laturi a;
- Se citește de la tastatură lungimea înălțimii corespunzătoare
acelei laturi i;
- se calculează aria cu relația s = a * i / 2
- se afișează s.

Pseudocodul
citește a
citește i
s=a*i/2
scrie s

Încercați să realizați singuri schema logică.

3. Funcția modul
Algoritmul
- Se citește un număr ce la tastatură;
- Dacă numărul este mai mare decât zero
- Atunci modulul este egal cu numărul;
- Altfel modulul este egal cu numărul cu semnul schimbat;
- Se afișează numărul;
Pseudocod:

citește x
daca x > 0
atunci m = x
altfel m = - x
scrie m

Schema logică:
Schema logică:

Se remarcă faptul că numărul m nu trebuie să fie egal cu zero pentru


că în acest caz se va afișa valoarea - 0. Cu alte cuvinte, valoarea 0 nu
face parte din domeniul de valori admisibile.

4. Funcția signum
Deoarece algoritmul este evident îl vom exprima direct în
pseudocod.

citește x
dacă x > 0
atunci s = 1
altfel
{
dacă x = 0
atunci s = 0
altfel s = – 1
}
afișează s

Schema logică:

Noțiunea de șir
Prin șir se înțelege o secvență de elemente de același tip. In
informatică se întâlnesc frecvent șiruri de caractere. Tot prin șiruri
sunt reprezentați vectorii utilizați în matematică.
Accesul la un element al unui șir se realizează prin numele șirului
urmat de un index, plasat între paranteze pătrate. Indexul poate fi
nu număr întreg pozitiv începând cu valoarea 0 sau o expresie de
tip întreg. Exemple: d[0], as[6], cx[i + j].
Un șir care conține 10 elemente are indexi cuprinși între valoarea
0 și 9.

Citirea unui șir de la tastatură.


Pentru a citi un șir trebuie parcurse toate elementele acestuia.
Schema logică care realizează citirea elementelor șirului a de
dimensiune n este următoarea:

Pseudocodul:
citește n
pentru i = 0, n - 1
{
citește a[i]
}
În practică, pentru citirea sau scrierea unui șir se utilizează scrierea
prescurtată care are corespondent și în unele limbaje de
programare evoluate
citește (a[i], i = 0, n-1)

Afișarea unui șir se realizează cu aceeași schemă logică, în care


comanda citește se înlocuiește cu comanda scrie.
Scrierea prescurtată este:
scrie (a[i], i = 0, n-1]

Suma a doi vectori


Vectorii utilizați în matematică sunt reprezentați în informatică prin
șiruri. Calculăm vectorul c ale cărui elemente sunt obținute prin
însumarea elementelor vectorilor a și b de dimensiune n.
Pseudocodul

citește n
citește (a[i], i=0, n-1)
citește (b[i], i=0, n-1)
pentru i = 0, n-1
{
c[i] = a[i] + b[i]
}
Scrie (c[i], i = 0, n-1)

Schema logică corespunzătoare este:


START

Citește n
(a[i], i = 0, n-1)
(b[i], i = 0, n-1)

i=0

c[i] = a[i] + b[i]

i=i+1

DA
i≤n-1

NU

Scrie
(c[i], i= 0, n-1)

STOP

Produsul scalar a doi vectori


Se dau doi vectori a și b de dimensiune n. Se cere să se calculeze
produsul scalar al acestor vectori.
Produsul scalar se calculează cu relația
prod = a[1] * b[1] + a[2] * b[2] + … + a[n] * b[n]
Pentru a calcula această relație se va utiliza un ciclu cu contor.
START

citește n
(a[i], i = 0, n-1)
(b[i], i = 0, n-1)

prod = 0

i=0

prod = prod + a[i] * b[i]

i=i+1

DA
i ≤ n -1

NU

Scrie
prod

STOP

Scrieți singuri pseudocodul acestui algoritm.

Determinarea elementului minim dintr-un șir


Pentru rezolvarea acestei probleme, se memorează valoarea
primului element din șir. Se parcurge apoi șirul și se compară
această valoare cu fiecare element al șirului. La găsirea unui
element mai mic, se reține valoarea acestuia.
Pseudocodul

citește n, (a[i], i = 0, n-1)


min = a[0]
pentru i = 0, n-1
{
dacă min > a[i]
atunci min = a[i]
}
scrie min
START

Citește n
(a[i], i=0, n-1)

min = a[0]

i=0

DA
min > a[i] min = a[i]

NU

i=i+1

DA
i≤n-1

NU

Scrie
min

STOP

Ordonarea crescătoare sau descrescătoare a unui șir


In rezolvarea multor probleme apare necesitatea ordonării
elementelor unui șir. Pentru a realiza această operație există mai
multe metode.
Una dintre cele mai cunoscute metode este metoda bulelor

Metoda bulelor
Să presupunem ca dorim ordonarea crescătoare a elementelor
unui șir.
Metoda bulelor se implementează prin parcurgerea șirului și, ori de
câte ori se întâlnesc două elemente care nu sunt în ordine corectă,
poziția acestora se inversează. Numărul de inversiuni ale
elementelor se contorizează. Se parcurge șirul de mai multe ori
până când, la o parcurgere completă nu se mai execută nici o
inversiune. In acest moment șirul este ordonat. Pentru
implementarea acestui algoritm se utilizează un ciclu cu test final
care numără câte inversiuni ni au fost efectuate la parcurgerea
șirului. Când ni este nul, înseamnă că șirul a fost ordonat și se iese
din ciclu.
In interiorul acestui ciclu se găsește un ciclu cu contor care
realizează parcurgerea șirului. Când două elemente ale șirului nu
sunt în ordine corectă acestora li se schimbă locurile. De exemplu,
dacă două elemente consecutive a[i] și a[i + 1] nu sunt în ordine
corectă, adică a[i] > a[i + 1], pozițiile acestora trebuie inversate.
Pentru a realiza această operație se utilizează o variabilă auxiliară
aux. Secvența de inversare a pozițiilor este următoarea:

aux = a[i]
a[i] = a[i + 1]
a[i +1] = aux

După cum se constată aux este utilizată pentru memorarea


temporară a elementului a[i].
START

Citește n
(a[i], i=0, n-1)

ni = 0

i=0

aux = a[i]
DA
a[i] = a[i + 1]
a[i] > a[i+1] a[i + 1] = aux
ni = ni +1
NU

i=i+1

DA
i ≤ n-1

NU

DA
ni != 0

NU

Scrie
(a[i], i = 0, n-1)

STOP

Pseudocodul corespunzător este:


citește n, (a[i], i = 0, n-1)
repetă
ni = 0
pentru i = 0, n-1
{
dacă a[i] > a[i+1] atunci
{
aux = a[i]
a[i] = a[i+1]
a[i+1] = aux
ni = ni + 1
}

}
cât timp ni != 0 (nu este egal)
scrie (a[i], i = 0, n-1)

Tablouri
Un tablou este o colecție ordonată de elemente de același tip. Un
tablou cu un singur indice se numește vector și acesta a fost tratat
anterior. Pentru reprezentarea matricelor din matematică se
utilizează tablouri cu doi indici. De exemplu a[4][2] reprezintă
elementul situat pe linia a patra și coloana a doua a matricei a.
Pentru parcurgerea tuturor elementelor unei matrice se utilizează
două cicluri cu contor. In continuare este prezentată schema logică
pentru citirea unei matrice.
Pentru citirea sau scrierea unei matrice se utilizează, de obicei,
următoarea formă mai simplă:
citește ((a[i][j], j = 0, m-1), i = 0, n-1)
sau
scrie ((a[i][j], j = 0, m-1), i = 0, n-1)

Acest aranjament al indicilor i, j realizează parcurgerea matricei


linie după linie. Dacă se dorește parcurgerea după coloană ordinea
indicilor se inversează.

((a[i][j], i = 0, n-1), j = 0, m-1)


Pentru alte prelucrări efectuate asupra unei matrice se înlocuiește
blocul de citire din schema logică de mai jos cu secvența de
prelucrări dorite.

START

Citește n, m

i=0

j=0

Citește
a[i][j]

j=j+1

DA
j ≤ m-1

NU

i=i+1

DA
j ≤ n-1

NU

STOP

Adunarea a două matrice


Se dau două matrice a și b cu n linii și m coloane și se cere
determinarea matricei
c=a+b
Elementele matricei c se determină cu relația
c[i][j] = a[i][j] + b[i][j]
START

Citește n, m
((a[i][j],j=0,m-1),i=0,n-1)
((b[i][j],j=0,m-1),i=0,n-1)

i=0

j=0

c[i][j] = a[i][j] + b[i][j]

j=j+1

DA
j ≤ m-1

NU

i=i+1

DA
j ≤ n-1

NU

Scrie
((c[i][j],i=0,n-1),j=0,m-1)

STOP
Pseudocodul:

citește n, m
citește ((a[i][j], i = 0,n-1), j = 0,m-1)
citește ((b[i][j], i = 0,n-1), j = 0,m-1)
pentru i = 0, n-1
{
pentru j = 0, m-1
{
c[i][j] = a[i][j] + b[i][j]
}
}
scrie ((c[i][j], i = 0,n-1), j = 0,m-1)

Produsul a două matrice


Pentru a putea fi înmulțite, matricele trebuie să îndeplinească
următoarea condiție: Numărul de linii ale celei de a doua matrice
trebuie să fie egal cu numărul de coloane ale primei matrice.
Se dau matricele a[n][p] și b[p][m]
Fiecare element al matricei rezultate c[n][m] se calculează cu
relația:
𝑝−1
c[i][j] = ∑𝑘=0 a[i][k] ∗ b[k][j]
sau, cu alte cuvinte, este produsul scalar al liniei i din matricea a
cu coloana j a matricei b.
Pentru a realiza acest lucru se utilizează două cicluri cu contor
după i și după j, care repetă secvența ce calculează fiecare element
al matricei produs. Pseudocodul:

citește n, m, p
citește ((a[i][j], i = 0,n-1), j = 0,p-1)
citește ((b[i][j], i = 0,p-1), j = 0,m-1)
pentru i = 0,n-1
{
pentru j = 0,m-1
{
c[i][j] = 0
pentru k = 0,p-1
{
c[i][j] = c[i][j] + a[i][k] * b[k][j]
}
}
}
scrie ((c[i][j], i = 0,n-1), j = 0,m-1)
Schema logică a zonei care calculează produsul scalar al liniei i cu
coloana j este prezentată mai jos.

c[i][j] = 0

k=0

c[i][j] = c[i][j] + a[i][k] * b[k][j]

k=k-1

DA
k≤p-1

NU

Structura de selecție
Atunci când algoritmul prevede posibilitatea continuării pe mai
multe căi posibile în funcție de valoarea unui parametru se
utilizează structura case.
Se dau o mulțime de valori v1, v2, …, vn care aparțin mulțimii V.
Indicele i poate lua una din valorile acestei mulțimi. In funcție de
această valoare algoritmul se continuă cu una din secvențele s1,
s2, …,sn. Dacă i nu aparține mulțimii V atunci se continuă cu
secvența s.
Schela logică a structurii de selecție.

i=v1 i=v2 i=vn iV

s1 s2 ... sn s

Rezolvarea numerică a ecuațiilor algebrice neliniare


Să considerăm ecuația de formă generală
f(x) = 0
Căutam o soluție aproximativă a acestei ecuații. Presupunem că c este
valoarea exactă a unei soluții a acestei ecuații, iar c' o valoare
aproximativă a acestei soluții.
Soluția aproximativă se poate defini ca fiind o valoare
x = c': |c' – c| ε , cu ε0 și f(c) = 0
Grafic, această condiție poate fi reprezentată în felul următor:
y

y = f(x)

f(c’)

0 c’ c x

Soluția exactă a acestei ecuații este c deoarece f(c) = 0. Ne propunem


să găsim o soluție aproximativă c’ care să nu difere de soluția exactă cu
mai mult de o cantitate ε aleasă de noi.
Găsirea soluției aproximative c’ poate fi determinată prin mai multe
metode, dintre care menționăm:
- metoda înjumătățirii intervalului;
- metoda coardei.
Ambele metode presupun că am precizat anterior intervalul de pe
abscisă în care se găsește rădăcină căutată c.
Vom prezenta în continuare metoda înjumătățirii intervalului.

Metoda înjumătățirii intervalului


Presupunem că știm faptul că între punctele a și b de pe abscisă se
găsește rădăcina căutată c. Aceasta înseamnă că f(a) are semn contrar
față de f(b).
Algoritmul de rezolvare a problemei este următorul:
- Se calculează mijlocul intervalului d dintre punctele a și b cu relația
d = (a + b) / 2
- Se determină în care dintre cele două jumătăți ale intervalului dintre a
și b se găsește rădăcina.
Pentru aceasta se calculează valoarea funcției f(d). Dacă această are
același semn cu f(a) rezultă că rădăcina căutată se găsește în intervalul
dintre punctele d și b. In caz contrar rădăcina se găsește între punctele
a și d. Această operație se face prin testarea semnului produsului dintre
f(a) și f(d). Dacă produsul este pozitiv înseamnă că cele două cantități au
același semn. Dacă produsul este negativ rezultă că au semne contrare.

y = f(x)

f(a)

a c d b x
0
f(d)

f(b)

Se restrânge intervalul la noile limite găsite și se repetă procedura.


Calculele se opresc când valoarea f(d) este mai mică decât o valoare
arbitrar aleasă ε care reprezintă precizia cu care dorim determinarea
rădăcinii.
Pseudocodul
citește coeficienții funcției f
citește a, b, eps
x = f(a)
repetă
{
d = (a + b) / 2
y = f(d)
dacă x * y > 0
atunci
{
a=d
x=y
}
altfel
{
b=d
}
cât timp y > eps
}
scrie d
Schema logică

START

Citește
coeficienți f
a,b,eps

x = f(a)

d = (a + b) / 2

y = f(d)

a=d
b=d x*y>0 x=y
NU DA

DA
y > eps

NU

Scrie
d

STOP
Se observă că algoritmul propus nu ține seama de posibilitatea ca, prin
împărțirea succesivă a intervalului, să se ajungă, în mod întâmplător,
chiar la valoarea exactă a soluției căutate.

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