Universidad de Costa Rica
|
|
En esta tarea usted desarrollará un grupo de clases que sirven para hacer programas en forma similar a como se hacen cuando se sigue el paradigma de programación por eventos. Aunque las bibliotecas de programas para programación por eventos son un tanto más complicadas que la biblioteca que usted desarrollará, en esencia la programación por eventos consiste en utilizar, por lo menos, las siguientes reglas para construir programas:
Evento
, que se encapsula el acceso a esos
dispositivos.Evento
provee un método que
retorna un número que sirve para invocar al
procedimiento que debe usar el valor de entrada
recibido.Evento
sea una clase
abstracta, esto es, que ha sido diseñada para que el
programador
cliente derive de ella su clase específica.Evento
su propia clase, MiEvento
por ejemplo, que contiene un ciclo en el que se invoca el
método MiEvento::TRABAJE()
desde donde se
invocan todos los funciones de su aplicación. Para
correr su programa, el programador cliente debe redefinir el
método Evento::TRABAJE()
.
La interacción del usuario del usuario con el programa se
da a través del método
MiEvento::TRABAJE()
, que contiene un
instrucción switch
para invocar a las
funciones que componen el programa.
/* MiEvento.h ... */ // ... class MiEvento : public Evento { // ... virtual void TRABAJE(); bool Terminado(); }; /* Archivo.c++ ... */ //... void MiEvento::TRABAJE() { while (!Terminado()) { switch Evento::Escogencia() of { 1: Opcion_01 ( MensajeInt(1), MensajeStr(2) ); break; 2: Opcion_02 ( MensajeStr(1) ); break; default: Evento::Error("Entrada inválida"); } } } |
Los métodos Evento::MensajeInt(const int)
,
Evento::MensajeStr(const int)
, etc. retornan el valor
que el usuario del programa ha digitado, en formato de
número entero ("Int
"), hilera
("Str
"), o de otro tipo.
Para simplificar su trabajo, suponga que mediante las clases
Evento
y MiEvento
el programador cliente
puede desplegar un menú con las opciones disponibles.
También incluya un método virtual llamado
MiEvento::PreMenu(x,y,...)
, que será ejecutado
antes de desplegar el menú, el que el programador cliente
puede aprovechar para desplegar algunos mensajes o valores en las
coordenadas (x,y)
de la pantalla, después de
que el menú ha sido desplegado, pero antes de que el
usuario del programa pueda entrar datos.
CALCULADORA DE POLINOMIOS ========================= p1 = 25 x^2 + 3 p2 = 35 p1+p2 = 25 x^2 + 38 [1] p1 = 0 [2] p2 = 0 [3] p1 = 5 x^7 + x^2 + 4 [4] p2 = 12 x^3 + 4x^2 + 71 [5] p1 = -p1 [6] p2 = -p2 [7] Digitar valor para p1 [8] Digitar valor para p2 [+] Sumar p1+p2 [-] Restar p1-p2 [*] Multiplicar p1*p2 Escoga su opción [+] |
Su trabajo consiste en diseñar la clase
Evento
y usarla para implementar de nuevo el programa
de la lista parametrizable, que usted desarrolló en la
Tarea 6.
Luego de imprimir la documentación de su programa, y
entregarla en clase, envíe su trabajo a los
asistentes del curso por correo electrónico. Para
esto, haga un archivo empacado
.zip
cuyo nombre sea su número de carnet. Incluya en ese archivo
lo siguiente:
Evento
. Incluya el nombre
del compilador que usó.Evento
.MiEvento
para implementar de nuevo su programa
de la lista parametrizable.Después de la fecha de entrega del programa, puede usted instalar en su cuenta personal su solución (no instale antes su solución en Internet, pues en ese caso sería usted culpable de facilitar la copia de su trabajo, y en consecuencia se haría acreedor a la sanción respectiva).
|
From: Javier LoriaMe parece que el enunciado de la tarea está bastante bien.To: Adolfo Di Mare Subject: RE: Tarea de Eventos
Comentario (muy basado en la forma en que Windows resuelve el esquema de eventos):
class Evento { private: int numevento; public: virtual int Oportunidad(String Data); // Revisa si hay un evento del que monitorea (keypress???) // Si no hay un evento: Retorna -1 // Si hay Evento: Numero de Evento y Data. //.... }; class Manejador { public: int Numevento; // Numero de Evento que Maneja virtual int Manejador(String Data); // Funcion que maneja el evento // Retorna 0 si maneja el evento, -1 si no lo resuelve. // .... }; class PilaEventos { public: ... int RegistraEvento(Evento * OtroEvento); // Permite a una clase evento Registrarse. // Retorna -1: Error, 0+ Numero de Evento Registrado. int ManejaEvento(Manejador * OtroManejador); // Permite a un manejador Registrarse. // Retorna -1: Error, 0 Ok. private: void Oportunidad(void); // Barre los eventos registrador y la de la oportunidad EVENTO // de generar el suyo. // en DOS tambien invoca a los posibles manejadores. };
La idea que yo trataría de fomentar es SEPARAR EL DISPARADOR DEL MANEJADOR. Aparte de que puede haber varios manejadores de un mismo evento. Un ejemplo sería agregar un manejador que use sólo los números y otro para las demás teclas. En Window sería el área donde se hace click.
Disculpas si el C++ es feo o tiene errores de sintáxis, pero ya se me está herrumbrando...
Adolfo Di Mare <adolfo@di-mare.com>.
|