[Aporte] No superar el máximo permitido por el tipo int. lenguaje C

Iniciado por NOB2014, 23 Agosto 2016, 20:10 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

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. -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>

void valIngInt( void );
void limpiar( void );
int valFinal( char charIngreso[], char charIntMax[] );
void mensaje( int men );

int main( void ){

valIngInt();

return 0;
}

void valIngInt( void ){
int i, ok, cantDigInt, men, numero;
char charIntMax[20], charIngreso[11],aux;

cantDigInt = sprintf(charIntMax, "%d", INT_MAX);

do{
limpiar( );

ok=1, i=0;
printf( "\n Ingrese un numero entero ( mayor a 0 e igual o menor a %d )\n .....:" , INT_MAX);
while ((aux = getchar()) != EOF && aux != '\n'){
if( isdigit(aux) ){
if( i == 0 && aux == '0'){
ok=0;
men = 1;
mensaje( men );
break;
}
charIngreso[i] = aux;
}
else{
ok=0;
men = 2;
mensaje( men );
break;
}
i++;
if( i > cantDigInt ){
ok=0;
men = 3;
mensaje( men );
break;
}
}
charIngreso[i] = '\0';

if( i ==  cantDigInt){
ok = valFinal( charIngreso, charIntMax );
if( ok == 0 ){
men = 4;
mensaje( men );
}
}
}while( !ok );
numero = atoi(charIngreso);
printf( "\n Ingreso.....: %d", numero );
}

void limpiar( void ){
system("cls||clear");
}

int valFinal( char charIngreso[], char charIntMax[] ){
size_t i = 0, ok=1;

while( charIngreso[i] != '\0' ){
if(charIngreso[i] > charIntMax[i]){
ok = 0;
break;
}else if( charIngreso[i] < charIntMax[i] ){
break;
}
i++;
}

return ok;
}

void mensaje( int men ){
int ch;

if( men == 1 || men == 2 || men == 3 ){
while ((ch = getchar()) != EOF && ch != '\n');
}

if( men == 1 ){
printf( "\n El ingreso es incorrecto, el primer digito no puede ser cero\n\n\t");
}else if( men == 2 ){
printf( "\n El ingreso es incorrecto, debe ingresar solo digitos del 0 al 9 \n\n\t" );
}
else if( men == 3 ){
printf( "\n El ingreso es incorrecto, supera el maximo permitido ==> %d \n\n\t" , INT_MAX );
}
else{
printf( "\n El ingreso es incorrecto, supera el maximo permitido ==> %d \n\n\t" , INT_MAX );
}

printf( "Pulse una tecla para intentarlo nuevamente..." ); getchar();
}


Un gran saludo para todos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

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. -

#include <stdio.h>
#include <ctype.h>
#include <limits.h>

int main(void){
int numero = 0, c;

printf("\n\n Ingrese una numero entero (maximo permitido %u)....:", INT_MAX);

while((c = getchar()) != '\n' && c != '\r'){
if(isdigit(c)){
if( INT_MAX-numero*10 >= c-'0' ){
numero = (numero*10) + (c-'0');
}
else{
printf( "\n El numero ingresado supera el maximo permitido..." );
numero = 0;
break;
}
}
else{
printf( "\n Ingreso invalido..." );
numero = 0;
break;
}
}

printf("\n Ingreso.............:%d", numero);
return 0;
}


Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-