Sunteți pe pagina 1din 367

Fundamentele

limbajelor de
programare
Suport de curs: 2009-2010
Autor: Lect. univ. dr. Horea Oros
Universitatea din Oradea
Departamentul de Matematic i Informatic

PP - Definiie
PP este o paradigm de programare
bazat pe conceptul de apel de procedur.
(rutin, subrutin, metod,funcie)
n P = o serie de pai computaionali care
trebuie parcuri.
n Orice P poate fi apelat oriunde n timpul
execuiei unui program inclusiv din
interiorul ei (apel recursiv).
n

Beneficii PP
Refolosirea codului
n Controlul execuiei este mai simplu (nu e
nevoie de GOTO, JUMP care duc la
spaghetti code)
n Programul devine modular i structurat
n

Definiii
Limbaj de programare: notaie sistematic
prin care este descris un proces de calcul
n Procesul de calcul este constituit dintr-o
mulime de pai pe care o main i
execut pentru a rezolva o problem
n Limbaj main: limbajul nativ al unui
computer
n

Limbaj main
Operaii aritmetice i logice,
n Operaii de intrare-ieire
n Funcii speciale, funcii de control
n Strns legat de arhitectur
0000101011110000
0010111111111111
0010000000000101
n

Limbaj de asamblare
Atribuie nume simbolice (mnemonici)
codificrilor operaiilor mainii i locaiilor de
memorie asociate
LOAD I
ADD
J
STORE K
n

K := I + J

Niveluri ale limbajelor


Limbaje de nivel sczut (lb. main, asm)
n Limbaje de nivel nalt (C, C++, C# etc.)
n Traducerea este realizat de translatoare
(compilator, asamblor)
n Traducerea duce la scderea performanei
n Lb. nivel nalt
portabilitate
n

Paradigme de programare
Colecii individualizate de caracteristici de
evaluare i criterii de abstractizare care
determin i difereniaz clasele de
limbaje de programare
n Criterii:
n

structura

programului
noiunea de stare a execuiei
metodologia programrii

Paradigme de programare
1.
2.
3.
4.

5.

Programare nestructurat (GOTO)


Programare structurat
Programarea procedural (ALGOL60)
Programare funcional (Lisp, Miranda,
ML, Haskell)
Programare imperativ

Paradigme de programare
6.

7.
8.

9.
10.

Programare declarativ (Prolog, Haskell, SQL,


WSDL)
Programare logic (Prolog)
Programare bazat pe obiecte i orientat pe
obiecte (Smalltalk, C++, Java, C#)
Programare concurent i distribuit
Programare la nivelul bazelor de date (SQL)

Generaii de limbaje
1954-1958 Limbajele de programare de
prima generaie (FORTRAN I, ALGOL 58).
n Acestea au fcut pasul decisiv de la asm
la lb de nivel nalt.
n Rolul lor primordial a constat n
promovarea i dezvoltarea conceptelor ce
stau la baza limbajelor de programare de
nivel nalt precum i a implementrii lor.
n

Generaii de limbaje (cont.)


1959-1961 Limbaje de generaia a doua
(ALGOL60, FORTRAN II, Cobol, Lisp)
n Sunt considerate limbaje stabile, durabile,
ALGOL60 a avut o influen imens n
dezvoltarea limbajelor Pascal, PL/1,
Simula i Ada.
n

Generaii de limbaje (cont.)


n
n
n
n
n

1962-1971 Limbaje de generaia a treia (PL/1,


ALGOL68, Pascal, Simula)
au reprezentat un pas nainte,
succesul lor nu se poate compara cu cel al limbajelor de
generaia a doua.
C.A.R. Hoare ALGOL60 reprezint un pas nainte fa
de succesorii(!) si.
Limbajul PL/1 a combinat elemente de FORTRAN,
ALGOL i Cobol rezultnd un limbaj puternic, dar mult
prea complex, dificil de nvat i de implementat.
Limbajul Pascal, succes din punct de vedere didactic, nu
a fost considerat suficient de robust pentru utilizarea la
scar industrial. (Delphi)

Generaii de limbaje (cont.)


n
n

1972-1979 Limbaje de generaia a patra (CLU, CSP,


Ada, Smalltalk)
Au avut o rspndire i mai redus dect cele de
generaia a treia, justificnd pe bun dreptate denumirea
acestei perioade drept gol de generaie (generation
gap).
accentul cade pe structurare.

La nivel micro acest lucru s-a fcut prin eliminarea instruciunilor


goto
la nivel macro s-a pus mare accent pe modularizare,
abstractizarea datelor

Generaii de limbaje (cont.)


1980-1990 Paradigme ale limbajelor de
programare
n Aceast perioad se caracterizeaz printro intens activitate de cercetare,
concentrat pe studiul paradigmelor
asociate claselor de limbaje.
n limbaje funcionale, logice, orientate obiect
i distribuite
n

Istoria lb. de programare


n

Primul limbaj
Ada

Lovelace scrie programe pentru proiectul


motor diferenial al lui Charles Babbage iar
mai apoi pentru motorul analitic. n 1945,
germanul K. Zuse, inventatorul calculatorului
Z3 a definit un limbaj evoluat pentru acest
motor (folosind tablouri i nregistrri)

Istorie (cont.)
n

Asamblare
Asambloarele

au aprut o dat cu primele


calculatoare. Acestea asociaz un nume simbolic
codului la nivel main, de ex: Add bx, 4
cmp [adr], 3
jmp address

Programarea n limbaj de asamblare nu se mai


practic pe scar larg, nici mcar pentru rutine
ce trebuie s ruleze foarte rapid.

Istorie (cont.)
n

FOTRAN FORmula TRANslator


1954-1958John

Backus i ali cercettori de la

IBM
Limbaj dedicat calculelor matematice
n

Fortran II (1958) introduce subrutine,


funcii, bucle, o structur de control
primitiv de tip FOR. Identificatorii sunt
limitai la ase caractere

Istorie (cont.)
n

LISP LISt Processing


1958-1960

Mac Carthy
Limbaj funcional pentru procesarea listelor.
Este recursiv, nu este iterativ.
Nu exist diferen ntre cod i date.

Istorie (cont.)
n

ALGOL - 1960 / Algol W - 1966 / Algol 68


ALGOrithmic Language
limbaj

universal independent de main


Introduce utilizarea gramaticilor BNF (Backus Naur
Form)
blocurile de instruciuni i variabilele locale n cadrul
unui bloc
Recursivitatea, tablouri dinamice
instruciunea IF THEN ELSE, FOR, simbolul := pentru
atribuire (folosit mai apoi n Pascal), instruciunea
SWITCH cu GOTO, indicatori BEGIN, END i ciclu
WHILE

Istorie (cont.)
n

Cobol - 1960
COmmon

Business Oriented Langage.


Definit de CODASYL,
COnference on DAta SYsystems Languages.

Istorie (cont.)
n

Basic 1964
Beginners

All-purpose Symbolic Instruction Code


John Kemeny, Thomas Kurtz
Uor de nvat
Bill Gates, Paul Allen, QuickBasic Altair (4KB)
Microcomputerele au fost furnizate cu Basic n ROM
pn la sfritul anilor 80.
n 1977, Appel II se vindea cu Basic
Primul PC de la IBM (1981) folosea sistemul de
operare MS-DOS de la Microsoft i Basic interpretat
(Basica).
n 1982 Microsoft a produs primul Basic compilat
(Quick Basic)

Istorie (cont.)
n

Logo 66
W

Fuerzeig, S Papert,
Folosit pentru a-i nva pe copii programare.
Asemntor cu Lisp
Se bazeaz pe micarea unei broate
estoase pe ecran.

Istorie (cont.)
n

Pascal 1970 Niklaus Wirth.


A

fost proiectat pentru a simplifica crearea


compilatoarelor i pentru ndruma procesul de
nvare a programrii spre programarea structurat.
Includea un mediu pentru dezvoltare de aplicaii
complet, un principiu folosit cu succes mai trziu n
Turbo Pascal. n 1981, jocul Wizardry scris n Pascal
a avut un succes foarte mare pe Apple.
Turbo Pascal (proiectat de Anders Hejlsberg) a
aprut n 1983. Rapid, IDE complet -> succes
instantaneu.
Structurile de control asemntoare cu cele din C.

Istorie (cont.)
n
n
n
n
n
n
n
n
n

C 1973 succesorul lui B, care la rndul lui este


succesorul lui BCPL (Dennis Ritchie).
A fost destinat pentru programarea sistemului de
operare UNIX,
Portabil i rapid
Declaraiile int i, char b au fost create n C.
Ulterior au aprut i alte tipuri.
Limbajul C a simplificat scrierea prin folosirea acoldelor.
++ exista i n limbajul B.
Cuvntul include venea din PL/1.
Preprocesorul a fost implementat n 1973 i din acel
moment limbajul C a fost folosit pentru scrierea
sistemului de operare Unix. Limbajul a evoluat pn n
1980.

Istorie (cont.)
n

Sql - 1970+
Standard

Query Language
IBM Limbaj pentru interogarea bazelor de
date relaionale.
SELECT * from table where ...
n INSERT INTO ....
n UPDATE ...
n

Istorie (cont.)
n

C++ 1981-1986 Bjarne Stroustrup.


a limbajului C orientat pe obiecte.
Introduce suprancrcarea operatorilor.
Metodele pot fi inline.
Implementat motenirea i abloanele (clase
sau funcii generice).
Polimorfismul prin funcii virtuale
Versiune

Istorie (cont.)
n

Java 1994 James Gosling,


Sun

Microsistems Proiectat n 1991 ca un limbaj


interactiv numit Oak.
La vremea respectiv nu a avut succes.
n 1994 a fost rescris pentru Internet i redenumit
Java.
n 1995 se puteau crea applet-uri.
n ianuarie 1996, Javasoft distribui JDK 1.0.
Se compileaz n bytecode JVM.
Este mai simplu dect C++: memoria este gestionat
automat,
nu exist pointeri, motenire multipl,
suprancrcarea operatorilor dar include multi-tasking.

Istorie (cont.)
n

PHP 1995 Personal Home Pages Hypertext


Processor
Rasmus

Lerdorf Limbaj script mutliplatform, ce se


include n HTML.
Asemntor cu C dar nu este tipizat.
Variabilele se prefixeaz cu $.
Interpretorul prelucreaz pagina html ce include
instruciuni php i o transform ntr-o pagin html
pur.
Biblioteca de funcii permite crearea de pagini web
dinamice.
Microsoft folosete ASP (asemntor cu Basic)

Istorie (cont.)
n

UML - 1996 Unified Modeling Language


Standard

(Object Management Group)


Grady Booch, Jim Rumbaugh, and Ivar Jacobson
Uml reprezint reunirea a trei limbaje de modelare
proiectate de cei trei autori.
folosete o notaie grafic pentru a proiecta software.
Se fac diagrame care exprim obiecte i interaciunile
dintre acestea.
Un model este realizat din vizualizri i combinarea
lor descriu un sistem complet.
Este limbaj pentru specificarea, vizualizarea,
construirea i documentarea proiectelor sotware
intense.

Istorie (cont.)
n

C# - 2000(C-sharp), succesor al C++?


Anders Hejlsberg / Microsoft.
Principalul limbaj din platforma .NET
mbuntiri: garbage collector, nu are

pointeri,

interfee, multi-tasking
Varietate de limbaje ce pot fi compilate n MSIL
Structurile sunt speciale fiind transmise prin valoare
Identificatorii sunt obiecte cu metode
Atributele sunt obiecte descriptive ataate
elementelor programului i folosite la execuie
Proprieti (get/set)
Foreach pentru parcurgerea unor liste de obiecte
Delegai (nlocuiesc pointerii la funcii din C)

Programare
procedural
Procesul de creare a software-ului

Curs 2

Procesul de creare a soft-ului


Limbaj de programare = instrument pentru
scrierea de programe
n Limbaj de programare = component a
procesului de creare a software-ului
n Realizarea unui nou limbaj este structural
identic cu realizarea unei aplicaii
software complexe
n

Fazele procesului de creare a


software-ului
Analiza i specificarea cerinelor
n Proiectarea i specificarea softwareului
n Implementarea
n Certificarea
n ntreinerea
n

Analiza i specificarea cerinelor


n
n
n
n

O aplicaie software este conceput pentru a veni n


sprijinul unui anumit grup de utilizatori poteniali.
Cerinele - stabilite sub forma unui document ce
precizeaz CE trebuie s fac aplicaia i nu CUM.
La elaborarea documentului particip att potenialii
utilizatori, ct i specialitii n dezvoltarea de software.
Documentul conine specificaii privind manualele
utilizator, studii de cost i fezabilitate, cerine privind
performanele

Proiectarea i specificarea
software-ului
n

De la cerinele specificate n faza precedent, echipa


care realizeaz aceast etap (proiectanii software)
realizeaz specificaiile de proiectare,
Se identific

fiecare modul al sistemului,


interferenele dintre module.

Metodologia de proiectare utilizat n aceast faz are o


mare importan pentru alegerea limbajului de
programare utilizat n faza imediat urmtoare.

Implementarea
n
n

Singura faz n care se utilizeaz explicit un


limbaj de programare.
Implementarea
scrierea

de uniti de program corespunztoare


modulelor descrise n specificaiile de proiectare
editarea documentaiei corespunztoare.
n

Rezult un sistem implementat i documentat


complet.

Certificarea
n
n

n
n

Verificarea cerinelor impuse n prima etap


Se realizeaz prin testarea sistemului n raport
cu fiecare cerin specificat, utilizndu-se o
baterie de teste,
Din punctul de vedere al testrii, nu se poate
face o distincie clar ntre fazele 3 i 4.
n faza de implementare se realizeaz testarea
la nivel de modul, efectuat de fiecare
programator i parial testarea interfeelor intermodule (testare de integrare),

Certificarea (cont.)
Se realizeaz testarea sistemului, care
verific sistemul n ansamblul su.
n Rezultatul acestei faze este un sistem
verificat i certificat complet, livrabil
utilizatorilor.
n n aceast faz se includ toate activitile
care sunt legate de verificarea
corectitudinii programelor scrise
n

ntreinerea
Modificri, provocate fie de detectarea
unor erori care au scpat din faza 4,
n Adugarea de noi specificaii (cerine).
n Costul ntreinerii unei aplicaii ntrece
costul tuturor celorlalte faze luate
mpreun.
n

Cerine pentru un produs


software
Fiabilitate
n ntreinere uoar
n Execuie eficient
n

Aspecte ale calitii software-ului


Programele: fiabile, rapide, uor de
folosit, lizibile, modulare, structurate
n Calitatea produselor program se definete
ca o compunere a mai multor trsturi.
n Exist o serie de factori externi i factori
interni
n

Factori externi - interni


Factorii externi de calitatea sunt sesizai
de cei care interacioneaz direct cu
produsul final i care cumpr produsul,
contracteaz dezvoltarea i ntreinerea
lui.
n Factorii interni de calitate se pot detecta
doar de ctre persoanele implicate n
procesul de dezvoltare de software.
n

Factorii externi
Corectitudinea (abilitatea produsului de a
executa exact sarcinile sale, n
conformitate cu cerinele)
n Robusteea (abilitatea sistemului de a
funciona chiar i n condiii anormale)
n Fiabilitate = corectitudine+robustee
n

Factorii externi (cont.)


Extensibilitatea (uurina cu care
produsele software se pot adapta la
schimbri ale specificaiilor) simplitate +
descentralizare
n Reutilizabilitatea
n Compatibilitatea (uurina cu care
produsele software pot fi combinate)
n

Factorii externi (cont.)


Eficiena (folosirea raional a resurselor
hardware)
n Portabilitatea (uurina cu care se pot
transfera n diverse medii hard i soft)
n Verificabilitatea
n

Factorii externi (cont.)


Integritatea (abilitatea produselor software
de a-i proteja componentele - programe,
date, documente - fa de accesri i
modificri neautorizate)
n Uurina n utilizare (nvarea utilizrii
sistemului, operarea, pregtirea datelor de
intrare, interpretarea rezultatelor i
recuperarea din situaii de eroare)
n

Factori interni
Modularitatea: structural produsul program
trebuie s fie alctuit din module,
urmrindu-se principiul descentralizrii.
n Documentarea complet: presupune
existena unei documentaii clare i adus
la zi pentru fiecare faz din ciclul de via
al programului.
n

Caliti ale limbajelor de


programare
n

S permit o descriere ct mai natural a


problemei care se rezolv, permind
programatorului s se concentreze asupra
problemei i nu asupra detaliilor de adresare,
indexare etc.
S aib un grad de lizibilitate ct mai ridicat,
adic un program s poat fi uor de descifrat
(sintactic i semantic) de oricine l consult.
S permit gestiunea excepiilor (depiri
aritmetice, erori de intrare-ieire etc.)

Microsoft Solutions Framework


(MSF)
Un set de modele, principii i linii
directoare pentru proiectarea i
dezvoltarea aplicaiilor de dimensiuni mari
ntr-un mod care asigur faptul c toate
elementele unui proiect (oameni, procese,
unelte) pot fi gestionate corespunztor.
n Practici pentru planificarea, proiectarea,
dezvoltarea i lansarea soluiilor
n

Modele de proces
Modelul Cascad
n Modelul Spiral
n Modelul MSF
n

Modelul cascad
n
n
n

Milestone
n

Exist puncte de tranziie i evaluare


Trebuie terminat o faz nainte de a
trece la alta
Cerinele trebuie s fie definite foarte
clar
Se poate monitoriza evoluia

Milestone

Milestone

Milestone

Modelul Spiral
Se bazeaz pe rafinarea continu a
cerinelor i a diferitelor estimri asupra
proiectului
n Util la aplicaii mici ce trebuie fcute
repede
n Nu exist puncte de control foarte clare
n Procesul de dezvoltarea poate deveni
haotic
n

Modelul MSF
Bazat pe faze
n Are puncte de control i trecere
n Iterativ
n Poate fi folosit pentru dezvoltarea oricrui
tip de aplicaie
n Combinaie ntre modelul cascad i
spiral
n

Faze ale modelului de proces MSF


Envisioning
n Planning
n Developing
n Stabilizing
n Deploying
n

Triunghiul compromisurilor

Deadline

Resurse

Funcionalitate

Programare
procedural
Elemente lexicale i de sintax ale
limbajelor de programare

Curs 3

Programare procedural

Limbaj de programare,
program surs
Un limbaj de programare = un instrument
cu care se poate exprima un proces de
calcul
n Program surs = nivelul virtual al
abstractizrii problemei de rezolvat
n

Programare procedural

Procesul de traducere
Pentru ca maina (calculatorul) s poat
rezolva problema, aceasta trebuie
exprimat n termenii limbajului mainii
respective
n Nivelul fizic al abstractizrii va fi atins prin
intermediul unui proces de traducere.
n

Programare procedural

Rezolvarea unei probleme cu


calculatorul
formalizarea problemei i exprimarea ei
ntr-un limbaj de programare. (definire,
specificare, analiz, proiectare i
implementare). Rezultatul obinut este
programul surs. (omul)
n traducerea programului surs ntr-un
program executabil pe calculator i
execuia acestuia. (maina)
n

Programare procedural

Limbaje de programare
n Setul

de caractere
n Elementele lexicale i de sintax ale
unui limbaj
n Traducerea
programelor (analiza
sintactic i semantic)

Programare procedural

Setul de caractere
n
n

n
n

LP sunt bazate pe un anumit alfabet de


caractere
Alfabetul este folosit pentru a construi cuvinte
sau simboluri, care formeaz vocabularul sau
lexicul limbajului
Alfabet = a...z, A...Z, 0...9, caractere speciale
ASCII, ASCII extins, EBCDIC, Unicode.

Programare procedural

Elementele lexicale ale unui


limbaj
n
n

Program = secven de atomi lexicali (tokens) i


separatori
Atom lexical = cea mai mic unitate sintactic ce
are un neles de sine stttor ntr-un context
precizat
Analiza lexical =faz a procesului de analiz a
programului surs care are ca scop identificarea
atomilor lexicali din care este compus programul
respectiv
Programare procedural

Categorii de atomi lexicali


simboluri speciale
n identificatori
n etichete
n literali
n

(separatorii nu sunt considerai atomi lexicali)

Programare procedural

Exemplu
n

i f ( a > b ) x= x+ 1 e ls e y = " He l lo !" ;


identificatori: i f , a , b , x , e l s e , y
simboluri speciale: ( , ) , > , = , +
literali: 1 , " H e l l o ! "

Programare procedural

Separatori
Separatorii uzuali (spaiile albe)
n Comentariile:
n

Text

/*...*/
Linie //
Alte limbaje { }
HTML <!-- ... -->
(Sunt ignorate n procesul de analiz lexical )
Programare procedural

10

Identificatori, cuvinte cheie i rezervate


Identificator = secven arbitrar de litere,
cifre i underscore din alfabetul limbajului,
din care primul caracter este liter sau
underscore
n Lungime a identificatorului = numrul de
caractere din secven (unele limbaje
stabilesc limite, altele depind de
implementare)
n

Programare procedural

11

Identificatori, cuvinte cheie i rezervate


(cont.)
Case sensitive = se face diferena ntre
literele mari i mici (C, C++, Java)
n Case insensitive (Pascal, Modula-2,
FORTRAN)
n n C cuvintele rezervate se scriu numai cu
litere mici (if, else, while, for etc.)
n

Programare procedural

12

Identificatori
n

Predefinii = precizai n definiia limbajului


cuvinte

cheie (au un neles explicit ntr-un


context precizat. De ex. n FORTRAN
cuvintele cheie o anumit semnificaie doar
ntr-un anumit context)
cuvinte rezervate = se folosesc doar n scopul
pentru care au fost definite indiferent de
context
n

Definii de utilizator
Programare procedural

13

Identificatori definii de utilizator


Nume de variabile, Constante
n Proceduri, Funcii, Metode
n Clase, Tipuri de date definite de utilizator
n Obiecte, Proprieti
n Evenimente, Delegai
n

Programare procedural

14

Cuvinte cheie C
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

Programare procedural

15

Simboluri speciale
Simbolurile speciale (numite i operatori
sau semne de punctuaie, delimitatori) au
o semantic bine precizat.
n n unele limbaje se pot folosi doar conform
definiiei lor
n n alte limbaje semantica se poate extinde,
prin ceea ce se numete suprancrcarea
operatorilor.
n

Programare procedural

16

Simbolurile speciale n C
Operatori sau semne de punctuaie: ! % ^
&*()-+={}|~[]\;:<>?,./
n Operatori (fiecare considerat un singur
token): -> ++ -- << >> <= >= == != && || *=
/= %= += -= <<= >>= &= ^= |=
n Tokeni folosii de preprocesor: #
n

Programare procedural

17

Literali (ad-litteram?)
Literal = o valoare constant de tip
numeric sau caracter.
n Constante:
n

numerice

(ntregi i reale)

caracter
ir

de caractere

Constante constante simbolice!


Programare procedural

18

Literali din limbajul C


Literal::= constant ntreag | constantcaracter | constant-flotant | literal ir de
caractere (BNF)
n Constant ntreag = iruri de cifre
n

Zecimal

(123, -234, 1u, 1U)


Octal (0564)
Hexazecimal (0xFA2E, 0X1AB4)
Programare procedural

19

Literali din limbajul C (cont.)


n

Constant caracter = unul sau mai multe


caractere incluse ntre apostroafe (a, 1)
Tipul

= char
Valoarea = valoarea codului ASCII al
caracterului
n

Constante caracter predefinite (secvene


escape)
Programare procedural

20

Secvene escape
Caracter ASCII
NL new line
HT tab orizontal
VT tab vertical
BS backspace
CR carriage return
FF form feed
BEL bell
\
?

nr. octal
nr. hexa

secvena escape
\n
\t
\v
\b
\r
\f
\a
\\
\?
\
\ooo
\xhh
Programare procedural

21

Constante reale
n

Constantele reale au

n
n
n

parte ntreag,
marc zecimal,
parte fracionar,
marc exponent (e sau E)
exponent ntreg cu semn.

Tipul lor este implicit double, care poate fi modificat


printr-un sufix (F sau f float, L sau l long double).
Partea ntreag sau partea fracionar pot lipsi (dar nu
ambele),
Pot lipsi i marca zecimal sau marca exponenial (nu
ambele).
Programare procedural

22

Constantele ir de caractere
n
n
n
n

Constantele ir de caractere = unul sau mai


multe caractere incluse ntre ghilimele.
Tipul char[]
Clasa de memorie static.
Reprezentarea unui ir de caractere se face pe
n+1 octei, ultimul octet coninnd caracterul
NULL (cu codul ASCII 0).
null-terminated strings.
Programare procedural

23

Elemente de sintax
Succesiunile de cuvinte = propoziii sau
instruciuni
n Sintaxa unui LP = un ansamblu de reguli
prin care se determin dac o anumit
instruciune este corect alctuit sau nu.
n

Programare procedural

24

Elemente de sintax (cont.)


n

Sintax abstract: identific rolul componentelor


fiecrei construcii; descrierile de limbaj i
implementrile sunt organizate n jurul sintaxei
abstracte.
Sintaxa concret (lexical): prezint modul de
scriere a construciilor limbajului, coninnd
detalii relativ la plasarea cuvintelor cheie i a
semnelor de punctuaie.

Programare procedural

25

Elemente de sintax (cont.)


La aceeai sintax abstract i corespund
sintaxele concrete:
WHI LE x < >A[ i] DO
i := i - 1
END
i
whi le (x != A[i ]) i = i - 1 ;
n

Programare procedural

26

Moduri de descriere a sintaxei


BNF (Backus-Naur Form)
n grafele de sintax
n gramatici (limbaje formale)
n automate (limbaje formale)
n

Programare procedural

27

Programare
procedural
Traducerea programelor
Curs 4

Programare procedural

Limbaj de programare,
program surs
n

Translator = program ce traduce un


program surs (PS), scris ntr-un anumit
limbaj de programare (LP) ntr-un program
echivalent exprimat ntr-un alt limbaj, pe
care l vom numi program destinaie (PD).

Programare procedural

Translatoare
Compilatoarele,
n Asambloarele
n Interpretoarele
n

Programare procedural

Compilatoare - asambloare
La compilator PD se numete program
obiect sau cod obiect (apropiat de codul
main)
n Asamblorul este compilatorul unui limbaj
de asamblare
n Traducerea este urmat de link-editare
n

Programare procedural

Link-editarea
n

Faz n care se produce codul executabil


prin legarea codului obiect (rezultat din
traducere) cu alte module obiect (rezultate
din compilri anterioare sau existente n
biblioteci).

Programare procedural

Interpretor
n

Realizeaz execuia instruciune cu


instruciune a programului surs

Programare procedural

Preprocesor - macroprocesor
Traduc PS din limbaje de nivel nalt n PD
scrise tot n limbaje de nivel nalt,
compilabile.
n De ex. preprocesorul C #include...
n

Programare procedural

Cross-compilatoarele
Cross-asambloarele
Se execut pe un calculator gazd i
genereaz cod obiect pentru o alt main
obiect
n Exemplu - maina gazd minicalculator
sau calculator mare, iar maina obiect
este un microcalculator cu memorie mic,
pe care nu se poate implementa
programul de traducere)
n

Programare procedural

Compilarea
Compilatorul este un program complex, a
crui realizare presupune abordarea
sistematic a procesului de traducere.
n n procesul de compilare, PS sufer un ir
de transformri n cascad, din ce n ce
mai apropiate de codul obiect
n

Programare procedural

Operaii ale compilatorului


Analiza textului surs
n Sinteza codului obiect
n

Programare procedural

10

Structura unui compilator


ANALIZ
Program
surs

SINTEZ

ir de atomi
lexicali

Analiz
lexical

Arbore
sintactic

Analiz
sintactic

Tratarea erorilor

Cod
intermediar

Analiz
semantic

Cod intermediar
optimizat

Optimizare
de cod

Generare
de cod

Cod obiect

Gestiunea tabelelor

Programare procedural

11

Analiza lexical
n

Realizeaz prima parcurgere a PS


(considerat ca ir de caractere), grupnd
aceste caractere n sub-iruri, numite
atomi lexicali: cuvinte cheie sau rezervate,
operatori, constante, identificatori,
separatori.

Programare procedural

12

Analiza sintactic
n

Depisteaz n irul atomilor lexicali


structuri sintactice: expresii, liste,
instruciuni, proceduri, genernd arborele
sintactic (arborele de derivare), care
descrie relaiile dintre aceste structuri (de
incluziune, de separare).

Programare procedural

13

Analiza semantic
n

folosete arborele sintactic pentru extragerea de


informaii privind apariiile obiectelor purttoare de date
din PS (tipuri de date, variabile, proceduri, funcii) i
pentru verificarea consistenei utilizrii lor.
Pe msura parcurgerii arborelui sintactic, se genereaz
codul intermediar (ir de instruciuni simple, cu format
fix, n care: codurile operaiilor sunt asemntoare cu
codurile main corespunztoare, ordinea operaiilor
respect ordinea execuiei, iar operanzii sunt
reprezentai sub forma variabilelor din PS i nu sub
form de registre sau adrese de memorie.
Programare procedural

14

Optimizarea codului intermediar


n

are ca obiectiv eliminarea redundanelor, a


calculelor inutile, pentru o execuie eficient a
codului obiect.
Pentru realizarea se ncearc:
Realizarea

tuturor calculelor posibile nc din faza de


compilare (de exemplu n expresii cu operanzi
constante)
Eliminarea subexpresiilor comune (prin evaluarea lor
o singur dat)
Factorizarea invariaiilor din cicluri.

Programare procedural

15

Generarea programului obiect


n

Const n alocarea de locaii de memorie i registre ale


unitii centrale pentru variabilele programului i
nlocuirea codurilor de operaii din codul intermediar cu
cele main.
Codul obiect rezultat poate fi:

absolut (direct executabil)


relocabil (care va face obiectul editrii de legturi, unde va fi
legat de alte module obiect
n limbaj de asamblare, lucru ce asigur un efort mic de
implementare a generatorului de cod.
n alt limbaj de programare, n cazul preprocesoarelor.

Programare procedural

16

Modulul de tratare a erorilor


n

Proceduri care sunt activate la detectarea


erorilor n timpul operaiilor de analiz.
Traducerea

se continu cu ignorarea
elementului ce conine eroarea;
Se ncearc corectarea erorii
Se abandoneaz procesul de traducere.

Programare procedural

17

Modulul de tratare a erorilor


n

Dup momentul n care apar avem erori


lexicale,
sintactice
semantice.

Dup gravitatea erorilor:


avertismente (de obicei omisiuni de programare),
erori care se pot corecta de ctre un compilator mai

inteligent
erori fatale, care provoac abandonarea procesului
de compilare.

Programare procedural

18

Gestionarul de tabele
n

Colecie de proceduri care realizeaz crearea i


actualizarea bazei de date a compilatorului, care
conine dou categorii de informaii:
proprii

compilatorului (generate la implementare i


constituite din mecanismele de descriere a analizei
lexicale, sintactice i semantice)
caracteristice programului surs (identificatori,
constante, cuvinte cheie), care de obicei se
memoreaz ntr-o tabel de simboluri.

Programare procedural

19

Gestionarul de tabele
n

La ntlnirea unui nume nou, acesta este


introdus n tabela de simboluri, reinndu-se
adresa intrrii.
Ori de cte ori numele este referit, informaia
prezent n tabel este actualizat cu informaii
sau atribute noi ale numelui respectiv,
verificndu-se totodat consistena utilizrii
acestuia (analiza semantic).
La generare de cod, atributele numelui
determin lungimea zonei de memorie alocat
acestuia. Atributele numelui pot servi i n faza
de tratare a erorilor.
Programare procedural

20

Uniti de program
n

Structura general a unui program scris


ntr-un limbaj de programare convenional
(imperativ, dirijat de control)
Program

principal
Unul sau mai multor subprograme
n

Comunicarea prin:
Parametri,
n Variabile globale.
n

Programare procedural

21

Program - subprogram
n

2 pri
partea
n

de declaraii (instr. neexecutabile )

informaii descriptive adresate compilatorului


atribute ale zonelor de date cum ar fi tipul,
dimensiunea de reprezentare,
valori iniiale

imperativ (instruciunile ce se vor


executa)

partea

Programare procedural

22

Compilare separat
Posibil datorit modularizrii programelor
n Fiecare modul are un rol bine precizat
n La modificarea unui modul nu trebuie
recompilat tot programul.
n Combinarea modulelor o face link-editorul
n Rezultatul = economie de timp
n Demonstraie n C (cuv. cheie extern)
n

Programare procedural

23

Link-editarea
n

Link-editorul sau editorul de legturi este o


component a mediului pentru dezv. de
aplicaii care grupeaz unul sau mai multe
module obiect, rezultate din compilare sau
asamblare, mpreun cu cod din biblioteci,
ntr-un program executabil.

Programare procedural

24

Execuia programelor
n

operare la nivelul liniei de comand: se introduc


pe rnd comenzile de compilare, link-editare i
lansare n execuie;
asistat de un mediu de programare: comenzile
de mai sus sunt lansate i executate din
interiorul unui astfel de mediu;
sistem batch (prelucrare n loturi): scrierea unor
fiiere de comenzi care vor automatiza
nlnuirea fazelor de la punctul 1.
Programare procedural

25

Sisteme de operare
n

SO interactive
Comunicaia

prin terminal sau interfa grafic

Comenzi

Interne (rezidente n nucleul SO)


n Externe (fiiere executabile)
n

Multitasking, multithreading

Programare procedural

26

Medii de programare i execuie


n

Sisteme complexe destinate activitii de


dezvoltare de programe
editor de texte
compilator interactiv
editor de legturi
interpretor pentru execuia

rezultatului compilrii
(numit i mediu de execuie runtime environment),
depanator simbolic
componente de legtur cu mediul exterior (de regul
cu sistemul de operare cu care lucreaz

Programare procedural

27

Medii de programare
Visual Studio de la Microsoft,
n Builder de la Borland
n Eclipse
n ZEND Studio (PHP)
n

Programare procedural

28

Interpretarea
Interpretorul este un program care execut
pas cu pas instruciunile descrise ntr-un
limbaj
n Viteza de interpretare este mult mai mic
dect codului compilat
n Mult mai simplu de implementat
n

Programare procedural

29

Programare
procedural
Declaraii
Curs 5

Programare procedural

Coninuturi
Rolul identificatorilor ntr-un program
n Domeniu de vizibilitate
n Semantica unei declaraii
n

Programare procedural

Rolul identificatorilor ntr-un


program
n

Identificatorii sunt nume pentru diverse entiti:


constante

simbolice
tipuri de date
variabile
subprograme
module
programe
cmpuri n nregistrri

Programare procedural

Identificatori
Dup declarare un identificator va referi n
mod unic o entitate din program
n Prezen numelui su (nsoit eventual de
alte elemente suplimentare) va reprezenta
pentru programul traductor o referire
neambigu la entitatea n cauz.
n

Programare procedural

Domeniu de vizibilitate
n pri diferite ale aceluiai program surs
sau n module diferite ale unui program se
pot folosi identificatori identici.
n Rezolvarea conflicte de nume se face pe
baza regulilor de vizibilitate a numelor
n

Programare procedural

Domeniu de vizibilitate (cont.)


A aprut la limbajele cu structur de bloc
n O declarare a unui nume stabilete
domeniul su de vizibilitate
n DV ncepe de regul imediat dup punctul
de declarare i se ncheie la sfritul
blocului sau funciei sau fiierului surs
n

Programare procedural

Domeniu de vizibilitate (cont.)


n

Identificatori locali
declarat

n interiorul unui subprogram DV toat


secvena de declaraii i instruciuni de dup punctul
de declarare i pn la sfritul subprogramului
respectiv (inclusiv blocurile sau subprogramele sale
(exc. redeclarare)

Identificatori globali
DV

de la punctul de declarare pn la sfritul


fiierului surs (exc. redeclarare)

Programare procedural

Universul unui LP
n
n

Format din obiectele specifice puse la dispoziie


de limbaj pentru modelarea problemelor.
Prin aceste obiecte, programatorul simuleaz
comportamentul obiectelor sale sau realizeaz
noi obiecte, mai complexe, cu proprieti noi.
Pe lng aceste obiecte specificate prin declaraii,
limbajul pune la dispoziia programatorului
operaii asupra acestora (instruciuni).

Programare procedural

Semantica unei declaraii


Obiectele ULP sunt datele (elementare
sau structurate).
n Datele au anumite caracteristici (precizate
prin declaraii)
n

Nume
Tip
Valoare
Modificabilitate

Programare procedural

Semantica unei declaraii


Unei constante simbolice i se asociaz
printr-o declaraie un obiect din ULP,
acelai pe tot parcursul execuiei
programului
n O variabil are asociat o locaie de
memorie care poate, la un moment dat, s
conin un obiect dintr-o mulime de valori
posibile
n

Programare procedural

10

Semantica unei declaraii


n
n
n
n

Mulime de valori posibile = dom. de def. al


variabilei sau domeniul tipului variabilei
Locaia de memorie = poziia de la care ncepe
alocarea variabilei respective
Precizarea tipului pentru constante i variabile
se face prin declaraii
Informaia de tip asociat unui obiect servete la
determinarea gamei de operaii care se pot face
cu acel obiect
Programare procedural

11

Semantica unei declaraii


LP moderne permit declararea de noi tipuri
(tipuri derivate ) bazate pe tipurile
existente
n Un tip de date definit de utilizator e indicat
s aib acelai statut ca i un tip de date
predefinit:
n

Declararea

i folosirea variabilelor,
Verificarea consistenei expresiilor de acel tip
Programare procedural

12

Programare
procedural
Declaraii
Curs 6

Programare procedural

Coninuturi
Declaraii de constante
n Declaraii de tipuri de date
n Sisteme de tipuri
n Clasificarea tipurilor de date
n Declaraii de tipuri n C
n

Programare procedural

Declaraii de constante
n
n

Constantele simbolice i pstreaz valoarea pe


tot parcursul execuiei unui program
Ex.
PI

:= 3.1415

Ofer
Uurin

n scrierea programelor
Expresivitate
Flexibilitate - PI := 3.141592653595

Programare procedural

Declaraii de constante
n
n
n

constant simbolic = (nume, valoarea asociat)


C nu are aa ceva
Pascal, C++, C# au

Cum se face declaraia de constant?


Admite numai constante de tipuri simple sau i folosirea
constantelor de tipuri structurate?
Valoarea constantei se d printr-un literal sau printr-o expresie
evaluabil (i cnd: la compilare sau la execuie)?
Cnd se face substituirea numelui constantei cu valoarea
asociat (la compilare sau la execuie)?
Admite limbajul constante predefinite?

Programare procedural

Declaraii de constante
n
n
n

n C nu exist constante
Ele sunt simulate prin macrodefiniii tratate de
preprocesorul C
Dezavantaj

nu sunt valabile regulile de vizibilitate ale numelor din C (numele


vor fi globale)
nu se poate declara tipul constantei
parantezele greite - probleme de interpretare

Ex.
#define TBLSIZE 100
#define TBLMAX (TBLSIZE - 1)

Programare procedural

Declaraii de constante
n

C++ introduce constantele (de orice tip),


prin declaraii de forma:
const

int TBLSIZE = 100;


const int TBLMAX = (TBLSIZE - 1);

Programare procedural

Declaraii de constante
Mecanismul const a fost conceput pentru
a preveni eventualele accidente (ca de
exemplu modificarea nedorit a unor valori
care se consider constante) i nu
fraudele.
n Protecia oferit de acest mecanism poate
fi eludat printr-o conversie explicit sau
prin aliere. De exemplu:
n

Programare procedural

Declaraii de constante
int i = 1; // i nu este const
const int* p = &i; // i nu se va putea modifica prin p
int *q = (int*)p; /* alierea cantitii *q cu i prin conversie explicit de tip
echivalent cu int *q = &p; iniializarea int *q = p ar fi ilegal din
cauza incompatibilitii caracteristicilor de tip; */
void f()
{
p--;
i++; // ok: nu i este const ci p
(*p)--;
// eroare: *p este const
(*q)++; /* ok: q nu este const, deci cantitatea referita de aceasta nu
este supusa restrictiilor de moficare*/
}
void g()
{
(*(int *)p)++ // ok: conversie explicita
}
Programare procedural

Exemple
const char* step[3] = {left, right, hop};
n
n
n

Tablou de pointeri la iruri de caractere


Pointerii se pot modifica
irurile de caractere nu se pot prin intermediul acestor
pointeri

step[2] = skip; // ok: se modifica pointer la const char


step[2][1] = i; /* eroare: nu se poate modifica sir de
caractere constant */

Programare procedural

Exemple
const char* const step[3] =
{left, right, hop};
step[2] = skip; /* eroare: nu se poate
modifica un pointer constant*/
step[2][1] = i; /* eroare: nu se poate
modifica sir de caractere constant*/
Programare procedural

10

Declaraii de constante
Definiia limbajului C nu specific
constante predefinite.
n Pentru asigurarea compatibilitii tipurilor
numerice cu ANSI C, limitele (minim i
maxim) domeniilor pentru diferite tipuri se
gsesc (sub forma unor macrodefiniii) n
fiierele header <limits.h> i <float.h>.
n

Programare procedural

11

Declaraii de tipuri de date


n

Tipul de date = mecanism de clasificare a


expresiilor care furnizeaz dou informaii:
mulimea

valorilor posibile ale expresiei n cauz


(domeniul tipului);
operaiile ce se pot aplica respectivei expresii;
n

Unul din principiile de baz ale proiectrii unui


limbaj de programare este: orice expresie
trebuie s aib un tip unic determinat.

Programare procedural

12

Declaraii de tipuri de date


n

Tipul asociat unei expresii ofer


programului traductor informaia
necesar pentru verificarea utilizrii
respectivei expresii i pentru
reprezentarea acesteia n memorie.

Programare procedural

13

Sisteme de tipuri
Sistem de tipuri pentru un LP = o mulime
de reguli prin care unei expresii i se
asociaz un tip al limbajului respectiv
n ST respinge o expresie dac nu-i poate
asocia un tip
n Respingerea expresiei are loc de obicei la
compilare sau, mai rar, la execuie
n

Programare procedural

14

Sisteme de tipuri
n

LP impun declararea explicit a variabilelor, una


dintre informaiile de baz prezente n declaraie
fiind tipul variabilei.
Sarcinile principale ale unui sistem de tipuri
sunt:
declararea

de tipuri de date utilizator


asocierea de tipuri la variabile, realizate prin
declaraiile de variabile
verificarea consistenei folosirii expresiilor

Programare procedural

15

Sisteme de tipuri
n

Verificarea consistenei folosirii expresiilor:


determinarea

tipului expresiei
verificarea consistenei instruciunilor (de
atribuire, apel) prin
compatibilitatea tipurilor;
n egalitatea tipurilor, includerea tipurilor;
n echivalena tipurilor;
n concordana listelor de parametri (formali i
actuali) n apelul de subprograme.
n

Programare procedural

16

Sisteme de tipuri
Regulile unui sistem de tipuri precizeaz
utilizarea adecvat a fiecrui operator n
limbaj.
n Verificarea tipurilor (engl. type checking)
are ca scop garantarea folosirii corecte a
operaiilor
n Se previn erorile de execuie.
n O eroare de execuie apare atunci cnd o
operaie se aplic incorect,
n

Programare procedural

17

Sisteme de tipuri
n

Exemplu: un operand numr ntreg este


considerat altceva (caracter, ir de caractere,
boolean).
O eroare de tip (engl. type mismatch) apare
cnd o funcie f cu un argument formal de tipul S
care ntoarce un rezultat de tipul T este apelat
cu un argument actual de tipul A care nu este de
tipul S.
Un program n care nu apar erori de tip se
numete sigur din punctul de vedere al tipurilor
(engl. type safe).
Programare procedural

18

Sisteme de tipuri
Verificarea tipului se poate face static sau
dinamic.
n Verificarea static se face la traducere,
n Verificarea dinamic se face la execuiei,
prin inserarea n programul executabil (n
timpul traducerii) a unor poriuni de cod
care realizeaz acest lucru.
n

Programare procedural

19

Sisteme de tipuri
n

n
n

Verificarea dinamic = costuri suplimentare de


execuie (dimensiunea programului executabil
crete, la fel i timpul de execuie, o parte din el
fiind dedicat verificrilor specifice).
Verificarea static = numai verificare de tip,
Verificarea dinamic = verificarea de tip +
verificarea unor valori calculate n timpul
execuiei (indici de tablou, mprire la zero etc.).
Programare procedural

20

Sisteme de tipuri
n

Expresie sigur (engl. safe expression) =


expresie n a crei evaluare nu apare o eroare
de tip.
Categorii de sisteme de tipuri:
Puternice

(engl. strong type system)


Slabe (engl. weak type system).
n
n

Sistem puternic de tipuri = accept numai


expresii sigure
Sistem slab de tipuri = nu este puternic.
Programare procedural

21

Sisteme de tipuri
n

LP puternic tipizat

fiecare expresie are un singur tip;


determinarea tipului este posibil n timpul
procesului de traducere, din sintaxa limbajului;
variabilele memorate la adrese distincte

LP slab tipizat

fiecare obiect este creat cu un tip specificat;


fiecare obiect este folosit ntr-o manier consistent
cu tipul su.

Programare procedural

22

Clasificarea tipurilor de date


n

Caracterul extensibil al unui LP este dat ntr-o


mare msur de capacitatea acestuia de a
permite definirea de noi tipuri de date
Criterii de clasificare a tipurilor:
nivelul

de abstractizare
prezena sau absena numelui tipului
prezena n (sau absena din) definiia limbajului;
momentul verificrii tipului
caracteristicile tipurilor (domeniu, operaii)

Programare procedural

23

Clasificarea tipurilor de date


n

Tipurile pot fi considerate pe trei niveluri de


abstractizare:
main tipurile pe care maina le tie
reprezenta i pentru care dispune de dispozitive care
pot efectua operaii cu ele: tipurile ntregi i reale,
caracter i boolean; (tipuri de baz)
nivelul limbajului tipurile de baz + tipurile
structurate: tablouri, nregistrri, mulimi, liste etc.
care se construiesc cu ajutorul tipurilor simple;
nivelul utilizator tipurile definite de utilizator; aceste
tipuri adaug cmpurilor de la tipurile structurate
operaii, prin ncapsulare; POO
nivelul

Programare procedural

24

Clasificarea tipurilor de date


n
n
n
n

Un tip de date este notat cu un identificator = numele


tipului.
Numele concentreaz toat informaia de declarare a
respectivului tip (domeniul i operaiile asociate).
Exist declaraii n care nu apare numele tipului, fiind
prezent doar declararea acestuia.
Prezena sau absena numelui este un criteriu de
clasificare a TD:

tipuri cu nume
tipuri anonime (fr nume).

Programare procedural

25

Clasificarea tipurilor de date


struct Student
{
char* nume;
int varsta;
};

struct
{
char* nume;
int varsta;
} s;

struct Student s;

Tip anonim
Programare procedural

26

Clasificarea tipurilor de date


n

Din punctul de vedere al definiiei


limbajului:
tipuri

fundamentale, care au ca nume


identificatori predefinii;
tipuri derivate, care au numele (identificator)
dat de utilizator ntr-o declaraie ce cuprinde
un constructor de tip.
n

Din punctul de vedere al momentului


verificrii tipului:
tip
tip

static (verificat la compilare);


dinamic (verificat la execuie).
Programare procedural

27

Clasificarea tipurilor de date


n

Dup natura comportamentului reprezentanilor


(obiectelor) unui anumit tip:
simple

sau scalare: ordinale (ntreg, boolean,


caracter, enumerare, subdomeniu) i reale;
ir de caractere;
structurate (tablou, nregistrare, mulime, fiier, clas,
uniune);
pointer;
procedurale.
Programare procedural

28

Declaraii de tipuri n C
Nume-de-tip

Declaraia

Tipul

int

int i

ntreg

int*

int* pi

Pointer la ntreg

int *[3]

int *p[3]

Tablou de 3 pointeri la ntregi

int (*)[3]

int (*p3i)[3] Pointer la tablou de 3 ntregi

int *()

int *f()

int(*)
(double)

int(*pf)
(double)

Funcie fr argumente care


returneaz pointer la int
Pointer la funcie cu un arg.
double care returneaz int
Programare procedural

29

Declaraii de tipuri n C
typedef int * Tf();
Tf f;
n
n

nume-de-tip este Tf
declaraie de tip echivalent cu declaraia de variabil int *f();

typedef int (*Tpf)(double);


Tpf pf;
n
n

nume-de-tip este Tpf


declaraie de tip echivalent cu int (*pf)(double);

Programare procedural

30

Declaraii de tipuri n C
typedef char *F(int);
// F funcie cu argument
//int care ntoarce pointer la char

char* (*(*f)[10])(int);

typedef F* A[10];
// A este tablou de
// 10 pointeri la funcii de tipul F
A* p;
// p este un pointer la tabloul de
//tip A din expresia de mai sus.

Programare procedural

31

Echivalena tipurilor
n

Ce nseamn tipuri compatibile sau egale?

Programare procedural

32

Programare
procedural
Declaraii de variabile
Curs 7

Programare procedural

Coninuturi
Elemente definitorii ale unei variabile
n Legarea variabilelor
n Punctul de declarare
n

Programare procedural

Declaraii de variabile
Unei variabile i corespunde o locaie de
memorie care conine un obiect dintr-o
mulime valori posibile ale ULP.
n Mulime formeaz domeniul de definiie al
variabilei,
n Locaia de memorie poziia de la care
ncepe alocarea variabilei respective.
n

Programare procedural

Declaraii de variabile
n programarea imperativ caracteristica
definitorie este crearea variabilelor i lucrul
cu acestea
n Variabil matematic != variabil informatic
n Matematic nedeterminat sau parametru
a unui sistem formal
n Informatic - legat de localizarea acesteia
n memorie i de modificabilitatea
coninutului locaiei
n

Programare procedural

Elemente definitorii ale unei


variabile
n

Structural
nume
set

de atribute
referin
valoare
n

Numele unei variabile este un identificator

Programare procedural

Elemente definitorii ale unei


variabile
n

Setul de atribute poate fi:


fixat

la compilare
modificat dinamic (la execuie)
n

Definirea atributelor
declarativ

(se folosesc instr. de declarare)


implicit (prin convenii n ceea ce privete
numele, atribuirea de valori)

Programare procedural

Elemente definitorii ale unei


variabile
n

Atribute eseniale:
Domeniul

de vizibilitate
Durata de via
Tipul variabilei

Programare procedural

Elemente definitorii ale unei


variabile
Domeniul de vizibilitate este
considerat a fi intervalul (de program
surs) n care variabila respectiv este
recunoscut, deci utilizabil
n Domeniul de vizibilitate - ncepe de obicei
imediat dup punctul de declarare al
numelui i se termin la sfritul blocului,
procedurii, fiierului surs
n

Programare procedural

Elemente definitorii ale unei


variabile

O variabil local, declarat n interiorul unui


subprogram are DV toat secvena de declaraii
i instruciuni de dup punctul de declarare i
pn la sfritul subprogramului respectiv;
O variabil global, declarat n corpul
programului principal are DV dup punctul de
declarare pn la sfritul fiierului surs.

Programare procedural

Elemente definitorii ale unei


variabile
n

Durata de via - intervalul (de timp de


execuie) n care zona de memorie alocat
variabilei este utilizat pentru variabil
Variabile locale (automatice)
declarate

n interiorul blocurilor sau subprogramelor


alocate n stiv doar la activarea unitii de program
durata de via egal cu perioada ct este activat
blocul sau subprogramul n care ele sunt declarate

Programare procedural

10

Elemente definitorii ale unei


variabile
n

Variabilele globale
alocate

n segmentul de date nc de la
compilare
au durata de via egal cu timpul de execuie
al programului

Programare procedural

11

Elemente definitorii ale unei


variabile
n

Variabile dinamice
durata

de via controlat de utilizator


alocarea i dealocarea se face prin
instruciuni specifice fiecrui limbaj

Programare procedural

12

Elemente definitorii ale unei


variabile
n

Tipul variabilei
LP

posed tipuri predefinite (tipuri numerice, caracter,


boolean),
LP evoluate au n plus mecanisme de definire a
tipurilor utilizator (typedef, struct, union n C, class n
C++),
Programatorul poate construi propriile sale structuri
de date
Mecanismele de declarare de noi tipuri sunt extinse
prin ceea ce se numete abstractizare datelor i
POO, accentul este pus pe definirea operaiilor
prevzute pentru un tip de dat definit de utilizator
Programare procedural

13

Elemente definitorii ale unei


variabile
Referina = informaia adres; locul unde
este memorat variabila
n Stabilirea referinei se realizeaz prin
alocarea variabilei respective
n Alocarea unei variabile se poate face
n

static

(la compilare)
dinamic (dinamic)
Programare procedural

14

Elemente definitorii ale unei


variabile
Variabile aliate = variabile care au aceeai
referin
n Operaia se numete aliere (aliasing)
n n C i C++ se realizeaz prin union
n

Programare procedural

15

Elemente definitorii ale unei


variabile
Valoarea asociat unei variabile se poate
schimba n timpul execuiei unui program
n Mulimea valorilor asociate variabilelor
dintr-un program formeaz spaiul strilor
sau mediul programului
n Determinarea valorii unei variabile se face
prin operaia de derefereniere
n

Programare procedural

16

Elemente definitorii ale unei


variabile
n general operaia de derefereniere este
implicit, neexistnd o notaie consacrat
pentru ea
n Pe baza referinei se returneaz valoarea
variabilei
n

Programare procedural

17

Elemente definitorii ale unei


variabile
Nume

Set de atribute

Referin
Valoare

Referina + valoare = obiect

Programare procedural

18

Elemente definitorii ale unei


variabile

Atribute X

Atribute Y

valoare

Variabile aliate

Programare procedural

19

Legarea variabilelor (binding)


n
n
n
n

ntre nume i setul de atribute


ntre perechea (nume, set de atribute) i
referin
Legarea intern a variabilelor se face n
interiorul procesului de compilare
Legarea extern este sarcina editorului de
legturi (rezolv legarea unei variabile folosit
ntr-un modul i declarat ntr-un alt modul)
Programare procedural

20

Legarea variabilelor
Legarea variabilelor implic punerea n
coresponden a variabilelor cu atributele
acesteia
n Momentul legrii (engl. binding time) este
momentul la care devin cunoscute
atributele unei variabile.
n

Programare procedural

21

Legarea variabilelor
n

Momentul legrii:

la compilare: se pot face toate verificrile necesare


privind compatibilitatea i corectitudinea utilizrii
variabilei; codul generat este mai compact,
permind o execuie eficient.
la execuie: n codul generat la compilare vor trebui
introduse secvene care s realizeze verificrile de
corectitudine a utilizrii variabilei, ceea ce duce la
un cod mai mare, deci mai ineficient. Avem o mai
mare flexibilitate a programelor scrise.

Programare procedural

22

Legarea variabilelor
n

Momentul legrii:
LP cu legare static (la compilare) foarte
eficient n execuie
LP cu legare dinamic la execuie

Programare procedural

23

Punctul de declarare
n

Punctul de declarare a unei variabile poate


fi definit att pentru limbajele cu declaraii
complet explicite, ct i pentru cele care
permit i declaraii implicite de variabile

Programare procedural

24

Punctul de declarare
n

Declaraie explicit - orice variabil trebuie


declarat printr-o instruciune de declarare, iar
punctul de declarare se consider a fi imediat
dup terminarea declaraiei numelui variabilei
Declaraie implicit - punctul de declarare este
prima instruciune de atribuire care conine n
membrul stng numele variabilei (nceputul
domeniului de vizibilitate al variabilei)

Programare procedural

25

Punctul de declarare
ntlnirea unei instruciuni de declarare
nseamn pentru compilator legarea
numelui variabilei de setul de atribute.
n n mod normal o instruciune de declarare
specific dou informaii:
n

numele

variabilei;
tipul acesteia.

Programare procedural

26

Punctul de declarare
n

Restul atributelor se determin astfel:

nceputul DV este definit de punctul de declarare,


iar sfritul DV este determinat tot de punctul de
declarare, astfel:
a.

Punctul de declarare este intern unui bloc: DV ine pn la


sfritul blocului, inclusiv blocurile (subprogramele) locale
(exc. redeclarri ale numelui situaie n care vor fi valabile
redeclarrile aa numitele pete albe hole in scope;
variabil este local unitii n care a aprut punctul de
declarare.

Programare procedural

27

Punctul de declarare
n

Restul atributelor se determin astfel:

nceputul DV este definit de punctul de


declarare, iar sfritul DV este determinat tot
de punctul de declarare, astfel:
b.

Punctul de declarare este n afara oricrui bloc sau


subprogram: DV ine pn la sfritul fiierului surs,
variabila fiind global n fiierul ce conine declaraia.

Programare procedural

28

Punctul de declarare
n

Restul atributelor se determin astfel:

nceputul DV este definit de punctul de


declarare, iar sfritul DV este determinat tot
de punctul de declarare, astfel:
c.

Punctul de declarare este n partea de interfa a


unui modul: DV este cel stabilit la (b), variabila
fiind global modulului, i orice alt modul sau
program care specific explicit folosirea
modulului de declarare.
Programare procedural

29

Punctul de declarare
n

Restul atributelor se determin astfel:

nceputul DV este definit de punctul de


declarare, iar sfritul DV este determinat tot
de punctul de declarare, astfel:
d.

Punctul de declarare este n partea de


implementare a unui modul: DV este cel stabilit
la (b), cu precizarea c numele este invizibil
modulelor sau programelor care specific explicit
folosirea modulului de declarare, iar variabila
este local modulului.
Programare procedural

30

Programare
procedural
Declararea variabilelor C
Curs 8

Programare procedural

Coninuturi
Clase de memorie
n Etape ale lucrului cu variabile
n

Declarare
Iniializare
Folosire

Programare procedural

Clase de memorie
n limbajul C funciile nu se pot include
unele n altele
n n C exist instruciuni compuse i blocuri
n Se permit definiri de obiecte n cadrul
blocurilor
n

Programare procedural

Clase de memorie
CM util pentru determinarea domeniului
de vizibilitate i a duratei de via al var.
n CM: auto, register, extern, static
n Sintaxa:
n

<nume_clas>

<tip> <list_nume_variabile>;

Programare procedural

Clase de memorie
n

auto sunt declarate n interiorul funciilor


Este

activ ct timp este activ unitatea de


program (funcia sau blocul) la nceputul
creia a fost declarat
i pierde valoarea la terminarea execuiei
unitii de program n care e declarat
La un nou apel vechea valoare nu mai e
disponibil
Clasa de memorie implicit
Programare procedural

Clase de memorie
n

register subclas a clasei auto


Declaraia

register informeaz compilatorul


c aceste variabile vor fi utilizate foarte
frecvent
Dac e posibil compilatorul le va aloca cte
un registru main (pentru eficien)
Un registru = 4 octei deci doar ntregii,
caracterele, pointerii pot aparine acestei
clase
Programare procedural

Clase de memorie
void main()
{
register int i;
for (i = 0; i < 1000; i++)
a[i] = i; //
}

Programare procedural

Clase de memorie
n

static interne i externe (n funcie de locul


unde apar)
static

interne declarate n interiorul unei funcii


static externe declarate n afara funciilor
n

Exemplu:
static

int a[20];

Programare procedural

Clase de memorie
Declaraie static extern variabila
accesibil doar funciilor din fiierul
respectiv
n Se aloc la compilare n segmentul de
date
n Declaraie static intern variabil local
alocat n segmentul de date (nu pe stiv)
n

Programare procedural

Clase de memorie
n

static intern
valoarea

se pstreaz ntre dou apeluri


consecutive ale aceleiai funcii
iniializarea se face doar la primul apel al
funciei

Programare procedural

10

Clase de memorie
n

extern pentru comunicarea ntre


segmente diferite, compilate separat
Declarate

n afara funciilor
DV de la declarare pn la sfritul fiierului
n care apare declararea
n

Funciile C au implicit clasa de memorie


extern
Programare procedural

11

Etape ale lucrului cu variabile


n
n
n

Declararea
Iniializarea
Folosirea

Programare procedural

12

Etape ale lucrului cu variabile


n
n

Declararea se face implicit sau explicit


Declararea explicit

se realizeaz cu ajutorul instruciunilor de


declarare
comunic compilatorului informaii privind

n
n
n

numele variabilelor
atributele
valorile de iniializare (dac e cazul)

Programare procedural

13

Etape ale lucrului cu variabile


n

Declararea implicit

recurge la convenii privitoare fie la numele


variabilei, fie la valoarea acesteia

Instruciunile de declarare apar, de


regul, n partea de nceput (de
declaraii) a blocurilor, subprogramelor
sau modulelor (exc. Java, C++, C#)
Programare procedural

14

Etape ale lucrului cu variabile


n

Declaraiile pot specifica


tipul

de legare a variabilei (intern sau


extern)
modul de alocare
modul de transmitere a parametrilor n
subprograme

Programare procedural

15

Etape ale lucrului cu variabile


Declarare != Definire
n Definire = declarare + iniializare
n Definiii fr iniializare, variabilele primesc
valori implicite, echivalente lui 0:
n

pentru tipuri numerice


string-ul vid pentru iruri de caractere
valoarea NULL pentru pointeri
Programare procedural

16

Etape ale lucrului cu variabile


n

Declarare != Definire atunci cnd:


Declar

o funcie fr a-i specifica corpul;


Conine specificatorul extern i nu are
iniializarea sau corp de funcie;
Declar un membru static ntr-o declaraie de
clas;
Este o declaraie de nume de clas;
Este o declaraie typedef.
Programare procedural

17

Etape ale lucrului cu variabile


n

Exemple:
int

a; // declaraie + definiie
extern int a; // declaraie n alt fiier

Declaraii static - legare intern


n Declaraii extern - legare extern (la linkeditare)
n

Programare procedural

18

Programare
procedural
Declararea variabilelor C
Tipuri de date

Curs 9

Programare procedural

Coninuturi
n

Etape ale lucrului cu variabile


Folosire
Declaraii

const
Lucrul cu pointeri
Iniializarea
Referirea variabilelor
n

Tipuri de date
Programare procedural

Etape ale lucrului cu variabile


n

O declaraie sau definiie poate conine i


calificatori (const sau volatile), care definesc
modificabilitatea obiectelor precizate
Exemple:
const

int ci = 10; // constant ntreag;


const int *pc = &ci; // pointer la constanta ntreag ci;
const int *const cpc = pc; //pointer constant la
constanta ntreag ci

Programare procedural

Etape ale lucrului cu variabile


n

Exemple:
int
int
int

i; // variabil ntreag
*p; // pointer la ntreg;
*const cp = &i; // pointer constant la variabila
ntreg i;

Operaii permise:
i

= ci;
*cp = ci;
pc++;
pc = cpc;
pc = p;
Programare procedural

Etape ale lucrului cu variabile


n

Operaii nepermise
ci

= 1; // ci nu se poate modifica
ci++;
// idem
*pc = 2;
// ar trebui s se modifice ci
cp = &ci;
// cp nu se poate modifica
cpc++;// cpc nu se poate modifica
p = pc;// ar permite modificarea ulterioar a lui
ci prin p
Programare procedural

Etape ale lucrului cu variabile


int i = 1;
// i se poate modifica
const int *p = &i;
//pointer la obiect const care se poate modifica, nu si obiectul referit
int *const vp = &i;
//pointer const la un obiect; obiectul se poate modifica, nu i pointerul
const int *const cp = &i;
// pointer const la un obiect const; obiectul i pointerul nu se pot modifica
void f()
{
i++;
// OK: i nu este const
p--;
// OK: p nu este const
(*vp)--;
// OK: *vp nu este const
cp++;
//eroare: nu se poate modifica un obiect const
(*cp)--;
//eroare: nu se poate modifica un obiect const
(*p)++;
//eroare: nu se poate modifica un obiect const
vp++;
//eroare: nu se poate modifica un obiect const
6
Programare procedural
}

Etape ale lucrului cu variabile


n

Iniializarea

unui program = cu aceleai date de


intrare, programul produce aceleai rezultate
n cazul programelor simple, care conin declaraii de
date (variabile) de intrare i rezultate
Stabilitatea

n
n

variabilele de intrare se iniializeaz prin operaii de intrare


(citire)
variabilele rezultat (de ieire) prin operaii de atribuire

Variabile

auxiliare (necesare pentru o mai bun


structur a procesului de calcul), nu se garanteaz
iniializarea acestora

Programare procedural

Etape ale lucrului cu variabile


Condiie de stabilitate: toate variabilele
auxiliare din program s fie iniializate cu
aceleai valori, la fiecare execuie a
programului cu acelai set de date de
intrare
n Iniializarea unei variabile prin:
n

instruciuni

de atribuire
instruciuni specifice

Programare procedural

Etape ale lucrului cu variabile


n

Iniializarea unei variabile aceasta se poate face:


n

momentul alocrii ei (variabila primete o valoarea


predefinit, n funcie de tipul ei sau stabilit printr-o
instruciune sau clauz)
imediat dup momentul alocrii (valoarea variabilei
este nedefinit se consider valoarea gsit n
locaia de memorie definit de referina ei, valoarea
numit valoarea rezidual

Programare procedural

Etape ale lucrului cu variabile


n

Referirea variabilelor se face printr-o expresie


de identificare care poate fi:
identificator

(numele variabilei respective);


expresie indexat (cnd variabila este de tip tablou);
expresie de selectare (dac variabila este
component a unei date structurate);
expresie de indirectare (cnd variabila este de tip
pointer);

Programare procedural

10

Tipuri de date
n
n
n
n
n

Tipuri fundamentale
iruri de caractere
Pointeri
Tipuri procedurale
Tipuri structurate
Tablou
nregistrare
Uniuni
Tipuri de date

definite de utilizator

Programare procedural

11

Tipuri de date
n

Tip de date = o mulime de obiecte nsoit


de o mulime de operaii pe mulimea
acestor obiecte
Operaiile

crearea, construirea, distrugerea, modificarea sau


copierea instanelor (realizrilor) obiectelor
n set minim de operaii primitive (prin compunere
rezult operaii complexe)
n

Programare procedural

12

Tipuri fundamentale
Tipuri fundamentale = tipuri baz,
corespund tipurilor main.
n Pentru TF avem identificatori predefinii
n Tipuri fundamentale (comportament)
n

aritmetice,
caracter
boolean

Programare procedural

13

Tipuri fundamentale
Tipurile aritmetice (ntregi i reale) sunt
apropiate de maina fizic
n Operaiile de baz
n

aritmetice

(expresii aritmetice)
comparare (expresii relaionale)

Programare procedural

14

Tipuri fundamentale
n

Tipul boolean are


valori: true i false
5 operaii: and, or, not, imp, equiv
2

n
n
n
n
n

x and y = if x then y else false


x or y = if x then true else y
not x = if x then false else true
x imp y = if x then y else true
x equiv y = if x then y else not y

Programare procedural

15

Tipuri fundamentale
n

n C (C++) nu exist tipul boolean (bool)


un

ir bii ce conine numai 0 - false


un ir de bii n care este unul nenul - true
n

Tipurile aritmetice
tipuri

ntregi (char, int n toate variantele i


enumerrile)
tipuri reale (flotante)

Programare procedural

16

Tipuri fundamentale
Valorile minim i maxim din domeniul
fiecrui tip sunt precizate, pentru fiecare
implementare, n fiierul header (antet)
<limits.h>
n Tipul char
n

setul

de caractere de baz al limbajului


valoare = codul ntreg al caracterului

Programare procedural

17

Tipuri fundamentale
n

Tipul char poate fi calificate cu:


signed

sau unsigned

Tipul int poate fi calificat cu:


signed

sau unsigned
long sau short

Programare procedural

18

Tipuri fundamentale
Tip
char

sizeof
(n octei)
1

Aliniere
(multiplu de, n octei)
1

short

int

2 sau 4

2 sau 4

long

4 sau 8

4 sau 8
Programare procedural

19

Tipuri fundamentale
Tipul enumerare = tip ntreg distinct ce are
constante cu nume
n Identificatorii dintr-o list enumerare sunt
declarai constante i pot apare oriunde
pot apare constante
n Dac nu apar enumeratori cu =, valorile
constantelor ncep de la 0 i cresc cu 1, de
la stnga la dreapta
n

Programare procedural

20

Tipuri fundamentale
enum culori {
rosu, orange, galben, verde, albastru
};
enum fruct {
mar, para, orange, kiwi
}; // eroare: orange este redefinit
enum pasare {
strut, dodo, lebada, kiwi}; // eroare kiwi este redefinit
int lebada; // eroare: lebada redefinit

Programare procedural

21

Tipuri fundamentale
enum { a, b, c = 0};
enum {d, e, f = e + 2};

definete a, c, d cu valoarea 0
n b i e cu valoarea 1
n f cu 3.
n

Programare procedural

22

Tipuri fundamentale
n

Tipurile reale:
float
double
long

double.

Caracteristicile sunt date n <float.h>.

Programare procedural

23

Tipuri fundamentale
Tip

sizeof (n octei)

Aliniere (multiplu de, n octei)

float

double

4 sau 8

long
double

12 sau 16

4, 8 sau 16

Programare procedural

24

Tipuri fundamentale
n
n
n
n
n

Tipul void are domeniul valorilor vid.


Folosit pentru a preciza tipul rezultatului ntors de
funciile cu semantic de procedur.
Nu se declar obiecte de tip void
Orice expresie se poate converti explicit la tipul void
Rezultatul conversiei se poate ca:

instruciune expresie,
operand stng,
expresie virgul
al treilea operand la o expresie condiionial ternar ? :

Programare procedural

25

iruri de caractere
n

Tipul ir de caractere (numit i string) are ca


valoare un ir de caractere cu lungimea variabil
(modificabil dinamic)
Operaii:
construirea
inserarea unui

ir de caractere n altul
extragerea unui subir
tergerea unui subir
cutarea unui subir
concatenarea a dou iruri de caractere

Programare procedural

26

iruri de caractere
n

Convenia C pentru string-uri:


un

ir de n caractere se reprezint pe n+1


octei, numerotai de la 0 la n, astfel:
octetul i (de la 0 la n-1) conine al i+1-lea caracter
din irul considerat
n octetul n conine un caracter terminator de ir:
caracterul NUL (\0) din ASCII;
n

n C, C++ nu avem tipul string


Programare procedural

27

iruri de caractere
n

Existena tipului string n limbaj implic:


existena

tipului de date ir de caractere (string);


prelungirea utilizrii operatorilor relaionali pe iruri de
caractere;
stabilirea unei reprezentri pentru irurile de
caractere;
stabilirea unei mulimi minimale de operaii pe iruri
de caractere.

Programare procedural

28

iruri de caractere
n

n C, C++
char

[n] (sau char [ ])


Pentru a prelucra iruri de caractere folosim
funcii din biblioteca standard C:
strcpy
n strcmp
n strstr
n strchr
n strlen etc.
n

Programare procedural

29

Programare
procedural
Tipuri de date

Curs 10

Programare procedural

Coninuturi
n

Tipuri de date
Pointer
Procedural
Tipuri

structurate

Tablouri
n nregistrri
n Uniuni
n

Programare procedural

Tipul pointer
Tipul de date pointer are domeniul format
din adresele altor entiti (reprezentabile n
memorie) dintr-un program.
n Lucrul cu pointeri permite:
n

Crearea

i utilizarea unor structuri de date


foarte complexe,

ngreuneaz nelegerea unui program,


putnd genera erori greu de detectat.
Programare procedural

Tipul pointer
n

Tipuri de pointeri:
cu

tip (conin adrese de entiti de acelai tip)


fr tip (refer orice entitate de memorie)
n

Constituie o modalitate de accesare a


entitilor din memoria unui program,
printr-un mecanism de indirectare

Programare procedural

Tipul pointer
n
n
n
n

Valoarea = adresa entitii respective


Informaia de tip a pointerului exprim i tipul
entitii referite de pointer.
Entitatea este o variabil - pointerul are ca
valoare adresa acesteia
Variabilele alocat dinamic nu au nume (variabile
anonime). Referirea lor se poate realiza doar
prin pointeri
Programare procedural

Tipul pointer - operaii


Atribuirea
n Dereferenierea (indirectarea, referirea
entitii punctate de pointer)
n Operaii aritmetice (adunare i scdere)
n

Programare procedural

Tipul pointer
Pointerii = flexibilitatea n execuia
programului
n Programatorul are libertate de a
n

Controla

durata de via a variabilelor


Gestionea o parte a memoriei
n

Libertile greit nelese se ntorc


mpotriva aceluia care beneficiaz de ele
Programare procedural

Tipul pointer
Referin ambigu = se folosete un
pointer a crui valoare refer ceva ce nu
mai este alocat n memorie
n Soluie garbage collector
n

Programare procedural

Tipul pointer - avantaje


n
n
n
n

Libertatea pentru programator de a controla


duratei de via a variabilelor
Flexibilitatea sporit a programelor prin structuri
de date dinamice
Actualizarea selectiv a structurilor complexe,
fr recopierea ntregii structuri;
Compactitatea codului scris prin folosirea
pointerilor la funcii.
Programare procedural

Tipul pointer erori tipice


Accesarea unei entiti printr-un pointer
nainte de iniializarea pointerului ce o
refer
erori de execuie;
n Accesa unei locaii dup ce aceasta a fost
eliberat
rezultate imprevizibile n
execuie.
n

Programare procedural

10

Tipul pointer sintaxa


n

Declaraie
pointer

la tipul T = T*

Operaii
*

(indirectarea) *p = obiectul de tip T referit de


p (p este de tip pointer la T)
& (adresa lui) &p = obiectul de tip pointer la T
(p este de tip T) care refer pe p, deci cu alte
cuvinte, adresa lui p

Programare procedural

11

Tipul pointer
n

Operaii

-- incrementarea i decrementarea
valorilor de tip adres.
Operaii de comparare
++,

n C, C++ parametri se transmit


ntotdeauna funciilor prin valoare
n Apelul prin referin se poate simula
folosind explicit pointeri
n

Programare procedural

12

Tipul pointer
Pentru tipurile fundamentale e suficient
transmiterea prin valoare
n Pentru tipuri definite de utilizator nu e de
dorit s transmitem instane ale lor prin
valoare (pt. c acestea pot avea
dimensiune mare)
n !!! Tablourile se transmit ntotdeauna prin
referin
n

Programare procedural

13

Tipuri procedurale
n

Tip procedural = tip de date cu domeniul


format din mulimea tuturor procedurilor
sau funciilor ce respect un anumit
ablon, definit n cadrul declarrii tipului
procedural n cauz.

Programare procedural

14

Tipuri procedurale
n

Declaraia de tip procedural specific:


Numele

noului tip procedural (opional)


Tipul i numele parametrilor formali ai
procedurilor sau funciilor ce vor respecta
ablonul
Tipul rezultatului ntors (dac e vorba despre
funcii)

Programare procedural

15

Tipuri procedurale
n

O variabil procedural are


Nume
Tip

(servete la verificarea consistenei folosirii ei)


Valoare (adresa codului procedurii n cauz n cadrul
programului executabil)
n
n

numele procedurilor/funciilor declarate n program


numele procedurilor/funciilor externe de tip compatibil cu
tipul procedural al variabilei care este iniializat

Programare procedural

16

Tipuri procedurale - C
typedef void ffp(); //definiie de tip
ffp pfp; // definiie de variabil
typedef void fpr(float a, float b, float c);
typedef float freal(float x);
typedef float ffunc(float p1, float p2, freal f);

Programare procedural

17

Tipuri procedurale - C
n C numele unei funcii este evaluat n la
adresa de nceput a funciei n cadrul
codului compilat,
n Variabila pfp va reprezenta o cantitate de
tip adres compatibil cu orice valoare
reprezentnd numele unei funcii fr
parametri i de tip void.
n

Programare procedural

18

Tipuri procedurale - C
Adresa unei funcii se obine prin simpla
specificare a numelui funciei fr
paranteze
n Aceast adres poate fi atribuit unui
pointer de funcie cu rezultat i parametri
compatibili
n Pointerul poate fi folosit pentru a apela
funcia
n

Programare procedural

19

Tipuri procedurale - C
int f(int, char); // declaraia funciei f
int (*pf)(int, char); /* se declar pf ca pointer la
funcie de dou argumente (int i char) ce
ntoarce un ntreg*/
int i, j; char c;

pf = f; // atribuire de adrese
j = (*pf)(i, c); // apelul funciei f folosind pf

Programare procedural

20

Tipuri structurate
LP dispun de modaliti de agregare a
datelor
n Tipurile simple sunt atomice, indivizibile
n Tipurile structurate (compuse, agregate)
se descompun n componente sau
elemente, fiecare de un tip precizat
(simplu sau structurat)
n

Programare procedural

21

Tipuri structurate
n
n
n

O dat structurat poate fi accesat fie ca ntreg


(global), fie pe componente
Structura unei date stabilete relaiile care exist
ntre componentele acesteia.
Legturi structurale fundamentale:
Mulime

(nici o legtur ntre componente)


Liniar (legtur 1:1)
Arbore (legtur 1:n)
Graf (legtur m:n)
Programare procedural

22

Tipuri structurate
n

Din punctul de vedere al uniformitii


structurale
Omogene

(toate componentele au acelai


tip); tablou (engl. array) i mulime (engl. set);
Heterogene (elementele unei date au de
obicei componente diferite de tip); tipul de
date nregistrare (engl. record).

Programare procedural

23

Tipuri structurate
Tablourile i nregistrrile au o structur
liniar
n Exist o prim i o ultim component,
n Toate celelalte elemente au fiecare att
predecesor, ct i succesor
n

Programare procedural

24

Tipuri structurate
Tablou = agregat de elemente de acelai
tip
n Fiecare element este localizat prin poziia
pe care o ocup (indicele elementului)
n nregistrare = agregat care grupeaz de
elemente de tipuri diferite numite cmpuri
care sunt localizate prin numele lor
n

Programare procedural

25

Tipuri structurate
Mulimea = structur amorf
n Conine elemente de acelai tip ce nu pot
fi localizate explicit neexistnd informaia
de apartenen a unui element la ea.
n n C nu exist tipul mulime
n n alte limbaje (Pascal) se poate folosi tipul
mulime
n

Programare procedural

26

Tipuri structurate
n

Operaii cu tipuri structurate


construirea
n

Prin regulile specifice ale limbajului

selectarea

componentelor

La tablouri prin indice


n La nregistrri prin numele componentelor
n

Programare procedural

27

Tipul tablou
n

Elementele definitorii:
Numele (opional) = un identificator
Lista dimensiunilor = precizeaz numrul
dimensiunilor
Tipul elementului de tablou
Domeniul pentru mulimea indicilor = de tip
subdomeniu

Programare procedural

28

Tipul tablou
n

Criteriile de clasificare
Numrul

de dimensiuni

Tablouri monodimensionale (vectori)


n Tablouri bidimensionale (matrici)
n Tablouri tridimensionale
n n general, tablouri d-dimensionale
n

Tipul

elementelor

Programare procedural

29

Tipul tablou
n

Criteriile de clasificare
Momentul

alocrii

statice = se aloc la compilare (sau cel puin


trebuie cunoscute dimensiunile la compilare)
n dinamice dimensiunea determinat la execuie
n

Posibilitatea
n

redimensionrii

tablourile flexibile

Programare procedural

30

Tipul tablou
Referirea la un element al tabloului se face
prin precizarea numelui tabloului urmat
de o expresie de indice ntre paranteze
n Determinarea locaiei unui element al
tabloului n memorie se face printr-un
calcul de adres
n

Programare procedural

31

Tipul tablou
n

Descriptorul de tablou areurmtoarele informaii:


nume

numele tabloului
tip tipul elementului de tablou
lung lungimea reprezentrii unui element de tablou
(n uniti de alocare)
adrs adresa de unde ncepe memorarea tabloului
nrd numrul de dimensiuni al tabloului
pentru fiecare dimensiune, limitele lim_inf_i i
lim_sup_i (1 <=i<=nrd).
Programare procedural

32

Tipul tablou
Tabloului i se aloc locaii consecutive de
memorie - ocup o zon compact
n A(li:ls)
n

loc(A(i))

= adrs + (i - li)*lung

Programare procedural

33

Tipul tablou
n
n

B(li1:ls1, li2:ls2)
Memorat pe linii

loc(B(i,j)) = adrs + (i-li1)*(ls2-li2+1)*lung + (j-li2)*lung


loc(B(i,j)) = adrs li1*(ls2-li2+1)*lung li2*lung+
(constant)
+j*lung + i*(ls2-li2+1)*lung

Memorat pe coloane

loc(B(i,j)) = adrs + (j-li2)*(ls1-li1+1)*lung + (i-li1)*lung


loc(B(i,j)) = adrs li2*(ls1-li1+1)*lung li1*lung+
(constant)
+i*lung + j*(ls1-li1+1)*lung

Programare procedural

34

Tipul nregistrare
n

Elementele definitorii ale unei nregistrri


sunt:
numele

i tipul nregistrrii
numrul de cmpuri
numele i tipul fiecrui cmp
n

nregistrarea = modalitate de agregare


(punere mpreun a unor date de tipuri n
general diferite)
Programare procedural

35

Tipul nregistrare
n
n
n
n

Numrul de cmpuri este dedus din lista de


declarare a cmpurilor
Cmpurile se memoreaz n zone de memorie
adiacente
Tipul cmpului servete la stabilirea lungimii de
reprezentare
Numele cmpului servete la accesarea valorii
lui (prin operaia de selectare)
Programare procedural

36

Tipul nregistrare
n

n C:
(struct) - au o structur fix
Uniuni (union) - un fel de nregistrare cu structur
variabil
Structuri

Elementele ce trebuie considerate:


maniera

de declarare
maniera de accesare a cmpurilor acestora
iniializarea
operaiile permise pentru variabilele de tip nregistrare

Programare procedural

37

Tipul nregistrare - C
n

Sintaxa:
struct [nume] {[tip nume_var];

}[variabile];
nume, variabile sunt opionale (cel puin una trebuie
s apar)

Exemplu:
struct { char nume[30];
int varsta; float gr; } cineva;

Programare procedural

38

Tipul nregistrare
n

Atribuirea unui nume pentru structur:


struct persoana{ char nume[30];
int varsta; float gr; };
struct persoana cineva, altcineva[20];
struct persoana Noi[10], *Voi[10];

Definirea unui nume de tip pentru structur:


typedef struct { char nume[30];
int varsta; float gr; } persoana;
persoana cineva, altcineva[20];
n

Programare procedural

39

Tipul nregistrare
n

Operaiile permise asupra structurilor sunt:


selectarea

unui cmp (prin operatorul .);


obinerea adresei unei structuri (prin &);
determinarea lungimii unei structuri (prin
sizeof);
atribuirea unei structuri (prin =).

Programare procedural

40

Tipul nregistrare
struct pers {int a; char b;} p1, p2 = {2, b}; //
iniializare

p1 = p2; // atribuire de structuri


n

Notaia ps->camp este echivalent cu


(*ps).camp.
Programare procedural

41

Tipul nregistrare
n

Exemplu:
struct{ int x; int *y } *p;
incrementeaz pe x, operatorul ->
areprioritate mai mare dect ++;
(++p)->x incrementeaz mai nti pe p i apoi
acceseaz elementul x din structura nou pointat;
(p++)->x se acceseaz nti x apoi se incrementeaz
p;
++p->x

Programare procedural

42

Tipul nregistrare
struct{ int x; int *y } *p;
indic coninutul adresei pointat de y;
*p->y++ acceseaz nti ceea ce pointeaz y
i apoi incrementeaz y;
(*p->y)++ incrementeaz ceea ce pointeaz y;
*p++->y acceseaz ceea ce pointeaz y i
apoi incrementeaz pointerul p
*p->y

Programare procedural

43

Tipul nregistrare - uniuni


Uniunile permit utilizarea n comun a unei
zone de memorie de ctre mai multe
obiecte (numite membri) de tipuri diferite
n Sintaxa:
n

union

nume_uniune {[tip
nume_var]}[decl_variabile];

Programare procedural

44

Tipul nregistrare - uniuni


n

Exemplu:
union

amestec {int i; float f; char *psir;}X;

sizeof(X) ?
X.i
X.f
X.psir

Programare procedural

45

Tipul nregistrare - uniuni


n

O uniune este o structur n care toi


membri au deplasamentul zero, structura
fiind suficient de mare pentru a putea
pstra pe cel mai mare membru

Programare procedural

46

Tipuri de date definite de utilizator


n

POO

Programare procedural

47

Programare
procedural
Expresii
Curs 11

Programare procedural

Coninuturi
Generaliti
n Precedena operatorilor
n Arborele unei expresii
n Clase de operatori i expresii
n Conversia explicit, implicit
n Modaliti de evaluare a expresiilor
n

Programare procedural

Generaliti
Expresia = element de baz prin care se
precizeaz calculele
n Expresia = secven de operanzi i
operatori, care exprim un proces de
calcul
n O expresie poate avea o valoare,
determinat prin procesul de evaluare
n

Programare procedural

Generaliti
La evaluarea unei expresii pot aprea
efecte secundare
n Criterii de clasificare a expresiilor:
n

Numrul

de operanzi;
Poziia operatorului n raport cu operanzii;
Tipul rezultatului;
Semantic.
Programare procedural

Operatori
n

n funcie de numrul de operanzi:


Expresii

unare un singur operand;


Expresii binare doi operanzi;
N-are n operanzi.
n

Numrul de operanzi = o caracteristic a


unui operator numit aritate

Programare procedural

Operatori
n

Clasificare expresiilor n funcie de poziia


operatorilor:
infix
n

operatorul ntre operanzi;

E1 op E2

prefix
n

operatorul naintea operanzilor;

op E1 E2

postfix
n

operatorul dup operanzi

E1 E2 op

Programare procedural

Operatori
n

Exemplu (x + y) * z :
infix:

(x + y) * z
prefix: *+ x y z
postfix: x y + z *
n

n notaia prefix i postfix nu sunt necesare


parantezele - operanzii fiecrui operator
se pot determina fr ambiguiti
Programare procedural

Precedena operatorilor
n

Rezolvarea ambiguitilor n notaia infix


se face prin dou reguli:
Precedena

operatorilor;
Asociativitatea operatorilor (pentru operatorii
cu aceeai preceden).

Exemplu care folosete doar prima regul:


+ b * c reprezint a + (b * c)
a * b + c reprezint (a * b) + c
a

Programare procedural

Precedena operatorilor
n

Asociativitate
La
n

La
n

stnga
Exemplu: a + b + c este interpretat ca (a + b) + c

dreapta
Exemplu: a = b = c este interpretat ca a = (b = c).

Asociativitatea operatorilor se aplic doar


n situaia cnd acetia au aceeai
prioritate
Programare procedural

Prioritatea i asociativitatea
operatorilor n limbajul C
Operatorul Descriere

Asociativitate

1.

()
[]
->
.

Apel de funcie
Accesare element tablou
Selectare membru structur prin pointer
Selectare membru structur direct

de la stnga la
dreapta

2.
Unari

!
~
++
-+
*
&
(tip)
sizeof

Negare logic
Complement pe bii
Preincrementare sau postincrementare
Predecrementare sau postdecrementare
Plus unar
Minus unar
Indirectare
Adres
Cast
Returneaz dimensiunea operandului

de la dreapta la
stnga

Programare procedural

10

Proritatea i asociativitatea
operatorilor n limbajul C
3.
Multiplicativi

*
/
%

nmulire
mprire
Rest

de la stnga la dreapta

4.
Aditivi

+
-

Plus binar
Minus binar

de la stnga la dreapta

5.
Deplasare

<<
>>

Deplasare la stnga
Deplasare la dreapta

de la stnga la dreapta

Programare procedural

11

Proritatea i asociativitatea
operatorilor n limbajul C
<
<=
>
>=

Mai mic
Mai mic sau egal
Mai mare
Mai mare sau egal

de la stnga la dreapta

7.
Egalitate

==
!=

Egal
Diferit

de la stnga la dreapta

8.

&

I pe bii

de la stnga la dreapta

9.

XOR pe bii

de la stnga la dreapta

10.

SAU pe bii

de la stnga la dreapta

6.
Relaionali

Programare procedural

12

Proritatea i asociativitatea
operatorilor n limbajul C
11.

&&

I logic

de la stnga la dreapta

12.

||

SAU logic

de la stnga la dreapta

13.
Condiiona
l

? :

a ? x : y (if a then x else y)

de la dreapta la stnga

14.
Atribuire

= += -=
*=/=
%=
&=
^=
|=
<<= >>=

de la dreapta la stnga

15.
Virgul

de la stnga. la dreapta

Programare procedural

13

Arborele unei expresii


(a + b) *
(c * d * e 4 / f)
n
n
n

Prefix:
*+ab-**cde/4f
Afix:
a+b*c*d*e4/f
Postfix:
ab+cd*e*4f/-*

Programare procedural

14

Clase de operatori i de expresii


n
n
n
n
n
n
n

Aritmetici
Relaionali
Logici
Pe mulimi
Pe iruri de caractere
Pe iruri de bii
Pe pointeri

n
n
n
n

Operatorul de
determinare a domeniului
de vizibilitate (engl. scope
resolution operator)
Conversie explicit
Atribuire
Condiional
Operatorul virgul.

Programare procedural

15

Clase de operatori i de expresii


Operatori aritmetici se folosesc la
construirea expresiilor aritmetice.
n Operanzii trebuie s fie de tipuri numerice,
n Rezultatul evalurii este de tip numeric.
n Fiecare limbaj posed propriile reguli de
efectuare a calculelor i de stabilire a
tipului rezultatului.
n

Programare procedural

16

Clase de operatori i de expresii


Operatori relaionali se aplic unor
operanzi de tipuri variate, producnd un
rezultat Boolean.
n n C nu exist tipul boolean. Orice valoare
ntreag diferit de zero este tratat ca
true i valoarea ntreag zero este tratat
ca false.
n <, >, <=, >=, == (egalitate), != (inegalitate).
n

Programare procedural

17

Clase de operatori i de expresii


Operatori logici au de regul operanzi de
tip boolean i ntorc un rezultat de tip
boolean.
n Operatorii logici n C:
n

(i logic), || (sau logic), ! (negaie logic


operator unar).
Opereaz asupra unor ntregi iar rezultatul
este zero (false) sau unu (true).
&&

Programare procedural

18

Clase de operatori i de expresii


Operatori pe mulimi au operanzi de tip
mulime
n ntorc un rezultat de tip mulime.
n Exist doar n limbajele ce suport tipul
mulime.
n Limbajul C nu suport acest tip de date.
n

Programare procedural

19

Clase de operatori i de expresii


n

n
n
n

Operatori pe iruri de caractere operatori


pentru lucrul cu iruri de caractere + pentru
concatenarea a dou iruri
C nu are un tip de date special pentru iruri de
caractere
String-urile sunt simulate prin tablourilor
unidimensionale de caractere.
Biblioteca standard C conine o serie de funcii
pentru operaii cu iruri
Programare procedural

20

Clase de operatori i de expresii


Operatori pe iruri de bii lucreaz la
nivel de reprezentare pe bii, aplicnd
operaiile logice cunoscute biilor
corespunztori
n Valorile biilor (0 i 1) se consider la
aplicarea operaiilor drept valori de adevr.
n Acest tip de operatori este specific
limbajelor de asamblare.
n

Programare procedural

21

Clase de operatori i de expresii


C i C++ LP orientate pe aplicaii sistem
n Au fost prevzute cu acest gen de operaii
care permit accesul la memorie la nivel de
bit.
n Operatori pe iruri de bii n C
n

<<,

>> deplasare stnga, dreapta


&, |, ^ - SI, SAU, SAU EXCLUSIV (XOR)
~ negaie
Programare procedural

22

Conversie explicit i implicit


Pentru conversii explicite n C exist
operatorul cast: (tip)
n Exemplu:
n

char

* p = (char*)0777;

O conversie de tip trebuie evitat dac nu


este necesar pentru c ngreuneaz
nelegerea programelor
Programare procedural

23

Conversie explicit i implicit


int i = 1;
char* pc = "asdf";
int* pi = &i;
i = (int)pc;
pc = (char*)i; // pc i poate schimba valoarea.
// pe unele maini sizeof(int) este mai mic dect
//sizeof(char*)
pi = (int*)pc;
pc = (char*)pi; // pc i poate schimba valoarea.
// pe unele maini un char* se reprezint altfel
// dect un int*
Programare procedural

24

Conversie explicit i implicit


Orice pointer se poate atribui (fr
conversie explicit de tip) la un void*,
n Un void* se poate converti explicit la un
pointer de orice tip.
n

Programare procedural

25

Conversie explicit i implicit


n

Conversia implicit apare cel puin n


urmtoarele situaii:
la

operaia de atribuire;
la apelul unui subprogram, n cadrul
procesului de evaluarea a parametrilor;
la evaluarea unei expresii mixte.

Programare procedural

26

Operatorul condiional
expr_logic? expr_adev: expr_fals
n echivalent semantic cu:
if(expr_logic) expr_adev; else expr_fals;
n

Exemplu:
max = (a>b)?a:b;

Programare procedural

27

Operatorul virgul
n

n C i C++ virgula este:


epxr1,

expr2, , exprN

Se evalueaz de la stnga la dreapta


expresiile.
n aloarea final atribuit expresiei secven
este cea a expresei exprN
n

Programare procedural

28

Operatorul virgul
Pentru:
int x = 6, y = 7, z, w;
w = (z = y+x, y = y-x, x = x*y-z, x+y+z);
n Vom obine:
x = -7; y = 1; z = 13; w = 7;
n

Programare procedural

29

Evaluare a expresiilor logice


n

Evaluare scurtcircuit

e:=x and y, dac x = false, atunci e := false


e:=x or y, dac x = true, atunci e := true

Efecte benefice
pentru timpul de execuie (se elimin unele
operaii inutile)
pentru fiabilitatea programului (se evit
unele situaii de excepie)

Programare procedural

30

Programare procedural
Instruciuni i controlul
execuiei
Curs 12

Programare procedural

Coninuturi
Instruciunea de atribuire
n Instruciunea compus
n Instruciuni condiionale (de ramificare,
de selectare)
n Instruciuni de ciclare
n Instruciuni de transfer
n

Programare procedural

Instruciuni
Instruciuni sau comenzi = descriu operaii
ce trebuie executate de un program scris
ntr-un limbaj de programare (imperativ)
n Pe lng instruciuni putem avea:
n

declaraii
directive

de compilare

Programare procedural

Instruciuni
n

n funcie de semantica :
de

atribuire
de intrare-ieire (transfer ntre memorie i
dispozitivele periferice de regul prin fiiere)
de control

Programare procedural

Instruciuni
Execuia unui program scris ntr-un limbaj
de programare imperativ = ir de
transformri ale valorilor unor locaii de
memorie
n Execuia este controlat de mecanisme
care determin ordinea de execuie a
instruciunilor
n

Programare procedural

Instruciunile de control
Instruciuni condiionale
n Instruciuni de ciclare
n Instruciuni de lucru cu subprograme
n

declararea

de subprograme
apelarea subprogramelor inclusiv revenirea
n

Instruciuni de transfer (salt)

Programare procedural

Instruciuni
n

Din punctul de vedere al structurrii:


Instruciuni

simple realizeaz o aciune bine


precizat semantic
Instruciuni compuse format din mai multe
instruciuni simple delimitate de>
begin-end
n { }
n

Programare procedural

Instruciunea de atribuire
n

Forma general:
exprid

opatr expr

exprid

- expresie de identificare;
opatr - operatorul de atribuire;
expr - expresie.

Programare procedural

Instruciunea de atribuire
n

Numele unei variabile are dubl identitate:


- referin (adresa zonei de memorie
asociat variabilei)
r-valoare valoarea memorat n zona
respectiv de memorie
l-valoare

x = x + 1;

Programare procedural

Instruciunea de atribuire - exemple


int v1, v2;
int *pv1, *pv2, *pv3;
/*situaia iniial*/
v1 = 5;
v2 = 15;
pv1 = (int*)malloc(sizeof(int));

Programare procedural

10

Instruciunea de atribuire - exemple


1. iniializarea variabilelor dinamice
*pv1 = v1; /* atribuire de valori*/
pv2 = &v2; /* atribuire de pointeri */
pv3 = pv1; /* atribuire de pointeri, salvare
necesar pentru dealocarea zonei de
memorie alocat mai sus */
Programare procedural

11

Instruciunea de atribuire - exemple


2. atribuire de pointeri
pv1 = pv2;
*pv1 i *pv2 desemneaz acelai obiect, aici v2
3. atribuire de valori *pv1 = *pv2
pv1 = pv3; /* refacerea variabilei dinamice pv1*/
*pv1 = *pv2; /* *pv1 i *pv2 au aceeai valoare fr ca pv1
i pv2 s fie egale */

Programare procedural

12

Instruciunea de atribuire - exemple


4. atribuire indirect v1 = v2 prin *pv1 = *pv2
pv1 = &v1; /* pv1 conine adresa lui v1 */
*pv1 = *pv2; /* similar cu v1 = v2 */
free(pv3); /* eliberarea memoriei */

Programare procedural

13

Instruciunea compus
Specific faptul c instruciunile care o
compun se execut n ordinea n care
apar
n Instruciunile componente sunt tratate ca o
singur instruciune
n

Programare procedural

14

Instruciunea compus
n

Instruciune compus = bloc (n unele


limbaje, C, C++)
Instruciunea

compus nu conine declaraii


Blocul poate conine declaraii (este o unitatea
de vizibilitate)

Programare procedural

15

Instruciuni condiionale (de


ramificare, de selectare)
Scop = alegerea unuia dintre mai multe
fluxuri de control al prelucrrii (alternative
de continuare a execuiei)
n Sintaxa:
n

if (expresie)
instruciune1;
[else
instruciune2;]
Programare procedural

16

Instruciuni condiionale
expresie trebuie s fie de tip aritmetic sau
pointer
n Dac expresie este diferit de zero
n

atunci

se execut instruciune1,
altfel se execut instruciune2.
n

Partea else este opional.

Programare procedural

17

Instruciuni condiionale
Dac n limbaj exist tipul boolean atunci
expresie trebuie s aib valoarea true sau
false.
n Instruciunea de selectare multipl switch
n

Alternativ

la if n cascad
Soluie mai elegant
Expresivitate sporit
Programare procedural

18

Instruciuni condiionale
n
n
n

Alternativ care se execut se stabilete pe baza


unei expresii selector
Valorile luate n considerare sunt etichete case
Trebuie considerate urmtoarele aspecte:
tipul

expresiei selectoare;
tipul etichetelor case;
este posibil existena etichetelor reciproc
neexclusive;
etichetele acoper toat mulimea valorilor expresiei
selectoare.
Programare procedural

19

Instruciuni condiionale
switch (expresie)
{
case eticheta1:
instructiune 1;
break;
case eticheta2:
instructiune n;
break;
...
default:
instructiune n;
break;
}

Programare procedural

20

Instruciuni de ciclare
Instruciunile de ciclare (repetitive,
iterative) realizeaz specificarea unor
procese de calcul iterative
n Pot fi
n

cu

numr cunoscut de pai


cu numr necunoscut de pai (iteraii)

Programare procedural

21

Instruciuni de ciclare
n

Din punctul de vedere al locului unde se


face testarea condiiei pentru reluarea
buclei:
cu

test iniial (while)


cu test final (do ... while)

Programare procedural

22

Instruciuni de ciclare
instruciune-de-ciclare::=
while (expresie) instruciune;
do instruciune while (expresie);
for (instruciune-iniializare-for; expresie;
expresie)
instruciune;

Programare procedural

23

Instruciuni de ciclare
for (instruciune-iniializare-for; expr-1; expr-2)
instruciune;
echivalent cu:
instruciune-iniializare-for;
while (expr-1){
instruciune;
}
Programare procedural

24

Instruciuni de transfer (salt)


instruciune-de-salt::=
break; (n switch sau n instr. de ciclare)
continue; (numai n instr. de ciclare)
return expresieopt;
goto identificator;

Programare procedural

25

Programare procedural
Proceduri i transmiterea
parametrilor
Curs 13

Programare procedural

Coninuturi
n
n
n
n
n
n

Abstractizare i specificare
Proceduri
Evaluarea i transmiterea parametrilor
Specificarea parametrilor unei proceduri
Noiunea de efect secundar
Proceduri mutual recursive

Programare procedural

Abstractizare i specificare
Principiului machiavelic divide et impera
este viabil n programare
n divide et impera = descompunere a unei
probleme n subprobleme
n

Programare procedural

Abstractizare i specificare
n

Fiecare subproblem
este situat la acelai nivel de detaliere; ea
poate fi tratat ulterior ca o problem
distinct;
se poate rezolva independent;
soluiile se pot combina pentru a obine
soluia problemei iniiale

Programare procedural

Abstractizare i specificare
Descompunere strns legat de
abstractizare
n Prin abstractizare se neglijeaz unele
informaii (nesemnificative) pstrndu-se
doar acelea considerate eseniale din
punctul de vedere al contextului aplicaiei.
n Lucruri diferite (ns totui nrudite) se pot
trata identic
n

Programare procedural

Abstractizare i specificare
Abstractizarea prin parametrizare
presupune identificarea intrrilor i a
ieirilor, care vor constitui parametrii
formali ai problemei respective.
n Ce pot fi parametrii unei probleme?
n

numai

date (adic realizri ale unor tipuri de


dat cunoscute) sau
tipuri de date
Programare procedural

Abstractizare i specificare
n

Abstractizarea prin specificare se face


prin asocierea unei specificri
subproblemei, considerndu-se apoi c
orice cerere de rezolvare a subproblemei
se bazeaz pe aceast specificare, mai
mult dect pe un algoritm de rezolvare a
ei.

Programare procedural

Abstractizare i specificare
n

Realizarea specificrii se face printr-un


cuplu de aseriuni, a cror folosire se
bazeaz pe dou reguli. Aseriunile:

(pre-condiia) specific proprietile


ce trebuie satisfcute cnd se dorete
rezolvarea subproblemei;
realizeaz (post-condiia) specific
proprietile presupuse a fi ndeplinite la
terminarea rezolvrii problemei.
necesit

Programare procedural

Abstractizare i specificare
n

Regulile specificrii afirm c:


dup

rezolvarea unei subprobleme se poate


presupune c post-condiia este adevrat
se pot admite numai acele proprieti care
deriv din post-condiie.

Programare procedural

Abstractizare i specificare
n

Abstractizarea procedural - abstractizare de


tip operaional prin care se realizeaz o nou
operaie. Permite adugarea de noi operaii
(extinderea) unui limbaj de programare
(considerat ca main virtual).
Abstractizarea prin tipuri de date abstracte
se definesc noi clase (structuri) de date i
operaii pe aceste obiecte

Programare procedural

10

Abstractizare i specificare
Abstractizarea prin proceduri combin
metodele abstractizrii prin parametrizare
cu cele ale abstractizrii prin specificare
n Procedura = unitate sintactic i
semantic care descrie transformarea
argumentelor furnizate la intrare n
argumente de ieire
n

Programare procedural

11

Abstractizare i specificare
n

Din punct de vedere semantic, procedura se


poate identifica ntr-o oarecare msur cu
subproblema
Cerine ale abstractizrii prin proceduri:
Minimalitate

comportamentul trebuie precizat numai


n limitele necesare
Generalitate se obine prin utilizarea parametrilor n
locul variabilelor
Simplitate procedura trebuie s aib un scop bine
definit i uor de explicat

Programare procedural

12

Abstractizare i specificare
Procedur bine gndit = se poate descrie
scopul ei prin numele acesteia.
n Simplitatea implic, de obicei, ca o
procedur s aib un cod de
implementare redus (de ordinul zecilor de
linii surs)
n

Programare procedural

13

Abstractizare i specificare
n
n
n

Abstractizarea prin parametrizare servete la


identificarea datelor utilizate.
Este definit cu ajutorul parametrilor formali.
Ori de cte ori se apeleaz o procedur, parametrii de
apel (efectivi) trebuie n general s corespund ca
numr i semnificaie cu cei formali.
Dou momente deosebite din viaa unei proceduri:

proiectarea
utilizarea ei.

Lista de parametri, stabilit la proiectare, realizeaz


interfaa cu alte proceduri, ofer generalitate

Programare procedural

14

Abstractizare i specificare
n

Abstractizarea prin specificare - concentrare


asupra comportamentului procedurilor scrise, cu
neglijarea detaliilor de implementare, (trebuie
gndit ce trebuie s fac procedura, i nu cum
trebuie s fac)
Pentru o aceeai specificare se pot realiza mai
multe implementri, diferite ntre ele (n limbaje
diferite, cu algoritmi diferii).

Programare procedural

15

Abstractizare i specificare
La schimbarea implementrii, programele
apelante nu vor trebui modificate dac
specificarea procedurii nu se schimb.
n Abstractizarea prin specificare ofer o
metod de proiectare a programelor ce
are dou proprieti importante:
n

localizare
modificabilitate.

Programare procedural

16

Abstractizare i specificare
n

Localizarea = implementarea unei abstractizri


se poate face independent de implementarea
altora.
Avantajele oferite
posibilitatea

lucrului n echip (proceduri diferite pot fi


implementate de persoane diferite)
creterea lizibilitii (la nelegerea scopului unei
proceduri nu este necesar cunoaterea algoritmilor
folosii pentru alte proceduri apelate de ea, ci doar a
semanticii acestora).
Programare procedural

17

Abstractizare i specificare
Modificabilitatea = limitarea efectelor unei
modificri.
n Dac implementarea unei proceduri se
modific fr modificarea specificrii,
atunci apelul procedurii nu se modific,
n Efectul modificrii se reduce numai la
implementare.
n

Programare procedural

18

Abstractizare i specificare
n

Modificabilitatea ofer o metod de control a


performanei programelor:
se

realizeaz specificarea corect i complet a


tuturor procedurilor unui program i se
implementeaz cei mai simpli algoritmi;
se execut programul, detectndu-se locurile
nguste (engl. bottlenecks), adic acele proceduri
care consum majoritatea timpului de execuie;
se rescrie codul pentru procedurile respective,
folosindu-se algoritmi mai performani.

Programare procedural

19

Abstractizare i specificare
n

Proiectarea unei proceduri presupune dou etape


distincte:

specificarea definete ce au n comun diversele implementri ale


acesteia
Implementarea 2 implementri de proceduri sunt echivalente
semantic dac reprezint aceeai abstractizare; ele pot diferi din
punctul de vedere al algoritmilor folosii.

Tehnici de sporire a lizibilitii unei implementri


menionm:

utilizarea notaiilor de la specificarea unor parametri;


utilizarea comentariilor
folosirea indentrii

Programare procedural

20

Abstractizare i specificare
n

Specificarea unei proceduri conine


antetul

acesteia (partea sintactic) numele procedurii


i lista de argumentelor (parametrilor), caracteriznd
numele, tipul i ordinea acestora.
descrierea aciunii (partea semantic). Se face prin
aseriunile:
n
n
n

necesit (condiiile sau restriciile de utilizare;


modific (parametrii de intrare care se modific);
realizeaz (comportamentul procedurii).

Programare procedural

21

Abstractizare i specificare
n

Din punctul de vedere al modului n care


furnizeaz rezultatul aciunii lor
Subrutin

- i materializeaz efectul n
modificarea parametrilor de ieire (eventual i
a unora de intrare)
Funcii - furnizeaz un rezultat de un tip
precizat, determinat de parametri.

Programare procedural

22

Abstractizare i specificare
Schema de specificare a unei proceduri este:
nume = proc (lista arg.) [returns (rezultat)]
necesit se precizeaz toate restriciile de
utilizare a procedurii.
modific se precizeaz argumentele care se
modific.
realizeaz descrie comportamentul procedurii.
n

Programare procedural

23

Abstractizare i specificare
concat = proc (a, b: string) returns (ab:
string)
n realizeaz la terminarea execuiei, ab
este un nou ir de caractere ce conine
caracterele din irul a (n ordinea apariiei),
urmate de cele din irul b.

Programare procedural

24

Abstractizare i specificare
elim_dubl = proc (a: array[int])
n modific a
n realizeaz suprimarea apariiei multiple
ale elementelor din a. Indicele inferior al lui
a rmne acelai, dar ordinea elementelor
i numrul de elemente din a se pot
modifica.
Programare procedural

25

Abstractizare i specificare
caut = proc (a: array[int], x: int) returns (i: int)

necesit un tabel ordonat cresctor


n realizeaz dac exist un indice i pentru
care x = a[i], rezultatul este i, altfel i va fi
un ntreg cu valoarea mai mare dect
indicele superior al lui a
n

Programare procedural

26

Abstractizare i specificare
n

Din punctul de vedere al specificrii lor, procedurile pot


fi:

totale (lipsete aseriunea necesit), deci nu exist restricii de


utilizare a lor
pariale (este prezent aseriunea necesit).

O procedur total este definit pe tot domeniul su


(considerat ca produs cartezian al domeniilor tipurilor de
dat ce formeaz lista de parametri, n ordinea
specificrii acestora),
O procedur parial are domeniul restrns n
conformitate cu cerinele impuse de aseriunea necesit.
Programare procedural

27

Proceduri

Programare procedural

28

Proceduri

Programare procedural

29

Proceduri

Programare procedural

30

Proceduri

Programare procedural

31

Proceduri

Programare procedural

32

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