Ir ao conteúdo
  • Cadastre-se

Arquivos e Registros em C


Alasca

Posts recomendados

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
 
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!