Sunteți pe pagina 1din 29

Algoritmi și noțiuni de programare structurată.

Procesarea informației în calculator

Unitatea de învățare nr. 1

ALGORITMI (DEFINIȚIE, PROPRIETĂȚI, REPREZENTĂRI, VERIFICAREA


CORECTITUDINII) ȘI NOȚIUNI DE PROGRAMARE STRUCTURATĂ.
PROCESAREA INFORMAŢIEI ÎN CALCULATOR.

Cuprins Pagina

Obiectivele unității de învățare nr. 1 2

1.1 Algoritmi: definiție și proprietăți 2


1.2 Reprezentarea algoritmilor 6

1.3 Programarea structurată – structuri de bază utilizate în elaborarea algoritmilor 15

1.4 Exemple de algoritmi reprezentați în schemă logică 16

1.5 Exemple de algoritmi reprezentați în pseudocod 17

1.6 Procesarea informaţiei în calculator: codificare, prelucrare, decodificare 23

1.7 Codificarea informaţiei: scop şi metode de realizare în funcţie de tipul informaţiei 24

Lucrare de verificare – unitatea de învățare nr. 1 26

Răspunsuri și comentarii la întrebările din testele de autoevaluare 26

Recapitulare 27

Bibliografie – unitatea de învățare nr. 1 29

1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

OBIECTIVELE unității de învățare nr. 1

Principalele obiective ale Unității de învățare nr. 1 sunt:

 Familiarizarea cu conceptele de algoritm, schemă logică și


pseudocod

 Înțelegerea elementelor de bază cu care lucrează un algoritm și a


proprietăților unui algoritm

 Înțelegerea etapelor rezolvării unei probleme pe baza unui


algoritm

 Înțelegerea conceptelor fundamentale utilizate în domeniul


programării structurate

 Înțelegerea modului în care informația este reprezentată și


procesată de către sistemele de calcul

1.1. Algoritmi: definiție și proprietăți

Un algoritm este un concept folosit pentru a desemna o procedură de calcul clară și bine
definită, constând dintr-un set finit de instrucțiuni complet ordonat în timp; procedura pornește
de la o anumită valoare sau un set de valori de intrare și produce într-un timp finit o anumită
valoare sau un set de valori, ca ieșire. Algoritmul exprimă logica completă a soluției de rezolvare
a unei probleme date.

Problemă

Date de intrare Algoritm Date de ieșire


Input Output

Figura 1: Conceptul de algoritm

2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Termenul de "Algoritm" provine din numele matematicianului persan din secolul al IX-
lea Mohammed al-Khowarizmi: Al-Khowarizmi → Algorismus (în latină) → algoritm. Dar,
aceeași prezentare a regulilor precise pentru descrierea proceselor de calcul din aritmetică se
întâlnește și în celebra lucrare a lui Euclid, „Elementele” - un tratat de geometrie, alcătuit din 13
cărți. Într-o anecdotă scrisă la 800 de ani de la moartea lui Euclid se relatează că regele Ptolemeu
I, în încercarea de a studia această lucrare, l-a întrebat pe Euclid dacă nu ar exista o cale mai
ușoară ca să înțeleagă geometria, la care Euclid sever ar fi răspuns: " În geometrie nu există calea
regală !".
În cartea a VII-a din „Elemente” se regăsește de altfel primul și cel mai celebru algoritm
din istorie, Algoritmul lui Euclid pentru determinarea celui mai mare divizor comun a două
numere.

Proprietățile algoritmilor:
1. Exactitate : un algoritm trebuie să fie descris în mod clar și precis; la fiecare pas, operația
care urmează a fi executată este unic determinată, definită și realizabilă, astfel încât să nu existe
incertitudine.
2. Generalitate : se referă la două aspecte:
- gradul de generalitate a problemei rezolvate de acel algoritm: adesea, este mai ușor de a
concepe un algoritm pentru o problemă care este formulată în termeni mai generali;
- setul de date de intrare acceptat: algoritmul trebuie să rezolve fiecare instanță a problemei
respective; algoritmul obține date de ieșire pentru orice date de intrare corespunzătoare
problemei.
Mai mult, un algoritm poate fi reprezentat în mai multe moduri și pot exista mai mulți algoritmi
pentru rezolvarea aceleiași probleme.
3. Finitudine : un algoritm trebuie să conțină un număr finit de pași în execuția sa.
4. Simplitate : un algoritm mai simplu este mai ușor de înțeles și mai ușor de programat.
5. Eficiență : un algoritm trebuie să conțină operațiuni calculabile în mod eficient și trebuie
să ofere răspunsul corect la problema respectivă. Se poate remarca faptul că proprietatea de
"finitudine" este un caz special de "eficiență". Dacă o succesiune de etape nu este finită, atunci
ea nu poate fi nici eficientă.
În plus, algoritmii de rezolvare pentru o anumită problemă pot avea la bază idei diferite și
pot rezolva problema dată în timpi de calcul total diferiți sau pot utiliza mai multă sau mai puțină
memorie suplimentară.

3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Etapele rezolvării unei probleme:


Vom încerca să detaliem procesul de rezolvare a unei probleme pornind de la aserțiunea
matematicianului George Polya: „O mare descoperire rezolvă o mare problemă, dar există un
grăunte de descoperire în soluția oricărei probleme”. În cartea sa de referință: „How to Solve It”,
Polya a conceptualizat acest proces ca o construcție ce cuprinde patru etape principale:

► Etapa 1) Înțelegerea problemei: odată formulat enunțul problemei, clar și precis, trebuie
stabilite:
- datele de intrare și informațiile care trebuie obținute prin rezolvarea problemei;
Datele de intrare ale algoritmului definesc o instanță a problemei respective. Este foarte
important de precizat mulțimea instanțelor pentru care algoritmul va funcționa. Altfel, algoritmul
poate funcționa corect pentru majoritatea instanțelor, dar poate să eșueze pentru anumite date de
intrare (valori limită)
- care sunt condițiile concrete de rezolvare: sunt acestea suficiente sau insuficiente? sunt
redundante? sunt contradictorii?
- există informații care lipsesc, sau, dimpotrivă, nu sunt necesare?

► Etapa 2) Elaborarea unui plan (model) de rezolvare a problemei, stabilirea unei conexiuni
între datele și necunoscutele problemei pentru a dezvolta algoritmul corespunzător de rezolvare,
algoritm descris într-una dintre modalitățile de reprezentare algoritmică.
În acest scop se recomandă:
- identificarea unei probleme conexe, asemănătoare (atunci când este posibil) pentru a putea
vedea dacă se poate aplica aceeași tehnică de rezolvare;
- încercarea de a rezolva un caz special al problemei sau o problemă mai generală sau o parte a
problemei.
- împărțirea problemei în subprobleme mai mici și mai ușor de rezolvat: astfel, trebuie stabilit
printr-un proces de detaliere, de rafinări succesive, modul în care problema de rezolvat este
divizată astfel încât să poată fi rezolvată prin mai multe funcții și care vor fi taskurile executate
de fiecare funcție.
Numărul etapelor de detaliere depinde de natura problemei, dar grupul ISDR [4] definește un
proces general de rafinare de tip ”Top-Down”, cu patru nivele de detaliere:
- Nivelul conceptual sau abstract: se analizează modul de relaționare al datelor și operațiile care
trebuie executate cu datele.

4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

- Nivelul algoritmic sau al structurilor de date: se stabilește modul în care se realizează


operațiile ce trebuie efectuate asupra datelor, ce tipuri și structuri de date sunt necesare: tablouri,
liste, stive, cozi, etc.
- Nivelul implementării: se stabilește modul de reprezentare a structurilor de date, de exemplu
liste statice sau liste dinamice.
- Nivelul aplicație: se stabilesc detaliile de tipul: identificatori pentru variabile și funcții, cerințe
pentru aplicarea diferitelor operații, etc.
Un alt aspect important în această etapă este de a decide între o rezolvare exactă a problemei
(bazată pe un algoritm exact) sau o rezolvare în care se poate obține o valoare suficient de
apropiată de valoarea exactă (bazată pe un algoritm aproximativ). O astfel de decizie apare în
mai multe situații:
- în primul rând, există probleme care pur și simplu nu pot fi rezolvate exact pentru cele mai
multe instanțe; de exemplu, extragerea de rădăcini pătrate, rezolvarea ecuațiilor neliniare,
evaluarea integralelor definite, diferite probleme de optimizare.
- în al doilea rând, algoritmii exacți, disponibili pentru rezolvarea unei probleme pot fi foarte
lenți, din cauza complexității problemei; de exemplu, pentru probleme care implică un număr
foarte mare de opțiuni.
- în al treilea rând, un algoritm de aproximare poate fi o componentă a unui algoritm mai
sofisticat, care rezolvă exact o anumită problemă.

► Etapa 3) Implementarea planului de rezolvare prin codificarea algoritmului rezultat în etapa


anterioară într-un limbaj de programare. Se recomandă în plus și:
- efectuarea oricăror acțiuni sau calcule necesare în acest sens;
- verificarea fiecărui pas al algoritmului, intuitiv sau formal.

► Etapa 4) Testarea programului și corectarea erorilor:


- testarea programului se realizează pe baza mai multor seturi diferite de date de test pentru a
descoperi eventualele erori și greșeli de concepție în program; dacă în timpul testării programului
se constată funcționarea defectuoasă a acestuia, este necesară reluarea ultimelor două sau trei
etape în funcție de natura erorilor;
- analiza corectitudinii soluției în termenii problemei originale: soluția are sens? este plauzibilă?
pentru un algoritm aproximativ, verificarea corectitudinii este mai dificilă și de obicei se rezumă
la a verifica dacă eroarea produsă de algoritm nu depășește o limită predefinită.

5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

- identificarea unei alte metode de găsire a soluției; în cazul în care există mai mulți algoritmi de
rezolvare, trebuie ales algoritmul cel mai eficient din punct de vedere al complexității calculului:
algoritmul cu cel mai redus timp de execuție și cel mai economic spațiu de memorie necesar.

1.2. Reprezentarea algoritmilor

Reprezentarea algoritmilor și limbajele de programare s-au influențat reciproc. Există


astfel diverse modalități de reprezentare a algoritmilor, care pot fi utilizate în orice combinație:
- în limbaj natural – descriere amănunțită prin cuvinte;
- printr-o schemă logică – reprezentare grafică simplă;
- în pseudocod – descriere formală simplificată intermediară între limbajul natural și limbajul de
programare;
- prin convenții grafice de tip diagrame arborescente;
- prin tabele de decizie de tip condiții – acțiuni.

(I) Schema logică - reprezintă grafic secvența de pași implicați în rezolvarea problemei.
Avantajele utilizării schemelor logice:
- se obține o bună vizualizare a structurii algoritmului;
- fiind independentă de limbaj, poate fi înțeleasă de toți programatorii de aplicații;
- permite definirea și testarea unor soluții alternative de rezolvare pentru problema dată;
- permite detectarea și corectarea erorilor logice înainte ca algoritmul să fie implementat într-un
limbaj de programare
Reguli de construire a schemei logice:
- diagrama se construiește de sus în jos (conform fluxului de operații) și de la stânga la dreapta;
- se evită intersectarea liniilor diagramei; se utilizează simbolurile de tip conectori.

Reprezentarea prin schemă logică a unui algoritm utilizează blocuri (operații) de bază
și/sau structuri de control (formate prin gruparea blocurilor de bază).

Blocuri de bază
Blocul de început/sfârșit – orice schemă logică începe cu un bloc de început și se termină cu un
bloc de sfârșit.

6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Blocul de intrare – desemnează preluarea datelor (valorilor variabilelor) de la dispozitivul de


intrare (de exemplu de la tastatură).

Blocul de ieșire – desemnează scrierea rezultatelor (valorilor variabilelor) la dispozitivul de


ieșire (de exemplu pe ecranul monitorului).

Blocul de atribuire – este utilizat pentru reprezentarea prelucrărilor asupra datelor.

Blocul decizional – desemnează evaluarea unei condiții. În funcție de rezultatul evaluării,


continuarea prelucrărilor poate urmări ramura desemnată cu DA (condiția din blocul de decizie
este adevărată) sau cea desemnată cu NU (condiția din blocul de decizie este falsă).

Conectorul logic – este utilizat pentru reunirea ramurilor de execuție ale algoritmului.

Conectorul de pagină – este utilizat atunci când schema logică trebuie continuată pe o altă
pagină. Conectorul conține o literă sau un număr care trebuie să fie identic cu cel de pe pagina
unde se continuă prelucrarea.

7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Structuri de control
Structurile de control sunt grupări de blocuri de bază ce apar frecvent în schemele logice
și pentru care sunt definite instrucțiuni specifice în limbajele de programare.
Structura secvențială (secvența) – grupează de obicei mai multe operații (instrucțiuni)
elementare (inițializări de variabile, prelucrări asupra datelor, tipărire a rezultatelor, etc.).

Structura alternativă (decizia) – permite ramificarea simplă a execuției în funcție de valoarea de


adevăr a condiției. Cele două ramuri se exclud mutual.
Este posibil ca una dintre ramuri să fie vidă (să nu conțină alte blocuri).

Structura repetitivă condiționată anterior (bucla/ciclul cu test inițial) – secvența se execută


repetitiv cât timp condiția este adevărată. Secvența se mai numește în această situație și corpul
buclei (corpul ciclului). Dacă rezultatul testării inițiale a condiției este fals, secvența nu este
executată nici măcar o singură dată.

Obs: Pentru structura repetitivă condiționată anterior, condiția testată pentru repetarea secvenței
se scrie identic în pseudocod și în C++.
8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Pentru ca secvența să nu se repete la infinit, în cadrul acesteia trebuie modificate


variabilele ce sunt folosite în condiția testată pentru repetarea buclei astfel încât la un moment
dat să se poată realiza ieșirea din buclă.
În afară de structurile de control menționate anterior și care permit descrierea oricărui
algoritm, mai există câteva structuri de control derivate din acestea ce sunt folosite uzual și
anume:

Structura repetitivă condiționată posterior (bucla/ciclul cu test final) – secvența (corpul buclei)
se execută repetitiv până când condiția devine adevărată. Spre deosebire de bucla cu test inițial,
în cazul buclei cu test final secvența se execută cel puțin o dată.

Obs: Pentru structura repetitivă condiționată posterior condiția testată pentru ieșirea din
buclă trebuie scrisă negat în C++ față de pseudocod. În pseudocod secvența se repetă până când
condiția devine adevărată, iar în C++ secvența se repetă atâta timp cât condiția este adevărată.
Pentru ca secvența să nu se repete la infinit, în cadrul acesteia trebuie modificate
variabilele ce sunt folosite în condiția testată pentru repetarea buclei astfel încât la un moment
dat să se poată realiza ieșirea din buclă.

Structura repetitivă (bucla/ciclul) cu contor – este derivată din structura repetitivă condiționată
anterior. Secvența se execută repetitiv de un număr prestabilit de ori controlat de valoarea
variabilei contor. Pentru ca repetarea să nu se facă la infinit, este necesară incrementarea
(decrementarea) variabilei contor cu valoarea pas (care trebuie să fie diferită de zero).

9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Structura decizională multiplă – este o structură de control derivată din structura alternativă –
permite ramificarea multiplă a execuției. Dacă nici una dintre condițiile testate nu a fost
îndeplinită, execuția este continuată în <secvența alternativă> dacă aceasta a fost specificată.

Obs: În C++ structura switch este puțin diferită față de celelalte structuri de control.
Valorile val_1 ... val_n sunt de fapt constante, secvențele de instrucțiuni nu sunt încadrate
de acolade și de asemenea pentru fiecare secvență în parte de obicei apare în final instrucțiunea
break;
Instrucțiunea switch evaluează variabila/expresia a și verifică daca aceasta este
echivalentă cu val_1, situație în care se execută secvența de instrucțiuni imediat următoare până
la instrucțiunea break. Când este întâlnită instrucțiunea break programul sare la sfârșitul
structurii switch. Dacă a nu este egală cu val_1, se trece la evaluarea cu val_2, și așa mai departe.
În final, dacă nici una dintre evaluări nu a fost adevărată, se execută instrucțiunile specificate

10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

după default: și apoi se iese din structura switch. Eticheta default: și instrucțiunile scrise după
aceasta sunt opționale.
Dacă instrucțiunea break lipsește, se trece la execuția secvenței pentru val_2 (fără a se
mai verifica egalitatea), apoi la secvența pentru val_3 și așa mai departe (inclusiv secvența
pentru default) până la terminarea structurii sau până la prima instrucțiune break.
Instrucțiunea break poate fi folosită de asemenea în orice altă structură repetitivă pentru a
ieși din buclă fără a mai fi necesară respectarea condiției de ieșire din aceasta.

(II) Limbajul pseudocod


Apariția limbajelor Pascal și C au impus limbajul pseudocod în domeniul reprezentării și
elaborării algoritmilor.
Limbajul pseudocod folosește o scriere similară limbajelor de programare moderne. El
permite atât descrierea instrucțiunilor algoritmului, cât și descrierea exactă a tipului datelor cu
care lucrează algoritmul.

Date Tipul datelor: întreg


real numerice
logic
șir de caractere

Natura datelor: constante


variabile

Organizarea datelor: tablouri unidimensionale-vectori


bidimensionale-matrici
n-dimensionale
liste stive
cozi
ansamble

Operații cu date

- date întregi: +, -, *, /, ^ cu rezultatul întreg sau real


< , >, , =, , ≠ , ≤ , ≥ cu rezultatul de tip logic

11
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

- date reale: aceleași operații ca în cazul datelor întregi, cu rezultatul real în cazul operatorilor
aritmetici și logic în cazul operatorilor relaționali.
- date logice: disjuncția (۷ ) , conjuncția ( ۸) , negația (- )
- șiruri de caractere: concatenarea – rezultat de tip șir de caractere, comparațiile (bazate pe
ordinea lexicografică) – rezultat de tip logic.
- stive, cozi, ansamble: extragerea și respectiv introducerea unui element într-o stivă, coadă sau
ansamblu (x ⇐ A, x ⟹A) precum și verificarea dacă o stivă, coadă sau ansamblu este vid (A =
ø)

Cuvinte cheie: cuvinte din limba engleză care identifică un tip de date sau descriu o instrucțiune.
Instrucțiuni: Din punct de vedere al scrierii instrucțiunilor, o instrucțiune poate ocupa mai multe
rânduri, sau pe un rând pot fi scrise mai multe instrucțiuni. Instrucțiunile vor fi separate, între
ele, folosind caracterul ';'.

Instrucțiuni declarative: integer, real, bool, char, array, stack, queue, heap urmat de un șir de
variabile separate între ele prin virgulă, variabile pentru care indicăm că au tipul respectiv.
Exemple: integer a, b, c; array V(n), A(m,n) ; stack S

Instrucțiuni efective, executabile


1) Instrucțiunea de atribuire
v⟵e
unde v este o variabilă, iar e este o expresie de același tip (integer, real, bool, char)
sau (v1, v2, …., vn) ⟵ (e1, e2, …., en)
care realizează simultan cele n atribuiri.

2) Instrucțiunile de citire/scriere
read a1, a2, …, an
write a1, a2, …, an

3) Instrucțiunea de selecție simplă if-then-else


if p then S1
[else] S2 unde p este un predicat, iar S1 și S2 sunt secvențe de
instrucțiuni.
endif

12
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Se evaluează predicatul p și în cazul în care valoarea este true, se trece la executarea secvenței de
instrucțiuni S1. Dacă valoarea este false se trece la execuția secvenței S2, iar dacă aceasta nu
apare, se trece la execuția instrucțiunii următoare instrucțiunii if.

4) Selecția multiplă
case p1: S1
p2 : S2
...........
pn : Sn
[else] Sn+1
endcase
unde S1, …., Sn sunt secvențe de instrucțiuni, iar p1, …., pn sunt predicate satisfăcând
condițiile:
pi ۸ pj = 0 (∀) i ≠ j p1 ۷ p2 ۷ ….. ۷ pn = 1 dacă nu există ramura else.

Dacă p1 este TRUE, se trece la execuția secvenței S1după care se trece la instrucțiunea
următoare după endcase. Analog pentru p2, ..., pn. Dacă nici un predicat nu a fost adevărat și
există ramura else, se trece la execuția secvenței corespunzătoare, iar dacă nu există ramura else,
se trece direct la instrucțiunea următoare după endcase.

5) Instrucțiunea repetitivă while (cu test inițial)


while p
S
repeat
Secvența de instrucțiuni S se execută repetat atâta timp cât predicatul p este TRUE.

6) Instrucțiunea repetitivă do (cu test final)


do
S
until p
Spre deosebire de instrucțiunea while, instrucțiunea do începe cu executarea secvenței S și nu cu
verificarea predicatului p.

7) Instrucțiunea repetitivă for (cu număr cunoscut de pași)

13
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

for v = e1, e2 [e3]


S
repeat
unde v este o variabilă numerică (contor), iar e1, e2, e3 sunt expresii aritmetice cu e3 ≠ 0. Dacă
e3 lipsește, se consideră egal cu 1. Efectul este executarea secvenței S de n ori.

8) Instrucțiunea exit
exit

determină trecerea la execuția primei instrucțiuni care urmează celui mai interior ciclu do, while,
for, ieșindu-se deci din acel ciclu.

Proceduri
Un program în limbajul algoritmic este o succesiune de una sau mai multe proceduri.
Declararea unei proceduri constă în :

procedure nume [ (listă de parametrii)]


[ declarații
[ secvență de instrucțiuni
end

Lista de parametrii este un șir de variabile despărțite prin virgulă ce permit transmiterea datelor
între proceduri.
O procedură poate apela o altă procedură:

Fie procedura procedure nume [ (p1, …, pn)]


Adresarea ei se face prin call nume [ (a1, …, an)], unde a1, …, an sunt argumente care păstrează
ordinea, tipul și dimensiunile listei parametrilor p1, …, pn.
În cazul unei proceduri, lista de parametri conține atât parametri de intrare, cât și
parametri de ieșire (în urma apelării procedurii, vor stoca rezultatele calculate de instrucțiunile
procedurii).

14
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

1.3. Programarea structurată – structuri de bază utilizate în elaborarea algoritmilor

Scrierea unui cod bine structurat şi organizat presupune utilizarea exclusivă a anumitor
structuri de control (liniară, alternativă şi repetitivă). Structura este unitatea de bază a
programării logice, care defineşte ordinea de realizare a paşilor algoritmului.
Acest principiu de bază al programării structurate este fundamentat de Teorema lui C.
Böhm si T.C. Jacopini, cunoscută sub numele de “Teorema de structură” sau “Teorema
fundamentală a programării structurate”: orice algoritm cu un singur punct de început şi un
singur punct de sfârşit poate fi reprezentat folosind trei tipuri de structuri de control:
structura secvenţială - secvenţa;
structura alternativă – decizia (simplă);
structura repetitivă – ciclul cu test iniţial (cu număr necunoscut de paşi, condiţionată anterior).

Caracteristicile programării structurate:


- fluxul de execuție al programului trebuie să fie cât mai simplu;
- programul ar trebui dezvoltat prin descompunere în module/subrutine/funcții independente –
programare modulară;
- programul conține numai combinații ale structurilor algoritmice fundamentale: secvența,
selecția și repetiția; orice astfel de program poate conține una, două sau toate cele trei tipuri de
structuri.
- fiecare dintre aceste structuri au un singur punct de intrare și un singur punct de ieșire;
- structurile pot fi conectate între ele numai în punctele lor de intrare sau de ieșire.
- orice structură poate fi imbricat în altă structură.
- de asemenea, orice algoritm nestructurat devine echivalent cu un algoritm structurat, prin
adăugarea sau prin eliminarea unor instrucţiuni.

Programarea structurată presupune evitarea:


- instrucțiunii goto;
- instrucțiunilor break sau continue în interiorul ciclărilor;
- mai multe puncte de intrare sau de ieșire în cadrul funcțiilor.
Programarea structurată îmbunătățește lizibilitatea, calitatea și costul de dezvoltare al
programelor, prin simplificarea execuției programului în subrutine care conțin cele trei tipuri de
structuri algoritmice fundamentale: secvența, selecția și repetiția.
Limbajul C/C++ include şi alte structuri de control, în afara celor de bază:
15
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

- selecţia multiplă (dintre mai multe alternative posibile)


- ciclul cu test final (verificat după executarea operaţiilor din ciclu)
- ciclul for (cu număr cunoscut de paşi).

1.4 Exemple de algoritmi reprezentaţi în schemă logică

1. Se citesc numere până la introducerea valorii 0. Aflaţi suma lor.

2. Aflaţi suma numerelor de trei cifre.

3. Se citesc valorile pentru două variabile întregi (a şi b) şi se afişează care variabilă este
mai mare precum şi valoarea acesteia.

16
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

1.5 Exemple de algoritmi reprezentaţi în pseudocod

1. Să se determine aria unei suprafeţe determinate de o linie poligonală închisă P = P1 P2 ....Pn,


unde Pi (Xi, Yi), i = 1...n sunt determinate de coordonatele carteziene (Xi, Yi), i = 1, n.

Obs:
n
1
S
2
 (x y
i 1
i i 1  xi 1 yi ) , unde xn+1 = x1, yn+1 = y1

P9
P10 P7
P6
P12
P8
P11

P13 P5 P4

P14
P2 P3

P1

Soluţie:
read n;
array x[n+1], y[n+1];
17
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

for i = 1, n
read xi , yi
repeat;
xn+1  x1 ; yn+1  y1 ;
s  0;
for i = 1, n
s  s + xi * yi+1 - yi * xi+1
repeat;
s  abs (s/2);
write s;

2. Să se determine valoarea numărului Pi din dezvoltarea în serie:


Pi/4 = 1 – 1/3 + 1/5 – 1/7 +… luându-se în considerare n termeni

Soluţie:
read n;
s  0 ; termen  1;
for i = 1, n
s  s + termen / (2 * i – 1);
termen  - termen
repeat;
pi  4 * s
write pi;

3. Se citeşte de la tastatură un număr natural n . Să se afişeze suma cifrelor acestui număr.

Obs:
a mod b = restul împărţirii întregi a lui a la b
a div b = câtul împărţirii întregi a lui a la b

Soluţie:
read n;
s  0;
18
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

while n  0
s  s + n mod 10;
n  n div 10
repeat
write s;

4. Se citeşte de la tastatură un număr natural n . Să se afişeze numărul răsturnat (citit de la sfârşit


spre început).

Soluţie:
read n;
ninv  0;
while n  0
ninv  ninv*10 + n mod 10;
n  n div 10;
repeat
write ninv;

5. Să se verifice dacă un număr natural n este prim.

Soluţie:
read n; prim  1;
if n = 1  n = 0 then prim  0
else for i = 2, n div 2
if n mod i = 0 then prim  0
endif
repeat;
endif;
if prim = 1 then
write “ Nr. prim”
else
write “Nr. neprim”
endif;
19
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

6. Să se afişeze primele nr numere prime.

Soluţie:
read nr; n  2; j  0; /* j contorizează numărul de numere prime*/
while j < nr
prim  1;
for i = 2, int(sqrt(n))
if n mod i = 0 then
prim  0
endif;
repeat;
if prim = 1 then
write n; j  j+1;
endif;
n  n+1;
repeat;

7. Se citeşte de la tastatură un număr natural n . Să se afişeze descompunerea sa în factori primi


în formatul factor ^ exponent.

Soluţie:
read n;
i  2; /* începând cu i = 2 verificăm dacă i este divizor al lui n*/
while n  1
fm  0; /* în fm contorizăm de câte ori s-a împărţit n la i */
while n mod i = 0
fm  fm + 1; n  n div i
repeat;
if fm  0 then write i, ^, fm
endif;
i  i +1;
repeat;

20
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

8. Să se afişeze primele nr numere perfecte. Un număr se numeşte perfect, dacă este egal cu
suma divizorilor lui (mai puţin el).

Soluţie:
read nr;
n  6; // cel mai mic număr perfect este 6
j  0; // în j contorizăm numărul de numere perfecte
while j < nr
perfect  0;
s  0;
for i = 1, n div 2
if n mod i = 0 then
s  s +i
endif;
repeat;
if s = n then
perfect  1
endif;
if perfect = 1 then
write n;
jj+1
endif
n  n + 1;
repeat;

9. Se citesc de la tastatură două numere reale a şi b. Scrieţi un algoritm care să realizeze


interschimbarea valorilor numerelor:
a) folosind o variabilă auxiliară
b) fără variabile auxiliare

Soluţie:
a) metoda de interschimbare se bazează pe principiul celor trei pahare:
pas 1: Se goleşte primul pahar în paharul auxiliar;
21
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

pas 2: Se goleşte al doilea pahar în primul pahar (rămas gol);


pas 3. Se goleşte paharul auxiliar în al doile pahar (rămas gol).
read a, b
aux a; a b; b aux;
write a, b

b) metoda de interschimbare se bazează pe operaţiile de adunare şi de scădere a celor două


numere:
read a, b
a a-b; b a+b; a b-a;
write a, b

10. Conversii dintr-o bază de numeraţie în altă bază de numeraţie

a) Algoritm de conversie a unui număr scris în baza 10 într-o altă bază b cu b ≤ 9

Soluţie:
read n10, b; // n10 este numărul scris în baza 10
nb 0; // nb este numărul convertit în baza b
p 1;
while (n10 ≠0)
nb  nb +p*(n10 mod b);
p p*10;
n10  n10 div b
repeat
write nb

b) Algoritm de conversie a unui număr din baza b în baza 10

Soluţie:
read nb, b; // nb este numărul scris în baza b
n10 0; // n10 este numărul convertit în baza 10
p 1;
22
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

do
n10  n10 +p*(nb mod b);
p p*b;
nb  nb div 10
until (nb=0)
write n10

1.6 Procesarea informaţiei în calculator: codificare, prelucrare, decodificare

În aplicațiile dezvoltate cu ajutorul sistemelor de calcul, datele colectate din diferite


documente sursă urmează un proces de codificare, prin care are loc o reprezentare simplificată a
acestora, într-o formă ”înțeleasă” de calculator. Deci pentru a putea fi prelucrate cu ajutorul
calculatorului, informaţiile utilizate în viaţa cotidiană (imagini, numere, litere, desene, sunete) şi
instrucţiunile pe care trebuie să le execute procesorul calculatorului trebuie să fie reprezentate
(codificate) într-un anumit format, acceptat de calculator. Transformarea informaţiei, din forma
de reprezentare externă, ușor de înțeles, în forma de reprezentare internă pe care o înţelege
calculatorul, sub formă de cifre binare, se numeşte codificare internă a informaţiei. Codificarea
informaţiei presupune ca fiecărei entităţi informaţionale să i se atribuie o secvenţă unică de cifre
binare.
Ulterior, rezultatele obținute în urma prelucrărilor efectuate de calculator în Unitatea
Centrală de Prelucrare (UCP) vor fi decodificate pentru a fi aduse din format binar într-un format
înțeles de utilizator.
Unitatea elementară de reprezentare a informaţiei în calculator este bit-ul (binary digit -
cifră binară), rezultând din faptul că unitățile de stocare elementare într-un calculator sunt
comutatoarele electronice, fiecare comutator având una dintre cele două stări: on (reprezentată de
obicei de 1), sau off (0). Data este deci termenul utilizat pentru a descrie informația reprezentată
de grupurile de comutatoare on/off.
Chiar dacă datele și informațiile sunt cuvinte adesea folosite alternativ, există o distincție
importantă între ele. Datele reprezintă materia primă pe care o prelucrează calculatorul şi
organizează pentru a produce informații.
Un grup de 8 biți formează un octet sau byte. Deoarece cifrele binare pot fi combinate în
diverse moduri, cu un octet calculatorul poate reprezenta 256 de simboluri sau caractere diferite.

23
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Byte-ul este extrem de important, deoarece există combinații suficiente de 8-biți pentru a
reprezenta toate caracterele de pe o tastatură.
O grupare de 8 biți formează un octet (byte) notat prescurtat cu B. Adesea exprimarea
capacității de stocare pentru sistemele digitale de calcul se face utilizând ca unitate de măsură
octetul sau multiplii acestuia:
1KB = 1 kilo octet = 1024 octeți = 210 octeți
1MB = 1 mega octet = 1024 KB = 220 octeți
1GB = 1 giga octet = 1024 MB = 230 octeți
1TB = 1 tera octet = 1024 GB = 240 octeți, etc.

1.7 Codificarea informaţiei: scop şi metode de realizare în funcţie de tipul informaţiei

Deoarece în calculator datele sunt reprezentate ca cifre binare, este necesar ca orice
formă de comunicare scrisă, cuvinte, numere, imagini, sunete, să fie convertită într-un alt format,
pentru a putea fi stocată și prelucrată. În acest scop sunt utilizate diferite dispozitive de intrare și
dispozitive hardware care realizează o conversie dintr-un format extern într-o reprezentare
internă. De exemplu, sunetul de la un dispozitiv de intrare (microfon) necesită dispozitive
hardware – plăci adaptoare pentru a fi convertit în format binar.
Reprezentarea prin care fiecărei entităţi informaţionale introduse de la tastatură sau de la
orice alt dispozitiv de intrare i se asociază o reprezentare digitală: o secvenţă de cifre binare se
numește codificare.
O reprezentare adecvată a datelor va reflecta și va simplifica modul în care urmează să fie
prelucrate datele. Există astfel diferite standarde utilizate pentru diverse tipuri de date.

Tip de date Standarde de reprezentare


Alfanumeric Unicode, ASCII, EBCDIC
Imagine (bitmap) GIF (graphical interchange format), TIFF
(tagged image file format), PNG (portable
network graphics), JPEG, PCX, BMP
Imagine (obiect) PostScript, SWF (Macromedia Flash), SVG,
JPEG
Sunet WAV, AVI, MP3, MIDI, WMA, MOD, VOC
Video Quicktime, MPEG-2 or -4, RealVideo,
WMV, DivX, Indeo
24
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

În funcţie de natura caracterelor pe care le pot reprezenta, sistemele de codificare se pot


grupa în:
- sisteme de codificare numerice;
- sisteme de codificare alfanumerice.
a. Coduri numerice – prin intermediul cărora se pot reprezenta în memoria calculatorului
datele numerice.
b. Coduri alfanumerice – prin intermediul cărora se pot reprezenta în memoria calculatorului
datele alfanumerice. În practică se utilizează trei sisteme de codificarea a caracterelor alfa-
numerice: ASCII ( American Standard Code for Information Interchange), EBCDIC
(Extended Binary Coded Decimal Interchange Code) şi Unicode.

Test de autoevaluare 1
1. Structura care testează o condiție, execută o instrucțiune în cazul în care
rezultatul este adevărat, iar apoi se testează condiția din nou, poate avea oricare
dintre denumirile următoare cu excepția:
a) iterație b) buclă
c) repetiție d) selecție simplă

2. Care dintre următoarele afirmații nu este adevărată?


a) Programele modulare sunt mai ușor de citit și de înțeles.
b) În cazul în care se utilizează module, se pot ignora regulile programării
structurate.
c) Componentele modulare sunt reutilizabile în alte programe.
d) Mai mulți programatori pot lucra la module diferite în același timp.

3. Explicați în ce constă abordarea structurată în programare

4. Se citeşte de la tastatură un număr natural n. Să se verifice dacă este palindrom,


adică citindu-l de la sfârşit spre început se obţine acelaşi număr.

25
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Lucrare de verificare la Unitatea de învățare nr. 1

1. Descrieți pe scurt proprietățile unui algoritm

2. Fiind dat un interval [a,b] cu a şi b numere naturale citite de la tastatură, a <


b, să se afişeze toate palindroamele din acest interval.

3. Se citeşte de la tastatură un vector cu n componente reale.


Să se calculeze triunghiul de perimetru maxim ce se poate forma din aceste
numere, iar în caz că nu se poate forma nici un triunghi, să se afişeze un mesaj
corespunzător.

4. Se citeşte de la tastatură un vector cu n componente întregi v1, v2, …., vn. Să


se reţină într-un vector U toate numerele, fiecare valoare o singură dată (deci
U are numai componente distincte).

5. Fiind dată matricea A(nxm) şi matricea B (mxp), să se calculeze în matricea


C(nxp) produsul celor două matrici.

6. Fie ecuaţia de gradul al doilea cu coeficienţi reali ax2+bx+c=0 cu a≠0, a, b şi


c fiind citite de la tastatură. Scrieţi un algoritm care, fără a calcula rădăcinile
ecuaţiei, să determine natura şi semnul acestora.

Răspunsuri și comentarii la întrebările din testele de autoevaluare

1. d)

2. b)

26
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

3. Abordarea structurată este fundamentată de “Teorema de structură” sau


“Teorema fundamentală a programării structurate”: orice algoritm cu un singur
punct de început şi un singur punct de sfârşit poate fi reprezentat folosind trei
tipuri de structuri de control:
structura secvenţială - secvenţa;
structura alternativă – decizia (simplă);structura repetitivă – ciclul cu test iniţial
(cu număr necunoscut de paşi, condiţionată anterior).

4.
read n;
nrn; // în nr salvăm numărul iniţial n
n_inv0; //se iniţializează inversul numărului cu valoarea 0
while nr ≠ 0
n_inv n_inv *10 +nr mod 10;
nrnr div 10
repeat
if n_inv = n then write “este palindrom”
else write “nu este palindrom”
endif

Recapitulare
Un algoritm desemnează o procedură de calcul clară și bine definită,
constând dintr-un set finit de instrucțiuni complet ordonat în timp; procedura
pornește de la o anumită valoare sau un set de valori de intrare și produce într-
un timp finit o anumită valoare sau un set de valori, ca ieșire.
Un algoritm se caracterizează prin:
1. Exactitate
27
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

2. Generalitate
3. Finitudine
4. Simplitate
5. Eficiență
Procesul de rezolvare a unei probleme cuprinde patru etape principale:
Etapa 1) Înțelegerea problemei:
Etapa 2) Elaborarea unui plan (model) de rezolvare a
problemei
Etapa 3) Implementarea planului de rezolvare
Etapa 4) Testarea programului și corectarea erorilor
Cele mai uzuale modalități de reprezentare a algoritmilor sunt:
- schema logică: reprezintă grafic secvența de pași implicați în rezolvarea
problemei
- limbajul pseudocod folosește o scriere similară limbajelor de programare
moderne
“Teorema de structură” sau “Teorema fundamentală a programării
structurate”: orice algoritm cu un singur punct de început şi un singur punct de
sfârşit poate fi reprezentat folosind trei tipuri de structuri de control:
structura secvenţială - secvenţa;
structura alternativă – decizia (simplă);
structura repetitivă – ciclul cu test iniţial (cu număr necunoscut de paşi,
condiţionată anterior).
Pentru a putea fi prelucrate cu ajutorul calculatorului, informaţiile
utilizate în viaţa cotidiană (imagini, numere, litere, desene, sunete) şi
instrucţiunile pe care trebuie să le execute procesorul calculatorului trebuie să
fie reprezentate (codificate) într-un anumit format, acceptat de calculator.
Transformarea informaţiei, din forma de reprezentare externă, ușor de înțeles,
în forma de reprezentare internă pe care o înţelege calculatorul, sub formă de
cifre binare, se numeşte codificare internă a informaţiei.
Există diferite standarde utilizate pentru diverse tipuri de date:
alfanumerice, sunete, video, imagini.

28
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Algoritmi și noțiuni de programare structurată. Procesarea informației în calculator

Bibliografie:

1. Dinu, S., Pomazan, C. ”Programarea Caclulatoarelor”, Ed. Nautica, 2013.


2. Farrell, J. ”Programming Logicand Design”, Ed. Cengage Learning, 2015.
3. Hurson, A.R., Goudarzi, M. ”Advances in Computers”, Ed. Elsevier, 2016.
4. ISRD Group ”Data Structures Using C”, Ed. Mc Graw-Hill, 2007.
5. Polya, G. „How to Solve It”, Ed. Princeton University Press, 1973.
6. Englander, I. ”The Architecture Of Computer Hardware, System Software,
And Networking”, Ed. Wiley, 2009.

29
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii

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