[C con Clase] Correccion de Ejercicio Particular

Steven Davidson srd4121 en njit.edu
Dom Abr 15 22:49:46 CEST 2012


Hola Luis,

On 4/15/2012 3:46 PM, Luis Gutierrez Gomez wrote:
>
> Cordiales Saludos; Estuve siguiendo el curso de C++, que lo dan en la
> web de CConClase y estuvo muy interesante, como no habian muchos
> ejercicios para desarrollar y practicar lo aprendido, especialmente
> en aplicaciones propias de C++, consulté sobre donde conseguir
> ejercicios y me recomendaron el Libro de Deytel&  Deytel, la verdad
> que es muy bueno y complementa muy bien con las enseñanzas de aca.
> Estoy resolviendo los ejerciccios del Capitulo 16 y por favor
> quisiera que lo corrijan y me digan si cometí errores o donde podria
> mejorar, de antemano muchas gracias por su apoyo.
>

[CORTE]

>
> SOLUCION
> --------
>

Veamos el programa. Te voy comentando a medida que vaya viendo el código 
fuente.

> #include<iostream>
>
> using std :: cout;
> using std :: endl;
>
> class Complejo{
>
> public:
>   Complejo(double = 0, double = 0);
>   void SumaComplejo ( double , double );
>   void RestaComplejo ( double , double );
>   void ImpresionComplejo (void);
>

Aunque escribir estos prototipos sea correcto, no aconsejo omitir los 
nombres de los parámetros; es más legible si los escribes.

Tampoco es necesario indicar 'void' para una lista vacía de parámetros.

> private:
>   double real;
>   double imaginaria;
> };
>
> Complejo::Complejo(double re, double im){
>   real = re;
>      imaginaria = im;
> }
>
> void Complejo::SumaComplejo( double r2, double i2 ){
>
>   real = real + r2;
>   imaginaria = imaginaria + i2;

Deberías acostumbrarte a usar el operador +=, como en este caso; esto es,

real += r2;
imaginaria += i2;

>   cout<<  "El resultado de la suma de complejos es:"<<  endl;
>   ImpresionComplejo ();

Esto no es nada aconsejable. Cada función debe realizar la tarea que se 
le imputa; ni más ni menos.

En este caso, realizas dos tareas:
1. Calcular la suma, y
2. Comunicar los resultado al usuario

El diseño de 'SumaComplejo()' es la de sumar dos números complejos - 
nada más. El hecho de comunicarse o no con el usuario no es la 
responsabilidad de esta función miembro. Además, puedes ver que no 
siempre conviene mantener esta tarea, porque puede darse el caso de que 
tenemos que sumar varios miles de números complejos que forma parte de 
una tarea más complicada, como por ejemplo una suma total. No sería 
coherente que el usuario de repente vea en la pantalla miles de mensajes 
cuando en realidad pidió hacer una suma total y que obviamente la muestre.

En general, es más fácil agregar funcionalidad que eliminarla.

> }
>
> void Complejo::RestaComplejo( double r2, double i2 ){
>
>   real = real - r2;
>   imaginaria = imaginaria - i2;
>   cout<<  "El resultado de la resta de complejos es: "<<  endl;
>   ImpresionComplejo ();
> }
>

Aquí tenemos la misma situación que antes.

>
> void Complejo::ImpresionComplejo (){
>
>   cout<<  " ( "<<  real<<" , "<<  imaginaria<<  " *i ) "<<  endl;

En matemáticas, el uso de "i" es para expresar un número complejo de 
forma algebraica; por ejemplo,

3 + 4i

También se puede representar como una pareja ordenada:

(3,4)

Aconsejo elegir una u otra forma, pero no la combinación.

Tampoco aconsejo agregar lo de 'endl', ya que como dije antes, es más 
fácil agregar esta funcionalidad que eliminarla.

> }
>
>
> int main ()
> {
>   Complejo C1;
>   cout<<  "El complejo por defecto es: "<<  endl;
>   C1.ImpresionComplejo();
>   cout<<  "El segundo complejo es:"<<  endl;
>   Complejo C2( 12.5, 28.4 );
>   C2.ImpresionComplejo();
>   C2.SumaComplejo( 8.9, 34.2 );
>   cout<<  "El tercer complejo es : "<<  endl;
>   Complejo C3( 23.8, 32.12 );
>   C3.ImpresionComplejo();
>   C3.RestaComplejo( 11.5, 13.8 );
>   return 0;
> }
>

En general, todo está bien hecho, aunque hay algunos matices sobre el 
diseño que te voy a comentar:

1. Aunque el ejercicio pide implementar ciertas funciones, siempre 
deberías tener presente que una clase debe ser útil. El problema es que 
no podemos acceder a la información de un número complejo: las partes 
real e imaginaria.

Sugiero agregar funciones miembro para acceder a esta información, tanto 
para leer (obtener) como para escribir (asignar).

2. Para la suma y resta, sabemos que debe ser entre complejos, así que 
el nombre 'SumaComplejo()' no es necesario, por lo que podrías reducirlo 
a simplemente: 'suma()'.

3. Como es una suma o resta entre complejos, no es necesario permitir el 
paso de 2 valores de coma flotante. Deberías aceptar un objeto de tipo 
'Complejo'. Esto es,

Complejo Complejo::Suma( const Complejo &der );

También impones que la suma realmente es una suma y asignación; es 
decir, modifica "este objeto" al realizar la suma. No sé si es eso lo 
que realmente quieres hacer.


Espero haber aclarado las dudas.

Steven





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