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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Funcion isdigit
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funcion isdigit  (Leído 4,754 veces)
mapers


Desconectado Desconectado

Mensajes: 638


Ver Perfil
Funcion isdigit
« 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.  


En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Funcion isdigit
« Respuesta #1 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()

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)


En línea

mapers


Desconectado Desconectado

Mensajes: 638


Ver Perfil
Re: Funcion isdigit
« Respuesta #2 en: 17 Marzo 2011, 17:46 pm »

no te entiendo a ver explicate "!"!"
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Funcion isdigit
« Respuesta #3 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

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?
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
manejo de argumentos en funcion dentro de funcion ???
PHP
SpiderNet 2 3,578 Último mensaje 30 Septiembre 2008, 03:01 am
por SpiderNet
Duda con funcion dentro de funcion en un echo
PHP
N4X 6 6,071 Último mensaje 21 Enero 2010, 18:12 pm
por N4X
isdigit(); problema con validacion de caracteres
Programación C/C++
Netzari Limas 4 4,435 Último mensaje 26 Marzo 2015, 08:05 am
por eferion
ayuda con una validacion de solo numeros con la funcion isdigit
Programación General
geshiro 1 2,100 Último mensaje 12 Agosto 2015, 05:32 am
por engel lex
[C][isdigit] Pequeña cuestión función isdigit en mi programa
Programación C/C++
MrCorn 8 4,276 Último mensaje 30 Abril 2021, 19:10 pm
por MrCorn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines