Extras din curs
Cap. 1
Paradigme de programare şi metode de proiectare a programelor
Noţiunea de paradigmă se bazează pe un cuvânt ce provine din limbile latină şi greacă şi care
reprezintă un exemplu sau un model. Sensul uzual al noţiunii este dat de istoricul Thomas Kuhn în
cartea sa “The Structure of Scientific Revolutions”: o paradigmă este o mulţime de teorii, standarde şi
metode ce reprezintă o modalitate de organizare a cunoştinţelor.
Bazat pe această noţiune, Robert Floyd în articolul intitulat “The Paradigms of Programming”,
defineşte noţiunea de paradigmă de programare ca fiind o metodă de conceptualizare a modului de
execuţie a calculelor într-un calculator, precum şi a modului de structurare şi organizare a taskurilor
reponsabile cu execuţia calculelor. O noţiune des utilizată în locul celei de paradigmă de programare
este cea de stil de programare, deşi semnificaţia sa nu este foarte clar definită.
Despre un limbaj de programare se spune că oferă suport pentru o paradigmă de programare, dacă
acesta pune la dispoziţie facilităţi care îl fac convenabil de a fi utilizat în acest stil.
1.1. Programarea procedurală
Aceasta este una dintre cele mai vechi şi des utilizate paradigme. Ea presupune în mod uzual
parcurgerea următoarelor etape:
a) descompunerea problemei de rezolvat în subprobleme;
b) găsirea, pentru fiecare subproblemă, a unui algoritm optim de rezolvare;
c) implementarea fiecărui algoritm folosind funcţii sau proceduri ale unui anumit limbaj de
programare.
Cel mai vechi limbaj de programare procedural este FORTRAN, însă majoritatea limbajelor de
programare actuale oferă suport pentru această paradigmă. Principalele probleme legate de
programarea procedurală se referă la tipurile de funcţii folosite (funcţii, proceduri, subprograme,
rutine, macrouri etc.), la tipul şi modul de transmitere ale parametrilor funcţiilor şi la modurile de apel
al funcţiilor.
1.2. Încapsularea datelor (modularizarea)
De-a lungul timpului, accentul în programarea procedurală s-a deplasat de la proiectarea funcţiilor la
organizarea datelor. Datele nu mai sunt privite în mod disparat, ci împreună cu funcţiile care le
prelucrează. A fost definită astfel noţiunea de modul ca reprezentând un set de funcţii înrudite,
împreună cu datele pe care le prelucrează.
Se poate astfel împărţi un program în module componente, într-un mod mai clar şi mai eficient decât
împărţirea clasică în funcţii sau proceduri, aici, datele programului fiind încapsulate (ascuse) în
modulele ce le utilizează.
În mod uzual, un modul conţine o parte de interfaţă în care sunt declarate datele şi funcţiile accesibile
din afara modulului, precum şi o parte de implementare, proprie modulului şi inaccesibilă în exterior,
în cadrul căreia sunt definite funcţiile ce manipulează datele din cadrul modulului.
Limbajul C permite programarea modulară, pe când limbajul Pascal sau Modula-2 oferă suport real
pentru un astfel de stil de programare. În limbajul Turbo Pascal noţiunea de modul corespunde celei de
unit, părţile de interfaţă şi implementare corespunzând respectiv secţiunilor interface şi
implementation.
În cazul limbajului C, partea de interfaţă se specifică, în mod uzual, într-un fişier header, care trebuie
inclus în toate celelalte fişiere ale unui program care utilizează funcţiile modulului. Partea de
implementare a modulului este realizată într-un fişier distinct care trebuie inclus în proiectul
programului.
Exemplul 1.1. Definirea şi utilizarea unui modul pentru operaţii cu numere întregi:
- Fisierul sir.h - interfata modulului
- define dim_max 100
void Initializare();
int Suma();
void Sortare();
void AdaugaElement(int);
void Listare();
- Fisierul sir.c - implementarea modulului
- include "sir.h”
static int dim;
static int v[dim_dim];
void Initializare() { dim = 0; }
void AdaugaElement(int k) { v[dim++] = k; }
int Suma() {
- codul pentru calculul sumei elementelor sirului
void Sortare() {
- codul pentru sortarea elementelor sirului
void Listare() {
- codul pentru listarea elementelor sirului
- Fisierul pr.c - utilizarea modulului sir
- include "sir.h”
void main() {
int i, s, k, n = dim_dim;
Initializare();
for(i=0; i<n; i++) {
scanf("%d”, &k);
AdaugaElement(k);
s = Suma();
printf("nSuma = %d”, s);
Sortare();
Listare();
1.3. Abstractizarea datelor
Noţiunea de abstractizare a datelor presupune posibilitatea definirii unor tipuri de date utilizator,
împreună cu un set de operaţii aferente fiecărui tip. Limbajele ce oferă suport pentru încapsularea
datelor permit şi abstractizarea, dar, în general, nu o garantează. De exemplu, în C, fişierele antet
permit declararea împreună atât a tipurilor de date, cât şi a funcţiilor.
Un tip de date abstract (ADT – Abstract Data Type) este definit printr-o mulţime de operaţii ce se pot
efectua asupra elementelor sale (acestă mulţime formează interfaţa tipului de date şi reprezintă
singurul mod de acces la tipul de date respectiv), precum şi printr-o mulţime de axiome şi precondiţii,
proprii tipului de date (care reprezintă modul de descriere a proprietăţilor şi operaţiilor tipului).
Exemplul 1.2. Definirea în limbajul C a unui tip de date reprezentând numerele fracţionare:
- Fisierul fractie.h - interfata tipului fractie
typedef struct {
int p, q; - Numaratorul si numitorul fractiei
Preview document
Conținut arhivă zip
- Programare Orientata pe Obiecte
- Capitolul_1.pdf
- Capitolul_10.pdf
- Capitolul_11.pdf
- Capitolul_12.pdf
- Capitolul_2.pdf
- Capitolul_3.pdf
- Capitolul_4.pdf
- Capitolul_5.pdf
- Capitolul_6.pdf
- Capitolul_7.pdf
- Capitolul_8.pdf
- Capitolul_9.pdf