Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 23 Agosto 2016, 20:10 pm



Título: [Aporte] No superar el máximo permitido por el tipo int. lenguaje C
Publicado por: NOB2014 en 23 Agosto 2016, 20:10 pm
Hola, dejo mi humilde aporte al foro con un tema que tiene que ver con esto. -http://foro.elhacker.net/programacion_cc/dudas_con_cola_e_intmax_lenguaje_c-t456602.0.html
Lo que valido en el programa son 4 casos que detallo a continuación y que considero que no debería fallar. -
1 - Que el ingreso no sea cero ni que el primer dígito sea cero. -
2 - Que se ingresen solo dígitos. -
3 - Que no se supere el máximo permitido de dígitos, en mi pc el máximo permitido por el int es
     2147483647 o sea 10 dígitos, si por ej. se ingresaran 11 o más se activaría el mensaje de error. -
4 - Por último si el ingreso es exactamente 10 dígitos, verifico dígito a dígito, si es menor por más
     que el resto sean todos nueves el ingreso es correcto, si por el contrario es mayor por más que el
     resto sean todos ceros el ingreso es incorrecto y si es igual continuo con el siguiente. -
Por último, espero 2 cosas, la primera que me den sugerencia para poder mejorarlo y la segunda es que me gustaría ver la versión de algunos de los expertos del foro, no para competir ya que no puedo todavía darme ese lujo, sino simplemente para que nos beneficiemos los que estamos estudiando el lenguaje. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <limits.h>
  5. #include <ctype.h>
  6.  
  7. void valIngInt( void );
  8. void limpiar( void );
  9. int valFinal( char charIngreso[], char charIntMax[] );
  10. void mensaje( int men );
  11.  
  12. int main( void ){
  13.  
  14. valIngInt();
  15.  
  16. return 0;
  17. }
  18.  
  19. void valIngInt( void ){
  20. int i, ok, cantDigInt, men, numero;
  21. char charIntMax[20], charIngreso[11],aux;
  22.  
  23. cantDigInt = sprintf(charIntMax, "%d", INT_MAX);
  24.  
  25. do{
  26. limpiar( );
  27.  
  28. ok=1, i=0;
  29. printf( "\n Ingrese un numero entero ( mayor a 0 e igual o menor a %d )\n .....:" , INT_MAX);
  30. while ((aux = getchar()) != EOF && aux != '\n'){
  31. if( isdigit(aux) ){
  32. if( i == 0 && aux == '0'){
  33. ok=0;
  34. men = 1;
  35. mensaje( men );
  36. break;
  37. }
  38. charIngreso[i] = aux;
  39. }
  40. else{
  41. ok=0;
  42. men = 2;
  43. mensaje( men );
  44. break;
  45. }
  46. i++;
  47. if( i > cantDigInt ){
  48. ok=0;
  49. men = 3;
  50. mensaje( men );
  51. break;
  52. }
  53. }
  54. charIngreso[i] = '\0';
  55.  
  56. if( i ==  cantDigInt){
  57. ok = valFinal( charIngreso, charIntMax );
  58. if( ok == 0 ){
  59. men = 4;
  60. mensaje( men );
  61. }
  62. }
  63. }while( !ok );
  64. numero = atoi(charIngreso);
  65. printf( "\n Ingreso.....: %d", numero );
  66. }
  67.  
  68. void limpiar( void ){
  69. system("cls||clear");
  70. }
  71.  
  72. int valFinal( char charIngreso[], char charIntMax[] ){
  73. size_t i = 0, ok=1;
  74.  
  75. while( charIngreso[i] != '\0' ){
  76. if(charIngreso[i] > charIntMax[i]){
  77. ok = 0;
  78. break;
  79. }else if( charIngreso[i] < charIntMax[i] ){
  80. break;
  81. }
  82. i++;
  83. }
  84.  
  85. return ok;
  86. }
  87.  
  88. void mensaje( int men ){
  89. int ch;
  90.  
  91. if( men == 1 || men == 2 || men == 3 ){
  92. while ((ch = getchar()) != EOF && ch != '\n');
  93. }
  94.  
  95. if( men == 1 ){
  96. printf( "\n El ingreso es incorrecto, el primer digito no puede ser cero\n\n\t");
  97. }else if( men == 2 ){
  98. printf( "\n El ingreso es incorrecto, debe ingresar solo digitos del 0 al 9 \n\n\t" );
  99. }
  100. else if( men == 3 ){
  101. printf( "\n El ingreso es incorrecto, supera el maximo permitido ==> %d \n\n\t" , INT_MAX );
  102. }
  103. else{
  104. printf( "\n El ingreso es incorrecto, supera el maximo permitido ==> %d \n\n\t" , INT_MAX );
  105. }
  106.  
  107. printf( "Pulse una tecla para intentarlo nuevamente..." ); getchar();
  108. }

Un gran saludo para todos.


Título: Re: [Aporte] No superar el máximo permitido por el tipo int. lenguaje C
Publicado por: NOB2014 en 24 Agosto 2016, 02:21 am
Hola.
Les dejo otro código que parece funcionar a la perfección, no me pregunten quien lo escribió porque apareció en mi disco rígido y no recuerdo de donde lo saque. -
Trate de encontrarle la lógica pero todavía no lo logro, lo único que me digo si este programa funciona sin fallas,  lo mio da vergüenza. -

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <limits.h>
  4.  
  5. int main(void){
  6. int numero = 0, c;
  7.  
  8. printf("\n\n Ingrese una numero entero (maximo permitido %u)....:", INT_MAX);
  9.  
  10. while((c = getchar()) != '\n' && c != '\r'){
  11. if(isdigit(c)){
  12. if( INT_MAX-numero*10 >= c-'0' ){
  13. numero = (numero*10) + (c-'0');
  14. }
  15. else{
  16. printf( "\n El numero ingresado supera el maximo permitido..." );
  17. numero = 0;
  18. break;
  19. }
  20. }
  21. else{
  22. printf( "\n Ingreso invalido..." );
  23. numero = 0;
  24. break;
  25. }
  26. }
  27.  
  28. printf("\n Ingreso.............:%d", numero);
  29. return 0;
  30. }

Saludos.