[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