Вы находитесь на странице: 1из 9

ULHT

Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

Objectivo
Pretende-se desenvolver um simulador de uma mquina de venda de bilhetes para viagens de comboio na Linha do Norte. Este enunciado descreve o comportamento desta mquina. O programa tem 3 mdulos executados em sequncia: 1. Obter a origem e o destino da viagem e a partir daqui determinar o preo do bilhete; 2. Receber o pagamento do bilhete, verificando que so recebidas notas e moedas vlidas e que o total igual ou superior ao preo da viagem; 3. Devolver troco caso seja necessrio, utilizando as notas e moedas que esto no stock da mquina. Adicionar ao stock da mquina as notas e moedas recebidas no pagamento. Emitir o bilhete; Ao terminar o mdulo 3 o programa deve regressar ao mdulo 1. No mdulo 1, se o utilizador introduzir uma origem com valor 9999 provoca o desligar da mquina. Os mdulos sero descritos nos pontos abaixo.

Modulo 1 Determinar o preo do bilhete


A mquina comea por perguntar qual a origem da viagem. Para isto aparece uma lista como a indicada abaixo:
Qual 1 2 3 4 5 6 7 8 9 10 11 12 > a origem da viagem? Porto Vila Nova de Gaia Esmoriz Aveiro Pampilhosa Coimbra Alfarelos Pombal Entroncamento Santarm Vila Franca de Xira Lisboa

Se por exemplo o utilizador escolher Santarm ter que introduzir o nmero 10. Neste menu e em todos os outros, qualquer nmero fora da lista deve gerar uma mensagem de erro seguida de nova listagem do menu. Exclumos as opes especiais activas em cada menu, como neste caso o 9999 que provoca o desligar da mquina (shutdown). Sugerimos a utilizao dos mtodos hasNextInt() ou hasNextDouble(), ambos pertencentes classe Scanner, para verificar que o valor introduzido pelo utilizador um nmero. Depois de aceite a origem da viagem, a mquina pergunta o destino, apresentando uma lista com todas a localidades disponveis excluindo Santarm:
Qual 1 2 3 4 o destino da viagem? Porto Vila Nova de Gaia Esmoriz Aveiro

1/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro
5 6 7 8 9 11 12 > Pampilhosa Coimbra Alfarelos Pombal Entroncamento Vila Franca de Xira Lisboa

Por exemplo o utilizador escolhe Vila Nova de Gaia introduzindo o nmero 2. Para determinar o preo da viagem a aplicao possui uma matriz como a indicada abaixo:

Destino
1
1 2 3 4

2 11 11 12 12,5 13 14 15 16 17 18,5 19

Origem

5 6 7 8 9 10 11 12

11 12 12,5 13 14 15 16 17 18,5 19 19,5

3 12 11 11 12 12,5 13 14 15 16 17 18,5

4 12,5 12 11 11 12 12,5 13 14 15 16 17

5 13 12,5 12 11 11 12 12,5 13 14 15 16

6 14 13 12,5 12 11 11 12 12,5 13 14 15

7 15 14 13 12,5 12 11 11 12 12,5 13 14

8 16 15 14 13 12,5 12 11 11 12 12,5 13

9 17 16 15 14 13 12,5 12 11 11 12 12,5

10 18,5 17 16 15 14 13 12,5 12 11 11 12

11 19 18,5 17 16 15 14 13 12,5 12 11 11

12 19,5 19 18,5 17 16 15 14 13 12,5 12 11

Neste caso, como a origem 10 e o destino 2, o preo da viagem ser 17, pelo que o programa apresenta:
A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 0. Faltam 17: >

A tabela anterior simtrica, pois o preo de uma viagem da origem 10 para o destino 2 tem que ser igual ao preo de uma viagem da origem 2 para o destino 10.

2/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

Modulo 2 Receber o pagamento


A nossa mquina trabalha com as seguintes notas e moedas:

Valor Nota Nota Nota Moeda Moeda Moeda Moeda Moeda Moeda Moeda Moeda
20,00 10,00 5,00 2,00 1,00 0,50 0,20 0,10 0,05 0,02 0,01

O viajante introduz uma nota ou moeda de cada vez. O programa verifica se a nota ou moeda vlida, recusando-a caso no seja. Aps aceitar uma quantidade a mquina informa o viajante de quanto falta para completar o montante em dvida. Segue um exemplo em que o cliente introduz 10:
A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 0. Faltam 17: >10

A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 10. Faltam 7: >

Caso o cliente introduza uma nota ou moeda falsa:


A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 10. Faltam 7: >7

Esta mquina s aceita notas de 20, 10 ou 5 e moedas de 2, 1, 0,5, 0,20, 0,10, 0,05, 0,02 ou 0,01 A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 10. Faltam 7: >

Depois de ler a mensagem anterior o cliente introduz duas notas de 5:


Esta mquina s aceita notas de 20, 10 ou 5 e moedas de 2, 1, 0,5, 0,20, 0,10, 0,05, 0,02 ou 0,01 A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 10. Faltam 7: >5

3/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 15. Faltam 2: >5

Quando a soma das quantias introduzidas pelo cliente for superior ou igual ao valor da viagem a mquina termina a recepo do dinheiro e passa para o mdulo seguinte. O cliente pode interromper a recepo de dinheiro introduzindo um nmero negativo. Nesse caso a mquina devolve o dinheiro at a introduzido e regressa ao inicio do mdulo 1. A mensagem a apresentar ao cliente ser:
Compra de viagem cancelada. So devolvidos: 15.

Em caso de devoluo do dinheiro, a quantidade de moedas e / ou notas dentro da mquina no deve ser afectada.

4/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

Modulo 3 Dar troco, actualizar stock e emitir bilhete


O pagamento foi feito com quantia exacta ou por excesso. No caso da quantia por excesso necessrio dar troco, o que coloca duas situaes: temos stock de moedas e portanto possvel dar troco, ou no possvel dar troco. Se no for possvel dar troco a emisso do bilhete cancelada. Vamos descrever estas situaes com maior detalhe.

Quantia exacta
Se a quantia introduzida for exactamente igual ao custo da viagem, ento o bilhete emitido:
+----------------------------------------------------------------------+ | | | B I L H E T E | | | | vlido de SANTARM para VILA NOVA DE GAIA | | | | emitido em 2011-12-09 14:54:36 | | | | Bilhete nmero 1544714 | | | | Preo: 17 (impostos includos taxa legal em vigor) | | | +----------------------------------------------------------------------+ Prima qualquer tecla para continuar...

A impresso do bilhete tem alguns truques interessantes. Primeiro, a data e hora impressos podem ser conseguidos com o cdigo a seguir:
import java.util.Calendar; import java.text.SimpleDateFormat; mais cdigo aqui public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; public static String now() { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); return sdf.format(cal.getTime()); }

Depois, o nmero do bilhete deve ser sequencial e comear em 123456. O bilhete seguinte emitido deve ter o nmero 123457 e assim sucessivamente.

5/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

Quantia no exacta e h troco


Se a quantia for superior ao valor do bilhete a mquina tem que devolver troco. Para isso a mquina possui um stock de notas e moedas, assim como uma coluna que informa a variao de stock ocorrida durante uma sesso de trabalho (enquanto est ligada), como apresentado a seguir:

Valor Nota Nota Nota Moeda Moeda Moeda Moeda Moeda Moeda Moeda Moeda
20,00 10,00 5,00 2,00 1,00 0,50 0,20 0,10 0,05 0,02 0,01

Stock 3 7 10 0 1 1 10 10 12 3 1

Variao 0 0 0 0 0 0 0 0 0 0 0

No nosso exemplo o pagamento foi de 20 para uma viagem de 17, pelo que o troco poder ser dado de vrias formas, por exemplo: 1 moeda de 2 e uma moeda de 1, ou, 3 moedas de 1, ou, 1 moeda de 1 e 4 moedas de 0,50.

As duas primeiras opes no so possveis tendo em conta o nosso stock de moedas, visto que temos apenas uma moeda de 1 e outra de 0,50. Neste caso a mquina daria o seguinte troco tendo em conta as moedas disponveis em stock:
A viagem de Santarm para Vila Nova de Gaia tem um custo de 17. Quantia introduzida 20. Faltam 0: Troco de 3: 1,00 0,50 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,10

O algoritmo para dar troco baseia-se em dar ao cliente o menor nmero possvel de notas e moedas, pelo que teremos que gastar primeiro as de maior valor.

6/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro Aps dar troco o stock de moedas tem que ser actualizado. A mquina recebeu as seguintes notas 10, 5 e 5 e devolveu as moedas indicadas acima como troco. Nesse caso o nosso stock de moedas teria que ser actualizado como indica a tabela a seguir (com fundo amarelo as posies que foram alteradas):

Valor Nota Nota Nota Moeda Moeda Moeda Moeda Moeda Moeda Moeda Moeda
20,00 10,00 5,00 2,00 1,00 0,50 0,20 0,10 0,05 0,02 0,01

Stock

Variao 3 0 8 1 12 2 0 0 0 -1 0 -1 3 -7 9 -1 12 0 3 0 1 0

Aps dar troco e actualizar o stock a mquina emite o bilhete, como descrito na seco Quantia Exacta.

Quantia no exacta e no h troco


Como vimos no ponto anterior, se a quantia for superior ao valor do bilhete, a mquina tem que devolver troco. No entanto, se o stock de moedas for insuficiente para devolver o troco a mquina deve cancelar a venda do bilhete, apresentando a mensagem:
Lamentamos informar que no temos moedas suficientes para lhe dar troco. A venda do bilhete ser cancelada. Por favor introduza quantia certa ou dirija-se a outra mquina. Prima qualquer tecla para continuar...

Em seguida a mquina regressa ao mdulo 1.

7/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

Trabalho complementar

Utilizao de ficheiros
Na verso inicial do programa os dados iniciais so armazenados em arrays definidos no cdigo. Pretendemos que introduza um melhoramento que permita que esses dados sejam lidos a partir de um ficheiro, sendo no fim da execuo escritos no mesmo ficheiro. Como parmetros referimo-nos a uma lista de localidades da linha do Norte (tal como mostrada no exemplo), uma matriz com os preos das viagens (tal como mostrada no exemplo) e uma matriz com o stock de notas e moedas (como est no exemplo), que tambm serve para validar as notas e moedas que so admitidas na recepo do dinheiro.

Easter egg
Os programadores desta aplicao querem poder viajar de borla cada vez que lhes apetecer, o que no s anti-tico, mas tambm ilegal. No entanto, e apesar de todos os controlos de qualidade, os programadores conseguiram introduzir na aplicao um cdigo secreto. Assim sendo, quando o programa pergunta qual a localidade de origem do bilhete, se o utilizador escrever reinobuedalonge a mquina entra num estado de emitir 1 bilhete borla. Para isso volta a perguntar a localidade de origem, pergunta em seguida a localidade de destino e emite o bilhete sem pedir o dinheiro. A venda seguinte j feita de forma normal. Nesta situao deve ter ateno ao nmero de srie emitido pelo bilhete

8/9

ULHT
Fundamentos de programao - 2011/2012 1 Semestre LIG, LEI, MAT, AMV Trabalho prtico de avaliao continua Profs. Jos Aser, Bruno Cipriano, Nuno Garcia, Srgio Guerreiro

Prazo de entrega e consideraes gerais


Trata-se de um trabalho de grupo, que no mximo dever ser constitudo por 3 pessoas. Embora o desenvolvimento seja em grupo, o trabalho ser alvo de discusso presencial individual, em data a definir posteriormente. Sempre que surjam situaes no previstas no enunciado os alunos devem autonomamente decidir como as ultrapassar, mantendo o esprito do problema apresentado e recorrendo ao bom senso. O cdigo desenvolvido neste projecto deve respeitar as boas prticas de programao universalmente aceites para a linguagem Java e ensinadas ao longo da cadeira. Com isto referimo-nos, por exemplo, arrumao do cdigo, nomes de identificadores e comentrios. Em relao aos comentrios muito importante que o cdigo esteja bem documentado, no s nos pontos chave, como tambm recorrendo ao JavaDocs. A entrega constituda pela classe (ou classes) Java que constituem o programa, assim como os JavaDocs e um pequeno relatrio. Este relatrio deve incluir: Uma breve descrio do programa desenvolvido; A indicao das dificuldades sentidas e a forma como foram ultrapassadas; Um fluxograma global da soluo encontrada. O relatrio e o programa devem conter a identificao de todos os elementos do grupo, nomeadamente o nmero do aluno, nome completo, curso e turma. Os ficheiros que constituem este trabalho devem ser comprimidos em formato ZIP, 7Z ou Winrar, sendo o arquivo resultante entregue no Moodle por apenas um dos elementos do grupo, usando a tarefa definida para o efeito. A tarefa do Moodle reflecte o prazo de entrega e no permite entregas fora de prazo. Ter ateno s possveis variaes de tempo entre o relgio do Moodle e a hora corrente. O Moodle tem indicao da hora do servidor e o aluno tem que ter em conta esse desfasamento de tempo.

Cotaes
Mdulo 1 5 val Mdulo 2 5 val Mdulo 3 5 val Trabalho complementar: Ficheiro - 4 val Easter egg 1 val

9/9

Вам также может понравиться