RE:cena de filosofos
Publicado por
NORBERTO (1 intervención) el 02/05/2008 22:22:59
A continuación te presentamos el código en visual Basic de la aplicación.
Por razones de tiempo no pudimos considerar el número de cucharadas que contiene un plato de pasta y tampoco si un filosofo come más rápido que otro, pero al final te daremos una idea de como implementarlo sobre el siguiente código:
Hemos considerado a los filósofos en un array de botones de comandos. Y los cambios en los estados de los procesos mediante controles timers.
DECLARACIÓN DE VARIABLES:
Dim N As Integer 'NÚMERO DE FILOSOFOS
Dim HAMBRIENTOS(1 To 3), tlibre(1 To 5) As Integer 'hambrientos es una array unidimensional(pila) que contiene a los filósofos que están hambrientos
Dim k, L,I, CONT, INICIAL, FINAL As Integer ' LAS CUATRO PRIMERAS VARIABLES SON PARA AVANZAR EN LOS BUCLES Y LAS 2
BOTON EMPEZAR A COMER:
INSTRUCCIONES PARA ASIGNAR ALEATORIAMENTE LOS SI UN FILOSOFO ESTÁ PENSANDO O HAMBRIENTO.
Private Sub CMDcomer_Click()
'ASIGNO LA POSICION EN LA MESA A CADA FILOSOFO(PROCESO) INICIALMENTE TODOS LOS TENEDORES(RECURSOS) ESTAN LIBRES
For N = 1 To 5
Filosofos(N) = N
tlibre(N) = True
Next N
'INICIALMENTE TODOS ESTAN PENSANDO
For N = 1 To 5
Filosofos(N) = "PEN"
FIL1(N).BackColor = RGB(255, 255, 0)
Next N
‘ASIGANMOS UN VALOR INICIAL ALEATORIO PARA DETERMINAR AL PRIMER HAMBRIENTO
INICIAL = Int((5 * Rnd) + 1) ' GENERA UN VALOR ALEATORIO ENTRE 1 Y 5
Select Case INICIAL
Case 1
FINAL = 5
Case 2
FINAL = 6
Case 3
FINAL = 7
Case 4
FINAL = 8
Case 5
FINAL = 9
End Select
J = 0
‘ASIGNAMOS EL ESTADO HAMBRIENTO DEJANDO UNO Y CAMBIANDO DE COLOR A ROJO
k = 0
CONT = 0
For N = INICIAL To FINAL Step 2
J = N
If N > 5 Then
If N = 6 Or N = 8 Then J = CONT + 1
If N = 7 Or N = 9 Then J = CONT + 2
CONT = CONT + 2
End If
Filosofos(J) = "HAM"
k = k + 1
HAMBRIENTOS(k) = J
FIL1(J).BackColor = RGB(255, 0, 0)
Next N
Timer1.Enabled = True
END SUB
TIMER QUE CAMBIA DEL ESTADO HAMBRIENTO A COMIENDO:
Private Sub Timer1_Timer()
'PASA DEL ESTADO HAMBRIENTO A COMIENDO EVALUANDO SI LOS TENEDORES DE LA IZQUIERDA Y DERECHA ESTAN DISPONIBLES Y SI ES ASI CAMBIARÁN AL COLOR VERDE.
For k = 1 To 3
If HAMBRIENTOS(k) = 1 Then
If tlibre(HAMBRIENTOS(k) + 4) = True And tlibre(HAMBRIENTOS(k)) = True Then
tlibre(HAMBRIENTOS(k) + 4) = False
tlibre(HAMBRIENTOS(k)) = False
tenedor(HAMBRIENTOS(k) + 4).Visible = False
tenedor(HAMBRIENTOS(k)).Visible = False
Filosofos(HAMBRIENTOS(k)) = "COM"
FIL1(HAMBRIENTOS(k)).BackColor = RGB(0, 255, 0)
End If
End If
If HAMBRIENTOS(k) <> 1 Then
If tlibre(HAMBRIENTOS(k) - 1) = True And tlibre(HAMBRIENTOS(k)) = True Then
tlibre(HAMBRIENTOS(k) - 1) = False
tlibre(HAMBRIENTOS(k)) = False
tenedor(HAMBRIENTOS(k) - 1).Visible = False
tenedor(HAMBRIENTOS(k)).Visible = False
Filosofos(HAMBRIENTOS(k)) = "COM"
FIL1(HAMBRIENTOS(k)).BackColor = RGB(0, 255, 0)
End If
End If
Next k
Timer1.Enabled = False
Timer2.Enabled = True
End Sub
TIMER QUE EVALUA LOS ESTADOS DE LOS FILOSOFOS Y VUELVE A REPETIR EL PROCESO:
Private Sub Timer2_Timer()
'EN LA SEGUNDA PASADA EVALUAN LOS ESTADOS DE LOS FILOSOFOS Y DEJAN TENEDOR
L = 0
For N = 1 To 5
If Filosofos(N) = "HAM" Then
L = L + 1
HAMBRIENTOS(L) = N
Else
If Filosofos(N) = "PEN" Then
L = L + 1
HAMBRIENTOS(L) = N
FIL1(N).BackColor = RGB(255, 0, 0)
Else
If Filosofos(N) = "COM" Then
Filosofos(N) = "PEN"
If N = 1 Then
tlibre(N) = True
tlibre(N + 4) = True 'DEJAMOS LIBRE TENEDOR DERECHO
tenedor(N).Visible = True
tenedor(N + 4).Visible = True
Else 'E IZQUIERDO RESPECTIVAMENTE
If N <> 1 Then
tlibre(N) = True
tlibre(N - 1) = True
tenedor(N).Visible = True
tenedor(N - 1).Visible = True
End If
End If
FIL1(N).BackColor = RGB(255, 255, 0)
End If
End If
End If
Next N
Timer2.Enabled = False
Timer1.Enabled = True
End Sub
Y VUELVE AL A EJECUTAR DEL TIMER 1.
Y COMO PROMETIMOS AL COMIENZO DE ESTA DOCUMENTACIÓN TE DAMOS LAS SIGUIENTES IDEAS PARA TERMINAR ESTA APLICACIÓN.
1. PUEDES CONSIDERAR UN ARRAY LLAMADA CUCHARADAS CON DIMENSION DEL NUMERO DE FILOSOFOS QUE CONTENGA CADA ELEMENTO DE ESTE ARRAY EL NUMERO DE CUCHARADAS DE CADA PLATO, CUANDOASIGNES EL ESTADO COMIENDO A UN FILOSOFO AUTOMÁTICAMENTE TENDRAS QUE DESCONTAR UNA CUCHARADA EN EL ELEMENTO DEL ARRAY CON EL MISMO INDICE QUE EL FILOSOFO QUE ESTA COMIENDO.
2. PARA HACER QUE UN PROCESO(TIEMPO QUE DEMORA EN COMER UNA CUCHARADA UN FILOSOFO) SEA MAS RAPIDO QUE OTRO PUEDES ASIGNAR MEDIANTE LA FUNCION RANDOM UN TIEMPO DETERMINADO ALEATORIAMENTE Y CAPTURARLO EN UN ARRAY DE TIEMPOS CON LA DIMENSION DEL NUMERO DE FILOSOFOS Y EN OTRO TIMER COMPARAR EN UN BUCLE SI YA SE LLEGO AL VALOR MENOR ENTONCES ESE PROCESO CAMBIARA DE ESTADO MIENTRAS QUE EL OTRO SEGUIRA PROCESANDO(COMIENDO).