Diferencia entre revisiones de «Práctica de FSM (Ingeniería I)»
Sin resumen de edición |
|||
(No se muestran 17 ediciones intermedias de 2 usuarios) | |||
Línea 1: | Línea 1: | ||
{{Back|Ingeniería de Software I}} | |||
== Ejercicio 01 == | == Ejercicio 01 == | ||
Línea 8: | Línea 8: | ||
== Ejercicio 06 == | == Ejercicio 06 == | ||
== Ejercicio 07 == | == Ejercicio 07 == | ||
''Modele con FSMs el siguiente protocolo “Acelerador de Peticiones”.'' | |||
''El acelerador media entre un cliente y dos servidores. En un escenario normal, el acelerador recibe la petición del cliente y lo envía a ambos servidores. La primera respuesta que reciba es la que enviará al cliente, ya que los dos servidores otorgan el mismo servicio, contestan indefectiblemente y devuelven exactamente el mismo resultado, pero uno puede ser más rápido que el otro en distintas situaciones. El acelerador luego se encarga de cancelarle la petición al otro servidor, para que no siga trabajando y asegurarse que no le responda. El cliente no puede hacer otra petición hasta que no reciba la respuesta del acelerador. El cliente nunca debe recibir una respuesta atrasada de una petición anterior. Suponer que no se pierden paquetes en ninguna comunicación.'' | |||
'''FSM Cliente:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
rankdir=LR; | |||
size="8,6"; | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=10]; | |||
// Estados | |||
Inicial; | |||
Esperando; | |||
// Transiciones | |||
Inicial->Esperando [label="Pedir!"]; | |||
Esperando->Inicial [label="ResponderCliente?"]; | |||
} | |||
</graphviz> | |||
'''FSM Servidor i = {1,2}:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
rankdir=LR; | |||
size="8,6"; | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=10]; | |||
// Estados | |||
Inicial; | |||
Procesando; | |||
// Transiciones | |||
Inicial->Procesando [label="PedirServidor?"]; | |||
Procesando->Inicial [label="Responder i!"]; | |||
Procesando->Inicial [label="Cancelar i?"]; | |||
} | |||
</graphviz> | |||
'''FSM Acelerador:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
//rankdir=LR; | |||
size="8,6"; | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=10]; | |||
// Transiciones | |||
Inicial->Pedido [label="Pedir?"]; | |||
Pedido->Enviado [label="PedirServidor!"]; | |||
Enviado->Respondio1 [label="Responder 1?"]; | |||
Enviado->Respondio2 [label="Responder 2?"]; | |||
Respondio1->Listo [label="Cancelar 2!"]; | |||
Respondio2->Listo [label="Cancelar 1!"]; | |||
Listo->Inicial [label="ResponderCliente!"]; | |||
} | |||
</graphviz> | |||
'''Composicion:''' | |||
''Protocolo Acelerador de Peticiones = Acelerador || Servidor 1 || Servidor 2 || Cliente'' | |||
== Ejercicio 08 == | == Ejercicio 08 == | ||
<i>Modele mediante una FSM temporizada un semáforo con interruptor que presente las siguientes características: | |||
* La luz verde dura 30 segundos. | |||
* La luz amarilla dura 5 segundos. | |||
* La luz roja dura a lo sumo 30 segundos. | |||
* Si la luz roja ha estado prendida por más de 20 segundos y se oprime el interruptor, no se produce ningún efecto. | |||
* Si la luz roja ha estado prendida a lo sumo 20 segundos y se oprime el interruptor, la luz cambia a verde en 10 segundos más. | |||
* Si el interruptor es oprimido cuando la luz verde o amarilla está encendida, el semáforo lo ignora. </i> | |||
'''FSM Semaforo:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
size="8,6" | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=11]; | |||
// Estados | |||
Verde [label="Verde\n[tVerde < 30'']"]; | |||
AmarillaR [label="AmarillaRoja\n[tAmarillo < 5'']"]; | |||
AmarillaV [label="AmarillaVerde\n[tAmarillo < 5'']"]; | |||
RojaOprimido [label="RojaOprimido\n[tRojo < 10'']"]; | |||
Roja [label="Roja\n[tRojo < 30'']"]; | |||
// Oprimir | |||
Verde->Verde [label="Oprimir?"]; | |||
AmarillaR->AmarillaR [label="Oprimir?"]; | |||
AmarillaV->AmarillaV [label="Oprimir?"]; | |||
RojaOprimido->RojaOprimido [label="Oprimir?"] | |||
Roja->Roja [label="Oprimir?\n[tRoja > 20'']"] | |||
Roja->RojaOprimido [label="Oprimir?\n[tRoja > 20'']\n{tRoja}"] | |||
// Pasa tiempo | |||
AmarillaR->Roja [label="PasaARoja\n[tAmarillo = 5'']\n{tRoja}"]; | |||
Roja->AmarillaV [label="PasaDeRoja\n[tRoja = 30'']\n{tAmarilla}"]; | |||
RojaOprimido->AmarillaV [label="PasaDeRojaOprimido\n[tRoja = 10'']\n{tAmarilla}"]; | |||
AmarillaV->Verde [label="PasaAVerde\n[tAmarillo = 5'']\n{tVerde}"]; | |||
Verde->AmarillaR [label="PasaDeVerde\n[tVerde = 30'']\n{tAmarilla}"]; | |||
} | |||
</graphviz> | |||
'''FSM Interruptor:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
size="10" | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=11]; | |||
// Grafo | |||
Boton; | |||
Boton->Boton [label="Oprimir!"]; | |||
} | |||
</graphviz> | |||
'''Variables:''' | |||
* tVerde: timer | |||
* tAmarillo: timer | |||
* tRojo: timer | |||
'''Composicion:''' | |||
''Semaforo con Interruptor = Interruptor || Semaforo'' | |||
== Ejercicio 09 == | == Ejercicio 09 == | ||
== Ejercicio 10 == | == Ejercicio 10 == | ||
''Se desea modelar con FSM una simplificación de un teléfono celular que responde a la siguiente descripción:'' | |||
''El teléfono posee teclado, display numérico y una tapa que cubre el teclado. El teclado está formado por los botones 0 al 9, on, send, end y clear. El display puede mostrar hasta 8 dígitos. Se enciende al presionar on. La tecla clear borra todo el número ingresado. Una vez que se ingresó el número deseado, presionando send se inicia la conversación, la cual se mantiene hasta que se cierre la tapa, se presione end o se apague el teléfono con on. Al abrir la tapa, el número del display es el que figuraba al | |||
momento de cerrarla o apagar el teléfono.'' | |||
''Asuma cualquier aspecto del funcionamiento de este aparato que no esté explicado en el enunciado, documentando claramente lo que Ud. asuma.'' | |||
'''FSM Teléfono Celular''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
size="8,6" | |||
node [style=rounded, fontname=Arial, fontsize=8]; | |||
edge [fontname=Arial, fontsize=9]; | |||
// Estados | |||
ApagadoCerrado [label="Apagado y\nCerrado"]; | |||
ApagadoAbierto [label="Apagado y\nAbierto"]; | |||
PrendidoAbierto [label="Prendido y\nAbierto"]; | |||
PrendidoCerrado [label="Prendido y\nCerrado"]; | |||
Hablando [label="Hablando"]; | |||
// Cambios de estado | |||
ApagadoCerrado->ApagadoAbierto [label="Abrir"]; | |||
ApagadoAbierto->ApagadoCerrado [label="Cerrar"]; | |||
ApagadoAbierto->PrendidoAbierto [label="On\n{i=0, n=0}"]; | |||
PrendidoAbierto->ApagadoAbierto [label="On"]; | |||
PrendidoAbierto->PrendidoCerrado [label="Cerrar"]; | |||
PrendidoAbierto->Hablando [label="Send"]; | |||
PrendidoCerrado->PrendidoAbierto [label="Abrir"]; | |||
Hablando->PrendidoAbierto [label="End"]; | |||
Hablando->PrendidoCerrado [label="Cerrar"]; | |||
Hablando->ApagadoAbierto [label="On"]; | |||
// Invalidos de Apagado y Abierto | |||
ApagadoAbierto->ApagadoAbierto [label="Clr"]; | |||
ApagadoAbierto->ApagadoAbierto [label="0"]; | |||
ApagadoAbierto->ApagadoAbierto [label="..."]; | |||
ApagadoAbierto->ApagadoAbierto [label="9"]; | |||
ApagadoAbierto->ApagadoAbierto [label="End"]; | |||
ApagadoAbierto->ApagadoAbierto [label="Send"]; | |||
// Invalidos de Hablando | |||
Hablando->Hablando [label="Clr"]; | |||
Hablando->Hablando [label="0"]; | |||
Hablando->Hablando [label="..."]; | |||
Hablando->Hablando [label="9"]; | |||
Hablando->Hablando [label="Send"]; | |||
// Invalidos de Prendido y Abierto | |||
PrendidoAbierto->PrendidoAbierto [label="0\n[i>8]"]; | |||
PrendidoAbierto->PrendidoAbierto [label="..."]; | |||
PrendidoAbierto->PrendidoAbierto [label="9\n[i>8]"]; | |||
// Validos de Prendido y Abierto | |||
PrendidoAbierto->PrendidoAbierto [label="0\n[i<=8]\n{n[i]=0, i++}"]; | |||
PrendidoAbierto->PrendidoAbierto [label="..."]; | |||
PrendidoAbierto->PrendidoAbierto [label="0\n[i<=8]\n{n[i]=9, i++}"]; | |||
PrendidoAbierto->PrendidoAbierto [label="Clr\n{i=1, n[]=0}"]; | |||
} | |||
</graphviz> | |||
'''Variables:''' | |||
*i:[1..8] | |||
*n[1..8]:[0..9] | |||
== Ejercicio 11 == | == Ejercicio 11 == | ||
(Hecho en clase) | |||
== Ejercicio 12 == | == Ejercicio 12 == | ||
Ver [[http://cuba.dc.uba.ar/wiki/images/d/d2/FSM_Parcelas.pdf Link a PDF]] | |||
== Ejercicio 13 == | == Ejercicio 13 == | ||
<i> Cansados de ver como continuamente se desvirtúa el mundialmente famoso "Piedra, Papel o Tijera", científicos de una sociedad secreta del sur de Suecia, se han puesto cómo objetivo formalizar el citado juego, cambiando algunas de sus reglas e introduciendo reglas nuevas. | |||
Algunas de sus conclusiones son: | |||
* El juego posee dos jugadores y un árbitro. | |||
* Se juega al mejor de 3: el primer jugador en ganar dos partidas, gana el juego. | |||
* La dinámica es manejada por el árbitro. | |||
Cada partida se inicia cuando los tres (el árbitro y los 2 jugadores) gritan "Piedra", "Papel", "o Tijera". Entre cada una de las palabras, el árbitro y los jugadores toman acciones distintas: | |||
* En el caso de los jugadores, agitan sus manos de alguna forma (usualmente de arriba hacia abajo, con el puño cerrado). | |||
* En el caso del árbitro, grita una frase de aliento como "Vamos nene!", "Vos podés!", "Que no decaiga!", etc. | |||
Inmediatamente después de decir "o Tijera”, cada uno de los jugadores debe hacer una elección entre alguno de los 3 elementos. El árbitro debe determinar el ganador de la partida según el siguiente criterio: | |||
* Tijera le gana a Papel. | |||
* Papel le gana a Piedra. | |||
* Piedra le gana a Tijera. | |||
En caso de compartir la elección, el resultado es empate y la partida se debe | |||
jugar nuevamente. Luego el árbitro indica a cada jugador si ganó o perdió y el que ganó ríe y el que perdió llora. Los jugadores no saben si ganan o pierden (es como si no vieran a su rival). | |||
Si la competencia aún no terminó, el árbitro indica que se jugará una nueva partida. En caso de que la competencia haya terminado, el árbitro le indicará al jugador correspondiente, este gritará "Iuupiii!" y quedará listo para jugar una nueva competencia. | |||
Formalice las conclusiones de los científicos, utilizando FSMs. | |||
</i> | |||
'''FSM Arbitro:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
size="12,10"; | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=10]; | |||
// Estados | |||
Inicial->Comienzo [label="Nuevo Juego!"]; | |||
Comienzo->GritoPiedra [label="Piedra!"]; | |||
GritoPiedra->HagoPiedra [label="AlientoPiedra"]; | |||
HagoPiedra->GritoPapel [label="Papel!"]; | |||
GritoPapel->HagoPapel [label="AlientoPapel"]; | |||
HagoPapel->GritoTijera [label="Tijera!"]; | |||
GritoTijera->Eligieron [label="Muestra?"]; | |||
Eligieron->Comienzo [label="Empate!\n[elem1 = elem2]"]; | |||
Eligieron->Declarar [label="Gano 1!\n[gana(elem1,elem2)]\n{wins1++}"]; | |||
Eligieron->Declarar [label="Gano 2!\n[gana(elem2,elem1)]\n{wins2++}"]; | |||
Declarar->Inicial [label="Campeon 1!\n[wins1 = 2]\n{wins1 = wins2 = 0}"]; | |||
Declarar->Inicial [label="Campeon 2!\n[wins2 = 2]\n{wins1 = wins2 = 0}"]; | |||
Declarar->Comienzo [label="OtraPartida!\n[wins1 < 2 && wins2 < 2]"]; | |||
} | |||
</graphviz> | |||
'''FSM Jugador i = {1,2}:''' | |||
<graphviz> | |||
digraph G { | |||
// Config | |||
size="14,12"; | |||
node [style=rounded, fontname=Arial, fontsize=10]; | |||
edge [fontname=Arial, fontsize=10]; | |||
// Transiciones | |||
Inicial->Comienzo [label="Nuevo Juego?"]; | |||
Comienzo->GritoPiedra [label="Piedra?"]; | |||
GritoPiedra->HagoPiedra [label="MuevoManoPiedra i"]; | |||
HagoPiedra->GritoPapel [label="Papel?"]; | |||
GritoPapel->HagoPapel [label="MuevoManoPapel i"]; | |||
HagoPapel->GritoTijera [label="Tijera?"]; | |||
GritoTijera->Elige [label="ElijoPie i\n{elemi = pie}"]; | |||
GritoTijera->Elige [label="ElijoPap i\n{elemi = pap}"]; | |||
GritoTijera->Elige [label="ElijoTij i\n{elemi = tij}"]; | |||
Elige->Eligio [label="Muestra!"]; | |||
Eligio->Comienzo [label="Empate?"]; | |||
Eligio->Gane [label="Gano i?"]; | |||
Eligio->Perdi [label="Gano op(i)?"]; | |||
Gane->FinPartida [label="Rio i"]; | |||
Perdi->FinPartida [label="Lloro i"]; | |||
FinPartida->GaneCompetencia [label="Campeon i?"]; | |||
GaneCompetencia->Inicial [label="Grito Iupi"]; | |||
FinPartida->Inicial [label="Campeon op(i)?"]; | |||
FinPartida->Comienzo [label = "OtraPartida?"]; | |||
} | |||
</graphviz> | |||
'''Variables:''' | |||
* elem1: string | |||
* elem2: string | |||
* wins1: int | |||
* wins2: int | |||
'''Macros:''' | |||
* gana(e1, e2) = (e1 = tij && e2 = pap) || (e1 = pap && e2 = pie) || (e1 = pie && e2 = tij) | |||
* op(i) = i%2 + 1 | |||
'''Composicion:''' | |||
''PiedraPapelTijera = Arbitro || Jugador1 || Jugador2'' | |||
== Ejercicio 14 == | == Ejercicio 14 == | ||
Ver [[Media:FSM-Parcelas-Ing1.pdf|Resuelto de Parcelas]]. |
Revisión actual - 20:05 15 may 2009
Ejercicio 01
Ejercicio 02
Ejercicio 03
Ejercicio 04
Ejercicio 05
Ejercicio 06
Ejercicio 07
Modele con FSMs el siguiente protocolo “Acelerador de Peticiones”.
El acelerador media entre un cliente y dos servidores. En un escenario normal, el acelerador recibe la petición del cliente y lo envía a ambos servidores. La primera respuesta que reciba es la que enviará al cliente, ya que los dos servidores otorgan el mismo servicio, contestan indefectiblemente y devuelven exactamente el mismo resultado, pero uno puede ser más rápido que el otro en distintas situaciones. El acelerador luego se encarga de cancelarle la petición al otro servidor, para que no siga trabajando y asegurarse que no le responda. El cliente no puede hacer otra petición hasta que no reciba la respuesta del acelerador. El cliente nunca debe recibir una respuesta atrasada de una petición anterior. Suponer que no se pierden paquetes en ninguna comunicación.
FSM Cliente:
<graphviz> digraph G { // Config rankdir=LR; size="8,6"; node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=10]; // Estados Inicial; Esperando; // Transiciones Inicial->Esperando [label="Pedir!"]; Esperando->Inicial [label="ResponderCliente?"]; } </graphviz>
FSM Servidor i = {1,2}:
<graphviz> digraph G { // Config rankdir=LR; size="8,6"; node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=10]; // Estados Inicial; Procesando; // Transiciones Inicial->Procesando [label="PedirServidor?"]; Procesando->Inicial [label="Responder i!"]; Procesando->Inicial [label="Cancelar i?"]; } </graphviz>
FSM Acelerador:
<graphviz> digraph G { // Config //rankdir=LR; size="8,6"; node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=10]; // Transiciones Inicial->Pedido [label="Pedir?"]; Pedido->Enviado [label="PedirServidor!"]; Enviado->Respondio1 [label="Responder 1?"]; Enviado->Respondio2 [label="Responder 2?"]; Respondio1->Listo [label="Cancelar 2!"]; Respondio2->Listo [label="Cancelar 1!"]; Listo->Inicial [label="ResponderCliente!"]; } </graphviz>
Composicion:
Protocolo Acelerador de Peticiones = Acelerador || Servidor 1 || Servidor 2 || Cliente
Ejercicio 08
Modele mediante una FSM temporizada un semáforo con interruptor que presente las siguientes características:
- La luz verde dura 30 segundos.
- La luz amarilla dura 5 segundos.
- La luz roja dura a lo sumo 30 segundos.
- Si la luz roja ha estado prendida por más de 20 segundos y se oprime el interruptor, no se produce ningún efecto.
- Si la luz roja ha estado prendida a lo sumo 20 segundos y se oprime el interruptor, la luz cambia a verde en 10 segundos más.
- Si el interruptor es oprimido cuando la luz verde o amarilla está encendida, el semáforo lo ignora.
FSM Semaforo:
<graphviz> digraph G { // Config size="8,6" node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=11]; // Estados Verde [label="Verde\n[tVerde < 30]"]; AmarillaR [label="AmarillaRoja\n[tAmarillo < 5]"]; AmarillaV [label="AmarillaVerde\n[tAmarillo < 5]"]; RojaOprimido [label="RojaOprimido\n[tRojo < 10]"]; Roja [label="Roja\n[tRojo < 30]"]; // Oprimir Verde->Verde [label="Oprimir?"]; AmarillaR->AmarillaR [label="Oprimir?"]; AmarillaV->AmarillaV [label="Oprimir?"]; RojaOprimido->RojaOprimido [label="Oprimir?"] Roja->Roja [label="Oprimir?\n[tRoja > 20]"] Roja->RojaOprimido [label="Oprimir?\n[tRoja > 20]\n{tRoja}"] // Pasa tiempo AmarillaR->Roja [label="PasaARoja\n[tAmarillo = 5]\n{tRoja}"]; Roja->AmarillaV [label="PasaDeRoja\n[tRoja = 30]\n{tAmarilla}"]; RojaOprimido->AmarillaV [label="PasaDeRojaOprimido\n[tRoja = 10]\n{tAmarilla}"]; AmarillaV->Verde [label="PasaAVerde\n[tAmarillo = 5]\n{tVerde}"]; Verde->AmarillaR [label="PasaDeVerde\n[tVerde = 30]\n{tAmarilla}"]; } </graphviz>
FSM Interruptor:
<graphviz> digraph G { // Config size="10" node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=11]; // Grafo Boton; Boton->Boton [label="Oprimir!"]; } </graphviz>
Variables:
- tVerde: timer
- tAmarillo: timer
- tRojo: timer
Composicion:
Semaforo con Interruptor = Interruptor || Semaforo
Ejercicio 09
Ejercicio 10
Se desea modelar con FSM una simplificación de un teléfono celular que responde a la siguiente descripción:
El teléfono posee teclado, display numérico y una tapa que cubre el teclado. El teclado está formado por los botones 0 al 9, on, send, end y clear. El display puede mostrar hasta 8 dígitos. Se enciende al presionar on. La tecla clear borra todo el número ingresado. Una vez que se ingresó el número deseado, presionando send se inicia la conversación, la cual se mantiene hasta que se cierre la tapa, se presione end o se apague el teléfono con on. Al abrir la tapa, el número del display es el que figuraba al momento de cerrarla o apagar el teléfono.
Asuma cualquier aspecto del funcionamiento de este aparato que no esté explicado en el enunciado, documentando claramente lo que Ud. asuma.
FSM Teléfono Celular
<graphviz> digraph G { // Config size="8,6" node [style=rounded, fontname=Arial, fontsize=8]; edge [fontname=Arial, fontsize=9]; // Estados ApagadoCerrado [label="Apagado y\nCerrado"]; ApagadoAbierto [label="Apagado y\nAbierto"]; PrendidoAbierto [label="Prendido y\nAbierto"]; PrendidoCerrado [label="Prendido y\nCerrado"]; Hablando [label="Hablando"]; // Cambios de estado ApagadoCerrado->ApagadoAbierto [label="Abrir"]; ApagadoAbierto->ApagadoCerrado [label="Cerrar"]; ApagadoAbierto->PrendidoAbierto [label="On\n{i=0, n=0}"]; PrendidoAbierto->ApagadoAbierto [label="On"]; PrendidoAbierto->PrendidoCerrado [label="Cerrar"]; PrendidoAbierto->Hablando [label="Send"]; PrendidoCerrado->PrendidoAbierto [label="Abrir"]; Hablando->PrendidoAbierto [label="End"]; Hablando->PrendidoCerrado [label="Cerrar"]; Hablando->ApagadoAbierto [label="On"]; // Invalidos de Apagado y Abierto ApagadoAbierto->ApagadoAbierto [label="Clr"]; ApagadoAbierto->ApagadoAbierto [label="0"]; ApagadoAbierto->ApagadoAbierto [label="..."]; ApagadoAbierto->ApagadoAbierto [label="9"]; ApagadoAbierto->ApagadoAbierto [label="End"]; ApagadoAbierto->ApagadoAbierto [label="Send"]; // Invalidos de Hablando Hablando->Hablando [label="Clr"]; Hablando->Hablando [label="0"]; Hablando->Hablando [label="..."]; Hablando->Hablando [label="9"]; Hablando->Hablando [label="Send"]; // Invalidos de Prendido y Abierto PrendidoAbierto->PrendidoAbierto [label="0\n[i>8]"]; PrendidoAbierto->PrendidoAbierto [label="..."]; PrendidoAbierto->PrendidoAbierto [label="9\n[i>8]"]; // Validos de Prendido y Abierto PrendidoAbierto->PrendidoAbierto [label="0\n[i<=8]\n{n[i]=0, i++}"]; PrendidoAbierto->PrendidoAbierto [label="..."]; PrendidoAbierto->PrendidoAbierto [label="0\n[i<=8]\n{n[i]=9, i++}"]; PrendidoAbierto->PrendidoAbierto [label="Clr\n{i=1, n[]=0}"]; } </graphviz>
Variables:
- i:[1..8]
- n[1..8]:[0..9]
Ejercicio 11
(Hecho en clase)
Ejercicio 12
Ver [Link a PDF]
Ejercicio 13
Cansados de ver como continuamente se desvirtúa el mundialmente famoso "Piedra, Papel o Tijera", científicos de una sociedad secreta del sur de Suecia, se han puesto cómo objetivo formalizar el citado juego, cambiando algunas de sus reglas e introduciendo reglas nuevas.
Algunas de sus conclusiones son:
- El juego posee dos jugadores y un árbitro.
- Se juega al mejor de 3: el primer jugador en ganar dos partidas, gana el juego.
- La dinámica es manejada por el árbitro.
Cada partida se inicia cuando los tres (el árbitro y los 2 jugadores) gritan "Piedra", "Papel", "o Tijera". Entre cada una de las palabras, el árbitro y los jugadores toman acciones distintas:
- En el caso de los jugadores, agitan sus manos de alguna forma (usualmente de arriba hacia abajo, con el puño cerrado).
- En el caso del árbitro, grita una frase de aliento como "Vamos nene!", "Vos podés!", "Que no decaiga!", etc.
Inmediatamente después de decir "o Tijera”, cada uno de los jugadores debe hacer una elección entre alguno de los 3 elementos. El árbitro debe determinar el ganador de la partida según el siguiente criterio:
- Tijera le gana a Papel.
- Papel le gana a Piedra.
- Piedra le gana a Tijera.
En caso de compartir la elección, el resultado es empate y la partida se debe jugar nuevamente. Luego el árbitro indica a cada jugador si ganó o perdió y el que ganó ríe y el que perdió llora. Los jugadores no saben si ganan o pierden (es como si no vieran a su rival).
Si la competencia aún no terminó, el árbitro indica que se jugará una nueva partida. En caso de que la competencia haya terminado, el árbitro le indicará al jugador correspondiente, este gritará "Iuupiii!" y quedará listo para jugar una nueva competencia.
Formalice las conclusiones de los científicos, utilizando FSMs.
FSM Arbitro:
<graphviz> digraph G { // Config size="12,10"; node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=10];
// Estados Inicial->Comienzo [label="Nuevo Juego!"]; Comienzo->GritoPiedra [label="Piedra!"]; GritoPiedra->HagoPiedra [label="AlientoPiedra"]; HagoPiedra->GritoPapel [label="Papel!"]; GritoPapel->HagoPapel [label="AlientoPapel"]; HagoPapel->GritoTijera [label="Tijera!"]; GritoTijera->Eligieron [label="Muestra?"]; Eligieron->Comienzo [label="Empate!\n[elem1 = elem2]"]; Eligieron->Declarar [label="Gano 1!\n[gana(elem1,elem2)]\n{wins1++}"]; Eligieron->Declarar [label="Gano 2!\n[gana(elem2,elem1)]\n{wins2++}"]; Declarar->Inicial [label="Campeon 1!\n[wins1 = 2]\n{wins1 = wins2 = 0}"]; Declarar->Inicial [label="Campeon 2!\n[wins2 = 2]\n{wins1 = wins2 = 0}"]; Declarar->Comienzo [label="OtraPartida!\n[wins1 < 2 && wins2 < 2]"];
} </graphviz>
FSM Jugador i = {1,2}:
<graphviz> digraph G { // Config size="14,12"; node [style=rounded, fontname=Arial, fontsize=10]; edge [fontname=Arial, fontsize=10];
// Transiciones Inicial->Comienzo [label="Nuevo Juego?"]; Comienzo->GritoPiedra [label="Piedra?"]; GritoPiedra->HagoPiedra [label="MuevoManoPiedra i"]; HagoPiedra->GritoPapel [label="Papel?"]; GritoPapel->HagoPapel [label="MuevoManoPapel i"]; HagoPapel->GritoTijera [label="Tijera?"]; GritoTijera->Elige [label="ElijoPie i\n{elemi = pie}"]; GritoTijera->Elige [label="ElijoPap i\n{elemi = pap}"]; GritoTijera->Elige [label="ElijoTij i\n{elemi = tij}"]; Elige->Eligio [label="Muestra!"]; Eligio->Comienzo [label="Empate?"]; Eligio->Gane [label="Gano i?"]; Eligio->Perdi [label="Gano op(i)?"]; Gane->FinPartida [label="Rio i"]; Perdi->FinPartida [label="Lloro i"]; FinPartida->GaneCompetencia [label="Campeon i?"]; GaneCompetencia->Inicial [label="Grito Iupi"]; FinPartida->Inicial [label="Campeon op(i)?"]; FinPartida->Comienzo [label = "OtraPartida?"]; } </graphviz>
Variables:
- elem1: string
- elem2: string
- wins1: int
- wins2: int
Macros:
- gana(e1, e2) = (e1 = tij && e2 = pap) || (e1 = pap && e2 = pie) || (e1 = pie && e2 = tij)
- op(i) = i%2 + 1
Composicion:
PiedraPapelTijera = Arbitro || Jugador1 || Jugador2
Ejercicio 14
Ver Resuelto de Parcelas.