Determinar rango de valores al que pertenece un número...

Edu
14 de Septiembre del 2004
Buenas, a ver, quisiera hacer un select case que me dedujera a que rango pertenece un número concreto, por ejemplo:

Select case Numero_Seleccionado
case is = 'valor esta entre 1 y 9
Console.Write="Número seleccionado menor de 10"
case is= 'valor está entre 9 y 19
Console.Write="Número seleccionado menor de 20"
case is= 'valor está entre 19 y 29
Console.Write="Número seleccionado menor de 30"
Etc...


Pues no se me ha ocurrido ningún operador que me haga esta función directamente. Evidentemente al final lo he resuelto haciendo uso de unos If... then, Elseif... then, tal cómo sigue:

If Numero_Seleccionado <= 9 Then
Console.Write="Número seleccionado menor de 10"
ElseIf Numero_Seleccionado > 9 And Numero_Seleccionado <= 19 Then
Console.Write="Número seleccionado menor de 20"
ElseIf Numero_Seleccionado > 19 And Numero_Seleccionado <= 29 Then
Console.Write="Número seleccionado menor de 30"
Etc...
End IF

Me ha funcionado a la perfección, pero claro, quiero exigirme cada vez el hacer código más eficiente y me gustaría alguna solución más "elegante"... si es que existe, claro.

Muchisimas gracias de antemano.

forastero
14 de Septiembre del 2004
Hola.
No conozco Visual Basic oni C#, solo Visual C++, pero voy a mojarme un poco.
Siento deciros que ese código es muy ineficiente (por lo menos para mí que optimizo en numerosas ocasiones a nivel de bits), muchos if anidados es muy ineficiente. Una posible solución para saber Si quieres saber si el número está entre 0-9, 10-19, 20-29, etc, a primera vista se me ocurre que dividas un número entre diez y te quedes con el resultado sumándole 1 (si no es entero redondealo hacia abajo y quedate con el número sin los decimales), de esta manera (perdona si no se entiende mucho, pero no conozco Basic):
entero NumeroEntero;
NumeroEntero = Numero_Selecionado / 10;
NumeroEntero = int(NumeroEntero) + 1; // Quedarse solo con la parte entera.
Console.Write="Numero seleccionado menor que" + 10*NumeroEntero

La última sentencia no se como se hace en Basic, en C++ sería;
CString strTexto;
strTexto.Format(Numero seleccionado menor que %d", 10 * NumeroEntero);

Y para comprimirlo aún más se podría hacer, (en Visual C++):
int NumeroEntero; // define un entero
CString strTexto; // para cadena de carácteres
strTexto.Format(Numero seleccionado menor que %d", 10 * (int(Numero_Selecionado / 10) + 1));

Espero que al menos se entienda, porque suponte que Numero_Seleccionado vale 1 millón (o más), se perdería demasiado tiempo, y de esta manera te vale para cualquier tipo de número (siempre entre los límites del propio entero).

Un saludo.

kaz
14 de Septiembre del 2004
yo lo veo correctisimo haciendolo como lo has echo

Edu
14 de Septiembre del 2004
Ja, ja, ja... muchas gracias. Bueno, pues la dejo tal que así.

El caso es que contra más aprendo de ".NET" más me excita la capacidad de "abstracción" a la que puedo llegar a la hora de aplicar soluciones para casos concretos... y claro, uno se va animando y no para de darle al coco hasta pillar soluciónes más "puras" y "sublimes"... (si, a veces he llegado a estados de pseudoéxtasis visualizando estructuras complejas de información reducidas a su mínima expresión)

Gracias de todos modos, e intentaré tomármelo más terrenalmente...