Em algumas situações, para a implementação de um sistema computacional, não se conhece, previamente, qual o tamanho da massa de dados que será efetivamente manipulada. Em tais casos, pode ser usado o recurso de alocação dinâmica de memória. Com tal recurso, uma região de memória poderá ser alocada, sob demanda de modo a tornar o programa mais flexível em relação à quantidade de itens a serem manipulados. Essa flexibilidade torna o programa escalável.
O objetivo desta questão é exercitar a manipulação de ponteiros em um cenário onde se exige a alocação dinâmica de memória através da implementação de um programa computacional.
Antes de falarmos das funcionalidades do programa a ser implementado, convém mencionar que, em algumas situações o espaço previamente alocado deve ser redimensionado devido, à por exemplo, um aumento ou diminuição inesperada na quantidade de itens manipulados. Para realizar o redimensionamento, pode-se, na linguagem C, utilizar a função “realloc()”. Essa função segue a seguinte sintaxe:
void *realloc (void *ptr_original, size_t);
A função “realloc()” retorna a posição do bloco realocado com a nova dimensão. No trecho de código acima, o parâmetro “ptr_original” representa o bloco previamente alocado com a função “malloc()” ou “calloc()”. Detalhes destas funções, inclusive a “realloc()” poderão ser obtidas acessando-se (GARCIA, 2016) através do link: .
Para a realização desta atividade, suponha a necessidade de cadastrar clientes de uma loja. Por ser uma loja nova e com produtos inovadores, pouco se sabe do mercado a ser atingido, sendo assim, não se sabe a quantidade de clientes poderão ser cadastrados. Estima-se, inicialmente, em 10 clientes. Cada cliente terá os seguintes
campos:
- nome (suponha um nome com, no máximo, 30 caracteres)
- ano de nascimento
- montante de gastos realizados no mês (quanto o clinte pagou em suas compras dentro do mês corrente)
Para tanto, o sistema deverá oferecer as seguintes funcionalidades:
- incluir um novo cliente
- remover cliente - atualizar o montante de compras do cliente realizadas no mês corrente
- zerar todos os montantes de compras por ocasião da virada de mês
- listar o cliente melhor comprador
- exibir um montante de compras de um cliente específico.
O programa deverá, ainda, prever a situação que a quantidade de clientes a ser cadastrados supere a previsão inicial. Neste caso, quando o espaço de memória destinado a receber dados dos clientes estiver cheia, deve-se ampliar esse espaço – sempre em blocos de 10.
Soluções para a tarefa
Resposta:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct pedido
{
char namePed[200];
char CPF[200];
char numPed[200];
char qtdPed[200];
char valorped[200];
int cod;
}logP[200];
struct cadastro
{
char CPF[200];
char telefone[200];
char nome[200];
char endereco[200];
char data[200];
int vazio,cod;
struct pedido clientePed;
}log[200];
//AQUI DECLARO AS FUNÇÕES A SEREM USADAS
int verifica_pos(void);
int verifica_cod( int cod );
int opt;
void cadastroP(int cod,int pos);
void list();
void cadastroPedido();
void consultaCod (void);
void excluirCliente (void);
int main(void){ //INICIO DO MAIN
int i,Opcao,OpcaoCliente,posicao,retorno;
int codaux;
do
{
printf("1 - Cadastrar Novo Cliente\n");
printf("2 - Cliente\n");
printf("3 - Alterar Cliente\n");
printf("4 - Excluir Cliente\n");
printf("5 - Cadastrar Pedido\n");
printf("6 - Alterar Pedido\n");
printf("7 - Excluir Pedido\n");
printf("8 - Sair\n");
printf(" Selecione uma opcao por favor: ");
scanf("%d", &Opcao);
getchar();
if (Opcao == 1)
{
printf("Voce selecionou a opcao 1 - Cadastrar Novo Cliente\n");
posicao=verifica_pos();
if ( posicao != -1 )
{
printf("\nEntre com um codigo de 1 a 200 para seu cadastro: \n");
scanf("%d",&codaux);fflush(stdin);
retorno = verifica_cod( codaux );
if ( retorno == 1 )
cadastroP( codaux, posicao );
else{
printf("\nCodigo ja existente ou invalido pressione enter para voltar ao menu principal\n");
getchar();
system("cls");
main();
}
}
else
printf("\nNao e possivel realizar mais cadastros!\n");
break;
}