CSE 111: Programação com Funções

S05 - Projeto: Mercearia

Finalidade

Prove que você pode desenvolver um programa Python que lê arquivos CSV e cria, preenche e usa um dicionário.

Projeto

Não use IA para gerar o código deste programa.

Usar IA para gerar este programa é uma violação da política de IA do curso e pode resultar em nota zero na atividade, reprovação na disciplina ou até remoção do programa.

Se você precisar de ajuda com a atividade ou tiver dúvidas sobre o uso de IA, por favor pergunte ao seu instrutor.

Contexto

Seu tio tem uma mercearia e acabou de começar a usar um serviço online que permite que os clientes façam pedidos de compras pela internet. Depois que um cliente conclui um pedido, o serviço online envia um arquivo CSV que contém o pedido dele para a mercearia. Seu tio pediu para você escrever um programa que leia o arquivo CSV e exiba na janela do terminal um recibo que lista os itens comprados e mostra o subtotal, o valor do imposto sobre vendas e o total.

Requisitos

O programa deve ler dois arquivos csv, o pedido do cliente e um catálogo de produtos. Cada item do pedido do cliente será pesquisado no catálogo de produtos para obter o preço atual. Já o pedido será exibido no terminal que mostra os detalhes do pedido do cliente. Use os seguintes dados para criar o programa.

  1. Leia o inventário de produtos do arquivo produtos.csv.
  2. Leia o pedido do cliente no arquivo pedido.csv
  3. Para cada item do pedido, pesquise o produto no catálogo e use as informações do catálogo para calcular e exibir o pedido.
  4. Exiba o recibo do pedido.
    1. Exiba o nome da loja (você escolhe o nome) na parte superior do recibo.
    2. Exiba a lista de itens pedidos. Inclua o nome do item, a quantidade pedida e o preço por item.
    3. Some e exiba o número de itens pedidos.
    4. Some e exiba o subtotal devido.
    5. Calcule e exiba o valor do imposto sobre vendas. Use 6% como alíquota do imposto.
    6. Calcule e exiba o valor total devido.
    7. Exiba uma mensagem de agradecimento.
    8. Obtenha a data e a hora atuais do sistema operacional do seu computador e as exiba. Você pode acessar o conteúdo da semana 1 - Documentação Útil para relembrar como fazer isso.
    9. Inclua um bloco try e blocos except para lidar com FileNotFoundError, PermissionError e KeyError.

Design

A maior parte do trabalho deste programa é realizado na função main. Certifique-se de incluir o tratamento de erros conforme descrito nos requisitos .

Especificações das Funções
Nome da Função Tipo de Retorno de Parâmetros Descrição
ler_dicionario Parâmetros filename,
indice_coluna_chave
Tipo de Retorno
Dicionário
Esta função lê os dados do produto do arquivo csv passado para a função no parâmetro filename. A chave do dicionário está contida na coluna de dados csv indicada pelo parâmetro indice_coluna_chave, o valor de cada item do dicionário é a lista derivada dos valores na linha do arquivo csv. A função retorna um dicionário de produtos.
main Lê o arquivo recibo.csv, processa esse arquivo e exibe o recibo de acordo com os requisitos.

Informações úteis.

Etapa

Comece seu projeto escrevendo e testando a função ler_dicionario.

  1. Crie uma pasta para o projeto desta semana e dê a ela o nome que você quiser.
  2. Abra a pasta que você acabou de criar no VSCode.
  3. Baixe ambos os arquivos produtos.csv e pedido.csv e salve-os na pasta do seu projeto.
  4. Abra o arquivo produtos.csv no VS Code e examine-o. Observe que cada linha neste arquivo contém três valores separados por vírgulas: um número do produto, um nome de produto e um preço de varejo. Observe também que cada número do produto no arquivo produtos.csv é único. Isso significa que seu programa pode ler o arquivo produtos.csv em um dicionário e usar os números dos produtos como chaves no dicionário.
  5. Crie um arquivo chamado recibo.py na pasta do seu projeto.
  6. Crie a função ler_dicionario. Ela deve abrir um arquivo CSV para leitura e usar um csv.reader para ler cada linha e preencher um dicionário composto com o conteúdo do arquivo produtos.csv.
  7. Crie a função main e adicione os seguintes recursos.
    1. Chama a função ler_dicionario e armazene o dicionário retornado na variável dic_produtos.
    2. Exibe o dicionário.
    3. Abre o arquivo pedido.csv para leitura.
    4. Pula a primeira linha do arquivo pedido.csv porque ela contém títulos de coluna.
    5. Usa um loop para ler e processar cada linha do arquivo pedido.csv. Dentro do corpo do loop, seu programa deve fazer o seguinte para cada linha:
      1. Usar o número do produto solicitado para encontrar o item correspondente no dic_produtos.
      2. Exibir o nome do produto, a quantidade solicitada e o preço do produto.
  8. Na parte inferior do seu arquivo recibo.py, adicione uma chamada para a função main. Certifique-se de proteger a chamada para main com uma instrução if, conforme ensinado no conteúdo de preparação da semana 3.

Procedimento de Teste

Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:

  1. Baixe o arquivo test_produtos.py e salve-o na mesma pasta onde você salvou seu programa recibo.py. Execute o arquivo test_produtos.py e certifique-se de que a função test_leitura_do_dicionario seja aprovada. Se não passar, há um erro na sua função ler_dicionario. Leia a saída de pytest, corrija o erro e execute o arquivo test_produtos.py novamente até que a função de teste seja aprovada.
    > python test_produtos.py
    ==================== test session starts ======================
    platform win32--Python 3.8.6, pytest-6.1.2, py-1.9.0, pluggy
    rootdir: C:\Usuários\cse111\semana05
    collected 1 item
    test_produtos.py::test_leitura_do_dicionario PASSED         [100%]
    ===================== 1 passed in 0.12s ======================
  2. Execute seu programa e verifique se ele exibe o dicionário de produtos e os itens solicitados, conforme mostrado no exemplo de saída abaixo.
    > python recibo.py
    Todos os Produtos
    {'D150': ['D150', '1 litro de leite', '2.85'],
     'D083': ['D083', '1 copo de iogurte', '0.75'],
     'D215': ['D215', '450g de queijo cheddar', '3.35'],
     'P019': ['P019', 'alface americana', '1.15'],
     'P020': ['P020', 'alface crespa', '1.79'],
     'P021': ['P021', 'alface manteiga', '1.83'],
     'P025': ['P025', 'embalagem de rúcula (227g)', '2.19'],
     'P143': ['P143', '450g de mini cenouras', '1.39'],
     'W231': ['W231', 'pacote de granola (907g)', '3.21'],
     'W112': ['W112', 'pão de trigo', '2.55'],
     'C013': ['C013', 'barrinha de chocolate Twix', '0.85'],
     'H001': ['H001', '8 rolos de papel higiênico', '6.45'],
     'H014': ['H014', '1 caixa de cotonetes (75 unidades)', '2.49'],
     'H020': ['H020', '1 esponja de limpeza', '2.39'],
     'H021': ['H021', 'frasco de detergente (354ml)', '3.19'],
     'H025': ['H025', 'limpador de vaso sanitário', '4.50']}
    Itens Pedidos
    pão de trigo: 2 @ 2.55  
    1 copo de iogurte: 4 @ 0.75  
    pacote de granola (907g): 1 @ 3.21  
    barrinha de chocolate Twix: 2 @ 0.85  
    1 copo de iogurte: 3 @ 0.75
    
    

Envio de Etapa

Na data de entrega ou antes dela, retorne ao Canvas e reporte seu progresso nesta etapa.

Conclusão do Projeto

Conclua seu projeto completando a função main. Certifique-se de que seu código atenda a TODOS os requisitos especificados acima.

  1. Remova a linha que exibe o dicionário do produto.
  2. Adicione o código restante necessário para atender ao requisito 4 do usuário.

Informações Úteis

Teste

Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:

  1. Execute seu programa e verifique se ele exibe um recibo formatado de forma semelhante ao mostrado abaixo. Seu programa deve exibir a data e a hora atuais exatamente com a mesma formatação mostrada abaixo. Além disso, verifique se o seu programa calcula o número de itens, o subtotal, o imposto sobre vendas e o total, conforme mostrado abaixo.
    t; python recibo.py
    Empório Inkom
    pão de trigo: 2 @ 2.55
    1 copo de iogurte: 4 @ 0.75
    pacote de granola (907g): 1 @ 3.21
    barrinha de chocolate Twix: 2 @ 0.85
    1 copo de iogurte: 3 @ 0.75
    Número de itens: 12
    Subtotal: 15.26
    Imposto sobre vendas: 0.92
    Total: 16.18
    Obrigado por comprar no Empório Inkom.
    10/04/2025 05:10:30
    
  2. Verifique se o bloco except para lidar com KeyError que você adicionou ao seu programa funciona corretamente fazendo o seguinte:

    1. Adicione temporariamente a seguinte linha ao final do seu arquivo pedido.csv e salve o arquivo.
      R002,5
    2. Execute o programa novamente e verifique se ele exibe uma mensagem de erro como a mostrada abaixo.
      > python recibo.py
      Error: unknown product ID in the request.csv file
      'R002'
      Dica: se você escreveu um bloco except no seu programa para lidar com KeyError e adicionou "R002,5" ao arquivo pedido.csv, depois salvou o arquivo pedido.csv e executou programa, mas ele não está gerando KeyError, então verifique em seu programa se você escreveu uma instrução if antes da instrução que encontra um valor no dicionário de produtos. Procure um código semelhante a este:
      if num_prod in dic_produtos:
          lista_infos_produtos = dic_produtos[num_prod]
          ⋮
      
      Se o seu programa contiver uma instrução if semelhante à acima, então a instrução if provavelmente está impedindo o seu programa de gerar um KeyError. Exclua a instrução if, desfaça o recuo das linhas de código dentro da instrução if e teste seu programa novamente.
  3. Verifique se o bloco except para lidar com FileNotFoundError que você adicionou ao seu programa funciona corretamente fazendo o seguinte:
    1. Exclua temporariamente ou renomeie o arquivo produtos.csv.
    2. Execute o programa novamente e verifique se ele exibe uma mensagem de erro como a mostrada abaixo.
      > python recibo.py
      Error: missing file
      [Errno 2] No such file or directory: 'produtos.csv'
Desafios Adicionais

Se o seu programa atender aos requisitos para esta atividade, conforme descrito acima, você receberá 93% dos pontos possíveis. Para ganhar os 7% de pontos restantes, você precisará adicionar um ou mais recursos ao seu programa. Use sua criatividade. Adicione um comentário no topo do seu código que explique a(s) melhoria(s).

Documente suas melhorias:

Se você escolher adicionar recursos ao seu código, coloque um comentário no topo do seu arquivo descrevendo o que você fez para melhorar seu programa.

Envio do Projeto

Volte ao Canvas e envie seu arquivo recibo.py para que seu programa seja avaliado.

Não tire zero!

Se um erro impedir que seu programa seja executado até a conclusão, o avaliador atribuirá zero à tarefa e solicitará que você corrija e reenvie seu programa. Em outras palavras, em vez de enviar um programa que não funciona, é melhor pedir ajuda para entender como corrigir o problema antes de enviar seu programa.

Links Úteis:

  1. Voltar para: Visão Geral da Semana | Página Inicial