Pista* Semaforo::passaCarro() { Carro* carro = pistaLocal->primeiro(); int pistaEscolhida = calculaProbabilidade(carro); Pista* proxima = pistas->retornaDado(pistaEscolhida); if (!aberto) { throw ExcecaoSinalVermelho(); } if (!proxima->estaCheia(carro)) { pistaLocal->removeCarro(); proxima->adicionaCarro(carro); return proxima; } proxima = pistaLocal; return proxima; }
/* Método passaCarro. * Este método será responsável por fazer um carro passar pelo semáforo, adicionando-o em outra fila (outra pista) e * removendo o mesmo da fila atual. * @see FilaEnc::primeiro * @see calculaProbabilidade * @see estaCheia * @see removeCarro * @see adicionaCarro * @exception ExcecaoSinalVermelho Se o sinal estiver vermelho o carro não poderá passar para outra pista. * @return proxima Retornará qual será a próxima pista em que o carro estará. */ Pista* passaCarro() { Carro* c = pistaLocal->primeiro(); int pistaEscolhida = calculaProbabilidade(c); Pista* proxima = pistas->mostra(pistaEscolhida); if(isAberto()) { if (!proxima->estaCheia(c)) { pistaLocal->removeCarro(); proxima->adicionaCarro(c); return proxima; } else { proxima = pistaLocal; } } else { throw ExcecaoSinalVermelho; } return proxima; }