Professional Documents
Culture Documents
Escola de Comunicação, Artes e Ciências da Informação
Licenciaturas em Engenharia Informática e em Informática de Gestão
Este
é
enunciado
do
trabalho
de
final
da
unidade
curricular
(UC)
de
Fundamentos
de
Programação
(FP)
dos
cursos
de
licenciatura
em
Engenharia
Informática
e
Informática
de
Gestão
da
Universidade
Lusófona
de
Humanidades
e
Tecnologias
(ULHT),
Lisboa,
para
o
ano
lectivo
2010/2011.
Sendo
esta
a
UC
de
Fundamentos
de
Programação,
e
tendo
sido
a
linguagem
Java
a
escolhida,
numa
abordagem
de
programação
imperativa,
é
natural
que
se
tenha
particular
atenção
à
forma,
estilo,
legibilidade
e
qualidade
da
documentação
do
projecto.
Siga
as
indicações
do
enunciado
e
veja
no
final
a
grelha
de
classificação.
O
trabalho
poderá
ser
realizado
em
grupos
de
até
3
alunos,
no
entanto
a
avaliação
será
presencial
e
individual.
Alunos
não
avaliados
terão
classificação
0.
O
trabalho
deverá
ser
submetido
na
plataforma
de
e‐learning
até
às
23.30h
do
dia
17
de
Janeiro
de
2011.
Lisboa, Dezembro de 2010
O
Simulador
da
Máquina
de
Venda
Automática
Pretende‐se
construir
um
programa
em
Java
que
simule
uma
máquina
de
venda
automática
de
produtos
(máquina
de
vending,
veja‐se
a
Figura
1).
O programa deverá fazer uso dos seguintes conceitos (entre outros):
• Leitura
e
escrita
de
ficheiros
(de
texto
ou
outros)
• Uso
de
vectores
de
números
e
de
vectores
de
Strings
(arrays)
• Uso
de
programação
estruturada
(diferentes
funções,
definidas
de
acordo
com
o
que
é
esperado
que
o
programa
faça)
• Uso
de
técnicas
de
programação
que
demonstrem
a
capacidade
do
aluno
em
escrever
código
legível
e
funcional,
bem
documentado
(incluindo
JavaDoc)
• Favorecimento
do
uso
de
variáveis
locais
em
detrimento
das
variáveis
globais
O
enunciado
do
trabalho
é
extenso,
mas
apenas
porque
se
optou
por
dar
uma
grande
variedade
de
exemplos
relativos
ao
funcionamento
que
se
pretende
do
programa.
No
entanto
note,
não
estão
ilustrados
todos
os
casos
de
uso!
As
situações
que
não
estiverem
ilustradas
devem
ser
resolvidas
por
si
autonomamente.
Em caso de dúvidas, consulte com o seu professor das aulas práticas.
Bom trabalho!
Nuno M. Garcia, Novembro de 2010.
Versão
1.1
–
correcção
de
múltiplas
definições
de
nomes
de
ficheiros,
simplificação
do
processo
de
entrada
de
senha,
inclusão
da
parte
A0
(existe
texto
riscado
no
enunciado
que
deixa
de
ser
considerado).
1
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
Figura 1 – uma máquina de venda automática de produtos e o seu moedeiro de trocos.
O
programa
terá
um
único
interface
com
o
qual
os
vários
tipos
de
utilizadores
(cliente,
gestor)
interagirão,
quer
para
comprar
produtos,
quer
para
fazer
a
gestão
da
máquina.
Inicialmente,
a
máquina
encontra‐se
desligada.
Quando
o
utilizador
emite
a
ordem
de
ligar
(escrevendo
LIGAR)
na
linha
de
comando,
a
máquina
deve
responder
com
o
seguinte
aviso
Durante
este
momento,
a
máquina
deve
ler
os
ficheiros
de
configuração,
por
exemplo,
os
ficheiros
com
o
nome
de
PRODUTOS.TXT
e
MOEDEIRO.TXT
de
onde
carrega
as
definições
dos
produtos
que
pode
vender,
e
as
moedas
de
que
dispõe
no
moedeiro
para
fazer
os
trocos.
Veja
uma
lista
completa
dos
ficheiros
do
programa
na
parte
A0
deste
enunciado.
Atenção, a máquina pode dar erro quando arranca! Veja a parte A1 deste enunciado.
A
máquina
pode
vender
até
20
produtos,
dispostos
numa
matriz
de
5
linhas
e
4
colunas.
Cada
uma
destas
posições
da
matriz
contém
zero
ou
mais
itens
de
produtos
para
vender
(ver
Figura
2).
Depois
de
fazer
a
carga
dos
conteúdos
dos
ficheiros
iniciais
para
o
programa,
a
máquina
deve
exibir
um
ecrã
semelhante
ao
que
se
exemplifica
a
seguir
(Figura
3).
2
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M5 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > _
Figura
3
–
Exemplo
do
estado
inicial
do
arranque
da
máquina.
No
exemplo
da
Figura
3,
na
posição
a1
estão
disponíveis
5
produtos
“S”
e
na
posição
d2
estão
disponíveis
5
produtos
“M”.
As
posições
d1,
b2,
e
b4,
por
exemplo,
não
têm
produtos.
A
máquina
ainda
avisa
que
há
trocos
disponíveis
e
que
está
pronta
para
aceitar
um
comando.
Assim, se escrevermos o comando d2, a máquina deve responder:
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M5 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > d2
produto na posição d2: Mini-chocolate. Preço: 0.70€
Agora,
se
quisermos
comprar
o
produto,
basta
“introduzirmos”
as
moedas
e
de
novo
seleccionar
o
produto.
Veja
o
exemplo
da
Figura
5.
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M5 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > d2
produto na posição d2: Mini-chocolate. Preço: 0.70€
3
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
Repare
que
no
exemplo
anterior,
existe
a
tentativa
de
introduzir
uma
moeda
de
0.30€,
que
correntemente
não
existe.
A
máquina
deve
dar
um
erro
quando
o
utilizador
tentar
utilizar
moedas
que
não
existam,
ou
moedas
de
0.02€
ou
de
0.01€.
Logo,
os
preços
dos
produtos
devem
ser
definidos
como
múltiplos
de
5
cêntimos,
isto
é,
não
poderá
definir
um
produto
cujo
preço
seria,
por
exemplo,
0.73€.
Se
durante
o
processo
de
introduzir
uma
moeda
na
máquina,
o
utilizador
emitir
um
comando
não
autorizado,
a
máquina
deve
exibir
uma
mensagem
de
erro,
devolver
o
dinheiro
ao
utilizador
e
voltar
ao
estado
anterior.
Veja
o
exemplo
da
figura
6.
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M5 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > d2
produto na posição d2: Mini-chocolate. Preço: 0.70€
trocos disponíveis
Qual o comando? >
Figura
6
–
exemplo
de
venda
anulada
pela
introdução
de
um
comando
errado.
No
caso
do
exemplo
da
figura
5,
a
máquina
deveria
esperar
um
tempo
curto
(ver
parte
A2
do
enunciado),
e
mostrar
novo
ecrã
de
venda.
Como
a
venda
da
figura
5
foi
bem
sucedida,
a
máquina
deveria
mostrar
o
seguinte
(Figura
7):
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M4 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > _
Figura
7
–
Exemplo
do
estado
inicial
do
arranque
da
máquina.
Note que o anteriormente o produto na posição d2 mostrava “M5” e agora mostra “M4”.
4
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
No
entanto,
uma
venda
pode
correr
mal.
Veja
a
parte
A3
deste
enunciado.
Regressemos
ao
exemplo
da
venda.
Isto
é
o
que
deve
acontecer
se
o
utilizador
não
introduzir
dinheiro
suficiente
para
comprar
o
produto,
e
decidir
depois
anular
a
venda
(Figura
8).
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M5 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > d2
produto na posição d2: Mini-chocolate. Preço: 0.70€
Também
neste
caso,
a
máquina
deverá
esperar
um
tempo
curto
(ver
parte
A2
do
enunciado),
e
mostrar
novo
ecrã
de
venda.
Outro
dos
casos
possíveis
é
a
máquina
ficar
sem
os
trocos
necessários
para
poder
fazer
a
venda.
Imagine
que
quer
comprar
o
produto
d2
mas
que
a
máquina
já
não
possui
internamente
no
seu
moedeiro,
nenhuma
moeda
nem
de
0.05€
nem
de
0.10€.
Veja
a
figura
9.
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M5 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
Repare
que
neste
caso,
a
máquina
dá
duas
opções,
ou
continua
a
venda
pelo
valor
que
o
utilizador
lhe
forneceu,
ou
permite
que
o
utilizador
receba
o
seu
dinheiro
de
volta.
Note
ainda
que
quando
a
máquina
tem
um
dos
dispensadores
de
moedas
vazio,
escreve
“trocos
disponíveis
(limitado)”.
Em
qualquer
um
dos
casos
(venda
feita
com
5
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
preço
mais
caro,
ou
venda
anulada)
o
programa
deve
registar
este
acontecimento
num
ficheiro
de
Logs
(veja
mais
à
frente,
na
parte
de
Gestão
da
Máquina).
O
Moedeiro
da
máquina
As
máquinas
de
venda
automática
possuem
dois
moedeiros
internos.
Um
deles
consiste
numa
caixa
de
metal
com
uma
abertura
superior
e
acesso
através
de
uma
chave,
e
serve
para
receber
as
moedas
de
1€
e
de
2€
que
são
introduzidas,
bem
como
as
outras
moedas
que
já
não
cabem
no
moedeiro
dos
trocos.
Este
moedeiro
de
depósito
está
vazio
quando
a
máquina
arranca.
O
outro
moedeiro
é
o
moedeiro
dos
trocos
(ver
Figura
1).
Este
moedeiro
possui
4
tubos
onde
são
armazenadas
as
moedas
de
0.05€,
0.10€,
0.20€
e
0.50€.
Quando
o
utilizador
introduz
uma
moeda
destas,
ela
vai
para
o
moedeiro
dos
trocos,
se
este
ainda
não
tiver
cheio,
senão,
a
moeda
vai
para
o
moedeiro
de
depósito.
Quando
um
utilizador
tem
a
receber
troco,
o
moedeiro
dos
trocos
dá
as
moedas
que
o
utilizador
vai
receber.
O
conteúdo
do
moedeiro
dos
trocos
está
armazenado
no
ficheiro
inicial
MOEDEIRO.TXT.
Veja
o
exemplo
do
ficheiro
MOEDEIRO.TXT
abaixo
(Figura
10).
5
10
12
15
Figura
10
–
exemplo
do
conteúdo
do
ficheiro
MOEDEIRO.TXT.
Isto
significa
que,
quando
a
máquina
arranca,
o
moedeiro
tem
5
moedas
de
0.50€,
10
moedas
de
0,20€,
12
moedas
de
0,10€
e
15
moedas
de
0.05€.
A
capacidade
dos
moedeiros
também
varia.
A
capacidade
dos
moedeiros
está
definida
no
ficheiro
CAPMOEDEIRO.TXT.
Veja
o
exemplo
na
Figura
11.
20
30
40
50
Figura
11
–
exemplo
do
conteúdo
do
ficheiro
MOEDEIRO.TXT.
No
caso
do
exemplo
acima,
o
moedeiro
tem
capacidade
para
20
moedas
de
0.50€,
30
moedas
de
0,20€,
40
moedas
de
0,10€
e
50
moedas
de
0.05€.
Atenção, o moedeiro pode avariar. Veja detalhes na parte A4 deste enunciado.
No
final
da
execução
do
programa,
e
após
o
utilizador
emitir
o
comando
DESLIGAR,
a
máquina
deve
escrever
os
ficheiros
relevantes
no
disco
rígido
e
terminar
o
programa.
Veja
o
exemplo
da
figura
12.
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M4 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > DESLIGAR
MÁQUINA A DESLIGAR, FICHEIROS ESCRITOS.
Figura
12
–
Exemplo
do
encerramento
da
máquina.
6
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
O
modo
de
gestão
da
máquina
A
máquina
tem
um
modo
de
gestão.
Este
modo
de
gestão
é
acedido
quando
o
utilizador
introduz
o
comando
“GERIR”
na
linha
de
comandos
da
máquina.
O
utilizador
deve
introduzir
uma
senha
de
acesso,
sem
a
qual
o
programa
volta
ao
modo
normal
de
venda
(Figura
3).
Veja
o
exemplo
do
processo
de
entrada
no
modo
de
gestão
na
Figura
13.
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M4 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
Qual o comando? > GERIR
Acesso ao modo de gestão.
Insira a senha de acesso: ULHTFP1011
Acesso permitido.
Note‐se que o menu tem 10 opções. Vamos agora defnir o que faz cada uma das opções de gestão.
A
opção
1
e
2
fazem
uma
listagem
do
número
de
moedas
que
estão
em
cada
um
dos
moedeiros
(por
tipo),
e
fazem
a
listagem
dos
produtos
que
estão
nos
dispensadores,
respectivamente
(na
opção
de
estatísticas
de
vendas
é
mostrado
um
exemplo
de
listagem
de
produtos).
A opção 3 permite redefinir o preço praticado por cada posição da matriz de produtos. Veja o exemplo da Figura 14.
7
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
A exibir as tabelas de nomes e preços dos produtos.
+----------------------------------------------------+
| a b c d |
+---+------------------------------------------------+
| 1 | S5 0.50 X6 0.30 K1 0.50 P0 0.90 |
| | Sqwerty Xqwerty Kqwerty Pqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 2 | C10 1.00 L2 2.00 L1 1.50 M5 0.70 |
| | Cqwerty Lqwerty Lqwerty Mini-Chocol |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 3 | P2 0.25 Q0 0.35 W0 0.55 A0 1.00 |
| | Pqwerty Qqwerty Wqwerty Aqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 4 | Z0 0.00 A9 2.00 F3 1.50 O3 1.25 |
| | Zqwerty Amendoins Fqwerty Oqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 5 | C1 1.05 I4 0.10 J1 0.50 L10 0.85 |
| | Cqwerty Iqwerty Jqwerty Lqwerty |
+---+------------------------------------------------+
Qual é o produto para alterar? _
Figura
14
–
Exemplo
da
definição
dos
produtos
e
preços
(opção
do
menú
de
gestão).
Observe
a
figura
14
e
note
que,
apesar
de
previamente
termos
apresentado
o
produto
da
posição
d2
como
“Mini‐
Chocolate”,
agora
aqui
nestra
grelha
de
exibição,
apenas
aparece
“Mini‐Chocol”,
isto
é,
o
programa
exibe
apenas
alguns
dos
caracteres
do
nome
do
produto,
por
forma
a
não
desformatar
o
ecrã
de
visualização.
Observe
ainda
que
a
inicial
que
define
o
produto
é
a
primeira
letra
do
nome
do
produto,
colocada
em
maiúsculas.
Por
exemplo,
o
produto
na
posição
b4
chama‐se
“Amendoins”,
logo,
a
letra
que
vai
designar
este
produto
na
matriz
de
exibição
vai
ser
um
“A”.
Note
ainda
que,
nesta
matriz
são
exibidos
os
nomes
e
preços
dos
produtos
que
já
não
estão
em
stock
na
máquina,
por
exemplo,
o
produto
da
posição
a4
anteriormente
não
era
exibido,
mas
neste
ecrã
de
gestão
já
aparece.
Esta
opção
3
do
menu
de
gestão
permite‐lhe
mudar
o
nome
e
o
preço
do
produto
de
uma
dada
posição,
como
se
vê
no
exemplo
da
Figura
15.
+----------------------------------------------------+
| a b c d |
+---+------------------------------------------------+
| 1 | S5 0.50 X6 0.30 K1 0.50 P0 0.90 |
| | Sqwerty Xqwerty Kqwerty Pqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 2 | C10 1.00 L2 2.00 L1 1.50 M5 0.70 |
| | Cqwerty Lqwerty Lqwerty Mini-Chocol |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 3 | P2 0.25 Q0 0.35 W0 0.55 A0 1.00 |
| | Pqwerty Qqwerty Wqwerty Aqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 4 | Z0 0.00 A9 2.00 F3 1.50 O3 1.25 |
| | Zqwerty Amendoins Fqwerty Oqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 5 | C1 1.05 I4 0.10 J1 0.50 L10 0.85 |
| | Cqwerty Iqwerty Jqwerty Lqwerty |
+---+------------------------------------------------+
Qual é o produto para alterar (0 para sair)? a4
Produto em a4: Zqwerty, preço: 0.00, na máquina há 0 unidades.
Novo nome deste produto: Limonada Fresca
Novo preço deste produto: 0.80
Alterado!
Qual é o produto para alterar (0 para sair)? 0
8
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
Esta é a nova tabela
+----------------------------------------------------+
| a b c d |
+---+------------------------------------------------+
| 1 | S5 0.50 X6 0.30 K1 0.50 P0 0.90 |
| | Sqwerty Xqwerty Kqwerty Pqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 2 | C10 1.00 L2 2.00 L1 1.50 M5 0.70 |
| | Cqwerty Lqwerty Lqwerty Mini-Chocol |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 3 | P2 0.25 Q0 0.35 W0 0.55 A0 1.00 |
| | Pqwerty Qqwerty Wqwerty Aqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 4 | L0 0.80 A9 2.00 F3 1.50 O3 1.25 |
| | Limonada Fr Amendoins Fqwerty Oqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 5 | C1 1.05 I4 0.10 J1 0.50 L10 0.85 |
| | Cqwerty Iqwerty Jqwerty Lqwerty |
+---+------------------------------------------------+
A
opção
4
do
menú
permite
alterar
a
dimensão
dos
moedeiros
de
trocos
da
máquina,
isto
é,
esta
opção
vai
definir
quantas
moedas
cada
tubo
pode
conter.
Veja
a
Figura
16
para
exemplo.
9
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
Note‐se
que
neste
caso,
se
qualquer
dos
tubos
tiver
mais
moedas
do
que
o
que
for
dimensionado,
a
máquina
irá
deitar
as
moedas
em
excesso
no
moedeiro
de
depósito,
afectando
assim
o
saldo
do
moedeiro
de
depósito.
A Figura 17 mostra como funciona a opção 5 – purga do moedeiro de trocos.
A opção 6 serve para limpar o saldo do moedeiro de depósito, como ilustra a figura 18.
A
opção
7
serve
para
mostrar
as
estatísticas
de
vendas
desde
que
a
máquina
foi
ligada.
A
Figura
19
ilustra
o
modo
de
funcionamento
desta
opção.
10
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
0 – sair para o modo de venda
Qual é o comando? > 7
Estatísticas de vendas do período que se iniciou a Sun Nov 21 14:39:36 GMT 2010
+----------------------------------------------------+
| a b c d |
+---+------------------------------------------------+
| 1 | S2 0.50 X2 0.30 K1 0.50 P0 0.90 |
|u/€| 3 1.50 4 1.20 0 0.00 P0 0.00 |
| | Sqwerty Xqwerty Kqwerty Pqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 2 | C3 1.00 L2 2.00 L1 1.50 M5 0.70 |
|u/€| 7 7.00 0 0.00 0 0.00 0 0.00 |
| | Cqwerty Lqwerty Lqwerty Mini-Chocol |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 3 | P2 0.25 Q0 0.35 W0 0.55 A0 1.00 |
|u/€| 0 0.00 0 0.00 0 0.00 P0 0.00 |
| | Pqwerty Qqwerty Wqwerty Aqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 4 | L0 0.80 A0 2.00 F3 1.50 O3 1.25 |
|u/€| 0 0.00 9 18.00 0 0.00 0 0.00 |
| | Limonada Fr Amendoins Fqwerty Oqwerty |
|~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| 5 | C1 1.05 I4 0.10 J1 0.50 L10 0.85 |
|u/€| 0 0.00 0 0.00 0 0.00 P0 0.00 |
| | Cqwerty Iqwerty Jqwerty Lqwerty |
+---+------------------------------------------------+
A Figura 20 ilustra o modo de funcionamento desta opção.
Note
que
na
Figura
20,
não
é
feito
nenhum
eco
da
introdução
da
senha
pelo
utilizador.
Isto
faz‐se
usando
a
classe
Console
do
Java
(veja
mais
informação
na
documentação
do
método
Console.readPassword()).
A leitura das senhas, como se mostra na figura 20, deve ser feita como se tratasse de uma String normal.
A
opção
9
permite
limpar
o
aviso
de
avaria.
Como
de
vez
em
quando
a
máquina
avaria
e
deixa
de
funcionar,
é
preciso
aceder
ao
menú
de
gestão
para
limpar
o
aviso
de
avaria.
Cada
vez
que
a
máquina
avaria
(porque
uma
moeda
ou
um
produto
encravou,
por
exemplo,
ou
porque
não
fez
o
arranque
de
forma
correcta),
essa
informação
deve
ser
escrita
de
forma
incremental
num
ficheiro
de
texto
chamado
LOGS.TXT
AVARIAS.TXT,
e
estando
o
programa
em
estado
de
avaria,
é
preciso
chamar
o
gestor
da
máquina,
para
activar
a
opção
9
e
limpar
a
avaria.
A
opção
de
“limpeza”
(reset)
do
estado
de
avaria
também
deve
ficar
registada
no
ficheiro
de
registo
de
erros
(ficheiro
de
Logs).
A opção funciona como se ilustra a seguir na figura 21.
+----------------------------+
| a b c d |
+---+------------------------+
| 1 | S5 X6 K1 |
| 2 | C10 L2 L1 M4 |
| 3 | P2 |
| 4 | A9 F3 O3 |
| 5 | C1 I4 J1 L10 |
+---+------------------------+
trocos disponíveis
ATENÇÃO MÁQUINA EM AVARIA! CHAME O GESTOR DA MÁQUINA
Qual o comando?> a2
Máquina em avaria, comando inválido. CHAME O GESTOR DA MÁQUINA
Qual o comando? > GERIR
Acesso ao modo de gestão.
12
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
Insira a senha de acesso: ULHTFP1011
Acesso permitido.
Escolha a opção no menú de gestão:
1 – ver estado dos moedeiros
2 – ver estado dos produtos
3 – redefinir os preços dos produtos
4 – redefinir a dimensão máxima dos moedeiros de trocos
5 – purgar moedeiros de trocos
6 – recolher moedeiro depósito
7 – ver estatísticas de vendas
8 – redefinir a senha de acesso
9 – limpar aviso de avaria
A – repor/alterar stock de produtos
0 – sair para o modo de venda
Qual é o comando? > 9
A máquina está em estado de avaria porque às Sun Nov 21 18:30:01 GMT 2010 o
produto a3 ficou encravado.
Quer ver o ficheiro de avarias, limpar a avaria ou sair? (A, L, S)
>A
Note‐se
que
o
sistema
regista
a
data
e
o
tipo
da
última
avaria,
e
não
permite
a
operação
da
máquina
enquanto
esta
tiver
o
estado
de
avaria
ligada.
Mais,
o
ficheiro
de
avaria
regista
não
apenas
as
avarias
que
acontecem
na
máquina
mas
também
todas
as
operações
do
menú
de
gestão.
A
opção
“A
–
repor/alterar
stock
de
produtos”
deve
exibir
uma
mensagem
que
diga
“Esta
funcionalidade
ainda
não
está
implementada”.
PARTE
A0
–
LISTA
DE
FICHEIROS
DE
DADOS.
Os
ficheiros
de
dados
são
os
seguintes:
PRODUTOS.TXT, MOEDEIRO.TXT, CAPMOEDEIRO.TXT, SENHA.TXT e LOGS.TXT.
As funções que estes ficheiros têm estão descritas abaixo.
13
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
PARTE
A1
–
ERROS
NO
ARRANQUE.
Durante
o
processo
de
arranque,
a
máquina
pode
ter
erros.
Estes
erros
podem
ser
reais
ou
simulados.
Os erros reais são aqueles que acontecem quando os ficheiros de configuração não existem.
Os ficheiros de configuração obrigatórios para o programa funcionar são os seguintes:
PRODUTOS.TXT, MOEDEIRO.TXT, CAPMOEDEIRO.TXT.
Se estes ficheiros não existirem, a máquina não deve arrancar e deve dar erro.
Os restantes ficheiros, se não existirem, devem ser criados. Os ficheiros acessórios são:
SENHA.TXT e LOGS.TXT.
Se o ficheiro SENHA.TXT não existir, a senha de acesso ao modo de gestão deve ser “ULHTFP1011”.
Quer
a
falta
de
ficheiros
quer
a
criação
dos
ficheiros
em
falta
devem
ficar
registadas
no
ficheiro
de
Logs
do
programa.
Os
erros
simulados
são
criados
da
seguinte
forma:
é
lançado
um
número
aleatório
entre
0
e
1.
Se
este
número
for
inferior
ou
igual
a
0.25
(isto
é,
uma
probabilidade
de
25%),
então
a
máquina
tem
um
erro
e
não
arranca.
Os erros simulados deve ficar registado no ficheiro de LOGS.TXT como sendo “Erro inesperado no arranque”.
PARTE
A2
–
TEMPO
DE
ESPERA
No
arranque
e
entre
a
venda
de
dois
produtos,
queremos
simular
um
tempo
de
espera.
No
arranque,
aparece
a
barra
de
percentagens.
Cada
um
dos
caracteres
da
barra
de
percentagens
(excepto
os
números
que
têm
que
ser
escritos
de
uma
vez
só),
deve
estar
sujeita
a
um
atraso.
O
exemplo
de
código
que
se
segue
permite
criar
um
atraso
de
10
segundos
(Figura
A2.1);
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
Figura
A2.1
–
Exemplo
de
código
para
criar
um
atraso.
PARTE
A3
–
ERROS
NA
VENDA
Por
vezes
um
produto
fica
encravado
no
mecanismo
de
venda
e
não
caí
na
gaveta
recolectora
que
está
normalmente
no
fundo
da
máquina.
Neste
caso,
é
preciso
chamar
o
responsável
da
máquina
para
a
abrir
e
assim
poder
retirar
o
produto
pago.
Este
erro
simulado
é
conseguido
da
seguinte
forma:
cada
vez
que
se
realiza
uma
venda,
é
gerado
um
número
aleatório
entre
0
e
1.
Se
este
número
for
inferior
ou
igual
a
0.1
(equivalente
a
uma
probabilidade
de
erro
de
10%),
a
máquina
entra
em
avaria
(ver
exemplo
na
Figura
20).
Quando
uma
máquina
entra
em
avaria
por
ter
havido
um
erro
na
venda,
este
facto
deve
ficar
registado
no
ficheiro
de
erros.
14
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
PARTE
A4
–
AVARIA
NO
MOEDEIRO
O
moedeiro
é
um
componente
sensível
e
sujeito
a
avarias.
Quando
tal
acontece,
a
máquina
entra
em
estado
de
avaria
e
é
preciso
chamar
o
responsável
da
máquina
para
colocar
o
moedeiro
em
funcionamento
(ver
exemplo
da
Figura
20).
Este
erro
simulado
é
feito
de
forma
semelhante
ao
descrito
na
parte
A3,
excepto
que
neste
caso,
pode
haver
erro
sempre
que
se
insira
uma
moeda
na
máquina,
com
uma
probabilidade
de
5%,
e
mais,
se
for
uma
moeda
não
reconhecida
(por
exemplo,
moedas
de
0.01€,
0.02€,
ou
de
outro
valor
não
aceite),
esta
probabilidade
de
erro
sobe
para
os
30%.
PARTE
A5
–
(facultativa,
não
sujeita
a
avaliação)
Easter
Egg
Em
programação
um
Easter‐Egg
é
uma
funcionalidade
de
um
programa
ou
de
um
dispositivo
que
pode
ou
não
ter
uma
função
útil,
mas
que
não
se
encontra
descrita
nos
manuais
de
utilização
e
cujo
acesso
é
apenas
do
conhecimento
dos
programadores.
Quase
todas
as
grandes
aplicações
informáticas
das
últimas
décadas
tiveram
um
Easter‐Egg,
por
exemplo,
uma
das
versões
do
Excel
tinha
um
jogo
de
labirinto
escondido
quando
se
clicava
com
um
dado
botão
do
rato
e
se
carregava
numa
combinação
de
teclas,
simultaneamente,
na
janela
de
créditos
do
programa.
(Alguns
telemóveis
têm
Easter‐eggs!
O
seu
tem?)
Se tiver tempo e se se sentirem com vontade, façam o vosso próprio Easter‐Egg.
Nota 1: ver mais info sobre Easter‐Egg no Google.
Nota
2:
a
maior
parte
das
companhias
produtoras
de
software
não
apreciam
que
os
seus
programadores
gastem
o
seu
tempo
e
os
recursos
da
empresa
e
dos
clientes
a
programar
/
manter
Easter‐Eggs,
pelo
que
a
inclusão
deste
ponto
no
enunciado
é
apenas
para
sua
diversão
e
educação,
não
sendo
de
forma
nenhuma
um
incentivo
para
que
faça
isto
na
sua
vida
profissional.
15
Universidade
Lusófona
de
Humanidades
e
Tecnologias
–
Fundamentos
de
Programação
2010/2011
(LIG,
LEI)
Grelha
de
Avaliação
ITEM
Peso
Relatório
rigor
complexidade
6
operação
para
venda
de
produtos
OK
10
algoritmo
de
trocos
OK
3
algoritmo
de
anulação
de
venda
OK
3
algoritmo
de
devolução
de
moedas
OK
3
algoritmo
de
gestao
dos
moedeiros
OK
3
venda
de
produto
sem
troco
OK
3
algoritmo
de
desligar
máquina
OK
3
entrada
em
modo
de
gestão
OK
3
encerramento
da
máquina
OK
3
Op
1
(Gestão)
3
Op
2
(Gestão)
3
Op
3
(Gestão)
5
Op
4
(Gestão)
3
Op
5
(Gestão)
3
Op
6
(Gestão)
3
Op
7
(Gestão)
6
Op
8
(Gestão)
3
Op
9
(Gestão)
7
Parte
A1
3
Parte
A2
3
Parte
A4
3
Legibilidade
do
código,
nomes
de
variáveis,
convenções
de
escrita
5
Java
Doc
2
Eficiência
dos
algoritmos
5
Eficiência
das
estruturas
de
dados
escolhidas
3
Recuperação
de
um
erro
‐25
Explicação
de
uma
porção
de
código
‐25
Alteração
de
uma
funcionalidade
‐25
à
vontade
na
manipulação
do
IDE
‐25
Por
favor
note
que
estes
itens
e
estes
pesos
ainda
podem
sofrer
alterações,
devendo
ser
considerados
como
indicativos.
Em caso de detecção de plágio, o exercício será anulado em todas as suas instancias e o resultado é nota zero.
16 Universidade Lusófona de Humanidades e Tecnologias – Fundamentos de Programação 2010/2011 (LIG, LEI)