Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: edwinabril1992 en 9 Octubre 2013, 06:18 am



Título: Programacion orientada a objetos
Publicado por: edwinabril1992 en 9 Octubre 2013, 06:18 am
Hola disculpen podrianme ayudar esque tengo q hacer un programa que ingrese las latitudes con las temperaturas pero en cualquier orden que el usuario desee de ahicalcular el promedio de cada latitud, calcular el promedio por hemisferio,y calcular cual de los hemisferios es el mas calido.......... si me prodrian ayudar.........
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#define N 100
class puntos
{
    public:
    float temp,latitud;
    int n;
    void leer();
    void mostrar();
    int cantidad();
};
void puntos::leer()
{

    cout<<"\nIngrese la latitud : ";
    cin>> latitud;
    cout<<"Ingrese la temperatura : ";
    cin>> temp;
    cout<<"\n";

};
void puntos::mostrar()
{
    cout<<"Temperatura : ";
   cout<< temp;
    cout<<"  Latitud : ";
    cout<< latitud;
    cout<<"\n";
};
int puntos::cantidad()
{
    cout<<"Ingrese el # de puntos : ";
    do
       cin>> n;
    while(n<1||n>N);
    return(n);
};


class centro
{
    public:
    void leer(puntos v[],int n);
    void mostrar(puntos v[],int n);
    void pormedio_latitud(puntos v[], int n);
    void pormedio_hemisferio(puntos v[], int n);
    void mas_calido(puntos v[], int n);
};
void centro::leer(puntos v[],int n)
{
    cout<<"Ingrese los datos del Centro de Investigacion\n";

    for(int c=0;c<n;c++)
    {
      v[c].leer();
    }
};
void centro::mostrar(puntos v[],int n)
{
    cout<<"\n";
    for(int c=0;c<n;c++)
    {
      v[c].mostrar();
    }
};

/*void centro:: pormedio_latitud(puntos v[], int n)
{
    float s=0;
    int k=0;
    for(int c=0;c<n;c++)
    {
        for(int d=0;d<n;d++)
        {
         if(v[c].mostrar()=v[d])
      {
          k++;
          s=s+v[d];
      }
      }
  cout<< s/k ;
  s=0;
  k=0;
 }
};*/
void main()
{
    clrscr();
    centro x;
    puntos w;
    puntos v[N];
    int n;
    n=w.cantidad();
    x.leer(v,n);
    x.mostrar(v,n);
    getch();
}


Título: Re: Programacion orientada a objetos
Publicado por: MeCraniDOS en 11 Octubre 2013, 00:04 am
Pon el código entre las etiquetas "code" que así se vera mucho mejor  :silbar:

Que error te da?

Saludos


Título: Re: Programacion orientada a objetos
Publicado por: eferion en 11 Octubre 2013, 09:24 am
Tu código presenta algunos problemas de diseño:

1. Las variables de una clase deberían ser privadas.

Esto es así porque uno de los objetivos que se persigue con la programación orientada a objetos es la encapsulación, que entre otras cosas intenta que el acceso al estado de un objeto ( sus variables ) pase a través de determinados filtros que garanticen su consistencia.

Dejar las variables en public permite que desde cualquier parte del código se pueda modificar su valor sin rendir cuentas a nadie, lo que podría desembocar en un mal funcionamiento del código.

2. Las clases que "almacenan" información no deberían tener interfaz de usuario

Este punto básicamente intenta que tu código sea lo más versátil posible. Imagínate que un buen día decides que tu programa funcione en un entorno gráfico... te va a tocar reescribir la mitad de tus clases para que en vez de trabajar con la consola pasen a utilizar la interfaz gráfica.

Es mejor que, por ejemplo, la clase "puntos" únicamente se preocupe por almacenar los puntos y que sea alguna otra clase, o código del main, la que se encargue de requerir los datos al usuario y almacenarlos en "puntos".

3. Si quieres almacenar una serie de valores, necesitas vectores.

Esto te ha quedad claro pero a medias... no tiene mucho sentido que "puntos" almacene el número de puntos y no almacene los puntos en sí... desde mi punto de vista sería más lógico que v[] estuviese en "puntos". Entre otras cosas N no tiene sentido por sí misma ( porque no tienes los valores ) y v[] tampoco ( porque no sabes cuántos puntos son.

Un detalle a anotar en este apartado es que, dado que estás en c++, quizás deberías decantarte por el uso de la clase "vector"... ya puestos a programar en c++ aprende a sacarle todo el partido.

Además, si haces uso de la clase "vector", te puedes ahorrar el uso de "n".

4. Los nombres de las variables son gratuítos

Lo comento porque tener variables con nombres tan identificativos como "n" o "v" es muy cutre. Usa nombres descriptivos, te ayudarán a identificar mejor lo que hacen las variables.

Vaaaale si, me puedes decir que en este programa lo entiendes... pero si quieres te paso un código fuente de 1000 líneas con todas las variables con nombres tipo a, b, c, ... y el mismo con nombres válidos... a ver cuál entiendes mejor.

5. Una clase, si no tiene variables, o es una clase con utilidades, o está mal planteado el diseño.

Si revisas el código te darás cuenta de que la clase "centro" no es capaz de hacer nada por sí misma... todos sus miembros necesitan los mismos parámetros... n y v. Esto te está indicando algunas cosas:

* Reafirma que n y v deberían estar juntas ( por ejemplo en "puntos" ). De hecho, si estuviesen en "puntos" te ahorrarías un parámetro en todos los miembros de "centro".
* Lo que hace "centro" podría estar implementado en "puntos" sin problema.
* Todos los miembros de "centro" son utilidades

6. Los includes de c++ no llevan .h

Los includes por defecto de las librerías de c++ van sin extensión. Te recomiendo no añadir esas extensiones porque entonces te arriesgas a que tu código no sea portable. Básicamente es porque los .h de la stl de c++ no es algo que venga con el estándar.

7. SIEMPRE hay que inicializar las clases.

Es un requisito que ahorra muchos problemas futuros. Las clases, por definición, disponen de constructores... úsalos para inicializar todas las variables miembro de la clase.

Una variable sin inicializar ( sobretodo si son punteros ) puede suponer un problema complicado de resolver, ya que te va a fallar muy lejos del origen del problema, por lo que solucionarlo te puede llevar bastante tiempo.

Resumen

Para no apabullar solo con datos, te propongo una arquitectura algo más acorde con buenas prácticas de programación:

Código
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. enum Hemisferio
  5. {
  6.  Ninguno,
  7.  HemisferioNorte,
  8.  HemisferioSur
  9. };
  10.  
  11. class Punto
  12. {
  13.  public:
  14.    Punto( ); // Constructor por defecto
  15.  
  16.    float GetLatitud( ) const;
  17.  
  18.    float GetTemperatura( ) const;
  19.  
  20.    void SetLatitud( float latitud );
  21.  
  22.    void SetTemperatura( float temperatura );
  23.  
  24.  private:
  25.  
  26.    float latitud;
  27.    float temperatura;
  28. };
  29.  
  30. class Centro
  31. {
  32.  public:
  33.    Centro( );
  34.  
  35.    const std::vector< Punto >& GetPuntos( ) const;
  36.  
  37.    // Calculo de los promedios de temperatura por latitud
  38.    // devuelve un vector de puntos en el que la temperatura es la temperatura promedio
  39.    std::vector< Punto > PromediosLatitud( ) const;
  40.  
  41.    // Calculo de los promedios de temperatura por hemisferio
  42.    // devuelve un vector de temperaturas con dos elementos. El primero corresponde al hemisferio norte y el segundo al sur.
  43.    std::vector< float > PromediosHemisferio( ) const;
  44.  
  45.    void SetPuntos( const std::vector< Punto >& puntos );
  46.  
  47.    // Indica cual es el hemisferio mas calido.
  48.    Hemisferio HemisferioMasCaliente( ) const;
  49.  
  50.  private:
  51.  
  52.    std::vector< Punto > puntos;
  53. };

Y ahora parte de la implementación:


EI: la implementacion que la haga el, acordate que aca no hacemos tareas.