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
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.-
No entiendo muy bien el fundamento de tu programa... Así que por el momento no puedo o no sé como ayudarte.

Saludos.
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
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
Imagen
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.-
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
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
Imagen
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.-
Si defines totalmente las especificaciones de lo que quieres realizar y no sólo una parte, va a ser mucho más fácil ayudarte.

Saludos!
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
Imagen
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.-
Enhorabuena por el progreso Daniel.

La función atoi también trabaja con punteros. Su sintaxis es la siguiente:

Código: Seleccionar todo

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

Volver a “C/C++”