TAB de OPERACIONES CON RACIONALES

Iniciado por chicainge, 9 Junio 2014, 15:45 PM

0 Miembros y 1 Visitante están viendo este tema.

chicainge

#include<iostream>
#include<fstream>
#include<string>
#include "CRacional.hpp"

using namespace std;
using namespace racionales;
void menu(){
cout<<"1.INSERTAR RACIONALES"<<endl;
cout<<"2.CONSULTAR EL VALOR DEL NUMERADOR"<<endl;
cout<<"3.CONSULTAR EL VALOR DEL DENOMINADOR"<<endl;
cout<<"4.MOVER LOS RACIONALES AL FICHERO"<<endl;
cout<<"5.SUMAR "<<endl;
cout<<"6.RESTAR "<<endl;
cout<<"7.MULTIPLICAR"<<endl;
cout<<"8.DIVIDIR "<<endl;
cout<<"10.SALIR"<<endl;
cout<<"que desea hacer?"<<endl;

};
int main(){

CRacional rr1,rr2,c;

int e,d;
int num1,num2;
string nombrecarpeta;
ofstream sal;
int f;
menu();
while(f!=10){
  cin>>f;
switch(f){
case 1:
    cout<<"Inserte el numerador : ";
      cin>>e;
      cout<<endl<<"Inserte el denominador : ";
      cin>>d;
       while(d==0){
         cin.ignore();
         cout<<"no vale 0, inserte otro numero:";
         cin>>d;
         }
      rr1.leerracionales(e,d);
      cout<<"ahora el segundo racional; "<<endl;
      cout<<"Inserte el numerador : ";
          cin>>e;
          cout<<endl<<"Inserte el denominador : ";
          cin>>d;
          while(d==0){
          cin.ignore();
          cout<<"no vale 0, inserte otro numero:";
          cin>>d;
         }
         rr2.leerracionales(e,d);
         menu();
   break;
case 2:

    cout<<"Racional 1: "<< rr1.obtnumerador();

    cout<<endl<<"Racional 2: "<< rr2.obtnumerador();

    cout<<endl;
   break;
case 3:

    cout<<"Racional 1: "<<rr1.obtdenominador();

    cout<<endl<<"Racional 2: "<<rr2.obtdenominador();

    cout<<endl;

   break;
case 4:
          cout<<"nombre de la carpeta donde desea guardar el racional 1 y 2: ";
          cin>> nombrecarpeta;
          sal.open(nombrecarpeta.c_str());
          if(sal.fail()){
                cout<<"error fichero";
          }
          else {
            sal<<"racional 1: ";
            rr1.volcar_a_fichero(sal);
            sal<<"racional 2: ";
            rr2.volcar_a_fichero(sal);
          }
          sal.close();
          break;

case 5:   c.suma(rr1,rr2);
          c.mostrar();
          cout<<"nombre de la carpeta donde desea guardar el racional: ";
          cin>> nombrecarpeta;
          sal.open(nombrecarpeta.c_str());
          if(sal.fail()){
                cout<<"error fichero";
          }
          else {
             sal<<"suma: ";
            c.volcar_a_fichero(sal);
          }
          sal.close();
        break;
case 6:   c.resta(rr1,rr2);
          cout<<c.obtnumerador() << "/"<< c.obtdenominador()<<endl;
          cout<<"nombre de la carpeta donde desea guardar el racional: ";
          cin>> nombrecarpeta;
          sal.open(nombrecarpeta.c_str());
          if(sal.fail()){
                cout<<"error fichero";
          }
          else {
            sal<<"resta: ";
            c.volcar_a_fichero(sal);
          }
          sal.close();
        break;
case 7:   c.multiplicar(rr1,rr2);
          cout<<c.obtnumerador() << "/"<< c.obtdenominador()<<endl;
          cout<<"nombre de la carpeta donde desea guardar el racional: ";
          cin>> nombrecarpeta;
          sal.open(nombrecarpeta.c_str());
          if(sal.fail()){
                cout<<"error fichero";
          }
          else {
            sal<<"multiplicacion: ";
            c.volcar_a_fichero(sal);
          }
          sal.close();
        break;
case 8:   c.dividir(rr1,rr2);
          cout<<c.obtnumerador() << "/"<< c.obtdenominador()<<endl;
          cout<<"nombre de la carpeta donde desea guardar el racional: ";
          cin>> nombrecarpeta;
          sal.open(nombrecarpeta.c_str());
          if(sal.fail()){
                cout<<"error fichero";
          }
          else {
            sal<<"division: ";
            c.volcar_a_fichero(sal);
          }
          sal.close();
        break;




}
cin.ignore();
}
}

c es el racional el cual guarda el resultado pero este no se guarda;
#ifndef __CRACIONAL__HPP__
#define __CRACIONAL__HPP__

#include <fstream>
#include <string>

using namespace std;

namespace racionales{
    //constantes
class CRacional{
   public:
       //costructor por defecto
       CRacional();
       //costructor de copia
       CRacional (const CRacional &otroracional);
       //costructor extendido,leer
       CRacional (int &e, int &d);
       //destructor
       ~CRacional();
       //leer
       void leerracionales(int &e,int &d);
       //consultar denominador y numerador
       int obtnumerador();
       int obtdenominador();
       void mostrar();
       //escribir en pantalla
       void volcar_a_fichero(ofstream &sal);
       //suma
       CRacional suma(CRacional rr1,CRacional rr2);
       //resta
       CRacional resta(CRacional rr1,CRacional rr2);
       //multiplicacion
       CRacional multiplicar(CRacional rr1,CRacional rr2);
       //dividir
       CRacional dividir(CRacional rr1,CRacional rr2);


   private:

       int a;
       int b;
       void mismodenominador(CRacional &ra,CRacional &ra2);
       void simplificar();
       int mcd (int a, int b);
};
}
#endif

#include <iostream>
#include "CRacional.hpp"
#include<fstream>
using namespace std;

namespace racionales{
      //constructores
      CRacional::CRacional(): a(0),b(0){}
      CRacional::CRacional (const CRacional &otroracional): a(otroracional.a),b(otroracional.b){};
      CRacional::CRacional (int &a, int &b): a(a),b(b){};
      CRacional::~CRacional(){};
      //metodos
      void CRacional::leerracionales(int &e,int &d){
      a=e;
      b=d;
      }
      int CRacional::obtnumerador(){
      return a;
      }
      int CRacional::obtdenominador(){
      return b;
      }
      void CRacional::mostrar(){
       cout<<a<<"/"<<b<<endl;
      }
      void CRacional::volcar_a_fichero(ofstream &sal){
        sal<<a<<"/"<<b<<endl;
      }
      void CRacional::mismodenominador(CRacional &ra,CRacional &ra2){
          if(ra.b!=ra2.b){
          CRacional aux1=ra,aux2=ra2;
          aux1.b=aux1.b*aux2.b;
          aux2.b=aux1.b;
          aux1.a=ra.a*ra2.b;
          aux2.a=ra.b*ra2.a;
          ra=aux1;
          ra2=aux2;
          }
      }
      int CRacional::mcd (int a, int b){
          int resul=1;
          if(a<0){
            a=a*(-1);
          }
          if(b<0){
            b=b*(-1);
          }
          if(a<b){
            int c;
            c=a;
            a=b;
            b=c;
          }
          for(int i=2;i<=b;i++){
              if((a%i)==0 && (b%i)==0){
                resul=i;
              }
          }
          return resul;
      }
       void CRacional::simplificar(){
          CRacional rresul;
          int mccd=mcd(a,b);
          a=a/mccd;
          b=b/mccd;
       }
      CRacional CRacional::suma(CRacional rr1,CRacional rr2){
          CRacional c;
          mismodenominador(rr1,rr2);
          c.a=rr1.a+rr2.a;
          c.b=rr1.b;
          c.simplificar();
          cout<<"muesta desde suma: "<<c.a<<"/"<<c.b<<endl; //sale bn
          return c;
      }
      CRacional CRacional::resta(CRacional rr1,CRacional rr2){
          CRacional c;
          mismodenominador(rr1,rr2);
          c.a=rr1.a-rr2.a;
          c.b=rr1.b;
          c.simplificar();
          return c;
      }
      CRacional CRacional::multiplicar(CRacional rr1,CRacional rr2){
          CRacional c;
          c.a=rr1.a*rr2.a;
          c.b=rr1.b*rr2.b;
          c.simplificar();
          return c;
      }
      CRacional CRacional::dividir(CRacional rr1,CRacional rr2){
          CRacional c;
          c.a=rr1.b*rr2.a;
          c.b=rr1.a*rr2.b;
          c.simplificar();
          return c;
      }

}

me podrían decir que problema hay en c.mostrar??

eferion

así a bote pronto... ninguno... qué te sucede exactamente??

espero que no pretendas que nos copiemos tu código, lo depuremos, corrijamos los errores y te demos un informe sobre los fallos que tienes y cómo corregirlos???

chicainge

solo tiene uno; compila perfectamente pero la función mostrar falla siempre sale 0/0 cuando el resultado dentro de las funciones en el cpp sale bn y no entiendo cual es el fallo para que no se pase del cpp del tab, al principal y del principal a mostrar, es un fallo muy simple pero no veo como correguirlo...

eferion

Código (cpp) [Seleccionar]

c.suma(rr1,rr2);
c.mostrar();


Código (cpp) [Seleccionar]

CRacional CRacional::suma(CRacional rr1,CRacional rr2){
          CRacional c;
          mismodenominador(rr1,rr2);
          c.a=rr1.a+rr2.a;
          c.b=rr1.b;
          c.simplificar();
          cout<<"muesta desde suma: "<<c.a<<"/"<<c.b<<endl; //sale bn
          return c;
      }


en la operación de suma creas una nueva instancia de CRacional y la devuelves... pero no modificas la instancia actual, por lo que en el código de arriba, "c", no cambia el valor de sus variables.

Una forma de solucionar esto sería retocar la operación tal que:

Código (cpp) [Seleccionar]

CRacional CRacional::suma(CRacional rr1,CRacional rr2){
          mismodenominador(rr1,rr2);
          a=rr1.a+rr2.a;
          b=rr1.b;
          simplificar();
          cout<<"muesta desde suma: "<<a<<"/"<<b<<endl; //sale bn
          return *this;
      }