Curso
Básico de Programación
en Visual Basic
Novena Entrega: 23/Sep/97.
por Guillermo "guille" Som
Te recomiendo que leas las
entregas anteriores, aquí tienes los links:
La Primera, la Segunda, la Tercera, la Cuarta, la Quinta, la Quinta++, la Sexta, la Séptima, la Octava.
![]()
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.
Así que si estás
interesado en echarme un cable, dimelo y te pondré en la lista de colegas
"respondones" del Guille...
Gracias por adelantado.
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, Dim 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... preparate 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, Dim 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 dejartelo 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 quisieramos 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:
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 no son tan aleatorios, es decir cada vez que se
inicia el programa produce el mísmo 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, jé.
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,
ejecutalo 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 "darnosla" 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 esplan 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...
Eb 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 reguntando 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 ampliarremos 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"
Bueno, creo que esta entrega no debería tener demasiadas dudas... en los manuales o la ayuda viene explicado esto de los números aleatroios, pero si quieres dejarme algún comentario, hazlo e intentaré aclararte cualquier duda... pero no lo hagas sobre las soluciones, ya que las obtienes en el link del párrafo anterior.
Que lo "randomices" bien...
Nos vemos.
![]()