Sunteți pe pagina 1din 11

Limbaje de Programare - Curs

I.4 Etapele realizării unui program:


Realizarea unui program pentru o anumită aplicaţie presupune implicarea mai multor
etape. Aceste etape sunt independente de limbajul de programare utilizat şi implică existenţă
câtorva restricţii cu privire la computerul utilizat.
Etapele realizării unui program sunt următoarele:

1. Studierea detaliată a cerinţelor aplicaţiei. Este foarte important ca cerinţele impuse de


aplicaţie să fie foarte bine explicitate. Adică înainte de a trece la realizarea unui program
pentru o anumită aplicaţie trebuie ca cea aplicaţie sa fie foarte bine analizată şi cerinţele
pe care aceasta le impune trebuie să fie complete şi consistente. De exemplu o cerinţa de
genul “scrie un program care sa rezolve ecuaţiile” este evident că este incompletă şi se
impun întrebări de genul “ce tip de ecuaţii”, “câte ecuaţii”, “care este precizia”, etc.

2. Analiza problemei şi determinarea rezolvării acesteia. Adică în această etapă se decide


asupra unei metode care poate să rezolve problema. O astfel de metodă este des denumită
ALGORITM.

3. Traducerea algoritmului realizat la etapa anterioară într-un limbaj de programare evoluat


corespunzător. Forma scrisă a acestui program este denumită program sursă (source
program sau source code). În această etapă programul trebuie citit şi verificat pentru a i se
stabili corectitudinea. Aceasta se face prin introducerea unui set de valori şi verificarea
dacă programul furnizează valorile corespunzătoare corecte. O dată verificat programul
este introdus în computer prin intermediul unui Editor.

4. Compilarea programului în limbaj maşină. Astfel programul obţinut în limbaj maşină se


numeşte object code. În această etapă compilerul poate determina erori de sintaxă ale
programului. O eroare de sintaxă este o greşeală în gramatica limbajului. de exemplu C++
necesită ca fiecare linie să se termine cu ;. Dacă se uită plasarea ; atunci compilerul va
semnala eroarea de sintaxă. Astfel se repetă compilarea până la eliminarea tuturor erorilor
de sintaxă.

5. Programul obţinut în urma compilării, object code, este apoi corelat (linked) cu o serie de
biblioteci de funcţii (function libraries) care sunt furnizate de sistem. Toate acestea se
petrec cu ajutorul unui program numit linker iar apoi programul linked object code este
încărcat în memoria computerului de către un program numit loader.

6. Rularea programului compilat, linked şi încărcat cu un set de date pentru testare. Astfel se
vor pune în evidenţă erorile de logică ale programului. Erorile de logică sunt erori care
sunt produse de metoda de rezolvare a problemei. Astfel deşi programul este scris corect
din punct de vedere al sintaxei acesta poate executa ceva ce este incorect în contextul
aplicaţiei. Poate fi ceva simplu, de exemplu realizarea unei operaţii de scădere în loc de
adunare. O formă particulară a erorilor de logică este apariţia erorilor de rulare (run-time
error). O eroare de rulare va produce o oprire a programului în timpul execuţiei pentru că
nu anumite instrucţiuni nu pot fi realizate. De exemplu o împărţire la zero sau încercarea
de accesare a datelor dintr-un fişier inexistent.
Astfel se impune ca în această etapă programul să fie reverificat şi apoi erorile să fie
recorectate prin intermediul Editorului ceea ce impune ca etapele 3,4, şi 5 să fie repetate până
la obţinerea rezultatelor satisfăcătoare.

1
Limbaje de Programare - Curs
7. Programul poate fi pus în execuţie pentru rezolvarea problemei pentru care a fost
conceput. Este posibil ca pe parcursul execuţiei sale să se mai depisteze anumite erori de
logică. Astfel se impune reformularea algoritmului şi reluarea etapelor de realizarea a
programului.

I.5 Algoritmi de calcul


I.5.1 Definirea algoritmului:
Prin algoritm se înţelege un ansamblu de reguli (instrucţiuni) de prelucrare, împreună cu
ordinea în care se succed în vederea soluţionării unui tip de probleme.

Algoritmul este o formulă sau un set de paşi pentru rezolvarea unei probleme particulare.
Pentru ca un set de reguli să formeze un algoritm este necesar ca acestea să nu fie ambigue şi
să aibă un punct de oprire bine precizat. Algoritmii pot fi exprimaţi în orice limbă, de la
limbajele naturale (engleză, română, etc) la limbajele de programare (C++, etc).
Algoritmii sunt folosiţi peste tot în viaţa de zi cu zi. Astfel reţeta de realizare a unei
prăjituri este un algoritm. Majoritatea programelor sunt formate din algoritmi. cea mai
importantă provocare din programare este aceea de a inventa un algoritm elegant care să fie
simplu şi să necesite un număr minim de paşi.

I.5.2 Exemplul 1:
Să se precizeze algoritmul de rezolvare a ecuaţiei de gradul I AX +B = 0, valorile
coeficienţilor A şi B fiind cunoscute.

R0. Declanşează procesul de rezolvare;


urmează regula R1

R1 Precizează valorile concrete ale coeficienţilor A şi B;


urmează regula R2.

R2 Dacă A≠ 0
atunci
urmează regula R3
altfel
urmează regula R6.
R3 Calculează valoarea expresiei –B/A şi
2
Limbaje de Programare - Curs
atribuie rezultatul lui X;
urmează regula R4.

R4 Afişează rezultatul (valoarea lui X);


urmează regula R5.

R5 Opreşte procesul de rezolvare.

R6 Dacă B=0

atunci
afişează mesajul “ecuaţie nedeterminată”
urmează regula R5
altfel
afişează mesajul “ecuaţie imposibilă”
urmează regula R5.

După cum se observă regulile (instrucţiunile) algoritmilor au fost notate cu R0, …R6.
Fiecare regulă precizează operaţia ce îi este proprie precum şi regula care îi urmează.

I.5.3 Exemplul 2:
Să se precizeze algoritmul pentru calculul sumei primilor 50 de termeni ai şirului: 1, 4, 7,
10, 13, 16, …

Înainte de a trece la rezolvare vom adopta următoarele notaţii:


 T pentru valoarea unui termen al şirului;
 I pentru rangul unui termen al şirului;
 S pentru suma primilor 50 de termeni

I0 Start
I1 Atribuie lui S valoarea 0
I2 Atribuie lui T valoarea 1
I3 Atribuie lui I valoarea 1
I4 Dacă I>50
atunci
urmează instrucţiunea I8
altfel
urmează instrucţiunea I5
I5 Adună T la S
I6 Adună 3 la T
I7 Adună 1 la I
urmează instrucţiunea I4
I8 Afişează valoarea lui S
I9 Stop

În cazul exemplului 2 regulile (instrucţiunile) s-au notat cu I0, …I9.


În cele două exemple apar unele elemente ca 0, 1, 3, 50 ale căror valori nu se modifică în
cursul execuţiei şi care de regulă se numesc constante, iar alte elemente ca A, B, T, S, I ce pot
lua diverse valori în cursul execuţiei şi care de obicei se numesc variabile. Deoarece
prelucrarea datelor nu presupune numai lucrul cu cifre, noţiunea de constantă va fi utilizată
într-o accepţiune mai largă. De exemplu dacă se doreşte memorarea (în calculator) a numelui
unei persoane (POPESCU) se va rezerva în acest scop o zonă de memorie în care se va
introduce şirul de caractere POPESCU. Dacă zona de memorie o identificăm prin variabila
3
Limbaje de Programare - Curs
NUME atunci POPESCU va constitui valoarea acestei variabile. Evident că în acest caz este
vorba de o valoare nenumerică. Pentru a face deosebirea între numele de variabile şi
constantele numerice, acestea din urmă se scriu între apostrofuri.
Constantele şi variabilele reprezintă datele asupra cărora operează algoritmii. Variabilele
pot fi interpretate ca nume de zone de memorie iar valorile atribuite lor în timpul execuţiei
algoritmului trebuie interpretate ca fiind conţinutul acestor zone.
Pentru rezolvarea oricărei probleme, utilizatorul va furniza algoritmului o serie de
elemente numite date de intrare sau date iniţiale iar algoritmul va furniza utilizatorului soluţia
problemei sub forma unor rezultate parţiale şi/ rezultate finale.
Se constată că există posibilitatea ca unele reguli să execute de mai multe ori până la
obţinerea rezultatului final. Se spune în acest caz că algoritmul conţine un ciclu (ex. regulile
I4, I5, I6, I7).
Ciclul este caracterizat de două elemente constitutive:
 corpul ciclului (grupul de instrucţiuni care se execută în mod repetat);
 condiţia de ieşire din ciclu;
Există două categorii de cicluri:
 cicluri cu număr necunoscut de paşi (la care numărul de reluări ale corpului ciclului nu
poate fi cunoscut din înainte);
 cicluri cu număr cunoscut de paşi (la care numărul de reluări ale corpului ciclului poate fi
cunoscut din înainte)

Fiind date valoarea iniţială VI, valoarea finală VF şi pasul variabilei de ciclare P, se poate
determina numărul de execuţii ale corpului ciclului N, utilizând formula:
VF − VI 
N =  + 1
 P
unde [X] reprezintă partea întreagă a numărului X.

Instrucţiunile unui algoritm pot fi clasificate în două mari categorii:


 instrucţiuni de tip prelucrare prin care se realizează iniţializarea, atribuirea, calculul sau
afişarea unei valori şi care transmit controlul procesului de rezolvare cel mult unei reguli;
 instrucţiuni de tip predicat care presupun efectuarea unui test asupra unei variabile, sau
care conţin o condiţie, în aşa fel încât starea momentană a datelor face ca controlul să se
transmită către una şi numai una din instrucţiunile ce pot primi controlul.

I.5.4 Caracteristicile unui algoritm


Definibilitate: algoritmul este bine definit, fiecare regulă este bine precizată şi nu conduce
la ambiguităţi, succesiunea instrucţiunilor sale este bine stabilită.
Realizabilitate: (efectivitate) există posibilitatea efectuării operaţiilor prevăzute în
instrucţiunile algoritmului.
Finititudine: algoritmul conduce la rezultate după un număr finit de execuţii ale
instrucţiunilor sale.
Generalitate: algoritmul se poate utiliza la rezolvarea unei clase întregi de probleme
aplicându-se datelor iniţiale proprii fiecărei probleme în parte (date de intrare) şi furnizând
rezultatul (soluţia) problemei concrete (date de ieşire).
Automatism: algoritmul poate fi aplicat fără ca instrucţiunile sale să ceară un efort de
gândire deosebit, utilizatorul putând executa în mod mecanic operaţiile simple indicate.

I.5.5 Operaţii utilizate în algoritmi


Într-un algoritm fiecare regulă trebuie să precizeze foarte clar operaţiile ce se execută
asupra datelor, lucru nu tocmai simplu de realizat în contextul limbajului natural. De aceea

4
Limbaje de Programare - Curs
pentru operaţiile ce pot să apară în descrierea unui algoritm au fost introduse şi consacrate
notaţii simple, care să nu genereze ambiguităţi. Aceste notaţii se vor prezenta în continuare.

Operaţii de calcul

Prin operaţii de calcul se înţeleg operaţiile elementare de adunare, scădere, înmulţire,


împărţire şi ridicare la putere.
Alte operaţii algebrice (extragerea rădăcinii, logaritmarea, etc) sunt considerate
neelementare şi ele pot fi executate numai prin reducere la operaţii elementare.
Reprezentarea operaţiilor în cadrul unui algoritm se poate face fie prin simbolurile consacrate
în aritmetică fie prin simbolurile consacrate în limbajele de programare:
+ adunare
- scădere
* inmulţire
/ pentru împărţire
** pentru ridicare la putere
Aceste operaţii intervin în cadrul expresiilor. Expresia este o succesiune de variabile şi
constante legate între ele prin semne de operaţii şi eventual paranteze, după reguli bine
definite.
Într-un algoritm o expresie apare în cadrul unei operaţii de atribuire.

Operaţii de atribuire
Printr-o asemenea operaţie se atribuie o valoare unei variabile, valoare ce poate fi a unei
constante, a unei alte variabile sau a unei expresii.

Operaţii de test
Scopul acestor operaţii este de a verifica relaţiile existente între datele asupra cărora
operează algoritmul pentru a decide transmiterea controlului execuţiei. Aceste operaţii sunt
cunoscute deja din algebră şi se reprezintă prin semnele: <, >, =, ≠, ≤, ≥.
În urma executării unei operaţii de test rezultatul obţinut este una din aşa numitele valori
logice: adevărat sau fals.

Operaţii de intrare/ieşire
Aceste operaţii au o semnificaţie bine definită în cadrul prelucrării automate a datelor şi se
referă la introducerea datelor iniţiale, respectiv furnizarea rezultatelor.
Operaţia de intrare se mai numeşte şi operaţie de citire şi reprezintă practic operaţia de
atribuire a unor valori din afara algoritmului, înregistrate pe diferite suporturi de stocare a
datelor, unor variabile utilizate de acesta.
Operaţia de ieşire se mai numeşte şi operaţia de scriere sau operaţia de afişare şi din punct
de vedere practic constă în furnizarea de la algoritmi către utilizator a valorilor unor variabile,
valori ce constituie rezultate şi care pot fi scrise pe diferite suporturi de stocare a datelor.

5
Limbaje de Programare - Curs
I.5.6. Scheme logice

Descrierea algoritmilor într-un limbaj natural prezintă serie de inconveniente care se


reflectă negativ asupra caracteristicilor acestora. De aceea a fost necesară introducerea unor
limbaje pentru descrierea algoritmilor, care să permită o prezentare simplă, într-o formă
apropiată de limbajul natural, dar în acelaşi timp având o structură apropriată de cea a
limbajelor de programare.
Schemele logice constituie un asemenea limbaj de descriere a algoritmilor, uşor de
învăţat, uşor de transpus într-un limbaj de programare.
În continuare vor fi prezentate simbolurile şi structurile elementare care stau la baza
elaborării schemelor logice.

I.5.6.1. Simboluri

Simbolurile utilizate sunt de fapt figuri geometrice compuse din arce (săgeţi) şi
noduri. Un nod se reprezintă printr-o figură geometrică simplă (dreptunghi, romb, etc). În cele
ce urmează vor fi prezentate patru tipuri de simboluri.

A. Simboluri pentru prelucrare

În figura 1 este reprezentat simbolul pentru o

f instrucţiune de prelucrare. S-a utilizat simbolul f pentru


f
reprezentarea funcţiei care operează modificarea asupra
datelor ce intră în acest nod şi care poate fi o operaţie
Figura 1 elementară sau o operaţie complexă.
f
Printr-un astfel de simbol se reprezintă regulile de tip prelucrare. În practică sunt
f
folosite următoarele variante ale acestui simbol:

.
Figura 2 Figura 3
În figura 2 este prezentat simbolul utilizat pentru operaţiile de intrare/ieşire. În figura 3
este prezentat simbolul utilizat pentru reprezentarea unor prelucrări complexe care urmează să
fie detaliate ulterior.
P
B. Simboluri pentru predicat
În figura 4 este reprezentat simbolul pentru o
P P
instrucţiune predicat. S-a utilizat simbolul P pentru
reprezentarea unei condiţii, unui test, sau o expresie
P booleană. În funcţie de valorile datelor, când se ajunge la
acest nod, p poate lua valoarea adevărat sau fals,
alegându-se o ieşire sau cealaltă, conform unei convenţii
făcute anterior. Prin acest simbol se reprezintă regulile de
Figura 4 tip predicat.

6
P
Limbaje de Programare - Curs
C. Simboluri de regrupare
Acest simbol nu joacă nici un rol în prelucrarea efectivă
a datelor. El permite regruparea a două ieşiri într-o
singură intrare în modul următor, precum şi etichetarea
acestui nod prin înscrierea în cerculeţ a unui cod de
identificare.

Figura 5

D. Simboluri de tip terminal


Aceste două simboluri nu au nici un rol în prelucrarea
efectivă a datelor ele fiind utilizate numai ca semnificaţie
a începerii respectiv terminării unor prelucrări.
f

Figura 6

I.5.6.2 Reprezentarea algoritmilor prin scheme logice

Reprezentarea algoritmilor prin scheme logice reprezintă una din cele mai utilizate
tehnici pentru exprimarea clară şi completă a modului de rezolvare a unei probleme.
Prin schemă logică se înţelege forma grafică de reprezentare a unui algoritm utilizând
simbolurile prezentate anterior.
P Pentru a obţine schema logică a unui algoritm se procedează astfel:
 se înlocuiesc regulile algoritmului prin simboluri adecvate reprezentând în noduri
operaţiile ce trebuie executate.
 se unesc simbolurile în sensul indicat de succesiunea regulilor algoritmului

Pentru exemplificare în continuare se vor prezenta schemele logice ale algoritmilor


celor două exemple prezentate la cursul anterior.
 Să se precizeze algoritmul de rezolvare a ecuaţiei de gradul I AX +B = 0, valorile
coeficienţilor A şi B fiind cunoscute. (Figura 7);
 Să se precizeze algoritmul pentru calculul sumei primilor 50 de termeni ai şirului: 1, 4, 7,
10, 13, 16, … (Figura 8)
Notaţii:
 T pentru valoarea unui termen al şirului;
 I pentru rangul unui termen al şirului;
 S pentru suma primilor 50 de termeni.

7
Limbaje de Programare - Curs
START START

0S
CITESTE
A, B 1T

DA NU 1I
A≠0
NU DA
B=0 I=I+1
X=-B/A
T=T+3
SCRIE: SCRIE: SCRIE:
X ECUATIE ECUATIE
IMPOSIBILA NEDETERM S=S+T
NU
I>50

DA

S
STOP

STOP
Figura 7 Figura 8

A. Scheme logice normalizate

O schemă logică se numeşte normalizată dacă îndeplineşte următoarele reguli:


 Are un singur arc de intrare (bloc terminal de început) şi un singur arc de ieşire (bloc
terminal de sfârşit);
 Există un traseu de la intrare către orice nod şi de la orice nod către ieşire.

Schemele logice normalizate prezintă interes prin faptul că pot fi înlocuite în întregime
prin noduri de tip prelucrare. Aceasta şi pentru că într-o accepţiune mai largă nodurile de tip
prelucrare pot prezenta un anumit stadiu de analiză a problemei, de prelucrări foarte complexe
ce pot fi detaliate ulterior. Uneori o asemenea schemă logică se mai numeşte şi schemă
funcţională sau program normalizat.

Figura 9
Scheme logice nenormalizate

S
Limbaje de Programare - Curs

Figura 10
Schemă logică normalizată

B. Structuri de bază

Unele structuri întâlnite în schemele logice normalizate se remarcă prin generalitatea


funcţionării lor. Este vorba de acele structuri care se referă la prelucrări în serie, alternative şi
repetitive. În continuare se vor prezenta tipurile de structuri de bază pentru fiecare
precizându-se notaţia şi reprezentarea lor sub formă de schemă logică normalizată.

a. Structuri de tip liniar.


Se referă la înlănţuirea (tratarea succesivă) a două
prelucrări g şi h care pot fi instrucţiuni simple sau orice
prelucrare padmisă, conform cu cele prezentatep până la
g acest moment, precum şi orice parte de schemă logică,
dacă această parte are ea însăşi o structură se schemă
g
normalizată. h g
h

Figura 11
g1 p1 g1
b. Structuri de tip alternativ IF-THEN-ELSE
p g2
p2
În această structură p este un predicat iar g şig2h sunt două
prelucrări. În funcţie de variabilele datelor controlul va fi
p transmis către
p una din instrucţiunile g şi h.
gn
Cu convenţia că g se execută în cazul în caregn predicatul ia
g pn
valoarea “adevărat”, iar h se execută în cazul în care p ia
g h g structură IF-THEN-ELSE (p, g,
valoarea “fals”, această
h h) admite următoarea exprimare: g “DACĂ p, ATUNCI
execută g, ALTFEL execută h”.

Figura 12
g1 p1 g1

p g2
Structurile de tip alternativp2admit douăg2
variante:

gn
pn gn 9

g
Limbaje de Programare - Curs
 Tipul pseudo-alternativ: este o structură de tip alternativ
în care prelucrarea h este vidă. Se citeşte: “DACĂ p,
ATUNCI execută g”.
p p
g
g h g
h

p p
g
Figura 13
g1 g h p1 g1 g
h
 Tipul multialternativ. Reprezintă o generalizarea tipului alternativ propriu zis, în care
p şi o regrupare
apare g2automată a ieşirilor.
p2 g2
g1 p1 g1
gn
p g2 pn gn
p2 g2

gn g
pn gn

g
Figura 14

c. Structuri de tip repetitiv WHILE-DO


În această structură p reprezintă un predicat
iar g o prelucrare. Această structură se
g 1 numeşte ciclu, şi admite exprimarea:
“CÂT TIMP p este adevărat, EXECUTĂ g”
0
p
g 1
Figura 15
0 0
p
Trebuie remarcat că dacă p este de la început fals g nu se execută nici măcar o dată.
1
Tipul repetitiv admitegla rândul său două
p variante:

 Structura DO-UNTIL: unde g se 0


execută cel puţin o dată. Admite
i=VI
exprimarea “EXCUTĂ g PÂNĂ 1
g p
CÂND p”.
i=i+VP Figura 16

g i=VI

i>VF
0
i=i+VP
1 10

g
0
1
g p
Limbaje de Programare - Curs

 Structura DO-FOR: este o variantă a structurii


WHILE-DO în care predicatul p nu dă numai
i=VI
condiţia de ieşire din ciclu, dar precizează şi
numărul de execuţii ale corpului ciclului. Acest
control se realizează cu variabila de control (aici
notată cu I) căreia I se precizează valoarea iniţială i=i+VP
VI, valoarea finală VF şi pasul VP. Variabila de
control poate fi utilizată în calculele din prelucrarea g
g dacă prin aceasta nu I se modifică valoarea.
Prelucrarea g se mai notează în această variantă şi i>VF
prin g(I), pentru a sugera faptul că execuţia lui g se 0
face sub controlul variabilei I. Din acelaşi motiv se
obişnuieşte ca predicatul să se noteze cu p(I). 1

Figura 17

11