1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
#include "Fraction.h"
/* cstdlib est intéressant pour avoir la fonction abs qui calcule la valeur
* absolue d'un entier
*/
#include <cstdlib>
Fraction::Fraction():numerateur_(0),denominateur_(1)
{
}
Fraction::Fraction(int entier):numerateur_(entier),denominateur_(1)
{
}
Fraction::Fraction(int num, int denom):
numerateur_(num),denominateur_(denom)
{
}
Fraction Fraction::operator+(Fraction const & f)
{
int num=(numerateur_*f.denominateur_) +
(f.numerateur_*denominateur_);
int denom=(denominateur_*f.denominateur_);
Fraction ret(num,denom);
return ret;
}
Fraction Fraction::operator+(int entier)
{
int num=(entier*denominateur_)+numerateur_;
Fraction ret=(num,denominateur_);
return ret;
}
Fraction& Fraction::operator +=(Fraction const & f)
{
Fraction temp=(*this)+f;
numerateur_=temp.numerateur_;
denominateur_=temp.denominateur_;
return (*this);
}
Fraction& Fraction::operator +=(int entier)
{
Fraction temp=(*this)+entier;
numerateur_=temp.numerateur_;
denominateur_=temp.denominateur_;
return (*this);
}
int Fraction::pgcd(int i1, int i2)
{
int more;
int less;
/* la valeur renvoyée ne sera en aucun cas supérieure à la valeur
* du plus petit des deux entiers donnés...
*/
if(i1<i2)
{
more=abs(i2);
less=abs(i1);
}
else
{
more=abs(i1);
less=abs(i2);
}
/* parcourons en ordre inverse toutes les valeurs comprises entre
* la valeur la plus petite et 1
*/
for(int i=less;i>1;--i)
{
/* si le reste de la division des deux entiers fournis par la valeur
* actuelle est égale à 0, nous avons le plus grand commun diviseur
*/
int restmore=more%i;
int restless = less%i;
if(restmore==0 && restless==0)
return i;
}
/* S'il n'y en a pas d'autre, ce sera quoi qu'il en soit 1 */
return 1;
}
void Fraction::inverse()
{
int temp=numerateur_;
numerateur_=denominateur_;
denominateur_=temp;
/* nous aurions pu faire quelque chose proche de
* numerateur_=^denominateur_;
* denominateur_=^numerateur_;
* numerateur_=^denominateur_;
*/
}
void Fraction::simplifie()
{
int pg=pgcd(numerateur_,denominateur_);
numerateur_/=pg;
denominateur_/=pg;
}
void Fraction::memeDenominateur(Fraction & f)
{
numerateur_*=f.denominateur_;
f.numerateur_*=denominateur_;
denominateur_*=f.denominateur_;
f.denominateur_=denominateur_;
}
void Fraction::memeDenominateur(Fraction & f1, Fraction & f2)
{
f1.memeDenominateur(f2);
}
std::ostream& operator<<(std::ostream& ofs,Fraction const & f)
{
ofs<<f.numerateur_<<"/"<<f.denominateur_;
return ofs;
} |
Partager