rendered paste body#include <stdio.h>#include <conio2.h>#include <ctype.h> #include <windows.h>#include <time.h>#include "minhabib.c"/* Programa para executar funcoes diretamente do arquivo de acesso aleatorio. O programa irá fazer o controle dos dados dos alunos de uma turma.*/ typedef struct{ int mat,disc; char nome[20]; float med; }Talunos; Talunos aa,an; int op, la,qa,posicao,ql, l, qt, pos,tecla; FILE *pf; char resp[1], nomelido[80]; //ler a resposta e transforma para maiusculovoid resposta(){ fflush(stdin); gets(resp); resp[0]=toupper(resp[0]);}void testenome(){ int tn, i; tn = strlen(nomelido); if (tn>19) { strncpy(aa.nome,nomelido,19); aa.nome[19]='\0'; } else strcpy(aa.nome,nomelido);}//verifica quantos registros tem no arquivo int verquant(){ int qr=0; fseek(pf,0, SEEK_SET); fread(&aa, sizeof(Talunos), 1, pf); while(!feof(pf)) { if (aa.mat !=0) qr++; fread(&aa, sizeof(Talunos), 1, pf); } return qr; }//abre arquivo e retorna a quantidade de registrosint abre_arquivo(){ int quantreg; if ((pf = fopen("arq.dat","r+b"))== NULL) pf = fopen("arq.dat","w+b"); // arquivo nao existe, precisa ser criado e inicializado quantreg = verquant(); an.mat =0; an.med=0; an.disc=0; strcpy(aa.nome," \0"); return quantreg; }//procura registro no arquivoint procura(int matp){ int p; p= 0; fseek(pf,0, SEEK_SET); fread(&aa, sizeof(Talunos), 1, pf); while ((!feof(pf)) && (aa.mat!=matp)) { fread(&aa, sizeof(Talunos),1, pf); p++; } if (aa.mat == matp) return p; else return -1;}// apresenta os dados do aluno na telavoid mostre(){ moldura2(3,12,78,16,14); vertical(12,16,15,14); vertical(12,16,56,14); vertical(12,16,70,14); gotoxy(5,13); aprintf("Matrícula"); gotoxy(17,13); printf("Nome do Aluno"); gotoxy(58,13); printf("Disciplina"); gotoxy(72,13); aprintf("Média"); textcolor(YELLOW); gotoxy(5,15); printf("%9d",aa.mat); gotoxy(17,15); printf("%-20s",aa.nome); gotoxy(58,15); if (aa.disc==1) aprintf("Lógica "); else aprintf("Programação"); gotoxy(72,15); printf("%5.2f",aa.med); textcolor(WHITE);}// Inserir um novo aluno no arquivovoid inserir(){ int teste; char numl[10]; do{ tela("Cadastrar Novo Aluno"); gotoxy(7,9); aprintf("Número de Matrícula...............: "); gotoxy(7,11); printf("Nome do Aluno.....................: "); gotoxy(7,13); aprintf("Disciplina(1-Lógica/2-Programação): "); gotoxy(7,15); aprintf("Média do Aluno....................: "); // leitura e validacao da matricula do{ limpalinha(43,9); textcolor(YELLOW); gotoxy(43,9); fflush(stdin); gets(numl); teste=1; if (strlen(numl)!=0) { teste=testeint(numl); if (teste==0) aa.mat = atoi(numl); else { mensagem("\aA matrícula é um campo numérico!",LIGHTRED); limpa(); } } } while (teste==1); gotoxy(43,11); fflush(stdin); // leitura e validacao do nome gets(nomelido); testenome(); // leitura e validacao da disciplina do{ limpalinha(43,13); textcolor(YELLOW); gotoxy(43,13); fflush(stdin); gets(numl); teste=1; if (strlen(numl)!=0) { teste=testeint(numl); if (teste==0) { aa.disc = atoi(numl); if ((aa.disc<0) || (aa.disc>2)) { mensagem("\aA disciplina é 1 ou 2 - valor fora do limite!",LIGHTRED); limpa(); teste=1; } } else { mensagem("\aA disciplina é um campo numérico!",LIGHTRED); limpa(); } } } while (teste==1); //leitura e validacao da media do{ limpalinha(43,15); textcolor(YELLOW); gotoxy(43,15); fflush(stdin); gets(numl); if (teste==0) { aa.med = atof(numl); if ((aa.med<0) || (aa.med>10)) { mensagem("\aA média varia de 0 a 10 - valor fora do limite!",LIGHTRED); limpa(); teste=1; } } else { mensagem("\aA média é um campo numérico!",LIGHTRED); limpa(); } } while (teste==1); fseek(pf,0,SEEK_END); fwrite(&aa,sizeof(Talunos),1,pf); qa++; mensagem(MSG_INS_OK,CYAN); limpa(); aprintf("Inserir outro aluno(S-sim/N-não)? "); textcolor(YELLOW); resposta(); textcolor(WHITE); }while (resp[0] == 'S');}// Remover um aluno do arquivovoid remover(){ int matrem, conrem; do{ tela("Remover Aluno"); gotoxy(7,9); aprintf("Número de Matrícula: "); textcolor(YELLOW); scanf("%d",&matrem); textcolor(WHITE); posicao = procura(matrem); if (posicao == -1) mensagem(MSG_ALU_ERRO,LIGHTRED); else { mostre(); limpa(); aprintf("Deseja remover o aluno (S-sim/N-não)? "); textcolor(YELLOW); resposta(); textcolor(WHITE); if (resp[0] == 'S') { fseek(pf,posicao*sizeof(Talunos), SEEK_SET); fwrite(&an, sizeof(Talunos), 1, pf); mensagem(MSG_REM_OK,CYAN); qa--; } else mensagem(MSG_REM_CAN,LIGHTRED); } limpamostre(); limpa(); aprintf("Remover outro aluno (S-sim/N-não)? "); textcolor(YELLOW); resposta(); textcolor(WHITE); }while (resp[0] == 'S');}//Consultar um aluno do arquivovoid consultar(){ int matcon; do{ tela("Consultar Aluno"); gotoxy(7,9); aprintf("Número de Matrícula: "); textcolor(YELLOW); scanf("%d",&matcon); textcolor(WHITE); posicao = procura(matcon); if (posicao == -1) mensagem(MSG_ALU_ERRO,LIGHTRED); else mostre(); limpa(); aprintf("Consultar outro aluno(S-sim/N-não)? "); textcolor(YELLOW); resposta(); textcolor(WHITE); }while (resp[0] == 'S');}//Fazer alteracao dos dados de um alunovoid alterar(){ int matalt, conalt; do{ tela("Alterar Dados do Aluno"); gotoxy(7,9); aprintf("Número de Matrícula: "); textcolor(YELLOW); scanf("%d",&matalt); textcolor(WHITE); posicao = procura(matalt); if (posicao == -1) mensagem(MSG_ALU_ERRO,LIGHTRED); else { mostre(); do{ limpa(); aprintf("Alterar (1-Nome/2-Média/3-Disciplina) ou Sair (0): "); textcolor(YELLOW); scanf("%d",&conalt); textcolor(WHITE); switch(conalt) { case 1: limpa(); fflush(stdin); printf("Novo Nome : "); textcolor(YELLOW); gets(nomelido); testenome(); textcolor(WHITE); mostre(); limpa(); printf("Nome Alterado com sucesso! Tecle enter..."); getche(); break; case 2: limpa(); aprintf("Nova Média : "); textcolor(YELLOW); scanf("%f",&aa.med); textcolor(WHITE); mostre(); limpa(); aprintf("Média Alterada com sucesso! Tecle enter..."); getche(); break; case 3: limpa(); aprintf("Nova Disciplina(1-Lógica/2-Programação): "); textcolor(YELLOW); scanf("%d",&aa.disc); textcolor(WHITE); mostre(); limpa(); aprintf("Disciplina Alterada com sucesso! Tecle enter..."); getche(); break; case 0: break; default: limpa(); aprintf("Opção Inválida! Tecle enter..."); getche(); break; } } while (conalt != 0); fseek(pf,posicao*sizeof(Talunos), SEEK_SET); fwrite(&aa, sizeof(Talunos), 1, pf); } limpamostre(); limpa(); aprintf("Alterar outro aluno(S-sim/N-não)? "); textcolor(YELLOW); resposta(); textcolor(WHITE); }while (resp[0] == 'S');}//monta a tela da listagemvoid telalista(){ tela("Listagem Geral"); moldura2(3,6,78,20,8); vertical(6,20,15,8); vertical(6,20,56,8); vertical(6,20,70,8); gotoxy(5,7); aprintf("Matrícula"); gotoxy(17,7); printf("Nome do Aluno"); gotoxy(58,7); printf("Disciplina"); gotoxy(72,7); aprintf("Média");}//Imprimir o relatorio contendo os dados de todos os alunosvoid listagem(){ int i,j; ql=10; qt= qa/ql; i=0; if (qa%ql!=0) qt = qt+1; fseek(pf,0, SEEK_SET); fread(&aa, sizeof(Talunos), 1, pf); i=0; for (j = 1; j<=qt; j++) { telalista(); l= 9; la=0; textcolor(YELLOW); do { if (aa.mat !=0) { gotoxy(5,l); printf("%9d",aa.mat); gotoxy(17,l); printf("%-20s",aa.nome); gotoxy(58,l); if (aa.disc==1) aprintf("Lógica "); else aprintf("Programação"); gotoxy(72,l); printf("%5.2f",aa.med); l++; la++; } fread(&aa, sizeof(Talunos), 1, pf); } while ((la<ql) && (!feof(pf))); gotoxy(3,23); aprintf("\apágina "); printf("%d/%d...tecle enter...",j,qt); textcolor(WHITE); getche(); }}//posiciona no registro que ira iniciar a paginavoid posiciona(int pg){ int contador; contador=0; fseek(pf,0, SEEK_SET); fread(&aa, sizeof(Talunos), 1, pf); if (pg !=1) { while ((!feof(pf)) && (contador<(ql*(pg-1)))) { if (aa.mat !=0) contador++; fread(&aa, sizeof(Talunos), 1, pf); } }}//faz a listagem de uma paginavoid listagempg(int pagina){ telalista(); l= 9; la=0; textcolor(YELLOW); if (pos == 1) posiciona(pagina); do { if (aa.mat !=0) { gotoxy(5,l); printf("%9d",aa.mat); gotoxy(17,l); printf("%-20s",aa.nome); gotoxy(58,l); if (aa.disc==1) aprintf("Lógica "); else aprintf("Programação"); gotoxy(72,l); printf("%5.2f",aa.med); l++; la++; } fread(&aa, sizeof(Talunos), 1, pf); } while ((la<ql) && (!feof(pf))); gotoxy(66,21); aprintf("\apágina "); printf("%d de %d",pagina,qt); textcolor(WHITE);} //Imprimir o relatorio contendo os dados de todos os alunos, paginacao para frente e trasvoid listagemp(){ int ok,pa,escolha; ql=10; qt= qa/ql; pa=1; if (qa%ql!=0) qt = qt+1; fseek(pf,0, SEEK_SET); fread(&aa, sizeof(Talunos), 1, pf); ok=1; do{ if (ok==1) listagempg(pa); pos=0; do{ limpa(); aprintf("Escolha(A-página anterior/P-próxima página/0-sair): "); textcolor(YELLOW); fflush(stdin); escolha = getch(); textcolor(WHITE); }while(((escolha!=48)&&(escolha!=97)&&(escolha!=65)&&(escolha!=112)&&(escolha!=80)));//scanf("%d",&escolha); textcolor(WHITE); switch(escolha) {case 97: case 65: if (pa !=1) { pa--; ok=1; pos=1; } else { mensagem("\aEsta é a primeira página!",LIGHTRED); ok=0; } break; case 112: case 80: if (pa !=qt) { pa++; ok=1; } else { mensagem("\aEsta é a ultima página!",LIGHTRED); ok=0; } break; } }while (escolha !=48);}//remove registros em branco do arquivovoid limpafile(){ FILE *pfl; pfl = fopen("temp.dat","w+b"); fseek(pf,0, SEEK_SET); fread(&aa, sizeof(Talunos), 1, pf); while (!feof(pf)) { if (aa.mat != 0) fwrite(&aa,sizeof(Talunos),1, pfl); fread(&aa, sizeof(Talunos),1, pf); } fclose(pfl); fclose(pf); remove("arq.dat"); rename("temp.dat","arq.dat"); if ((pf = fopen("arq.dat","r+b"))== NULL) pf = fopen("arq.dat","w+b"); limpa(); mensagem("\aRegistros nulos foram apagados!...tecle Enter...",LIGHTRED);} //Programa principalmain(){ qa = abre_arquivo(); do { menu(); op = getche(); textcolor(WHITE); if ((op<48)||(op>53)) mensagem(MSG_OP_ERRO,LIGHTRED); else if ((op!=49) && (qa==0) && (op!=48)) mensagem(MSG_ALU_ERRO2,LIGHTRED); else { switch(op) { case 49: inserir(); break; case 50: remover(); break; case 51: consultar(); break; case 52: alterar(); break; case 53: listagemp(); break; case 48: limpa(); textcolor(LIGHTRED); aprintf("\aVocê deseja remover os registros nulos antes de sair(S-sim/N-não)? "); textcolor(WHITE); la=getch(); if ((la==115)||(la==83)) limpafile(); fclose(pf); break; } } } while (op != 48);}