Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: cazagavilan en 21 Abril 2012, 00:17 AM

Título: Programacion orientada a objetos
Publicado por: cazagavilan en 21 Abril 2012, 00:17 AM
Buenas de nuevo,

Tengo este codigo y lo que me falla es cuando "vehiculo" acelera...
Me aparece por pantalla -8524654846( mas o menos) y no se por que es.

Gracias!
Código (cpp) [Seleccionar]
#include<iostream>
using namespace std;

class vehiculo
{

private:
int litros;
int kphMas;
int kphMenos;
int veloActual;
int capaDepo;
int año;
int capDepo;
int liDepo;
char *propietario[25];
public:
vehiculo(int veloActual, int liDepo, int capDepo, int año);
~vehiculo();
void imprimir(int año, char *propietario);
int llenarDepo();
int acelerar(int kphMas);
int frenar(int kphMenos);
void nPropietario(char* propietario);
};

vehiculo::vehiculo(int veloActualual, int liDepo, int capDepo, int año)
{

}

vehiculo::~vehiculo()
{
}
int vehiculo::llenarDepo()
{
for(; liDepo <= capDepo; liDepo++)
{
cout << "El deposito esta lleno" << endl;
}
return liDepo;
}

void vehiculo::imprimir(int año, char*propietario)
{
cout << "La velocidad actual es: "<< veloActual << endl;
cout << "El año del coche es: " << año << endl;
cout << "En el deposito hay: " << liDepo << endl;
cout << "El nombre del propietario es: " << *propietario << endl;
}



int vehiculo::acelerar(int kphMas)
{
cout << "Estas acelerando!" << endl;
veloActual = veloActual + kphMas;
liDepo = liDepo - kphMas / 2;
cout << "Su velocidad actual es: " << veloActual << endl;
cout << "Su deposito actual es: " << liDepo << endl;
return veloActual;
return liDepo;
}

int vehiculo::frenar(int kphMenos)
{
if( veloActual >= 0)
{
cout << "Estas frenando!" << endl;
veloActual = veloActual - kphMenos;
cout << "Su velocidad actual es: " << veloActual << endl;
}
else
{
cout << "Ya estas parado!" << endl;
}
return veloActual;
}

void vehiculo::nPropietario( char* propietario)
{
propietario[0] = 'P';
propietario[1] = 'e';
propietario[2] = 'p';
propietario[3] = 'e';
cout << "EL nombre del propietario es: " << *propietario << endl;
}

int main()
{
vehiculo mercedes(0, 60, 60, 1990);
mercedes.acelerar(50);
mercedes.acelerar(50);
mercedes.acelerar(50);
mercedes.frenar(20);
mercedes.frenar(65);
mercedes.frenar(65);
mercedes.frenar(10);
system("pause");
return 0;
}
Título: Re: Programacion orientada a objetos
Publicado por: maxim_o en 21 Abril 2012, 00:31 AM
Asi a ojo la funcion acelerar devuelve dos return...
int vehiculo::acelerar(int kphMas)
{
   cout << "Estas acelerando!" << endl;
    veloActual = veloActual + kphMas;
    liDepo = liDepo - kphMas / 2;
    cout << "Su velocidad actual es: " << veloActual << endl;
    cout << "Su deposito actual es: " << liDepo << endl;
    return veloActual;
    return liDepo; // este nunca se cumple, Sale antes devolviendo VeloActual
}

De echo los return podrias hasta quitarlos y hacer void ya que desde donde la llamas no almacenas el valor devuelto.

Y supongo que el error por el que no te da el resultado esperado es que en el constructor:
vehiculo::vehiculo(int veloActualual, int liDepo, int capDepo, int año)
Si te fijas no es veloActual, sino veloActualual, por lo que la variable veloActual esta sin inicializar y por eso te da esos valores....

Título: Re: Programacion orientada a objetos
Publicado por: cazagavilan en 21 Abril 2012, 08:19 AM
Ya esta resuelto. Aparte de lo que tu decias, tambien era por que el constructor no inicializaba los atributos de la clase con sus parametros.

Gracias.
Título: Re: Programacion orientada a objetos
Publicado por: cazagavilan en 21 Abril 2012, 10:15 AM
Ahora tengo otro problema... no consigo introducir el nombre del propietario
o me da error o me da simbolos extraños..

Código (cpp) [Seleccionar]
#include<iostream>
using namespace std;

class vehiculo
{
private:
int veloInicial;
int añoInicial;
int capDepoInicial;
int lidepoInicial;
int litros;
int kphMas;
int kphMenos;
int veloActual;
int capaDepo;
int año;
int capDepo;
int liDepo;
public:
vehiculo(int veloInicial, int liInicial, int capDepoInicial, int añoInicial);
~vehiculo();
void imprimir();
void llenarDepo();
void acelerar(int kphMas);
void frenar(int kphMenos);
};

vehiculo::vehiculo(int veloInicial, int liInicial, int capDepoInicial, int añoInicial)
{
veloActual = veloInicial;
liDepo = liInicial;
capDepo = capDepoInicial;
año = añoInicial;

}

vehiculo::~vehiculo()
{
}

void vehiculo::llenarDepo()
{
for(; liDepo < capDepo; liDepo++)
{
}
cout << "El deposito esta lleno" << endl << endl;
}

void vehiculo::imprimir()
{
cout << "La velocidad actual es: "<< veloActual << endl;
cout << "El año del coche es: " << año << endl;
cout << "En el deposito hay: " << liDepo << endl;
cout << "El nombre del propietario es: " << endl << endl;
}



void vehiculo::acelerar(int kphMas)
{
if(liDepo > 0)
{
cout << "Estas acelerando!" << endl;
    veloActual = veloActual + kphMas;
    liDepo = liDepo - kphMas / 10;
    cout << "Su velocidad actual es: " << veloActual << endl;
    cout << "Su deposito actual es: " << liDepo << endl << endl;
}
else
{
cout << "El deposito esta vacio!" << endl << endl;
}
}

void vehiculo::frenar(int kphMenos)
{
if( veloActual - kphMenos > 0)
{
cout << "Estas frenando!" << endl;
veloActual = veloActual - kphMenos;
cout << "Su velocidad actual es: " << veloActual << endl << endl;
}
else
{
veloActual = 0;
cout << "Ya estas parado!" << endl << endl;
}
}

int main()
{
vehiculo mercedes(0, 60, 60, 1990);
mercedes.acelerar(50);
mercedes.acelerar(50);
mercedes.acelerar(50);
mercedes.frenar(50);
mercedes.frenar(50);
mercedes.frenar(60);
mercedes.acelerar(50);
mercedes.llenarDepo();
mercedes.imprimir();
system("pause");
return 0;
}


Muchas gracias.
Título: Re: Programacion orientada a objetos
Publicado por: cazagavilan en 21 Abril 2012, 10:55 AM
Solucionado.

Código (cpp) [Seleccionar]
#include<iostream>
#include<cstring>
using namespace std;

class vehiculo
{
private:
char *cad;
int veloInicial;
int añoInicial;
int capDepoInicial;
int lidepoInicial;
int litros;
int kphMas;
int kphMenos;
int veloActual;
int capaDepo;
int año;
int capDepo;
int liDepo;
public:
vehiculo(int veloInicial, int liInicial, int capDepoInicial, int añoInicial, const char *c);
~vehiculo();
void imprimir();
void llenarDepo();
void acelerar(int kphMas);
void frenar(int kphMenos);
char *leer(char *c);
};
char propietario[] = "Jonathan Gavilan Mora";

vehiculo::vehiculo(int veloInicial, int liInicial, int capDepoInicial, int añoInicial, const char *c)
{
veloActual = veloInicial;
liDepo = liInicial;
capDepo = capDepoInicial;
año = añoInicial;
cad = new char[strlen(c)+1];
strcpy(cad, c);

}

vehiculo::~vehiculo()
{
delete [] cad;
}

char *vehiculo::leer(char* c)
{
strcpy(c, cad);
return c;
}

void vehiculo::llenarDepo()
{
cout << "Estas llenando el deposito..." << endl;
for(; liDepo < capDepo; liDepo++)
{
}
cout << "El deposito esta lleno: " << liDepo<< " Litros."<< endl << endl;
}

void vehiculo::imprimir()
{
cout << "La velocidad actual es: "<< veloActual << endl;
cout << "El año del coche es: " << año << endl;
cout << "En el deposito hay: " << liDepo << endl;
cout << "El nombre del propietario es: " << propietario <<endl << endl;
}



void vehiculo::acelerar(int kphMas)
{
if(liDepo > 0)
{
cout << "Estas acelerando!" << endl;
   veloActual = veloActual + kphMas;
   liDepo = liDepo - kphMas / 10;
   cout << "Su velocidad actual es: " << veloActual << endl;
   cout << "Su deposito actual es: " << liDepo << endl << endl;
}
else
{
cout << "El deposito esta vacio!" << endl << endl;
}
}

void vehiculo::frenar(int kphMenos)
{
if( veloActual - kphMenos > 0)
{
cout << "Estas frenando!" << endl;
veloActual = veloActual - kphMenos;
cout << "Su velocidad actual es: " << veloActual << endl << endl;
}
else
{
veloActual = 0;
cout << "Ya estas parado!" << endl << endl;
}
}

int main()
{
vehiculo mercedes(0, 60, 60, 1990, "Jonathan Gavilan Mora");
mercedes.acelerar(50);
mercedes.acelerar(50);
mercedes.acelerar(50);
mercedes.frenar(50);
mercedes.frenar(50);
mercedes.frenar(60);
mercedes.acelerar(50);
mercedes.llenarDepo();
mercedes.imprimir();
system("pause");
return 0;
}