Exemplo de manipulação de arquivos
Publicado por Hudson Orsine Assumpção 13/06/2007
[ Hits: 10.232 ]
É um script simples que eu fiz como trabalho para a matéria LTP1.
Faz o cadastro de cursos e de alunos, organizando-os por ordem alfabética usando busca binária ou quicksort caso o índice de ordenação seja perdido!!
Possui alguns probleminhas que eu não consegui resolver, como a tecla backspace que não funciona (não sei porque!!)
Para compilar use: gcc "arquivo.c" -o "nome_desejado" -lncurses, a biblioteca ncurses é necessária!!
/*Autor: Hudson Orsine Assumpção*/ /*Data: 21/09/2006*/ /*Linguagem: C (padrão linux)*/ /*Função: Este programa tem a finalidade de gerenciar um banco de dados simples, através de inserção, alteração,*/ /*remoção, pesquisa e listagem dos cadastros existentes de alunos e de cursos. Cada aluno deve pertencer a apenas*/ /* um curso e um curso pode possuir vários alunos, o que consiste em uma relação 1:N*/ #include <stdio.h> /*Declaração das bibliotecas usadas nesse programa*/ #include <stdlib.h> #include <curses.h> /*Definição de palavras com valores constantes que tornam mais fácil a compreensão do código*/ #define ENTER 10 #define ESCAPE 27 #define NACHOU 1 #define JAEXISTE 2 #define SONUM 3 #define EXCLUI 4 #define EXCLUIDO 5 #define NEXCLUIDO 6 #define SUCESSO 7 #define NCURSO 8 #define APAGUE 9 #define ALTERACAO 11 struct nascimento{ /*Registro responsável pela data de nascimento, contendo 3 campos inteiros.*/ int dia[2],mes[2],ano[4]; }; struct endereco{ /*Registro responsável pelo endereço completo do aluno.*/ char rua[50],bairro[30],cidade[20],cep[8],estado[3],numero[5]; }; struct dados{ /*Registro responsável pelos demais dados do aluno, nota-se que os dois registros anteriores*/ char nome[50],identidade[13],curso[25]; /*estão presente nesse registro maior.*/ struct nascimento datanasc; struct endereco end; char cpf[12]; short int status; }; struct dados_curso{ /*Registro responsável pelos dados do curso*/ unsigned short int codigo[6]; unsigned short int status; char nome[25],dep[50],coord[50],quantp[3],predio[3]; }; struct ord{ /*Registro usado no vetor de ordenação de alunos*/ int pos_aluno,pos_cur; }; void carrega_vetor(int tipo); /*Declaração das funções usadas neste programa*/ void salva_vetor(void); int busca_binaria(int tamanho,char dado[50],int tipo); int pega_string (WINDOW *campo,char *string,int tam); void pega_data_nas (WINDOW **campo,int *dia,int *mes,int *ano); void pega_codigo(WINDOW **campo,unsigned short int codigo[]); int pega_cpf (WINDOW **campo,char *cpf); void exibe_cpf(WINDOW *campo,char cpf[]); int cadastra_aluno(WINDOW **screen,struct ord *aux2); int cadastra_curso(WINDOW **screen,int *aux2); void abre(void); int pesquisa_cpf(char *valor); int altera_aluno(WINDOW **screen,struct ord *aux2); int altera_curso(WINDOW **screen,int *aux2); int exclui_aluno(WINDOW **screen,struct ord *aux2); int exclui_curso(WINDOW **screen,int *aux2); void lista_aluno(WINDOW *campos); int lista_aluno_curso (WINDOW *campos); void lista_curso(WINDOW *campos); void criabarrasuperior(WINDOW *barrasup); WINDOW **menuf2(WINDOW **opcoes); WINDOW **menuf1(WINDOW **opcoes); void deleta_tela(WINDOW **espacos); void deleta_menu(WINDOW **opcoes,int cont); void ativa_ncurses(void); int scroll_menu_f1(WINDOW **items,WINDOW *mensagem); int scroll_menu_f2(WINDOW **items,WINDOW *mensagem); WINDOW **tela_aluno(WINDOW **campos); WINDOW **tela_curso(WINDOW **campos); WINDOW *tela_lista (WINDOW *itens); WINDOW **tela_pesquisa (WINDOW **campos); void tela_erro(WINDOW *erro,int mensagem); struct ord vet_alunos[1024]; /*Declaração do vetor de ordenação de alunos*/ int pos=-1,poscur=-1,vet_cursos[1024]; /*As duas primeiras variáveis guarda a posição do vetor da última entrada*/ FILE *alunos,*cursos,*ordem_alunos,*ordem_cursos; /*vet_curso é o vetor de ordenação dos cursos*/ /*Acima a declaração dos ponteiros de arquivos usados neste programa*/ void carrega_vetor(int tipo){ /*Função responsável por carregar os vetores de ordenação*/ if (tipo==0){ int cont; if ((ordem_alunos=fopen("ordem_alunos.bvq","rb+"))==NULL){ for (cont=0;cont<=1023;cont++){ vet_alunos[cont].pos_aluno=-1; vet_alunos[cont].pos_cur=-1; } } else{ rewind(ordem_alunos); for (cont=0;cont<=1023;cont++) fread(&vet_alunos[cont],sizeof(vet_alunos[0]),1,ordem_alunos); } } else{ int cont; if ((ordem_cursos=fopen("ordem_cursos.bvq","rb+"))==NULL){ for (cont=0;cont<=1023;cont++) vet_cursos[cont]=-1; } else{ rewind(ordem_cursos); cont=0; while (!feof(ordem_cursos)){ fread(&vet_cursos[cont],sizeof(int),1,ordem_cursos); cont++; } } } } void salva_vetor(void){ /*Função responsável por salvar os vetores de ordenação em arquivos*/ int cont; if ((ordem_alunos=fopen("ordem_alunos.bvq","wb"))==NULL){ printf("impossível criar arquivo de ordenação para alunos!!"); exit(1); } else{ for (cont=0;cont<=1023;cont++) fwrite(&vet_alunos[cont],sizeof(vet_alunos[0]),1,ordem_alunos); } fclose(ordem_alunos); if ((ordem_cursos=fopen("ordem_cursos.bvq","wb"))==NULL){ printf("impossível criar arquivo de ordenação para cursos!!"); exit(1); } else{ for (cont=0;cont<=1023;cont++) fwrite(&vet_cursos[cont],sizeof(int),1,ordem_cursos); } fclose(ordem_cursos); } int busca_binaria(int tamanho,char dado[50],int tipo){ /*Função responsável por realizar as buscas binárias nos*/ if (!tipo){ /*dois vetores, dependendo do valor passado em tipo*/ struct dados aux; int inicio=0,fim=tamanho,meio; while (inicio<=fim){ meio=(inicio+fim)/2; fseek(alunos,vet_alunos[meio].pos_aluno*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); if (strcmp(dado,aux.nome)==0) return(meio); else if (strcmp(dado,aux.nome)>0) inicio=meio+1; else fim=meio-1; } if (strcmp(dado,aux.nome)>0) return(meio+1); else return(meio); } else{ struct dados_curso aux; int inicio=0,fim=tamanho,meio; while (inicio<=fim){ meio=(inicio+fim)/2; fseek(cursos,vet_cursos[meio]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); if (strcmp(dado,aux.nome)==0) return(meio); else if (strcmp(dado,aux.nome)>0) inicio=meio+1; else fim=meio-1; } if (strcmp(dado,aux.nome)>0) return(meio+1); else return(meio); } } int pega_string (WINDOW *campo,char *string,int tam){ /*Esse função é responsável por ler as strings e tratá-las da*/ short int cont; /*maneira especificada*/ int key; wmove(campo,0,0); wrefresh(campo); curs_set(1); keypad(campo,TRUE); for (cont=0;cont<=tam-1;cont++){ key=getch(); if(key==KEY_BACKSPACE && cont>0){ werase(campo); wrefresh(campo); for (key=0;key<cont;key++) mvwprintw(campo,0,key,"%c",string[key]); cont--; } else{ if (key==ENTER) break; if (key==ESCAPE){ curs_set(0); return(0); } if (cont==0 || cont-1==' ') key=toupper(key); else key=tolower(key); string[cont]=key; mvwprintw(campo,0,cont,"%c",string[cont]); } wrefresh(campo); } string[cont]='{FONTE}'; curs_set(0); return(1); } void pega_data_nas (WINDOW **campo,int *dia,int *mes,int *ano){ /*Função responsável por tratar os valores inseri-*/ short int cont,valor; /*dos nos vetores responsáveis pela data de nascimento*/ WINDOW *msg; noecho(); for (cont=0;cont<=1;cont++){ valor=getch(); if (valor<48 || valor>57){ tela_erro(msg,SONUM); getch(); delwin(msg); touchwin(campo[0]); wrefresh(campo[0]); cont--; } dia[cont]=valor-48; wmove(campo[11],0,cont); wprintw(campo[11],"%d",dia[cont]); wrefresh(campo[11]); } for (cont=0;cont<=1;cont++){ valor=getch(); if (valor<48 || valor>57){ tela_erro(msg,SONUM); getch(); delwin(msg); touchwin(campo[0]); wrefresh(campo[0]); cont--; } mes[cont]=valor-48; wmove(campo[12],0,cont); wprintw(campo[12],"%d",mes[cont]); wrefresh(campo[12]); } for (cont=0;cont<=3;cont++){ valor=getch(); if (valor<48 || valor>57){ tela_erro(msg,SONUM); getch(); delwin(msg); touchwin(campo[0]); wrefresh(campo[0]); cont--; } ano[cont]=valor-48; wmove(campo[13],0,cont); wprintw(campo[13],"%d",ano[cont]); wrefresh(campo[13]); } curs_set(0); } void pega_codigo(WINDOW **campo,unsigned short int codigo[]){ register short int cont; WINDOW *msg; int valor; for (cont=0;cont<=6;cont++){ valor=getch(); if (valor<48 || valor>57){ tela_erro(msg,SONUM); getch(); delwin(msg); touchwin(campo[0]); wrefresh(campo[0]); cont--; } codigo[cont]=valor-48; wmove(campo[1],0,cont); wprintw(campo[1],"%d",codigo[cont]); wrefresh(campo[1]); } } int pega_cpf (WINDOW **campo,char *cpf){ /*Função responsável por ler os valores referentes ao cpf*/ register short int cont; unsigned int valor; WINDOW *msg; wmove(campo[1],0,0); wrefresh(campo[1]); curs_set(1); for (cont=0;cont<=10;cont++){ valor=getch(); if (valor==ESCAPE){ curs_set(0); return(0); } if (valor<48 || valor>57){ tela_erro(msg,SONUM); getch(); delwin(msg); touchwin(campo[0]); wrefresh(campo[0]); cont--; } else{ cpf[cont]=valor; if (cont<3){ wmove(campo[1],0,cont); wprintw(campo[1],"%c",cpf[cont]); wrefresh(campo[1]); } else if (cont<6){ wmove(campo[1],0,cont+1); wprintw(campo[1],"%c",cpf[cont]); wrefresh(campo[1]); } else if (cont<9){ wmove(campo[1],0,cont+2); wprintw(campo[1],"%c",cpf[cont]); wrefresh(campo[1]); } else{ wmove(campo[1],0,cont+3); wprintw(campo[1],"%c",cpf[cont]); wrefresh(campo[1]); } } } cpf[11]='{FONTE}'; curs_set(0); return(1); } void exibe_cpf(WINDOW *campo,char cpf[]){ int cont; for (cont=0;cont<=10;cont++){ if (cont<3){ wmove(campo,0,cont); wprintw(campo,"%c",cpf[cont]); } else if (cont<6){ wmove(campo,0,cont+1); wprintw(campo,"%c",cpf[cont]); } else if (cont<9){ wmove(campo,0,cont+2); wprintw(campo,"%c",cpf[cont]); } else{ wmove(campo,0,cont+3); wprintw(campo,"%c",cpf[cont]); } } wrefresh(campo); } void abre(void){ /* Abre os arquivos alunos.bvq e cursos.bvq*/ if((alunos=fopen("alunos.bvq","rb+"))==0) alunos=fopen("alunos.bvq","wb+"); if((cursos=fopen("cursos.bvq","rb+"))==0) cursos=fopen("cursos.bvq","wb+"); } int cadastra_aluno(WINDOW **screen,struct ord *aux2){ /*Cadastra um novo aluno*/ int acao,cont,k; struct dados aux; struct dados_curso auxcur; WINDOW *meserro; screen=tela_aluno(screen); mvwaddstr(screen[0],1,25,"NOVO CADASTRO DE ALUNO"); wrefresh(screen[0]); if (vet_cursos[0]==-1){ tela_erro(meserro,NCURSO); getch(); delwin(meserro); deleta_tela(screen); return(0); } do{ if (!(pega_cpf(screen,aux.cpf))){ deleta_tela(screen); return(0); } if (cont=pesquisa_cpf(aux.cpf)){ tela_erro(meserro,JAEXISTE); getch(); delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } }while (cont); if (!(pega_string(screen[2],aux.identidade,13))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[3],aux.nome,50))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[4],aux.end.rua,50))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[5],aux.end.numero,5))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[6],aux.end.bairro,30))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[7],aux.end.cidade,20))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[8],aux.end.estado,2))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[9],aux.end.cep,8))){ deleta_tela(screen); return(0); } do{ if (!(pega_string(screen[10],aux.curso,25))){ deleta_tela(screen); return(0); } k=busca_binaria(poscur,aux.curso,1); fseek(cursos,vet_cursos[k]*sizeof(auxcur),SEEK_SET); fread(&auxcur,sizeof(auxcur),1,cursos); if (strcmp(aux.curso,auxcur.nome)){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } else break; }while (1); curs_set(1); pega_data_nas(screen,aux.datanasc.dia,aux.datanasc.mes,aux.datanasc.ano); aux.status=1; fseek(alunos,0,SEEK_END); fwrite(&aux,sizeof(aux),1,alunos); if (aux2[0].pos_aluno!=-1){ cont=busca_binaria(pos,aux.nome,0); for (acao=pos+1;acao>cont;acao--){ aux2[acao].pos_aluno=aux2[acao-1].pos_aluno; aux2[acao].pos_cur=aux2[acao-1].pos_cur; } fseek(alunos,0,SEEK_END); aux2[cont].pos_aluno=(ftell(alunos)/sizeof(aux))-1; aux2[cont].pos_cur=vet_cursos[k]; } else{ aux2[0].pos_aluno=(ftell(alunos)/sizeof(aux))-1; aux2[0].pos_cur=vet_cursos[k]; } curs_set(0); tela_erro(meserro,SUCESSO); getch(); delwin(meserro); deleta_tela(screen); return(1); } int cadastra_curso(WINDOW **screen,int *aux2){ /*Cadastra um novo curso*/ int acao,cont; struct dados_curso aux,auxp; WINDOW *meserro; screen=tela_curso(screen); mvwaddstr(screen[0],1,25,"NOVO CADASTRO DE CURSO"); wrefresh(screen[0]); noecho(); pega_codigo(screen,aux.codigo); if (!(pega_string(screen[2],aux.predio,3))){ deleta_tela(screen); return(0); } do{ if (!(pega_string(screen[3],aux.nome,25))){ deleta_tela(screen); return(0); } if (aux2[0]!=-1){ cont=busca_binaria(poscur,aux.nome,1); fseek(cursos,cont*sizeof(aux),SEEK_SET); fread(&auxp,sizeof(auxp),1,cursos); if (strcmp(auxp.nome,aux.nome)==0){ tela_erro(meserro,JAEXISTE); getch(); delwin(meserro); } else break; } else break; }while (1); if (!(pega_string(screen[4],aux.quantp,3))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[5],aux.dep,50))){ deleta_tela(screen); return(0); } if (!(pega_string(screen[6],aux.coord,50))){ deleta_tela(screen); return(0); } aux.status=1; fseek(cursos,0,SEEK_END); fwrite(&aux,sizeof(aux),1,cursos); if (aux2[0]!=-1){ for (acao=poscur+1;acao>cont;acao--){ aux2[acao]=aux2[acao-1]; } fseek(cursos,0,SEEK_END); aux2[cont]=(ftell(cursos)/sizeof(aux))-1; } else{ aux2[0]=(ftell(cursos)/sizeof(aux))-1; } curs_set(0); tela_erro(meserro,SUCESSO); getch(); delwin(meserro); deleta_tela(screen); return(1); } int pesquisa_cpf (char *valor){ /*Função responsável pela pesquisa de cpf existente*/ int cont; struct dados aux; for (cont=0;vet_alunos[cont].pos_aluno!=-1;cont++){ fseek(alunos,cont*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); if (!(strcmp(valor,aux.cpf))){ fseek(alunos,-1*sizeof(aux),SEEK_CUR); return(1); } } return(0); } int altera_aluno(WINDOW **screen,struct ord *aux2){ /*Função responsável por alterar o cadastro de um aluno*/ struct dados aux,aux3; int i,k,contador,posarq,cont; WINDOW *meserro; char pesq[50]; screen=tela_aluno(screen); mvwaddstr(screen[0],1,20,"ALTERACAO DE CADASTRO DE ALUNO"); wrefresh(screen[0]); for (;;){ if (!(pega_string(screen[3],pesq,50))){ deleta_tela(screen); return(0); } i=busca_binaria(pos,pesq,0); fseek(alunos,aux2[i].pos_aluno*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); if (strcmp(aux.nome,pesq)!=0){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } else break; } posarq=aux2[i].pos_aluno; werase(screen[3]); exibe_cpf(screen[1],aux.cpf); waddstr(screen[2],aux.identidade); waddstr(screen[3],aux.nome); waddstr(screen[4],aux.end.rua); waddstr(screen[5],aux.end.numero); waddstr(screen[6],aux.end.bairro); waddstr(screen[7],aux.end.cidade); waddstr(screen[8],aux.end.estado); waddstr(screen[9],aux.end.cep); waddstr(screen[10],aux.curso); wprintw(screen[11],"%d%d",aux.datanasc.dia[0],aux.datanasc.dia[1]); wprintw(screen[12],"%d%d",aux.datanasc.mes[0],aux.datanasc.mes[1]); wprintw(screen[13],"%d%d%d%d",aux.datanasc.ano[0],aux.datanasc.ano[1],aux.datanasc.ano[2],aux.datanasc.ano[3]); for (k=2;k<=13;k++) wrefresh(screen[k]); if (!(pega_string(screen[2],aux3.identidade,13))){ deleta_tela(screen); return(0); } else if (aux3.identidade[0]!='{FONTE}') strcpy(aux.identidade,aux3.identidade); if (!(pega_string(screen[3],aux3.nome,50))){ deleta_tela(screen); return(0); } else if (aux3.nome[0]!='{FONTE}'){ strcpy(aux.nome,aux3.nome); } if (!(pega_string(screen[4],aux3.end.rua,50))){ deleta_tela(screen); return(0); } else if (aux3.end.rua[0]!='{FONTE}') strcpy(aux.end.rua,aux3.end.rua); if (!(pega_string(screen[5],aux3.end.numero,5))){ deleta_tela(screen); return(0); } else if (aux3.end.numero[0]!='{FONTE}') strcpy(aux.end.numero,aux3.end.numero); if (!(pega_string(screen[6],aux3.end.bairro,30))){ deleta_tela(screen); return(0); } else if (aux3.end.bairro[0]!='{FONTE}') strcpy(aux.end.bairro,aux3.end.bairro); if (!(pega_string(screen[7],aux3.end.cidade,20))){ deleta_tela(screen); return(0); } else if (aux3.end.cidade[0]!='{FONTE}') strcpy(aux.end.cidade,aux3.end.cidade); if (!(pega_string(screen[8],aux3.end.estado,2))){ deleta_tela(screen); return(0); } else if (aux3.end.estado[0]!='{FONTE}') strcpy(aux.end.estado,aux3.end.estado); if (!(pega_string(screen[9],aux3.end.cep,8))){ deleta_tela(screen); return(0); } else if (aux3.end.cep[0]!='{FONTE}') strcpy(aux.end.cep,aux3.end.cep); if (!(pega_string(screen[10],aux3.curso,25))){ deleta_tela(screen); return(0); } else if (aux3.curso[0]!='{FONTE}') strcpy(aux.curso,aux3.curso); curs_set(1); pega_data_nas(screen,aux.datanasc.dia,aux.datanasc.mes,aux.datanasc.ano); wrefresh(screen[0]); if (aux3.nome[0]!='{FONTE}'){ k=busca_binaria(pos,aux3.nome,0); if (k<i){ for (contador=i;contador>k;contador--){ aux2[contador].pos_aluno=aux2[contador-1].pos_aluno; aux2[contador].pos_cur=aux2[contador-1].pos_cur; } aux2[k].pos_aluno=posarq; aux2[k].pos_cur=poscur; } else if (k>i){ for (contador=i;contador<k-1;contador++){ aux2[contador].pos_aluno=aux2[contador+1].pos_aluno; aux2[contador].pos_cur=aux2[contador+1].pos_cur; } aux2[k-1].pos_aluno=posarq; aux2[k-1].pos_cur=poscur; } } fseek(alunos,posarq*sizeof(aux),SEEK_SET); fwrite(&aux,sizeof(aux),1,alunos); tela_erro(meserro,SUCESSO); getch(); delwin(meserro); deleta_tela(screen); } int altera_curso(WINDOW **screen,int *aux2){ /*Função responsável por alterar o cadastro de um curso*/ struct dados_curso aux,aux3; int i,k,contador,posarq; WINDOW *meserro; char pesq[25]; screen=tela_curso(screen); mvwaddstr(screen[0],1,20,"ALTERACAO DE CADASTRO DO CURSO"); wrefresh(screen[0]); if (aux2[0]==-1){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); deleta_tela(screen); return(0); } for (;;){ if (!(pega_string(screen[3],pesq,25))){ deleta_tela(screen); return(0); } i=busca_binaria(poscur,pesq,1); fseek(cursos,aux2[i]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); if (strcmp(aux.nome,pesq)!=0){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } else break; } posarq=aux2[i]; werase(screen[3]); for (contador=0;contador<=6;contador++) wprintw(screen[1],"%d",aux.codigo[contador]); waddstr(screen[2],aux.predio); waddstr(screen[3],aux.nome); waddstr(screen[4],aux.quantp); waddstr(screen[5],aux.dep); waddstr(screen[6],aux.coord); for (k=1;k<=6;k++) wrefresh(screen[k]); wscanw(screen[1],"%[0-9]6lu",aux3.codigo); if (!(pega_string(screen[2],aux3.predio,3))){ deleta_tela(screen); return(0); } else if (aux3.predio[0]!='{FONTE}') strcpy(aux.predio,aux3.predio); if (!(pega_string(screen[3],aux3.nome,25))){ deleta_tela(screen); return(0); } else{ if (aux3.nome[0]!='{FONTE}'){ if(strcmp(aux.nome,aux3.nome)){ do{ tela_erro(meserro,ALTERACAO); k=getch(); if (k=='n' || k=='N'){ delwin(meserro); deleta_tela(screen); return(0); } else if (k=='s' || k=='S'){ delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } }while (k!='n' && k!='N' && k!='s' && k!='S'); strcpy(aux.nome,aux3.nome); } } } if (!(pega_string(screen[4],aux3.quantp,3))){ deleta_tela(screen); return(0); } else if (aux3.quantp[0]!='{FONTE}') strcpy(aux.quantp,aux3.quantp); if (!(pega_string(screen[5],aux3.dep,50))){ deleta_tela(screen); return(0); } else if (aux3.dep[0]!='{FONTE}') strcpy(aux.dep,aux3.dep); if (!(pega_string(screen[6],aux3.coord,50))){ deleta_tela(screen); return(0); } else if (aux3.coord[0]!='{FONTE}') strcpy(aux.coord,aux3.coord); wrefresh(screen[0]); if (aux3.nome[0]!='{FONTE}'){ k=busca_binaria(poscur,aux3.nome,1); if (k<i){ for (contador=i;contador>k;contador--){ aux2[contador]=aux2[contador-1]; } aux2[k]=posarq; } else if (k>i){ for (contador=i;contador<k-1;contador++){ aux2[contador]=aux2[contador+1]; } aux2[k-1]=posarq; } } fseek(cursos,posarq*sizeof(aux),SEEK_SET); fwrite(&aux,sizeof(aux),1,cursos); tela_erro(meserro,SUCESSO); getch(); delwin(meserro); deleta_tela(screen); } int exclui_aluno(WINDOW **screen,struct ord *aux2){ /*Função responsável pela exclusão do cadastro de um aluno*/ struct dados aux; int i,k; WINDOW *meserro; char pesq[50],opcao; screen=tela_aluno(screen); mvwaddstr(screen[0],1,20,"EXCLUSAO DE CADASTRO DE ALUNO"); wrefresh(screen[0]); for (;;){ if (!(pega_string(screen[3],pesq,50))){ deleta_tela(screen); return(0); } i=busca_binaria(pos,pesq,0); fseek(alunos,aux2[i].pos_aluno*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); if (strcmp(aux.nome,pesq)!=0){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } else break; } werase(screen[3]); waddstr(screen[2],aux.identidade); waddstr(screen[3],aux.nome); waddstr(screen[4],aux.end.rua); waddstr(screen[5],aux.end.numero); waddstr(screen[6],aux.end.bairro); waddstr(screen[7],aux.end.cidade); waddstr(screen[8],aux.end.estado); waddstr(screen[9],aux.end.cep); waddstr(screen[10],aux.curso); wprintw(screen[11],"%d%d",aux.datanasc.dia[0],aux.datanasc.dia[1]); wprintw(screen[12],"%d%d",aux.datanasc.mes[0],aux.datanasc.mes[1]); wprintw(screen[13],"%d%d%d%d",aux.datanasc.ano[0],aux.datanasc.ano[1],aux.datanasc.ano[2],aux.datanasc.ano[3]); for (k=2;k<=13;k++) wrefresh(screen[k]); tela_erro(meserro,EXCLUI); noecho(); do{ opcao=getch(); }while (opcao!='s' && opcao!='S' && opcao!='n' && opcao!='N'); if (opcao=='s' || opcao=='S'){ for (k=i;k<=pos;k++){ aux2[k].pos_aluno=aux2[k+1].pos_aluno; aux2[k].pos_cur=aux2[k+1].pos_cur; } aux.status=0; fseek(alunos,-1*sizeof(aux),SEEK_CUR); fwrite(&aux,sizeof(aux),1,alunos); tela_erro(meserro,EXCLUIDO); } else tela_erro(meserro,NEXCLUIDO); getch(); deleta_tela(screen); delwin(meserro); return(1); } int exclui_curso(WINDOW **screen,int *aux2){ /*Função responsável pela exclusão de um curso*/ struct dados_curso aux; int i,k; WINDOW *meserro; char pesq[25],opcao; screen=tela_curso(screen); mvwaddstr(screen[0],1,20,"EXCLUSAO DE CADASTRO DE CURSO"); wrefresh(screen[0]); if (aux2[0]==-1){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); deleta_tela(screen); return(0); } for (;;){ if (!(pega_string(screen[3],pesq,25))){ deleta_tela(screen); return(0); } i=busca_binaria(poscur,pesq,1); fseek(cursos,aux2[i]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); if (strcmp(aux.nome,pesq)!=0){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); touchwin(screen[0]); wrefresh(screen[0]); } else break; } werase(screen[3]); for (k=0;k<=6;k++) wprintw(screen[1],"%d",aux.codigo[k]); waddstr(screen[2],aux.predio); waddstr(screen[3],aux.nome); waddstr(screen[4],aux.quantp); waddstr(screen[5],aux.dep); waddstr(screen[6],aux.coord); for (k=1;k<=6;k++) wrefresh(screen[k]); for (k=0;vet_alunos[k].pos_aluno!=-1;k++){ /*Garante que nenhum curso será apagado se possuir alunos cadastrados*/ if (vet_alunos[k].pos_aluno==aux2[i]){ /*nele.*/ tela_erro(meserro,APAGUE); getch(); deleta_tela(screen); delwin(meserro); return(0); } } tela_erro(meserro,EXCLUI); noecho(); do{ opcao=getch(); }while (opcao!='s' && opcao!='S' && opcao!='n' && opcao!='N'); if (opcao=='s' || opcao=='S'){ for (k=i;k<=poscur;k++){ aux2[k]=aux2[k+1]; } aux.status=0; fseek(cursos,-1*sizeof(aux),SEEK_CUR); fwrite(&aux,sizeof(aux),1,cursos); tela_erro(meserro,EXCLUIDO); } else tela_erro(meserro,NEXCLUIDO); getch(); deleta_tela(screen); delwin(meserro); return(1); } void lista_aluno(WINDOW *campos){ /*Função que lista todos os registros de um alunos*/ struct dados aux; struct dados_curso auxcur; int cont=3,conta; campos=tela_lista(campos); mvwaddstr(campos,1,15,"NOME"); mvwaddstr(campos,1,50,"CURSO"); for(conta=0;vet_alunos[conta].pos_aluno!=-1;conta++){ fseek(alunos,vet_alunos[conta].pos_aluno*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); fseek(cursos,vet_alunos[conta].pos_cur*sizeof(auxcur),SEEK_SET); fread(&auxcur,sizeof(auxcur),1,cursos); mvwaddstr(campos,cont,2,aux.nome); mvwaddstr(campos,cont,45,auxcur.nome); if (cont==16){ mvwaddstr(campos,cont+2,2,"Pressione uma tecla para continuar..."); wrefresh(campos); getch(); werase(campos); box(campos,ACS_VLINE,ACS_HLINE); mvwaddstr(campos,1,15,"NOME"); mvwaddstr(campos,1,50,"CURSO"); cont=3; } else cont++; } wrefresh(campos); delwin(campos); getch(); } int lista_aluno_curso (WINDOW *campos){ /*Função que lista os alunos de determinado curso*/ char pesq[25]; int i, cont=5,conta;; struct dados_curso aux; struct dados auxalu; WINDOW **item,*meserro; item=tela_pesquisa(item); wrefresh(item[0]); do{ if (!(pega_string(item[1],pesq,25))){ deleta_tela(item); return(0); } i=busca_binaria(poscur,pesq,1); fseek(cursos,vet_cursos[i]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); if (strcmp(aux.nome,pesq)!=0){ tela_erro(meserro,NACHOU); getch(); delwin(meserro); touchwin(item[0]); wrefresh(item[0]); } else break; }while (1); campos=tela_lista(campos); mvwprintw(campos,1,20,"CURSO: %s",aux.nome); mvwaddstr(campos,3,7,"CPF"); mvwaddstr(campos,3,25,"NOME DO ALUNO"); for(conta=0;vet_alunos[conta].pos_aluno!=-1;conta++){ fseek(alunos,vet_alunos[conta].pos_aluno*sizeof(auxalu),SEEK_SET); fread(&auxalu,sizeof(auxalu),1,alunos); if (vet_alunos[conta].pos_cur==vet_cursos[i]){ mvwaddstr(campos,cont,2,auxalu.cpf); mvwaddstr(campos,cont,20,auxalu.nome); if (cont==16){ mvwaddstr(campos,cont+2,2,"Pressione uma tecla para continuar..."); wrefresh(campos); getch(); werase(campos); box(campos,ACS_VLINE,ACS_HLINE); mvwprintw(campos,1,20,"CURSO: %s",aux.nome); mvwaddstr(campos,3,7,"CPF"); mvwaddstr(campos,3,25,"NOME DO ALUNO"); cont=5; } else cont++; } } wrefresh(campos); delwin(campos); getch(); } void lista_curso(WINDOW *campos){ /*Função que lista todos os cursos cadastrados*/ struct dados_curso aux; int cont=3,conta,k; campos=tela_lista(campos); mvwaddstr(campos,1,7,"CÓDIGO"); mvwaddstr(campos,1,25,"NOME DO CURSO"); for(conta=0;vet_cursos[conta]!=-1;conta++){ fseek(cursos,vet_cursos[conta]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); for (k=0;k<=6;k++) mvwprintw(campos,cont,k+2,"%d",aux.codigo[k]); mvwaddstr(campos,cont,20,aux.nome); if (cont==16){ mvwaddstr(campos,cont+2,2,"Pressione uma tecla para continuar..."); wrefresh(campos); getch(); werase(campos); box(campos,ACS_VLINE,ACS_HLINE); mvwaddstr(campos,1,7,"CÓDIGO"); mvwaddstr(campos,1,25,"NOME DO CURSO"); cont=3; } else cont++; } wrefresh(campos); delwin(campos); getch(); } void deleta_tela(WINDOW **espacos){ /*responsável por deletar as telas de gerenciamento de alunos e cursos*/ register short int i; for (i=0;i<=13;i++) delwin(espacos[i]); free(espacos); } void deleta_menu(WINDOW **opcoes,int cont){ /*responsável por deletar as telas dos menus*/ register short int i; for (i=0;i<=cont;i++) delwin(opcoes[i]); free(opcoes); } WINDOW **menuf2(WINDOW **opcoes){ /*Cria o menu F2*/ register short int i; opcoes=(WINDOW **)malloc(5*sizeof(WINDOW *)); opcoes[0]=newwin(6,13,1,13); wbkgd(opcoes[0],COLOR_PAIR(2)); box(opcoes[0],ACS_VLINE,ACS_HLINE); for (i=1;i<=4;i++){ opcoes[i]=subwin(opcoes[0],1,11,i+1,14); wbkgd(opcoes[i],COLOR_PAIR(2)); } waddstr(opcoes[1]," CADASTRAR"); waddstr(opcoes[2]," ALTERAR"); waddstr(opcoes[3]," EXCLUIR"); waddstr(opcoes[4]," LISTAR C"); wrefresh(opcoes[0]); return(opcoes); } WINDOW **menuf1(WINDOW **opcoes){ /*cria o menu F1*/ register short int i; opcoes=(WINDOW **)malloc(6*sizeof(WINDOW *)); opcoes[0]=newwin(7,13,1,0); wbkgd(opcoes[0],COLOR_PAIR(2)); box(opcoes[0],ACS_VLINE,ACS_HLINE); for (i=1;i<=5;i++){ opcoes[i]=subwin(opcoes[0],1,11,i+1,1); wbkgd(opcoes[i],COLOR_PAIR(2)); } waddstr(opcoes[1]," CADASTRAR"); waddstr(opcoes[2]," ALTERAR"); waddstr(opcoes[3]," EXCLUIR"); waddstr(opcoes[4]," LISTAR A"); waddstr(opcoes[5]," LISTAR AC"); wrefresh(opcoes[0]); return(opcoes); } void criabarrasuperior(WINDOW *barrasup){ /*Cria o menu superior*/ wbkgd(barrasup,COLOR_PAIR(2)); waddstr(barrasup," ALUNO "); wattron(barrasup,COLOR_PAIR(4)); waddstr(barrasup,"(F1) "); wattroff(barrasup,COLOR_PAIR(4)); waddstr(barrasup," CURSO"); wattron(barrasup,COLOR_PAIR(4)); waddstr(barrasup," (F2)"); wattroff(barrasup,COLOR_PAIR(4)); waddstr(barrasup," SAIR"); wattron(barrasup,COLOR_PAIR(4)); waddstr(barrasup," (F3)"); wattroff(barrasup,COLOR_PAIR(4)); } void ativa_ncurses(void){ /*Ativa biblioteca ncurses e define as diretrizes gráficas do programa*/ initscr(); start_color(); init_pair(1,COLOR_WHITE,COLOR_BLUE); init_pair(2,COLOR_BLUE,COLOR_WHITE); init_pair(3,COLOR_YELLOW,COLOR_RED); init_pair(4,COLOR_RED,COLOR_WHITE); init_pair(5,COLOR_BLACK,COLOR_WHITE); init_pair(6,COLOR_WHITE,COLOR_BLACK); init_pair(7,COLOR_WHITE,COLOR_RED); curs_set(0); noecho(); keypad(stdscr,TRUE); } WINDOW **tela_aluno(WINDOW **campos){ /*Cria tela de gerenciamento de alunos*/ register short int i; campos=(WINDOW **)malloc(14*sizeof(WINDOW *)); campos[0]=newwin(20,75,2,2); wbkgd(campos[0],COLOR_PAIR(5)); box(campos[0],ACS_VLINE,ACS_HLINE); campos[1]=subwin(campos[0],1,15,6,12); campos[2]=subwin(campos[0],1,14,6,49); campos[3]=subwin(campos[0],1,51,8,12); campos[4]=subwin(campos[0],1,51,10,12); campos[5]=subwin(campos[0],1,6,10,68); campos[6]=subwin(campos[0],1,31,12,12); campos[7]=subwin(campos[0],1,21,14,12); campos[8]=subwin(campos[0],1,3,14,45); campos[9]=subwin(campos[0],1,9,14,55); campos[10]=subwin(campos[0],1,25,16,12); campos[11]=subwin(campos[0],1,3,16,54); campos[12]=subwin(campos[0],1,3,16,58); campos[13]=subwin(campos[0],1,5,16,62); for (i=1;i<=14;i++) wbkgd(campos[i],COLOR_PAIR(6)); mvwaddstr(campos[0],4,2,"CPF:"); mvwaddstr(campos[0],4,35,"IDENTIDADE:"); mvwaddstr(campos[0],6,2,"NOME:"); mvwaddstr(campos[0],8,2,"RUA:"); mvwaddstr(campos[0],8,62,"NUM:"); mvwaddstr(campos[0],10,2,"BAIRRO:"); mvwaddstr(campos[0],12,2,"CIDADE:"); mvwaddstr(campos[0],12,35,"ESTADO:"); mvwaddstr(campos[0],12,48,"CEP:"); mvwaddstr(campos[0],14,2,"CURSO:"); mvwaddstr(campos[0],14,40,"NASCIMENTO:"); mvwaddstr(campos[0],14,55,"/"); mvwaddstr(campos[0],14,59,"/"); mvwaddstr(campos[1],0,0," . . -"); wrefresh(campos[0]); return(campos); } WINDOW **tela_curso(WINDOW **campos){ /*Cria tela de gerenciamento de cursos*/ register short int i; campos=(WINDOW **)malloc(7*sizeof(WINDOW *)); campos[0]=newwin(20,75,2,2); wbkgd(campos[0],COLOR_PAIR(5)); box(campos[0],ACS_VLINE,ACS_HLINE); campos[1]=subwin(campos[0],1,6,6,18); campos[2]=subwin(campos[0],1,3,6,49); campos[3]=subwin(campos[0],1,25,8,18); campos[4]=subwin(campos[0],1,2,8,65); campos[5]=subwin(campos[0],1,51,10,18); campos[6]=subwin(campos[0],1,51,12,18); for (i=1;i<=6;i++) wbkgd(campos[i],COLOR_PAIR(6)); mvwaddstr(campos[0],4,2,"CÓDIGO:"); mvwaddstr(campos[0],4,35,"PRÉDIO:"); mvwaddstr(campos[0],6,2,"NOME:"); mvwaddstr(campos[0],6,45,"QUANT. PERÍODOS:"); mvwaddstr(campos[0],8,2,"DEPARTAMENTO:"); mvwaddstr(campos[0],10,2,"COORDENADOR:"); return(campos); } WINDOW *tela_lista (WINDOW *itens){ /*Cria tela para listagem dos cadastros*/ register short int i; itens=newwin(20,75,2,2); wbkgd(itens,COLOR_PAIR(4)); box(itens,ACS_VLINE,ACS_HLINE); wrefresh(itens); return(itens); } WINDOW **tela_pesquisa (WINDOW **campos){ /*Cria tela de pesquisa de curso*/ register short int i; campos=(WINDOW **)malloc(2*sizeof(WINDOW *)); campos[0]=newwin(6,75,7,2); wbkgd(campos[0],COLOR_PAIR(5)); box(campos[0],ACS_VLINE,ACS_HLINE); campos[1]=subwin(campos[0],1,25,10,20); wbkgd(campos[1],COLOR_PAIR(6)); mvwaddstr(campos[0],2,2,"A QUAL CURSO OS ALUNOS QUE VOCÊ DESEJA LISTAR PERTENCEM?"); return(campos); } void tela_erro(WINDOW *erro,int mensagem){ /*Cria tela de advertência*/ erro=newwin(6,30,9,25); wbkgd(erro,COLOR_PAIR(7)); box(erro,ACS_VLINE,ACS_HLINE); switch (mensagem){ case NACHOU : mvwaddstr(erro,2,2,"REGISTRO NAO ENCONTRADO!!"); break; case JAEXISTE : mvwaddstr(erro,2,6,"CPF JÁ EXISTENTE!"); mvwaddstr(erro,3,1,"IMPOSSIVEL EFETUAR CADASTRO!"); break; case SONUM : mvwaddstr(erro,2,4,"DIGITE APENAS NUMEROS!"); break; case EXCLUI : mvwaddstr(erro,2,2,"DESEJA REALMENTE EXCLUIR?"); mvwaddstr(erro,3,2,"(s/n)"); break; case EXCLUIDO : mvwaddstr(erro,2,2,"ITEM EXCLUIDO COM SUCESSO!"); break; case NEXCLUIDO : mvwaddstr(erro,2,6,"OPERACAO DE EXCLUSÃO"); mvwaddstr(erro,3,12,"CANCELADA"); break; case SUCESSO : mvwaddstr(erro,2,6,"OPERACAO REALIZADA"); mvwaddstr(erro,3,9,"COM SUCESSO!"); break; case NCURSO : mvwaddstr(erro,2,6,"IMPOSSÍVEL EFETUAR"); mvwaddstr(erro,3,11,"CADASTRO!"); break; case APAGUE : mvwaddstr(erro,2,3,"APAGUE TODOS OS ALUNOS"); mvwaddstr(erro,3,2,"PERTENCENTES A ESTE CURSO"); mvwaddstr(erro,4,10,"PRIMEIRO!"); break; case ALTERACAO : mvwaddstr(erro,1,4,"AS ALTERAÇÕES FEITAS"); mvwaddstr(erro,2,2,"AFETARÃO TODOS OS ALUNOS"); mvwaddstr(erro,3,3,"INSCRITOS NESSE CURSO!"); mvwaddstr(erro,4,2,"DESEJA CONTINUAR? (s/n)"); break; default : mvwaddstr(erro,3,2,"ERRO DESCONHECIDO!"); } curs_set(0); wrefresh(erro); } int scroll_menu_f1(WINDOW **items,WINDOW *mensagem){ /*responsável pela movimentação do cursor no menu F1*/ int key,selected=-1; while (1) { key=getch(); if (key==KEY_DOWN || key==KEY_UP) { wbkgd(items[selected+1],COLOR_PAIR(2)); wnoutrefresh(items[selected+1]); if (key==KEY_DOWN){ selected=(selected+1) % 5; } else { selected=(selected+5-1) % 5; } switch (selected){ case 0 : werase(mensagem); waddstr(mensagem,"Efetua o cadastro de um novo aluno."); wrefresh(mensagem); break; case 1 : werase(mensagem); waddstr(mensagem,"Altera o cadastro de um aluno existente."); wrefresh(mensagem); break; case 2 : werase(mensagem); waddstr(mensagem,"Exclui o cadastro de um aluno existente."); wrefresh(mensagem); break; case 3 : werase(mensagem); waddstr(mensagem,"Lista todos os alunos cadastrados."); wrefresh(mensagem); break; case 4 : werase(mensagem); waddstr(mensagem,"Lista os alunos cadastrados em determinado curso."); break; } wbkgd(items[selected+1],COLOR_PAIR(1)); wnoutrefresh(mensagem); wnoutrefresh(items[selected+1]); doupdate(); } else if (key==ESCAPE) { return -1; } else if (key==ENTER) { return selected; } } } int scroll_menu_f2(WINDOW **items,WINDOW *mensagem){ /*Responsável pela movimentação do cursor no menu F2*/ int key; int selected=-1; while (1) { key=getch(); if (key==KEY_DOWN || key==KEY_UP) { wbkgd(items[selected+1],COLOR_PAIR(2)); wnoutrefresh(items[selected+1]); if (key==KEY_DOWN){ selected=(selected+1)%4; } else { selected=(selected+4-1)%4; } switch (selected){ case 0 : werase(mensagem); waddstr(mensagem,"Efetua o cadastro de um novo curso."); wrefresh(mensagem); break; case 1 : werase(mensagem); waddstr(mensagem,"Altera o cadastro de um curso existente."); wrefresh(mensagem); break; case 2 : werase(mensagem); waddstr(mensagem,"Exclui o cadastro de um curso existente."); wrefresh(mensagem); break; case 3 : werase(mensagem); waddstr(mensagem,"Lista os cursos cadastrados."); wrefresh(mensagem); break; } wbkgd(items[selected+1],COLOR_PAIR(1)); wnoutrefresh(mensagem); wnoutrefresh(items[selected+1]); doupdate(); } else if (key==ESCAPE) { return -1; } else if (key==ENTER) { return selected; } } } void quicksort(int begin, int end,int opcao) { /*Responsável por ordenar os registros quando o arquivo de ordenação*/ if (!opcao){ /*é perdido*/ struct dados aux; if (end - begin > 1) { char pivot[50]; int l = begin + 1; int r = end,k; fseek(alunos,vet_alunos[begin].pos_aluno*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); strcpy(pivot,aux.nome); while(l < r) { fseek(alunos,vet_alunos[l].pos_aluno*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,alunos); if (strcmp(aux.nome,pivot)<=0) { l++; } else { r--; k=vet_alunos[l].pos_aluno; vet_alunos[l].pos_aluno=vet_alunos[r].pos_aluno; vet_alunos[r].pos_aluno=k; k=vet_alunos[l].pos_cur; vet_alunos[l].pos_cur=vet_alunos[r].pos_cur; vet_alunos[r].pos_cur=k; } } l--; k=vet_alunos[begin].pos_aluno; vet_alunos[begin].pos_aluno=vet_alunos[l].pos_aluno; vet_alunos[l].pos_aluno=k; k=vet_alunos[begin].pos_cur; vet_alunos[begin].pos_cur=vet_alunos[l].pos_cur; vet_alunos[l].pos_cur=k; quicksort(begin,l,0); quicksort(r,end,0); } } else{ struct dados_curso aux; if (end - begin > 1) { char pivot[25]; int l = begin + 1; int r = end,k; fseek(cursos,vet_cursos[begin]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); strcpy(pivot,aux.nome); while(l < r) { fseek(cursos,vet_cursos[l]*sizeof(aux),SEEK_SET); fread(&aux,sizeof(aux),1,cursos); if (strcmp(aux.nome,pivot)<=0) { l++; } else { r--; k=vet_cursos[l]; vet_cursos[l]=vet_cursos[r]; vet_cursos[r]=k; } } l--; k=vet_cursos[begin]; vet_cursos[begin]=vet_cursos[l]; vet_cursos[l]=k; quicksort(begin,l,1); quicksort(r,end,1); } } } int main(void){ /*Função princial do programa*/ unsigned int key; WINDOW *menubar,*messagebar; abre(); carrega_vetor(0); carrega_vetor(1); key=0; while (vet_alunos[key].pos_aluno!=-1){ pos++; key++; } key=0; while (vet_cursos[key]!=-1){ poscur++; key++; } fseek(cursos,0,SEEK_END); if ((key=ftell(cursos)/sizeof(struct dados_curso)!=0) && poscur==-1){ struct dados_curso temp; int contador=0; fseek(cursos,0,SEEK_SET); fread(&temp,sizeof(temp),1,cursos); key=-1; while (!feof(cursos)){ if (temp.status==1){ key++; vet_cursos[key]=contador; } contador++; fread(&temp,sizeof(temp),1,cursos); } quicksort(0,key+1,1); } fseek(alunos,0,SEEK_END); if ((key=ftell(alunos)/sizeof(struct dados)!=0) && pos==-1){ struct dados temp; int contador=0; fseek(alunos,0,SEEK_SET); fread(&temp,sizeof(temp),1,alunos); key=-1; while (!feof(alunos)){ if (temp.status==1){ key++; vet_alunos[key].pos_aluno=contador; vet_alunos[key].pos_cur=vet_cursos[busca_binaria(poscur,temp.curso,1)]; } contador++; fread(&temp,sizeof(temp),1,alunos); } quicksort(0,key+1,0); } ativa_ncurses(); bkgd(COLOR_PAIR(1)); menubar=subwin(stdscr,1,80,0,0); messagebar=subwin(stdscr,1,80,24,0); wbkgd(messagebar,COLOR_PAIR(2)); criabarrasuperior(menubar); refresh(); do { int selected_item; WINDOW **menu_items,**tela,*listacad; key=getch(); werase(messagebar); wrefresh(messagebar); if (key==KEY_F(1)) { menu_items=menuf1(menu_items); selected_item=scroll_menu_f1(menu_items,messagebar); deleta_menu(menu_items,4); switch (selected_item){ case -1 : werase(messagebar); wprintw(messagebar,"Escolha uma opcao."); break; case 0 : pos+=cadastra_aluno(tela,vet_alunos); break; case 1 : altera_aluno(tela,vet_alunos); break; case 2 : pos-=exclui_aluno(tela,vet_alunos); break; case 3 : lista_aluno(listacad); break; case 4 : lista_aluno_curso(listacad); break; } touchwin(stdscr); refresh(); } if (key==KEY_F(2)){ menu_items=menuf2(menu_items); selected_item=scroll_menu_f2(menu_items,messagebar); deleta_menu(menu_items,5); switch (selected_item){ case -1 : werase(messagebar); wprintw(messagebar,"Escolha uma opcao."); break; case 0 : poscur+=cadastra_curso(tela,vet_cursos); break; case 1 : altera_curso(tela,vet_cursos); break; case 2 : pos-=exclui_curso(tela,vet_cursos); break; case 3 : lista_curso(listacad); break; } touchwin(stdscr); refresh(); } }while (key!=KEY_F(3)); delwin(menubar); delwin(messagebar); endwin(); fclose(alunos); salva_vetor(); return(0); }
Programa para inversão de colunas
Editar o arquivo /etc/rc.d/rc.local
Cadastro de arquivo usando ncurses como menu
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta