|
Curso básico
de programación en Visual Basic
Lección
9
Números
aleatorios
|
Realizamos
programas para la gestión de empresas. Empresas medianas y
pequeñas. Programas de contabilidad, cartera de pedidos
clientes proveedores, facturación control de albaranes,
tesorería cartera de cobros y pagos y estadísticas.
Nuestro
agradecimiento a todos los que por unas causas o por otras
visitan nuestra web. Gestión de empresas PYMES. Curso de
programación de Visual Basic.
|
Hola, ya ves que no
puedo dedicarle todo el tiempo que yo quisiera a esto del curso
básico. Pero lo importante es que éste siga "pa lante"
aunque haya un poco de lapso de tiempo entre cada una de las
entregas... No voy a prometerte que voy a ser más aplicado y no
tardar tanto entre cada entrega porque a lo mejor no cumplo y
después me echas la bronca...
De todas formas
intentaré hacer un pequeño esfuerzo... y con la ayuda y
compresión de todos vosotros espero conseguirlo... ¿cómo? pues
muy fácil, me gustaría que las consultas que recibo no tuviera que
contestarlas todas... es que son muchas, sobre todo se me acumulan
los jueves y viernes, ya que esos días los dedico por completo a la
maquetación de un periódico semanal de información local que
editamos en nuestra empresa... y no sólo la maquetación sino que
me tengo que encargar de llevar y recoger la filmación y hay que
hacerlo fuera de Nerja, por lo que, a la "paliza" de la
autoedición, hay que añadirle la paliza del viaje de ida/espera
(algunas veces larga)/vuelta.
Después de la
presentación y el "comecoco", vamos con las soluciones de
los ejercicios.
Solución a
los ejercicios de la Octava entrega
El primero:
'Poner este código en el Form_Load
Dim Hora(24) As Integer
Dim i As Integer, Mayor As Integer
'Llenar el array con números...
'(en esta entrega veremos cómo hacerlo de forma aleatoria)
'...
'Comprobar cual es el mayor
For i = 1 To 24
If Hora(i) > Mayor Then
Mayor = Hora(i)
End If
Next
Print "El número mayor es:"; Mayor
Un poco de
explicación, ya que no creo que sea suficiente con enseñar la
solución.
El problema que te has podido encontrar es, seguramente, la forma de
asignar valores al array, aunque siempre queda el recurso de poder
"llenarlo manualmente"; pero eso lo veremos en esta misma
entrega.
La cuestión es comparar el contenido de cada una de las horas con
la variable que guardará el número mayor. Al principio esta
variable, como ya deberías saber, tiene el valor CERO, así que
cuando se haga la comparación If Hora(i)>Mayor Then, si la
variable que está en la posición "i" del array
"Hora" tiene un valor mayor que cero, se cumplirá la
condición y se pasará a asignar ese valor a la variable que
contendrá el número mayor de los 24 que tenemos en el array.
El bucle continúa y cada vez que se cumpla la condición de que el
contenido de Hora(i) es mayor que el que tenemos en la variable
Mayor, se asignará este y así hasta que se termine de dar
vueltas...
Si no te has enterado... prepárate para la solución del segundo
ejercicio.
El segundo:
'Los mismos comentarios iniciales que el primero
Dim Hora(24) As Integer
Dim i As Integer, Menor As Integer
'
For i = 1 To 24
If Hora(i) Then 'Sólo si no vale cero
If Menor = 0 Then 'Si aún no tiene un valor
Menor = Hora(i) 'se lo asignamos
Else
If Hora(i) < Menor Then 'Si el contenido de Hora(i) es menor
Menor = Hora(i) 'lo asignamos como menor
End If
End If
End If
Next
Print "El número menor es "; Menor
Este está más o
menos explicado en los comentarios, pero voy a dejártelo un poco
más claro:
La cuestión consiste en comprobar primero si el contenido del
elemento "i" del array "Hora" tiene un valor
distinto de cero, (si vale cero no lo tendremos en cuenta), lo
siguiente que se hace es comprobar si el contenido de
"Menor" vale cero, si es así, quiere decir que aún no le
hemos asignado ningún valor, por tanto le asignamos lo que tenga
Hora(i). En posteriores comprobaciones lo que se hace es averiguar
si el valor guardado en el elemento del array es menor que el que
tenemos en nuestra variable "Menor" y si es así, quiere
decir que tenemos un número más pequeño, por tanto lo asignamos
para que siempre "Menor" tenga el número menor (valga la
redundancia).
Pero y si quisiéramos tener en cuenta también el CERO... Pues que
tendríamos que hacerlo de otra forma, ya que esta es sólo para el
caso expuesto... te dejo que lo pienses, pero no es demasiado
difícil, incluso más simple que esta solución, lo que ocurre es
que entran en juego pequeños detalles que seguramente veremos en
esta entrega...
Ahora vamos
a empezar la Novena Entrega.
No voy a empezar, o
mejor dicho, no voy a continuar con los arrays, pero no te preocupes
que sólo será un pequeño alto en el camino, lo que veremos
primero es algo que nos va a facilitar hacer pruebas con los
arrays... se trata... (redoble de tambores) de:
Números
Aleatorios
En algunos casos
vamos a necesitar generar números aleatorios, (números sacados al
azar, al menos en teoría...), y si no necesitas usar números
aleatorios, vamos a usarlos en algunos de los ejercicios, así que
voy a explicar cómo va esto:
La función que se usa para generar números aleatorios es: RND
Esta función devuelve un número que será mayor o igual a CERO y
menor que UNO. Creo que se representa así: 0<RND<1, pero si
no es así, da igual o algún "experto" me lo dirá. Lo
que interesa saber es que nunca llegará a valer uno y que puede ser
igual a cero.
Si hacemos esto: x = Rnd * 6 El valor X nunca llegará a 6, en la
mayoría de los casos se suelen quitar los decimales usando INT, en
este caso, haciendo x = Int(Rnd * 6), x podrá valer 0, 1, 2, 3, 4
ó 5 y si hacemos esto otro: x = Int(Rnd * 6) + 1. Los valores
serán de 1 a 6.
Si queremos valores del 65 al 90 la expresión sería esta: x =
Int(Rnd * 26) + 65. Ya que Int(Rnd * 26) producirá un número que
estará entre el 0 y el 25 (ambos inclusives), al sumarle 65... pues
eso, estará en el rango deseado.
Este ejemplo nos sirve para cuando necesitemos obtener un código
ASCII de una letra de la A a la Z, (en mayúsculas), ya que los
códigos ASCII de las letras son: A=65, B=66... Z=90 en caso de que
sean mayúsculas, para obtener los valores en minúsculas sólo hay
que añadirle 32 y ya los tendremos porque a=97, b=98... z=122.
En estos rangos se excluye la eñe, tanto mayúsculas como
minúsculas y las vocales acentuadas... es que los señores que
crearon esta norma (American Standard Code for Interchange
Information, o algo parecido y se suele pronunciar ASKI), eran
de los USA y allí no usan esas letras... recuerdo mis tiempos de
comics, cuando Alex Niño se llamaba Alex
Nino, al menos en los créditos de los comics USA...
El problema de los números aleatorios, es que no son tan
aleatorios, es decir cada vez que se inicia el programa produce el
mismo número, (al menos en los basics anteriores, he leído que
ahora el VB4 no genera la misma secuencia cada vez que se inicia el
programa, eso lo veremos después), vamos a ver un ejemplo para que
lo compruebes, esto lo he comprobado con el VB2 (que es el que tengo
en el portátil que me he llevado a casa para escribir las entregas,
hasta que mi jefe me lo pida... que será en pocos días, puede
ser), se supone que en los demás funcionará igual, pero como te
digo para el VB4 hay un "truco" que veremos después...
cuando lo compruebe, je.
Escribe esto en el Form_Load del nuevo proyecto que habrás tenido
que crear para probar... si no lo has hecho, ya tardas...
Private Sub Form_Load
Show 'Aquí debe estar esto, sino no se verá nada... ¿recuerdas?
Print Rnd * 25
End Sub
A mí me ha
mostrado 17.63869, ejecútalo varias veces y verás que siempre
muestra el mismo número... Existe una forma de solucionar esta
falta de "aleatoriedad" y es cambiando la
"semilla" que se usa como base para la imPLANTAción de
números aleatorios, para ello se usa Randomize seguido de un
número, pero si el número es el mismo... no conseguimos nada...
Prueba poniendo Randomize 5 después del Show y antes del Print,
prueba a ejecutarlo varias veces, a mi me ha mostrado 8.143144 todas
las veces que lo he ejecutado. El problema es que al usar un número
"fijo" como semilla para la generación de nuevos
números, el número producido siempre es el mismo, esto está bien
para hacer pruebas fijas o cuando queremos "dárnosla" de
mago con los colegas que saben menos que nosotros, ya que podemos
"predecir" los números que mostrará en una secuencia
seguida... con este "truco" dejaba "alucinado" a
los chavales a los que le daba clases... sólo tenía que memorizar
una serie de números y se quedaban "alucinados" cuando
les decía el que iba a salir... claro que después tenía que poner
"pies en polvorosa" cuando les explicaba "la
trampa".
Bueno, al tema, que no es plan de contar batallitas... El VB nos
proporciona una función que devuelve el número de segundos
transcurridos desde la media noche (TIMER) y usando esta función
como "semilla" lograremos producir números que
"casi" será aleatorios... al menos serán más difíciles
de "pronosticar", cambia el Randomize 5 por Randomize
Timer y verás que ya no se produce el mismo número cuando ejecutes
varias veces el programa...salvo que hagas "trampas"
cambiando la hora del equipo...
En VB4 y superior, se puede hacer esto mismo poniendo Randomize -1,
de esta forma la "semilla" es diferente cada vez que se
ejecuta, pero prefiero usar el Timer ya que es más
"compatible".
¿Que tal un jueguecito para practicar?
Hay que hacer un programa que genere un número entre uno y cien y
hay que intentar adivinarlo...
Si el número que damos es mayor o menor, que el VB nos avise y
cuando acertemos que nos lo comunique y termine el programa...
Para que VB se comunique, te voy a decir cómo hacerlo...
Para preguntarte el número y guardarlo en la variable N, haz esto:
N = Val(InputBox("Escribe un número entre 1 y 100")).
El InputBox muestra una pantalla preguntando y devuelve lo que
escribamos o una cadena vacía si pulsamos en cancelar, el Val
convierte esa cadena en número.
Para avisar que el número N, (el que nosotros le decimos al VB), es
menor o mayor, cambiar xxxx por lo que corresponda:
MsgBox "El número " & CStr(N) & " es
xxxx"
De esta forma se mostrará un cuadro de diálogo indicando si vamos
bien encaminados o no...
Ya mejoraremos o
ampliaremos este "ejercicio" para hacer más cosas,
incluso que el ordenador averigüe el número... que sin ningún
tipo de "suerte" lo adivinará en 5 ó 6 veces, lo mismo
que tu deberás hacer si sigues algunas normas o trucos... sólo
decirte lo de "divide y vencerás" (no sé porqué me ha
dado ahora por esa cita...)
En la próxima
entrega veremos más cosas sobre los arrays...
Si te atreves
podrías hacer los siguientes cambios al "problemilla"
planteado anteriormente:
1. Comprobar que el número introducido en el InputBox esté entre 1
y 100, en caso de que no sea así, volver a preguntar.
2. Si se escribe CERO mostrar el número que el VB había
"pensado" y terminar.
3. Cuando lo acertemos que nos indique en cuantos intentos lo hemos
conseguido.
4. Un programa que sea al revés, es decir: que nosotros pensemos un
número del 1 al 100 y el VB intente adivinarlo, para ello deberá
mostrarnos un número y nosotros indicarle si lo ha acertado.
5. Otro igual, pero indicándole si nuestro número es Menor, Mayor
o es correcto... habrá que darle las mismas oportunidades... (este
es el que tiene el "truco" del divide y vencerás...
En los casos 4 y 5 que muestre también el número de intentos que
le ha llevado solucionarlo...
La pista para que
el ordenador sepa si es menor o mayor es usar el MsgBox, pero como
función:
If MsgBox("Mi número es: " & CStr(x) & Chr$(13) & "¿He acertado?", 4) = 6 Then
MsgBox "Lo he acertado en " & CStr(v) & " veces."
Exit Do
'...
De esta forma
mostrará un cuadro de diálogo con dos opciones "SI" y
"NO", el número 4 es el encargado de eso. El valor
devuelto será 6 si se pulsa en SI y 7 si se pulsa en NO.
Esto en VB4 se podría hacer así:
If
MsgBox("Mi número es: " & CStr(x)
& vbCrLf & "¿He acertado?", vbYesNo) =
vbYes Then MsgBox
"Lo he acertado en " & CStr(v)
& " veces."
Exit Do
'...
Con lo cual, aunque
sea en inglés, es más intuitivo. Esto de los MsgBox lo veremos en
una entrega "especial"
Las soluciones
están en este link... no quiero
que estés esperando las soluciones hasta la próxima entrega...
para que veas que algunas veces soy un poco "más
considerado"
Nos vemos.


|
|