PRÁCTICA Nº 3: 1 sesión
(Semana del 27 de marzo al 31 de marzo de 2000)
Simulación de un solitario elemental
0. OBJETIVOS
1. Especificación de Los Tipos de datos relacionados con la baraja
En primer lugar escribiremos una pequeña unidad donde especificaremos el tipo Valor que utilizaremos en pilas y colas. La unidad se llamará U_Tipo y contendrá básicamente las definiciones de tipos y constantes que utilizaremos en las unidades y en el programa principal. Estos tipos y constantes son los siguientes:
UNIT
U_Tipo;
INTERFACE
Const
NumPalos = 4;
CartasPorPalo = 12;
Type
Palo = 1..NumPalos;
Numero = 1..CartasPorPalo;
Carta = Record
PaloCarta: Palo;
NumCarta: Numero;
End;
Valor = Carta;
IMPLEMENTATION
BEGIN
END.
2. ESPECIFICACION DE LA ESTRUCTURA DE DATOS "COLA".
La segunda tarea de esta práctica consiste en escribir dos unidades "UPiCov" y "UPiCop" en las que tendremos la implementación de la estructura de datos Pila que hicimos en la práctica número 2 y en la que adjuntaremos ahora la correspondiente a la estructura de datos "Cola", representada mediante vectores en la unidad "UPiCov" y mediante punteros en la unidad "UPiCop".
La unidad relacionada con Arrays tendrá la siguiente cabecera:
UNIT
UPiCov;
INTERFACE
Uses
U_Tipo;
Const
MAX = NumPalos * CartasPorPalo + 1;
Type
Pila = Record
Info: Array[1..MAX] of Valor;
Cima: 0..MAX
End;
Cola = Record
Info: Array[1..MAX] of Valor;
Ini, Fin: 0..MAX;
End;
Procedure Crear_Pila ( Var sta: Pila );
Function Pila_Vacia ( sta: Pila ): Boolean;
Function Apilar ( Var sta: Pila; x: Valor ): Boolean;
Function Desapilar ( Var sta: Pila ): Boolean;
Function Cima_Pila ( sta: Pila; var x: Valor ): Boolean ;
Procedure Crear_Cola ( Var que: Cola );
Function Cola_Vacia ( que: Cola ): Boolean;
Function Encolar ( Var que: Cola; x: Valor ): Boolean;
Function Desencolar ( Var que: Cola ): Boolean;
Function Primero_Cola ( que: Cola; Var x: Valor ): Boolean;
IMPLEMENTATION
{* Escribir el código de las operaciones anteriores, las de Pilas representadas
mediante vectores ya las tenemos, así que sencillamente las tendremos que adjuntar
aquí. Nos queda por implementar las primitivas correspondientes a las Colas. Hay que
tener en cuenta que vamos a trabajar con una cola circular, por lo que
implementaremos la función Siguiente, tal y como se ha explicado en clase. *}
BEGIN
END.
La unidad relacionada con Punteros tendrá la siguiente cabecera:
UNIT
UPiCop;
INTERFACE
Uses
U_Tipo;
Type
Ptro = ^Nodo;
Nodo = Record
Info: Valor;
Sig : Ptro;
End;
Pila = Record
Cima: Ptro;
End;
Cola = Record
Ini, Fin: Ptro;
End;
Procedure Crear_Pila ( Var sta: Pila );
Function Pila_Vacia ( sta: Pila ): Boolean;
Function Apilar ( Var sta: Pila; x: Valor ): Boolean;
Function Desapilar ( Var sta: Pila ): Boolean;
Function Cima_Pila ( sta: Pila; var x: Valor ): Boolean ;
Procedure Crear_Cola ( Var que: Cola );
Function Cola_Vacia ( que: Cola ): Boolean;
Function Encolar ( Var que: Cola; x: Valor ): Boolean;
Function Desencolar ( Var que: Cola ): Boolean;
Function Primero_Cola ( que: Cola; Var x: Valor ): Boolean;
IMPLEMENTATION
{* Escribir el código de las operaciones anteriores, las de Pilas mediante punteros ya
las tenemos, así que sencillamente las tendremos que adjuntar aquí. Nos queda por
implementar las primitivas correspondientes a las Colas representadas mediante
punteros. *}
BEGIN
END.
3. REALIZACION DE UN PROGRAMA QUE SIMULE UN SOLITARIO ELEMENTAL
Vamos a simular un solitario muy elemental, pero que hará que nos familiaricemos con los subprogramas que hemos implementado en las unidades.
Se trata de simular una baraja española (4 palos, 12 cartas por palo) que tras barajarla la disponemos en una cola. Además, tenemos cuatro pilas, una por cada palo, en las que iremos apilando las cartas en orden ascendente, En cada paso se examina la primera carta de la cola y se desencola; si se puede apilar en alguna de las pilas, la apilamos, en caso contrario la volvemos a encolar. En cada momento estaremos al tanto del número de cartas examinadas y de las que ya llevamos apiladas.
Para facilitar el diseño y la implementación, ofrecemos algunas guías que, por otra parte, será muy conveniente utilizar.
Program Solitario ( Input, Output );
Uses
Crt, U_Tipo, UPiCo(?);
Const
TotalCartas = NumPalos * CartasPorPalo; {* definidos en la unidad *}
Type
Indice = 1..TotalCartas;
{* Especificamos una baraja como un array de Cartas *}
Baraja = Array[Indice] of Carta;
{* Creamos el tipo Mazos, que representa las cuatro pilas de cartas *}
Mazos = array[1..NumPalos] of Pila
Deberemos implementar, primeramente tres subprogramas:
1. Procedure Inicia_Baraja ( Var bar: Baraja );
Que simule el disponer en ‘bar’ la baraja completa y ordenada.
2. Procedure Mezclar_Baraja ( Var bar: Baraja );
Que simule el hecho de mezclar (barajar) las cartas de la baraja. Nos ayudaremos de la función random, que como sabéis sirve para generar números al azar.
Una forma de conseguir barajar las cartas podría ser la siguiente:
Primero elegimos un número al azar entre el 1 y el 48 (el total de cartas), escogemos la carta elegida y la intercambiamos con la primera, después elegimos un número entre el 2 y el 48, la elegida la intercambiamos con la segunda y así sucesivamente hasta tener todas las cartas "mezcladas".
3. Function Encola_Baraja ( Var que: Cola; bar: Baraja ): Boolean;
Que encola la baraja recibida en una cola de cartas. Si ocurre algún error, devolverá FALSE.
El programa principal empezará iniciando y mezclando una baraja y encolándola en una cola de cartas.
A continuación se mostrará la cola de cartas a través de una función que mostrará toda la información contenida en la cola de cartas y el estado de las cuatro pilas que al principio estarán vacías por pantalla.
Function Muestra_Cola_Cartas( Var que: Cola ): Boolean;
Function Muestra_Pilas_Cartas ( maz: Mazos ): Boolean;
Tras ello, se entrará en un bucle que esperará la pulsación de una tecla. Si el usuario pulsa ESC se finaliza el programa, en caso contrario se ha de examinar la primera carta de la cola y si se puede apilar se apilará en la pila adecuada, en caso contario se encola de nuevo en la cola de cartas. Una vez hecho esto se vuelve a mostrar la cola de cartas y las cimas de las cuatro pilas, así como el total de cartas examinadas y el número de cartas que ya se han conseguido apilar. De esta forma, la cola irá menguando de tamaño conforme se van apilando las cartas en los mazos correspondientes
Si se termina el solitario se finaliza el programa.
Una pregunta difícil, sólo para los que les gusta pensar y que no se tendrá en cuenta en la evaluación del programa: ¿Cuántas cartas por termino medio se han de examinar antes de finalizar el solitario?. Dejad que el programa realice sólo el solitario varias veces e intentar encontrar al menos una respuesta empírica.
3. Entrega de programas
Al finalizar la sesión se entregarán las unidades U_Tipo.pas, UPiCov.pas y UPiCop.pas, junto con el programa principal solit.pas
NOTA:
Se recuerda a los alumnos que las normas de corrección siguen vigentes y que por lo tanto se tendrán en cuenta a la hora de evaluar la práctica. Uno de los puntos es la presentación correcta de las prácticas siguiendo la Guía de Estilo de Pascal.Recordar también la necesidad de entregar una hoja con las tareas que se van a realizar en la práctica para poder acceder al laboratorio.
ENTREGA DE PROGRAMAS: Al finalizar la sesión de prácticas correspondiente.