Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda

Estas en el tema de Ayuda en el foro de C/C++ en Foros del Web. Hola muy buenas como os va. Soy nuevo en programacion c++ orientada a objeto. Me mandaron un ejercicio que aunqye parezca sencillo de hacer los ...
  #1 (permalink)  
Antiguo 10/05/2010, 10:57
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años
Puntos: 0
Ayuda

Hola muy buenas como os va.



Soy nuevo en programacion c++ orientada a objeto. Me mandaron un ejercicio que aunqye parezca sencillo de hacer los resultados que obtengo de el no son los esperados.



A continuación os pongo el código:



Cabecera:




#include <stdio.h>

class Cuadrado
{
protected: //private en el real
unsigned int lado;
public:

Cuadrado(unsigned int a);
unsigned int area();
unsigned int perimetro();
void visualizar();
};

class Rectangulo:public Cuadrado
{

private:
unsigned int otroLado;
public:
Rectangulo(unsigned int a, unsigned int b);
unsigned int area();
unsigned int perimetro();
};




Fichero figuras.cpp



#include "Figuras.h"

Cuadrado::Cuadrado(unsigned int a)
{
lado = a;
}

unsigned int Cuadrado::area()
{
lado = lado * lado;
return lado;
}


unsigned int Cuadrado::perimetro()
{
lado = lado * 4;
return lado;
}

void Cuadrado::visualizar()
{
printf("El area es: %d
", area);
printf("El perimetro es:%d
", perimetro);

}


Rectangulo::Rectangulo(unsigned int a,unsigned int b) : Cuadrado(a)
{
lado = a;
otroLado = b;
}

unsigned int Rectangulo::area()
{
lado = lado * otroLado;
return lado;
}

unsigned int Rectangulo::perimetro()
{
lado = 2 * lado + 2 * otroLado;
return lado;
}

Principal



#include "Figuras.h"

void main()
{
Cuadrado* c1 = new Cuadrado(3);
Rectangulo* c2 = new Rectangulo(4,2);

printf("Cuadrado:
");
c1->visualizar();


printf("Rectangulo:
");
c2->visualizar();

}


FIN



Los resultados que obtengo después de compilar y enlazar son los siguintes:



Cuadrado:



El area es: 4198440



perimetro: 4198430



y los mismo resultados para el rectangulo ya que c2 del main apunta a visulizar().



Nota. En la cabecera la clase Cuadrado tiene miembros privados en relidad, los puse cmom rotegidos con el din de obtener un resultado numerico, ya que si los dejo como pribado la calse derivada no podrá acceder



Mi preguntas son:



-Sabe alguien como solucionar el problema osea que salga com resultados



Cuadrado area: 9



Cuadrao perimetro 12



Rectangulo area : 8



Perimetro 12.



Si lo sabe alguien por favor que escriba el código o bien que me mande u privado con las lineas de código erroneas.



he probado con todo y simepre me sailan esos resultados que a mi parecer son direcciones de memoria.



Otra pregunta:



El apartado segundo del ejericcio propone construi una clase abstracta, alguien me puede explicar como se hacen y como serai en el ejercicio?



Bueno eso es todo por ahora, a quien aporte ideas sean las que sean, gracias.



Aqui les pongo las preguntas del ejercicio:



Crear un proyecto denominado FigHer, en el cual:

a) Desarrollar el fichero figuras.cpp donde el método visualiza se encarga de mostrar los valores del Area y el Perímetro de un Cuadrado
b) Desarrollar el fichero principal.cpp con el siguiente contenido:
b.1) Definir un cuadrado de lado 3 y un rectángulo de lados 4 y 2 en Memoria Dinámica.
b.2) Mandar el mensaje visualiza tanto al cuadrado como al rectángulo
c) Comentar los resultados obtenidos.

Crear un proyecto denominado FigHerAbs, en el cual :
a) Se introduzca una Clase Abstracta denominada Figura que resuelva la cuestión planteada.



pos nada gracias de nuevo
  #2 (permalink)  
Antiguo 10/05/2010, 12:51
Avatar de gvite666  
Fecha de Ingreso: abril-2010
Mensajes: 65
Antigüedad: 14 años
Puntos: 4
Respuesta: Ayuda

tu primer error esta aqui
void Cuadrado::visualizar()
{
printf("El area es: %d
", area); //aqui te faltan os parentesis de tu funcion "area()"
printf("El perimetro es:%d
", perimetro); //lo mismo "perimetro()"

}
Segundo error
unsigned int Cuadrado::area()
{
lado = lado * lado; //aqui le estas diciciendo que al lado lo multipliques por si mismo en este caso 3*3 y que se lo asignes a la misma variable, entonces lado vale 9
return lado;
}


unsigned int Cuadrado::perimetro()
{
lado = lado * 4; //y que pasa aqui, que como primero mandas a llamar al metodo area tu lado ya no vale 3 sino 9 y que le dices aqui que a 9 lo multipliques por 4 y esto te dara 36, resultado que avio es invalido
return lado;
}
entonces si no quieres que cambie tu variable utiliza variables locales a la hora de asignarlas.

y el siguiente error es a la hora de hacer tus clases
no se como te explicaron la manera de entrar a la orientacion de objetos y la heredacion
ya que en tu programa heredas de una clase que esta al mismo nivel que tu otra clase, esto es
para poder heredar necesitas de una clase padre la cual tiene metodos similares a tus clases hijas, en este caso podrias poner una clase llamada figura en la cua sus metodos serian,
la visualizacion, y como clases hijas podrias poner ya lo que seria tu cuadrado y tu rectangulo con sus respectivos metodos de area y perimetro.

para lo de las clases abstractas lo unico que deves hacer es poner tus metodos de area y perimetro en la clase padre con la palabra reservada virtual ejemplo

virtual unsigned int area()=0;
virtual unsigned int perimetro()=0;

y despues definirlas en las clases hijas

Espero te ayude esto. saludos
  #3 (permalink)  
Antiguo 10/05/2010, 13:51
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda

Gracias por la ayuda te devo una tio.
La anera de explicar de mi rpofesro mejor ni te la digo pq dan ganr de pegarle jejejejeje.
proxiammente requerire ayuda para otro ejercicio.

Última edición por ShineV2; 10/05/2010 a las 15:01
  #4 (permalink)  
Antiguo 13/05/2010, 11:44
 
Fecha de Ingreso: mayo-2010
Mensajes: 5
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda

Hola muy buenas a tod@s de nuevo:
Ayer estuve viendo un ejercicio de mi libro de C++ bastante curioso, se pregunta lo siguiente

¿Que modificaciones son necesarias para que se mantengan los anteriores resultados que son 34 , 5 ,67, cuando el acceso a los datos miembros de las clases se modifica desde protected a private.
?

Yo he probado con todo e incluso le prgunte a mi maestro pero este ma dicho que busque por hay xdddddddddd

Aqui os dejo el codigo de la cabecera:

class P
{
protected:
int x, y;
public:
Punto(int a, int b);
};

class C
{
protected:
int color;
public:
Col(int c);
};

class PuntoCl: public P, C
{

public:
PuntoCol(int d, int e, int f);
void visualiza();
};

Si alguien sabe que modificaciones hay que meter porfavor que me lo muestr aqui o que me lo diga en privado.

Gracias de nuevo, un saludo

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:41.