You are on page 1of 5

MINISTÉRIO DA EDUCAÇÃO

Universidade Federal de Ouro Preto


Departamento de Computação e Sistemas
Campus João Monlevade

TIPOS ABSTRADOS DE DADOS: CONTEXTO E APLICAÇÃO

Curso: Engenharia de Produção/Sistemas de Informação 1o semestre de 2019


Disciplina: Algoritmos e Estruturas de Dados I Data: 01/04/19
Professor: Alexandre Magno de Sousa

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

Figura 1: Arquitetura do Software.

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.

3 Tipo Abstrato de Dados (T.A.D.)


Um TAD envolve dois elementos essenciais: (a) os dados e (b) as operações sobre esses dados.
Os dados são obtidos a partir da abstração do problema real, representam as informações necessárias
envolvidas no processo do problema. O recurso da linguagem C utilizado para a construção dos tipos de
dados necessários são os registros ou structs, também são chamados de tipos de dados heterogêneos.
As operações nada mais são do que “aquilo que os sitema pode fazer” com os dados e, geralmente, o
nome de uma operação é representado por um verbo no infinitivo pois indica uma ação realizada sobre os
dados (e.g. cadastrar, alterar, excluir ou pesquisar). Em uma linguagem de programação, as operações
são representadas por meio de funções ou procedimentos3 . Na linguagem C, funções e procedimentos
são representados por meio de um bloco chamado de função.
Para construção das operações, sempre deve-se pensar primeiro em responder as seguintes questões:
1. O que você pode fazer com um elemento (livro, usuário ou empréstimo)? A partir daqui, as
operações básicas podem ser desenvolvidas;
2. O que cada operação precisa, em termos de dados, para ser realizada? Ou seja, quais parâmetros
são necessários? Deve-se utilizar passagem de parâmetro por valor ou por referência?
Observação: não será permitido o uso de variáveis globais para o desenvolvimento do programa,
pois não é uma boa prática de programação.

3.1 Operações Básicas


• Inserir (cadastrar): insere um elemento na estrutura de dados;
• Pesquisar: realiza a pesquisa por meio de um ID de um elemento passado como parâmetro no
vetor de elementos da estrutura de dados e retorna o índice de onde esse elemento se encontra;
• Alterar: recebe como parâmetro um elemento que será pesquisado para realizar a alteração dos
dados e recebe também o TAD que contém o vetor de elementos para que seja atualizado. Assume-se
que o elemento passado como parâmetro já vem com o ID digitado pelo usuário antes da chamada
da função Alterar. Além disso, dentro da função Alterar deve-se fazer o uso da função Pesquisar
e da função auxiliar Ler, vide seção 3.2, essa realiza a leitura dos novos dados para atualização de
um determinado elemento;
• Excluir: recebe como parâmetro um elemento a ser pesquisado para realizar a exclusão dos dados
e recebe também o TAD que contém o vetor de elementos. Assume-se que o elemento passado como
parâmetro já vem com o ID digitado pelo usuário antes da chamada da função Excluir. Para
excluir um elemento, deverá ser realizado o deslocamento dos elementos dentro do vetor do TAD
3 Funções e procedimentos podem receber como entrada parâmetros com os quais eles podem trabalhar, esse processo

é 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.

3.2 Operações Auxiliares


• Ler: recebe como passagem de parâmetro por referência um elemento (produtos, cliente ou venda)
e realiza a leitura de todos os dados desse elemento. Observação: para leitura de strings a função
fgets será obrigatória, o uso da função fflush(stdin) deverá ser feito antes de qualquer função
de leitura, seja fgets ou scanf, isso evita que o programa salte leituras durante a execução.
• Imprimir: recebe como passagem de parâmetro por valor um elemento e realiza a impressão de
todos os dados da estrutura desse elemento.

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.

4. Construa as funções de Pesquisar, Alterar e Excluir para um elemento venda semelhantes as


que foram construídas para produto e cliente, porém, como IDs da venda deverão ser utilizados
o ID do cliente, o ID do produto e a data de realização da veneda (TData) para que uma venda
possa ser pesquisada. Sendo assim, além do módulo, também deverá ser passado como parâmetro
um elemento venda (TVenda) assumindo que CPF ou CNPJ, CODIGO_DO_PRODUTO e data_da_compra
já foram previamente digitados antes da chamada dessas funções.

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:

void EfetuarPagamentoMulta(TModuloVenda *modulo, TVenda venda)

Considere que o parâmetro venda já apresenta os campos CPF ou CNPJ, CODIGO_DO_PRODUTO e


data_de_emprestimo previamente preenchidos antes da chamada da função EfetuarPagamento.
Não se esqueça de que uma opção para efetuar o pagamento referente a uma multa deverá ser
adicionada no Submenu do Módulo de Venda.

8. Considere a restrição referente à existência de débidos de clientes, levando também em consideração


e a existência ou não de multas, para uma determinada venda. Agora, pense no que deve ser
feito para que essas restrições sejam levadas em consideração dentro da função InserirVenda da
questão 3. Faça as alterações necessárias, inclusive alterações nas estruturas, para que a função
InserirVenda siga rigorasamente essas duas últimas restrições que faltavam.

Page 5

You might also like