Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mapers en 17 Marzo 2011, 06:05 am



Título: Funcion isdigit
Publicado por: mapers en 17 Marzo 2011, 06:05 am
buenas señores necesito qe me aclaren una duda con esta funcion estoy creando un programa en el que ingrese una cadena de caracteres y me bote lo siguientes:
"asd39n"       345     34.455     A345
cadena        entero    flotante     identificador

pero no se algo esta mal que no me da lo qu e yo quiero a ver denlñe una ojeada  mi code :D gracias
Código
  1. //------------------------------------------------------//
  2. //------------------------------------------------------//
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8. #include <iomanip.h>
  9. using std::cout;
  10. using std::endl;
  11. #include <cstring>
  12. int ident=0;
  13. //------------------------------------------------------//
  14. //------------------------------------------------------//
  15. void cadena_caracteres(char *sub_cadena );
  16. void numero_entero(char *sub_cadena);
  17. void numero_flotante(char *sub_cadena);
  18. void identificador (char *sub_cadena);
  19. //------------------------------------------------------//
  20. //------------------------------------------------------//
  21. int main()
  22. {
  23.  char frase[100];
  24.  char *sub_cadena=NULL;
  25. cout<<"ingrese la frase a evaluar    ";
  26. gets(frase);
  27.  sub_cadena = strtok(frase," ");
  28.  while(sub_cadena!= NULL)
  29.    {
  30.      cout << sub_cadena << " ------> ";
  31. //------------------------------------------------------//
  32.      if(sub_cadena[0]=='"')
  33.      {
  34.        cadena_caracteres(sub_cadena);
  35.  
  36.      }
  37. //------------------------------------------------------//
  38.     for(int j=0;j<strlen(sub_cadena);j++)
  39.      {
  40.              if(sub_cadena[j]=='.')
  41.              {
  42.                 numero_flotante(sub_cadena);
  43.                 ident=j;
  44.                 break;
  45.              }
  46.      }
  47. //------------------------------------------------------//
  48.  
  49.  if( isdigit(sub_cadena[0])!=0 && isdigit(sub_cadena[ident])!=0)
  50.      {
  51.            numero_entero(sub_cadena);
  52.  
  53.      }
  54. //------------------------------------------------------//
  55. if( isdigit(sub_cadena[0])!=0)
  56.      {
  57.            identificador(sub_cadena);
  58.  
  59.      }
  60. //------------------------------------------------------//
  61.      sub_cadena = strtok(NULL, " ");
  62.    }
  63.  system("pause");
  64. }
  65.  
  66. //------------------------------------------------------//
  67. //------------------------------------------------------//
  68.  
  69. void cadena_caracteres(char *sub_cadena)
  70. {
  71. int n=strlen(sub_cadena);
  72. if(sub_cadena[n-1]=='"')
  73. {
  74.    cout<<endl;
  75.    cout<<setw (25)<<"ES UNA CADENA DE CARACTERES"<<endl;  
  76. }  
  77. // else { cout<<endl;cout<<setw (25)<<"PARECIA  UNA CADENA DE CARACTERES PERO NO LO ES "<<endl;  }  
  78. }
  79. //------------------------------------------------------//
  80. //------------------------------------------------------//
  81. void numero_entero(char *sub_cadena)
  82. {
  83.   int x=0;  
  84.    for(int i=0;i<strlen(sub_cadena);i++)  
  85.    {
  86.     if(isdigit(sub_cadena[i]))
  87.       {
  88.         x++;
  89.       }
  90.    }  
  91.  
  92.    if(x==strlen(sub_cadena))  
  93.    {
  94.      cout<<endl;cout<<setw (25)<<"ES UN NUMERO ENTERO "<<endl;
  95.    }
  96.    //else {cout<<endl;cout<<setw (25)<<"ESTO NO ES UN NUMERO ENTERO "<<endl;}
  97.  
  98. }
  99.  
  100. //------------------------------------------------------//
  101. //------------------------------------------------------//
  102.  
  103. void numero_flotante(char *sub_cadena)
  104. {
  105.     int x=0,y=0;
  106. for(int i=0;i<strlen(sub_cadena);i++)  
  107.    {
  108.     if(isdigit(sub_cadena[i]))
  109.       {
  110.         x++;
  111.       }
  112.       if(sub_cadena[i]=='.')
  113.              {
  114.               y++;
  115.              }
  116.    }  
  117.  
  118.    if(x==strlen(sub_cadena)-1 &&  y==1)
  119.    {
  120.     cout<<endl;cout<<setw (25)<<"ES UN NUMERO FLOTANTE "<<endl;
  121.    }
  122.   // else {cout<<endl;cout<<setw (25)<<"ESTO NO ES UN NUMERO FLOTANTE "<<endl;}
  123. }
  124. //------------------------------------------------------//
  125. //------------------------------------------------------//
  126.  
  127. void identificador (char *sub_cadena)
  128. {
  129.     int x=0,y=0;
  130.  
  131. for(int i=0;i<strlen(sub_cadena);i++)  
  132.    {
  133.         if(isdigit(sub_cadena[i])!=0)
  134.         {
  135.          x++;
  136.         }
  137.          if(isdigit(sub_cadena[i])==0)
  138.         {
  139.          x++;
  140.         }
  141.     }
  142.  
  143.         if(isdigit(sub_cadena[0])==0 && x+y==strlen(sub_cadena))
  144.         {cout<<endl;cout<<setw (25)<<"ESTO ES UN IDENTIFICADOR  "<<endl;}
  145. }
  146.  
  147.  


Título: Re: Funcion isdigit
Publicado por: Akai en 17 Marzo 2011, 11:49 am
Tu planteamiento diría que está mal. Por otro lado, creo que te conviene revisar la referencia de isdigit() (http://www.cplusplus.com/reference/clibrary/cctype/isdigit/)

Veamos, si lo he entendido bien:
si tiene números y minúsculas --> cadena
números únicamente: número decimal
número y signo de puntuación: flotante
Empieza por mayúscula y va seguido de números: Identificador

No te voy a dar el trabajo hecho, pero te daré un consejo (según lo que he entendido yo del problema):
En tu caso, o al menos así se me ocurre a mi, puede resultar más sencillo si mirás el problema como un flujo lógico

Un entero no es un flotante porque no tiene el punto, ni es un identificador porque no empieza por una mayúscula, ni es una cadena porque no tiene letras.

O un flotante no es un entero porque tiene punto, tampoco es un identificador porque no tiene una mayúscula, y no es una cadena porque no tiene minúsculas.

No se si me sigues. Por otro lado, no te estoy sugiriendo que hagas un programa que por fuerza bruta compruebe los 4 casos del tirón es decir, algo de este estilo:
Código:
es_flotante(cadena){
si (tiene punto y no mayúscula y no letras)
return es_flotante

en caso contrario
return no_lo_es
}

Para nada hagas algo así, es perder el tiempo, creo yo. O bueno, no. Si de esa forma te resulta más intuitivo, hazlo así, y luego intenta pasarlo a una comprobación al vuelo que es más eficiente dado que no compruebas todos los casos.

(En el mejor de los casos, si lanzases pongamos 4 funciones y la primera te diese que si, obtendrías el resultado y ya no necesitarías lanzar las otras, pero en caso que lo que te han pasado fuese la última, haces el trabajo 4 veces)


Título: Re: Funcion isdigit
Publicado por: mapers en 17 Marzo 2011, 17:46 pm
no te entiendo a ver explicate "!"!"


Título: Re: Funcion isdigit
Publicado por: Akai en 17 Marzo 2011, 18:57 pm
Creo que antes no me he podido expresar mejor, te conviene revisar qué hace isdigit, y añado, qué clase de caracteres se encuentran en la tabla ASCII, porque isdigit solo te dice si pertenece a un tipo o no.

Tu problema (o uno de ellos):
Código
  1. for(int i=0;i<strlen(sub_cadena);i++)  
  2.    {
  3.         if(isdigit(sub_cadena[i])!=0)
  4.         {
  5.          x++;
  6.         }
  7.          if(isdigit(sub_cadena[i])==0)
  8.         {
  9.          x++;
  10.         }
  11.     }
  12.  
Si es un numero, incrementas x, sino, también, boom goes the dynamite.
De esta forma, directamente recorres la cadena llamando a isdigit 2 veces por cada carácter y ya, sin diferenciar si es una letra, un numero, o un signo de puntuación, o cualquier otro carácter especial.

Creo que aquí prefieras usar isalnum (http://www.cplusplus.com/reference/clibrary/cctype/isalnum/)

Por otro lado: las cadenas, las introduces como (ejemplo) "asd53" o como asd53 ? porque si es el segundo caso, problema.

Además, te repito, tu código comprueba los 4 casos (caden,a entero, float, identificador) SIEMPRE, y eso no es muy eficiente. Si ya has visto que es una cadena, por ejemplo, para qué hacer el resto?