CB100

Notas, resueltos y tps de la materia Algoritmos y Estructuras de Datos
Index Commits Files Refs README
guias/4/ej02.cpp (3194B)
   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 }