int main() { Aluno aluno; Base base; Boolean fim = false; int ra; char acao; base = CriaBase(); do { if (scanf("%c", &acao) == EOF) fim = true; else { printf("Ação: %c", acao); switch (acao) { case '#': ImprimeComentario(); break; case 'i': case 'I': scanf("%d ",&aluno.ra); aluno.nome = leNome(); printf(" %06d %s\n", aluno.ra, aluno.nome); if (!InsereBase(&base, aluno)) { printf("Ra %06d já estava presente na base de dados.\n", aluno.ra); FREE(aluno.nome); } break; case 'c': case 'C': scanf("%d",&ra); printf(" %06d",ra); ImprimeComentario(); if (ConsultaBase(&base, ra, &aluno)) printf("%06d %s \n", ra, aluno.nome); else printf("Ra %06d não encontrado na base de dados.\n", ra); break; case 'r': case 'R': scanf("%d",&ra); printf(" %06d",ra); ImprimeComentario(); if (RemoveBase(&base, ra)) printf("Ra %06d removido.\n", ra); else printf("Ra %06d não encontrado na base de dados.\n", ra); break; case 'n': case 'N': ImprimeComentario(); printf("Número de nós na base de dados: %d.\n", NumeroNosBase(&base)); break; case 'a': case 'A': ImprimeComentario(); printf("Altura da base de dados: %d.\n", AlturaBase(&base)); break; case 'l': case 'L': ImprimeComentario(); LiberaBase(&base); base = CriaBase(); break; case 'p': case 'P': ImprimeComentario(); PercorreBase(&base,ImprimeAluno); break; case 'h': case 'H': ImprimeComentario(); printf("\n"); printf("# : comentário.\n"); printf("i <ra> <nome> : insere ra e nome na base.\n"); printf("c <ra> : consulta ra na base.\n"); printf("r <ra> : remove ra da base.\n"); printf("l : libera base.\n"); printf("p : executa um percurso inordem na base.\n"); printf("n : verifica número de nós na base.\n"); printf("a : verifica altura da base.\n"); printf("h : imprime resumo.\n"); printf("x : término.\n"); printf("q : término.\n"); fim = true; break; case 'x': case 'X': case 'q': case 'Q': ImprimeComentario(); fim = true; break; } /* switch */ } } while (!fim); bapply(bprint); printf("Processamento terminado\n"); return 0; } /* main */
int main(int argc, char * argv[]) { /* Os argumentos são os nomes dos dois arquivos que contêm, respectivamente, os dados para inserção e as operacoes. A saída é para o arquivo 'stdout'. */ Aluno a; int ra; char op; Base p; FILE * dados; FILE * operacoes; if (argc!=3) { /* verifica o número de argumentos */ printf("Faltam ou sobram nomes dos arquivos\n"); return 1; } dados = fopen(argv[1],"r"); operacoes = fopen(argv[2],"r"); if ((dados==NULL) || (operacoes==NULL)) { printf("Problmas na abertura dos arquivos\n"); return 1; } buf = MALLOC(ComprMaxNome); p = CriaBase(); printf("Carga inicial dos dados:\n"); while (LeAluno(dados,&a)) { if (!InsereBase(p,&a)) { printf("RA=%d repetido\n",a.ra); FREE(a.nome); } } printf("\nOperações:\n"); while (fscanf(operacoes,"%c",&op)!=EOF) { switch (op) { case 'i': LeAluno(operacoes,&a); /* ignora o resultado booleano */ printf("Insere: %d %s\n",a.ra,a.nome); if (!InsereBase(p,&a)) { printf("RA=%d repetido\n",a.ra); FREE(a.nome); } break; case 'r': fscanf(operacoes,"%d\n",&ra); printf("Remove: %d\n",ra); if (!RemoveBase(p,ra)) printf("RA inexistente: %6d\n",ra); break; case 'c': fscanf(operacoes,"%d\n",&ra); printf("Consulta: %d\n",ra); if (ConsultaBase(p,ra,&a)) printf("%6d %s\n",a.ra, a.nome); else printf("RA inexistente: %6d\n",ra); break; case 'w': fscanf(operacoes,"\n"); printf("\nImprime base: %d registro(s):\n",NumeroRegsBase(p)); ImprimeBase(p); printf("\n"); break; default: fscanf(operacoes,"\n"); printf("Operacao invalida: %c\n",op); break; } } LiberaBase(p); FREE(buf); fclose(dados); fclose(operacoes); bapply(bprint); printf("\nProcessamento terminado\n"); return 0; }