Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <string.h>
- #include <unistd.h>
- #include <ctype.h>
- int opcao; /* opção escolhida do menu */
- int segundoturno = 0; /* variavel de controle para segundo turno */
- int valida = 0; /* variavel de controle para menu */
- int encerrada = 0; /* Variavel de controle para encerramento da votação */
- int continua = 0; /*Variavel de controle para cadastro */
- int encontrado_e = 0;
- int encontrado_c = 0;
- int nulo = 0;
- int branco = 0;
- /* DECLARAÇÃO DAS AVORES /*
- /* INICO DA DECLARAÇÃO DA ARVORE DE ELEITORES */
- struct Arvore_Eleitor /* Arvore para armazenar o titulo de eleitor. Padrão : 03 numeros seguido do nome em maiusculo : 123 BRUNO */
- {
- char eleitor[15]; /* Nome e titulo do eleitor */
- };
- struct Nos_Eleitores /* Nós da árvore de eleitores */
- {
- Arvore_Eleitor Item;
- Nos_Eleitores *Esq, *Dir;
- };
- typedef Nos_Eleitores *Nos_Arvore_Eleitores; /* Nós da arvore de eleitores */
- /* FIM DA DECLARAÇÃO DA ARVORE DE ELEITORES */
- /* INICIO DECLARAÇÃO DA ARVORE DE CANDIDATOS */
- struct Arvore_Candidatos /* Arvore para salvar os candidatos. Padrão 3 numeros seguido do nome em maiusculo - 123 JOAO */
- {
- char nome[15];
- };
- struct Nos_Candidato
- {
- Arvore_Candidatos Item;
- Nos_Candidato *Esq, *Dir;
- };
- typedef Nos_Candidato *Nos_Arv_Candidato; /* Nós da arvore Candidato */
- /* FIM DA DECLARAÇÃO DA ARVORE DE CANDIDATOS */
- /* INICIO DECLARAÇÃO DA ARVORE DE ELEITORES QUE VOTARAM */
- struct Arvore_Eleitor_Voto /* Arvore onde será salvos os eleitores que ja votaram */
- {
- char eleitor_voto[15];
- };
- struct Nos_Voto_Valido /* Nós da arvore que armazena os eleitores que votaram */
- {
- Arvore_Eleitor_Voto Item;
- Nos_Voto_Valido *Esq, *Dir;
- };
- typedef Nos_Voto_Valido *Nos_Arv_Voto_Valido; /* Nós da arvore de votos válidos */
- /* FIM DA DECLARAÇÃO DA ARVORE DE ELEITORES QUE VOTARAM */
- /* INICIO DA DECLARAÇÃO ARVORE DE VOTOS */
- struct Arvore_Votos /* Arvore para armazenar os votos. Ela sera degenerada, o cadidato encontrado, sempre sera salvo a esquerda */
- {
- char nome[15];
- int votos = 0;
- };
- struct Nos_Votos /* Nós da arvore de votos */
- {
- Arvore_Votos Item;
- Nos_Votos *Esq, *Dir; /* Pesquiso na arvore candidato, se ele for encontrado eu crio um nó a direita */
- };
- typedef Nos_Votos *Nos_Arv_Votos; /* Nós da arvore de votos */
- /* FIM DA DECLARAÇÃO ARVORE DE VOTOS */
- /* FIM DA DECLARAÇÃO DAS ARVORES */
- /* DECLARAÇÃO DAS FUNÇÕES DE MANIPULAÇÃO DAS ARVORES */
- /* 1 - FUNÇÕES DE INICIALIZAÇÃO DAS ARVORES */
- void Iniciar_Arv_Eleitor(Nos_Arvore_Eleitores &p) /* Iniciar a arvore de eleitores */
- {
- p = NULL;
- }
- void Iniciar_Arv_Candidato(Nos_Arv_Candidato &p)
- {
- p = NULL;
- }
- void Iniciar_Arv_Voto(Nos_Arv_Votos &p)
- {
- p = NULL;
- }
- void Iniciar_Arv_Voto_Valido(Nos_Arv_Voto_Valido &p)
- {
- p = NULL;
- }
- /* 2- FUNÇÕES DE INSERÇÃO EM ARVORE */
- void Insere_Eleitor(Arvore_Eleitor x, Nos_Arvore_Eleitores &p) /* Inserir elemento na árvore de Nos_Arvore_Eleitores */
- {
- /* Se o apontador é nulo, ou seja arvore vazia */
- if (p == NULL)
- { /* aloco dinamicamente o tamanho do apontador */
- p = (Nos_Eleitores *)calloc(1, sizeof(Nos_Eleitores));
- /* Inserindo elemento na raiz. Como apontador começa com nulo, cai aqui e é inserido*/
- p->Item = x;
- /* Folha a Esquerda fica com NULL */
- p->Esq = NULL;
- /* Folha a direita fica com NULL */
- p->Dir = NULL;
- }
- /* Quando o apontador não é nulo, ou seja eu ja tenho um elemento em minha árvore */
- else
- { /* Se meu elemento é menor que a raiz, insiro ele a esquerda */
- if (x.eleitor < p->Item.eleitor)
- {
- Insere_Eleitor(x, p->Esq);
- }
- else
- { /* se meu elemento é maior que a raiz, insiro ele a direita */
- if (x.eleitor > p->Item.eleitor)
- {
- Insere_Eleitor(x, p->Dir);
- }
- /* se ele ja estiver na arvore, informo que ele ja existe */
- else
- {
- {
- printf("Eleitor ja existe \n");
- printf("------------------------\n");
- }
- }
- }
- }
- }
- void Insere_Candidato(Arvore_Candidatos x, Nos_Arv_Candidato &p) /* Função para cadastrar candidatos */
- {
- if (p == NULL) /* Se o apontador é nulo, ou seja arvore esta vazia */
- {
- p = (Nos_Candidato *)calloc(1, sizeof(Nos_Candidato)); /* aloco dinamicamente o tamanho do apontador do Candidato */
- p->Item = x; /* Inserindo Candidato na raiz. Como apontador começa com nulo, cai aqui e é inserido*/
- p->Esq = NULL; /* Folha a Esquerda fica com NULL */
- p->Dir = NULL; /* Folha a Direita fica com NULL */
- }
- else /* Quando o apontador não é nulo, ou seja eu ja tenho um Candidato em minha árvore */
- {
- if (x.nome < p->Item.nome)
- {
- Insere_Candidato(x, p->Esq); /* Se meu Candidato é menor que a raiz, insiro ele a esquerda */
- }
- else
- {
- if (x.nome > p->Item.nome)
- {
- Insere_Candidato(x, p->Dir); /* se meu Candidato é maior que a raiz, insiro ele a Direita */
- }
- else
- {
- printf("Candidato ja existe \n"); /* se ele ja estiver na arvore, informo que ele ja existe */
- printf("------------------------\n");
- }
- }
- }
- }
- void Insere_Votos(Arvore_Votos x, Nos_Arv_Votos &p) /*Função para realizar a votação */
- {
- if (p == NULL) /* Se o apontador é nulo, ou seja arvore vazia */
- {
- p = (Nos_Votos *)calloc(1, sizeof(Nos_Votos)); /* aloco dinamicamente o tamanho do apontador do Voto */
- p->Item = x; /* Inserindo Voto na raiz. Como apontador começa com nulo, cai aqui e é inserido*/
- p->Esq = NULL; /* Folha a esuqerda fica com NULL */
- p->Dir = NULL; /* Folha a direita fica com NULL. Nela será salvo o candidato escolhido*/
- }
- /* Quando o apontador não é nulo, ou seja eu ja tenho um Voto em minha árvore */
- else
- {
- if ((strcmp(x.nome, p->Item.nome) < 0))
- {
- Insere_Votos(x, p->Esq); /* Todos os candidatos irão ser salvo a esquerda da arvore */
- p->Item.votos = 0;
- }
- }
- }
- /* 3 - FUNÇÕES DE EXIBIÇÃO DAS ARVORES */
- void Imprime_Eleitor(Nos_Arvore_Eleitores &p)
- {
- if (p != NULL)
- {
- Imprime_Eleitor(p->Esq);
- printf("|%s| ", p->Item.eleitor);
- Imprime_Eleitor(p->Dir);
- }
- }
- void Imprime_Candidato(Nos_Arv_Candidato &p)
- {
- if (p != NULL)
- {
- Imprime_Candidato(p->Esq);
- printf("|%s| ", p->Item.nome);
- Imprime_Candidato(p->Dir);
- }
- }
- void Imprime_Votos(Nos_Arv_Votos &p)
- {
- if (p != NULL)
- {
- Imprime_Votos(p->Esq);
- printf("|%s| ", p->Item.nome);
- Imprime_Votos(p->Dir);
- }
- }
- /* 4 - FUNÇÃO DE APAGAR ELEITOR */
- void TrocaMaior(Nos_Arvore_Eleitores r, Nos_Arvore_Eleitores &q)
- {
- Nos_Arvore_Eleitores aux;
- if (q->Dir == NULL)
- {
- strcpy(r->Item.eleitor, q->Item.eleitor);
- aux = q;
- q = q->Esq;
- free(aux);
- }
- else
- TrocaMaior(r, q->Dir);
- }
- void Apaga_Eleitor(Nos_Arvore_Eleitores &p, Arvore_Eleitor x)
- {
- Nos_Arvore_Eleitores aux;
- /* Se minha arvore esta vazia ou cheguei ao final */
- if (p == NULL)
- {
- printf("O Eleitor não foi encontrado para ser removido");
- }
- /* apagar elementos de um nó com so um filho */
- else if (strcmp(x.eleitor, p->Item.eleitor) < 0) /* Comparo as string. Se o retorono for menor que zero,, caminho pela esquerda */
- {
- Apaga_Eleitor(p->Esq, x);
- }
- else if ((strcmp(x.eleitor, p->Item.eleitor) > 0)) //* Comparo as string. Se o retorono for maior que zero,, caminho pela direita */
- {
- Apaga_Eleitor(p->Dir, x);
- }
- else if (p->Esq == NULL)
- {
- aux = p;
- p = p->Dir;
- free(aux);
- printf("Eleitor apagado com sucesso !");
- }
- else if (p->Dir == NULL)
- {
- aux = p;
- p = p->Esq;
- }
- else
- {
- TrocaMaior(p, p->Esq);
- }
- }
- void Pesquisar_Eleitor(Arvore_Eleitor x, Nos_Arvore_Eleitores p)
- {
- /* Se o apontado esa apontando para NULL , minha arvore esta vazia ou cheguei ao final */
- if (p == NULL)
- {
- ;
- printf("\n------------------------\n");
- printf("Eleitor nao econtrado");
- printf("\n------------------------\n");
- }
- /* Se o apontador tiver algum elemento, e este for menor que a raiz , caminho para a esquerda
- e chamo novamente a função para pesquisa */
- else if (strcmp(x.eleitor, p->Item.eleitor) < 0) /* Comparo as string. Se o retorono for menor que zero,, caminho pela esquerda */
- {
- Pesquisar_Eleitor(x, p->Esq);
- }
- /* Se o apontador tiver algum elemento, e este for maior que a raiz , caminho para a direita
- e chamo novamente a função para pesquisa */
- else if ((strcmp(x.eleitor, p->Item.eleitor) > 0)) /* Comparo as string. Se o retorono for maior que zero,, caminho pela direita */
- {
- Pesquisar_Eleitor(x, p->Dir);
- }
- else
- {
- printf("------------------------\n");
- printf("Eleitor encontrado ! \n");
- printf("------------------------\n");
- encontrado_e++;
- }
- }
- void Pesquisa_Candidato(Arvore_Candidatos x, Nos_Arv_Candidato p)
- {
- /* Se o apontado esa apontando para NULL , minha arvore esta vazia ou cheguei ao final */
- if (p == NULL)
- {
- printf("\n------------------------\n");
- printf("Candidato nao econtrado");
- printf("\n------------------------\n");
- }
- /* Se o apontador tiver algum elemento, e este for menor que a raiz , caminho para a esquerda
- e chamo novamente a função para pesquisa */
- else if (strcmp(x.nome, p->Item.nome) < 0) /* Comparo as string. Se o retorono for menor que zero,, caminho pela esquerda */
- {
- Pesquisa_Candidato(x, p->Esq);
- }
- /* Se o apontador tiver algum elemento, e este for maior que a raiz , caminho para a direita
- e chamo novamente a função para pesquisa */
- else if ((strcmp(x.nome, p->Item.nome) > 0)) /* Comparo as string. Se o retorono for maior que zero,, caminho pela direita */
- {
- Pesquisa_Candidato(x, p->Dir);
- }
- else
- {
- printf("------------------------\n");
- printf("Candadidato encontrado ! \n");
- printf("------------------------\n");
- encontrado_c++;
- }
- }
- /* FUNÇÕES ADICIONAIS - FUNÇÕES QUE NÃO ENVOLVE MANIPUÇÃO EM ÁRVORES, USADAS PARA TRABALHAR COM A URNA*/
- char *converta_maiuscula(char *str) /* Função para converter string para maiusculas */
- {
- char *p = (char *)str;
- while (*p)
- {
- *p = toupper(*p);
- p++;
- }
- return str;
- }
- void BarraCarrega() /* Essa função cria uma barra de loading com cerquilhas (#) */
- {
- char espacos[80];
- char Cerquilha[80];
- for (int i = 0; i <= 100; i++)
- {
- int qtdcerquilha = (i * 60) / 100;
- int qtdespaco = 60 - qtdcerquilha;
- memset(Cerquilha, '#', qtdcerquilha);
- Cerquilha[qtdcerquilha] = '\0';
- memset(espacos, ' ', qtdespaco);
- espacos[qtdespaco] = '\0';
- fprintf(stderr, "\r|%s%s| %3d%%", Cerquilha, espacos, i);
- usleep(20000);
- }
- usleep(200000);
- putchar('\n');
- }
- void menu()
- {
- printf("\n MENU ");
- printf("\n------------------------------------\n");
- printf("0- Inicializar Sistemas De Votação \n");
- printf("1- Cadastrar Candidato \n");
- printf("2- Cadastrar Eleitor \n");
- printf("3- Apagar Eleitor \n");
- printf("4- Votar \n");
- printf("5- Resultados Parciais \n");
- printf("6- Listar Eleitores Cadastrados \n"); /* OBS: alterado apenas para testes, nome original Listar Titulos que votaram */
- printf("7- Menor Titulo que votou \n");
- printf("8- Maior Titulo que votou \n");
- printf("9- Encerrar votação \n");
- printf("10-Resultados Finais \n");
- printf("11-Encerrar programa \n");
- printf("\n------------------------------------\n");
- printf("-> ");
- scanf("%d", &opcao);
- }
- int main()
- {
- Nos_Arvore_Eleitores No_Eleitor; /* Chamada dos nós da arvore de Eleitores */
- Nos_Arv_Candidato No_Candidato; /* Chamada dos nós da arvore de Candidatos */
- Nos_Arv_Votos No_Voto; /* Chamada dos nós da arvore de Votos */
- Nos_Arv_Voto_Valido No_Voto_Valido; /* Chamada dos nós da arvore de votos validos */
- Arvore_Eleitor Arv_Eleitor; /* Chamada da arvore de eleitores */
- Arvore_Candidatos Arv_Candidato; /* Chamada da arvore de candidatos */
- Arvore_Votos Arv_Voto; /* Chamada da arvore de Votos */
- Arvore_Eleitor_Voto Arv_Voto_Valido; /* Chamada da arvore de Votos Validos */
- while (opcao != 11)
- {
- menu();
- if (opcao == 0)
- {
- Iniciar_Arv_Eleitor(No_Eleitor);
- Iniciar_Arv_Candidato(No_Candidato);
- Iniciar_Arv_Voto(No_Voto);
- Iniciar_Arv_Voto_Valido(No_Voto_Valido);
- strcpy(Arv_Candidato.nome, "BRANCO");
- printf("Arvore inicializada com sucesso");
- /* Bruno utiliza o Linux e o João o Windows, usamos comandos universais nesse código, mas limpeza como cada sistema utiliza um, colocamos essa condição */
- #ifdef linux /* Detecta o sistema operacional usado e execulta o comando somente caso Linux seja detectado */
- system("clear"); /* Comando para limpar tela - Linux */
- #endif
- #ifdef WIN32 /* Se o sistema operacioonal for Windows */
- system("cls"); /* Comando de limpa tela do MSDOS */
- #endif
- printf("Inicializando os Sistemas de votação. Aguarde \n");
- printf("Iniciando árvores de eleitores \n");
- // BarraCarrega(); DESCOMENTE PARA ATIVAR A BARRA DE CARREGAMENTO
- printf("Árvore inicializada com sucesso ! \n");
- printf("Iniciando árvores de candidatos \n");
- // BarraCarrega();
- printf("Árvore inicializada com sucesso !\n");
- printf("Iniciando árvores de votação \n");
- // BarraCarrega();
- printf("Árvore inicializada com sucesso !\n");
- printf("-------------------------------------------------------------------\n");
- printf("\nTodos os sitemas iniciados com sucesso. Votação liberada !\n");
- valida = 1;
- usleep(1000000); /* Tempo para aguardar antes de exibir o menu, em microsegundos. 1 Segundo */
- }
- if (valida == 1)
- {
- if (opcao == 1)
- {
- if (encerrada == 0)
- {
- do
- {
- printf("Cadastrar Candidato Selecionado \n");
- printf("Digite o número do Candidato com 3 digitos seguido do nome em MAIUSCULO \n");
- printf("EXEMPLO : 000 CANDIDATO \n");
- printf("Nome e Numero do candidato: ");
- setbuf(stdin, NULL);
- fgets(Arv_Candidato.nome, sizeof(Arv_Candidato.nome), stdin);
- converta_maiuscula(Arv_Candidato.nome);
- Arv_Candidato.nome[strcspn(Arv_Candidato.nome, "\n")] = 0; // remove a nova linha do fgets
- printf("------------------------\n");
- Insere_Candidato(Arv_Candidato, No_Candidato);
- printf("Continuar o Cadastro ? \n");
- printf("1- Sim | 2- Não\n");
- printf("->");
- scanf("%d", &continua);
- } while (continua != 2);
- }
- }
- if (opcao == 2)
- {
- if (encerrada == 0) /* Se a eleição NÂO tiver sido encerrada */
- {
- do
- {
- printf("Cadastrar Eleitor Selecionado \n");
- printf("Digite o número do Titulo de Eleitor com 3 digitos seguido do nome em MAIUSCULO \n");
- printf("EXEMPLO : 000 ELEITOR \n");
- printf("Nome e titulo do eleitor: ");
- setbuf(stdin, NULL);
- fgets(Arv_Eleitor.eleitor, sizeof(Arv_Eleitor.eleitor), stdin);
- converta_maiuscula(Arv_Eleitor.eleitor);
- Arv_Eleitor.eleitor[strcspn(Arv_Eleitor.eleitor, "\n")] = 0; // remove a nova linha do fgets
- printf("------------------------\n");
- Insere_Eleitor(Arv_Eleitor, No_Eleitor);
- printf("Continuar o Cadastro ? \n");
- printf("1- Sim | 2- Não\n");
- printf("->");
- scanf("%d", &continua);
- } while (continua != 2);
- }
- }
- if (opcao == 3)
- {
- if (encerrada == 0)
- {
- do
- {
- printf("Apagar Eleitor selecionado \n");
- printf("Digite o numero do eleitor seguido do nome \n ");
- printf("EXEMPLO : 000 ELEITOR \n");
- printf("->");
- setbuf(stdin, NULL);
- fgets(Arv_Eleitor.eleitor, sizeof(Arv_Eleitor.eleitor), stdin);
- converta_maiuscula(Arv_Eleitor.eleitor);
- Arv_Eleitor.eleitor[strcspn(Arv_Eleitor.eleitor, "\n")] = 0;
- Apaga_Eleitor(No_Eleitor, Arv_Eleitor);
- printf("Apagar outro Eleitor ? \n");
- printf("1- Sim | 2- Não\n");
- printf("->");
- setbuf(stdin, NULL);
- scanf("%d", &continua);
- } while (continua != 2);
- }
- }
- if (opcao == 4)
- {
- int certeza; /* Se tem certeza que deseja anular o voto */
- int certeza_b; /* Se tem certeza que deseja votar em branco */
- if (encerrada == 0) /* Se eleição NÂO tiver sido finalizada */
- {
- printf("VOTE COM CONSCIENCIA !\n");
- printf("Digite o número do titulo de eleitor com 3 digitos seguido do nome em MAIUSCULO \n");
- printf("->");
- setbuf(stdin, NULL);
- fgets(Arv_Eleitor.eleitor, sizeof(Arv_Eleitor.eleitor), stdin);
- converta_maiuscula(Arv_Eleitor.eleitor);
- Arv_Eleitor.eleitor[strcspn(Arv_Eleitor.eleitor, "\n")] = 0;
- Pesquisar_Eleitor(Arv_Eleitor, No_Eleitor);
- if (encontrado_e == 0) /* Se não encontrei o eleitor */
- {
- printf("ERRO: Eleitor não está cadastrado para realizar votações. Cadastre-o e tente novamente");
- }
- else /* Se for encontrado o eleitor */
- {
- printf("Digite agora o número do candidato com 3 digitos seguido do nome em MAIUSCULO \n");
- printf("Digite BRANCO para votar em branco \n");
- printf("->");
- setbuf(stdin, NULL);
- fgets(Arv_Candidato.nome, sizeof(Arv_Candidato.nome), stdin);
- converta_maiuscula(Arv_Candidato.nome); /* Converto para maiuscula o nome digitado pelo usuario */
- Arv_Candidato.nome[strcspn(Arv_Candidato.nome, "\n")] = 0; /* Remover o \n do fgets */
- Pesquisa_Candidato(Arv_Candidato, No_Candidato);
- if (strcmp(Arv_Candidato.nome, "BRANCO") == 0) /* Se o usuario digitou BRANCO */
- {
- printf("TEM CERTEZA QUE DESEJA VOTAR EM BRANCO ?\n");
- printf("1-Sim| 2- Não \n");
- printf("->");
- scanf("%d", &certeza_b);
- if (certeza_b == 1)
- {
- printf("Votado em branco com sucesso!");
- branco++;
- }
- else
- {
- printf("OK. Voltando ao menu pricinpal \n");
- }
- }
- else if (encontrado_c == 0)
- {
- printf("ATENÇÃO : O CANDIDATO NÃO FOI ENCONTRADO. TEM CERTEZA QUE DESEJA VOTAR NULO ? \n");
- printf("1-Sim | 2- Não \n");
- printf("->");
- scanf("%d", &certeza);
- if (certeza == 1)
- {
- printf("Votado anulado com sucesso!");
- nulo++;
- }
- else
- {
- printf("OK. Voltando ao menu principal \n");
- }
- }
- else if (encontrado_c == 1)
- {
- printf("Voto confirmado! \n");
- Arv_Voto.votos++;
- Insere_Votos(Arv_Voto, No_Voto);
- }
- }
- }
- }
- if (opcao == 6)
- {
- printf("Exibindo Eleitores Cadastrados: \n");
- Imprime_Eleitor(No_Eleitor);
- printf("\nCandidatos Cadastrados \n");
- Imprime_Candidato(No_Candidato);
- printf("Exbindo votos \n");
- }
- if (opcao == 12)
- {
- printf("Busca selecionada \n");
- printf("Digite um numero que deseja procurar: ");
- setbuf(stdin, NULL);
- fgets(Arv_Eleitor.eleitor, sizeof(Arv_Eleitor.eleitor), stdin);
- Arv_Eleitor.eleitor[strcspn(Arv_Eleitor.eleitor, "\n")] = 0;
- Pesquisar_Eleitor(Arv_Eleitor, No_Eleitor);
- menu();
- }
- }
- if (opcao == 13)
- {
- printf("Programa finalizado. ");
- exit(0);
- }
- else
- {
- if (!valida)
- {
- printf("ERRO \n");
- printf("É necessário inicializar os sistemas de votação primeiro! \n");
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement