[C con Clase] Ejercicio Rectangulo

Steven Davidson srd4121 en njit.edu
Mie Abr 18 00:25:26 CEST 2012


Hola Luis,


On 4/17/2012 3:57 PM, Luis Gutierrez Gomez wrote:
>
>
> Cordiales Saludos; envío el siguiente ejercicio para su correccion,
> el enunciado dice:
>

[CORTE]

>

Viendo el código fuente, sólo hay algunos comentarios que hacer.

>
> double Rectangulo::Perimetro ()const
> {
>   if ( ( longitud == -1 ) || ( ancho == -1 ) ){
>    cout<<  " Datos de Rectangulo fuera de Parametros "<<  endl;

Como dije en correos-e anteriores, no deberías diseñar que las funciones 
básicas realicen más de la tarea imputada. En este caso, esta función 
debe calcular y retornar el perímetro. Sin embargo, es posible que 
realice otra tarea de comunicar al usuario; esto no es un buen diseño.

La solución correcta que das es retornar un valor inválido con un nuevo 
significado; esto es, retornas -1 para indicar un cálculo imposible. Si 
hay que comunicarse con el usuario, entonces la responsabilidad es del 
programa (main) y no de esta función.

>    return -1;
>   }
>   return ( ( longitud * 2 ) + ( ancho * 2 ) );
> }
>
>
>
> double Rectangulo::Area() const
> {
>   if ( ( longitud == -1 ) || ( ancho == -1 ) ){
>    cout<<  " Datos de Rectangulo fuera de Parametros "<<  endl;

Aquí tenemos el mismo problema de antes.

>    return -1;
>   }
>   return ( longitud * ancho );
> }
>
>
>
> void Rectangulo::EstablecerLongitud( double longi )
> {
>   if ( ( 20.0>  longi )&&  ( longi>  0.0 ) ) longitud = longi;
>   else {
>    cout<<  "El dato de longitud no es valido "<<  endl;
>    longitud = -1;

Aquí tenemos el problema anterior, pero la decisión de asignar -1 a un 
dato miembro quizá no sea la mejor. Entiendo que esto funciona para la 
solución que das para las comprobaciones en otras funciones.

Al final te comento otra solución parecida a la que implementas aquí.

>   }
> }
>
>
>
> void Rectangulo::EstablecerAncho( double anch )
> {
>   if ( ( 20.0>  anch )&&  ( anch>  0.0 ) ) ancho = anch;
>   else {
>    cout<<  "El dato de ancho no es valido "<<  endl;
>    ancho = -1;

Aquí tenemos lo mismo que hemos visto antes.

>   }
> }
>
>
>
> double Rectangulo::ObtenerLongitud() const
> {
>   return ( longitud );
> }
>
>
>
> double Rectangulo::ObtenerAncho() const
> {
>   return ( ancho );
> }
>
>
>
> int main()
> {
>
>   Rectangulo R1 ( 19.9, 9.8 ), R2 ( 9.87, -0.6 ), R3;
>   cout<<  R1.Perimetro()<<  endl;
>   cout<<  R1.Area()<<  endl;
>   cout<<  R2.Perimetro()<<"\n"<<R2.Area()<<  endl;
>   cout<<   R3.Perimetro()<<endl;
>   R3.EstablecerLongitud( 23.8);
>   R3.EstablecerAncho( 6.9 );
>   cout<<  R3.Perimetro()<<  endl;
>
>

Tienes que retornar un 'int'.

>
> }
>
>

Sugiero crear una variable booleana interna a la clase para indicar si 
hay un error y así poder tomar decisiones en cuanto al estado del 
objeto. Esto es parecido a lo que has hecho, pero con un campo dedicado 
a la validez del objeto, podemos diseñar mejor la clase y sus funciones 
con mayor legibilidad.

Como esto agrega mayor complejidad al diseño de tu clase, quizá no te 
interese. Si es así, entonces puedes seguir usando tu diseño que usa los 
campos para guardar -1.0 para indicar un error. Sin embargo, aconsejo 
que definas una constante para ser más legible para establecer el valor 
que indica error. Por ejemplo,

class Rectangulo
{
public:
   const double error;
...
};

const double Rectangulo::error = -1.0;

Ahora podemos usar 'error' para comprobar si hay un error según el 
retorno de una operación.


Espero que esto te oriente.

Steven





Más información sobre la lista de distribución Cconclase