Mudanças entre as edições de "ExemploDeInsercaoSimplesTabela"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(7 revisões intermediárias por um outro usuário não estão sendo mostradas)
Linha 1: Linha 1:
 
No exemplo abaixo é mostrado como inserir/remover de uma tabela simples de estruturas.
 
No exemplo abaixo é mostrado como inserir/remover de uma tabela simples de estruturas.
Note a tabela tem tamanho fixo da forma:
+
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:
  
<code>
+
{| class="wikitable"
 +
! style="background-color:#ffffc7; color:#333333;" | POSIÇÃO
 +
! style="background-color:#ffffc7; color:#333333;" | nome
 +
! style="background-color:#ffffc7; color:#333333;" | nota_final
 +
! style="background-color:#ffffc7; color:#333333;" | data_nasc
 +
!
 +
|-
 +
| style="background-color:#96fffb; color:#333333;" | turma[0]
 +
| style="background-color:#9aff99;" | "joao"
 +
| style="background-color:#9aff99;" | 9.5
 +
| style="background-color:#9aff99;" | 9/9/1999
 +
| em uso
 +
|-
 +
| style="background-color:#96fffb; color:#333333;" | turma[1]
 +
| style="background-color:#9aff99;" | "maria"
 +
| style="background-color:#9aff99;" | 10.0
 +
| style="background-color:#9aff99;" | 10/9/1999
 +
| em uso
 +
|-
 +
| style="background-color:#96fffb; color:#333333;" | turma[2]
 +
| style="background-color:#9aff99;" | ""
 +
| style="background-color:#9aff99;" |
 +
| style="background-color:#9aff99;" |
 +
| livre
 +
|-
 +
| style="background-color:#96fffb; color:#333333;" | turma[3]
 +
| style="background-color:#9aff99;" | "lara"
 +
| style="background-color:#9aff99;" | 9.6
 +
| style="background-color:#9aff99;" | 11/9/2001
 +
| em uso
 +
|-
 +
| style="background-color:#96fffb; color:#333333;" | :
 +
| style="background-color:#9aff99;" |
 +
| style="background-color:#9aff99;" |
 +
| style="background-color:#9aff99;" |
 +
|
 +
|-
 +
| style="background-color:#96fffb; color:#333333;" | turma[19]
 +
| style="background-color:#9aff99;" | ""
 +
| style="background-color:#9aff99;" |
 +
| style="background-color:#9aff99;" |
 +
| livre
 +
|}
 +
 
 +
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 
#include <string.h>
 
#include <string.h>
 +
#include <time.h>
 +
 +
/* DEFINIÇÔES */
  
 
#define TAM_NOME 25
 
#define TAM_NOME 25
 
#define TAM_TURMA 20
 
#define TAM_TURMA 20
 +
 +
/* TIPOS E VARIÁVEIS GLOBAIS */
  
 
struct tipo_aluno {
 
struct tipo_aluno {
 
   char nome[TAM_NOME];
 
   char nome[TAM_NOME];
 
   float nota_final;
 
   float nota_final;
 +
  struct tm data_nasc;
 
};
 
};
  
 
struct tipo_aluno turma[TAM_TURMA];
 
struct tipo_aluno turma[TAM_TURMA];
  
/* protótipos de funções */
+
/* PROTÓTIPO DE FUNÇÔES */
  
 
int inserir_aluno();
 
int inserir_aluno();
Linha 27: Linha 81:
 
int recuperar_turma_arquivo();
 
int recuperar_turma_arquivo();
 
void iniciar_turma();
 
void iniciar_turma();
 +
void verificar_mais_velho(char *aluno1, char *aluno2);
 +
 +
/* FUNÇÃO PRINCIPAL: TESTA AS FUNCIONALIDADES BÁSICAS */
  
 
main()
 
main()
Linha 33: Linha 90:
 
   /* tenta recuperar os dados de arquivo - caso não consiga, iniciar a tabela de alunos */
 
   /* tenta recuperar os dados de arquivo - caso não consiga, iniciar a tabela de alunos */
  
   if (recuperar_turma_arquivo()==0) {
+
   iniciar_turma();
      iniciar_turma();
+
   recuperar_turma_arquivo();
   }
 
 
 
  imprimir_turma();
 
  
   for(i=0;i<3;i++)
+
   for(i=0;i<2;i++)
 
     inserir_aluno();
 
     inserir_aluno();
  
 
   imprimir_turma();
 
   imprimir_turma();
  
   for(i=0;i<1;i++)
+
   //verificar_mais_velho("alfa","beta");
    remover_aluno();
 
 
 
  imprimir_turma();
 
 
 
  for(i=0;i<1;i++)
 
    inserir_aluno();   
 
 
 
  imprimir_turma();
 
  
 
   salvar_turma_arquivo();
 
   salvar_turma_arquivo();
Linha 62: Linha 108:
 
   int retorno = -1;
 
   int retorno = -1;
 
   int i;
 
   int i;
 +
  struct tm data_nasc;
  
 
   printf("Entre com o nome do aluno a ser inserido na turma\n");
 
   printf("Entre com o nome do aluno a ser inserido na turma\n");
Linha 78: Linha 125:
 
         printf("Entre com  a nota\n");
 
         printf("Entre com  a nota\n");
 
         scanf ("%f", &turma[i].nota_final);
 
         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;
 
         retorno = i;
 +
    } else {
 +
        printf("Não existe mais espaço na turma\n");
 
     }
 
     }
 
   } else
 
   } else
     printf("aluno já existe\n");
+
     printf("aluno já existe\n");  
 +
  return retorno;
 
}
 
}
  
Linha 114: Linha 170:
 
   }
 
   }
 
   return retorno;
 
   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);
 
}
 
}
  
Linha 119: Linha 183:
 
{
 
{
 
  int i;
 
  int i;
 
+
 
 
  for (i=0;i<TAM_TURMA;i++)  {
 
  for (i=0;i<TAM_TURMA;i++)  {
 
     if (turma[i].nome[0]!='\0')
 
     if (turma[i].nome[0]!='\0')
          printf("Nome aluno %s nota %f posicao %d\n", turma[i].nome, turma[i].nota_final, i);
+
        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()
 
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);
 
}
 
}
  
Linha 133: Linha 222:
 
{
 
{
  
 +
  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;
 
}
 
}
  
Linha 139: Linha 247:
 
  int i;
 
  int i;
 
    
 
    
  for (i=0;i<TAM_TURMA;i++)
+
  memset(turma, 0, sizeof(turma));
    turma[i].nome[0]='\0';   /* null string em todas as entradas */
 
 
}   
 
}   
 
 
</syntaxhighlight>
 
</syntaxhighlight>

Edição atual tal como às 09h32min de 29 de novembro de 2018

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));
}