|
|||||||
|
|
|
|||||
|
|
|||||||
1) Se quiere realizar un programa, que almacene en un archivo un conjunto de combinaciones aleatorias tipo LOTO ( 6 numeros al azar entre el 1 y 36 ), para despues poder mostrar en una caja de texto el contenido del archivo.
La estructura de datos básica que se usará en el programa, será un arreglo de tipo Combinacion dado por
Private Type Combinacion
num(1 To 6) As Integer
aciertos As Integer
End Type
Además, para optimizar la programación se pide implementar las siguientes funciones :
a) Function generarNumAleatorio(ByVal limInf As Integer, ByVal limSup As Integer) As Integer : Genera
aleatoriamente un número entero, en el rango limInf .. limSup
b) Sub generarCombinacion(ByRef cmb As Combinacion) : asigna al parametro pasado por referencia cbm, valores
aleatorios para generar la combinación
c) Sub simularCombinaciones(ByRef arrCmb() As Combinacion, n As Integer) : Asigna n combinaciones aleatorias al
arreglo pasado por referencia arrCmb
d) Sub GuardarArregloEnArchivo(ByRef arrComb() As Combinacion, n As Integer) : Almacena en el
archivo "bdloto.bin", el contenido del arreglo arrComb
e) Sub descargarArchivo(ByRef arrComb() As Combinacion, ByRef numeroDeRegistros) : Traspasa los registros desde el archivo hacia
el arreglo arrComb
f) Function StrCombinacion(ByRef cmb As Combinacion) As String : Retorna el String correspondiente al parametro de tipo Combinacion
g) Function generarStringArrComb(ByRef arrComb() As Combinacion, ByVal n As Integer) As String : Retorna el String correspondiente al
contenido del arreglo
Por último, se pide diseñar un formulario como se muestra a continuación :

SOLUCIÓN
Private Type Combinacion
num(1 To 6) As Integer
aciertos As Integer
End Type
' se tendra que generar las estadistica para las combinaciones
' existentes, de la forma
' 1 1,2%
' 2 1,34%
' 3 2,22%
Private Sub Form_Load()
Dim arrComb() As Combinacion
Dim numRegs As Integer
Call descargarArchivo(arrComb, numRegs)
If numRegs > 0 Then
Me.TextCombinaciones = generarStringArrComb(arrComb, numRegs)
End If
End Sub
Private Sub BtnGenerarCombinaciones_Click()
Dim arrComb() As Combinacion
Dim numGen As Integer
numGen = InputBox("Cuantas combinaciones deseas generar?")
ReDim arrComb(1 To numGen) As Combinacion
Call simularCombinaciones(arrComb, numGen)
Call GuardarArregloEnArchivo(arrComb, numGen)
Call descargarArchivo(arrComb, numGen)
Me.TextCombinaciones = generarStringArrComb(arrComb, numGen)
Me.TextCombinaciones.Refresh
End Sub
Private Function generarNumAleatorio(ByVal limInf As Integer, ByVal limSup As Integer) As Integer
Dim generado As Boolean, num As Integer
Dim cont As Integer
cont = 0
generado = False
Randomize
Do While Not generado
num = limInf + Rnd * Abs(limSup * 2 - limInf)
If (num >= limInf And num <= limSup) Then
generado = True
End If
cont = cont + 1
If cont > 100 Then ' en caso que despues de 100 iteraciones no
num = limInf ' se haya generado un numero en el tramo
generado = True
End If
Loop
generarNumAleatorio = num
End Function
Private Sub generarCombinacion(ByRef cmb As Combinacion)
Dim i As Integer
'en esta funcion hay que implementar un algoritmo que compruebe
'que el numero generado no existe
' en caso de existir hay que seguir iterando, con un limite 100 iter.
With cmb
For i = 1 To 6
.num(i) = generarNumAleatorio(1, 36)
Next
.aciertos = generarNumAleatorio(0, 3)
End With
End Sub
Private Sub simularCombinaciones(ByRef arrCmb() As Combinacion, n As Integer)
Dim i As Integer
Dim aux As Combinacion
' en este procedimiento hay que implementar un procedimiento
' que ordene de menor a mayor la combinacion generada
For i = 1 To n
Call generarCombinacion(aux)
arrCmb(i) = aux
Next
End Sub
Private Sub GuardarArregloEnArchivo(ByRef arrComb() As Combinacion, n As Integer)
Dim i As Integer
Dim numRegs As Integer, posicion As Integer, numArchivo As Integer
Dim tam As Integer ' tamagno (bytes) de la estructura Combinacion
numRegs = 0
numArchivo = FreeFile
tam = Len(arrComb(1))
Open "bdLoto.bin" For Binary As #numArchivo Len = tam
numRegs = LOF(numArchivo) \ tam
For i = 1 To n
posicion = numRegs * tam + 1
Put #numArchivo, posicion, arrComb(i)
numRegs = numRegs + 1
Next i
Close #numArchivo
End Sub
Private Sub descargarArchivo(ByRef arrComb() As Combinacion, ByRef numeroDeRegistros)
Dim i As Integer
Dim numRegs As Integer, posicion As Integer, numArchivo As Integer
Dim tam As Integer ' tamagno (bytes) de la estructura Combinacion
ReDim Preserve arrComb(1 To 2) As Combinacion
numRegs = 0
numArchivo = FreeFile
tam = Len(arrComb(1))
Open "bdLoto.bin" For Binary As #numArchivo Len = tam
numRegs = LOF(numArchivo) \ tam
numeroDeRegistros = numRegs
If (numRegs > 0) Then
ReDim arrComb(1 To numRegs) As Combinacion
posicion = 1
For i = 1 To numRegs
Get #numArchivo, posicion, arrComb(i)
posicion = posicion + tam
Next i
End If
Close #numArchivo
End Sub
Private Function StrCombinacion(ByRef cmb As Combinacion) As String
Dim i As Integer, msg As String
msg = ""
For i = 1 To 6
With cmb
If (.num(i) < 10) Then
msg = msg & "0"
End If
msg = msg & Str(.num(i))
End With
If i <> 6 Then
msg = msg & " , "
End If
Next
msg = msg & " " & Str(cmb.aciertos)
StrCombinacion = msg
End Function
Private Function generarStringArrComb(ByRef arrComb() As Combinacion, ByVal n As Integer) As String
Dim msg As String, i As Integer
Dim posicion As Integer, tam As Integer
tam = Len(arrComb(1))
msg = ""
posicion = 1
For i = 1 To n
If i < 10 Then
msg = msg & " "
End If
msg = msg & Str(i) & " "
msg = msg & StrCombinacion(arrComb(i))
msg = msg & " " & Str(posicion) & vbCrLf
posicion = posicion + tam
Next
generarStringArrComb = msg
End Function
I) Implementar la función o procedimiento necesario para asegurar que un número no se repita en una combinación.
Por ejemplo la combinacion : 1 , 5 , 7 , 1 , 12 , 4 ya no podria generarse.
II) Implementar un procedimiento que permita ordenar en forma ascendente una combinación.
Por ejemplo la combinación : 3 , 12 , 4 , 10 , 5 , 9 quedaría ordenada así : 3 , 4 , 5 , 9 , 10 , 12
III) Implementar las funciones y procedimientos necesarios para realizar una estadistica que determine el porcentaje
de repitencia en todo el conjunto de combinaciones.
Estos porcentajes deberán ser mostrados de la siguiente manera, en los textbox correspondientes :
1 1,22% 19 1,06% 2 2,09% 20 3,08% : : : : 18 1,89% 36 0,98%