Sunteți pe pagina 1din 11

Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 2

Programarea calculatoarelor și limbaje de programare – Curs 2

….II. Algoritmi. Metode de descriere a algoritmilor


…. II.1. Limbajul algoritmic (continuare curs 1) .………......................1
(instrucțiuni de salt; subprograme; variabile globale și variabile locale;
comentarii)
II.2. Scheme logice……………………………………………………..7

Limbajul algoritmic – instrucțiuni de salt

Deși structurile de control fundamentale sunt suficiente pentru reprezentarea


algoritmilor, am prezentat și alte instrucțiuni (cum ar fi selecția, ciclul cu test final, etc.)
deoarece sunt mai convenabile în anumite situații. Următoarele trei instrucțiuni pe care
le prezentăm reprezintă o abatere de la programarea structurată.
➢ Instrucțiunea de ieșire are forma
ieșire
Efectul acestei comenzi este terminarea forțată a unui ciclu (mai precis trecerea la
executarea primei instrucțiuni care urmează celui mai interior ciclu care o conține).
➢ Instrucțiunea goto permite transferul explicit al execuției la o instrucțiune
care are o anumită etichetă. Forma este
goto etichetă

Limbajul algoritmic – subprograme

Până în acest moment am înțeles prin program o secvență de instrucțiuni,


terminată cu sfârșit și în care declarările preced instrucțiunile efective. Forma generală
este următoarea: un program în limbajul algoritmic este format dintr-un program
principal urmat eventual de mai multe subprograme. Programul principal are forma
descrisă anterior, cu acceptarea drept instrucțiuni și a apelurilor de subprograme (care
vor fi prezentate în continuare). În principal, necesitatea subprogramelor se datorează

1
Mădălina Roxana. Buneci

faptului că de multe ori algoritmul prevede executarea acelorași instrucțiuni pentru


date diferite. Grupul de instrucțiuni care se repetă poate constitui o unitate distinctă
căreia i se dă un nume și un set de parametri. Ori de câte ori va fi necesară execuția
acestui grup de instrucțiuni se specifică numele și parametrii care actualizează grupul
de instrucțiuni (astfel se scurtează dimensiunea și crește claritate programului). Grupul
de instrucțiuni se numește subprogram. Pentru claritate să considerăm un exemplu. Să
presupunem că se dă un vector cu n componente întregi, x = (x1, …, xk, xk+1,…, xn), o
valoare întreagă k din mulțimea {2,3,…,n-1}, și se cere să se scrie un program care,
fără a utiliza un vector suplimentar, să transforme vectorul dat în următorul: (xk+1,…,xn,
x1,…, xk). O metodă simplă și eficientă constă în a efectua succesiv următoarele
operații:
* se inversează ordinea elementelor din vectorul (x1, …, xk)
* se inversează ordinea elementelor din vectorul (xk+1, …, xn)
* se inversează ordinea elementelor din întreg vectorul
Inversarea ordinii elementelor unui vector poate fi descrisă cu ajutorul unui
subprogram.
Subprogramele sunt de două tipuri: proceduri și funcții.

• Procedura specifică secvențe de instrucțiuni și evidențiază


parametrii. Forma generală este:
procedura nume (lista de parametri formali) este
instrucțiuni declarative și instrucțiuni efective
sfârșit procedură
Parametrii care apar în scrierea unei proceduri se numesc
parametrii formali, ei având un rol descriptiv (un parametru formal
este o variabilă al cărei nume este cunoscut, dar al cărei conținut nu
este precizat decât în momentul execuției). În cadrul listei
parametrii formali sunt separați prin virgulă și precedați de tipul lor.
Numele procedurii (nume) este o succesiune de litere cifre și _ ce
începe cu literă și care identifică procedura. Apelul unei proceduri
se face cu comanda:

2
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 2

nume (listă parametrii actuali)


parametrii actuali fiind expresii despărțite între ele prin virgulă în
cadrul listei. În momentul execuției parametrii actuali substituie
parametrii formali.

• Funcția: Atunci când procedura calculează o singură valoare se


poate utiliza un tip particular de procedură numită funcție. Forma
generală este
tip rezultat funcție nume (lista de parametri formali) este
instrucțiuni declarative și instrucțiuni efective
sfârșit funcție
Cel puțin una din instrucțiunile din secvența (din corpul funcției) este de forma:
returnează expresie
Valoarea expresiei reprezintă rezultatul calculat de funcție. Apelul unei funcții este de
forma:
nume (listă parametrii actuali)
și poate fi utilizat într-o expresiei ca un operand.
Execuția unui program începe cu execuția instrucțiunilor programului principal.
În momentul în care se ajunge la o instrucțiune de apel al unui subprogram, se
efectuează următoarele acțiuni:
 se stabilește corespondența între argumente și parametrii
 se execută instrucțiunile subprogramului, până când se ajunge la
sfârșit procedură/sfârșit funcție sau (în cazul unei funcții) la o
instrucțiune returnează, caz în care valoarea expresiei care urmează
după instrucțiunea returnează va fi utilizată pentru evaluarea
expresiei în care apare funcția ca operand. Efectul acestor
instrucțiuni (sfârșit procedură/sfârșit funcție și returnează) este
întoarcerea în unitatea de program în care a avut loc apelul, și anume
la instrucțiunea ce urmează imediat acestui apel (precizăm că un
subprogram poate apela la rândul său alt subprogram). Executarea

3
Mădălina Roxana. Buneci

unei instrucțiuni sfârșit în interiorul unui subprogram determină


terminarea execuției întregului program.
Un apel de subprogram este corect dacă între parametrii actuali și cei formali există o
corespondență atât ca număr, cât și ca tip și organizare. Există mai multe tehnici de
transmitere a parametrilor:
 transmiterea prin valoarea constă în recopierea valorii de transmis
într-o zonă de memorie cunoscută de subprogram. În acest fel,
subprogramele acționează asupra unei copii a parametrilor, orice
modificare a parametrului nu este posibilă decât în interiorul
subprogramului, iar la revenire în unitatea de program apelantă
parametrul regăsește valoarea sa inițială, ceea ce permite o anumită
protecție a parametrilor.
 transmiterea prin referință constă în a transmite către subprogram
adresele parametrilor (dacă parametrul actual este o expresie, atunci
ea este evaluată, după care valoarea rezultată este înscrisă într-o
locație liberă de memorie, locație a cărei adresă este transmisă).
Subprogramul lucrează deci efectiv asupra datelor unității de
program apelantă, deci orice modificare a valorii parametrului în
interiorul subprogramului este reflectată la revenire în unitatea de
program apelantă.
Convenim că transmiterea parametrilor are loc doar prin referință. De asemenea
mai convenim că schimbul de informații între unitățile de program se face doar prin
corespondența parametrii formali  parametrii actuali, ce are loc la apelarea
subprogramelor. Astfel dacă o unitate de program P apelează un subprogram S și în
ambele apare o variabilă v, variabilă ce nu apare în lista de parametrii actuali a lui S,
atunci este vorba despre variabile distincte (ocupând locații de memorie diferite).
Revenind la exemplul considerat anterior, putem scrie o procedură care
inversează ordinea într-un subșir xp,…, xm din cadrul unui vector x cu n componente:
invers(x,p,m). Programul care rezolvă problema este următorul:

4
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 2

întreg x[1..n], k
citește n
* se citesc componentele vectorului x
citește k
invers(x,1,k)
invers(x,k+1,n)
invers(x,1,n)
*se afișează componentele vectorului x
sfârșit program

procedura invers(întreg x[1..n], întreg u, întreg v) este


întreg aux, i, j;

i  u;

j  v;

cât timp i < j execută

aux  xi;

xi  xj;

xj  aux;

i  i +1;

j  j-1;

sfârșit cât timp;


sfârșit procedură;

Exemplificăm mai departe utilizarea funcțiilor. Pentru calcul mediei aritmetice a celor
n componente reale ale unui vector se poate folosi următorul program:

5
Mădălina Roxana. Buneci

real x[1..n]
citește n
* se citesc componentele vectorului x
scrie media_aritmetica(x)
sfârșit program
real funcție media_aritmetica(real x[1..n]) este
întreg i;
real ma;

ma  0;

pentru i = 1,n, execută

ma  + xi;

sfârșit pentru

ma  ma/n;

returnează ma
sfârșit funcție;

Variabile globale și variabile locale

Odată cu declararea variabilelor li se alocă în memorie spațiu în conformitate


cu tipul lor. În funcție de locul în care este utilizată instrucțiunea declarativă o variabilă
este vizibilă numai într-un bloc (variabilă locală) al programului sau în întreg
programul scris în limba algoritmic (variabilă globală).
Variabilele globale sunt declarate în exteriorul oricărui subprogram și pot fi
utilizate oriunde în program, inclusiv în mai multe subprograme.
Variabilele locale nu pot fi utilizate în afara subprogramului în care au fost
declarate. Variabilele locale dintr-un subprogram nu au nicio legatură cu variabilele
locale din alt subprogram chiar dacă au acceași identificatori. Parametrii formali ai unui

6
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 2

subprogram respectă proprietățile unei variabile locale. În particular, nu se pot declara


în blocul funcției variabile cu același nume ca al parametrilor formali.
Într-un program putem avea și variabile globale și variabile locale cu același
identificator. Dacă într-un program avem variabile cu același identificator, dar cu
domenii de vizibilitate diferite, are prioritate variabila cu domeniul de vizibilitate cel
mai mic. În particular, dacă avem o variabilă globală și una locală cu același
identificator are prioritate variabila locală.

Comentarii

Într-un program scris în limbajul algoritmic putem utiliza comentarii (șiruri de


caractere cuprinse între delimitatorii /* */, care au rolul de a aduce explicații
suplimentare asupra programului). Limbajul algoritmic se deosebește de limbajele de
programare printr-o sintaxa mai puțin strictă, prin utilizarea instrucțiunilor nestandard,
prin libertatea de scriere și prin acceptarea unor abateri de la regulile prezentate mai
sus atât timp cât semnificațiile variabilelor și instrucțiunilor rămân clare.

Observație: Dacă într-un program avem variabile cu același nume, dar cu domenii de
vizibilitate diferite, are prioritate variabila cu domeniul de vizibilitate cel mai mic. În
particular, dacă ave o variabilă globală și una locală cu același nume are prioritate
variabila locală.

II.2. Scheme logice

Schemele logice constituie una dintre modalitățile de reprezentare a


algoritmilor. Ele sunt utile începătorilor pentru a vizualiza succesiunea de prelucrări ce
se efectuează.
Presupunem că programul acționează asupra unor date unor date aflate pe o
bandă de intrare, iar rezultatele sunt înregistrate pe o bandă de ieșire. Pe de o parte o
schemă logică poate fi privită ca un graf orientat ale cărui arce sunt etichetate. Un graf

7
Mădălina Roxana. Buneci

orientat este o pereche ordonată G = (X, U), unde X este o mulțime finită și nevidă de
elemente numite noduri (sau vârfuri), iar U este o mulțime de perechi ordonate de
elemente distincte ale lui X, numite arce. Un arc având vârfurile i și j (numite
extremitățile sale) se notează prin (i, j). Fiecare arc (i, j) are un sens de parcurgere și
anume de la extremitatea sa inițială (i) la extremitatea sa finală (j). Numim drum într-
un graf orientat o succesiune arce (i1, i2), (i2, i3),…, (in-1, in), notată prescurtat (i1, i2, …,
in).

Pe de altă parte, o schema logică poate fi privită ca o succesiune de instrucțiuni.


Definim mai întâi forma acestor instrucțiuni, precizând mai apoi modul în care acestea
concură la alcătuirea unei scheme logice. Instrucțiunile pot fi de următoarele tipuri:
➢ Instrucțiunea start este un arc etichetat cu cuvântul start. Vârful inițial al
acestui arc nu se pune explicit în evidență deoarece în el nu pot sosi arce.
Execuția unui program începe cu această instrucțiune.

start

➢ Instrucțiunea stop este un arc etichetat cu cuvântul stop. Vârful final al


acestui arc nu se pune explicit în evidență deoarece din el nu pot pleca arce.
Această instrucțiune are ca efect terminare execuției unui program.

stop
➢ Instrucțiunea de citire este un arc care determină citirea a n valori de banda
de intrare și înscrierea lor în locații de memorie rezervate variabilelor a1,
a2,…, an.

citește
a1, a2,…, an

8
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 2

➢ Instrucțiunea de scriere este un arc care determină înscrierea pe banda de


ieșire a valorilor curente ale expresiilor e1, e2,…, en.

scrie
e1, e2,…, en

➢ Instrucțiunea de atribuire este un arc etichetat cu v  e, unde v este o


variabilă, iar e o expresie de același tip (numeric sau logic) cu variabila v.
Efectul acestei instrucțiuni constă în evaluarea expresiei e pentru valorile
curente ale variabilelor pe care le conține și înscrierea rezultatului în locația
de memorie rezervată variabilei v.

v e

➢ Instrucțiune de ramificare este formată din n arce divergente din același


vârf, arce etichetate cu predicatele p1, p2, …, pn ce trebuie să satisfacă
relațiile :

• p1 p2  …  pn = 1

• pi  pj = 0  ij

Aceste relații ne asigură că exact unul dintre predicatele p1, p2, …, pn este
satisfăcut, calculele continuând pe arcul corespunzător acelui predicat.

p1 p2 pn

9
Mădălina Roxana. Buneci

În cazul n = 2 se mai folosesc și notațiile următoare

Da p Nu sau p Da

echivalente cu

p p

Se numește schemă logică (sau program sub formă de schemă logică) un graf
orientat care satisface următoarele condiții:
1. există o unică instrucțiune start și cel puțin o instrucțiune stop
2. orice vârf cu excepția extremității finale a instrucțiunii stop este extremitate
inițială a unei unice instrucțiuni
3. orice arc este etichetat cu una din următoarele informații

• start sau stop

• o citire sau o scriere

• o atribuire

• un predicat; în acest caz extremitatea inițială a arcului trebuie să fie


extremitate inițială a unei instrucțiuni de ramificare.
4. pentru orice arc există cel puțin un drum ce începe cu instrucțiunea start, se
termină cu o instrucțiune stop și conține arcul considerat.

Exemplu: Se cere un program sub formă de schemă logică pentru calculul


rădăcinilor reale ale ecuației de gradul al doilea: a x2 + b x + c = 0. Datele de
intrare sunt coeficienții ecuației:a, b, c. Datele de ieșire sunt rădăcinile reale x1
și x2 (dacă există).

10
Programarea calculatoarelor și limbaje de programare – notițe de curs/ Curs 2

start

citeşte a,b,c

delta  b2 –4*a*c

Da Nu
delta 0
00
scrie
Da Nu
delta =0 “Nu există”

x1  -b/(2*a)
x1 (-b + )/(2*a)

x2  x1 x2 (-b - )/(2*a)

scrie x1, x2

stop

11

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