#include #include #include #include bool Gerar_Base_Aleatoria(Banco_Dados *banco_dados) { int i=1000000; Preenche preenche; // Mensagem: printf("\n\033[1;33mGerar base randômica\033[0m\n"); // Tenta ler um número válido: while (i > 999999) { printf(" \033[0;1mDigite o número de registros a ser inserido:\033[1;30m (1-999999, <1=Cancela)\033[1;35m "); scanf("%i",&i); printf("\033[0m"); if (i > 999999) { printf("\n \033[31mERRO:\033[0;1m O número máximo de registros é 999.999, devido ao fato de o número poder ter somente 6 posições.\033[0m\n"); } else if (i < 1) return false; } // Mensagem: printf("\033[0;1m Ok, gerando \033[1;36m%i\033[0;1m registros randomicos.\033[0m\n",i); // Recomeça banco de dados banco_dados->Apaga(); // Insere e mostra status: printf("\033[0;1m Feito: "); int j; for (j=1; j <= i; j++) { if (!banco_dados->Insere(preenche.Numero(), preenche.Nome().Texto(), preenche.Idade(), preenche.Diagnostico().Texto(), preenche.Tratamento().Texto())) { j--; // o numero foi repetido, volta... } else { printf("\033[11G\033[1;35m%3.1f%% \033[1;30m(\033[1;36m%06i\033[1;30m/\033[0;36m%06i\033[1;30m)\033[0m",100.0*j/i,j,i); } } printf("\n\033[0;1m Base gerada.\n\033[0m"); return true; } String Le_Linha_STDIN() { String linha; char c; while ((scanf("%c",&c)!=EOF) && (c!='\n')) linha += c; return linha; } void Imprime_Registro(Registro *reg) { if (reg != NULL) { printf("\033[1;30m .------------------------ --- -- -\033[0m\n" "\033[1;30m | \033[1;30m#\033[0m#\033[1m#\033[1;36mN\033[0;36múmero\033[0;1m.....: \033[1;35m%06i\033[0m\n" "\033[1;30m | \033[1;30m#\033[0m#\033[1m#\033[1;36mN\033[0;36mome\033[0;1m.......: \033[1;35m%s\033[0m\n" "\033[1;30m | \033[1;30m#\033[0m#\033[1m#\033[1;36mI\033[0;36mdade\033[0;1m......: \033[1;35m%i\033[0m\n" "\033[1;30m | \033[1;30m#\033[0m#\033[1m#\033[1;36mD\033[0;36miagnóstico\033[0;1m: \033[1;35m%s\033[0m\n" "\033[1;30m | \033[1;30m#\033[0m#\033[1m#\033[1;36mT\033[0;36mratamento\033[0;1m.:\n", reg->Numero(), reg->Nome().Texto(), reg->Idade(), reg->Diagnostico().Texto()); Lista_Simples *lista = reg->Tratamento().Quebra('/'); Lista_Simples *aux = lista; while (aux != NULL) { printf("\033[1;30m | \033[0;1m+-> \033[1;35m%s\033[0m\n",aux->Valor().Texto()); aux=aux->Proximo(); } delete lista; printf("\033[1;30m `------------------------ --- -- -\033[0m\n"); } else { printf("\033[0;1m O registro procurado não existe.\033[0m\n"); } } bool Inserir_Registro(Banco_Dados *banco_dados) { String numero, nome, idade, diagnostico, tratamento; bool p_numero=true, p_nome=true, p_idade=true, p_diagnostico=true, p_tratamento=true; // Mensagem: printf("\n\033[1;33mInserir Registro\033[0m\n"); printf("\033[0;1mEspecifique todos os campos!\033[0m\n"); while (numero.Vazia() && (numero.Para_Int() > -1) && (numero.Para_Int() < 1000000)) { if (!p_numero) printf(" \033[1;31mERRO:\033[0;1m É necessário especificar um número único, válido, entre 0 e 999999\033[0m\n"); printf(" \033[1;36mN\033[0;36múmero\033[0;1m.....: \033[1;35m"); numero = Le_Linha_STDIN(); p_numero = false; Registro *reg=NULL; if ((reg = banco_dados->Procura_Numero(numero.Para_Int())) != NULL) { delete reg; printf(" \033[1;31mERRO:\033[0;1m É necessário especificar um número \033[1;31múnico\033[0;1m, e o número \033[1;35m%06d\033[0;1m já existe.\033[0m\n",numero.Para_Int()); numero = ""; // volta no loop } } while (nome.Vazia()) { if (!p_nome) printf(" \033[1;31mERRO:\033[0;1m É necessário especificar um nome válido.\033[0m"); printf(" \033[1;36mN\033[0;36mome\033[0;1m.......: \033[1;35m"); nome = Le_Linha_STDIN(); p_nome = false; } while (idade.Vazia() && (idade.Para_Int() > -1)) { if (!p_idade) printf(" \033[1;31mERRO:\033[0;1m É necessário especificar uma idade válida, entre 0 e 130\033[0m\n"); printf(" \033[1;36mI\033[0;36mdade\033[0;1m......: \033[1;35m"); idade = Le_Linha_STDIN(); p_idade = false; } while (diagnostico.Vazia()) { if (!p_diagnostico) printf(" \033[1;31mERRO:\033[0;1m É necessário especificar um diagnóstico válido\033[0m\n"); printf(" \033[1;36mD\033[0;36miagnóstico\033[0;1m: \033[1;35m"); diagnostico = Le_Linha_STDIN(); p_diagnostico = false; } while (tratamento.Vazia()) { if (!p_tratamento) printf(" \033[1;31mERRO:\033[0;1m É necessário especificar um tratamento válido. Vários tratamentos devem ser separados por \033[1;36m/\033[1;35m.\033[0m\n"); printf(" \033[1;36mT\033[0;36mratamento\033[0;1m.: \033[1;35m"); tratamento = Le_Linha_STDIN(); p_tratamento = false; } return banco_dados->Insere(numero.Para_Int(),nome.Texto(),idade.Para_Int(),diagnostico.Texto(),tratamento.Texto()); } bool Procurar_Registro(Banco_Dados *banco_dados) { String numero; String nome; String idade; String diagnostico; String tratamento; // Mensagem: printf("\n\033[1;33mProcurar por Registro\033[0m\n"); // Lê numero a ser procurado printf("\033[0;1mDigite os campos que caracterizam sua procura\033[0m\n"); printf(" \033[1;36mN\033[0;36múmero\033[0;1m.....: \033[1;35m"); numero = Le_Linha_STDIN(); if (! numero.Vazia()) { // Procura no índice: Registro *reg; reg = banco_dados->Procura_Numero(numero.Para_Int()); // Mostra resultado: Imprime_Registro(reg); delete reg; } else { printf(" \033[1;36mN\033[0;36mome\033[0;1m.......: \033[1;35m"); nome = Le_Linha_STDIN(); printf(" \033[1;36mI\033[0;36mdade\033[0;1m......: \033[1;35m"); idade = Le_Linha_STDIN(); printf(" \033[1;36mD\033[0;36miagnóstico\033[0;1m: \033[1;35m"); diagnostico = Le_Linha_STDIN(); printf(" \033[1;36mT\033[0;36mratamento\033[0;1m.: \033[1;35m"); tratamento = Le_Linha_STDIN(); Lista_Simples *lreg = NULL, *lreg_aux; Registro reg; lreg = banco_dados->Procura(nome,idade,diagnostico,tratamento); lreg_aux = lreg; if (lreg_aux == NULL) { Imprime_Registro(NULL); // Mostra que o registro procurado nao existe return false; } while (lreg_aux != NULL) { reg = lreg_aux->Valor(); printf("\n"); Imprime_Registro(®); lreg_aux = lreg_aux->Proximo(); } if (lreg != NULL) delete lreg; } printf("\033[0m"); return true; } bool Apagar_Registro(Banco_Dados *banco_dados) { int i; // Mensagem: printf("\n\033[1;33mRemover Registro\033[0m\n"); printf("\033[0;1m Número a ser removido: \033[1;35m"); scanf("%d",&i); printf("\033[0m "); if (banco_dados->Remove(i)) { printf("\033[0;1m Registro de número %i removido.\n\033[0m",i); } else { printf("\033[0;1m Registro de número %i \033[31mnao\033[0;1m pode ser removido.\n\033[0m",i); } return false; } bool Calcula_Media(Banco_Dados *banco_dados) { double media; // Mensagem: printf("\n\033[1;33mCalcular média das Idades\033[0m\n"); printf("\033[0;1m Calculando a média das idades.\033[0m.\033[1;30m.\033[0m\n"); // Calcula e retorna resultado if (banco_dados->Media("idade",&media) == true) printf("\033[0;1m Média = \033[1;36m%i\033[0m\n",(int) media ); else printf("\033[1;31mERRO:\033[0;1m Não existem registros para se calcular a média\033[0m\n"); return true; } char Menu() { char opc=' '; printf("\033[1;36mMC326 \033[0;1m- \033[1;35mH\033[0;35mospital \033[1;35mU\033[0;35mnicamp \033[0;1m(TP2)\033[0m\n" "\033[1;36mGrupo:\033[0;1m Gustavo Barbieri(ra008849), Ivens Alves(ra008908), Walter Wong(ra010080)\033[0m\n" "\033[1;36mE\033[0;36mscolha uma das opções\033[1;36m:\033[0m\n" " \033[1;35ms\033[0;1m Sair\033[0m\n" " \033[1;35mg\033[0;1m Gerar base aleatória\033[0m\n" " \033[1;35mm\033[0;1m Calcular média das idades\033[0m\n" " \033[1;35mp\033[0;1m Procurar por registro\033[0m\n" " \033[1;35mr\033[0;1m Remover um registro\033[0m\n" " \033[1;35mi\033[0;1m Inserir um registro\033[0m\n" "\033[0;1mOpção escolhida: \033[1;35m"); scanf("%c",&opc); char lixo; scanf("%c",&lixo); // lê o \n printf("\033[0m"); return tolower(opc); } int main(void) { Lista_Simples campos; campos.Muda_Valor("NUMERO"); campos.Add_Depois("TRATAMENTO"); campos.Add_Depois("DIAGNOSTICO"); campos.Add_Depois("IDADE"); campos.Add_Depois("NOME"); Banco_Dados banco_dados("dados.dat",campos); char opc; while ((opc=Menu()) != 's') { switch (opc) { case 'g': Gerar_Base_Aleatoria(&banco_dados); break; case 'm': Calcula_Media(&banco_dados); break; case 'p': Procurar_Registro(&banco_dados); break; case 'r': Apagar_Registro(&banco_dados); break; case 'i': Inserir_Registro(&banco_dados); break; case 'w': printf("WOOOOOOOOOOOOOOOOOOOOOOOOOOOO"); break; } printf("\033[16G\033[1;30m---=[\033[0;1mPressione Alguma Tecla Para Continuar\033[1;30m]=---\033[0m\n"); getchar(); } printf("\033[1;36mFa\033[0;36mlow\033[1;30mwwww w\033[0m\n\n"); return 0; }