Computação e Programação MEMec, LEAN - 1º Semestre 2015-2016 Aula Teórica 10 Exemplo de desenvolvimento de Programa Modular: Máquina de venda de bilhetes D.E.M. Área Científica de Controlo Automação e Informática Industrial Wrap Up da última aula Problema Análise Algoritmo Testes OK Codificação Testes OK Produção 1. Definição do problema 2. Análise / síntese do problema 3. Esquema de processamento 4. Algoritmo e testes 5. Codificação 6. Testes e validação 7. Produção / manutenção Computação e Programação 2015 / 2016 2 1
Wrap Up da última aula Abstracção procedimental A solução algorítmica vai sendo construída por diferentes níveis de abstracção até não restarem ambiguidades sobre as tarefas a realizar Computação e Programação 2015 / 2016 3 Wrap Up da última aula Tipos de Erros Erros Lógicos (ou de semântica) Erros de Sintaxe Erros de Execução Computação e Programação 2015 / 2016 4 2
Alinhamento da AT 10 Exemplo de desenvolvimento de Programa Modular: Máquina de venda de bilhetes Computação e Programação 2015 / 2016 5 Máquina de venda de bilhetes Pretende-se criar um programa para controlar uma máquina simples de venda automática de bilhetes. A máquina possui vários componentes que são apresentadados na figura anexa. O programa deverá gerir o processo de compra, permitindo ao utilizador escolher um tipo de bilhete num menu, e em seguida efectuar o pagamento e recolher o bilhete. A operação de venda deve poder ser interrompida pelo utilizador a qualquer momento, sendo devolvida a quantia introduzida. Computação e Programação 2015 / 2016 6 3
Máquina de venda de bilhetes Componentes do sistema Ecrã Teclado Entrada do Detector/ Dispensador (D/D) de moedas Saída da Impressora Saída do D/D de moedas Computação e Programação 2015 / 2016 7 Máquina de venda de bilhetes A máquina vende apenas dois tipos de bilhetes: o bilhete simples, e o bilhete de ida-e-volta. O menu deverá ter aproximadamente a seguinte aparência: - Bilhete Simples - Bilhete de Ida-e-Volta - Cancelar operação Nos bilhetes devem constar as cidades de partida e destino, bem como a data e hora de emissão do bilhete. O programa deverá simular a comunicação com os vários componentes da máquina, através de entradas do teclado e saídas para o ecrã. Computação e Programação 2015 / 2016 8 4
1. Contexto do Problema e Objectivos do Programa O programa simula uma operação de venda de bilhetes a ser realizada por uma máquina de venda automática. Os utilizadores doprogramaserãoopúblicoaquemsedestinamosbilhetes. O programa interage com os utilizadores, mas também com os restantes dispositivos da máquina, nomeadamente o Detector/Dispensador de moedas e a impressora de bilhetes. A interacção com os dispositivos é simulada através do teclado e do ecrã. Computação e Programação 2015 / 2016 9 1. Contexto do Problema e Objectivos do Programa A partir de um menu inicial o programa permite ao utilizador escolher o tipo de bilhete (Simples ou Ida-e- Volta), ou cancelar a operação. Uma vez seleccionado o bilhete o programa processa a venda, verificando a quantia introduzida e o troco, voltando depois ao menu inicial. Computação e Programação 2015 / 2016 10 5
2.1 Entradas 2.2 Saídas Opção de menu do utilizador Quantia para pagamento Quantia de troco ou de devolução Texto do bilhete a imprimir Computação e Programação 2015 / 2016 11 2.3 Especificações Funcionais O programa deve: Obter opção do utilizador Obter quantia para pagamento Verificar a quantia introduzida Devolver o troco, ou a quantia Imprimir o bilhete Simular todas as entradas pelo teclado, e todas as saídas pelo ecrã Apresentar quantias em, com precisão de duas casas decimais Computação e Programação 2015 / 2016 12 6
2.5 Métodos de Processamento Calcular pagamento pagamento = k Calcular troco valor_moeda k troco= quantia-preco Computação e Programação 2015 / 2016 13 3.1 Projecto Genérico Abordagem top-down Venda de bilhetes Obter opção Processar venda Emitir bilhete Computação e Programação 2015 / 2016 14 7
3.1 Projecto Genérico Lista de tarefas Obter opção válida Processar venda Emitir bilhete Computação e Programação 2015 / 2016 15 3.1 Projecto Genérico Algoritmo 1) Repetir indefinidamente a) opcao = Obter opção válida b) Casoopcao= 1 i. Processar venda (preço Simples) ii. Se a venda foi concretizada A. Emitir bilhete (Simples) Computação e Programação 2015 / 2016 16 8
3.1 Projecto Genérico Algoritmo (continuação) c) Casoopcao = 2 i. Processar venda (preço Ida-e-Volta) ii. Se a venda foi concretizada A. Emitir bilhete (Ida-e-Volta) d) Casoopcao= C i. Terminar repetição (1) Computação e Programação 2015 / 2016 17 3.2 Projecto detalhado dos módulos: Obter opção Abordagem top-down Obter opção Apresentar menu Validar opção Mensagem opção errada Ler opção Computação e Programação 2015 / 2016 18 9
3.2 Projecto detalhado dos módulos: Obter opção Entradas: lê valor do teclado para opcao Saídas: opcao(carácter) Algoritmo 1) Repetir indefinidamente a) Apresentar menu b) Ler valor para opcao c) Seopcao= 1 ou opcao= 2 ou opcao= C i. Terminar repetição (1) d) Apresentar mensagem de opção errada Computação e Programação 2015 / 2016 19 3.2 Projecto detalhado dos módulos: Processar venda Abordagem top-down Processar venda * Ambas as tarefas são genéricas a qualquer problema de maquinas de venda. Se as tornarmos em módulos independentes poderemos reutilzá-las. Receber pagamento* Calcular troco Devolver quantia* Calcular pagamento Ler moeda Mensagem quantia em falta Devolver moedas Mensagem aviso de devolução Computação e Programação 2015 / 2016 20 10
3.2 Projecto detalhado dos módulos: Processar venda Abordagem top-down (forma final) Processar venda Receber pagamento Calcular troco Devolver quantia Computação e Programação 2015 / 2016 21 3.2 Projecto detalhado dos módulos Processar venda Entradas: preco preço do bilhete especificado (real) Saídas: compraok indica sucesso (lógico) Computação e Programação 2015 / 2016 22 11
3.2 Projecto detalhado dos módulos Processar venda Algoritmo 1) pagamento = Receber pagamento (preco) 2) troco= pagamento preco 3) Se troco< 0 a) compraok é falso b) Devolver quantia (pagamento) Caso contrário a) compraok é verdadeiro b) Devolver quantia (troco) Computação e Programação 2015 / 2016 23 3.2 Projecto detalhado dos módulos: Receber pagamento Abordagem top-down Receber pagamento Calcular pagamento Ler moeda Mensagem quantia em falta Computação e Programação 2015 / 2016 24 12
3.2 Projecto detalhado dos módulos: Receber pagamento Entradas: preco preço do bilhete especificado (real) Lê do D/D o valor valor_moeda Saídas: pagamento valor total introduzido (real) Computação e Programação 2015 / 2016 25 3.2 Projecto detalhado dos módulos: Receber pagamento Algoritmo 1) pagamento = 0 2) Repetir indefinidamente a) Apresentar mensagem quantia em falta b) Ler moeda do D/D para valor_moeda c) pagamento = pagamento + valor_moeda d) Sepagamento precoouvalor_moeda= 0 i. Terminar repetição (1) Computação e Programação 2015 / 2016 26 13
3.2 Projecto detalhado dos módulos: Devolver quantia Abordagem top-down Devolver quantia Devolver moedas Mensagem aviso de devolução Computação e Programação 2015 / 2016 27 3.2 Projecto detalhado dos módulos: Devolver quantia Entradas: valor valor a devolver ao utlizador (real) Saídas: comando ao D/D com valor a devolver Algoritmo 1) Apresentar mensagem de aviso de devolução 2) Comando ao D/D contendo valor Computação e Programação 2015 / 2016 28 14
3.2 Projecto detalhado dos módulos: Emitir bilhete Abordagem top-down Emitir bilhete Emitir bilhete Simples Emitir bilhete Ida-e-Volta Computação e Programação 2015 / 2016 29 3.2 Projecto detalhado dos módulos: Emitir bilhete Entradas: tipo tipo de bilhete (carácter) Saídas: comando à impressora Algoritmo 1) Apresentar mensagem de recolha de bilhete 2) Setipo= Simples a) Imprimir bilhete simples com data Caso contrário se tipo = Ida-e-Volta a) Imprimir bilhete de ida-e-volta com data Computação e Programação 2015 / 2016 30 15
Programa venda_de_bilhetes.m 3.3 Organização dos módulos do programa: venda_de_bilhetes.m script(módulo principal) o obteropcao.m função o processarvenda.m função receberpagamento.m função devolverquantia.m função o emitirbilhete.m função Computação e Programação 2015 / 2016 31 Script venda_de_bilhetes.m 3.4 Código fonte: NOTA: nestes exemplos os comentários foram omitidos para permitir a representação dos ficheiros numa única página Computação e Programação 2015 / 2016 32 16
obteropcao.m 3.4 Código fonte: Computação e Programação 2015 / 2016 33 processarvenda.m 3.4 Código fonte: Computação e Programação 2015 / 2016 34 17
receberpagamento.m 3.4 Código fonte: Computação e Programação 2015 / 2016 35 devolverquantia.m 3.4 Código fonte: Computação e Programação 2015 / 2016 36 18
emitirbilhete.m 3.4 Código fonte: Computação e Programação 2015 / 2016 37 emitirbilhete.m 3.5 Testes aos módulos: Bottom-up Casos de teste A função emitirbilhete recebe apenas duas variantes de valores válidos, logo os casos de teste serão apenas as strings 'Simples' e 'Ida-e-Volta' Computação e Programação 2015 / 2016 38 19
emitirbilhete.m 3.5 Testes aos módulos : Bottom-up >> emitirbilhete('simples') Por favor recolha o seu bilhete. Lisboa -> Cacilhas 26-10-2011 20h 18min >> emitirbilhete('ida-e-volta') Por favor recolha o seu bilhete. Lisboa -> Cacilhas Cacilhas -> Lisboa 26-10-2011 20h 18min Computação e Programação 2015 / 2016 39 devolverquantia.m 3.5 Testes aos módulos: Bottom-up Casos de teste A função devolverquantia apresenta uma mensagem e o valor da quantia com a precisão especificada. Um único valor será portanto suficiente para testar o seu desempenho. Computação e Programação 2015 / 2016 40 20
devolverquantia.m 3.5 Testes aos módulos: Bottom-up >> devolverquantia(.5) Por favor retire o troco. Devolvido: 0.50 Computação e Programação 2015 / 2016 41 21
receberpagamento.m 3.5 Testes aos módulos: Bottom-up >> receberpagamento(1.5) Por favor introduza 1.50, ou 0 para Cancelar -.2 Por favor introduza 1.30, ou 0 para Cancelar -.5 Por favor introduza 0.80, ou 0 para Cancelar - 1 ans = 1.7000 >> receberpagamento(2.0) Por favor introduza 2.00, ou 0 para Cancelar -.5 Por favor introduza 1.50, ou 0 para Cancelar - 0 ans = 0.5000 Computação e Programação 2015 / 2016 43 obteropcao.m 3.5 Testes aos módulos: Bottom-up Casos de teste A função obteropcao apresenta um menu e devolve uma opção válida. Deve verificar-se cada opção correcta para conferir o valor devolvido e, pelo menos, uma incorrecta para verificar o comportamento do ciclo. Computação e Programação 2015 / 2016 44 22
obteropcao.m 3.5 Testes aos módulos: Bottom-up >> obteropcao 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 1 ans = 1 >> obteropcao 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 2 ans = 2 Computação e Programação 2015 / 2016 45 obteropcao.m 3.5 Testes aos módulos: Bottom-up >> obteropcao 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 5 A opção escolhida não existe! 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: C ans = C >> Computação e Programação 2015 / 2016 46 23
processarvenda.m 3.5 Testes aos módulos / testes de integração Casos de teste A função processarvenda integra as funções receberpagamento e devolverquantia. Estas funções já estão testadas, pelo que é necessário verificar apenas que há uma operação de pagamento, que há uma operação de devolução, e o valor de saída de processarvenda no caso em que o pagamento é interrompido, e no caso em que é concluído. Computação e Programação 2015 / 2016 47 processarvenda.m 3.5 Testes aos módulos / testes de integração >> processarvenda(2.0) Por favor introduza 2.00, ou 0 para Cancelar -.5 Por favor introduza 1.50, ou 0 para Cancelar - 1 Por favor introduza 0.50, ou 0 para Cancelar - 0 Por favor retire o troco. Devolvido: 1.50 ans = 0 Computação e Programação 2015 / 2016 48 24
processarvenda.m 3.5 Testes aos módulos / testes de integração >> processarvenda(2.0) Por favor introduza 2.00, ou 0 para Cancelar - 1 Por favor introduza 1.00, ou 0 para Cancelar -.5 Por favor introduza 0.50, ou 0 para Cancelar - 2 Por favor retire o troco. Devolvido: 1.50 ans = 1 Computação e Programação 2015 / 2016 49 venda_de_bilhetes.m 3.5 Testes aos módulos / testes de integração Casos de teste O scriptvenda_de_bilhetes chama as funções obteropcao, processarvenda e emitirbilhete. Todas estão já testadas. Resta garantir que são correctamente chamadas. Cinco casos podem acontecer: 1. opção 1 e pagamento efectuado (apresenta bilhete); 2. opção 1 e pagamento cancelado (não apresenta bilhete); 3.e4. os mesmos para a opção 2; 5. e a opção de cancelar a venda. Computação e Programação 2015 / 2016 50 25
Script venda_de_bilhetes.m 3.5 Testes aos módulos / testes de integração >> venda_de_bilhetes 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 1 Por favor introduza 2.00, ou 0 para Cancelar - 2 Por favor retire o troco. Devolvido: 0.00 Por favor recolha o seu bilhete. Lisboa -> Cacilhas 26-10-2011 22h 22min Computação e Programação 2015 / 2016 51 Script venda_de_bilhetes.m 3.5 Testes aos módulos / testes de integração 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 1 Por favor introduza 2.00, ou 0 para Cancelar - 0 Por favor retire o troco. Devolvido: 0.00 Computação e Programação 2015 / 2016 52 26
Script venda_de_bilhetes.m 3.5 Testes aos módulos / testes de integração 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 2 Por favor introduza 3.20, ou 0 para Cancelar - 3.2 Por favor retire o troco. Devolvido: 0.00 Por favor recolha o seu bilhete. Lisboa -> Cacilhas Cacilhas -> Lisboa 26-10-2011 22h 26min Computação e Programação 2015 / 2016 53 Script venda_de_bilhetes.m 3.5 Testes aos módulos / testes de integração 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: 2 Por favor introduza 3.20, ou 0 para Cancelar - 0 Por favor retire o troco. Devolvido: 0.00 1 - Bilhete Simples 2 - Bilhete de Ida e Volta C - Cancelar venda Introduza o tipo de bilhete pretendido: C >> Computação e Programação 2015 / 2016 54 27
venda_de_bilhetes.m Computação e Programação 2015 / 2016 55 Na realidade A norma portuguesa de representação numérica, separa a parte inteira da parte decimal de um número por uma vírgula, em vez de um ponto. Como procederia para dar mensagens ao utilizador de acordo com a norma portuguesa? Como procederia se o Detector/Dispensador de moedas não soubesse fazer uma dada quantia de troco? Ou seja, se o programa tivesse que indicar ao D/D de moedas quantas moedas teria que dispensar do valor x, mais quantas moedas do valor y, mais quantas moedas do valor z Computação e Programação 2015 / 2016 56 28
Referências Secção 6.2 de Matlab: A Practical Introduction to Programming and Problem Solving, Stormy Attaway (2012) Elsevier. As aulas teóricas contêm contribuições dos profs. José Borges e Miguel Silva Computação e Programação 2015 / 2016 57 29