1 #include <iostream> 2 3 // https://en.wikipedia.org/wiki/Greatest_common_divisor 4 int find_gcd(int a, int b) { 5 return (!b) ? a : find_gcd(b, a % b); 6 } 7 8 class Fraction { 9 private: 10 int numerator; 11 int divisor; 12 13 public: 14 /** 15 * post: inicializa la fraccion a `0/1` 16 */ 17 Fraction() { 18 this->numerator = 0; 19 this->divisor = 1; 20 } 21 22 /** 23 * post: inicializa la fraccion a `numerador/divisor` 24 */ 25 Fraction(int numerator, int divisor) { 26 this->numerator = numerator; 27 this->divisor = divisor; 28 } 29 30 /** 31 * post: libera la memoria 32 */ 33 virtual ~Fraction() {} 34 35 /** 36 * post: cambia el numerador de la fraccion a `numerator` 37 */ 38 void setNumerator(int numerator) { 39 this->numerator = numerator; 40 } 41 42 /** 43 * post: cambia el divisor de la fraccion a `divisor` 44 */ 45 void setDivisor(int divisor) { 46 this->divisor = divisor; 47 } 48 49 /** 50 * post: cambia el numerador y divisor de la fraccion a `numerator` y 51 * `divisor` respectivamente 52 */ 53 void set(int numerator, int divisor) { 54 this->setNumerator(numerator); 55 this->setDivisor(divisor); 56 } 57 58 /** 59 * post: devuelve el numerador de la fracción 60 */ 61 int getNumerator() { 62 return this->numerator; 63 } 64 65 /** 66 * post: devuelve el divisor de la fracción 67 */ 68 int getDivisor() { 69 return this->divisor; 70 } 71 72 /** 73 * pre: la fracción debe estar inicializada 74 * post: suma los valores de la fracción `f` a la fracción actual 75 */ 76 void add(Fraction f) { 77 if(this->divisor == f.divisor) { 78 this->numerator += f.numerator; 79 } else { 80 this->numerator *= f.divisor; 81 this->divisor *= f.divisor; 82 83 f.numerator *= (this->divisor / f.divisor); 84 f.divisor *= (this->divisor / f.divisor); 85 86 this->numerator += f.numerator; 87 } 88 } 89 90 /** 91 * pre: la fracción debe estar inicializada 92 * post: resta los valores de la fracción `f` a la fracción actual 93 */ 94 void substract(Fraction f) { 95 if(this->divisor == f.divisor) { 96 this->numerator -= f.numerator; 97 } else { 98 this->numerator *= f.divisor; 99 this->divisor *= f.divisor; 100 101 f.numerator *= (this->divisor / f.divisor); 102 f.divisor *= (this->divisor / f.divisor); 103 104 this->numerator -= f.numerator; 105 } 106 } 107 108 /** 109 * pre: la fracción debe estar inicializada 110 * post: multiplica los valores de la fracción `f` a la fracción actual 111 */ 112 void multiply(Fraction f) { 113 this->numerator *= f.numerator; 114 this->divisor *= f.divisor; 115 } 116 117 /** 118 * pre: la fracción debe estar inicializada 119 * post: divide los valores de la fracción `f` a la fracción actual 120 */ 121 void divide(Fraction f) { 122 this->numerator *= f.divisor; 123 this->divisor *= f.numerator; 124 } 125 126 /** 127 * pre: la fracción debe estar inicializada 128 * post: simplifica la fracción a su mínima expresión 129 */ 130 void simplify() { 131 int gcd = find_gcd(this->numerator, this->divisor); 132 this->numerator /= gcd; 133 this->divisor /= gcd; 134 } 135 136 /** 137 * pre: la fracción debe estar inicializada 138 * post: imprime el contenido de la fracción 139 */ 140 void print() { 141 std::cout << this->numerator << "/" << this->divisor << std::endl; 142 } 143 }; 144 145 int main (void) { 146 Fraction a(1,2); 147 Fraction b(1,3); 148 149 a.print(); 150 b.print(); 151 a.add(b); 152 a.print(); 153 154 a.set(1,3); 155 a.print(); 156 a.simplify(); 157 a.print(); 158 return 0; 159 }
