Operatorii
Operatorii sunt caractere speciale (*, /, >, etc.) sau
cuvinte cheie (mod, and etc.) prin intermediul cărora
se reprezintă operațiile care se efectuează în cadrul
unui algoritm. Fiecare limbaj de programare are
implementat propriul set de operatori. În acest
capitol vor fi prezentați operatorii care se folosesc în
cadrul unui algoritm.
Asupra operanzilor dintr-o expresie puteți aplica
următorii operatori:
- operatorul de atribuire
- operatorii matematici
- operatorul de concatenare a şirurilor de caractere
- operatorii relaționali
- operatorii logici
Operatorii pot fi aplicați numai pe anumite tipuri de
operanzi, producând rezultate de un anumit tip.
Operatorii matematici
Se aplică pe date de tip numeric şi furnizează un
rezultat de tip numeric.
Operator Semnificație Exemplu
+(adunare) Aduna matematic cei doi 5+2=7
operanzi.
- (scădere) Scade al doilea operand din 7-3=4
primul operand.
/ Împarte primul operand la 7/2=3.5
(împărțire al doilea operand.
reală)
* înmulteşte cei doi operanzi. 2*4=8
(înmulțire)
**|^ Ridică primul operand la 2**3=8
(ridicare la
puterea furnizată de cel de
putere) al doilea operand.
MOD Calculează restul împărțirii 19 MOD
(modulo) primului operand la al 4 =3
doilea operand.
DIV Calculează câtul împărțirii 19 DIV 4
(împărțire primului operand la al 19 =4
întreagă) div 4 = 4 doilea operand.
Operatorii relaționali (de comparație)
Se aplică pe operanzi de tip numeric sau de tip şir de
caractere şi furnizează un rezultat de tip logic.
Operator Semnificatie Exemplu
= (egalitate) Rezultatul este T dacă cei (5=5)=T
doi operanzi sunt egali. (5=7)=F
<> | # Rezultatul este T dacă cei (5<>5)=F
(diferit) doi operanzi sunt diferiti (5<>7)=T
<(mai mic) Rezultatul este T dacă (5<7)=T
primul operand este mai (7<5)=F
mic decât al doilea operand.
> (mai Rezultatul este T dacă (7>5)=T
mare) primul operand este mai (5>7)=F
mare decât al doilea
operand.
<= (mai mic Rezultatul este T dacă (5<=5)=T
sau egal) primul operand este mai (7<=5)=F
mic sau cel mult egal fată de
al doilea operand.
>= (mai Rezultatul este T dacă (7>=5)=T
mare sau primul operand este mai (5>=7)=F
egal) mare sau cel mult egal față
de al doilea operand.
Un operator relațional aplicat pe două şiruri de
caractere realizează compararea celor două şiruri de
caractere. Compararea a două caractere este posibilă
prin compararea numerică a codurilor ASCII ale celor
două caractere. Astfel, codul ASCII al caracterului d este
100, iar al caracterului D este 68. Deci, caracterul d este
mai mare decât caracterul D.
Convenție de notare: Semnul | plasat între două
elemente are semnificația conjuncției sau, adică
pentru operația de ridicare la putere pot fi folosite
simbolurile ** sau simbolul ^
Pentru compararea celor două caractere se va scrie
"d">"D", iar în urma executării operației de comparare
se va produce rezultatul logic T, deoarece operația de
comparare se execută între cele două valori numerice
(100>68).
Compararea a două şiruri de caractere se face prin
compararea codului ASCII al caracterelor din aceeaşi
poziție a fiecărui şir. Dacă cele două şiruri nu au aceeaşi
lungime, şirul cu lungime mai mică este completat la
sfârşit, până la egalarea lungimilor, cu caracterul care
are codul ASCII 0. Operația de comparare începe cu
prima poziție din şir şi continuă cu următoarele poziții,
numai dacă pozițiile anterioare sunt identice în ambele
şiruri.
De exemplu, şirul de caractere Idee este mai mare
decât şirul de caractere IDEE, deoarece, în poziția a
doua, caracterele din cele două şiruri nu mai sunt
identice, iar codul ASCII al caracterului d este mai mare
decât codul ASCII al caracterului D. Operația de
comparare se opreşte după cel de al doilea caracter şi
nu mai contează codurile caracterelor din pozițiile
următoare. Pentru compararea celor două şiruri de
caractere se va scrie "Idee">"IDEE", iar în urma
executării operației de comparare se va produce
rezultatul logic T.
Operatorul de concatenare
Se aplică pe operanzi de tip şir de caractere şi
furnizează un rezultat de tip şir de
caractere.
Operator Semnificație Exemplu
+ Reuneşte două şiruri de "Buna
(concatenare) caractere într-un singur "+"ziua"=
şir de caractere. "Buna ziua"
Operatorii logici
Se aplică numai pe operanzi de tip logic şi furnizează un
rezultat de tip logic.
Operator Semnificație a NOT a
NOT Schimbă valoarea unui T F
(negare) operand cu complementul
său: T cu F şi F cu T. F T
Operator Semnificație a b a AND b a OR b
AND ("şi" Rezultatul este T dacă T T T T
logic) ambii operanzi au
valoarea T, altfel este F. T F F T
OR ("sau" Rezultatul este T dacă F T F T
logic) cel puțin unul dintre
operanzi are valoarea F F F F
T, altfel este F.
Operatorii logici sunt foarte utili atunci când construiți
expresii logice care descriu anumite condiții ce vor fi
testate, urmând ca, în funcție de rezultat, să se execute
anumite operații.
Dacă expresiile logice sunt prea complexe, le puteți
simplifica folosind următoarele relațiile lui De Morgan:
NOT (a AND b) = (NOT a) OR (NOT b)
NOT (a OR b) = (NOT a) AND (NOT b)
Operatorul de atribuire
Prin acest operator puteți atribui o anumită valoare
unei date:
nume expresie
Operația de atribuire se desfăşoară în două etape: mai
întâi se evaluează expresia, după care valoarea
obținută se atribuie datei identificate prin nume.
Rezultatul evaluării expresiei trebuie să fie de acelaşi
tip cu data identificată prin nume.
Exemplu Semnificație
n 100 Datei de tip numeric n i se
atribuie valoarea 100.
Exemplu Semnificație
nn+200 Se evaluează expresia
adunându-se 200 la
valoarea datei n. Valoarea
obținută în urma evaluării
este 300 şi se atribuie ca
valoare nouă datei n.
text"şir de Datei de tip şir de caractere
caractere" text i se atribuie valoarea
"şir de caractere".
Prin operația de atribuire, în zona de memorie alocată
datei se scrie noua valoare a datei, vechea valoare
pierzându-se.
Dacă vreți să păstrați şi vechea valoare, va trebui ca,
înainte de operația de atribuire, să o salvați prin
copiere într-o altă variabilă de memorie (dată variabilă)
de acelaşi tip. Copierea se face şi ea tot printr-o
operație de atribuire.
Observație: Operația de atribuire se mai foloseşte, în
cadrul unui algoritm, pentru executarea următoarelor
operații:
✓ inițializarea valorii unor variabile de memorie
✓ calculul iterativ al valorii unor variabile de memorie.
Calculul iterativ al valorii unei variabile de memorie
înseamnă să-i atribuiți acelei variabile de memorie
valoarea unei expresii în care unul dintre operanzi este
chiar numele acelei variabile de memorie.
Tipurile de variabile de memorie cel mai des folosite
(din punct de vedere al informației pe care o
reprezintă) sunt:
✓ Contorul sau numărătorul. Este o variabilă de
memorie care se foloseşte pentru a număra anumite
cazuri care pot să apară. Înainte de a începe
numărătoarea, contorul se initializează cu valoarea 0
(nu a fost evidențiat încă nici un caz). În timpul
procesului de prelucrare, atunci când se întâlneşte un
caz, valoarea contorului se calculează iterativ prin
incrementare cu 1 (se creşte valoarea contorului cu 1).
De exemplu, dacă folosim variabila de memorie k
pentru contor, inițializarea sa se va face cu operația de
atribuire: k0, iar calculul iterativ, cu operația de
atribuire: k k+1.
✓ Suma. Este o variabilă de memorie care se foloseşte
pentru calculul iterativ al unei sume (adunarea, la
valoarea anterioară, a unei noi valori). Înainte de a
începe calcularea ei, suma se initializează cu valoarea 0
(elementul neutru pentru operația de adunare, şi
înseamnă că nu a fost adunată nici o valoare la sumă).
De exemplu, dacă folosim variabila de memorie s
pentru a calcula suma mai multor valori citite de la
tastatură prin intermediul unei variabile de memorie a,
inițializarea sumei se face cu operața de atribuire s0,
iar calculul iterativ cu operația de atribuire: ss+a.
✓ Produsul. Este o variabilă de memorie care se
foloseşte pentru calculul iterativ al unui produs
(înmulțirea valorii anterioare cu o nouă valoare).
Înainte de a începe calcularea lui, produsul se
initializează cu valoarea 1 (elementul neutru pentru
operația de înmulțire, şi înseamnă că nu a fost
înmulțită nici o valoare cu produsul). De exemplu, dacă
folosim variabila de memorie p pentru a calcula
produsul mai multor valori citite de la tastatură prin
intermediul unei variabile de memorie a, inițializarea
produsului se face cu operația de atribuire p 1, iar
calculul iterativ cu operația de atribuire: p p*a.
Studiu de caz
Scop. Exemplificarea modului în care folosiți operatorul
de atribuire pentru inițializare şi calcul iterativ.
Enunțul problemei: Se introduc n numere întregi de la
tastatură. Să se numere câte sunt pare şi să se calculeze
suma şi produsul lor.
În urma analizei problemei se obține specificația
programului:
✓ Funcția programului. Se numără şi se calculează
suma şi produsul numerelor pare dintr-o mulțime de n
numere întregi.
Din enunțul problemei rezultă că în procesul de calcul
se folosesc numai numere pare. Pentru a evidenția
acest caz (apariția unui număr par în mulțimea de
numere citite), se foloseşte proprietatea numerelor
pare: restul împărțirii unui număr par la 2 este 0, care
se exprimă prin expresia, cu rezultat de tip logic,
(a MOD 2)=0. Dacă această expresie are valoarea T,
numărul este par.
Informațiile de intrare sunt numărul de elemente ale
mulțimii de numere întregi şi numerele citite.
Reprezentarea internă a informației se va face prin
datele de intrare: n pentru numărul de elemente ale
mulțimii şi a pentru numărul citit curent.
✓ Pentru operațiile executate în cadrul algoritmului, se
va folosi data intermediară, prin care se numără câte
numere s-au introdus de la tastatură la un moment dat.
Data intermediară i este necesară pentru a afla când se
termina procesul de citire a celor n numere, având
funcția unui contor. Valoarea inițială a contorului i
(înainte de a se citi primul număr) este 0.
✔ Informațiile de ieşire vor fi numărul de valori pare,
suma şi produsul lor. Reprezentarea lor internă se va
face prin datele de ieşire: k pentru numărul de valori
(contorul numerelor pare), s pentru suma lor şi p
pentru produsul lor. Valoarea inițială (înainte de a se
citi primul număr) a contorului k şi a sumei s este 0, iar
a produsului peste 1.
Algoritmul de rezolvare a problemei va fi:
Pasul 1. Început.
Pasul 2. Comunică valoarea pentru n.
Pasul 3. Atribuie valoarea inițială pentru contorul
numerelor citite, i: i 0;
Pasul 4. Atribuie valoarea inițială pentru contorul
numerelor pare, k: k 0;
Pasul 5. Atribuie valoarea inițială pentru suma
numerelor pare, s: s 0;
Pasul 6. Atribuie valoarea inițială pentru produsul
numerelor pare, p: p 1;
Pasul 7. Compară i<=n. Dacă este adevărat, execută
Pasul 8; altfel, execută Pasul 14.
Pasul 8. Comunică valoarea pentru a.
Pasul 9. Compară (a MOD 2) = 0. Dacă este adevărat,
execută Pasul 10; altfel, execută Pasul 13.
Pasul 10. Actualizează valoarea pentru k: kk+1;
Pasul 11. Actualizează valoarea pentru s: ss+a;
Pasul 12. Actualizează valoarea pentru p: p p*a;
Pasul 13. Actualizează valoarea pentru i: ii+1. Mergi
la Pasul 7.
Pasul 14. Comunică valorile pentru k, s, p.
Pasul 15. Terminat.
Expresiile
Expresia este o combinație validă de operatori şi
operanzi.
Operanzii pot fi nume de date, constante de tip
numeric sau şir de caractere şi funcții care, în
urma evaluării, furnizează un singur rezultat. În
funcție de tipul operanzilor şi al operatorilor,
rezultatul expresiei poate fi de tip numeric, şir de
caractere sau logic.
Într-o expresie, operatorii se folosesc într-un anumit
scop:
✓ operatorii matematici, pentru efectuarea calculelor,
✓ operatorii relaționali şi logici, pentru efectuarea de
comparații în vederea luării unor decizii în cadrul
algoritmului;
✓ operatorul de atribuire, pentru manipularea datelor.
Expresia este validă numai dacă operatorii care leagă
operanzii corespund tipului operanzilor pe care îi leagă.
De exemplu:
✓ Expresia E22+75 este o expresie validă deoarece
operatorul matematic + leagă doi operanzi exprimați
prin două constante de tip numeric.
✓ Expresia E"Ana"+"-Maria" este o expresie validă,
deoarece operatorul de concatenare + leagă doi
operanzi exprimați prin două constante de tip şir de
caractere.
✔ Expresia E22+"ani" nu este o expresie validă,
deoarece operatorul + leagă doi operanzi exprimați
prin două constante de tipuri diferite: numeric şi,
respectiv, şir de caractere. El nu poate fi interpretat
nici ca operator matematic, nici ca operator de
concatenare.
Dacă, de exemplu, într-o expresie trebuie să se
calculeze radicalul dintr-o dată de tip numeric, nu se
poate folosi nici un operator matematic. În acest caz,
limbajul de programare în care se lucrează pune la
dispoziție o funcție.
Funcția este o prelucrare predefinită de autorii
limbajului de programare, care se poate folosi in cadrul
unei expresii la fel ca un operand, deoarece ea este de
fapt un program care, în urma execuției, furnizează o
valoare chiar prin numele ei. Atunci când se evaluează
expresia, funcția este înlocuită cu valoarea returnată în
urma executării ei. Funcția se identifică printr-un
nume, iar pentru apelarea ei se scrie numele funcției
urmat de o listă de parametri precizați între paranteze
rotunde. Parametrii sunt valorile cu care se execută
funcția la acel apel.
De exemplu, funcția sin(x) returnează valoarea funcției
trigonometrice sinus pentru numărul x. Numele
funcției este sin iar parametrul x este de tip numeric.
Dacă se evaluează funcția sin(x), iar x are valoarea 2.5,
in urma execuției programului asociat, funcția va
furniza valoarea 0.598.
Pentru a evalua o expresie, calculatorul va executa într-
o anumită ordine operațiile pe care le-ați scris.
Această ordine este dată de:
✓ Precedența operatorilor. Este ordinea în care se
execută operațiile definite de operatori. Ea determină
nivelul de prioritate al operatorilor.
✓ Asociativitatea operatorilor. Este ordinea în care se
evaluează operatorii cu acelaşi nivel de prioritate.
Fiecare limbaj de programare are implementată o
tabelă de precedență (tabela nivelurilor de prioritate),
şi pentru fiecare nivel de prioritate o anumită
asociativitate. Într-un algoritm vom folosi următoarea
tabelă de precedență:
1. Se evaluează funcțiile.
2. Se evaluează operatorii matematici. Operatorii
matematici au niveluri de prioritate diferite.
Operatorul ** are nivel de prioritate 1, fiind primul
care se evaluează, operatorii *, /, DIV şi MOD au
nivelul de prioritate 2, iar operatorii + şi - au nivelul
de prioritate 3.
3. Se evaluează operatorii de concatenare.
4. Se evaluează operatorii relaționali. Toți operatorii
relaționali au acelaşi nivel de prioritate.
5. Se evaluează operatorii logici. Ordinea de prioritate
a operatorilor logici este not, and şi or, primul fiind cel
mai prioritar.
Asociativitatea operatorilor este de la stânga la
dreapta, adică toți operatorii care au acelaşi nivel de
prioritate se evaluează în ordine, de la stânga la
dreapta.
Precondițiile unei expresii.
Comisia defineşte cum trebuie să prelucreze
calculatorul anumite valori ale datelor.
De fiecare dată când calculatorul evaluează expresia
sunt prelucrate valorile curente ale datelor variabile
care apar ca operanzi în cadrul expresiei. În unele
cazuri trebuie stabilite anumite condiții pentru valorile
acestor date. Pentru a se putea evalua expresia, adică
trebuie stabilite precondițiile expresiei.
Precondițiile expresiei reprezintă un ansamblu de
restricții şi constrângeri impuse datelor care apar în
expresie ca operanzi.
Aceasta înseamnă că dacă notăm precondiția cu P şi
expresia cu E atunci.
Dacă precondiția P este adevărată, are valoarea True.
Expresia poate fi calculată cu acele valori ale datelor.
Dacă precondiția P este falsă, are valoarea false,
expresia nu poate fi calculată cu acele valori ale datelor,
deoarece fie se obține o valoare eronată, fie se poate
provoca o eroare de execuție a programului.
Precondițiile cele mai des întâlnite sunt.
✓ Constrângere operației de împărțire. În algoritm
puteți folosi trei operatori pentru împărțire: / DIV
MOD Pentru toate aceste operații, există precondiția
ca împărțitorul să fie diferit de zero. De exemplu,
pentru expresia a/(c+d), precondiția este c+d <>0
✓ Constrângerile argumentului unei funcții.
Argumentele unor funcții trebuie sã îndeplineascã o
anumită condiție. De exemplu, funcția sqrt(x) nu se
poate aplica pe o valoare negativă, nu se poate
extrage radicalul pătrat dintr-o valoare negativă.
✓ Constrângere pentru ca formula să fie validă.
Formula folosită pentru a calcula o valoare poate fi
validă numai pentru anumite valori ale datelor care
sunt folosite ca operanzi. De exemplu, operatorii DIV
şi MOD se pot aplica numai pe date de tip întreg.
Reprezentarea algoritmilor. Algoritmii
Algoritmul este un concept abstract. Reprezentarea
algoritmului înseamnă implementarea fizică a
algoritmului. Chiar dacă algoritmul este unic, el poate
avea mai multe reprezentări fizice. De exemplu,
algoritmul de rezolvare a ecuației de gradul întâi poate
fi reprezentat prin calculele efectuate pe hârtie de
fiecare dată când se rezolvă manual o ecuație de gradul
întâi, prin circuite electronice, dacă s-ar construi o
maşină electronică numai pentru rezolvarea ecuației de
gradul întâi, sau prin instrucțiunile unui program care
descriu pentru calculator algoritmul de rezolvare.
Când construiți un algoritm trebuie să țineți cont de
următoarele reguli:
✓ să definiți exact datele asupra cărora lucrează
algoritmul (datele de intrare, datele de ieşire şi
datele intermediare);
✓ să definiți exact operatiile care se vor executa cu
datele asupra cărora lucrează algoritmul;
✓ să definiți exact noțiunea de structură de control
a algoritmului;
✓ să definiți exact succesiunea de structuri care
formează algoritmul.
Algoritmul prin care se descrie o problemă care
trebuie să fie rezolvată de calculator nu trebuie să fie
ambiguu deoarece, în cazul exprimărilor neclare,
calculatorul nu poate să opteze singur pentru o
anumită posibilitate. Pentru a evita ambiguitatea
descrierii unui algoritm printr-un limbaj natural
(limba în care vorbim), se poate folosi pentru
reprezentarea lui un limbaj artificial numit
pseudocod, apropiat de limbajul de programare, dar
care este puțin formalizat şi nu este constrâns de
regulile de sintaxă ale limbajului de programare
(de exemplu, în pseudocod se poate folosi
exprimarea dacă...atunci...altfel în limba română sau
formularea if...then...else în limba engleză - care sunt
foarte aproapiate de limbajul natural, dar care
permit descrierea unor operații specifice din
algoritm).
Pseudocodul (codul fals) este considerat un cod fals
deoarece nu poate fi folosit pentru a exprima
instrucțiunile care se dau calculatorului pentru a
rezolva problema descrisă de algoritm (nu poate fi
folosit ca limbaj de programare).
El foloseşte expresii, din limbajul natural, în care
exprimarea acțiunilor care se execută se face prin
propoziții care se termină prin simbolul punct şi
virgulă (;) În propoziții se folosesc cuvinte cheie,
pentru descrierea structurilor de control şi a
operațiilor de comunicare. O propoziție care
reprezintă un pas de comunicare sau de acțiune
începe obligatoriu cu un verb.
Pseudocodul permite şi descrierea datelor asupra
cărora acționează algoritmul. Pentru precizarea
tipului de dată se folosesc cuvinte cheie.
De exemplu, se pot folosi următoarele cuvinte cheie:
întreg - tipul numeric întreg; real - tipul numeric real;
logic - tipul logic; caracter - tipul caracter; şi şir - tipul
şir caracter. Cuvântul cheie care precizează tipul este
urmat de o listă prin care se enumerǎ identificatorii
datelor care corespund acelui tip.
În cazul pasului de comunicare, verbul este citeşte
(read) pentru o operație de intrare şi scrie (write)
pentru o operație de ieşire. Verbul este urmat de lista
datelor care se comunică.
Lista conține date variabile reprezentate prin
identificatorii lor. În cazul unei operații de scriere lista
poate conține şi date constante reprezentate prin
valoare (de exemplu, un mesaj reprezentat printr-o
constantă de tip şir de caractere). Elementele listei se
separă prin virgulă.
Cuvintele cheie pot fi în limba română (pseudocodul
în limba română) sau în limba engleză (pseudocodul
în limba engleză). Pseudocodul în limba engleză este
mai aproape de cuvintele cheie folosite în
instrucțiunile unui limbaj de programare.
Din această cauză vor fi prezentate ambele versiuni
de pseudocod, urmând ca în aplicații să folosim
numai pseudocodul în limba română.
Pentru a delimita secvența de descriere a datelor de
secvența de descriere a paşilor algoritmului, paşii
algoritmului vor fi încadrați de cuvintele cheie
început... sfârşit. (begin... end.).
De exemplu, pseudocodul pentru descrierea
algoritmului de rezolvare a ecuației de gradul întâi
este:
real a,b, z;
început
citeşte a,b;
┌Dacă a=0 atunci
│┌Dacă b=0 atunci
││ Scrie "Ecuația are o infinitate de soluții";
││ altfel
││ scrie "Ecuația nu are soluții";
│└─────■sfârşit_dacă;
│ altfel
│ zb/a;
│ scrie "Soluția ecuației este ", z;
└─────■sfârşit_dacă;
sfârşit.
Observații:
1. În pseudocod, operația de comparație a fost
exprimată prin cuvintele cheie Dacă şi
sfârşit_dacă. Aceste două cuvinte formează o
structură de control, adică o entitate din cadrul
algoritmului prin care se descrie modul în care
paşii algoritmului îşi predau controlul unul altuia.
2. În pseudocod, pentru orice structură de control se
foloseşte o pereche de cuvinte cheie: primul cuvânt
precizează începutul structurii (cuvântul Dacă), iar al
doilea cuvânt precizează sfârşitul structurii (cuvântul
sfârşit_dacă).
3. Ca să fiți siguri că ați scris corect structurile de
control, verificați ca numărul de structuri deschise să
fie egal cu numărul de structuri închise (de exemplu,
numărul de cuvinte dacă să fie egal cu numărul de
cuvinte sfârşit_dacă).
4. Pentru a urmări mai uşor dacă structurile sunt
închise corect, scrieți indentat corpul structurii față
de cuvintele cheie cu care începeți şi cu care
terminati structura. Scrieți la acelaşi nivel de
indentare propozițiile care se execută secvențial. De
exemplu, în structura de control descrisă în
pseudocod prin cuvintele cheie Dacă... sfârşit_dacă,
scrieți față de cuvintele cheie atunci şi altfel paşii care
se execută pentru cele două valori ale condiției
testate.
Un exemplu de algoritm matematic este rezolvarea
ecuației de gradul întâi:
a x z+b=0
unde a şi b sunt coeficienții ecuației şi pot lua orice
valori din domeniul numerelor reale, iar z reprezintă
un număr care se calculează şi care poate lua şi el
orice valoare reală, astfel încât să fie îndeplinită
relația definită prin ecuație.
Algoritmul de rezolvare a ecuației va prezenta un set
unic de operații, prin care se calculează valoarea lui
z, oricare ar fi valorile pentru a şi b:
Pasul 1. Început.
Pasul 2. Comunică valorile pentru a şi b.
Pasul 3. Compară a = 0. Dacă este adevărat, execută
Pasul 4; altfel, execută Pasul 7.
Pasul 4. Comparǎ b = 0. Dacă este adevărat, execută
Pasul 5; altfel, execută Pasul 6.
Pasul 5. Comunică mesajul "Ecuația are o infinitate
de soluții". Mergi la Pasul 9.
Pasul 6. Comunică mesajul "Ecuația nu are soluții".
Mergi la Pasul 9.
Pasul 7. Calculează z = -b/a.
Pasul 8. Comunică valoarea lui z.
Pasul 9. Terminat.
Numărul de paşi este finit (9 paşi). Toți paşii
reprezintă acțiuni care se pot executa: compară,
calculează, comunică. O dată definit acest algoritm,
paşii lui se vor exe- cuta pentru orice valori ale lui a
şi b, deci algoritmul descrie rezolvarea unei pro-
bleme generale.
La fiecare executare a algoritmului care descrie o
problemă generală va fi tratat un caz particular, adică
se rezolvă ecuația de gradul întâi pentru valori
precizate ale lui a şi b.
Algoritmii au următoarele principale proprietăți:
✓ Claritatea. Orice algoritm trebuie să fie precis
definit, să prezinte clar toate etapele care trebuie
parcurse până la obținerea soluției, fără să formuleze
nimic ambiguu.
✓ Finitatea. Algoritmul trebuie să fie format dintr-un
număr finit de paşi, prin exe- cutarea cărora să se
ajungă la rezolvarea problemei şi obținerea
rezultatelor.
✓ Succesiunea determinată a paşilor. Paşii care
compun algoritmul trebuie exe- cutați într-o ordine
bine determinată. De obicei, ei se execută în ordine
secvenți- ală (ordinea în care au fost scrişi). În cazul
în care apare necesitatea schimbării acestei ordini,
trebuie să se precizeze clar pasul care urmează să fie
executat.
✓ Universalitatea. Algoritmul trebuie să permită
rezolvarea unei clase de proble- me, care sunt de
acelaşi tip şi care diferă între ele numai prin datele de
intrare. El trebuie să ofere posibilitatea de a rezolva
orice problemă din acea clasă de probleme.
✓Realizabilitatea. Paşii care compun algoritmul
trebuie să reprezinte operații care se pot executa cu
resursele disponibile.
✓Eficiența. Operațiile care compun algoritmul
trebuie alese astfel încât soluția problemei să fie
obținută după un număr minim de paşi, cu precizia
prestabilită sau cu o precizie satisfăcătoare.
Principiile programării structurate
Algoritmul este format din paşii care urmează să se
execute şi ordinea în care se vor executa pentru a
rezolva problema. Algoritmul pentru rezolvarea
ecuației de gradul întâi conține noua paşi
(vezi algoritmul precedent), iar ordinea de executare
depinde de valoarea celor doi coeficienți a şi b:
✓ Dacă a =0 şi b =0, se execută în ordine paşii: 1, 2,
3, 4, 5, 9.
✓ Daca a =0 şi b 0, se execută în ordine paşii: 1, 2,
3, 4, 6, 9.
✓ Dacă a 0, se execută în ordine paşii: 1, 2, 3, 7, 8,
9.
Structura de control a algoritmului defineşte ordinea
de executare a paşilor, adică ordinea în care un pas
predă controlul altui pas şi prin care se determină
fluxul controlului.
În cadrul algoritmilor pot fi folosite trei tipuri de
structuri de control:
- structura liniară
- structura alternativă
- structura repetitivă
Structura liniară
Structura liniară sau secvențială este structura în
care paşii se execută în ordinea în care au fost scrişi:
Pasul 1, Pasul 2,..., Pasul i, Pasul i+1,..., Pasul n-1,
Pasul n.
Fiecare pas predă controlul pasului următor (Pasul i
predă controlul Pasului i+1). Un pas al structurii
secvențiale se execută numai dacă au fost executați
toți paşii care îl preced. Structura secvențială nu
foloseşte decât paşi de tip acțiune şi comunicare
(pentru datele de intrare şi datele de ieşire).
Exemplu
Se introduc de la tastatură trei numere a, b, c. Să se
calculeze media aritmetică dintre a şi b şi media
aritmetică dintre b şi c.
Pentru calcularea celor două medii se vor folosi două
variabile de memorie, m1 şi m2, şi se vor executa, în
ordine, următoarele acțiuni:
Pasul 1. Început
Pasul 2. Comunică valorile pentru a, b şi c
Pasul 3. Calculează m1 (a+b)/2
Pasul 4. Calculează m2 (b+c)/2
Pasul 5. Comunică valorile lui m1 şi m2
Pasul 6. Terminat
Ordinea în care se execută cei şase paşi este ordinea
prezentată: 1, 2, 3, 4, 5, 6. oricare ar fi valorile pentru
a, b, c. Pasul 1 predă controlul Pasului 2, Pasul 2 predă
controlul Pasului 3, Pasul 3 predă controlul Pasului 4,
Pasul 4 predă controlul Pasului 5 şi Pasul 5 predă
controlul Pasului 6.
Algoritmul a fost transpus în pseudocod.
întreg a,b,c;
real m1, m2;
început
citeşte a, b, c;
m1 (a+b)/2;
m2 (b+c)/2;
scrie m1, m2;
sfârşit.
Probleme care se pot rezolva cu ajutorul structurii
secvențiale:
1. Se citesc trei numere întregi, de la tastatură. Să se
calculeze media aritmetică
2. Se citesc dimensiunile pentru laturile unui triunghi.
Să se calculeze aria şi perimetrul triunghiului.
Structura alternativă
Prin această structură, se face selectarea între două
sau mai multe acțiuni, în funcție de anumite condiții.
Există două tipuri de structuri alternative:
✓ structura alternativă simplă
✓ structura alternativă generalizată
Structura alternativă simplă
La acest tip de structură se face selectarea între două
acțiuni, în funcție de îndeplinirea sau neîndeplinirea
unei condiții. De exemplu:
✓ Dacă anul este bisect, atunci împarte totalul la 366;
altfel, împarte la 365. Condiția este tipul anului:
bisect sau nu.
✓ Dacă vânzările au scăzut, reduceți prețul cu 5%.
Condiția este scăderea vânzărilor.
✓ Dacă unghiul are 90°, este un unghi drept. Condiția
este valoarea unghiului.
✓ Dacă triunghiul are toate laturile egale, este
echilateral. Condiția este relația de egalitate între
laturile triunghiului.
✓ Dacă patrulaterul are toate laturile egale şi un unghi
de 90°, este un pătrat. Condiția este relația de
egalitate între laturile patrulaterului şi valoarea unui
unghi al patrulaterului.
✓ Dacă ai sub 18 ani, atunci eşti minor; sau dacă ai
peste 18 ani, atunci eşti major. Condiția este vârsta
de 18 ani.
✓ Dacă vei fi în oraş la ora 13, luăm prânzul împreună.
Condiția este prezența în oraş la ora 13.
✓ Dacă nu ai 10.000.000 de lei, împrumută-te la bancă.
Condiția este suma de 10.000.000 lei.
✓ Dacă valoarea polinomului este 0 pentru x=2,
polinomul se divide prin x-2. Condiția este valoarea
0 a polinomului pentru x=2.
Exemplu
Se introduce de la tastatură un număr n. Să se calculeze
inversul acestui număr, inv, definit astfel:
inv=1/n pentru n0
inv=0 pentru n=0
Altfel spus: dacă n este diferit de 0, inversul are
valoarea 1/n; altfel, are valoarea 0.
Pentru calculul inversului se vor executa, în ordine,
următoarele acțiuni:
Pasul 1. Început
Pasul 2. Comunică valoarea pentru n
Pasul 3. Dacă n<>0, atunci execută Pasul 4, altfel
execută Pasul 5
Pasul 4. Calculează inv 1/n
Pasul 5. Calculează inv 0
Pasul 6. Comunică valoarea lui inv
Pasul 7. Terminat
Executarea uneia dintre cele două acțiuni posibile
depinde de condiția precizată printr-o expresie logică.
Dacă expresia logică are valoarea "adevărat", se
execută acțiune 1, iar dacă expresia logică are valoarea
"fals", se execută acțiune 2. Cele două acțiuni pot fi
descrise printr-un singur pas sau prin mai mulți paşi.
Observați că acest tip de structură poate fi descris prin
raționamentul Dacă... atunci... altfel... sfârşit_dacă (if...
then... else... endif) pe care îl putem folosi in
pseudocod, pentru descrierea structurii.
Dacă condiție if condiție
atunci then
acțiune 1; acțiune 1;
altfel else
acțiune 2; acțiune 2;
sfârşit_dacă; endif;
Cuvântul Dacă (if) marchează începutul structurii, iar
cuvântul sfârşit_dacă (endif) sfârşitul structurii.
Cuvintele Dacă (if) şi atunci (then) delimitează expresia
logică ce se evaluează, cuvântul atunci (then) marchează
începutul secvenței de paşi care descriu acțiunea care se
va executa dacă expresia logică are valoarea adevărat.
Cuvântul altfel (else) marchează începutul secvenței
de paşi care descriu acțiunea care se va executa dacă
expresia logică are valoarea fals.
Observați că se execută secvențial Pasul 1, Pasul 2,
Pasul 3, după care ordinea secvențială este
abandonată şi se execută Pasul 4 sau Pasul 5, în funcție
de valoarea expresiei logice n<>0, după care se reia
ordinea secvențială, executându-se Pasul 6 şi Pasul 7.
Exemplul a fost transpus în pseudocod.
întreg n;
real inv;
început
citeşte n;
┌dacă n<>0
│ atunci
│ inv1/n;
│ altfel
│ inv0;
└──■sfârşit_dacă;
scrie inv;
sfârşit.
Un caz particular de structură alternativă este structura
alternativă cu o ramură vidă, în care acțiune 2 nu
conține nici un pas. Deoarece pentru valoarea fals a
expresiei logice nu se execută nici o acțiune, din
pseudocod va fi eliminat cuvântul altfel (else) care
marchează începutul secvenței de paşi ce descriu
acțiunea care se va executa dacă expresia logică are
valoarea fals.
Exemplu
Se introduce de la tastatură un număr n. Să se
înlocuiască numărul n cu modulul său, definit astfel:
modul(n)=n pentru n ≥ 0
modul(n)=-n pentru n < 0
Se vor executa, în ordine, următoarele acțiuni:
Pasul 1. Început
Pasul 2. Comunică valoarea pentru n
Pasul 3. Dacă n<0, atunci execută Pasul 4, altfel execută
Pasul 5
Pasul 4. Calculează n -n
Pasul 5. Comunică valoarea lui n
Pasul 6. Terminat
Exemplul a fost transpus în pseudocod.
întreg n;
început
citeşte n;
┌dacă n<0
│ atunci
│ n -n;
└──■sfârşit_dacă;
scrie n;
sfârşit.
Observație: În cazul structurii alternative cu o ramură
vidă, acțiunea se va executa pe ramura pentru care
condiția are valoarea adevărat. Dacă, după ce ați gândit
algoritmul, acțiunea se execută pe ramura pentru care
condiția are valoarea fals, îl veți corecta prin negarea
condiției.
Structura alternativă generalizată
La acest tip de structură, se face selectarea între mai
multe acțiuni, în funcție de o variabilă de memorie
numită selector, care poate lua mai multe valori, dintr-
o mulțime ordonată de elemente de acelaşi tip cu
selectorul. De exemplu:
✓ Dacă simbolul dintre doi operanzi este +, adună
operanzii, dacă este minus, scade din primul
operand al doilea operand, dacă este *, înmulțeşte
operanzii, iar dacă este /, împarte operanzii, iar dacă
este alt operand, expresia este eronată.
În acest caz selectorul este simbolul, iar mulțimea de
valori este formată din simbolurile: +, -, * şi /
✓ Dacă este clasa a IX-a A, sunt 27 de elevi, dacă este
clasa a IX-a B, sunt 28 de elevi, iar dacă este clasa a
IX-a C, sunt 28 de elevi. În acest caz, selectorul este
numele clasei, iar mulțimea de valori este formată
din denumirerile de clase: a IX-a A, a IX-a B şi a IX-a C.
Se introduc de la tastatură numerele întregi n, a, b şi c.
Să se calculeze valoarea lui e, definit astfel:
e=(a+b)/c pentru n=1
e=(b+c)/a pentru n=2
e=(c+a)/b pentru n=3
Pentru calculul expresiei e se vor executa, în ordine,
următoarele acțiuni:
Pasul 1. Început
Pasul 2. Comunică valorile pentru n, a, b, c
Pasul 3. Dacă n=1, atunci execută Pasul 4, altfel execută
Pasul 5
Pasul 4. Calculează e (a+b)/c. Treci la Pasul 9
Pasul 5. Dacă n=2, atunci execută Pasul 6, altfel execută
Pasul 7
Pasul 6. Calculează e (b+c)/a. Treci la Pasul 9
Pasul 7. Dacă n=3, atunci execută Pasul 8, altfel execută
Pasul 9
Pasul 8. Calculează e (c+a)/b. Treci la Pasul 9
Pasul 9. Comunică valoarea lui e
Pasul 10. Terminat.
Executarea uneia dintre acțiunile posibile depinde de
valoarea selectorului. Dacă selectorul are valoarea v1,
se execută acțiune_1, dacă are valoarea v2, se execută
acțiune_2, ..., dacă are valoarea vn, se execută
acțiune_n; altfel, se execută acțiune_n+1. Fiecare
valoare a selectorului corespunde unui caz tratat,
căruia îi corespunde o acțiune care poate fi descrisă
printr-un singur pas sau prin mai mulți paşi.
Observați că acest tip de structură poate fi descris prin
rationamentul în cazul... caz1... caz2... altfel...
sfârşit_în_cazul_că (in case... case1... case2... else...
endcase) pe care îl putem folosi în pseudocod, pentru
descrierea structurii.
în cazul că selector in case că selector
cazul v1: acțiune 1; case v1: acțiune 1;
cazul v2: acțiune 2; case v2: acțiune 2;
.............................. ..............................
cazul vi: acțiune i; case vi: acțiune i;
.............................. ..............................
cazul vn: acțiune n; case vn: acțiune n;
altfel acțiune n+1; else acțiune n+1;
sfârşit_în_caz_că; endcase;
Cuvintele în cazul că (in case) marchează începutul
structurii, iar cuvântul sfârşit_în_caz_că (endcase)
sfârşitul structurii. Cuvântul cazul (case) marchează
începutul secvenței de paşi care descriu acțiunea care
se va executa pentru acel caz şi cuvântul altfel (else)
marchează începutul secvenței de paşi care descriu
acțiunea care se va executa dacă selectorul nu a avut
valoarea nici unui caz.
Observație: Structura alternativǎ generalizată
corespunde unor structuri alternative simple
imbricate. O structură alternativă generalizată care are
n cazuri este echivalentă cu n structuri alternative
simple imbricate în care condiția logică este dată de
valoarea selectorului pentru acel caz.
Exemplul a fost transpus în pseudocod.
întreg n, a,b,c;
real e;
început
citeşte n,a,b,c;
┌dacă n=1
│ atunci e (a+b)/c
│ altfel
│ ┌dacă n=2
│ │ atunci e (b+c)/a;
│ │ altfel ┌dacă n=3
│ │ │ atunci e (c+a)/b;
│ │ └──■sfârşit_dacă; m
│ └──■sfârşit dacă;
└──■sfârşit dacă;
scrie e;
sfârşit.
întreg n,a,b,c;
real e;
început
citeşte n,a,b,c;
┌ în cazul că n
│ caz 1: e (a+b)/c;
│ caz 2: e (b+c)/a;
│ caz 3: e (c+a)/b;
└──■sfârşit_în _caz_că;
scrie e;
sfârşit.
Probleme care se pot rezolva cu ajutorul structurii
alternative:
1. Se citesc patru numere întregi de la tastatură: a, b, c
şi d. Determinați care dintre produsele a x b şi c x d
este mai mare.
2. Se citesc trei numere a, b şi c. Să se numere câte sunt
pare.
3. Se citesc trei numere a, b şi c. Să se verifice dacă ele
pot fi termenii unei progresii aritmetice.
4. Se citesc trei numere a, b şi c. Aflați dacă aceste
numere pot reprezenta laturile unui triunghi. În caz
afirmativ, calculați aria şi afişați ce tip de triunghi este
(oarecare, isoscel, echilateral, dreptunghic sau
dreptunghic isoscel).
5. Se citeşte un număr întreg n care reprezintă un an
calendaristic. Să se verifice dacă anul este bisect sau
nu (condiția ca un an să fie bisect este ca, dacă anul
nu este divizibil cu 100, să fie divizibil cu 4; altfel, să
fie divizibil cu 400).
6. Se citesc două intervale de timp exprimate în ore,
minute şi secunde (h1, m1 şi s1, pentru primul
interval, şi h2, m2 şi s2, pentru al doilea interval). Să
se calculeze suma celor două intervale de timp.
7. Se citesc trei numere reale. Să se calculeze minimul
şi maximul modulelor lor.