Documente Academic
Documente Profesional
Documente Cultură
Algoritmi
I . 1 . G e ne ra l i tã Ń i de sp r e a l go r i tm i
I .1 .1 . N o Ń i u ne a d e a l g o r i t m
3
I .1 . 2 . O b i e c t e l e c u c a r e l u c r e a z ã a l g o r i t m i i
Constante
DefiniŃie:
O constantă este o dată a cărei valoare nu se modifică în timpul execuŃiei
algoritmului.
Constantele sunt de mai multe tipuri:
a) Constantele întregi. Sunt numere din mulŃimea Z, adică numere întregi
cu sau fără semn. Exemple: 232, +87, -1405.
b) Constante reale. Sunt valori raŃionale, cu virgulă zecimală, dar care au
un număr finit de zecimale. Mai notăm că virgula zecimală se reprezintă prin
caracterul "punct". Exemple: 2.34, -45.26
c) Constante caracter. Sunt caractere cuprinse între apostrofuri. Acestea
pot fi litere mari şi mici, caractere-cifră şi caractere speciale. Exemple: 'A', 'm',
'$', '9' etc.
d) Constantele şir de caractere. Sunt şiruri de caractere cuprinse între
ghilimele, care pot conŃine orice caractere, inclusiv caractere speciale şi caracterul
"spaŃiu ". Exemple: “program”, “Borland C++ 7.0”, ”AB#7”, etc.
În programe vom folosi foarte mult aşa-numitele “constante întregi cu
sens logic (boolean)”. Ce rol au acestea ? În cadrul unui algoritm putem întâlni
4
condiŃii, care pot fi îndeplinite sau nu, şi în funcŃie de care se vor decide acŃiunile
următoare. Orice condiŃie se caracterizează printr-o aşa numită "valoare de
adevăr", care ne spune dacă respectiva condiŃie este îndeplinită sau nu. Astfel, o
condiŃie poate avea valoarea de adevăr ”ADEVĂRAT” (condiŃie îndeplinită,
adevărată), sau ”FALS” (condiŃie neîndeplinită, falsă). Deoarece în limbajul C++
nu există un tip de date care să desemneze valorile logice, vom simula cele două
valori de adevăr posibile ale unei condiŃii prin numerele întregi 1 respectiv 0. Mai
exact, numărul întreg 1 corespunde valorii de adevăr ”ADEVĂRAT”, iar numărul
întreg 0 identifică valoarea de adevăr ”FALS”. Mai multe detalii pe această temă
veŃi învăŃa în capitolele următoare.
Variabile
DefiniŃie:
Numim variabilă, un obiect caracterizat prin trei atribute, tip, adresă şi
valoare, cu proprietatea că atributul valoare este modificabil.
Ex e mp l u :
Fie funcŃia matematică f:[-10,10] → R, f(x)= 2x+1.
Aceasta este definită prin: domeniu de definiŃie [-10,10] (mulŃimea valorilor pe
care le poate lua x), codomeniul R (mulŃimea valorilor funcŃiei f(x)) şi legea de asociere
f(x)= 2x+1. Despre x putem spune că poate lua orice valoare din domeniu, şi fiecărei
valori a lui x îi corespunde o valoare a funcŃiei. De exemplu, pentru x=-3 obŃinem
f(-3)=2·(-3)+1= -5, pentru x=2 avem f(2)=5 etc. Astfel, x este o variabilă pentru că
valoarea sa se poate modifica în orice moment. Mai exact, dacă am proiecta un algoritm
pentru calculul valorilor funcŃiei de mai sus, atunci valoarea lui x s-ar modifica în cursul
execuŃiei algoritmului. După cum observaŃi, sensul noŃiunii de variabilă este cel cunoscut
din matematică.
5
Expresii
În scopul efectuării calculelor, algoritmii folosesc expresii. O expresie
este alcătuită dintr-unul sau mai mulŃi operanzi legaŃi între ei prin operatori.
Operanzii reprezintă valorile care intră în calcul. Ei pot fi constante şi
variabile. Operatorii desemnează operaŃiile care se execută în cadrul expresiei.
Vom vedea mai târziu că într-un program C++ unii dintre operatori se
simbolizează altfel decât îi cunoaştem din matematică. Desigur că atunci când
scriem un algoritm pe hârtie putem nota operatorii cum vrem. Chiar dacă
deocamdată ne ocupăm numai de algoritmi, vom introduce de la bun început nişte
notaŃii apropiate de sintaxa limbajului C++, pentru a evita riscul unor confuzii
ulterioare.
În timpul execuŃiei algoritmului expresiile sunt evaluate. Evaluarea unei
expresii are loc astfel: se înlocuiesc variabilele cu valorile lor şi se efectuează
calculele, obŃinându-se astfel valoarea expresiei.
Expresiile se împart în două categorii: expresii aritmetice şi expresii
logice. Principalele categorii de operatori sunt: operatori aritmetici, logici şi
relaŃionali.
Expresii aritmetice
Sunt cele care efectuează operaŃii aritmetice având ca rezultat un număr.
În continuare vom nota operatorii aritmetici aşa cum sunt ei definiŃi în limbajul
C++. Mai mult, vom încerca să vă obişnuim de pe acum să respectaŃi câteva reguli
pe care le impune acest limbaj în ceea ce priveşte folosirea operatorilor.
Operatorii aritmetici sunt:
+ (adunare) * (înmulŃire) – (scădere) / (împărŃire)
Ex e mp l u :
a + b
• Expresia din matematică se scrie într-un program sub forma (a+b)/2.
2
Să vedem cum procedează calculatorul pentru a evalua expresia în cazul în care
variabilele au valorile a=5 şi b=7: aşa cum am spus, se înlocuiesc variabilele cu valorile
lor şi se efectuează calculele, obŃinându-se valoarea expresiei; deci valoarea expresiei
(a+b)/2 este (5+7)/2, adică 6. Operatorul "/" a înlocuit linia de fracŃie.
Parantezele sunt absolut necesare. Există o aşa numită prioritate a operatorilor, ce
stabileşte ordinea în care se execută operaŃiile în timpul evaluării unei expresii. Conform
acesteia, se execută mai întâi împărŃirile şi înmulŃirile, apoi adunările şi scăderile. Aşadar,
b
în absenŃa parantezelor, expresia a+b/2 este echivalentă cu "formula" a + .
2
6
reprezintă valoarea de adevăr a condiŃiei aferente, şi poate fi “ADEVĂRAT”
(condiŃie îndeplinită, adevărată) şi “FALS” (condiŃie neîndeplinită, falsă). Am
arătat în lecŃia “Constante” că în limbajul C++ vom simula cele două valori de
adevăr posibile ale unei condiŃii prin numerele întregi 1 respectiv 0. Astfel, o
expresie logică poate avea valoarea:
− 1, în cazul în care condiŃia pe care o defineşte este adevărată;
− 0, în situaŃia în care condiŃia pe care o descrie este falsă.
O expresie logică este construită de obicei cu ajutorul operatorilor
relaŃionali. Am precizat deja faptul că în limbajul C++ unii operatori sunt
simbolizaŃi diferit faŃă de notaŃia cunoscută din matematică. Pentru a vă obişnui de
la bun început cu sintaxa limbajului C++, vom defini încă de pe acum operatorii
aşa cum sunt ei implementaŃi în limbaj. Operatorii relaŃionali ai limbajului C++
sunt: "==" (operatorul de testare al egalităŃii), "<" ("mai mic"), ">" ("mai mare"),
"<=" ("mai mic sau egal"), ">=" ("mai mare sau egal"), "!=" ("diferit").
Exemplu:
• Dacă a şi b sunt variabile numerice (întregi sau reale), a− − 10>=b este o
expresie logică: pentru a=12 şi b=5, expresia are valoarea 0, corespunzătoare valorii de
adevăr FALS ("12-10>=5 ? nu "); în schimb, pentru a=8 şi b=6, expresia are valoarea 1,
corespunzătoare valorii de adevăr ADEVĂRAT ("8-10>=6 ? nu")
Mai multe expresii logice pot fi "combinate" cu ajutorul operatorilor
logici, obŃinându-se o aşa numită "expresie logică compusă". Expresiile logice
"elementare" ce alcătuiesc expresia compusă pot fi scrise între paranteze. În mod
implicit, operaŃiile ce apar în cadrul unei expresii, se execută într-o anumită
ordine, dată de aşa-numita “prioritate a operatorilor”. Despre acest subiect am
pomenit deja în cadrul exemplului dat în paragraful “Expresii aritmetice”,
precizând atunci faptul că rolul parantezelor într-o expresie este tocmai acela de a
schimba ordinea implicită în care se execută operaŃiile. Operatorii logici pe care-i
vom folosi în acest capitol sunt ŞI, SAU (pentru aceştia nu vom introduce încă
notaŃia lor din limbajul C++, preferând deocamdată aceste două cuvinte din limba
română care sunt mult mai sugestive).
Exemplu:
Fie a şi b două variabile de tip întreg. CondiŃia ca “numerele a şi b să fie ambele
pozitive”, poate fi scrisă astfel:
• a>0 ŞI b>0
• (a>0) ŞI (b>0)
În a doua formă, expresiile elementare ce compun expresia logică compusă, adică
“a>0” şi “b>0” au fost cuprinse între paranteze rotunde. În cazul de faŃă, parantezele nu
sunt necesare, deoarece în mod implicit compilatorul limbajului C++ efectuează operaŃiile
în ordinea în care dorim: mai întâi evaluează expresiile elementare “a>0” respectiv “b>0”,
apoi aplică “ŞI logic” între valorile acestora.
Pentru ca expresia "a>0 ŞI b>0" să fie adevărată, este necesar ca expresiile
componente "a>0", "b>0" să fie adevărate în acelaşi timp.
7
− pentru a=3, b=8, expresia are valoarea 1 (cu sens de ”ADEVĂRAT”); ("3>0
ŞI 8>0 ? da");
− pentru a=4, b=-2, expresia are valoarea 0 (cu sens de ”FALS”); (nu este
"b>0)".
• a>0 SAU b>0 → descrie condiŃia ca cel puŃin unul dintre numerele a, b să fie
pozitiv
Pentru ca expresia "a>0 SAU b>0" să aibă valoarea 1 (”ADEVĂRAT”), trebuie ca
cel puŃin una dintre expresiile "a>0", "b>0" să fie adevărată.
− pentru a=4, b=-2 expresia are valoarea 1 (”ADEVĂRAT”);
− pentru a=-3, b=-5 expresia are valoarea 0 (”FALS”).
I . 2 . R ep r e z e n t a r e a al go r i t m i l o r .
P s eu d o c o du l .
Aşa cum am spus deja, algoritmul unei probleme este alcătuit dintr-o
succesiune de paşi ce reprezintă etapele rezolvării problemei. În cadrul fiecărui pas
se execută una sau mai multe acŃiuni.
Scopul elaborării algoritmului unei probleme este acela de a scrie un
program într-un anumit limbaj de programare. Dar dacă avem de-a face cu o
problemă mai complexă, înainte de a scrie programul este bine să schiŃăm paşii
algoritmului. În acest scop avem la dispoziŃie o formă foarte accesibilă de
reprezentare a algoritmilor, şi anume pseudocodul.
Un limbaj pseudocod se prezintă sub formă de text şi se bazează pe nişte
aşa-numite cuvinte cheie. Fiecare cuvânt cheie identifică în mod unic un anumit tip
de acŃiune.
AcŃiunile algoritmului se reprezintă în pseudocod prin ceea ce numim
instrucŃiuni.
Ansamblul cuvintelor cheie împreună cu regulile care trebuie respectate
în folosirea lor, alcătuieşte ceea ce numim sintaxa limbajului-pseudocod.
Există o mare diversitate de limbaje-pseudocod. Practic, fiecare
programator îşi poate proiecta propriul pseudocod, definind cuvintele cheie ale
acestuia şi impunând nişte reguli de sintaxă.
În cele ce urmează vom folosi o variantă de pseudocod în care cuvintele
cheie provin din limba română, iar regulile de sintaxă sunt cele pe care le impune
limbajul C++. Deocamdată trebuie să reŃineŃi două dintre aceste reguli:
− asemeni limbajului C++, în pseudocod nu vom face deosebire între litere
mari şi litere mici;
− comentariile, prin care descriem pe scurt acŃiunile algoritmului
(instrucŃiunile pseudocodului), vor fi precedate de caracterele “//”.
8
I .2 .1 . P r i m u l e x e m p l u d e p s e u do c o d
9
CondiŃia "(b>0 ŞI h>0)" nu este altceva decât o expresie logică compusă,
alcătuită din două expresii elementare "legate" prin operatorul logic "ŞI".
În funcŃie de valoarea de adevăr a condiŃiei (adevărată sau falsă), calculatorul va
lua o decizie cu privire la ce va face în continuare, introducând astfel o ramificaŃie în
algoritm. Astfel cele două cazuri posibile sunt:
a) dacă această condiŃie este îndeplinită (adevărată), adică dacă expresia logică
"(b>0 ŞI h>0)" are valoarea 1, atunci calculatorul va putea calcula aria, pe care apoi ne-
o va "comunica";
b ⋅ h
pentru calculul ariei trebuie să introducem formula matematică A = .
2
Cum anume ? Printr-o aşa-numită instrucŃiune de atribuire, pe care o scriem
astfel: A ←(b*h)/2;
Vom spune că variabilei A i se atribuie valoarea expresiei aritmetice (b*h)/2.
Să analizăm această atribuire:
− operanzii care apar sunt variabilele b, h şi constanta 2
− pentru operatorii de înmulŃire şi împărŃire folosim simbolurile deja definite:
"*" respectiv "/";
− simbolul "←" ("săgeată") reprezintă operatorul de atribuire;
− instrucŃiunea se execută astfel: în dreapta operatorului de atribuire,
calculatorul va înlocui variabilele b şi h cu valorile lor (preluate prin citire),
obŃinând astfel valoarea expresiei, pe care o va memora în variabila A; de
exemplu, dacă baza b este 5 iar înălŃimea h este 4, atunci expresia
aritmetică (b*h)/2 are valoarea (5*4)/2, adică 10, deci în variabila A se
va memora valoarea 10;
− la finele oricărei atribuiri punem "punct şi virgulă".
după ce a determinat valoarea ariei A, calculatorul trebuie să ne-o comunice. Cum
anume ? Afişând-o pe monitor. Aceasta este o instrucŃiune de ieşire. În
pseudocod, vom folosi cuvântul cheie "scrie" urmat de numele variabilei a cărei
valoare se afişează, încheind instrucŃiunea cu "punct şi virgulă":
scrie A;
11