En Japon, todos los estudiantes aprenden "Permutaciones y Combinaciones" en el primer grado de la escuela secundaria. Como primera leccion, los profesores muestran todos los patrones de permutacion y combinaciones. Probablemente 4!=24 patrones o 6C3=20 patrones. Despues de mostrar todos los patrones, para calcular el valor de permutaciones o combinaciones es el problema para estudiantes.
Lo que se hace para entender casos como estos aqui cito una parte de un libro "el frasco misterioso de Anno" :
Hay un frasco.
En el frasco, esta el mar.
En el mar, hay una isla.
En la isla, hay 2 paises.
En cada pais hay 3 colinas.
En cada colina, hay 4 castillos.
Este libro muestra desde 1! a 8!=40320 puntos en las paginas. Pero, si queremos mostrar 10! = 3628800, necesitaremos mas de 180 paginas. Esto parece real para los estudiantes.
Aun para los profesores, es duro y doloroso mostrar todos los patrones de 5! o mas a mano. Pero las computadores si pueden hacerlo. Algun programa tiene la funcion de mostrar permutaciones. Desafortunadamente, estos programas no son tan populares en las escuelas. Excel es mas conocido para profesores y estudiantes. Y es una herramienta muy poderosa para la educacion en matematicas. Ademas, Excel VBA (Visual Basic para Aplicaciones) es un lenguaje de programacion poderoso.
JK para Excel es una hoja de trabajo con un programa VBA para mostrar todos los valores al aplicar permutaciones o combinaciones. JK simboliza Junretsu(permutacion) y Kumiawase(combinacion) en japones.
CASO 1
SMILE tiene 5 letras, y todas diferentes. Escribe SMILE y clickea en GO.


CASO 2
FOOTBALL tiene 8 letras. 2 O y 2 L son identicas. El numero de permutaciones de "FOOTBALL" es 8!/(2!*2!)=10080. El programa realizado muestra a todos.


8!=40320
9P6=60480
CASO 3
JK puede mostrar ambos casos, ya sea permutaciones o combinaciones. Mire los siguientes ejemplos.
"CAKE" tiene 4 letras. Y todas son diferentes. Vamos a tomar 2 letras a la vez.
Numero de combinaciones=4C2=6



Al abrir el archivo veran 2 botones (Input Form y Reset)

'// Input Form Sheet1.Columns(1).ClearContents Label1.Caption = "" UserForm1.Showeste codigo lo que hace es limpiar la columna A o 1 de la Hoja1, limpiar el Label1 (es ese rectangulo morado que muestra los resultados) y mostrar el formulario UserForm1.
El formulario que abre es este.

'// GO
Dim OutputStr As String
Dim SortedStr As String
Dim startDtm As Date, endDtm As Date 'Process time
Dim i As Integer
Dim Msg As String
Dim TempStr As String
Clr_text
cnt = 0
nest = 0
OverFlowBol = False
OutputStr = ""
InputStr = TextBox1.Text
startDtm = Now()
Label3.Caption = "Counting ..."
Label4.Caption = ""
DupChrChk InputStr, SortedStr
If JKsw = True Then
Perm OutputStr, InputStr, r 'Permutations
Else
Comb OutputStr, SortedStr, r 'Combinations
End If
endDtm = Now()
For i = 1 To 20: Beep: Next i
If OverFlowBol = False Then
TempStr = cnt & " way"
If cnt > 1 Then
TempStr = TempStr & "s."
Else
TempStr = TempStr & "."
End If
Label3.Caption = TempStr
Else
Label3.Caption = "Stop at " & cnt & " "
Msg = "Process Limit !"
MsgBox Msg, vbCritical
End If
Label4.Caption = "Time:" & DateDiff("s", startDtm, endDtm) & " sec."
Wrt_text
TextBox1.SetFocus
lo que se hace aqui es inicializar variables con Dim y despues llamar a la macro Clr_Text que contiene este codigo'// Reset data
UserForm1.Label3.Caption = ""
UserForm1.Label4.Caption = ""
Sheet1.Activate
Sheet1.Label1.Caption = ""
Sheet1.Columns(1).ClearContents
Sheet5.Activate
Sheet5.Range("B2", "D21").ClearContents
Sheet5.Range("F7", "H12").ClearContents
Sheet5.Label1.Caption = ""
Sheet1.Activate
como se puede ver lo que hace es limpiar ciertos controles, ahora siguiendo con el evento Go de arriba, se almacena la palabra ingresada en InputStr mientras que OutputStr se inicializa como una variable sin caracteres, y se evalua si JKsw es verdadero, esta variable esta inicializada mas arriba por lo que se puede llamar en cualquier funcion, y dado que se inicializo As Boolean por defecto sera verdadera, entonces llamara a la macro Perm la cual se le ingresaran 3 valores y el codigo que ejecutara esta macro sera el siguiente:Sub Perm(OutNowStr As String, InNowStr As String, sel As Integer)
'// Permutations
Dim k As Integer
Dim i As Integer
Dim OutNextStr As String '
Dim InNextStr As String '
Dim ChkStr As String '
Dim chr1Str As String '
Dim hit As Integer '
nest = nest + 1
If OverFlowBol = True Then
nest = nest - 1
Exit Sub
End If
If sel = 0 Then
OutProc OutNowStr
Else
k = Len(InNowStr)
ChkStr = ""
For i = 1 To k
chr1Str = Mid(InNowStr, i, 1)
hit = InStr(ChkStr, chr1Str)
If hit = 0 Then
ChkStr = ChkStr & chr1Str
' -------------------------------------------------------------------
OutNextStr = OutNowStr & chr1Str
InNextStr = Mid(InNowStr, 1, i - 1) & Mid(InNowStr, i + 1, k - i)
Perm OutNextStr, InNextStr, sel - 1
' -------------------------------------------------------------------
End If
Next i
End If
nest = nest - 1
End Sub
como se ve aqui este codigo realiza las permutaciones, ahora esto sera en caso de que JKsw sea verdadero que como lo dije sera en su defecto, pero que pasa si es falso vemos que llama a otra macro: Comb. Para ver como cambia el valor de la variable vemos en el formulario 2 radiobutton, estos cambian el valor de la variable JKsw ya que si vemos el codigo:Private Sub OptionButton1_Click() '// "Permutations" JKsw = True JKstr = "Permutations" End Subahora volvemos a la opcion de que JKsw sea falso, llamara a la macro Sub que ejecutara el siguiente codigo:
Sub Comb(OutNowStr As String, InNowStr As String, sel As Integer)
'// Combinations
Dim k As Integer
Dim i As Integer
Dim OutNextStr As String '
Dim InNextStr As String '
Dim ChkStr As String '
Dim chr1Str As String '
Dim hit As Integer '
nest = nest + 1
If OverFlowBol = True Then
nest = nest - 1
Exit Sub
End If
If sel = 0 Then
OutProc OutNowStr
Else
k = Len(InNowStr)
ChkStr = ""
For i = 1 To (k - sel + 1) ' <-- Caution!
chr1Str = Mid(InNowStr, i, 1)
hit = InStr(ChkStr, chr1Str)
If hit = 0 Then
ChkStr = ChkStr & chr1Str
' -------------------------------------------------------------------
OutNextStr = OutNowStr & chr1Str
InNextStr = Mid(InNowStr, i + 1, k - i)
Comb OutNextStr, InNextStr, sel - 1
' -------------------------------------------------------------------
End If
Next i
End If
nest = nest - 1
End Sub
ahora como vemos en StartDtm y EndDtm se almacenaron los valores al empezar y terminar el codigo, ahora seguimos en el evento click del boton Go, aqui se evalua si OverFlowBol = False y dado que se inicializo asi muestra el numero de celdas que contienen las permutaciones o combinaciones respectivas asi como los ejemplos anteriores que al poner SMILE salia 120 ways (vean la figura de arriba) y despues mostrara el tiempo que demoro en procesar las permutaciones en el Label4, como vimos antes en 120 permutaciones mostro 0 segundos pero en 10080 permutaciones le tomo 6 segundos, este tiempo lo calcula de restar EndDtm y StartDtm.
Ahora si pulsamos Reset se ejecutara este boton
Private Sub CommandButton2_Click() '// Reset Data TextBox1.Text = "" TextBox2.Text = "" Clr_text TextBox1.SetFocus End Subaqui lo que hace es limpiar los textbox, llamar al procedimiento Clr_text y poner el cursor en el textbox1. El boton Close tiene el siguiente codigo
Private Sub CommandButton3_Click() '// Close Form End End SubEn el codigo para elegir el numero de combinaciones o permutaciones se utiliza un spinbutton que tiene el siguiente codigo:
Private Sub SpinButton1_Change() '// Change the value of "r" by spin button TextBox2.Text = SpinButton1.Value End Suby vemos que en el evento textchange del textbox2 se llama al spinbutton
Private Sub TextBox2_Change()
'// Chose r
Dim msgStr As String
r = Val(TextBox2.Text)
n = Len(TextBox1.Text)
If TextBox2.Text <> "" Then
If (Not IsNumeric(TextBox2.Text)) Or _
r < 0 Or r > n Then
msgStr = "Choose 0 <= r <= " & n
MsgBox msgStr, vbExclamation
r = n
TextBox2.Text = n
End If
End If
SpinButton1.Max = n
SpinButton1.Value = r
End Sub
Ahora al elegir los radiobuttons se llamara a los procedimientos Perm o Comb
Private Sub OptionButton1_Click() '// "Permutations" JKsw = True JKstr = "Permutations" End Sub Private Sub OptionButton2_Click() '// "Combinations" JKsw = False JKstr = "Combinations" End Suby este es el codigo con el que se inicializa el formulario
Private Sub UserForm_Initialize() '// Initialize OptionButton1.Value = True OptionButton1_Click 'Set "Permutation" CalSheetBol = True 'Write to CalcSheet n = 0 r = 0 UserForm1.SpinButton1.Max = 0 UserForm1.SpinButton1.Value = 0 Load UserForm1 End Subno tengo mucho tiempo para explicar el resto de codigo, asi que aqui les dejo el ejemplito para que se guien y espero les haya servido esta pequeña explicacion que hice.


0 comentarios:
Publicar un comentario