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.

 

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, dímelo 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, 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"

Bueno, creo que esta entrega no debería tener demasiadas dudas... en los manuales o la ayuda viene explicado esto de los números aleatorios, 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.


 
entrega anterior ir al índice siguiente entrega

Ir al índice principal del Guille