elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programacion orientada a objetos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programacion orientada a objetos  (Leído 2,258 veces)
edwinabril1992

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Programacion orientada a objetos
« en: 9 Octubre 2013, 06:14 am »

Hola disculpen estoy haciendo un progarma de verificar la cedula de identidad en programacion orientada  aobjetos en borland c++ pero no ejecuta el programa podrian darme viendo que esta mal...........
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
class ccedula
{
   public:
   double c,dv,nd,sp,sim,pim,ds,st,dv2;
   int i;
   //solicitar el ingreso de la cedula sin guion
   void leer()
   {
      cout<<"\nPrograma para validar la cedula de identidad ecuatoriana";
      cout<<"\nIngrese el numero de cedula sin guion";
      cin>>c;
   }
   int validar()
   {
      dv=c%10;
      c=c/10;
      i=9;
      while(i>=1)
      {
         nd=c%10;
         c=c/10;
         if(i%2==0)
         {
            sp=nd+sp;
         }
         else
            {
            pim=nd*2;
            if(pim>9)
               {
               pim=pim-9;
               }
            sim=sim+pim;
            }
            i=i-1;
      }
      st=sp+sim;
      if((st>=1)&&(st<=9))
            {
               ds=10;
            }
         else
            if((st>=10)&&(st<=19))
               {
                  ds=20;
               }
            else
               if((st>=20)&&(st<=29))
                  {
                     ds=30;
                  }
               else
                  if((st>=30)&&(st<=39))
                     {
                        ds=40;
                     }
                  else
                     if((st>=40)&&(st<=49))
                        {
                           ds=50;
                        }
                     else
                        if((st>=50)&&(st<=59))
                           {
                              ds=60;
                           }
                        else
                           if((st>=60)&&(st<=79))
                              {
                                 ds=70;
                              }
                           else
                              if((st>=70)&&(st<=89))
                                 {
                                    ds=80;
                                 }
                              else
                                 if((st>=80)&&(st<=89))
                                 {
                                    ds=90;
                                 }
      dv2=ds-st;
      return(dv2);
   }
   void imprimir()
         {
            if(validar()==dv)
               {
               cout<<"\nNumero de cedula correcta";
               }
            else
               {
               cout<<"\nNumero de cedula incorrecto";
               cout<<"\nIntente nuevamente";
               }
         }
}
   void main()
         {
            clrscr();
            ccedula odocumento;
            odocumento.leer();
            odocumento.validar();
            odocumento.imprimir();
            getch();
         }


En línea

erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Programacion orientada a objetos
« Respuesta #1 en: 9 Octubre 2013, 06:23 am »

No estas especificando el espacio de nombres cuando usas "cout", que vendria a ser std::cout, al igual que std::cin aunque mejor que uses otro IDE ya que ese es bastante antiguo.

Normalmente los atributos de una clase tienden a ser private.

Al encabezado iostream no es necesario .h, solo basta hacerlo #include <iostream>


« Última modificación: 9 Octubre 2013, 06:29 am por erest0r » En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Programacion orientada a objetos
« Respuesta #2 en: 9 Octubre 2013, 08:47 am »

Aparte de lo comentado por erest0r un par de consejos:

1. En el foro, encapsula el texto con las etiquetas GeSHi. Así los que intentamos ayudarte no nos dejaremos los ojos intentando leer tu código.

2. Intenta optimizar. Cuando tienes que poner una secuencia larga de ifs, en la mayoría de los casos, deberías pensar que hay una solución mejor. Me explico:

Código
  1. if((st>=1)&&(st<=9))
  2.            {
  3.               ds=10;
  4.            }
  5.         else
  6.            if((st>=10)&&(st<=19))
  7.               {
  8.                  ds=20;
  9.               }
  10.            else
  11.               if((st>=20)&&(st<=29))
  12.                  {
  13.                     ds=30;
  14.                  }
  15.               else
  16.                  if((st>=30)&&(st<=39))
  17.                     {
  18.                        ds=40;
  19.                     }
  20.                  else
  21.                     if((st>=40)&&(st<=49))
  22.                        {
  23.                           ds=50;
  24.                        }
  25.                     else
  26.                        if((st>=50)&&(st<=59))
  27.                           {
  28.                              ds=60;
  29.                           }
  30.                        else
  31.                           if((st>=60)&&(st<=79))
  32.                              {
  33.                                 ds=70;
  34.                              }
  35.                           else
  36.                              if((st>=70)&&(st<=89))
  37.                                 {
  38.                                    ds=80;
  39.                                 }
  40.                              else
  41.                                 if((st>=80)&&(st<=89))
  42.                                 {
  43.                                    ds=90;
  44.                                 }

Lo primero de este código ( por cuestión de estilo y legibilidad ), sería evitar tantos niveles de tabulado, ya que su legibilidad mejora enormemente si los niveles de tabulación no son excesivos. Esto lo puedes conseguir poniendo el else y el if en la misma línea:

Código
  1. if((st>=1)&&(st<=9))
  2. {
  3.    ds=10;
  4. }
  5. else if((st>=10)&&(st<=19))
  6. {
  7.    ds=20;
  8. }
  9. else if((st>=20)&&(st<=29))
  10. {
  11.    ds=30;
  12. }
  13. else if((st>=30)&&(st<=39))
  14. {
  15.    ds=40;
  16. }
  17. else if((st>=40)&&(st<=49))
  18. {
  19.     ds=50;
  20. }
  21. else if((st>=50)&&(st<=59))
  22. {
  23.     ds=60;
  24. }
  25. else if((st>=60)&&(st<=79))
  26. {
  27.     ds=70;
  28. }
  29. else if((st>=70)&&(st<=89))
  30. {
  31.     ds=80;
  32. }
  33. else if((st>=80)&&(st<=89))
  34. {
  35.     ds=90;
  36. }

Se lee mejor así, no crees ?

Aún así, llegados a este punto, podrías simplificar aún más este código.

Una opción sería quitar de los else la condición que sobra. Si te fijas, empiezas preguntando si st está en el rango {1, 9}, después si está en el rango {10, 19}... La primera parte de la condición te sobra, ya que si llega al segundo if está claro que st es mayor que 9:

Código
  1. if ( st <= 0 || st >= 90 )
  2.  // Gestiona aqui el error si quieres hacerlo
  3. else if ( st < 10 )
  4.  ds = 10;
  5. else if ( st < 20 )
  6.  ds = 20;
  7. else if ( st < 30 )
  8.  ds = 30;
  9. else if ( st < 40 )
  10.  ds = 40;
  11. else if ( st < 50 )
  12.  ds = 50;
  13. else if ( st < 60 )
  14.  ds = 60;
  15. else if ( st < 70 )
  16.  ds = 70;
  17. else if ( st < 80 )
  18.  ds = 80;
  19. else // Aqui nos podemos ahorrar la condicion
  20.  ds = 90;

Y luego, para este caso, hay otra opción muy sencilla. Si te das cuenta, ds es siempre el múltiplo de diez que está inmediatamente por encima de st... puedes reducirlo todo a una operación matemática:

Código
  1. if ( st <= 0 || st >= 90 )
  2.  // Gestiona aqui el error si quieres hacerlo
  3. else
  4.  ds = ( ( st / 10 ) + 1 ) * 10;

3. Usa nombres que signifiquen algo

A la hora de declarar variables intenta buscarles un nombre significativo. Entiendo que para contadores se suelen usar i, j, k, ... todo el mundo lo entiende... pero que el número de cedula lo guardes en una variable de nombre c... eso no, por favor.

Imagínate un archivo con 3.000 líneas plagado de variables tipo a, b, c, d ... el código sería ilegible.

Además el programa no va a ser más largo ni más lento... elige nombres significativos, el rendimiento será el mismo, el programa ocupará exactamente lo mismo y tu código pasará a ser bastante más legible.

4. Usa el tipo de variable adecuado

No tiene sentido que para almacenar un entero utilices un double. double es para números en coma flotante ( con decimales ). Los cálculos con números decimales son bastante más costosos que con números enteros... además, tanto float como double pueden presentar problemas de precisión si pones números con muchos dígitos significativos.

Si vas a usar enteros, usa int. El tipo int lo inventaron para algo...

5. En C++ las variables deberían ser privadas por defecto

Una de las gracias de la programación orientada a objetos es que puedes encapsular el código o, dicho de otra forma, puedes restringir y limitar tanto el uso que se le da al código como el acceso a las variables.

Si creas una clase y, por defecto, declaras todas las variables como públicas estás haciendo algo mal. Fíjate que fuera de la clase no se accede directamente a ninguna variable... todas podrían y deberían ser privadas.

Una ventaja de la encapsulación es que, al tener que usar funciones para recuperar / modificar las variables de una clase, es fácil implementar filtros que eviten que las variables contenidas en la clase tengan valores incorrectos ( a esto se le denomina inconsistencia )

Además, si las variables se usan solo dentro de una función miembro, dichas variables deberían estar declaradas única y exclusivamente dentro de dicha función. Las variables que declaras dentro de una clase tienen que tener algún sentido para la propia clase ( como una variable nombre dentro de la clase "Persona", sin embargo, la variable "i", que se usa como contadores en algunas funciones, no aporta nada a la clase "Persona" como tal )

La declaración de tu clase debería tener un aspecto más parecido a éste:

Código
  1. class ccedula
  2. {
  3.  public:
  4.  
  5.    // Constructor por defecto... hay que inicializar las variables miembro.
  6.    // Los constructores son MUY importantes.
  7.    ccedula( );
  8.  
  9.    //solicitar el ingreso de la cedula sin guion
  10.    void leer( );
  11.  
  12.    int validar( ) const; // le pongo el const porque no deberia modificar "cedula"
  13.  
  14.    void imprimir( ) const; // le pongo el const porque no deberia modificar "cedula"
  15.  
  16.  private:
  17.    int cedula; // He cambiado tanto el tipo como el nombre
  18. };

Y ya está, la declaración no necesita nada más. Todas las variables que faltan deberían estar definidas en la función correspondiente que las usa, no en el cuerpo de la clase.

En cuanto a la implementación...

Código
  1.  
  2. ccedula::ccedula( )
  3.  : cedula( 0 ) // Inicializamos cedula a cero, es mejor que dejarla con un valor aleatorio
  4. {
  5. }
  6.  
  7. void ccedula::leer( )
  8. {
  9.  // tu implementacion
  10. }
  11.  
  12. int ccedula::validar( ) const
  13. {
  14.  // tu implementacion
  15. }
  16.  
  17. void ccedula::imprimir( ) const
  18. {
  19.  // tu implementacion
  20. }

Y bueno, hay cosas que programaría diferente, pero eso ya es el diseño de cada uno.

Un saludo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programacion orientada a objetos en php, ide
PHP
wizache 2 4,467 Último mensaje 11 Marzo 2008, 02:44 am
por [ Alberto]
programacion orientada a objetos con C#
.NET (C#, VB.NET, ASP)
Bleach@lex 3 4,966 Último mensaje 21 Abril 2012, 19:55 pm
por Bleach@lex
Programacion orientada a objetos
Programación C/C++
cazagavilan 4 3,409 Último mensaje 21 Abril 2012, 10:55 am
por cazagavilan
Programacion orientada a objetos
Programación C/C++
edwinabril1992 2 2,555 Último mensaje 11 Octubre 2013, 09:24 am
por eferion
¿Qué es la programación orientada a objetos? « 1 2 »
Programación General
Linton 13 5,844 Último mensaje 6 Febrero 2014, 08:14 am
por El Benjo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines