Foros del Web » Programación para mayores de 30 ;) » C/C++ »

do while false

Estas en el tema de do while false en el foro de C/C++ en Foros del Web. Estoy intentado que haga x cosa mientras que lo introducido no sea numero @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original do {     .................   ...
  #1 (permalink)  
Antiguo 19/11/2014, 08:55
 
Fecha de Ingreso: octubre-2010
Mensajes: 45
Antigüedad: 13 años, 6 meses
Puntos: 0
do while false

Estoy intentado que haga x cosa mientras que lo introducido no sea numero

Código C++:
Ver original
  1. do {
  2.     .................
  3.     } while (n>='0' || n<='0');

Ahora mismo se realiza al reves, cuando es numero se repite, he probado con while !(n>='0' || n<='0') pero falla
  #2 (permalink)  
Antiguo 19/11/2014, 09:50
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por loCk636 Ver Mensaje
Estoy intentado que haga x cosa mientras que lo introducido no sea numero
Código C++:
Ver original
  1. do{
  2.     .......................
  3. }while ( n < '0' || n > '9' ) ;

¡¡¡Saluditos!!!

  #3 (permalink)  
Antiguo 19/11/2014, 10:53
 
Fecha de Ingreso: octubre-2010
Mensajes: 45
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: do while false

Me sigue fallando y no entiendo por que
Código C++:
Ver original
  1. int n;
  2. do{
  3.     .......................
  4. }while ( n < '0' || n > '9' ) ;

es por que utilizo int?
  #4 (permalink)  
Antiguo 19/11/2014, 10:57
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por loCk636 Ver Mensaje
Me sigue fallando y no entiendo por que
Código C++:
Ver original
  1. int n;
  2. do{
  3.     .......................
  4. }while ( n < '0' || n > '9' ) ;

es por que utilizo int?
Claro, tal como está es para un char. Si lo que quieres es para un int:

Código C++:
Ver original
  1. int n;
  2. do{
  3.     .......................
  4. }while ( n < 0 || n > 9) ;

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 19/11/2014, 12:21
 
Fecha de Ingreso: octubre-2010
Mensajes: 45
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: do while false

Cita:
Iniciado por leosansan Ver Mensaje
Claro, tal como está es para un char. Si lo que quieres es para un int:

Código C++:
Ver original
  1. int n;
  2. do{
  3.     .......................
  4. }while ( n < 0 || n > 9) ;

¡¡¡Saluditos!!!

Con esta solucion valida los numeros positivos, pero los negativos tambien son numeros
  #6 (permalink)  
Antiguo 19/11/2014, 12:44
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por loCk636 Ver Mensaje
Con esta solucion valida los numeros positivos, pero los negativos tambien son numeros
Cambia el cero y el nueve por el rango de valores admisibles....y si no, porfi, explica mejor lo que pretendes.

¡¡¡Saluditos!!!

  #7 (permalink)  
Antiguo 19/11/2014, 12:53
 
Fecha de Ingreso: octubre-2010
Mensajes: 45
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: do while false

Cita:
Iniciado por leosansan Ver Mensaje
Cambia el cero y el nueve por el rango de valores admisibles....y si no, porfi, explica mejor lo que pretendes.

¡¡¡Saluditos!!!

Yo introduzco un numero que lo meto en la variable int "n"

si n no es numero (tanto <0 o >0) que vuelva a introducir por teclado
  #8 (permalink)  
Antiguo 19/11/2014, 14:43
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 10 años, 6 meses
Puntos: 5
Respuesta: do while false

Una variable de tipo int siempre almacenará un número entero (0,1,2,-1,994,-374,...). Sabiendo esto, debes darte cuenta de que no puedes encontrar una condición en la que una variable int sea diferente de un número, no tiene sentido.

Ahora bien, una variable de tipo char almacenará carácteres de la tabla ASCII (256 carácteres diferentes en total). Aunque todos ellos son variables de tipo char, representan tanto letras, como números, símbolos, etc.

Si utilizas un char en vez de un int para guardar la respuesta del usuario, puedes verificar si el cáracter introducido es un número o no con la condición que ya te han comentado arriba. Esta sería la implementación completa:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(void){
  5.  
  6.     char n;
  7.  
  8.     cout << "Introduce algo: ";
  9.     cin >> n;
  10.  
  11.     do{
  12.         cout << "Repetir si no soy un numero" << endl;
  13.     }while ( n < '0' || n > '9') ;
  14.  
  15.     return 0;
  16. }
  #9 (permalink)  
Antiguo 19/11/2014, 15:26
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 6 meses
Puntos: 13
Respuesta: do while false

Cita:
Iniciado por Madh Ver Mensaje
Una variable de tipo int siempre almacenará un número entero (0,1,2,-1,994,-374,...). Sabiendo esto, debes darte cuenta de que no puedes encontrar una condición en la que una variable int sea diferente de un número, no tiene sentido.

Ahora bien, una variable de tipo char almacenará carácteres de la tabla ASCII (256 carácteres diferentes en total). Aunque todos ellos son variables de tipo char, representan tanto letras, como números, símbolos, etc.

Si utilizas un char en vez de un int para guardar la respuesta del usuario, puedes verificar si el cáracter introducido es un número o no con la condición que ya te han comentado arriba. Esta sería la implementación completa:
Concuerdo totalmente con Madh dejo otra opción con la condición de do while diferente:

Código C++:
Ver original
  1. char n;
  2. do{
  3.     printf("Repetir si no soy un numero\n");
  4.     scanf(" %c", &n);
  5. }while( !(n >= '0' && n <= '9') );

Saludos
  #10 (permalink)  
Antiguo 19/11/2014, 15:42
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por kutcher Ver Mensaje
Concuerdo totalmente con Madh dejo otra opción con la condición de do while diferente:
Pues yo no concuerdo con ninguno de los dos. Para empezar se puede producir un bucle infinito si no entran un número y, lo más importante, no consideran el caso de un número negativo, es decir que el primer caracter sea un menos. Por no mencionar que aún aunque se introduzca un número correcto sale el mensajito de "Repetir si no soy un numero". Además el número no tiene porque limitarse a una cifra.

Una opción chapucera sería:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main ( ) {
  4.   int i , numero , flag = 0 , flag1 = 0 ;
  5.   char num [20];
  6.   do {
  7.     flag = 0 , flag1 = 0 ;
  8.     printf ( "\nIntroduzca un numero entero: " ) ;
  9.     scanf ( "%s" , num ) ;
  10.     for ( i = 0 ; num [ i ] ; i++ ) {
  11.       if ( num [0] == '-' && flag1 == 0 )
  12.         flag1 = 1 ;
  13.       else if ( num [i] < '0' || num [i] > '9')
  14.         flag = 1 ;
  15.     }
  16.   }while ( flag != 0 ) ;
  17.   printf ( "\nnumero = %d\n" , atoi ( num ) ) ;
  18.   return 0 ;
  19. }

¡¡¡Saluditos!!!

  #11 (permalink)  
Antiguo 19/11/2014, 16:09
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 6 meses
Puntos: 13
Respuesta: do while false

Cita:
Iniciado por loCk636 Ver Mensaje
Yo introduzco un numero que lo meto en la variable int "n"
si n no es numero (tanto <0 o >0) que vuelva a introducir por teclado
loCk636 que quieres decir con esto, tu asumes que ingresas un numero pero después necesitas comprobar si es un numero , considero esto redundante y sin sentido podrías aclarar este punto.

Saludos
  #12 (permalink)  
Antiguo 20/11/2014, 01:01
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por loCk636 Ver Mensaje
Yo introduzco un numero que lo meto en la variable int "n"

si n no es numero (tanto <0 o >0) que vuelva a introducir por teclado
Pues no. Para verificar si es o no un entro, sea positivo o negativo, lo normal es capturarlo con un array de char y luego verificar si lo es o no. Una vez comprobado que es un int lo pasas de char a int.

¡¡¡Saluditos!!!

  #13 (permalink)  
Antiguo 20/11/2014, 02:53
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: do while false

Coincido con leosansan. Lo mejor suele ser primero verificar y después convertir.
Cuando te enfrentas a un usuario lo lógico es pensar mal. Si hay alguna posibilidad de que un usuario introduzca un texto en un campo numérico, ten fe que así lo hará... eso y que el mejor mantenimiento se consigue cuando se separan tareas, lo más factible a la larga es chequear los valores en una primera capa y después hacer las conversiones en una segunda.

Claro que puedes fusionar ambas capas y hacerlo todo a la vez... sin embargo ese código luego te va a resultar más complicado de depurar y de actualizar.

Mi propuesta:

* Detecta el prefijo +/-
* Un número compuesto solo por el prefijo se considera no válido
* Se admiten números sin prefijo.
* Se detectan caracteres no numéricos en cualquier parte de la secuencia.

Código C++:
Ver original
  1. int EsNumero( char* cadena )
  2. {
  3.   int to_return = 0;
  4.  
  5.   if ( *cadena == '-' || *cadena == '+' )
  6.     ++cadena;
  7.  
  8.   do
  9.   {
  10.     to_return = isdigit( *cadena );
  11.   } while( to_return && *++cadena );
  12.  
  13.   return to_return;
  14. }
  15.  
  16. int main ( )
  17. {
  18.   char num [20];
  19.   int numero;
  20.   do
  21.   {
  22.     printf( "Introduzca un numero entero: " );
  23.     scanf( "%s" , num ) ;
  24.   } while( !EsNumero( num ) );
  25.  
  26.   numero = atoi( num );
  27.   printf ( "numero = %d\n" , numero ) ;
  28.   return EXIT_SUCCESS;
  29. }

Un saludo.

Última edición por eferion; 20/11/2014 a las 03:40
  #14 (permalink)  
Antiguo 20/11/2014, 06:02
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por eferion Ver Mensaje
Coincido con leosansan. Lo mejor suele ser primero verificar y después convertir.
Cuando te enfrentas a un usuario lo lógico es pensar mal.............

Mi propuesta:

* Detecta el prefijo +/-
* Un número compuesto solo por el prefijo se considera no válido
* Se admiten números sin prefijo.
* Se detectan caracteres no numéricos en cualquier parte de la secuencia.
Coincido plenamente con eferion en todas sus consideraciones.

Y para que no se diga, otra propuesta sin tanto" flag" como en el anterior y sin sacar la artillería de punteros:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int main ( ) {
  5.   int i = 0 , numero  ;
  6.   char num [20] ;
  7.   do {
  8.     printf ( "\nIntroduzca un numero entero: " ) ;
  9.     scanf ( "%s" , num ) ;
  10.     for ( i = 0 ; num [ i ] ; i++ ) {
  11.       if ( num [0] == '-' || num [0] == '+' )   ++i;
  12.       if ( ! isdigit ( num [i] ) ) { i = -1 ; break ; }
  13.     }
  14.   }while( i == -1 ) ;
  15.   printf ( "\nnumero = %d\n" , atoi ( num ) ) ;
  16.   return 0 ;
  17. }

¡¡¡AGGG¡¡¡, perdón que es con función :

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int EsNumero( char* cadena ) {
  5.     int i ;
  6.     for ( i = 0 ; cadena [ i ] ; i++ ) {
  7.       if ( cadena [0] == '-' || cadena [0] == '+' )  ++i;
  8.       if ( ! isdigit ( cadena [i] ) )  return 0 ;
  9.     }
  10.     return 1 ;
  11. }
  12.  
  13. int main ( ) {
  14.   int numero  ;
  15.   char num [20] ;
  16.   do {
  17.     printf ( "\nIntroduzca un numero entero: " ) ;
  18.     scanf ( "%s" , num ) ;
  19.   }while( !EsNumero( num ) ) ;
  20.   printf ( "\nnumero = %d\n" , atoi ( num ) ) ;
  21.   return 0 ;
  22. }

¡¡¡Güeeeno, está bien, con punteros:

Código C++:
Ver original
  1. int EsNumero( char *cadena ) {
  2.   int i ;
  3.   if ( *cadena  == '-' || *cadena  == '+' )  ++cadena;
  4.   while ( *cadena ) {
  5.      if ( ! isdigit ( *cadena ) )  return 0 ;
  6.      ++cadena;
  7.   }
  8.   return 1 ;
  9. }

¡¡¡Saluditos!!!


Última edición por leosansan; 20/11/2014 a las 06:22
  #15 (permalink)  
Antiguo 20/11/2014, 06:23
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 6 meses
Puntos: 13
Respuesta: do while false

Cita:
Iniciado por eferion Ver Mensaje
Lo mejor suele ser primero verificar y después convertir.
Cuando te enfrentas a un usuario lo lógico es pensar mal. Si hay alguna posibilidad de que un usuario introduzca un texto en un campo numérico, ten fe que así lo hará... eso y que el mejor mantenimiento se consigue cuando se separan tareas, lo más factible a la larga es chequear los valores en una primera capa y después hacer las conversiones en una segunda.
Pues si es en ese plan dejo mi propuesta haciendo uso de la función strtol para variar :

Código C++:
Ver original
  1. bool es_numero( char *s )
  2. {
  3.     while( *s )
  4.     {
  5.         strtol(s, &s, 10);
  6.         if (*s != 0) return false;
  7.     }
  8.     return true;
  9. }
  10.  
  11. int main(void)
  12. {
  13.     char num [20];
  14.     int numero = 0;
  15.  
  16.     do{
  17.         printf( "Introduzca un numero entero: " );
  18.         scanf("%s", num);
  19.     }while( !es_numero(num) );
  20.  
  21.     numero = atoi(num);
  22.     printf("Numero = %d\n", numero);
  23.  
  24.     return 0;
  25. }

leosansan tienes un problema es tus códigos en las lineas :

Código C++:
Ver original
  1. if ( cadena [0] == '-' || cadena [0] == '+' )  ++i;

Siempre verificas el primer indice si este contiene un '-' o '+' siempre incrementas i esto te causa problamas con las cifras pares, debe quedar asi :

Código C++:
Ver original
  1. if ( cadena [i] == '-' || cadena [i] == '+' )  ++i;

Saludos

Última edición por kutcher; 20/11/2014 a las 07:15
  #16 (permalink)  
Antiguo 20/11/2014, 08:22
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por kutcher Ver Mensaje
Pues si es en ese plan dejo mi propuesta haciendo uso de la función strtol para variar :

Código C++:
Ver original
  1. ......................
  2.     numero = atoi(num);
  3.     printf("Numero = %d\n", numero);
  4. .................................

[
Bien por recordar el usa de strol, un poco rebuscado pero efectivo.

Cita:
Iniciado por kutcher Ver Mensaje

leosansan tienes un problema es tus códigos en las lineas :

Código C++:
Ver original
  1. if ( cadena [0] == '-' || cadena [0] == '+' )  ++i;
¡¡¡¡Thanks¡¡¡, y sorry, se me escapo el flag:

Código C++:
Ver original
  1. int EsNumero( char* cadena ) {
  2.     int i , flag = 0 ;
  3.     for ( i = 0 ; cadena [ i ] ; i++ ) {
  4.       if ( cadena [0] == '-' || cadena [0] == '+' && flag == 0 )  ++i , flag = 1 ;
  5.       if ( ! isdigit ( cadena [i] ) )  return 0 ;
  6.     }
  7.     return 1 ;
  8. }

Y puestos a experimentar :

Código C++:
Ver original
  1. int EsNumero( char *cadena ) {
  2.     while ( *cadena  == '-' || *cadena  == '+' || isdigit ( *cadena ) && *cadena != 0 ) *cadena++ ;  
  3.     return  ( strlen ( cadena ) != 0 )  ? 0 : 1 ;
  4. }

Y ¡¡¡más fuerte¡¡¡ , sin usar ningún bucle. A ver quien supera la complejidad del que viene, je je :

Código C++:
Ver original
  1. int EsNumero ( char *num ) {
  2.     int n = log10 ( abs ( atoi ( num ) ) ) + 1 , Strlen;
  3.     return ( n == ( Strlen = ( num [0] == '-' ||  num [0] == '+')  ? strlen ( num ) - 1 : strlen ( num ) ) ) ? 1 : 0 ;
  4. }



¡¡¡Saluditos!!!

  #17 (permalink)  
Antiguo 20/11/2014, 09:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: do while false

No sé si esto se aleja de los que buscáis, pero para validar un número yo uso los streams.

Esto es una función que encontré una vez, que la manoseé para que admitiera la entrada de decimales con coma (vamos, que si se encuentra con una coma la transforma en punto)...pero la idea original no es mía
Código C++:
Ver original
  1. bool validar (std::string& entrada, float& valor)
  2. {
  3.     for (size_t i=0; i<entrada.length(); i++)
  4.         if (entrada[i]==',')
  5.         {
  6.             entrada[i]='.';
  7.         }
  8.     std::stringstream mystream(entrada);
  9.     if(mystream >> valor)
  10.     {
  11.         return true;
  12.     }
  13.     return false;
  14. }

Y la llamamos así:
Código C++:
Ver original
  1. std::string entradanumerica;
  2.         float Cantidad;        
  3.         std::cout<<"Introduce cantidad: "<<std::endl;
  4.         getline (std::cin,entradanumerica);
  5.         while (!validar(entradanumerica,Cantidad))
  6.         {
  7.             getline (std::cin,entradanumerica);
  8.         }

Última edición por dehm; 20/11/2014 a las 09:11
  #18 (permalink)  
Antiguo 20/11/2014, 09:13
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 6 meses
Puntos: 13
Respuesta: do while false

Cita:
Iniciado por leosansan Ver Mensaje
Y ¡¡¡más fuerte¡¡¡ , sin usar ningún bucle. A ver quien supera la complejidad del que viene, je je :
Si la cuestión es sin bucles se reduce a una sola linea

Código C++:
Ver original
  1. bool es_numero( char *s )
  2. {
  3.   return !(strtol(s, &s, 10)) ? false : true;
  4. }

Saludos
  #19 (permalink)  
Antiguo 20/11/2014, 10:07
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por kutcher Ver Mensaje
Si la cuestión es sin bucles se reduce a una sola linea

Código C++:
Ver original
  1. bool es_numero( char *s )
  2. {
  3.   return !(strtol(s, &s, 10)) ? false : true;
  4. }

Saludos


¡¡¡ Buen intento ¡¡¡, pero esta es la salida que obtengo:

Código C++:
Ver original
  1. Introduzca un numero entero: -123*
  2. Numero = -123

A ver si pilláis el "pero" de mi último y matemático código .

¡¡¡Saluditos!!!

  #20 (permalink)  
Antiguo 20/11/2014, 13:23
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: do while false

He creado una función siguiendo la idea de kutcher y comparando con la de leosansan veo los siguientes situaciones:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4.  
  5. int es_numero( char *s )
  6. {
  7.   char *p = s;
  8.   strtol(p, &s, 10);
  9.   return (s - p) == strlen(p);
  10. }
  11.  
  12. int EsNumero ( char *num ) {
  13.     int n = log10 ( abs ( atoi ( num ) ) ) + 1 , Strlen;
  14.     return ( n == ( Strlen = ( num [0] == '-' ||  num [0] == '+')  ? strlen ( num ) - 1 : strlen ( num ) ) ) ? 1 : 0 ;
  15. }
  16.  
  17. int main() {
  18.     char a[] = " +123";
  19.     char b[] = "+123 ";
  20.     char c[] = "+123*";
  21.     printf("%d %d\n", es_numero(a), EsNumero(a));
  22.     printf("%d %d\n", es_numero(b), EsNumero(b));
  23.     printf("%d %d\n", es_numero(c), EsNumero(c));
  24.     return 0;
  25. }
Ante esto me pregunto, ¿hasta que punto un string debe considerarse un entero?

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #21 (permalink)  
Antiguo 20/11/2014, 15:17
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por Pantaláimon Ver Mensaje
Ante esto me pregunto, ¿hasta que punto un string debe considerarse un entero?
Y yo me pregunto, ¿ hasta qué punto, informáticamente hablando, son válidas como números enteros cosas como: " +123", "+123 4", 000123" y similares. Aquí no estamos escribiendo en un papel donde la separación entre los dígitos es indiferente, esto es informática donde un espacio es un caracter y si alguien me escribe "1 2 3", así como los casos mencionados antes, yo no lo acepto como válido y punto.

Es algo así como si tuviese como pin de la tarjeta de crédito "123" y yo intentase introducir " 123" ó "0123" pues nooooooo, no me dejaría.

Me recuerdas la discusión sobre si 500 era primo al tú considerar que sí tomándolo como equivalente a 00500, ¿ recuerdas ?.

Puntos de vista tan solo y eso me recuerda si se acepta "pulpo" como animal de compañía.....nooooooo........... ...pero resulta que, paradojas de la vida, tengo un antiguo alumno de Ciencias del Mar que, tiene, entre otros, un acuario marino y un par de pulpos, entre otros animalitos raritos, y él tiene muy claro que sí, el pulpo es un animal de compañía.

........Puntos de vista tan solo.................

¡¡¡Saluditos!!!



P.D: Y todo con el mejor humor del mundo. Sólo pretendo entretener con "puntos de vista", ¿ vale ?. Y conste que con mi remencionado punto de vista mis códigos validan correctamente.

Última edición por leosansan; 20/11/2014 a las 15:26
  #22 (permalink)  
Antiguo 20/11/2014, 16:15
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 6 meses
Puntos: 13
Respuesta: do while false

El inconveniente con strtol es que salta todos los espacios iniciales para localizar los caracteres +/- si es que existen, debido a esto valida la primera cadena como un numero

Saludos
  #23 (permalink)  
Antiguo 20/11/2014, 17:51
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: do while false

Cita:
Iniciado por leosansan Ver Mensaje
Me recuerdas la discusión sobre si 500 era primo al tú considerar que sí tomándolo como equivalente a 00500, ¿ recuerdas ?.
jajaja, que memoria tienes, pero para que la cosa tenga más lógica creo que el asunto iba de números capicúa o palíndromos, no de primos.

De todos modos yo exponía las dos situaciones y no me he decantado por ninguna. ¿Por qué? pues como bien dices para una contraseña hay que ser estrictos. Pero por otra parte, hay veces que hay que hacer programas en los cuales este sea amable con el usuario y no tocarle las pelotas por qué a puesto un espacio de más al escribir su edad o porque a puesto guioncitos para indicar las fechas en vez de slash(/). Lo que se llama una buena experiencia de usuario. Como aquí estamos jugando a hacer funciones de validación de enteros en base al enunciado más que insuficiente de loCk636, cualquier interpretación me parece válida.

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #24 (permalink)  
Antiguo 21/11/2014, 05:06
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: do while false

Cita:
Iniciado por Pantaláimon Ver Mensaje
jajaja, que memoria tienes, pero para que la cosa tenga más lógica creo que el asunto iba de números capicúa o palíndromos, no de primos.

Un saludo!
Sin duda alguna tengo una neurona en cortocircuito porque ya por entonces confundía primos, es que es un tema que me obsesiona y en el que sigo trabajando, con los capicúa y/o palíndromos.

Un fuerte abrazo Pantaláimon, da gusto verte con este "humor".

¡¡¡Saluditos!!!



EDITO:

Cita:
Iniciado por kutcher Ver Mensaje
El inconveniente con strtol es que salta todos los espacios iniciales para localizar los caracteres +/- si es que existen, debido a esto valida la primera cadena como un numero
Sigue el problema de que acepta como válido -123*.

Aprovecho para corregir el que no admita espacios, tipo "123 4":

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. int EsNumero( char *cadena ) {
  6.     while ( *cadena  == '-' || *cadena  == '+' || isdigit ( *cadena ) && *cadena != 0 ) *cadena++ ;  
  7.     return  ( strlen ( cadena ) != 0 )  ? 0 : 1 ;
  8. }
  9.  
  10. int main ( ) {
  11.   int numero  ;
  12.   char num [20] ;
  13.   do {
  14.     printf ( "\nIntroduzca un numero entero: " ) ;
  15.     scanf ( "%[^\n]" , num ) ;
  16.     while ( getchar ( ) != '\n' ) ;
  17.   }while( !EsNumero( num ) ) ;
  18.   printf ( "\nnumero = %d\n" , atoi ( num ) ) ;
  19.   return 0 ;
  20. }

Última edición por leosansan; 21/11/2014 a las 05:20

Etiquetas: false, int, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:06.