Ficha 4_resolução 1 Objectivo: Pretende-se um programa que permita gerir as refeições de uma cantina na sua vertente ementa e reservas de refeições. A cantina funciona de 2.ª a 6.ª Feira, servindo almoços e jantares. Requisitos: 1. Permitir a definição da ementa para a semana (indicando-se o prato a servir em cada refeição); 2. Mostra a ementa para a semana; 3. Permitir o registo de reserva para uma dada refeição; 4. Consultar as reservas efectuadas para uma dada refeição. Solução: 1. Implementar o programa como um todo. Esta abordagem mostrar-se-á decerto extensa e com partes que serão sucessivamente repetidas (caso do aceitar o dia e refeição a tratar utilizados em definir ementa, reservas, consultar reservas) 2. Criar diversos subprogramas segundo a máxima dividir para reinar : dividir o problema em subproblemas, tornando-o assim mais manejável. Isto irá permitir uma melhor correcção ou alteração e ainda a reutilização. 2 1
DADOS Por cada refeição, teremos de guardar o prato a servir e a quantidade de refeições reservadas Solução 1: 10 variáveis string para o nome do prato (1 para refeição 5 dias * 2 refeições / dia) 10 variáveis inteiras para as reservas por cada refeição Problema levantado Código muito extenso pois que assim se iria impossibilitar a utilização de ciclos Código para aceitar cada prato, mostrá-lo, aceitar cada reserva, etc... Solução 2: Criar um vector de 10 posições para o nome do prato Criar um vector de 10 posições para as reservas de cada refeição Mas... p. ex. ao aceitarmos as reservas para 6.ª feira, almoço, em vez de guardarmos na posição 6 do vector, teria o programa de saber que deveria fazê-lo na posição 9, já que o array é de uma só dimensão e não sabe que há duas refeições por dia. 3 DADOS Solução 3: Criar um array de duas dimensões Uma para os dias da semana (de 2 a 6), 2.ª a 6.ª feira Outra para a refeição (de 1 a 2), 1 almoço, 2 jantar Teríamos: Dim registo (2 To 6, 1 To 2) Mas... Por cada registo temos de guardar a descrição do prato e a quantidade reservada Então: vamos definir um tipo de dados que contenha os 2: Type elemento ementa As String reserva as Integer End Type E quanto ao nosso registo: Dim registo (2 To 6, 1 To 2) as elemento 4 2
Vamos criar o programa principal (menu que chama os outros subprogramas) Sub opções() Dim op As String * 1, resp As Integer, tex As String tex = "D-Definir ementa" & Chr(13) & "L-Listar ementa da semana" & Chr(13) & _ "R-Registar reserva" & Chr(13) & "C-Consultar nº de reservas de dia e refeição" Do op = UCase(InputBox("Digite a opção: " & Chr(13) & tex)) ' Ucase devolve a letra maiúscula correspondente Select Case op Case "D" define_ementa Case "L" listar_ementa_semana Case "R" registar_reserva Case "C" consultar_reservas Case Else MsgBox "Opção Inválida" End Select resp = MsgBox("Pretende continuar", vbyesno) Loop Until resp = 7 5 Vamos criar o subprograma que permite definir o prato a servir para cada refeição Teremos de aceitar qual o dia da semana e refeição que pretendemos indicar o prato Em vários locais teremos de aceitar o dia da semana e refeição que queremos tratar. Ou seja, teremos pedaços de código utilizados em vários locais. Assim, iremos criar funções para as funcionalidades pretendidas: Function ler_dia() As Integer ' função que devolve o dia da semana pretendido (2-2.ª feira... 6-6.ª feira) Dim dia As Integer Do dia = Val(InputBox("Digite o dia da semana [2-Segunda.. 6-Sexta]")) Loop Until (dia >= 2 And dia <= 6) ler_dia = dia Function ler_ref() As Integer ' função que devolve 1 - se almoço e 2 - se jantar Dim ref As Integer Do ref = Val(InputBox("Qual a refeição [1-Almoço.. 2-Jantar]")) Loop Until (ref = 1 Or ref = 2) ler_ref = ref 6 3
Vamos criar o subprograma que permite definir o prato a servir para cada refeição Desta forma o subprograma que irá permitir carregar o array com a ementa ficará: Sub define_ementa() ' para aceitar o nome do prato a servir no dia / refeição escolhido Dim dia As Integer, ref As Integer dia = ler_dia() chama a função que aceita e devolve o dia pretendido ref = ler_ref() chama a função que aceita e devolve a refeição pretendida registo(dia, ref).ementa = InputBox("Digite a descrição da ementa " & dia_s(dia) & _ " " & refeição(ref)) aceita o nome do prato e guarda-o no elemento conveniente da tabela 7 Quanto à opção L, listar ementa da semana: Sub listar_ementa_semana() ' mostra a lista da ementa da semana Dim dia As Integer, tex As String tex = " Almoço " & Chr(13) For dia = 2 To 6 tex = tex & dia_s(dia) & " " & registo(dia, 1).ementa & Chr(13) Next tex = tex & " Jantar " & Chr(13) For dia = 2 To 6 tex = tex & dia_s(dia) & " " & registo(dia, 2).ementa & Chr(13) Next MsgBox tex 8 4
Quanto à função dia_s, que mostra a descrição de um dado dia da semana Function dia_s(dia As Integer) ' função que devolve o nome do dia da semana indicado no parâmetro Select Case dia Case 2 dia_s = "Segunda" Case 3 dia_s = "Terça" Case 4 dia_s = "Quarta" Case 5 dia_s = "Quinta" Case 6 dia_s = "Sexta" End Select 9 Quanto à opção R, registar reserva: Temos simplesmente que saber qual o dia e refeição a reservar e incrementar de 1 o valor da reserva para essa refeição Sub registar_reserva() ' permite registar uma reserva para uma dada refeição Dim dia As Integer, ref As Integer dia = ler_dia() ref = ler_ref() registo(dia, ref).reserva = registo(dia, ref).reserva + 1 10 5
Quanto à opção C, consultar reservas: Temos simplesmente que saber qual o dia e refeição de que pretendemos saber o número de refeições reservadas e mostrar o correspondente elemento do array. Sub consultar_reservas() ' permite consultar o número de refeições reservada para uma refeição seleccionada Dim dia As Integer, ref As Integer dia = ler_dia() ref = ler_ref() MsgBox "Número de reservas na " & dia_s(dia) & " para a refeição " & _ refeição(ref) & " : " & registo(dia, ref).reserva 11 Quanto à opção C, consultar reservas: Estamos a utilizar a função refeição que devolve almoço ou jantar de acordo com a argumento que lhe seja passado for 1 ou 2. Function refeição(ref As Integer) ' função que devolve "Almoço" se o parâmetro for 1 e "Jantar" se for 2 If ref = 1 Then refeição = "Almoço" Else refeição = "Jantar" End If 12 6