ExemploDeInsercaoSimplesTabela
Ir para navegação
Ir para pesquisar
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");
}
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));
}