Notiunea de Algoritm

Descărcați ca pdf sau txt
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 30

Noțiunea de 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. Algoritmul este constituit din pași discreți.
2. Fiecare pas al algoritmului trebuie să conțină o operație bine
definită și care poate fi realizată prin mijloacele disponibile.
3. Algoritmul trebuie să conțină un număr finit de pași, astfel încât să
se termine într-un timp finit.
4. Algoritmul trebuie să poată fi aplicat oricărui set de date care face
parte din domeniul de date admisibil.

Algoritmii pot fi descriși în limbaj natural sau reprezentați prin scheme


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 pseudocod
poate fi cu ușurință “tradus” în limbaj de programare de către un
informatician.

Schema logică
Schemele logice sunt notații grafice formate din blocuri legate între ele
prin săgeți, care indică ordinea de parcurgere a operațiilor.

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


logice

Blocul de start
Este unic în 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 al unui 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ă linia, iar j - coloana pe care se găsește
elementul citit.
Blocul de ieșire
Pentru afișarea valorilor unei variabile sau a unei expresii, se folosește
instrucțiunea:
scrie variabilă
scrie expresie
Acestei operațiuni îi corespunde în schema logică blocul de ieșire.

Exemple de utilizare

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

Se evaluează, în primul rând, expresia din partea dreaptă a semnului =


apoi valoarea acesteia este reținută de variabila specificată în partea
stângă.

Exemplu:
a=b+c
Se aduna valorile din memorie a variabilelor b și c, iar valoarea găsită se
atribuie variabilei a.
Unele atribuiri se pot folosi de valorile anterioare ale variabilei ce
primește 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:

In pseudocod, aceste instrucțiuni se scriu în modul următor:


i = i+1
a[i] = 7.5
a[i][j] = 70
s = ”upc”

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

Exemplu în pseudocod:
citește b,c
a = b+c
d = a/2
scrie d
In exemplul considerat, cuvântul generic „prelucrări” a fost înlocuit de
operațiile prezentate mai sus.

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.
dacă condiție
atunci {
secvența 1
}
altfel {
secvența 2
}

Selecția cu o singură ramură.

dacă condiție
atunci{
secvență
}

Ciclul cu test inițial

O secvență 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ă.

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


{
secvență
}

Ciclul cu test final


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

NU

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 adevărată se repetă
execuția secvenței. In 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 care, la intrarea în
ciclu primește o valoare inițială n1 și apoi, se parcurg toate valorile unui
interval definit, cu pasul de creștere n3, 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 unui pas 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. 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 recomandat
ca valoarea inițială să fie mai mare decât cea finală.

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 = n1

secventa

i = i + n3

i ≤ n2
DA

NU

Dacă contorul i a atins valoarea finală n2 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 tastatură primul număr;


- Se citește de la tastatură 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

Schema logică. Incercați să o realizați singuri.


3. Funcția modul
Algoritmul
- Se citește un număr de la tastatură;
- Dacă numărul este mai mare decât zero
- Atunci modulul este egal cu numărul dat;
- 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ă

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
un 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 indecși 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]
}

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


comanda citește se înlocuiește cu comanda scrie.

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
pentru i = 0, n - 1
{
citește a[i]
}
pentru i = 0, n - 1
{
citește b[i]
}
pentru i = 0, n-1
{
c[i] = a[i] + b[i]
}
pentru i = 0, n - 1
{
scrie c[i]
}

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 citesc, în primul rând,
elementele șirului și apoi se definește o variabilă min care va
păstra valoarea elementului minim. Pentru început, variabilei min i
se atribuie primul element al șirului.
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
pentru i = 0, n - 1
{
citește a[i]
}
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.
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
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].
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 (while)
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.
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.
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

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.

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
pentru i = 0, n-1
{
pentru j = 0, m-1
{
citește a[i][j]
}
}
pentru i = 0, n-1
{
pentru j = 0, m-1
{
citește b[i][j]
}
}

pentru i = 0, n-1
{
pentru j = 0, m-1
{
c[i][j] = a[i][j] + b[i][j]
}
}
pentru i = 0, n-1
{
pentru j = 0, m-1
{
scrie c[i][j] }
}

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, fiecare element al matricei produs este
produsul scalar al liniei i din matricea a cu coloana j a matricei b.
Pentru a realiza această operație, 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
Se citește matricea a
Se citește matricea b
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]
}
}
}
Se scrie matricea c

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.
Schema 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ă anterior știm 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ă aceasta 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

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