FACULDADE DE INFORMÁTICA - PUCRS
4612A-04 PROGRAMAÇÃO PARA ENGENHARIA II
TRABALHO I
T 490
ENTREGA: 27/09/2004
PROF.: Carlos A. Prolo
GRUPOS DE até 2 alunos
Neste trabalho você vai definir e testar uma classe CRUZAMENTO que modela as sinaleiras envolvidas em um
cruzamento simples de rua com sinaleiras para carros e para pedestres. O objeto da classe cruzamento contém duas
sinaleiras para carros, sincronizadas e duas sinaleiras para pedestres. Desta forma, você vai precisar definir também
uma classe para sinaleira de carro e outra para sinaleira de pedestres, conforme abaixo. Cada sinaleira contém
entre outras coisas três lâmpadas, ou seja, você vai precisar definir também uma classe para lâmpada. Seguem as
definições informais de cada classe envolvida
1. Implemente uma classe LAMPADA para modelar uma lâmpada, que pode estar acesa, apagada ou queimada.
A classe deverá ter um único construtor default que inicializa a lâmpada no estado “apagada” (suponha que
a lâmpada nunca está queimada quando é criada). A classe deverá ter métodos para ligar a lâmpada, desligar
a lâmpada, verificar o estado da lâmpada (acesa ou apagada – naturalmente a lâmpada não lhe diz que esta
queimada). A classe deverá ter também uma função “queima” que a coloca como queimada (óbvio que isto é
uma simplificação. Normalmente o processo de queima seria modelado de modo bem mais complexo, como
uma variável aleatória dependente do tempo de uso).
2. Implemente uma classe SEMAFORO para modelar sinaleiras de rua de três fases para carros. A sinaleira pode
estar em verde, amarelo, vermelho ou pode estar desligada. Aliás, a classe deverá conter três objetos do tipo
lâmpada (uma vermelha, uma verde e uma amarela) que acendem alternadamente quando a sinaleira estiver
ligada. (O objeto semáforo poderá (deverá?) conter uma variável interna que controla quando acender/apagar
cada lâmpada. Esta variável pode assumir quatro valores, representando o sinal verde, vermelho ou amarelo,
ou ainda o fato de a sinaleira estar desligada.)
Quando ligada a sinaleira armazena a quantos segundos está na fase (cor) atual. A sinaleira também tem
informação de quantos segundos dura cada fase.
A classe tem um construtor com tem três parâmetros com o tempo de duração de cada fase (se quiser crie
também um construtor default que arbitra que os tempos de vermelho, verde e amarelo são respectivamente
30, 25 e 5 segundos, por exemplo). Em ambos os casos a sinaleira é inicializada como desligada. A classe
deve ter uma função liga(f) que a coloca em uma das fases (indicada pelo parâmetro f) com timer zerado e
uma desliga(). Deve ter uma função tick() que avisa à sinaleira que passou um segundo. A classe deve ter
um método show que mostra de alguma forma o estado (acesa ou apagada) de cada uma das três lâmpadas
conjuntamente. Atenção para a dinâmica de funcionamento: cada vez que for executado um tick(), esta função
incrementa o tempo em que o semáforo está na fase corrente, e ao atingir o tempo de duração da fase corrente,
a fase deve mudar para a próxima.
3. Implemente uma classe SEMAFOROPED para modelar sinaleiras para pedestre com apenas duas fases. Aqui
você ficou com preguiça e vai implementar esta classe como derivada da classe do item acima.
4. Finalmente a classe CRUZAMENTO contém duas sinaleiras de cada, o objeto é inicializado como desligado,
e quando ligado coloca todo o sistema em um estado estável qualquer. O cruzamento tem um construtor que
indica os tempos de verde, vermelho e amarelo de um dos semáforos para carro, e todo o resto é calculado a
partir disto. O cruzamento também tem o método tick() que quando chamado indica passagem de um segundo
e a função show que mostra o estado de todos os 4 semáforos ( 4 grupos de lâmpadas ). Para simular a
catástrofe você vai também incluir uma função para quebrar uma lâmpada de algum dos semáforos, hehe ...
Você deverá construir uma main que declara um CRUZAMENTO e o mostra em funcionamento. Por exemplo,
você pode entrar em um loop que em cada passo aciona o método tick() do cruzamento e espera 1 segundo (use
a função sleep (x) da biblioteca unistd.h que espera x segundos antes de prosseguir ou usleep(x) que espera x
microssegundos - veja "man sleep"e "man usleep"no unix). "Quebre/queime"uma lâmpada num dado momento e
prossiga com o teste.
INFORMAÇÔES GERAIS: O trabalho deve ser feito preferencialmente em Linux. O grupo deve entregar as
listagens dos códigos fontes dos programas feitos com identificação dos componentes do grupo, mais um documento
descrevendo as classes, procedimento de teste, como compilar e como executar. Além dos documentos impressos
deverá ser entregue um diskette com programas e documentos. Todo o material (documentos, listagens, diskette)
deverá estar identificado com o nome do(s) componente(s) do grupo (máximo 2).
IMPORTANTE: Em caso de fraude acadêmica (cópia de trabalho) será atribuído grau zero aos envolvidos.
Programas que não compilarem ou não rodarem também serão desconsiderados.
Download

Trabalho 1 da Disciplina