C/Visual C - ENTRADA/SALIDA STANDARD DE DATOS EN C

 
Vista:
sin imagen de perfil

ENTRADA/SALIDA STANDARD DE DATOS EN C

Publicado por alfredo (4 intervenciones) el 17/03/2014 17:36:36
Hola,

he implementado un programa que recibe datos de teclado (numeros reales con signo) y los almaceno en un array, hasta aqui todo perfecto.

el problema surge por que quiero ser mas preciso y me gustaria descartar caracteres (A-Z,a-z y otros simbolos que no sean exclisivamente numeros (0-9), de tal manera que si se itroducen estos caracteres no validos , pues se vuelva a pedir por pantalla que se introduzcan de nuevo valores validos.

He intentado usar: _getch(), _getche(), etc pero no me parece la mejor manera de resolver este problema.

Ademas, al ser numeros reales, estos deben contener no mas de tres digitos enteros y como mucho cuatro decimales.

Aquie posteo el codigo y si tienen alguna sugerencia, estaria mas que agradecido.

Muchas Gracias.

float cadena[];

printf("Introduzca coordenada X \n");

scanf("%f",cadena[0]);

fflush(stdin);

printf("Introduzca coordenada Y \n");

scanf("%f",cadena[1]);

fflush(stdin);

.......
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ENTRADA/SALIDA STANDARD DE DATOS EN C

Publicado por Chema (234 intervenciones) el 19/03/2014 16:15:44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define MAX_NUM_DEC 4
#define MAX_NUM_REAL 3
#define DEC_POINT 1
 
int CheckNumber(char* n){
	int nunberlen = 0;
	int decpoint = 0;
	int declen =-1;
 
	if(*n == '-' || *n == '+')
		n++;
 
	for(; *n;n++){
		if(*n== '.')
			decpoint++;
		if(decpoint){
			declen++;
		}else
			nunberlen++;
 
		if( ((*n < '0' || *n > '9' ) && nunberlen >MAX_NUM_REAL ) ||
			( decpoint >DEC_POINT || declen >MAX_NUM_DEC ) )
			return 0;
 
	}
	printf("  numero entero %d parte decimal %d\n",nunberlen,declen);
	return 1;
}
 
int main(void) {
	char n[] = "999.9999";
	int e;
	e = CheckNumber(n);
	if(!e)
		printf("error");
 
	return 0;
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENTRADA/SALIDA STANDARD DE DATOS EN C

Publicado por Chema (234 intervenciones) el 19/03/2014 19:24:12
Otra manera más refinada:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define MAX_NUM_DEC 4
#define MAX_NUM_REAL 3
#define MAX_DEC_POINT 1
#define DEC_POINT '.'
 
int CheckNumber(char* n){
	int nunberlen = 0;
	int decpoint = 0;
	int declen = 0;
 
	if(*n == '-' || *n == '+')
		n++;
 
	for(; *n; n++){
 
		if( *n == DEC_POINT )
			decpoint++ ;
		else if(decpoint)
			declen++;
		else
			nunberlen++;
 
		if( ( (*n < '0' ||*n > '9' ) && (*n != DEC_POINT )) ||
			 (declen >MAX_NUM_DEC) ||
			 ( decpoint > MAX_DEC_POINT) ||
			 (nunberlen > MAX_NUM_REAL) )
		return 0;
 
	}
 
	/* Caso numero real con separador decimal sin decimales "111."*/
	if (decpoint && declen==0)
		return 0;
 
	printf("  numero entero %d parte decimal %d\n",nunberlen,declen);
	return 1;
}
 
int main(void) {
	char n[] = "+111.99";
	int e;
	e = CheckNumber(n);
	if(!e)
		printf("error");
 
	return 0;
	}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENTRADA/SALIDA STANDARD DE DATOS EN C

Publicado por Chema (234 intervenciones) el 19/03/2014 21:32:58
Otra forma, de hacerlo. Indica al usuario todos los errores de una sola vez, para usuarios manazas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#define ER_0 (1 << 0)
#define ER_1 (1 << 1)
#define ER_2 (1 << 2)
#define ER_3 (1 << 3)
#define MAX_NUM_DEC 4
#define MAX_NUM_REAL 3
#define MAX_DEC_POINT 1
#define DEC_POINT '.'
 
int CheckNumber(char* n){
	int nunberlen = 0;
	int decpoint = 0;
	int declen = 0;
	int er = 0;
	if(*n == '-' || *n == '+')
		n++;
 
	for(; *n; n++){
 
		if( *n == DEC_POINT ) {
			decpoint++;
			continue;
		}
		if (*n >= '0' && *n <= '9' ) {
			if(decpoint > 0)
				declen++;
			else
			nunberlen++;
		} else {
			er |= ER_0;
			 //~ break;
		}
	}
 
	if(decpoint > MAX_DEC_POINT ) er |= ER_1;
	if(nunberlen > MAX_NUM_REAL ) er |= ER_2;
	if(declen > MAX_NUM_DEC ) er |= ER_3;
 
	printf("%d  %d  \n",nunberlen,declen);
 
	return er;
}
 
void Err(int e) {
	if(e == 0)
		printf("Numero correcto\n");
	else {
		printf("Se han detectado los siguientes errores.\n*************\n");
		if( e & ER_0)
			printf("Caracter no permitido \n");
		if( e & ER_1)
			printf("Mas de un separador decimal \n");
		 if( e & ER_2)
			printf("Numero real mayor del tamaño permitido \n");
		 if( e & ER_3)
			printf("Numero de decimales excesivo \n");
			printf("*******************\n");
		}
}
 
int main(void) {
	char n[] = "19999999999.900999p999.0";
	char x[] = "-111.111";
	int e;
	e = CheckNumber(n);
	Err(e);
 
	e = CheckNumber(x);
	Err(e);
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENTRADA/SALIDA STANDARD DE DATOS EN C

Publicado por Alfredo (4 intervenciones) el 22/03/2014 16:41:24
Muy buenas Chema,

te tuteo si me lo permites por que has sido de grandisima ayuda y por tanto agradecerte enormemente las molestiasquete haya podido causar.

Por otro lado decirte que de los codigos que has escrito, funcionan bastante bien, pero porsi te interesa, en el primer codigo he tenido que añadir un poquito decodigo,basicamente una linea ya que necesitaba quese restringieran letras (por s ia algun iluminado le apeteciera introducirla spensando que osn numeros,ya me entendes), por lo tanto en tuprimer programa siy ointroducia un numero digamos : 25.AB entonces melodaba por valido asi como cualquiercombinacion con letras, porlotant odecidi hecharle un ojo a tucodigo y si escribes la linea

if( ((*n < '0' || *n > '9' ) && nunberlen >MAX_NUM_REAL ) || ( decpoint >DEC_POINT || declen >MAX_NUM_DEC ) )añadiendo ((*n>= 'a' || *n>= 'A')) &&((*n<='z' || *n<='Z')) consigues filtrar las letras tb.

De todas formas milgracias por tu ayuda

seguimos en contacto

un cordial saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ENTRADA/SALIDA STANDARD DE DATOS EN C

Publicado por Chema (234 intervenciones) el 22/03/2014 20:57:09
Gracias por la corrección, me olvide filtrar las mayúsculas, ¿Acentos?

Lo más efectivo para filtrar acentos mayúsculas etc... es crear una "loop table", pero el ejemplo hubiese sido demasiado
rebuscado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar