PUCRS, FACIN/FENG, Engenharia da Computação, semestre 2007/2
Profs. Eduardo Bezerra (T. 490) e Marcelo Cohen (T. 590)
Laboratório de Programação II
Trabalho Prático 2 - Simulação de Elevadores
Descrição Geral do Problema
Este trabalho, que deverá ser feito individualmente ou em duplas, consiste em modelar e implementar uma simulação de um prédio com elevadores e pessoas. A simulação funciona da seguinte forma:
- Dentro do prédio, existem pessoas. Cada pessoa pode estar em um dos 3 estados: sem fazer nada (IDLE), esperando um elevador (WAITING) ou dentro de um elevador (INLIFT)
- Cada elevador pode estar em um dos seguintes estados: parado, subindo ou descendo.
- Em cada andar, há uma certa quantidade de pessoas - ao iniciar o programa, o andar de cada pessoa é sorteado e o seu estado inicial deve ser IDLE
- A cada instante de tempo, podem ocorrer mudanças de estado nas pessoas e nos elevadores - sorteados ou não, dependendo da situação
O estado das pessoas pode mudar da seguinte forma:
- Se a pessoa estiver sem fazer nada (IDLE), ela pode decidir chamar um elevador ou não - essa decisão deve ser sorteada. Se decidir pela chamada, então o andar de destino também deve ser sorteado, e não pode ser o mesmo onde ela está. Nesse caso, o estado da pessoa deverá mudar para espera (WAITING).
- Se a pessoa estiver esperando um elevador (WAITING) e houver um elevador no andar, ela deverá entrar nele e o seu estado deverá mudar para dentro do elevador (INLIFT).
- Se a pessoa estiver dentro do elevador (INLIFT) e ele chegar no andar desejado, a pessoa deverá sair do elevador e voltar ao estado sem fazer nada (IDLE).
O estado dos elevadores pode mudar da seguinte forma:
- Se o elevador estiver parado e não houver chamadas, ele deverá continuar parado.
- Se o elevador estiver parado e houver uma chamada em algum andar, ele deverá se dirigir a esse andar. Idealmente, o elevador deverá atender primeiro as chamadas em andares mais altos.
- Se o elevador estiver em movimento e passar por um andar onde foi chamado, deverá parar.
É importante observar que é responsabilidade do prédio decidir qual elevador chamar. No exemplo fornecido, a lógica implementada é a seguinte:
- Se houver algum elevador no andar de chamada, nada acontece pois o elevador já está no local.
- Se houver algum elevador em movimento e vindo para o andar de chamada, usa este.
- Se houver algum elevador parado em outro andar, usa este.
- Se não houver nenhum elevador nesses casos, sorteia um deles para atender a chamada.
Aspectos Técnicos
O simulador funciona através da passagem de tempo, realizada pelo pressionamento de uma tecla. Não é necessário simular o relógio real. Devem ser exibidas na tela as seguintes informações (parte disso já é realizada pelo código de exemplo):
- Estado de cada um dos elevadores (andar atual, velocidade atual, quantidade de pessoas, chamadas existentes)
- Estado de cada andar (nome e andar de destino de cada pessoa)
Foi fornecido um código de exemplo, contendo a estrutura de classes sugerida, descrita a seguir:
- Pessoa (.h e .cpp) - Classe Pessoa, representa uma pessoa na simulação.
- Predio (.h e .cpp) - Classe Prédio, contendo uma lista de andares e de elevadores. O prédio é responsável pelo controle dos elevadores.
- Andar (.h e .cpp) - Classe Andar, contendo a lista de pessoas em um andar.
- Elevador (.h e .cpp) - Classe Elevador, contendo a lista de pessoas dentro de um elevador.
- InterfaceGrafica.cpp - Classe InterfaceGrafica, contendo o programa principal, que instancia um prédio e acrescenta pessoas nele. No exemplo, o andar das pessoas não é sorteado.
- InterfaceTexto.cpp - Classe InterfaceTexto, contendo o programa principal sem usar a interface gráfica (opcional).
- GL (.h e .cpp) - classes auxiliares para interface com a biblioteca OpenGL.
- Texture (.h e .cpp) - classes auxiliares para interface com a biblioteca OpenGL.
- Interface.h - define se o programa deve utilizar biblioteca gráfica ou não.
- diagrama_classes.jpeg - diagrama de classes da implementacao exemplo.
- elevadores.jpg - exemplo de tela do simulador.
Além disso, são fornecidos dois arquivos Makefile: um para compilar com a interface gráfica (Makefile) e outro para compilar a versão em modo texto (Makefile.texto). Para compilar em modo texto, comente a linha #define no arquivo Interface.h
Instalação das Bibliotecas
A biblioteca OpenGL normalmente já está presente nas distribuições Linux e no Windows. Porém, devem ser instalados os pacotes de desenvolvimento, como segue:
Fedora:
- yum install freeglut-devel libjpeg-devel
Ubuntu:
- sudo apt-get install freeglut-dev libjpeg62-dev
Gentoo:
- Possivelmente: emerge freeglut
Windows (DEV-C++)
- Usar gerenciador de pacotes e instalar freeglut e libjpeg, ou:
- Fazer o download em http://www.nigels.com/glt/devpak/
Avaliação
Devem ser explorados os conceitos de herança e polimorfismo na classe Elevador. Essa classe deverá possuir no mínimo duas implementações diferentes. Por exemplo, um elevador que não pare se houver chamadas em vários andares durante a subida, somente durante a descida. Portanto, a classe Elevador deverá ser abstrata e pelo menos duas outras classes derivadas devem ser criadas a partir dela. Será necessário também alterar o construtor do prédio, de forma que existam alguns elevadores de cada classe.
O código-fonte deve estar adequadamente comentado (nas suas partes/algoritmos principais, pelo menos) e no seu início deve haver um comentário com o nome do(a) aluno(a).
O arquivo elevator_work.zip contém o esqueleto das classes descritas anteriormente, bem como um programa executável para Linux (elevator_completo), que demonstra como é o funcionamento do simulador completo (mas sem polimorfismo).
Para executá-lo, é preciso primeiro digitar o seguinte comando no terminal:
chmod u+x elevador_completo
Depois, basta digitar ./elevator_completo
Apresentação
O trabalho será apresentado no laboratório. Durante a apresentação, o(a) aluno(a) (ou dupla) deve estar apto a responder quaisquer perguntas. Respostas insatisfatórias ou a ausência do(a) aluno(a) (ou dupla) acarretarão em anulação da nota final.
No momento da apresentação, cada aluno(a) ou dupla já deverá ter submetido um arquivo .zip para o professor da disciplina no email Eduardo.Bezerra @ pucrs.br, contendo os códigos-fonte (.cpp e .h) e o Makefile, se for o caso. O zip deverá ser nomeado da seguinte forma: nome_sobrenome.zip. Se for uma dupla, usar a forma sobrenome1_sobrenome2.zip
Sera' avaliada tambem a escolha dos nomes dos arquivos e classes, conforme estudado em aula.Também deve ser entregue uma folha, contendo o diagrama de classes do sistema (legível).
O programa deverá ser executado no sistema operacional Linux. Não serão aceitos trabalhos que não compilem corretamente no g++, sob hipótese nenhuma.
Todos os trabalhos deverão ser entregues até o dia da apresentação, e apresentados na data marcada - não serão aceitos trabalhos fora do prazo.
Trabalhos copiados, inclusive entre turmas, resultarão em nota zero para todos os alunos envolvidos. Será utilizado o MOSS para identificação de situações de plágio.