+ All Categories
Home > Documents > Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata...

Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata...

Date post: 23-Apr-2020
Category:
Upload: others
View: 4 times
Download: 0 times
Share this document with a friend
24
PCLP10 - 1 Despre ce discutam astazi cate ceva despre recursivitate directiva include directiva define compilare conditionata directiva error
Transcript
Page 1: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

PCLP10 - 1

Despre ce discutam astazi

• cate ceva despre recursivitate

• directiva include

• directiva define

• compilare conditionata

• directiva error

Page 2: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 3: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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)

Page 4: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 5: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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;

}

Page 6: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 7: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 8: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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)) ;

}

Page 9: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 10: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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;

}

Page 11: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

PCLP10 - 11

Directive de preprocesare

• Programul sursa poate fi prelucrat inainte de a fi

compilat -> preprocesare

• Directive:

– include

– define

– de compilare conditionata

– error

Page 12: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 13: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 14: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 15: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

PCLP10 - 15

Directiva define (2)

#undef nume

• se dezactiveaza substitutia

Exemple:

#define MAX 30

int A[MAX];

#undef MAX

Page 16: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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)

Page 17: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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);…

Page 18: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 19: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 20: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 21: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 22: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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_

Page 23: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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

Page 24: Despre ce discutam astaziusers.utcluj.ro/~simona/pclp/pclp10.pdfPCLP10 - 23 Compilare conditionata (5) Exemplu: Un program este compus din doua fisiere, fis1.cpp si fis2.cpp, ambele

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