atsInNum()

Iniciado por @synthesize, 5 Junio 2010, 06:16 AM

0 Miembros y 2 Visitantes están viendo este tema.

@synthesize

Empezamos a crear la ats, por fin...

Y bueno, estoy con la 1º función, y por mensajería, discutía amistosamente con nicolas_cof, sobre como implementar la siguiente función:



// STDIO.H

/*
* By: Sergio López & elhacker.net- 5/6/2010
* GNU GPLv3
*
* Function returns an integer
*
* Syntax example: var =atsInNum(1, 6);
* Returns a value between 1 and 6
*/

int atsInNum(int ATSMIN, int ATSMAX)
{
int atsint =0;

do
{
fscanf(stdin, "%d", &atsint);
} while (atsint<=ATSMIN || atsint>=ATSMAX);

return atsint;
}



Varias cosas:

* nicolas_cof opina que el switch con las opciones de texto sobra, pues se sale del objetivo de la función. Yo opino que es un extra a la hora de usarla, ya que te ahorras un par de lineas gracias a ATSOP.

* No me gusta demasiado usar fscanf, así que pensé en usar fgetc y atoi. Espero opiniones al respecto.

Espero que comentéis sobre estos 2 asuntos, y aportéis nuevas ideas, reportéis errores, etc. ^^

http://foro.elhacker.net/programacion_cc/libreria-t294373.0.html

leogtz

Dos sentencias en una se ven horribles.

Y no le veo propósito práctico a la función.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

La verdad es que el propósito de la función esta como a medias. Tengo que preguntar cual es el propósito que intentaste darle a la función, ya que no me queda claro todavía para que la queres utilizar específicamente.

No entiendo la utilidad del tercer parámetro. Primero, estoy de acuerdo con Nicolas_cof, la función debe tener un objetivo primario. Si lo analizas, el código de los mensajes ocupa mas que la función en si, lo cual no tiene mucho sentido.
En cuanto al tercer parámetro, supongo que es la opción "idioma" lo cual me parece bastante innecesario y ademas esta mal codificado debido a estos 2 detalles:

Si el switch no tiene un break, si ingresas un 1 en el tercer parámetro se van a mostrar los dos mensajes.

El segundo detalle esta relacionado con el anterior, el texto carece de formato, por lo tanto se veria algo como:

CitarEnter a valueIntroduce un valor

Lo cual es incorrecto.

Ahora bien, en cuanto al propósito general de la función, he de decirte que no tiene mucho sentido. Vamos a analizarla por partes:


do
{
fscanf(stdin, "%d", &atsint);//Lees un entero
} while (atsint<=ATSMAX && atsint>=ATSMIN);//Mientras sea menor o igual que MAX Y mayor o igual que MIN.

return atsint; //retorno el primer numero que ingrese que NO sea menor o igual que MAX Y mayor o igual que min


Y ahora veamos los comentarios:

* Function returns an integer if it works
*
* Syntax example: var =atsInNum(1, 6, 1);
* Returns a value between 1 and 6, displaying a message


Entenderás que no corresponde una cosa con la otra por lo tanto se torna bastante confuso.

Despacio y con análisis que van a salir cosas buenas, no apurarse.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

@synthesize

#3
Por partes, el propósito de la función, es que esta devuelva un valor entero, introducido por teclado, que esté comprendido entre MIN y MAX, ambos incluidos.

¿Qué utilidad le puedes dar? Es una cosa que uso mcuho en clases, sobretodo para menús estilo switch.

Quedaría mas o menos...



switch(atsInNum(0,10))
{
...
}



Así aseguramos que el valor introducido esté entre 0 y 10.

La parte de los idiomas, ha sido eliminada, ya no causará mas problemas  ::)

Littlehorse

Claro pero vos retornas precisamente lo contrario, porque solo salís del do while cuando ingresas un entero que no esta comprendido entre esos valores.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

@synthesize

Cita de: Littlehorse en  5 Junio 2010, 06:52 AM
Claro pero vos retornas precisamente lo contrario, porque solo salís del do while cuando ingresas un entero que no esta comprendido entre esos valores.

Ya he sustituido && (y) por || (o)

Littlehorse

Y ahora te quedas en un bucle infinito. Podes ingresar números toda la vida que siempre se va a cumplir la condición.


func(0,5)

ingreso 5;

es mayor o igual que 0? si
o
es menor o igual que 5? si

ingreso 20;

es mayor o igual que 0? si
o
es menor o igual que 5? no


De cualquiera de las dos formas el ciclo no termina.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

nicolas_cof

#7
Cita de: Daemon Freedom en  5 Junio 2010, 06:49 AM
Por partes, el propósito de la función, es que esta devuelva un valor entero, introducido por teclado, que esté comprendido entre MIN y MAX, ambos incluidos.

¿Qué utilidad le puedes dar? Es una cosa que uso mcuho en clases, sobretodo para menús estilo switch.

Quedaría mas o menos...



switch(atsInNum(0,10))
{
...
}



Así aseguramos que el valor introducido esté entre 0 y 10.

La parte de los idiomas, ha sido eliminada, ya no causará mas problemas  ::)

Mmmm pero esto no seria trabajo del usuario, y vos simplemente controlarlo de que lo haga bien :P...

No lo veo para definir toda una funcion que haga eso...

Veo redundante esto...

int atsint = 0;

ya que despues le volves a asignar un valor a atsint

Salu10.

@synthesize

Corregido el maldito error de máximos y mínimos. Gracias Littlehorse por hacerme pensar XD  ;-)

Littlehorse

De nada, ten en cuenta que de esa forma no incluís el mínimo ni el máximo como valido. Es decir (1,6) equivale a números entre 2 y 5 incluidos.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.