#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??
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???
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...
c.suma(rr1,rr2);
c.mostrar();
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:
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;
}