Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Guía 3 de ejercicios Computacion III



Profesor : Manuel Díaz
Ayudante : Pedro Silva






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


frmLoto.frm , pryLoto.vbp


EJERCICIOS PROPUESTOS

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%