• Pasar de cadena(char) a entero(int) sin sobrepasar el máximo

 #433888  por Pino1952
 06 Ene 2014, 21:56
Hola gente.-
Les dejo un pequeño programa que luego voy a seguir completando, lo que quiero saber es si se puede antes de convertir la cadena a entero verificar si el número ingresado sobrepasa el máximo permitido por el tipo int.-
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
 
int main(){
	char numero[10] = "";
	int ok=0, i=0;
	
	do{
		system("CLS");
		ok=0;
		printf("\n Introduce el numero que deseas convertir a binario\n maximo [%d]...:", INT_MAX);
		fgets(numero, 10, stdin);
		numero[strlen(numero)-1]='\0';
		
		for(i=0;numero[i] != '\0'; i++){
			if(numero[i] <=47 || numero[i] >=58){
				ok=1;
				printf("\n Solo debe ingresar numeros, Pulse una tecla para intentarlo nuevamente..."); getchar();
			}
		}
	}while(ok == 1);
	
	printf("\n %s", numero);
	return 0;
}
Bueno es todo.-
Saludos.
Daniel
 #433943  por sanko
 07 Ene 2014, 16:49
Yo tampoco acabe de pillarte, pero para pasar un str a int debes usar la función atoi(str); y para validar que no supera el limite puesto como máximo solo habría que hacer una condición tras convertirlo
 #433961  por Pino1952
 07 Ene 2014, 20:20
Hola amigos.
Gracias ya tengo la teoria y ya lo estoy llevando a la práctica.-

Si el número tiene más de 10 cifras, entonces no cabe.
Si el número tiene menos de 10 cifras, entonces cabe.
Si el número tiene 10 cifras y es mayor a 2.147.483.648 no cabe.

El caso es verificar antes de pasar de cadena a int que lo ingresado quepa.-

Saludos.
Daniel
 #433962  por OK3NETu
 07 Ene 2014, 20:29
Pino1952 escribió:Hola amigos.
Gracias ya tengo la teoria y ya lo estoy llevando a la práctica.-

Si el número tiene más de 10 cifras, entonces no cabe.
Si el número tiene menos de 10 cifras, entonces cabe.
Si el número tiene 10 cifras y es mayor a 2.147.483.648 no cabe.

El caso es verificar antes de pasar de cadena a int que lo ingresado quepa.-

Saludos.
Daniel
Va a ser un poco enrevesado y te vas a pegar con la restricción "Si el número tiene 10 cifras y es mayor a 2.147.483.648 no cabe." sin pasarlo a entero primero.
MiniPista: Aunque si es con char serán cláuslas If anidadas. (Yo lo haría así) Como siempre hay más de una solución.

Ánimo y Saludos NOB2014.

P.D: Te dejé una posible solución del ejercicio de minúsculas a mayúsculas en binario. Échale un ojo
 #433972  por Pino1952
 07 Ene 2014, 22:05
Hola.
Seguramente van a ser muchas validaciones, luego de presentar el programa en crudo me ayudaras a refinarlo, la lógica la tengo, la sintaxis espero de tú ayuda.-
Necesito que me des una mano para leer cadena, cual es la función más segura, tengo mucho leído pero no encuentro una verdadera definición, limpiar el buffer de teclado y como cambiar ‘\n’ x ‘\0’.-
Gracias por el código en el otro post (todavía no lo leí detenidamente) lo que pasa es que no puedo con mi genio debería terminar lo de minúscula a mayúscula y luego investigar sobre esto, pero bueno así soy yo.-

Saludos
Daniel
 #434069  por Pino1952
 09 Ene 2014, 00:56
Hola.
Espero que ahora se entienda mejor lo que quería lograr.-
En cuanto a la función charAint se que existe atoi pero en este caso es para practicar con punteros y funciones.-
Espero sugerencias para optimizarlo.-
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

void charAint(const char[], int* ,int);
void intAbinario(int, int*);


int main(){
	char numeroChar[11] = "";
	unsigned int ok=0, i=0, longitud=0, numero, *ptrNumero = &numero;

	
	do{
		system("CLS");
		ok=0;
		printf("\n Introduce el numero que deseas convertir a binario\n maximo [%d]...:", INT_MAX);
		fflush(stdout);
		fgets(numeroChar, 12, stdin);
		longitud = strlen(numeroChar);
		numeroChar[longitud-1] = '\0';
		if(numeroChar[0] == '\0' || numeroChar[0] == '0'){
			ok=1;
			printf("\n El numero ingresado debe ser mayor a cero\n\n Pulse una tecla para intentarlo nuevamente..."); getchar();
		}	
		else{
			for(i=0;numeroChar[i] != '\0'; i++){
				if(numeroChar[i] <=47 || numeroChar[i] >=58){
					ok=1;
					printf("\n Debe ingresar solo numeros\n\n Pulse una tecla para intentarlo nuevamente..."); getchar();
					break;
				}
			}
			if(ok==0){
				i=0;
				if(longitud-1 == 10 && numeroChar[0] >= 2){
					i=1;
				}
				else{
					charAint(numeroChar, ptrNumero, longitud);
					if(*ptrNumero > INT_MAX){
						i=1;
					}
				}	
				if(i == 1){	
					ok=1;
					*ptrNumero = 0;
					printf("\n El numero ingresado supero el maximo permitido\n\n Pulse una tecla para intentarlo nuevamente..."); getchar();
				}
			}
		}
	}while(ok == 1);
	
	intAbinario(numero, ptrNumero);
	
	return 0;
}

void charAint(const char numeroChar[], int *ptrNumero, int longitud){
	unsigned auxiliar=0, i=0; 

	while(i < longitud-1){
		auxiliar = numeroChar[i]-48;
		*ptrNumero=10* *ptrNumero+auxiliar;
 		i++;
	}
}

void intAbinario(int numero, int *ptrNumero){
	char binario[33] = "";
	unsigned int i=0, j=0, k=0, temp=0;
	do{
		binario[i] = '0' + numero%2;
		numero = numero/2;
		i++;
	}while (numero != 0);

	binario[i] = '\0';

	for (j = 0, k = strlen(binario)-1; j < k; j++, k--){
		temp = binario[j];
		binario[j] = binario[k];
		binario[k] = temp;
	}
	printf("\n\n En decimal %u --> en binario = %s\n\n", *ptrNumero, binario);
}
OK3NETu, estoy muy entusiasmado con este programa me dio mucha seguridad.-

Saludos.
NOB2014 perdón Daniel
 #434100  por OK3NETu
 09 Ene 2014, 12:17
Enhorabuena por el progreso Daniel.

La función atoi también trabaja con punteros. Su sintaxis es la siguiente:
Código: [ Debe registrarse para ver este enlace ]
int atoi(const char *nptr);
Así que también podrías trabajar con ella ya que viene incluida en la librería stdlib.h

También creo que el programa tiene un comportamiento anómalo, ya que si introduces un valor superior al permitido por el tipo de dato int, muestra el mensaje de que no supera el límite, luego desaparece el mensaje, y luego pasa a binario un int perteneciente a ese número. Esto yo creo que no debiera de ser así. Es más conveniente que te de el mensaje, y ni si quiera realice la conversión a binario.

Yo corregiría esto porque es bastante evidente que su funcionamiento no es el adecuado.

Saludos.
 #435243  por Pino1952
 24 Ene 2014, 23:57
Hola a todos.
Bueno si bien no es el mismo programa la esencia es la misma, para mi funciona, seguramente me darán alguna idea para optimizarlo.-
#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
#include <ctype.h>

#define MAX_PALABRAS 4
#define MAX_CARACTERES 12

void ingresoLongitud(int*);
void ingresoPalabras(int*);

int main(void){
	int longitud=0, *ptrLongitud = &longitud;  

	printf("\n\n ----- Programa que ordena las palabras ingresadas -----");

	ingresoLongitud(ptrLongitud);
	ingresoPalabras(ptrLongitud);
	
	
	return 0;
}

void ingresoLongitud(int *largo){
	unsigned int ok=0, ch=0, tIngreso=0, i=0;
	char buffer[MAX_PALABRAS]={'\0'}, *p=NULL;
	do{
		printf("\n Cuantas palabras desea ingresar (minimo 2 maximo 15)....: ");
		fgets(buffer, MAX_PALABRAS, stdin);
		if((p=strchr(buffer, '\n'))){
			*p='\0';
			tIngreso = strlen(buffer);
			for(i=0; i<tIngreso; i++){
				if(buffer[i] >= 48 && buffer[i] <= 57){
					ok=1;	
				}
				else{
					ok=0;	
					break;
				}
			}
		}
		else{
			while ((ch=getchar())!='\n' && ch!=EOF);
		}
        if(ok==1){
			*largo=atoi(buffer); 
			if(*largo <= 1 || *largo>=16){
				ok=0;
			} 
		}
		if(ok==0){
			printf("\n Error, verifique...\n");
		}
	}while(!ok);
}

void ingresoPalabras(int *ptrLongitud){
	char palabras[*ptrLongitud], *p=NULL;
	int i=0, j=0, ch=0, tIngreso=0;

	printf("\n\n ----- Debe ingresar un maximo de %d palabras para ordenar -----\n", *ptrLongitud);
	
	for(i=0; i<*ptrLongitud; i++){
		printf("\n Ingrese palabra [%d] maximo %d caracteres....: ", i+1, MAX_CARACTERES-2);
		fgets(palabras, MAX_CARACTERES, stdin);
		if((p=strchr(palabras, '\n'))){
			*p='\0';
			tIngreso = strlen(palabras);		
			for(j=0; j<tIngreso; j++){
				if(!isalpha(palabras[j])){
					printf(" \n Ingrese solo letras...\n");
					i--;break;
				}
			}
		}
		else{
			while ((ch=getchar())!='\n' && ch!=EOF);
			printf(" \n Maximo permitido %d caracteres...\n", MAX_CARACTERES-2);
			i--;
		}
	}
}
Luego hare el resto del programa para ordenar, lo que pasa es que el sistema es de mi autoría (por lo menos no lo vi en ninguno de los creados) y lo tengo que refinar.-

Saludos.
Daniel