Sunteți pe pagina 1din 33

PROGRAMAREC++

CURS7

ClasaFraction

LacreareaclaseiFraction,esteimportantsfie ndepliniteurmtoarelecondiii:
accesulladatelemembresfielimitat posibilitateadeapariieaunuinumitornuleliminat reprezentareunicaunuinumrraionalprin simplificareafraciei detaliilelucruluicufraciisfieascunsefadeutilizator
2

ClasaFractionv.1 (1)
class Fraction { private; int num, den; // numaratorul si numitorul public: // functii care asigura accesul indirect la date void set(int n, int d); int get_num(); // citeste numitorul int get_den(); // citeste numaratorul private: // functii suport ale clasei void normalize(); // simplificarea fractiei int gcf(int a, int b); // cel mai mare divizor comun int lcm(int a, int b); // cel mai mic multiplu comun };
3

ClasaFractionv.1 (2)
private
num den

public
set() get_num() get_den()

interfaa

private
normalize() gfc() lcm()
4

ClasaFractionv.1 (3)
// interfaa clasei Fraction void Fraction::set(int n, int d) { num = n; den = d; } int Fraction::get_num () { return n; } int Fraction::get_den() { return d; }
5

ClasaFractionv.1 (4)
// funcii suport // codul acestor functii va fi detaliat ulterior // simplificarea fractiei void Fraction::normalize(){ return; } // cel mai mare divizor comun (greatest common factor, gcf) int Fraction::gcf(int a, int n){ return 0; } // cel mai mic ultiplu comun (lowest common multiple, lcm) int Fraction::lcm(int a, int b) { return 0; }
6

Funciinlinie(inline)
Launapelobinuitdefuncie
funciapreiacontroluldelaprogramulprincipal executinstruciuniledincorpulsu ntoarcerezultatulicontrolulnmodululapelant

Cndo funcie estedeclarat n liniecompilatorul nlocuieteapelullafuncie cu ntregsetulde instruciunicareodefinesc(corpul)


7

Funciaset() nlinie
Variantanlinieafuncieiset() sescrie: void set () {num = n; den = d;} Cndcompilatorultraduceprogramulncodmain,defiecaredatcnd ntlneteunapellafunciaset()deforma: fract.set (1, 2); insereazdirectinstruciunilefuncieiset()nprogram,rezultatulfiindca icumcodulnC++arfifostscrisastfel: {fract.num = 1; fract.den = 2;}
8

Definiiauneifunciinlinie

Definiiauneifunciinlinietrebuieintrodus directndeclaraiaclasei ATENIE:dup definiiauneifunciinutrebuie introduscaracterul punctivirgul


9

ClasaFraction v.2(funciinlinie)(1)
class Fraction { private: int num, den; // numaratorul si numitorul public: void set(int n, int d){num = n; den = d; normalize();} int get_num(){return num;} int get_den(){return den;} private: void normalize(); // simplifica fractia int gcf(int a, int b); // cel mai mare divizor comun int lcm(int a, int b); // cel mai mic multiplu comun };
10

Avantajeleformulriinlinie
Launapeldefuncieobinuit,sistemuldeoperaretrebuiesefectueze unsetdeoperaiiasociate:
salvareacontextuluiprogramului(valorilevariabilelorlamomentulapelului) pentruadefinistarealacarevarevenidupexecuiafunciei copiereaparametriloritransmitereacopiilorcaargumentealefunciei dupexecuie,tergereavariabilelortemporarei transmiterearezultatuluinprogramulprincipal

ncazulfunciilorsimplelacareaciunea sereducenumailacteva instruciunimain(mutarea datelordintroanumitlocaiedememorie nalta etc),operaiileauxiliaredevincostisitoare Eficienaprogramuluicretefoartemultprinscriereafuncieinlinie i execuiainstruciuniloracesteiapeloc


11

Dezavantajealeformulriinlinie

Funciileapelatefoartedesnutrebuieexprimaten linie,pentrucarconducelacretereavolumuluide memoriealocatcodului Funciilerecursivenu potfiformulatenlinie

12

ClasaFraction v.2cufunciinlinie(2)

Funcii suport
gcf (greatest common factor), cel mai mare divizor comun lcm (lowest common multiple), cel mai mic multiplu comun

13

ClasaFractionv.2(numitorzero)

Observaii:
unuldintreprincipaleleobiectivealePOOeste controlul accesului lafuncii transformndgcf() nfuncie privat,amasiguratca:
numaifunciilemembrealeclaseiFractiono potapela numitorul nuprimete niciodat valoarea0
14

ClasaFractionv.2(gcf()<0)

Dac funcieigcf()isunttransmise argumentenegative: gcf(25, -35) semnulrezultatului devinedificildeanticipat. ncadrulclaseiFractionrezultatele devintotdeaunacorecte dacseexprim numitoriiprinnumerepozitive.

15

ClasaFractionv.2(codulgcf())
// gcf (cel mai mare divizor comun) // varianta recursiva int gcf(int if (a % b return else return } a, int b){ == 0) abs(b) ; gcf(b, a % b);
16

ClasaFractionv.2(codullcm())
Celmaimicmultiplucomunadounumerelcm(a,b):
Pas1:secalculeazcelmaimaredivizorcomun: n=gcf(a,b) Pas2:sempartceledounumerelan: a=a/n,b=b/n Pas3.secalculeaz lcm(a,b)curelaia: lcm(a,b)=n a b

n programsefolosete relaia final:


lcm(a,b)=n a b=n a/n b/n=(a b)/gcf(a,b)
17

ClasaFractionv.2(declaraia)
class Fraction { private: int num, den; public: void set(int n, int d){num=n; den=d; normalize();} int get_num() {return num;} int get_den() {return den;} private: void normalize(); int gcf(int a, int b); int lcm(int a, int b); }; ATENIE la ;

18

ClasaFractionv.2(normalize())
void Fraction::normalize(){ // tratarea numitorului nul if (den == 0 || num == 0) { num = 0; den = 1; } // tratarea numitorului negativ if (den < 0) { num *= -1; den *= -1; } // calculul cmmdc i simplificarea propriu-zis int n = gcf(num, den); num = num / n; den = den / n; }
19

ClasaFractionv.2(codulgcf())

// Greatest Common Factor int Fraction::gcf(int a, int b) { if (a % b == 0) return abs(b); else return gcf(b, a % b); }

20

ClasaFractionv.2(codullcm())

// cel mai mic multiplu comun // (lowest common multiple) int Fraction::lcm(int a, int b){ return (a/gfc(a,b))*b; }

21

ProgramcuclasaFractionv.2(1)
#include stdafx.h #include <stdlib.h> #include <iostream> using namespace std; class Fraction { private: int num, den; // numaratorul si numitorul public: void set(int n, int d) {num = n; den = d; normalize();} int get_num() {return num;} int get_den() {return den;} private: void normalize(); // forma canonica (standard) a fractiei int gcf(int a, int b); // cel mai mare divizor comun int lcm(int a, int b); // cel mai mic multiplu comun };
22

ProgramcuclasaFractionv.2(2)
int main() { int a, b; char str[81]; Fraction fract; while (1) { cout << "Enter numerator: "; cin >> a; cout << "Enter denominator: "; cin >> b; fract.set(a, b); cout << "Numerator is " << fract.get_num() << endl; cout << "Denominator is " << fract.get_den() << endl; cout << "Do it again? (Y or N) "; cin >> str; if (!(str[0] == 'Y' || str[0] == 'y')) break; } }

23

ProgramcuclasaFraction v.2(3)
// FUNCTIILE CLASEI FRACTION // Normalize: aduce fractia la forma canonica void Fraction::normalize(){ // tratarea numitorului nul if (den == 0 || num == 0) { num = 0; den = 1; } // tratarea numitorului negativ if (den < 0) { num *= -1; den *= -1; } // calculul cmmdc si simplificarea propriu-zisa int n = gcf(num, den); num = num / n; den = den / n; }
24

ProgramcuclasaFraction v.2(4)
// Greatest Common Factor int Fraction::gcf(int a, int b) { if (a % b == 0) return abs(b); else return gcf(b, a % b); } // Lowest Common Multiple int Fraction::lcm(int a, int b){ return (a / gcf(a, b)) * b; }
25

ClasaFraction v.3(add() imult())

AdugmclaseiFraction doufunciicare implementeazoperaiicufracii:


adunare,add() nmulire,mult()

26

ClasaFraction v.3(coduladd())
Fiedou fracii,f1=a/b if2=c/d.Pentrusumare:
Pas1 sedetermincelmaimicnumitorcomun,lcd: lcd =lcm(b,d) Pas2 seamplificprimafraciecu lcd/b: ((lcd/b)*a)/((lcd/b)*)b Pas3 seamplificadouafraciecu lcd/d: (lcd/d)*c/((lcd/d)*d) Pas4 secalculeazfracia sum: (a*lcd/b+c*lcd/d)/lcd
27

ClasaFraction v.3 (codulmult())


Fiedou fracii,a/bic/d.Pentrunmulirese efectueazoperaiile: (a/b)*(c/d)=(a*c)/(b*d)

28

ProgramcuclasaFraction v.3(declaraii)
#include <iostream> using namespace std; class Fraction { private: int num, den; // numaratorul si numitorul fractiei public: void set(int n, int d) {num = n; den = d; normalize();} int get_num() {return num;} int get_den() {return den;} Fraction add(Fraction other); Fraction mult(Fraction other); private: void normalize(); // simplificarea fractiei int gcf(int a, int b); // cmmdc int lcm(int a, int b); // cmmmc };
29

ProgramcuclasaFraction v.3(funcia main())

int main() { Fraction fract1, fract2, fract3; fract1.set(1, 2); fract2.set(1, 3); fract3 = fract1.add(fract2); cout << "1/2 plus 1/3 = "; cout << fract3.get_num() << "/" << fract3.get_den(); }

30

ProgramcuclasaFraction v.3(normalize())
void Fraction::normalize(){ // numitor zero if (den == 0 || num == 0) { num = 0; den = 1; } // numitor negativ if (den < 0) { num *= -1; den *= -1; } // calculul cmmdc si simplificarea propriu-zisa int n = gcf(num, den); num = num / n; den = den / n; }
31

ProgramcuclasaFraction v.3(gcf() &lcm())

// Cel mai mare divizor comun int Fraction::gcf(int a, int b) { if (a % b == 0) return abs(b); else return gcf(b, a % b); } // Cel mai mic multiplu comun

int Fraction::lcm(int a, int b){ return (a / gcf(a, b)) * b; }


32

ProgramcuclasaFraction v.3(add() &mult())


Fraction Fraction::add(Fraction other) { Fraction fract; int lcd = lcm(den, other.den); int quot1 = lcd/den; int quot2 = lcd/other.den; fract.set(num * quot1 + other.num * quot2, lcd); return fract; } Fraction Fraction::mult(Fraction other) { Fraction fract; fract.set(num * other.num, den * other.den); return fract; }
33