Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

alocação dinâmica de structs

Recommended Posts

Exercicio:

1. Faça uma função que inicialize todas as posições do vetor para NULL. (Como vou inicializar todos se nem sei quantos vão ter?)

2. A cada cadastro, fazer o malloc utilizando um ponteiro auxiliar. Leia os dados de cadastro para dentro desta estrutura e passe para a função cadastrar este ponteiro como parâmetro para que esta proceda o cadastro. A forma de cadastro será somente atribuir o endereço recebido para a posição do cadastro atual no vetor. Fazer a verificação se o ponteiro recebido como parâmetro é nulo, antes de efetuar o cadastro.

3. Insira uma lógica para cadastrar a nova estrutura recebida na 1ª posição livre do vetor de ponteiros. (Usei a váriavel global qtd_cadastro, seria isso?)

 

bom, estou tentando fazer alocação de uma struct aqui, mas to perdido...não sei onde criar a variavel da struct, se como global, ou dentro da main, ou sei lah onde...O que seria isso: FUNCIONARIO* cadastros[N]; ?? Um ponteiro para um vetor?? Não entendi como funciona isso "/

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
	char nome[60];
	int idade;
}Funcionario;
Funcionario *cadastro;

int qtd_cadastro = 0;

void Menu();
void ExecutaOpcao(int opcao);
void Cadastrar(char *nome, int idade);
void Exibir();

int main(void)
{
	int opcao;
	cadastro = (Funcionario*)malloc(qtd_cadastro * sizeof(Funcionario));
	if(cadastro == NULL)
	{
		printf("\nESTOURO DE MEMORIA!");
		exit(0);
	}
	do
	{
		Menu();
		printf("\nDigite uma opcao: ");
		scanf("%d",&opcao);
		ExecutaOpcao(opcao);
	}while(opcao != -1);


	return(0);
}

void Menu()
{
	printf("0  - Cadastrar");
	printf("\n1  - Exibir");
	printf("\n2  - Alterar");
	printf("\n3  - Excluir");
	printf("\n-1 - Sair");
}

void ExecutaOpcao(int opcao)
{
	char nome[60];
	int idade;
	switch(opcao)
	{
		case 0:
			printf("\nNome: ");
			fflush(stdin);
			scanf("%s",&nome);
			printf("Idade: ");
			fflush(stdin);
			scanf("%d",&idade);
			Cadastrar(nome,idade);
		break;
		case 1:
			Exibir();
		break;
		case -1:
			printf("\nSAINDO...");
		break;
	}
}

void Cadastrar(char *nome, int idade)
{
	system("cls");
	strcpy(cadastro[qtd_cadastro].nome,nome);
	cadastro[qtd_cadastro].idade = idade;
	qtd_cadastro++;
}

void Exibir()
{
	int i;
	system("cls");
	for(i=0;i<qtd_cadastro;i++)
	{
		printf("Nome: %s",cadastro[i].nome);
		printf("\nIdade: %d\n\n",cadastro[i].idade);
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
1. Faça uma função que inicialize todas as posições do vetor para NULL. (Como vou inicializar todos se nem sei quantos vão ter?)

 

Na maioria das vezes não se espera a necessidade surgir p/ alocar espaço. O que se tem é um pool com espaço pra N elementos pré-alocado. Isso é de algum livro? Se for,ajuda reler o capítulo p/ ver qual é o foco da coisa.

 

 

3. Insira uma lógica para cadastrar a nova estrutura recebida na 1ª posição livre do vetor de ponteiros. (Usei a váriavel global qtd_cadastro, seria isso?)

 

Parece que não. você só está contando qtos cadastros tem,mas essa variável não insere nada em lugar nenhum. É isso que tem que ser criado.

 

 

.O que seria isso: FUNCIONARIO* cadastros[N]; ?? Um ponteiro para um vetor?? Não entendi como funciona isso

 

Onde você tá vendo *cadastros[N]?

 

2. A cada cadastro, fazer o malloc utilizando um ponteiro auxiliar. Leia os dados de cadastro para dentro desta estrutura e passe para a função cadastrar este ponteiro como parâmetro para que esta proceda o cadastro. A forma de cadastro será somente atribuir o endereço recebido para a posição do cadastro atual no vetor. Fazer a verificação se o ponteiro recebido como parâmetro é nulo, antes de efetuar o cadastro.

 

Leia essa parte de novo e olhe o que você está fazendo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

só uma coisa, isso existe FUNCIONARIO* cadastros[N];?

Compartilhar este post


Link para o post
Compartilhar em outros sites

mudei umas coisas ai, mas ainda ta errado...não to conseguindo entender o que este exercício pede...ta muito confuso, mas acho que "Funcionarios cadastro;" tem que ser declarado como variável local neh?? pra fazer sentido este vetor de ponteiros para a estrutura Funcionarios.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CADASTRAR 0
#define EXCLUIR 1
#define ALTERAR 2
#define IMPRIMIR 3
#define SAIR -1
#define SIZE 50

int qtd_cadastro = 0;

typedef struct
{
	char nome[60];
	short idade;
	int rg;
	float salario;
}Funcionarios;
Funcionarios cadastro[SIZE];

void Menu();
void executaOpcao(int opcao);
void Cadastrar(char *nom, short id, int rg, float sal, int slot);
void Imprimir();
void Excluir(char *nom);
void Alterar(char *nom);
void inicializaVetorZerado();
int verificaPosicaoLivre();

void main(void)
{
	int opcao;
	inicializaVetorZerado();
	do
	{
		Menu();
		printf("\nDigite a opcao: ");
		scanf("%d",&opcao);
		executaOpcao(opcao);
	}while(opcao != SAIR);
}
void Menu()
{
	printf("0 - Cadastrar Funcionario\n");
	printf("1 - Excluir aluno\n");
	printf("2 - Alterar aluno\n");
	printf("3 - Imprimir dados\n");
	printf("-1 - SAIR\n");
}
void executaOpcao(int opcao)
{
	char nom[30];
	short id;
	int rg;
	float sal;
	int slot;

	switch(opcao)
	{
		case CADASTRAR:
			slot = verificaPosicaoLivre();
			if(slot == -1)
			{
				printf("\nVETOR CHEIO");
				break;
			}
			printf("\nNome: ");
			fflush(stdin);
			gets(nom);

			printf("Idade: ");
			scanf("%d",&id);

			printf("RG: ");
			scanf("%d",&rg);

			printf("Salario: ");
			scanf("%f",&sal);

			Cadastrar(nom,id,rg,sal,slot);
		break;
		case EXCLUIR:
			printf("\nInforme o nome: ");
			fflush(stdin);
			gets(nom);
			Excluir(nom);
		break;
		case ALTERAR:
			printf("\nNome: ");
			fflush(stdin);
			gets(nom);
			Alterar(nom);
		break;
		case IMPRIMIR:
			Imprimir();
		break;
		case SAIR:
			printf("\nSAINDO...");
		break;
	}
}
void Cadastrar(char *nom, short id, int rg, float sal, int slot)
{
	system("cls");
	strcpy(cadastro[slot].nome,nom);
	cadastro[slot].idade = id;
	cadastro[slot].rg = rg;
	cadastro[slot].salario = sal;
	printf("MEMBRO CADASTRADO COM SUCESSO\n\n");
}
void Imprimir()
{
	int i;
	system("cls");
	printf("[*** LISTA DE REGISTRO ***]\n");
	for(i=0;i<SIZE;i++)
	{
		if(!(cadastro[i].nome[0] == '\0'))
		{
			printf("\nID #: %d",i);
			printf("\nNome: %s",cadastro[i].nome);
			printf("\nIdade: %d",cadastro[i].idade);
			printf("\nRG: %d",cadastro[i].rg);
			printf("\nSalario: %.2f",cadastro[i].salario);
			printf("\n");		
		}
	}
	printf("\n\n");
}
void Excluir(char *nom)
{
	int naoencontrado = 0;
	int i,k;
	system("cls");
	for(i=0;i<SIZE;i++)
	{
		if(strcmp(nom,cadastro[i].nome) == 0)
		{
			for(k=i;k<SIZE;k++)
			{
				strcpy(cadastro[k].nome,cadastro[k+1].nome);	
			}
			printf("REGISTRO EXCLUIDO!\n\n");
			break;
		}
		else
		{
			naoencontrado = 1;
		}
	}
	if(naoencontrado)
	{
		printf("REGISTRO NAO ENCONTRADO\n\n");
	}
}
void Alterar(char *nom)
{
	int nao_encontrado = 0;
	int i;
	system("cls");
	for(i=0;i<SIZE;i++)
	{
		if(strcmp(nom,cadastro[i].nome) == 0)
		{
			printf("Novo Nome: ");
			fflush(stdin);
			gets(cadastro[i].nome);

			printf("Nova Idade: ");
			scanf("%d",&cadastro[i].idade);

			printf("Novo RG: ");
			scanf("%d",&cadastro[i].rg);

			printf("Novo Salario: ");
			scanf("%f",&cadastro[i].salario);

			printf("REGISTRO ALTERADO!\n\n");
			nao_encontrado = 0;
			break;
		}
		else
		{
			nao_encontrado = 1;
		}
	}
	if(nao_encontrado == 1)
	{
		printf("Registro Nao Encontrado no BD!\n\n");
	}
}

void inicializaVetorZerado()
{
	int i;
	for(i=0;i<SIZE;i++)
	{
		cadastro[i].nome[0] = '\0';
	}
}

int verificaPosicaoLivre()
{
	int i;
	for(i=0;i<SIZE;i++)
	{
		if(cadastro[i].nome[0] == '\0')
		{
			if(i == SIZE)
			{
				return -1;
			}
			return i;
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.