Ir ao conteúdo
  • Cadastre-se

C Algoritmo com struct, files e funções de cadastro, listagem, busca, exclusão...


Diridjow

Posts recomendados

Boa noite, gostaria de saber se alguém pode me ajudar e ter uma ideia para fazer exclusão de dados (não de todos, somente do qual a pessoa escolher/digitar de acordo com a matrícula), e também um relatório geral de todos os alunos cadastrados no software, estou com dificuldades nestas duas partes pois tudo o que eu fiz deu erro. Segue o algoritmo logo abaixo, obrigado desde já!

 

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
#include <locale.h>
#define ARQUIVO "Pessoa.dat"

typedef struct { 
     char nome_completo [30];
     int matricula;
	 char data_nascimento [11];
	 char naturalidade [30];
	 int numero_certidao_nascimento;
	 float peso;
	 char inf_adicionais [70]; // Espaço reservado para o usuário colocar informações além das perguntadas
	 char nome_pai [30];
	 char nome_mae [30];
} Pessoa;

void fechar_programa ();
void menu();
int LerString(char *str, int tammax);
int NovaPessoa();
int PedeDadosPessoa(Pessoa *pessoa);
int GravaNovaPessoa(Pessoa *pessoa);
int ConsultarPorID();
int MostraPessoa(Pessoa *pessoa);
Pessoa *LeProximaPessoa(FILE *file);

int main() {
    setlocale(LC_ALL, "Portuguese");
	menu();
    return 0;
}
 
 void menu() {
    
	int opcao;
   
    do{
        system("cls");
        
        printf ("|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
		printf ("||||||||||||||||||||| Software Escolar  |||||||||||||||||||||\n");
		printf ("|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
		printf ("|||||||||||||||||||||  Seja Bem-Vindo!  |||||||||||||||||||||\n");
		printf ("|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
		printf ("|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
		printf ("|||||||         1) Área de Cadastramento              |||||||\n");
		printf ("|||||||         2) Consultas Cadastrais               |||||||\n");
		printf ("|||||||         3) Relatório de Alunos                |||||||\n");
		printf ("|||||||         4) Exclusão de Dados                  |||||||\n");
		printf ("|||||||         5) Sair                               |||||||\n");
		printf ("|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
		printf ("|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
		

        printf("\nDigite uma opção: ");
        scanf("%d", &opcao);
        system("cls");

        switch ( opcao ) {
            case 1:
            	NovaPessoa();
            	system ("pause");
            	break;
            case 2:
                ConsultarPorID();
                system("pause");
                break;
            case 3:
            	// Falta relatório de alunos
                break;
            case 4:
            	// Falta exclusão de dados
            	break;
            case 5:
            	fechar_programa();
            	system ("pause"); 
                break;
            default:
                printf("Opção inválida! Tente Novamente!\n\n");
                system("pause");
                break;
		}
		
    } while(opcao != 5);
}

int NovaPessoa()
{
    Pessoa *pessoa = (Pessoa *) malloc (sizeof (Pessoa));
    
    if(!PedeDadosPessoa(pessoa))
    {
        free(pessoa);
        return 0;
    }
    
    if(!GravaNovaPessoa(pessoa))
    {
        free(pessoa);
        return 0;
    }
    
    free(pessoa);
    
    return 1;
}

int PedeDadosPessoa(Pessoa *pessoa)
{
    if(pessoa == NULL)
    {
        printf("\nPessoa inválida para pedir dados!\n");
        return 0;
    }
    
    printf("Digite nome completo: ");
	fflush(stdin);
    gets(pessoa->nome_completo);
    fflush(stdin);
    
    printf("\nDigite número da matrícula: ");
	fflush(stdin);
    scanf("%d", &pessoa->matricula);
    fflush(stdin);
                
    printf("\nDigite a data de nascimento: ");
    fflush(stdin);
    gets(pessoa->data_nascimento);
    fflush(stdin);
                
   	printf("\nDigite a naturalidade: ");
   	fflush(stdin);
    gets(pessoa->naturalidade);
    fflush(stdin);
                
    printf("\nDigite número da certidão de nascimento: ");
    fflush(stdin);
	scanf ("%d", &pessoa->numero_certidao_nascimento);
	fflush(stdin);
                
    printf("\nDigite o peso: ");
    fflush(stdin);
    scanf ("%f", &pessoa->peso);
    fflush(stdin);
                
	printf ("\nDigite o nome do pai: ");
	fflush(stdin);
	gets(pessoa->nome_pai);
	fflush(stdin);
				
	printf ("\nDigite nome da mãe: ");
	fflush(stdin);
	gets(pessoa->nome_mae);
	fflush(stdin);
								
	printf ("\nDigite informações adicionais: ");
	fflush(stdin);
	gets(pessoa->inf_adicionais);
	fflush(stdin);
	
	printf ("\n\n\n");
	printf ("|||||||||||||||||||||||||||||||||||||||||||||\n");
	printf ("|||||| Usuário cadastrado com sucesso! ||||||");
	printf ("\n|||||||||||||||||||||||||||||||||||||||||||||");
	printf ("\n\n\n");
    
    return 1;
}

int LerString(char *str, int tammax)
{
    int c, i=0;
    c = getchar();
    while (i==0 || (c != '\n' && c != EOF)) { 
        if(c == '\n' || c == EOF)
        {
            if(i >= 0)
                i--;
        }
        else if(i < tammax - 1)
        {
            str[i] = c;
        }
        c = getchar();
        i++;
        
    }
    if(i >= tammax - 1)
        i = tammax - 1;
    str[i] = '\0';
    fflush(stdin);
    
    return i;
}

int GravaNovaPessoa(Pessoa *pessoa)
{
    FILE *file; 
 
    file = fopen (ARQUIVO, "a"); 
    if (file == NULL) 
    { 
        printf("\nErro ao abrir o arquivo!\n"); 
        return 0;
    } 
    
    if(pessoa == NULL)
    {
        printf("\nPessoa inválida!\n");
        return 0;
    }
      
    if(fwrite (pessoa, sizeof(Pessoa), 1, file) == 0)  
        printf("Erro ao gravar Pessoa %d !\n", pessoa->matricula); 

    fclose (file);
    
    return 1;
}

int ConsultarPorID()
{
    FILE *file;
    int matricula;
    Pessoa *pessoa = NULL;
    
    printf("\n\nInforme a matrícula: ");
    fflush(stdin);
    scanf("%d", &matricula);
    fflush(stdin);

    file = fopen (ARQUIVO, "rb"); 
    if (file == NULL) 
    { 
        printf("\nErro ao abrir o arquivo!\n"); 
        return 0;
    }
    
    while(1)
    {
        if(feof(file))
            break;
        
        pessoa = LeProximaPessoa(file);
        
        if(pessoa == NULL || pessoa->matricula == matricula)
            break;
        
        free(pessoa);
    }
    
    if(pessoa != NULL)
    {
        printf("\nPessoa encontrada no banco de dados!\n");
        MostraPessoa(pessoa);
        free(pessoa);
    }
    else
    {
        printf("\nPessoa %d não encontrada no banco de dados!\n",  matricula);
    }
    
    fclose(file);
    
    return 1;
}

int MostraPessoa(Pessoa *pessoa)
{
    if(pessoa == NULL)
    {
        printf("\nPessoa inválida para mostrar!\n");
        return 0;
    }
    
    printf("\nMatrícula: %d\n", pessoa->matricula);
    printf("Nome completo: %s\n", pessoa->nome_completo);
    printf("Data de nascimento: %s\n", pessoa->data_nascimento);
    printf("Naturalidade: %s\n", pessoa->naturalidade);
    printf("Numero certidão de nascimento: %d\n", pessoa->numero_certidao_nascimento);
    printf("Peso: %f\n", pessoa->peso);
    printf("Nome pai: %s\n", pessoa->nome_pai);
    printf("Nome mãe: %s\n", pessoa->nome_mae);
    printf("Informação adicional: %s\n", pessoa->inf_adicionais);
    
    return 1;
}

Pessoa *LeProximaPessoa(FILE *file)
{
    Pessoa *pessoa;
    
    if (file == NULL) 
    { 
        printf("\nArquivo inválido!\n"); 
        return 0;
    } 
    
    pessoa = (Pessoa *) malloc (sizeof (Pessoa));
    
    if(fread(pessoa, sizeof(Pessoa), 1, file) == 0)
    {
        printf("Erro ao ler Pessoa !\n");
        free(pessoa);
        pessoa = NULL;
    }
    
    return pessoa;
}

void fechar_programa () {
	printf ("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
	printf("||||| Obrigado por utilizar o software! Fechando ... |||||");
	printf ("\n||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n\n\n");
    system("pause");
    exit(0);
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Fala mano, tudo bem?

 

Primeiro tu tem que ter em mente que pra remover a entrada X de uma lista o programa Cria um vetor menor, passa os valores do ventor "antigo" até o índice que você quer remover, "pula" o índice X e depois continua o posicionamento.

 

Tu vai precisar de uma função vazia que receba como parâmetros o ponteiro global da tua struct, o tamanho da lista e a posição.

 

Antes de codificar a função de remoção seria interessante você configurar uma condicional dentro do caso que você quer trabalhar, que diz que SE o tamanho da lista for Zero, ele DIZ que a lista está vazia; SE NÃO, chama-se a função com os parâmetros citados acima.

 

Ok, agora pra função, você pode codificá-la em 4 passos:

 

1 - Tu vai criar (e alocar memória) para um vetor com uma posição a menos. Se tu puder usar c++, inclua a biblioteca <new>. porque ai tu só precisa escrever tua struct, APONTAR tua lista, criar o novo vetor (ja alocando a memória com o new) com uma posição a menos (tu APONTA o tamanho da lista menos uma posição).

 

2 - Agora você passa os elementos da lista antiga para a nova, ATÉ o elemento desejado.

Tu faz isso definindo uma variável contadora, abrindo um laço de repetição que começa em 0 e termina no tamanho da lista que tu acabou de criar. Dentro do escopo desse laço você cria uma condicional. SE o contador for menor que a posição que tu quer remover: Tu passa o mesmo valor da lista antiga, tudo normal. SE NÃO: tu passa o valor da frente (contador mais 1, a frente), que substitui X.

 

3 - Agora tu precisa atualizar o ponteiro da sua lista, que deve apontar pra esse lista nova que tu criou.

 

4 - E também atualizar o PONTEIRO do tamanho da sua nova lista, que é o tamanho da lista -1.

 

Qualquer coisa chama que nóis descomplica, abraço

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, malloc_ disse:

Fala mano, tudo bem?

 

Primeiro tu tem que ter em mente que pra remover a entrada X de uma lista o programa Cria um vetor menor, passa os valores do ventor "antigo" até o índice que você quer remover, "pula" o índice X e depois continua o posicionamento.

  

Tu vai precisar de uma função vazia que receba como parâmetros o ponteiro global da tua struct, o tamanho da lista e a posição.

 

Antes de codificar a função de remoção seria interessante você configurar uma condicional dentro do caso que você quer trabalhar, que diz que SE o tamanho da lista for Zero, ele DIZ que a lista está vazia; SE NÃO, chama-se a função com os parâmetros citados acima.

 

Ok, agora pra função, você pode codificá-la em 4 passos:

 

1 - Tu vai criar (e alocar memória) para um vetor com uma posição a menos. Se tu puder usar c++, inclua a biblioteca <new>. porque ai tu só precisa escrever tua struct, APONTAR tua lista, criar o novo vetor (ja alocando a memória com o new) com uma posição a menos (tu APONTA o tamanho da lista menos uma posição).

 

2 - Agora você passa os elementos da lista antiga para a nova, ATÉ o elemento desejado.

Tu faz isso definindo uma variável contadora, abrindo um laço de repetição que começa em 0 e termina no tamanho da lista que tu acabou de criar. Dentro do escopo desse laço você cria uma condicional. SE o contador for menor que a posição que tu quer remover: Tu passa o mesmo valor da lista antiga, tudo normal. SE NÃO: tu passa o valor da frente (contador mais 1, a frente), que substitui X.

 

3 - Agora tu precisa atualizar o ponteiro da sua lista, que deve apontar pra esse lista nova que tu criou.

 

4 - E também atualizar o PONTEIRO do tamanho da sua nova lista, que é o tamanho da lista -1.

 

Qualquer coisa chama que nóis descomplica, abraço

 

Valeu brother vou tentar, caso alguem tenha mais ideias só mandar aqui, abraço.

Link para o comentário
Compartilhar em outros sites

@Diridjow Sobre o relatório, tu quer imprimir na tela os dados cadastrados no programa?

Tu pode criar uma função vazia que receba como parâmetro o ponteiro do vetor e o tamanho.

Defina uma variável contadora e codifique um laço de repetição de for (começa na posição, termina no tamanho, incrementa) ai no printf / cout tu diz pra imprimir o vetor no índice do contador. Mas tenha em mente que, por exemplo, se você tiver um item na sua struct para o nome e um para o rg, você precisa de um printf pro nome e um printf pro rg

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