ExemploDeInsercaoSimplesTabela

De MediaWiki do Campus São José
Ir para: navegação, pesquisa

No exemplo abaixo é mostrado como inserir/remover de uma tabela simples de estruturas. Trata-se de um programa para gerenciar alunos de uma turma (de forma bem simplificada). O armazenamento e pesquisa em tabela (vetor de estruturas) é direto sem aplicação de nenhuma técnica (estruturas de dados mais elaboradas serao trabalhadas em programação 2).

Note que o exercício trabalha a questão data (data de nascimento do aluno). A função verificar_mais_velho compara a data de nascimento de dois alunos e informa o mais velho (note que a função tem que ser ampliada).

A forma da tabela de alunos (turma) é mostrada abaixo:

POSIÇÃO nome nota_final data_nasc
turma[0] "joao" 9.5 9/9/1999 em uso
turma[1] "maria" 10.0 10/9/1999 em uso
turma[2] "" livre
turma[3] "lara" 9.6 11/9/2001 em uso
:
turma[19] "" livre
#include <stdio.h>
#include <string.h>
#include <time.h>

/* DEFINIÇÔES */

#define TAM_NOME 25
#define TAM_TURMA 20

/* TIPOS E VARIÁVEIS GLOBAIS */

struct tipo_aluno {
   char nome[TAM_NOME];
   float nota_final;
   struct tm data_nasc;
};

struct tipo_aluno turma[TAM_TURMA];

/* PROTÓTIPO DE FUNÇÔES */

int inserir_aluno();
int encontrar_aluno (char *nome);
int remover_aluno();
int imprimir_turma();
int salvar_turma_arquivo();
int recuperar_turma_arquivo();
void iniciar_turma();
void verificar_mais_velho(char *aluno1, char *aluno2);

/* FUNÇÃO PRINCIPAL: TESTA AS FUNCIONALIDADES BÁSICAS */

main()
{
  int i;
  /* tenta recuperar os dados de arquivo - caso não consiga, iniciar a tabela de alunos */

  iniciar_turma();
  recuperar_turma_arquivo();

  for(i=0;i<2;i++)
     inserir_aluno();

  imprimir_turma();

  //verificar_mais_velho("alfa","beta");

  salvar_turma_arquivo();
}

int inserir_aluno()
{
  char aux[TAM_NOME];
  int retorno = -1;
  int i;
  struct tm data_nasc;

  printf("Entre com o nome do aluno a ser inserido na turma\n");
  scanf ("%s", aux);

  if ( encontrar_aluno (aux) == -1) { /* aluno não existe */

     /* encontrar local livre na tabela */
     for (i=0;i<TAM_TURMA;i++) {
         if (turma[i].nome[0]=='\0') 
               break;
     }

     if (i<TAM_TURMA){ /* existe posição livre */
         strcpy(turma[i].nome, aux);
         printf("Entre com  a nota\n");
         scanf ("%f", &turma[i].nota_final);
         memset(&data_nasc, 0, sizeof(data_nasc));
         printf("Entre com a data de nascimento formato DD/MM/AAAA\n");
         scanf("%2d/%2d/%4d", &data_nasc.tm_mday,&data_nasc.tm_mon,&data_nasc.tm_year);
         turma[i].data_nasc.tm_year = data_nasc.tm_year - 1900;
         turma[i].data_nasc.tm_mon = data_nasc.tm_mon - 1;
         turma[i].data_nasc.tm_mday = data_nasc.tm_mday;
         retorno = i;
     } else {
         printf("Não existe mais espaço na turma\n");
     }
  } else
     printf("aluno já existe\n"); 
  return retorno; 
}

int encontrar_aluno (char *nome)
{
 int i;
 int retorno = -1;
  
 for (i=0;i<TAM_TURMA;i++) {
    if (strcmp(nome, turma[i].nome)==0) {
       retorno=i;
       break;
    }
 }

 return retorno; 
}

int remover_aluno()
{
  char aux[TAM_NOME];
  int index;
  int retorno = -1;

  printf ("Entre com aluno a ser removido\n");
  scanf ("%s", aux);

  index = encontrar_aluno (aux);
  if (index!=-1) {
     turma[index].nome[0]='\0';
     retorno = index;
  }
  return retorno;
}


void imprimir_aluno(struct tipo_aluno *aluno)
{
 char buffer_data[50];
 strftime(buffer_data,50, "%d/%m/%Y",&aluno->data_nasc); 
 printf("Nome aluno %s data_nasc %s nota %f\n", aluno->nome,  buffer_data, aluno->nota_final);
}

int imprimir_turma()
{
 int i;

 for (i=0;i<TAM_TURMA;i++)  {
     if (turma[i].nome[0]!='\0')
         imprimir_aluno(&turma[i]);
 }
}

void verificar_mais_velho(char *aluno1, char *aluno2)
{
  time_t data1, data2;
  
  data1 = mktime(&turma[encontrar_aluno(aluno1)].data_nasc);
  data2 = mktime(&turma[encontrar_aluno(aluno2)].data_nasc);
  if (data1>data2)
      printf("Aluno 2 é mais velho\n");
}

int salvar_turma_arquivo()
{
  FILE *ptr;
  int i;
  char buffer_data[50];

  if ((ptr = fopen("alunos.dat", "w+"))== NULL) {
     printf("Erro na abertura de arquivo\n");
     return(-1);
  }
  for (i=0;i<TAM_TURMA;i++){
     if (turma[i].nome[0]!='\0'){ 
          strftime(buffer_data,50, "%d/%m/%Y",&turma[i].data_nasc); 
          fprintf(ptr, "%s:%s:%4f\n", turma[i].nome,  buffer_data, turma[i].nota_final);
     }
  }
  fclose(ptr);
}

int recuperar_turma_arquivo()
{

  char buffer[100+1];
  FILE *ptr;
  int ret=0,i=0;
  struct tm data_nasc;
 
  if ((ptr = fopen("alunos.dat", "r"))== NULL) {
     printf("Erro na abertura de arquivo\n");
     return(-1);
  }
  while  (ret!=EOF) { 
     ret=fscanf (ptr, " %[^:]:%d/%d/%d:%f", buffer,&data_nasc.tm_mday, &data_nasc.tm_mon, &data_nasc.tm_year, &turma[i].nota_final);
     if (ret==5) { /* ret contém o número de itens lidos */
         strcpy(turma[i].nome, buffer);
     } else if (ret!=EOF)
         printf("Provavelmente existe um erro no arrquivo de dados\n");
     i++;
  } 
  fclose(ptr);
  return 0;
}

void iniciar_turma()
{
 int i;
  
 memset(turma, 0, sizeof(turma));
}