You are on page 1of 68

PROGRAMARE

PROCEDURAL
Bogdan Alexe
bogdan.alexe@fmi.unibuc.ro

Secia Informatic, anul I,


2016-2017
Cursul 4
InfOClock 2016-2017

q mari, 18-20, amteatrul Haret

q la nevoie e disponibil i sala 204


(laborator cu 24 calculatoare), miercuri,
16-18
Recapitulare cursul trecut

1. Tipuri de date fundamentale

2. Variabile i constante

3. Expresii i operatori
Programa cursului
q Introducere q Tablouri i pointeri
Algoritmi. Legtura dintre tablouri i pointeri
Limbaje de programare. AritmeXca pointerilor
Introducere n limbajul C. Structura unui program C. Alocarea dinamic a memoriei
Complexitatea algoritmilor. Clase de memorare

q Fundamentele limbajului C q iruri de caractere
Tipuri de date fundamentale. Variabile. Constante. Funcii specice de manipulare.
Operatori. Expresii. Conversii.
Instruciuni de control
q Fiiere text i iere binare
DirecXve de preprocesare. Macrodeniii.
Funcii specice de manipulare.
Funcii de ciXre/scriere.
Etapele realizrii unui program C.
q Structuri de date complexe i autoreferite
q Tipuri derivate de date Denire i uXlizare
Tablouri. iruri de caractere.
Structuri, uniuni, cmpuri de bii, enumerri.
q Funcii (2)
Pointeri.
Funcii cu numr variabil de argumente.
Preluarea argumentelor funciei main din linia de
q Funcii (1) comand.
Declarare i denire. Apel. Metode de trasmitere a Programare generic.
paramerilor.
Pointeri la funcii.
q Recursivitate
Cursul de azi:
1. Operatori i expresii. Conversii

2. Instruciuni de control

3. DirecXve de preprocesare. Macrodeniii

4. Etapele realizrii unui program n C
Evaluarea expresiilor

q precedena i asociativitatea operatorilor


q dac ntr-o expresie apar mai muli operatori, atunci
evaluarea expresiei respect ordinea de preceden
a operatorilor

q dac ntr-o expresie apar mai muli operatori de


aceeai prioritate, atunci se aplic regula de
asociativitate a operatorilor
Operatori
1. Operatori aritmeXci
2. Operatorul de atribuire
3. Operatori de incrementare i decrementare
4. Operatori de egalitate, logici i relaionali
5. Operatori pe bii
6. Ali operatori:
de acces la elemente unui tablou, de apel de funcie, de adresa,
de refereniere, sizeof, de conversie explicit, condiional,
virgul

Ali operatori
q operatorul de acces la elementele tabloului [ ]

q operatorul de apel de funcie (): b = f(a);

q operatorul adres & i operatorul de derefereniere *


q strns legat de pointeri (cursurile urmtoare)

q operatorul sizeof

q operatorul de conversie explicit: (tip)


Ali operatori
q operatorul condiional ? :
q operator ternar
q similar cu instruciunea if
q expresie1? expresie2 : expresie3!
q dac expresie1 e adevarat, execut expresie2, altfel execut expresie3

q operatorul virgul
q evaluarea secvenial a expresiilor (de la stnga la dreapta)
q valoarea ultimei expresii din nlnuire este valoarea expresiei compuse
q cel mai puin prioritar din lista de preceden
Ordinea de preceden i asociaXvitate
Conversii implicite

Ce aeaz
programul alturat?
Conversii implicite
q context
q este permis combinarea mai multor operanzi de tipuri diferite ntr-o
singur expresie

q problema
q operatorii binari, care se aplic asupra a doi operanzi, cer ca tipul
operanzilor s fie acelai pentru a putea efectua operaia

q soluie: conversia implicit


q compilatorul convertete valorile operanzilor la acelai tip ntr-un mod
transparent programatorului naintea generrii codului main
q exist reguli de conversie implicit

q alternativ
q conversii explicite: (tip)
Conversii implicite - reguli
q cnd apar ntr-o expresie tipurile de date char i short (att
signed i unsigned) sunt convertite la tipul int (promovarea
ntregilor)

q n orice operaie ntre dou operanzi, ambii operanzi sunt


convertii la tipul de date cel mai nalt n ierarhie
long double
q ierarhia tipurilor de date: double
(nu exist char i short) oat
q Xpul care se reprezint pe un numr mai mare unsigned long long int
de octei are un rang mai mare n ierarhie long long int
unsigned long int
q pentru acelai Xp, varianta fr semn are rang long int
mai mare dect cea cu semn unsigned int
int
q Xpurile reale au rang mai mare dect Xpurile
ntregi
Conversii implicite - reguli
q conversii implicite la atribuire
q valoarea expresiei din dreapta se convertete la tipul expresiei din stnga
q pot apare pierderi dac tipul nu este suficient de ncptor
Conversii implicite

Ce aeaz
programul alturat?
Cursul de azi:
1. Operatori i expresii. Conversii

2. Instruciuni de control

3. DirecXve de preprocesare. Macrodeniii

4. Etapele realizrii unui program n C
Instruciuni de control
q reprezint:
q elementele fundamentale ale funciilor
q comenzile date calculatorului

q determin fluxul de control al programului (ordinea de execuie a


operaiilor din program)

q instruciuni de baz
q instruciunea expresie
q instruciunea vid
q instruciuni secveniale/liniare
q instruciuni decizionale/selective simple sau multiple
q instruciuni repetitive/ciclice/iterative
q instruciuni de salt condiionat/necondiionat
q instruciunea return
Instruciuni de control
q instruciuni compuse
q create prin combinarea instruciunilor de baz

q programare structurat
q Teorema Bhm-Jacopini: fluxul de control poate fi exprimat folosind
doar trei tipuri de instruciuni de control:
q instruciuni secveniale
q instruciuni decizionale
q instruciuni repetitive
Instruciunea expresie
q format dintr-o expresie urmat de semnul ;
q expresie;
q cele mai frecvente
q se bazeaz pe expresii de atribuire, aritmetice i de incrementare /
decrementare
q adic expresii care au efecte secundare: schimb valoarea unui
operand

q expresie vs. instruciune


Instruciunea vid
q o instruciune care const doar din caracterul ;
q folosit n locurile n care limbajul impune existena unei instruciuni, dar
programul nu trebuie s execute nimic

q cel mai adesea instruciunea vid apare n combinaie cu


instruciunile repetitive
q vezi instruciunea for
Instruciunea compus
q numit i instruciune bloc

q alctuit prin gruparea mai multor instruciuni i declaraii


q folosite n locurile n care sintaxa limbajului presupune o singur
instruciune, dar programul trebuie s efectueze mai multe instruciuni
q gruparea
q includerea instruciunilor ntre acolade, { }

q astfel compilatorul va trata secvena de instruciuni ca pe o singur

instruciune
q {secven de declaraii i instruciuni }
Instruciuni decizionale/selecXve
q ramific fluxul de control n funcie de valoarea de adevr a
expresiei evaluate

q limbajul C furnizeaz dou instruciuni decizionale


q instruciunea if instruciune decizional simpl

q instruciunea switch - instruciune decizional multipl


Instruciunea IF
q instruciunea selectiv fundamental
q permite selectarea uneia dintre dou alternative n funcie de valoarea
de adevr a expresiei testate

q forma general:
if (expresie)
{bloc de instructiuni 1};
else
{bloc de instructiuni 2};

q valoarea expresiei incluse ntre paranteze rotunde trebuie


s fie un scalar
q dac e nenul se execut blocul de instruciuni 1 (instruciunea
compus), altfel se execut blocul de instruciuni 2

q ramura else poate lipsi


Instruciunea IF
q se citesc numerele naturale a i b de la tastatur. S se
afieze ultima cifr a numrului ab.
Instruciunea IF
q erori frecvente:
q nu includem acoladele

q ntotdeauna se va executa instruciunea b=a;

q confundarea operatorul de egalitate ==, cu operatorul de atribuire =

q mesajul a este 10 nu va fi afiat q mesajul a este 10 va fi afiat


q dup testarea egalitii ntotdeauna
folosind operatorul == se q expresia a = 10
returneaz 0 q a ia valoarea 10
q (2 nefiind egal cu 10)
q se evalueaz adevrat la
executarea instruciunii printf
Instruciunea IF
q instruciuni IF imbricate
q pe oricare ramur poate conine alte instruciuni if

q forma general:
if (expresie1)
if (expresie2) {bloc de instructiuni 1};
else {bloc de instructiuni 2};
else
{bloc de instructiuni 2};


Instruciunea IF
q instruciuni IF n cascad
q testeaz succesiv mai multe condiii implementnd o variant de selecie
multipl

q forma general:
if (expresie1) {bloc de instructiuni 1};
else if (expresie2) {bloc de instructiuni 2};
else if (expresie3) {bloc de instructiuni 3};

else {bloc de instructiuni N};


Instruciunea SWITCH
q efectueaz selecia multipl
q util cnd expresia de evaluat are mai multe valori
posibile

q forma general
switch (expresie){
case val_const_1: {bloc de instructiuni 1};
case val_const_2: {bloc de instructiuni 2};
..
case val_const_n: {bloc de instructiuni N};
default: {bloc de instructiuni D};
}
Instruciunea SWITCH
q poate fi ntotdeauna reprezentat prin instruciunea IF
q de regul prin instruciuni IF cascadate

q n cazul instruciunii switch fluxul de controlul sare direct la


instruciunea corespunztoare valorii expresiei testate

q switch este mai rapid i codul rezultat mai uor de neles


Instruciunea SWITCH
Instruciunea SWITCH
q se citesc numerele naturale a i b de la tastatur. S se
afieze ultima cifr a numrului ab.
Instruciunea SWITCH
q efectueaz selecia multipl
q util cnd expresia de evaluat are mai multe valori
posibile

q forma general
switch (expresie){
case val_const_1: bloc de instructiuni 1;
case val_const_2: bloc de instructiuni 2;
..
case val_const_n: bloc de instructiuni N;
default: bloc de instructiuni D;
}
Instruciunea SWITCH
q mod de funcionare i constrngeri:

q expresie se evalueaz o singur dat la intrarea n instruciunea switch

q expresie trebuie s rezulte ntr-o valoare ntreag (poate fi inclusiv


caracter, dar nu valori reale sau iruri de caractere)

q valorile din ramurile case notate val_ const_i (numite i etichete)


trebuie s fie constante ntregi (sau caracter), reprezentnd o singur
valoare

q nu se poate reprezenta un interval de valori

q instruciunile care urmeaz dup etichetele case nu trebuie incluse ntre


acolade, dei pot fi mai multe instruciuni, iar ultima instruciune este de
regul instruciunea break
Instruciunea SWITCH
q mod de funcionare i constrngeri:

q dac valoarea expresiei se potrivete cu vreuna din valorile constante


din ramurile case, atunci se vor executa instruciunile corespunztoare
acelei ramuri, altfel se execut instruciunea de pe ramura default (dac
exist)

q dac nu s-a ntlnit break la finalul instruciunilor de pe ramura pe care s-a


intrat, atunci se continu execuia instruiunilor de pe ramurile consecutive
(fr verificarea etichetei) pn cnd se ajunge la break sau la sfritul
instruciunii switch, moment n care se iese din instruciunea switch i se
trece la execuia instruciunii imediat urmtoare

q ramura default este opional iar poziia relativ a acesteia printre celelalte
ramuri nu este relevant

q dac nici o etichet nu se potrivete cu valoarea expresiei testate i nu


exist ramura default, atunci instruciunea switch nu are nici un efect
Instruciunea SWITCH
q omiterea instruciunii break de la finalul unei ramuri case
q accidental - este o eroare frecvent
q deliberat - permite fluxului de execuie s intre i pe ramura case urmtoare
Instruciunea SWITCH
Instruciuni repeXXve
q sunt numite i instruciuni iterative sau ciclice

q efectueaz o serie de instruciuni n mod repetat fiind


condiionate de o expresie de control care este evaluat la
fiecare iteraie

q instruciunile iterative furnizate de limbajul C sunt:

q instruciunea repetitiv cu testare iniial while

q instruciunea repetitiv cu testare final do-while

q instruciunea repetitiv cu testare iniial for


Instruciunea WHILE
q execut n mod repetat o instruciune atta timp ct expresia
de control este evaluat la adevrat

q evaluarea se efectueaz la nceputul instruciunii


q dac rezultatul corespunde valorii logice adevrat
q se execut corpului instruciunii, dup care se revine la testarea expresiei
de control
q aceti pai se repet pn cnd expresia va fi evaluat la fals
q acesta va determina ieirea din instruciune i trecerea la instruciunea
imediat urmtoare

q forma general: while (expresie) {bloc de instruciuni}


Instruciunea WHILE

A programmer heads out to


the store. His wife says
"while you're out, get some
milk.
He never came home.
Instruciunea WHILE

q Observaii
q valorile care particip n expresia de control s fie iniializate nainte
q evitare ciclului infinit
Instruciunea WHILE

q Observaii
q Dac o expresie nu mai este adevrat nu se mai continu cu evaluarea expresiilor urmtoare
Instruciunea WHILE

Ce aeaz secvena
de cod alturat?

CICLEAZA!!!
Instruciunea DO-WHILE
q efectueaz n mod repetat o instruciune atta timp ct
expresia de control este adevrat

q evaluarea se face la finalul fiecrei iteraii


q corpul instruciunii este executat cel puin o dat

q forma general: do {bloc de instruciuni} while (expresie);

q eroare frecvent: omiterea caracterului punct i virgul de la


finalul instruciunii
Instruciunea DO-WHILE
Instruciunea FOR
q evaluarea expresiei de control se face la nceputul fiecrei
iteraii

qforma general:
for (expresii_init;expresie_ control;expresie_ajustare)
{bloc de instructiuni}

q poate fi ntotdeauna transcris folosind o instruciune while:


expresii_init;
while (expresie_control)
{bloc de instructiuni
expresii_ajustare;}
Instruciunea FOR

q instruciunea for permite ca elementul de ajustare din antetul instruciunii


s cuprind mai multe expresii
q se poate ajunge chiar i la situaia n care corpul instruciunii nu mai conine
nici o instruciune de executat
q se folosete instruciunea vid (punct i virgul) pentru a indica sfritul
instruciunii for
Instruciunea FOR

Ce aeaz secvena
de cod alturat?

Aeaz 6
Instruciunile break, conXnue i goto
q realizeaz salturi
q ntrerup controlului secvenial al programului i continu execuia dintr-un
alt punct al programului sau chiar provoac ieirea din program

q instruciunea break provoac ieirea din instruciunea


curent

q instruciunea continue provoac trecerea la iteraia imediat


urmtoare in instruciunea repetitiv

q instruciunea goto produce un salt la o etichet predefinit


n cadrul aceleai funcii
Instruciunea goto
q instruciunea goto produce un salt la o etichet predefinit
n cadrul aceleai funcii

q forma general: goto eticheta


q unde eticheta este definit n program
q eticheta: instructiune
Instruciunile break, conXnue i goto
Instruciunile break, conXnue i goto
Instruciunea RETURN
q se folosete pentru a returna fluxul de control al programului
apelant dintr-o funcie (main sau alt funcie)

q are dou forme:


q return;
q return expresie;
Cursul de azi:
1. Operatori i expresii. Conversii

2. Instruciuni de control

3. DirecXve de preprocesare. Macrodeniii

4. Etapele realizrii unui program n C
Preprocesare n limbajul C
q preprocesarea apare naintea procesului de compilare

q const n substituirea simbolurilor din codul surs pe baza


directivelor de preprocesare

q directivele de preprocesare sunt precedate de caracterul


diez #

q preprocesarea asigur
q includerea coninutului fiierelor (de obicei a fiierelor header)
q definirea de macrouri (macrodefiniii)
q compilarea condiionat
Constante simbolice i macro-uri
q directiva utilizat este #define

definirea unei constante simbolice este un caz special al


q

definirii unui macro


#define nume text

q n timpul preprocesrii nume este nlocuit cu text

q text poate s fie mai lung dect o linie, continuarea se


poate face prin caracterul \ pus la sfritul liniei

q text poate s lipseasc, caz n care se definete o


constant vid
Constante simbolice i macro-uri
q directiva utilizat este #define

definirea unei constante simbolice este un caz special al


q
definirii unui macro
#define nume text

q n timpul preprocesrii nume este nlocuit cu text

nlocuirea se continu pn n momentul n care nume nu


q
mai este definit sau pn la sfritul fiierului
q renunarea la definirea unei constante simbolice se
poate face cu directiva #undef nume
Constante simbolice i macro-uri
q definirea unui macro:
#define nume(p1, p2, ...,pn) text

q numele macro-ului este nume


q parametri macro-ului sunt p1, p2, , pn
q textul substituit este text

q parametrii formali sunt substituii de cei actuali n text

q apelul macro-ului este similar apelului unei funcii


nume(p_actual1,p_actual2,...,p_actualn)
Constante simbolice i macro-uri
Macro-uri
q invocarea unui macro presupune nlocuirea apelului cu
textul macro-ului respectiv
q se genereaz astfel instruciuni la fiecare invocare i
care sunt ulterior compilate
q se recomand astfel utilizarea doar pentru calcule
simple
q parametrul formal este nlocuit cu textul corespunztor
parametrului actual, corespondena fiind pur poziional

q timpul de procesare este mai scurt cnd se utilizeaz


macro-uri (apelul funciei necesit timp suplimentar)
Compilarea condiionat
q faciliteaz dezvoltarea dar n special testarea codului
q directivele care pot fi utilizate: #if, #ifdef, #ifndef
q directiva #if:
#if expr #if expr
text text1
#endif #else
text2
#endif
q unde expr este o expresie constant care poate fi evaluat de
ctre preprocesor, text, text1,text2 sunt poriuni de cod
surs

q dac expr nu este zero atunci text respectiv text1 sunt


compilate, altfel numai text2 este compilat i procesarea continu
dupa #endif
Compilarea condiionat
q directiva #ifdef:
#ifdef nume #ifdef nume
text text1
#endif #else
text2
#endif

q unde nume este o constant care este testat de ctre preprocesor


dac este definit, text, text1,text2 sunt poriuni de cod
surs

q dac nume este definit atunci text respectiv text1 sunt


compilate, altfel numai text2 este compilat i procesarea continu
dupa #endif
Compilarea condiionat
q directiva #ifndef:
#ifndef nume #ifndef nume
text text1
#endif #else
text2
#endif

q unde nume este o constant care este testat de ctre preprocesor


dac NU este definit, text,text1,text2 sunt poriuni de cod
surs

q dac nume NU este definit atunci text respectiv text1 sunt


compilate, altfel numai text2 este compilat i procesarea continu
dupa #endif
Compilarea condiionat
q directivele #ifdef i #ifndef sunt folosite de obicei pentru a
evita incluziunea multipl a modulelor n programarea modular

q la nceputul fiecrui fiier header se practic de obicei o astfel de secven


#ifndef _MODUL_H_
#define _MODUL_H_
...
#endif /* _MODUL_H_ */

q exist o serie de macro-uri predefinite care nu trebuie re/definite:


__DATE__ data compilrii
__CDECL__ apelul funciei urmrete conveniile C
__STDC__ definit dac trebuie respectate strict regulile ANSI C
__FILE__ numele complet al fiierului curent compilat
__FUNCTION__ numele funciei curente
__LINE__ numrul liniei curente
Compilarea condiionat
Cursul de azi:
1. Operatori i expresii. Conversii

2. Instruciuni de control

3. DirecXve de preprocesare. Macrodeniii

4. Etapele realizrii unui program n C
De la codul surs la programe executabil
q etape
q editarea codului surs
q salvarea fiierului cu extensia .c

q preprocesarea
q efectuarea directivelor de preprocesare

q ca un editor modific i adaug la codul surs

q compilarea
q verificarea sintaxei

q transformare n cod obiect (limbaj main) cu extensia .obj

q nu este nc executabil !

q link-editarea (editarea legturilor)


q combinarea codului obiect cu alte coduri obiect (al bibliotecilor asociate
fiierelor header)
q transformarea adreselor simbolice n adrese reale
De la codul surs la programe executabil
q etape
q editarea codului surs
q preprocesarea
q compilarea
q link-editarea (editarea legturilor)
De la codul surs la programe executabil
q etape
q editarea codului surs
q preprocesarea
q compilarea
q link-editarea (editarea legturilor)

You might also like