Ir ao conteúdo
  • Cadastre-se

C Implementar em vetor struct usando malloc e realloc


Posts recomendados

Pessoal, preciso criar um código seguindo essa base: 

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

 

 

algo mais ou menos assim: 

 typedef struct Lista lista;

    struct Lista {
    char nome[81];
    char telefone[15];
    char celular[15];
    char endereco[101];
    };

Mas não sei como faço para criar um vetor de struct que armazene em cada posição um struct de cliente e realocar quando atingir o limite, alguém dá um help? 

Link para o comentário
Compartilhar em outros sites

ve se esse topico te ajuda:
https://www.clubedohardware.com.br/forums/topic/1558865-alocação-dinamica-de-array-inclusão-exclusão-e-free/


Observe que tamanho dobra quando atinge o limite. O melhor seria crescer de um tanto x qualquer que você determinar.

Olha, deixa eu te dar uma dica... Se você tá pensando em fazer um programa grande, pensa que não vai ser legal fazer exclusão fisica depois, porque vai lhe ser muito, muito trabalhoso de fazer isso sem que o seu programa de algum problema. Se isso valer a pena ok... Mas se não, pense em usar um banco de dados (SQL).

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Daniel Ferreira Ribeiro disse:

algo mais ou menos assim: 

 

typedef struct Lista lista;

    struct Lista {
    char nome[81];
    char telefone[15];
    char celular[15];
    char endereco[101];
    };

 

Mas não assim... O que seria lista nesse caso? e Lista? Tenha um plano.

 

Escreva em torno dos dados

 

Deixe a estrutura anônima, são apenas campos constantes... Defina o nome ao final.

 

Porque sua estrutura não tem os mínimos campos previstos no enunciado???

 

Está claro que tem um vetor de clientes e vai cadastrar os caras em grupos de 10... Está escrito lá. Então escreva isso em seu código:

 

1 hora atrás, Daniel Ferreira Ribeiro disse:

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

 

Porque mudou o tamanho nome para 81? 

Para que telefone, celular e endereço se não tem sequer o montante que sabe que vai ter que zerar como parte do enunciado? E onde está o ano de nascimento? É uma lista de 3 campos e você criou só um e mudou o tamanho. 

 

E porque Lista e lista se é um CLIENTE?

 

Não programe assim. 

 

Compare:

 

typedef struct
{
    char    nome[31];
    char    ano[5];
    double  montante;

}   Cliente;

 

Isso não seria mais simples? E um vetor de 10 desses?

 

	Cliente		cl[10];

 

Com isso já pode criar uns clientes e preencher o vetor e criar todas as funcionalidades do programa...

Então faça.

 

Escreva em torno dos dados. Nada interativo. Teste tudo logo e rápido. A capacidade do cadastro nada tem a ver com as funções, certo?

 

Pode tratar isso separado, em dois programas, de qualquer jeito.

 

E o cadastro?

 

É claro que um vetor é pouco para expressar os dados, certo?  E porque? É óbvio que cl é Cliente[10] no exemplo acima. Está escrito lá. Mas quantos caras tem lá? Falta um contador. Pode estar vazio mas tem 10.

Falta um total.

 

Sem pensar muito:

 

typedef struct
{
	unsigned  N; // quantos tem agora
	unsigned  T; // quantos pode ter 
	Cliente   cl]10];// os clientes

}   Cadastro;

 

E um programa

 

#include <stdio.h>

typedef struct
{
    char   nome[31];
    char   ano[5];
    double montante;

} Cliente;

typedef struct
{
    unsigned  N;     // quantos tem agora
    unsigned  T;     // quantos pode ter
    Cliente   cl[10];// os clientes

} Cadastro;

int main(void)
{
    Cadastro cad;  // um cadastro
    cad.N = 0;     // vazio
    cad.T = 10;    // cabem 10

    Cliente jhonny = {"Johnny Cash", "1951", 10.11};

    // coloca esse cliente no cadastro
    cad.cl[0] = jhonny;
    cad.N     = 1;

    printf("\
    Cadastro tem %d clientes de um total de %d\n\
    primeiro cliente: \"%s\"\n",
        cad.N, cad.T, cad.cl[0].nome);
    return 0;
}

 

E até roda:

 

    Cadastro tem 1 clientes de um total de 10
    primeiro cliente: "Johnny Cash"

 

Escreva em torno dos dados e se preocupe em ter logo algo para mostrar ou testar. Em geral é o que faz diferença, na escola ou na indústria.

 

E como redimensionar um cadastro?

 

Eu postei um longo exemplo com as duas possibilidades comuns, aqui nesse forum meses atrás, entre muitas vezes que se discutiu isso aqui. Pode pesquisar no meu conteúdo. Por certo deve ter exemplos em C e C++ porque essas coisas de cadastros e containers de coisas são boa parte dos problemas aqui. Se eu achar o post eu listo aqui depois.

 

Em resumo TL;DR

 

Ou se declara um ponteiro e um tamanho, como em 
 

    int         n;
    Cliente*	loja1; // o vetor

 

Ou se declara um vetor de ponteiros como em

 

    int         n;
    Cliente**   grupo; // o vetor

 

E se aloca memória conforme a necessidade, usando malloc() e realloc() 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...