Ir ao conteúdo
  • Cadastre-se
Alasca

Arquivos e Registros em C

Recommended Posts

Olá 

Preciso de ajuda em um programa em C. 

O código já está quase pronto, mas ainda quero fazer algumas modificações.

Quero acrescentar a opção no menu de imprimir em ordem alfabética a lista de alunos aprovados. O aluno é considerado aprovado se a media for igual ou superior a 6. Preciso também de ter a opção no menu de imprimir em ordem alfabética o nome de todos os alunos. 

 

Estou em dúvida de como posso fazer isso, se alguém puder ajudar, agradeço muito.

 

Segue o código que estou utilizando:

 

 

#include <stdio.h>#include <stdlib.h>#include <string.h>#ifndef __MSDOS__#include <search.h>#endif#ifdef __linux__#include <termios.h>#include <unistd.h>#define CLEAR_SCREEN "clear"#define aacute "\xC3\xA1"#define oacute "\xC3\xB3"#define uacute "\xC3\xBA"#define Uacute "\xC3\x9A"int _getch ();#else#include <conio.h>#define CLEAR_SCREEN "cls"#define aacute "\240"#define oacute "\242"#define uacute "\243"#define Uacute "\351"#ifdef __MSDOS__#define _getch getch#endif#endiftypedef struct TDAAluno {char* matricula;char* nome;int idade;char* serie;float nota_de_trabalho;float nota_de_prova;float media;} Aluno;void* arranjo_inserir (void *arranjo, size_t *tamanho, size_t size, const void *dado);void* arranjo_remover   (void *arranjo, size_t *tamanho, size_t size, const void *dado);void  arranjo_recorrer (void *arranjo, size_t  tamanho, size_t size, void *parametros, void (*funcion)(void*,void*));void  pausar        (const char *mensagem);char* ler_on_line    (const char *mensagem);char* ler_cadeia   (const char *mensagem, char *cadeia);int   ler_inteiro   (const char *mensagem);float ler_decimal  (const char *mensagem);int   ler_campo (FILE *arquivo, char *campo);int   comparar_aluno (const Aluno *aluno1, const Aluno *aluno2);void  imprimir_aluno (Aluno *dado, int *contador);void  imprimir_en_arquivo (Aluno *dado, FILE *arquivo);const char *rota = "alunos.dat";int main (){Aluno *alunos = NULL;size_t tamanho=0;Aluno *dado, aluno;int contador=0, opcao, subopcao;char campo[255];FILE *arquivo = fopen (rota, "r");if (arquivo!=NULL){while (ler_campo (arquivo, campo)){aluno.matricula = strdup (campo);ler_campo (arquivo, campo);aluno.nome = strdup (campo);ler_campo (arquivo, campo);aluno.idade = atoi (campo);ler_campo (arquivo, campo);aluno.serie = strdup (campo);ler_campo (arquivo, campo);aluno.nota_de_trabalho = atof (campo);ler_campo (arquivo, campo);aluno.nota_de_prova = atof (campo);ler_campo (arquivo, campo);aluno.media = atof (campo);alunos = (Aluno*) arranjo_inserir (alunos, &tamanho, sizeof (Aluno), &aluno);}fclose (arquivo);}do {system (CLEAR_SCREEN);printf ("MENU" "\n");printf ("1.- Inserir novo cadastro\n");printf ("2.- Consultas\n");printf ("3.- Atualizacao\n");printf ("4.- Excluir registros\n");printf ("5.- Ordenar registros\n");printf ("6.- Listar registros\n");printf ("7.- Sair\n");printf ("Selecione uma opcao\n");fflush (stdout);doopcao = _getch ();while (opcao<'1' || opcao>'7');printf ("%c\n\n", opcao);if (tamanho==0 && opcao!='1' && opcao!='7'){pausar ("Nao ha registros.\n");continue;}if (opcao<'5'){aluno.matricula = ler_cadeia ("Insira a matricula do aluno", campo);dado = (Aluno*) lfind (&aluno, alunos, &tamanho, sizeof (Aluno), (int(*)(const void*,const void*))comparar_aluno);if (dado!=NULL){putchar ('\n');imprimir_aluno (dado, &contador);}}if (opcao=='1' && dado!=NULL)printf ("O registro ja existe.\n");else if (opcao>='2' && opcao<='4' && dado==NULL)printf ("\nRegistro nao encontrado.\n");else switch (opcao){case '1':aluno.matricula = strdup (campo);aluno.nome = ler_on_line ("Digite o nome do aluno");aluno.idade = ler_inteiro ("Digite a idade");aluno.serie = ler_on_line ("Digite a serie");aluno.nota_de_trabalho = ler_decimal ("Digite a nota de trabalho");aluno.nota_de_prova = ler_decimal ("Digite a nota de prova");aluno.media = ler_decimal ("Digite a media");alunos = (Aluno*) arranjo_inserir (alunos, &tamanho, sizeof (Aluno), &aluno);printf ("\nRegistro adicionado com sucesso!\n");break;case '3':printf ("Menu de modificacao de campos\n");printf ("1.- nome\n");printf ("2.- idade\n");printf ("3.- serie\n");printf ("4.- nota de trabalho\n");printf ("5.- nota de prova\n");printf ("6.- media\n");do {subopcao = ler_inteiro ("Selecione um numero de campo pra modificar");if (subopcao<1 || subopcao>6)printf ("Opcao invalida.\n");} while (subopcao<1 || subopcao>6);switch (subopcao){case 1:free (dado->nome);dado->nome = ler_on_line ("Digite o novo nome");break;case 2:dado->idade = ler_inteiro ("Digite a nova idade");break;case 3:free (dado->serie);dado->serie = ler_on_line ("Digite a nova serie");break;case 4:dado->nota_de_trabalho = ler_decimal ("Digite a nova nota de trabalho");break;case 5:dado->nota_de_prova = ler_decimal ("Digite a nova nota de prova");break;case 6:dado->media = ler_decimal ("Digite a nova media");break;}printf ("\nRegistro atualizado com sucesso!\n");break;case '4':memcpy (&aluno, dado, sizeof (Aluno));alunos = (Aluno*) arranjo_remover ((void**)alunos, &tamanho, sizeof (Aluno), dado);free (aluno.matricula);free (aluno.nome);free (aluno.serie);printf ("Registro excluido com sucesso!\n");break;case '5':qsort (alunos, tamanho, sizeof (Aluno), (int(*)(const void*,const void*))comparar_aluno);printf ("Registros ordenados com sucesso!.\n");break;case '6':contador = 0;arranjo_recorrer (alunos, tamanho, sizeof (Aluno), &contador, (void(*)(void*,void*))imprimir_aluno);printf ("Total de registros: %d.\n", contador);break;}if (opcao!='7')pausar ("");} while (opcao!='7');arquivo = fopen (rota, "w");if (arquivo!=NULL){arranjo_recorrer (alunos, tamanho, sizeof (Aluno), arquivo, (void(*)(void*,void*))imprimir_en_arquivo);fclose (arquivo);}return EXIT_SUCCESS;}void* arranjo_inserir (void *arranjo, size_t *tamanho, size_t size, const void *dado){char *registro;arranjo = realloc (arranjo, size * (*tamanho+1));registro = (char*)arranjo + *tamanho * size;memcpy (registro, dado, size);(*tamanho)++;return arranjo;}void* arranjo_remover (void *arranjo, size_t *tamanho, size_t size, const void *dado){size_t i;char *registro = (char*)arranjo;for (i=0; i<*tamanho && dado!=registro; i++, registro+=size);if (i<*tamanho){for (i++; i<*tamanho; i++){registro+=size;memcpy (registro-size, registro, size);}(*tamanho)--;arranjo = realloc (arranjo, size * (*tamanho));}return arranjo;}void arranjo_recorrer (void *arranjo, size_t tamanho, size_t size, void *parametros, void (*funcion)(void*,void*)){char *registro = (char*)arranjo;if (tamanho>0){funcion (registro, parametros);arranjo_recorrer (registro+size, tamanho-1, size, parametros, funcion);}}int comparar_aluno (const Aluno *aluno1, const Aluno *aluno2){return aluno1==aluno2 ? 0 : strcmp (aluno1->matricula, aluno2->matricula);}void imprimir_aluno (Aluno *dado, int *contador){printf ("matricula       : %s\n", dado->matricula);printf ("nome            : %s\n", dado->nome);printf ("idade           : %d\n", dado->idade);printf ("serie           : %s\n", dado->serie);printf ("nota de trabalho: %g\n", dado->nota_de_trabalho);printf ("nota de prova   : %g\n", dado->nota_de_prova);printf ("media           : %g\n", dado->media);putchar ('\n');(*contador)++;}void imprimir_en_arquivo (Aluno *dado, FILE *arquivo){fprintf (arquivo, "%s\t", dado->matricula);fprintf (arquivo, "%s\t", dado->nome);fprintf (arquivo, "%d\t", dado->idade);fprintf (arquivo, "%s\t", dado->serie);fprintf (arquivo, "%g\t", dado->nota_de_trabalho);fprintf (arquivo, "%g\t", dado->nota_de_prova);fprintf (arquivo, "%g\n", dado->media);}char* ler_on_line (const char *mensagem){char on_line[255];ler_cadeia (mensagem, on_line);return strdup (on_line);}char* ler_cadeia (const char *mensagem, char *cadeia){printf ("%s: ", mensagem);scanf ("%[^\r\n]", cadeia);getchar ();return cadeia;}int ler_inteiro (const char *mensagem){int inteiro;printf ("%s: ", mensagem);scanf ("%d", &inteiro);getchar();return inteiro;}float ler_decimal (const char *mensagem){float decimal;printf ("%s: ", mensagem);scanf ("%f", &decimal);getchar();return decimal;}int ler_campo (FILE *arquivo, char *campo){fscanf (arquivo, "%[^\t\n\r]", campo);fgetc (arquivo);return feof (arquivo) == 0;}void pausar (const char *mensagem){printf ("%s\nPressione uma tecla para continuar . . . ", mensagem);fflush (stdout);_getch ();}#ifdef __linux__int _getch (){int ch;struct termios oldt, newt;tcgetattr (STDIN_FILENO, &oldt);newt = oldt;newt.c_lflag &= ~(ICANON | ECHO);tcsetattr (STDIN_FILENO, TCSANOW, &newt);ch = getchar();tcsetattr (STDIN_FILENO, TCSANOW, &oldt);return ch;}#endif
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×