View
5
Download
0
Category
Preview:
Citation preview
PCLP10 - 1
Despre ce discutam astazi
• cate ceva despre recursivitate
• directiva include
• directiva define
• compilare conditionata
• directiva error
PCLP10 - 2
Recursivitate (1)
• o tehnica de elaborare a programelor
• proces recursiv - genereaza aparitia unor
procese similare lui
• proces recursiv
– finit
– infinit
• conditie de terminare
PCLP10 - 3
Recursivitate (2)
• functie recursiva – se autoapeleaza
• trebuie sa existe o conditie de terminare ->
testarea unei conditii de oprire
• memorarea parametrilor starii actuale a
functiei -> in stiva
• apelurile recursive solicita resursele
calculatorului (timp si memorie)
PCLP10 - 4
Recursivitate (3)
,)!1(
,1!
nnn
Exemplul 1. Calculul factorialului unui numar.
daca n<2
daca n≥2
),1(
,1)(
nfactorialnnfactorial
daca n<2
daca n≥2
PCLP10 - 5
Recursivitate (4)#include <stdio.h>
double factorial(int n){ if( n<2)
return 1.0; else
return (n*factorial(n-1)); }
int main(){ int nr;
printf (″Introduceti nr. =″);scanf(″%d″, &nr);printf (″\n%3d!=%.2le\n″, nr, factorial(nr)) ;return 0;
}
PCLP10 - 6
Recursivitate (5)
Daca numarul este 3, atunci 3! se va calcula astfel:
double factorial(int n){ if( n<2)
return 1.0; else
return (n*factorial(n-1)); }
factorial(3)double factorial(int n){ if( n<2)
return 1.0; else
return (n*factorial(n-1)); }
factorial(2)
double factorial(int n){ if( n<2)
return 1.0; else
return (n*factorial(n-1)); }
factorial(1)
1
6
2
PCLP10 - 7
Recursivitate (6)
),,(
),,(
,
),(
bbacmmdc
abacmmdc
a
bacmmdc
Exemplul 2. Calculati cel mai mare divizor comun
a doi intregi pozitivi a si b.
Algoritmul lui Euclid:
daca a=b
daca b>a
daca a>b
PCLP10 - 8
Recursivitate (7)#include <stdio.h>
int cmmdc(int a, int b){ if( a == b)
return a; else
if (a<b)return (cmmdc(a,b-a));
elsereturn (cmmdc(a-b,b));
}
void main()
{ int a,b;
printf (″Introduceti primul nr. =″); scanf(″%d″, &a);
printf (″Introduceti al doilea nr. =″); scanf(″%d″, &b);
printf (″\ncmmdc(%d,%d)=%d\n″, a, b, cmmdc(a,b)) ;
}
PCLP10 - 9
Recursivitate (8)
),2()1(
,)(
nfibnfib
nnfib
Exemplul 3. Calculati cel de-al n-lea termen al
sirului lui Fibonacci.
f0 = 0, f1=1, fn = fn-1 + fn-2
daca n<2
daca n≥2
PCLP10 - 10
Recursivitate (9)#include <stdio.h>
int fib(int n);
int fib(int n){ if( n<2)
return n; else
return (fib(n-1) + fib(n-2)); }
int main()
{ int nr;
printf (″Introduceti nr. =″);
scanf(″%d″, &nr);
printf (″\nTermenul %d al sirului este %d\n″, nr, fib(nr)) ;
return 0;
}
PCLP10 - 11
Directive de preprocesare
• Programul sursa poate fi prelucrat inainte de a fi
compilat -> preprocesare
• Directive:
– include
– define
– de compilare conditionata
– error
PCLP10 - 12
Directiva include (1)
#include <fisier>
#include ″fisier″
• utilizarea ″ ″ impune cautarea fisierului in directorul
curent si apoi in directoarele mediului de
programare
• utilizarea < > impune cautarea fisierului in
directoarele mediului de programare
• fisier este fisier.h, fisier.c sau fisier.cpp
PCLP10 - 13
Directiva include (2)
• fisierul poate contine si calea:
D:\\PCLP\\PCLP3\\user\\fis.h
• inainte de compilare fisierul specificat este inclus in
fisierul in care a fost inclus
Obs.:
- se va include ceea ce este strict necesar
- se mareste dimensiunea fisierului executabil
PCLP10 - 14
Directiva define (1)
#define nume succesiune_de_caractere
• se substituie nume cu succesiune_de_caractere
• de obicei nume se scrie cu majuscule
• succesiune_de_caracter se poate continua pe mai
multe randuri, se utilizeaza ‘\’
• inainte de compilare se inlocuieste nume cu
succesiune_de_caractere peste tot unde apare in
fisier
PCLP10 - 15
Directiva define (2)
#undef nume
• se dezactiveaza substitutia
Exemple:
#define MAX 30
int A[MAX];
…
#undef MAX
…
PCLP10 - 16
Directiva define (3)
Obs. 1:#define ALFA 20
#define BETA ALFA+80…x = 3 * BETA;…
=> x = 3 * ALFA+80 ceea ce e altceva decat am
dorit => este indicat sa se utilizeze parantezele
#define BETA (ALFA+80)
PCLP10 - 17
Directiva define (4)
Obs. 2:- definirea unui macro
#define nume(p1,p2,…,pn) text
exemplu:
#define INTERSCH(tip,a,b) { tip t;\
t=a; a=b; b=t;\
}…INTERSCH(int,x,y);
INTERSCH(double,u,v);…
PCLP10 - 18
Directiva define (5)
Alt exemplu:
#define ABS(x) ((x)<0 ? –(x):(x))…k=ABS(a-b);…
- utilizate pentru calcule scurte
- corespondenta intre parametri formali si
cei actuali este strict pozitionala
- timpul de calcul mai scurt decat in cazul
functiilor
PCLP10 - 19
Compilare conditionata (1)1. #if expresie
text#endif
- daca expresie≠0 se supune compilarii text
#if expresietext1
#elsetext2
#endif
- daca expresie≠0 se supune compilarii text1, altfel
text2
PCLP10 - 20
Compilare conditionata (2)2. #ifdef nume
text#endif
- daca nume a fost definit se supune compilarii text
#ifdef numetext1
#elsetext2
#endif
- daca nume a fost definit se supune compilarii text1,
altfel text2
PCLP10 - 21
Compilare conditionata (3)3. #ifndef nume
text#endif
- daca nume nu a fost definit se supune compilarii text
#ifndef numetext1
#elsetext2
#endif
- daca nume nu a fost definit se supune compilarii
text1, altfel text2
PCLP10 - 22
Compilare conditionata (4)• sunt utilizate cand mai multe fisiere contin aceleasi
biblioteci, se evita includerea si compilarea lor de mai multe ori
#ifndef _NUME_BIBLIOTECA#include nume_biblioteca#define _NUME_BIBLIOTECA#endif
• cateva constante predefinite_cplusplus_
_DATE_
_FILE_
PCLP10 - 23
Compilare conditionata (5)Exemplu: Un program este compus din doua fisiere,
fis1.cpp si fis2.cpp, ambele fisiere contin apeluri lafunctii a caror prototip este definit in fisierul stdio.h.Pentru a evita dubla includere a fisierului stdio.h seinclude la inceputul fiecarui fisier urmatoareasecventa:
#ifndef _STDIO_H
#include <stdio.h>#define _STDIO_H
#endif
PCLP10 - 24
Directiva error
#error mesaj
• genereaza o eroare insotita de un mesaj
precizat ca parametru
#ifndef _cplusplus_#error Acest program trebuie compilat cu VisualC#endif
Recommended