Menú principal

martes, 8 de septiembre de 2020

Multiplicación de fracciones Parte 4 - Sobrecarga de operadores (operator>>) - C++

Después de haber realizado la sobrecarga de operadores en la Parte 3 procedemos a realizar la sobrecarga del operador de entradaoperator>>. Este operador se declara como istream& operator>> (istream &in, variables de entrada); Esta sobrecarga nos permite guardar el numerador y el denominador de la fracción en una misma variable f1, como se representa en la linea 78, esto da una mayor simplicidad al código del main. Te preguntarás como puede ser esto posible, pues bien, si vamos a la linea 51, se establece que el primer dato introducido por teclado será el numerador y el segundo el denominador. Finalmente, al igual que hacíamos con el operador de salida, hay que devolver el in, es decir, return in.

Además en este código se ha introducido una función simplifica que como su nombre indica, simplificará el resultado de la multiplicación de fracciones hasta obtener la irreducible.

 1 //Visualizacion y entrada con sobrecarga de operador
 2  #include <iostream>
 3  #include <cmath>
 4  using namespace std;
 5  
 6  class Fraccion
 7  {
 8      int n,d;
 9  
10  public:
11      Fraccion(int num=0, int den=1)
12      {
13          n=num;
14          d=den;
15      }
16      //Set para introducir los datos de las fracciones
17      //No se necesita el set, lo hara el istream
18      //Para diferenciar el num y den de cualquier fracion y sacarlo por pantalla
19      //No se necesita el Get, lo hace el ostream
20      //Friend para que la funcion pueda acceder a la clase
21      friend Fraccion operator* (Fraccion f1, Fraccion f2);
22      friend ostream& operator<< (ostream &out, Fraccion f);
23      friend istream& operator>> (istream &in, Fraccion &f);
24      friend Fraccion simplifica(Fraccion f);
25  };
26  
27  Fraccion operator* (Fraccion f1, Fraccion f2)
28  {
29      Fraccion fm(f1.n*f2.n, f1.d*f2.d);
30      return fm;
31  }
32  
33  ostream& operator<< (ostream &out, Fraccion f)
34  {
35      if(f.n<0&&f.d<0 || f.d<0)
36      {
37          f.n=f.n*(-1);
38          f.d=f.d*(-1);
39          out << f.n << "/" << f.d;
40      }
41      else if(f.n==f.d)
42          out <<  " 1 " ;
43      else
44          out << f.n << "/" << f.d ;
45  
46      return out;
47  }
48  
49  istream& operator>> (istream &in, Fraccion &f)
50  {
51      in >> f.n >> f.d;
52      return in;
53  }
54  
55  Fraccion simplifica(Fraccion f)
56  {
57      int fmin=min(abs(f.n),abs(f.d));
58  
59      for(int i=fmin; i>1; i--)
60      {
61          if(f.n%i==0 && f.d%i==0)
62          {
63              f.n=f.n/i;
64              f.d=f.d/i;
65              i=min(abs(f.n),abs(f.d));
66          }
67      }
68      return f;
69  }
70  
71  
72  int main()
73  {
74      Fraccion f1, f2, fMulti; //Hay que inicializar siempre las fracciones?
75  
76      cout << "Intro numerador y denominador de la primera fraccion: ";
77      cin >> f1;
78      cout << endl << "Intro numerador y denominador de la segunda fraccion: ";
79      cin >> f2;
80  
81      fMulti=simplifica(f1*f2);
82  
83      cout<<endl<<"La multiplicacion de "<<f1<<" * "<<f2<<" = "<<fMulti<<endl;
84  }

No hay comentarios:

Publicar un comentario