Professional Documents
Culture Documents
1 Contexto
Uma distribuidora de produtos para supermercado deseja automatizar os processos de cadastro e
controle de estoque (produtos) e sistema de vendas (clientes e lista de produtos).
A distribuidora precisa realizar o registro de todos os produtos que hoje são feitos via planilhas e
impressão de formulários para preenchimento. Para tal, precisa de um sistema que faça o cadastro dos
produtos existentes, o controle de produtos em estoque e o registro de vendas para cada cliente bem
como as saídas de produtos do estoque para a realização da venda.
Para o cadastro de produtos, os seguintes dados são necessádios: Código do Produto, nome do
produto, descrição do produto, data de fabricação, número do lote, preço unitário e quantidade de
produtos em estoque. Um produto somente pode ser vendido se a quantidade em estoque é suficiente
para a realização da venda.
O sistema de vendas necessita registrar os dados dos clientes, para isso são necessários: nome do
cliente, CPF ou CNPJ, identidade, data de nascimento, endereço completo (i.e. logradouro, número,
complemento, bairro, cidade e CEP), tipo de cliente (pessoa física ou jurídica). Caso seja pessoa jurídica,
o nome da empresa deverá ser registrado. Além disso, o sistema de vendas deverá ser capaz de procurar
o produto pretendido pelo cliente e validar a quantidade necessária para a realização da venda e listar
as informações do produto e sua respectiva quantidade para a realização da venda. Além disso, a
quantidade total do valor da venda deverá ser registrada no ato de realização da venda. Também é
importante registrar a data de realização da compra e a data do prazo para pagamento pelo cliente e se
o pagamento será ou não efetuado no ato da compra. O registro da realização da venda somente poderá
ser feito se o cliente não possui nenhum débito registrado no sistema.
Diante desse cenário, para o desenvolvimento do sistema, serão necessários a construção de três
módulos: (i) módulo do produtos, (ii) módulo do cliente e (iii) módulo de vendas. Então, realize a
modelagem de dados por meio da abstração do problema real para um sistema de cadastro e controle
de empréstimos. Leia o contexto do problema, faça a interpretação dos processos envolvidos no sistema
de cadastro e controle de estoque e vendas para dar início à construção das estruturas de dados para
armazenar as todas informações necessárias do problema e das operações referentes a cada processo
de controle de estoque e vendas. Esses são os elementos que constituiem um Tipo Abstrato de Dados
(T.A.D.).
2 Arquitetura de Software
O ciclo de vida tradicional do desenvolvimento de software envolve as fases de análise, projeto,
implementação, teste e manutenção. Na fase de análise, determinamos o que o software precisa fazer,
quais problemas deverá resolver e quais informações deverá manipular.
Na fase de projeto, o objetivo é definir como o software será desenvolvido. Estamos falando de uma
definição geral, não detalhada. Na fase de projeto, escolhemos a arquitetura do software, definimos
quais são os principais módulos e, com isso, podemos dividir o trabalho entre os desenvolvedores - cada
membro da equipe fica responsável pela implementação de um dos módulos. A Figura 1 apresenta uma
visualização simples da arquitetura do software na qual o software é construído sobre duas bases: (i) os
Tipos Abstratos de Dados (TAD) com seus tipos definidos e operações sobre esses tipos, os módulos de
acordo com o contexto do problema; e, por fim, (ii) interface gráfica com o usuário, que é o meio visual
de comunicação entre o usuário do sistema e os objetos do software.
As outras fases, referem-se à implementação (codificação em uma linguagem de programação), teste
(para garantir que o software funcione segundo o esperado) e manutenção (ajuste ou evolução nas fun-
cionalidades do software, ao longo de seu perído de utilização). Para uma leitura complementar sobre o
ciclo de vida tradicional do desenvolvimento de software, consulte Sommerville1 e Pressman2 .
1 Sommerville, R. I. Engenharia de Software. 6 ed. São Paulo: Addison Wesley, 2003. p. 35-38
2 Pressman, R. Engenharia de Software. 3 ed. São Paulo: Makron Books, 1995. p. 32-35
MINISTÉRIO DA EDUCAÇÃO
Universidade Federal de Ouro Preto
Departamento de Computação e Sistemas
Campus João Monlevade
Diante disso, independente do problema a ser solucionado pelo software que será desenvolvido, é
extremamente importante definir qual será a arquiteura do sitema na fase de projeto.
é chamado de passagem de parâmetro (que pode ser por valor ou referência). A principal diferença entre função e pro-
cedimento é que uma função sempre retorna algum valor, enquanto que o procedimento não retorna um valor depois de
realizar a sua operação.
Page 2
MINISTÉRIO DA EDUCAÇÃO
Universidade Federal de Ouro Preto
Departamento de Computação e Sistemas
Campus João Monlevade
(produto, cliente ou venda) para rearranjá-lo, por exemplo, se o elemento a ser excluído está no
índice i e existem n elementos, desloca-se o elemento da posição i + 1 para a posição i até o
n-ésimo elemento cadastrado no vetor, depois, o campo indice do TAD deve ser atualizado, ou seja,
deverá ser decrementado pois um elemento foi excluído. Dentro da função Excluir deve-se fazer o
uso da função Pesquisar para identificar o índice do elemento que deverá ser excluído.
Observação: lembre-se de se perguntar do que cada função precisa para realizar a operação, ou seja,
quais dados são necessários para realizar a operação, e quais deles devem ou não ser por passagem de
parâmetro por valor ou referência.
Page 3
MINISTÉRIO DA EDUCAÇÃO
Universidade Federal de Ouro Preto
Departamento de Computação e Sistemas
Campus João Monlevade
4 Exercícios de Implementação
1. Releia os conceitos e definições das operações básicas Pesquisar, Alterar e Excluir da seção 3.1
e implemente as funções a seguir para cada TAD dos módulos de acordo com seus respectivos
cabeçalhos:
(a) int PesquisarCliente(TModuloCliente modulo, TCliente cliente)
(b) void AlterarCliente(TModuloCliente *modulo, TCliente cliente)
(c) void ExcluirCliente(TModuloCliente *modulo, TCliente cliente)
OBSERVAÇÃO: Lembre-se que o nome de cada função deverá estar de acordo com cada tipo
de módulo. No cabeçalho das funções definidas anteriormente para cada letra da questão, o nome
das funções estão de acordo com o Módulo Cliente que é responsável pelo objeto Livro.
2. Adicione a criação do menu principal e dos submenus no Projeto TAD Estoque conforme apresen-
tado em laboratório e complete o programa com as chamadas para as funções básicas e auxiliares
conforme cada opção de menu para os módulos de Cliente e Produto.
3. Crie a função InserirVenda de acordo com as restrições para a realização de uma venda da
distribuidora de produtos apresentadas no contexto do problema na seção 1, lembre-se existem
restrições com relação à quantidade de produtos disponíveis em estoque e se o cliente possui débitos
em aberto no sistema. Por enquanto, para realização de uma venda, não leve em consideração a
existência de débitos, posteriormente, isso deverá ser tratado em outra questão (questão 8). Para
o cadastro de uma venda leve em consideração os seguintes requisitos:
a. A função deverá receber como parâmetro uma venda (TVenda), para isso, deve-se assumir
que CPF ou CNPJ, CODIGO_DO_PRODUTO e data_da_compra já venham preenchidos para esse
parâmetro antes da chamada da função InserirVenda.
b. O Módulo de Venda também deverá ser passado como parâmetro.
c. Para realização de uma venda, você deverá realizar uma chamada à função Pesquisar refe-
rente ao objeto Produto e Cliente para identificar se eles realmente existem dentro de seus
respectivos módulos. Uma vez com os retornos dos índices de Produto e Cliente, a função
InserirVenda poderá realizar uma venda lendo a data de realização da compra como entrada
e verificar a restrição da quantidade de produtos disponíveis em estoque. Além disso, a quan-
tidade de produtos vendidos também deve ser atualizada no objeto produto cadastrado no
Módulo Produto.
d. Uma vez que a disponibilidade do Produto para a realização da venda foi confirmada em esto-
que, o que falta agora é registrá-la. No entanto, a função recebe apenas um CODIGO_DO_PRODUTO
dentro do parâmetro venda e, de acordo com a estrutura TVenda, o campo que armazena mais
de um Produto é o vetor de produtos, o que resulta em um problema. Diante disso, seria
melhor (i) refazer a estrutura TVenda ou (ii) modificar a função InserirVenda para que possa
receber mais de um Produto como parâmetro para realizar uma venda? Para resolver esse
problema, deve-se pensar como funciona uma venda na prática, pois, quando se realiza uma
venda um produto da distribuidora, o usuário também pode decidir pagar todos os produtos
ou apenas um de cada vez. Nesse sentido, o melhor seria inserir uma venda por produto,
assim, a estrutura TVenda deve ser modificada de modo que não exista mais um vetor de
CODIGO_DO_PRODUTO mas sim apenas um campo para registrar um produto por venda.
NOTA: Sempre que necessário, um refinamento do projeto inicial por meio de uma revisão e
alteração das estruturas e operações deverá ser realizado.
Page 4
MINISTÉRIO DA EDUCAÇÃO
Universidade Federal de Ouro Preto
Departamento de Computação e Sistemas
Campus João Monlevade
5. Desenvolva uma função auxiliar ImprimirTodos que utiliza a função auxiliar Imprimir para realizar
a impressão de todos os elementos cadastrados em seu respectivo módulo (produto, cliente ou
venda). Além disso, adicione uma opção em cada submenu para que o usuário possa escolher
visualizar um relatório geral de elementos cadastrados por meio do uso da função ImprimirTodos.
Essa função deverá receber como parâmetro apenas o módulo.
6. Crie uma função auxiliar para realizar a baixa das vendas realizadas, essa função deverá receber
como parâmetros o módulo de venda e um objeto venda para que a baixa seja realizada. Uma
baixa para uma venda é o equivalente à realização do pagamento referente a uma compra do
cliente. Deve-se assumir que, para o objeto venda, os campos CPF ou CNPJ, CODIGO_DO_PROUDTO
e data_da_compra já foram previamente preenchidos antes da chamada da função que realiza a
baixa. Lembre-se que deverá ser criada uma opção de menu para a realização da baixa no software
desenvolvido. Para realização da baixa de uma venda os seguintes requisitos devem ser observados:
a. A data da baixa (i.e. data da realização do pagamento) deverá ser lida como entrada, ou seja,
deverá ser digitada pelo usuário do sofware para realização da baixa.
b. O cálculo da multa deverá ser realizado a partir da data de prazo para pagamento e a data
de realização da baixa. Para tanto, deve-se primeiro calcular a quantidade de dias para multa
e a multa somente existe se a data do prazo para pagamento menos a data de realização da
baixa for maior ou igual a 1 dia, se isso for verdade, a multa deverá ser calculada conforme
apresentado no Contexto do Problema na seção 1.
c. Se existir multa, a informação de qua a multa foi paga ou não deverá ser registrada no
momento da baixa. Caso não seja paga, o usuário do software deverá ter a opção de registrar
o pagamento da multa posteriormente conforme questão 7.
7. Desenvolva uma função auxiliar que registra o pagamento de uma multa. Para isso, a função deverá
utilizar obrigatoriamentes o seguinte cabeçalho:
Page 5