Ao iniciar este projeto, você concorda com as diretrizes do Código de Ética e Conduta e do Manual da Pessoa Estudante da Trybe.
Você já usa o GitHub diariamente para desenvolver os exercícios, certo? Agora, para desenvolver o desafio, você deverá seguir as instruções a seguir. Fique atento a cada passo, e se tiver qualquer dúvida, nos envie por Slack! #vqv 🚀
Aqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu desafio a partir deste repositório, utilizando uma branch específica e um Pull Request para colocar seus códigos.
Esse projeto tem como intuito te treinar para ter mais familiaridade com a documentação de aplicações, por tanto, poderão haver alguns comandos ou atributos que não estão no curso, mas que devem ser descritos no decorrer dos requisitos.
Nesses casos, é importante se atentar a aquilo que o requisito pede, e lembrar sempre de utilizar a documentação oficial do Java para pesquisar detalhes sobre comandos.
Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub sempre que precisar!
- Clone o repositório
- Por exemplo:
git clone [email protected]:tryber/desafio-aceleracao.git
- Entre no diretório do repositório que você acabou de clonar:
- neste caso
cd desafio-aceleracao
- neste caso
-
Instale as dependências:
mvn install
-
Crie uma branch a partir da branch
main
- Verifique que você está na branch
main
- Exemplo:
git branch
- Exemplo:
- Se não estiver, mude para a branch
main
- Exemplo:
git checkout main
- Exemplo:
- Agora, crie uma branch onde você vai guardar os commits do seu desafio
- Você deve criar uma branch no seguinte formato:
nome-de-usuario-nome-do-desafio
- Exemplo:
git checkout -b joaozinho-acc-java-sample
- Você deve criar uma branch no seguinte formato:
- Adicione a sua branch com o novo
commit
ao repositório remoto
- Usando o exemplo anterior:
git push -u origin joaozinho-acc-java-sample
- Crie um novo
Pull Request
(PR)
- Vá até a aba de Pull Requests deste repositório no GitHub
- Clique no botão verde "New pull request"
- Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
- Clique no botão verde "Create pull request"
- Adicione uma descrição para o Pull Request e clique no botão verde "Create pull request"
- Não se preocupe em preencher mais nada por enquanto!
- Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado
-
⚠ PULL REQUESTS COM ISSUES NO CHECKSTYLE NÃO SERÃO AVALIADAS, ATENTE-SE PARA RESOLVÊ-LAS ANTES DE FINALIZAR O DESENVOLVIMENTO! ⚠
-
Faça
commits
das alterações que você fizer no código regularmente -
Lembre-se de sempre após um (ou alguns)
commits
atualizar o repositório remoto -
Os comandos que você utilizará com mais frequência são:
git status
(para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)git add
(para adicionar arquivos ao stage do Git)git commit
(para criar um commit com os arquivos que estão no stage do Git)git push -u origin nome-da-branch
(para enviar o commit para o repositório remoto na primeira vez que fizer opush
de uma nova branch)git push
(para enviar o commit para o repositório remoto após o passo anterior)
Para "entregar" seu projeto, siga os passos a seguir:
- Vá até a página DO SEU Pull Request, adicione a label de "code-review" e marque seus colegas
- No menu à direita, clique no link "Labels" e escolha a label code-review
- No menu à direita, clique no link "Assignees" e escolha o seu usuário
- No menu à direita, clique no link "Reviewers" e digite
students
, selecione o timetryber/students-sd-0x
Se ainda houver alguma dúvida sobre como entregar seu projeto, aqui tem um video explicativo.
Por conta de seus conhecimentos em Java, você recebeu uma demanda para desenvolver um sistema de votação eletrônico. A ideia é que esse sistema permita o cadastro das pessoas candidatas, o cadastro das pessoas eleitoras, a realização do processo de votação e a consulta do resultado tanto parcial quanto final da votação.
O fluxo do sistema é definido seguindo três etapas principais que devem ser executadas na seguinte ordem:
-
Cadastrar pessoas candidatas: nessa etapa, é preciso ter um menu para o cadastro de pessoas candidatas e, ao fim do cadastro de cada nova pessoa, deve-se oferecer a opção de cadastrar outra. Quando não houver mais pessoas candidatas para serem cadastradas, então se passa para a etapa de cadastro de pessoas eleitoras;
-
Cadastrar pessoas eleitoras: aqui é preciso ter um menu que possibilite o cadastro de pessoas eleitoras, similar ao menu do cadastro de pessoas candidatas. Finalizado o cadastro, deve-se voltar ao estado inicial do menu de cadastro de pessoas eleitoras para oferecer a oportunidade de cadastrar uma nova pessoa. Quando não houver mais pessoas eleitoras para serem cadastradas, o sistema deve seguir para a etapa de votação;
-
Iniciar processo votação: nessa etapa é iniciado o processo de votação, em que foi solicitado, na demanda, um menu que ofereça as opções de
votar
,ver resultado parcial
efinalizar a votação
. A seguir o detalhamento de cada caminho:
- Quando escolhida a opção
votar
, solicita-se o identificador da pessoa eleitora (por exemplo, o CPF) e o número da pessoa candidata em quem se deseja votar. Depois do voto, o menu deve voltar ao estado inicial, oferecendo as opçõesvotar
,ver resultado parcial
efinalizar a votação
. - A opção
ver resultado parcial
deve listar todos os nomes das pessoas candidatas, mostrando a quantidade de votos absolutos recebida por cada pessoa candidata e o percentual de votos entre elas. Depois de ver o resultado parcial, o menu deve voltar ao estado inicial, oferecendo as opçõesvotar
,ver resultado parcial
efinalizar a votação
. - A opção
finalizar a votação
deve mostrar o resultado da votação listando as pessoas candidatas, o número absoluto de votos por pessoa candidata e também o percentual dos votos totais que cada pessoa candidata recebeu. Com o fechamento do processo de votação, o programa deve ser finalizado.
A imagem a seguir representa o fluxo do sistema de forma gráfica.
Esse sistema deve ter cinco classes: Principal
, GerenciamentoVotacao
, Pessoa
, PessoaCandidata
e PessoaEleitora
. Cada uma delas é descrita a seguir:
Principal
: essa classe deve conter o métodomain
, que por sua vez deve conter (I) uma instância da classeGerenciamentoVotacao
, (II) uma instância da classeScanner
para poder ler as entradas da pessoa usuária pelo console e (III) três laços de repetição que representam menus da aplicação. O primeiro laço deve conter o menu para o cadastro de pessoas candidatas, o segundo deve conter o menu para o cadastro de pessoas eleitoras, e o terceiro, o menu para votar, ver o resultado parcial e finalizar a votação.- O menu do primeiro laço deve ter o formato:
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
Se a pessoa usuária entrar com o valor 1 (que indica que ela quer cadastrar uma pessoa candidata), a mensagem Entre com o nome da pessoa candidata:
deverá ser impressa no console. Em seguida, depois de inserir o nome da pessoa candidata e pressionar enter, aparecerá a mensagem Entre com o número da pessoa candidata:
no console. Depois que a pessoa usuária inserir o número da pessoa candidata, o sistema deverá retornar ao estado inicial do menu. Supondo que o nome da primeira pessoa candidata seja "Maria" e o seu número para votar seja "1", então um exemplo do conteúdo do console depois de cadastrar a primeira pessoa candidata será:
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa candidata:
Maria
Entre com o número da pessoa candidata:
1
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
Esse ciclo se repete até não haver mais pessoas candidatas para serem cadastradas. Quando isso acontencer, a pessoa usuária entrará com a opção 2 do menu, o que vai parar o primeiro laço. O segundo laço, que representa a etapa de cadastro de pessoas eleitoras, deve ser iniciado logo na sequência.
short
para armazenar a opção inserida pela pessoa usuária, já que é um valor númerico de pequena escala. 🔴
- O menu do segundo laço deve ter o formato:
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
Se a pessoa usuária entrar com o valor 1 (que indica que ela quer cadastrar uma pessoa eleitora), então a mensagem Entre com o nome da pessoa eleitora:
será impressa no console. Em seguida, depois de inserir o nome da pessoa eleitora e pressionar enter, aparecerá no console a mensagem Entre com o cpf da pessoa eleitora:
. Depois que a pessoa usuária inserir o CPF da pessoa eleitora, o sistema deve retornar ao estado inicial do menu. Supondo que o nome da primeira pessoa eleitora seja Joao, portador do CPF 978.413.510-89, um exemplo do conteúdo do console depois de cadastrá-la será:
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa eleitora:
João
Entre com o cpf da pessoa eleitora:
978.413.510-89
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
Esse ciclo se repete até o esgotamento das pessoas eleitoras a serem cadastradas. Ao final desse cadastro, a pessoa usuária entrará com a opção 2 do menu, o que vai parar o segundo laço e iniciar o terceiro, marcando o início da votação.
- O menu do terceiro laço deve ter o seguinte formato:
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
Se a pessoa usuária entrar com o valor 1 (que indica que ela quer computar um voto), a mensagem Entre com o cpf da pessoa eleitora:
deverá ser impressa no console. Em seguida, depois de inserir o CPF da pessoa eleitora e pressionar enter, aparecerá a mensagem Entre com o número da pessoa candidata:
no console. Feito isso, o voto deve ser computado, e o sistema retorna ao estado inicial do menu. Supondo que o CPF da primeira pessoa eleitora seja 978.413.510-89, e o número da pessoa candidata seja 1, então um exemplo do conteúdo do console depois de realizar um voto será:
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
1
Entre com o cpf da pessoa eleitora:
978.413.510-89
Entre com o número da pessoa candidata:
1
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
Por outro lado, se a pessoa usuária entrar com o valor 2 (que indica que ela quer visualizar o resultado parcial), deve ser impresso no console o resultado parcial. Supondo que temos apenas a pessoa candidata Maria e a pessoa eleitora João, e que João votou em Maria, um exemplo do conteúdo do console depois de escolher a opção 2 (Resultado Parcial) será:
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
2
Nome: Maria - 1 votos ( 100.0% )
Total de votos: 1
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
Esse ciclo se repete até que a pessoa usuária escolha a opção 3 (Finalizar Votação). Quando a opção 3 for escolhida, o terceiro laço deve ser terminado, imprimindo o resultado da votação, de forma similar ao resultado parcial, seguida da finalização do programa.
Supondo que temos apenas a pessoa candidata Maria e a pessoa eleitora João, e que João votou em Maria, um exemplo do conteúdo do console depois de selecionada a opção 3 (Finalizar Votação) será:
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
3
Nome: Maria - 1 votos ( 100.0% )
Total de votos: 1
A figura a seguir evidencia os laços de repetição:
-
GerenciamentoVotacao
: essa classe é responsável por gerenciar a votação e o cadastro de pessoas candidatas e pessoas eleitoras. A classePrincipal
deve instanciar um objeto da classeGerenciamentoVotacao
para lidar com todo o processo de votação e cadastro. Ela terá quatro atributos privados: -
pessoasCandidatas
: esse atributo é um array dinâmico de objetos da classePessoaCandidata
e, para facilitar sua manipulação, ele deve ser uma instância da classeArrayList
. Para mais informações, você pode consultar o site da [W3Schools]](https://www.w3schools.com/java/java_arraylist.asp), ou JavaPoint, ou ainda verificar a documentação da Oracle. Esse array é responsável por manter em uma lista as pessoas candidatas cadastradas, ou seja, os objetos instanciados da classePessoaCandidata
. -
pessoasEleitoras
: esse atributo é um array dinâmico de objetos da classePessoaEleitora
e, para facilitar sua manipulação, ele deve ser uma instância da classeArrayList
. Para mais informações, você pode consultar o site da [W3Schools]](https://www.w3schools.com/java/java_arraylist.asp), ou JavaPoint, ou ainda verificar a documentação da Oracle. Esse array é responsável por manter em uma lista as pessoas eleitoras cadastradas, ou seja, os objetos instanciados da classePessoaEleitora
. -
cpfComputado
: esse atributo é um array dinâmico de Strings e, para facilitar sua manipulação, ele deve ser uma instância da classeArrayList
. Para mais informações, você pode consultar o site da [W3Schools]](https://www.w3schools.com/java/java_arraylist.asp), ou JavaPoint, ou ainda verificar a documentação da Oracle. Esse array é responsável por manter os CPFs das pessoas eleitoras que já votaram em uma lista de Strings, de forma que possamos verificar se a pessoa eleitora já votou. Lembre-se de que cada pessoa eleitora só pode votar uma única vez. -
totalVotos
: esse atributo do tipo inteiro é responsável por contar a quantidade de votos que foram realizados, de forma que possa ser usado ao final para computar o percentual de votos recebidos por cada pessoa candidata e também para mostrar a quantidade total de votos já computados.Essa classe também deve conter pelo menos cinco métodos, em que quatro são públicos e um privado. Eles são:
-
cadastrarPessoaCandidata
: esse método público deve receber dois parâmetros: onome
e onumero
da pessoa candidata. O parâmetronome
é do tipo String e o parâmetronumero
é do tipo inteiro. Esse método deve verificar se o número da pessoa candidata já está cadastrado e, caso esteja, deve imprimir a mensagemNúmero pessoa candidata já utilizado!
no console. Caso contrário, deve instanciar um objeto da classePessoaCandidata
passando os parâmetrosnome
enumero
para o construtor da classePessoaCandidata
. Por fim, adicione esse novo objeto instanciado no arraypessoasCandidatas
(Dica: utilize o método.add
da classeArrayList
). Esse método deve ter o retorno do tipovoid
. -
cadastrarPessoaEleitora
: esse método público deve receber dois parâmetros do tipo String: onome
e ocpf
da pessoa eleitora. Esse método deve verificar se o CPF da pessoa eleitora já está cadastrado e, caso esteja, deve imprimir a mensagemPessoa eleitora já cadastrada!
no console. Caso contrário, deve instanciar um objeto da classePessoaEleitora
passando os parâmetrosnome
ecpf
para o construtor da classePessoaEleitora
. Por fim, adicione esse novo objeto instanciado no arraypessoasEleitoras
(Dica: utilize o método.add
da classeArrayList
). Esse método deve ter o retorno do tipovoid
. -
votar
: esse método público deve receber dois parâmetros: ocpfPessoaEleitora
e onumeroPessoaCandidata
. O parâmetrocpfPessoaEleitora
é do tipo String, e o parâmetronumeroPessoaCandidata
do tipo inteiro. Esse método deve verificar se o CPF da pessoa eleitora já está inserido no arraycpfComputado
e, caso esteja, deve imprimir a mensagemPessoa eleitora já votou!
no console. Caso contrário, deve percorrer o arraypessoasCandidatas
para encontrar o objeto da pessoa candidata que tenha o número passado pelo parâmetronumeroPessoaCandidata
. Quando encontrar o objeto que representa a pessoa candidata, deverá chamar o métodoreceberVoto
do objeto da classePessoaCandidata
. Por fim, deve inserir o CPF da pessoa eleitora no arraycpfComputado
, de forma que essa pessoa eleitora não possa votar novamente (Dica: utilize o método.add
da classeArrayList
). Esse método deve ter o retorno do tipovoid
. -
mostrarResultado
: esse método público é responsável por imprimir no console o resultado da eleição, seja parcial ou final. Ele tem o retorno do tipovoid
e não recebe nenhum parâmetro. Esse método, primeiramente, deve verificar se já existe algum voto computado e, caso não, imprime a mensagemÉ preciso ter pelo menos um voto para mostrar o resultado.
no console. Caso já tenha votos computados, ele deve imprimir no console os nomes das pessoas candidatas com a quantidade de votos que elas receberam e o percentual de votos recebidos, bem como o total de votos computados.Suponha que temos duas pessoas candidatas: Maria e José. Maria recebeu 2 votos e José recebeu 1 voto. Veja como deve ser essa saída:
Nome: Maria - 2 votos ( 67.0% )
Nome: José - 1 votos ( 33.0% )
Total de votos: 3
-
calcularPorcentagemVotos
: esse método privado serve para uso exclusivo dessa classe. Ele é utilizado para auxiliar no cálculo da porcentagem dos votos. Ele tem o retorno do tipodouble
e recebe um parâmetro. Esse parâmetro é um inteiro que representa o índice do objeto da classePessoaCandidata
no arraypessoasCandidatas
, de forma que se possa recuperar o número de votos recebidos por essa pessoa e dividir esse valor pelo total de votos computados que está armazenado no atributototalVotos
. Como o atributototalVotos
e o número de votos da pessoa candidata são do tipo inteiro, deve-se converter esses valores no tipofloat
oudouble
. Para arredondar o valor para uma casa decimal, utilize o método estáticoround
da classeMath
do Java. -
Pessoa
: essa classe abstrata possui apenas o atributo protegidonome
do tipo String. Ela tem também as assinaturas do métodoGetter
eSetter
para obrigar que a pessoa desenvolvedora faça a sua implementação nas classes herdeiras. -
PessoaCandidata
: essa classe herda da classePessoa
, ficando responsável por representar a pessoa candidata. Ela também é composta por dois atributos privados e do tipo inteiro,numero
evotos
, sendo o atributonome
herdado da classePessoa
. Seu construtor recebe dois parâmetros, onome
e onumero
, e os armazena nos respectivos atributos. O método construtor também inicializa o atributovotos
com o valor zero. Essa classe é formada pelos métodosGetter
s eSetter
s dos atributosnome
,numero
evotos
, contendo também um métodoreceberVoto
que adiciona 1 ao atributo voto toda vez que é chamado.
Resumindo, a classe PessoaCandidata
é formada por:
-
nome
: atributo herdado da classePessoa
; -
numero
: atributo do tipo inteiro que armazena o número identificador para voto; -
votos
: atributo do tipo inteiro que armazena o número de votos recebidos pela pessoa candidata.
Os métodos dessa classe são:
-
getNome
: métodoGetter
para o atributonome
; -
setNome
: métodoSetter
para o atributonome
; -
getNumero
: métodoGetter
para o atributonumero
; -
setNumero
: métodoSetter
para o atributonumero
; -
getVotos
: métodoGetter
para o atributovotos
; -
setVotos
: métodoSetter
para o atributovotos
; -
receberVoto
: método responsável por adicionar 1 ao atributovotos
para representar a quantidade de votos recebidos pela pessoa candidata, esse método tem retorno do tipovoid
.
Note que todos os métodos da classe em questão são públicos.
PessoaEleitora
: essa classe herda da classePessoa
, ficando responsável por representar a pessoa eleitora. Ela também é composta por um atributo privado do tipo String,cpf
e o atributonome
é herdado da classePessoa
. Seu construtor recebe dois parâmetros, onome
e ocpf
, armazenando-os nos respectivos atributos. Essa classe também é formada pelos métodosGetter
s eSetter
s dos atributosnome
ecpf
.
Resumindo, a classe PessoaEleitora
é formada por:
-
nome
: atributo herdado da classePessoa
; -
cpf
: atributo do tipo String que armazena o CPF da pessoa eleitora;
Os métodos dessa classe são:
-
getNome
: métodoGetter
para o atributonome
; -
setNome
: métodoSetter
para o atributonome
; -
getCpf
: métodoGetter
para o atributocpf
; -
setCpf
: métodoSetter
para o atributocpf
;
Note que todos os métodos dessa classe são públicos.
- Pessoa candidata só pode ser cadastrada uma vez.
- Pessoa eleitora só pode ser cadastrada uma vez.
- Nome da pessoa candidata e eleitora só pode ser o primeiro nome para facilitar o uso da classe
Scanner
do Java. - Pessoa eleitora só pode votar uma vez.
Aqui tempos um exemplo do funcionamento desse sistema, considerando a saída completa do console. Nesse exemplo, temos duas pessoas candidatas, Maria e José, e três pessoas eleitoras, João, Rute e Raquel. Supondo que João e Rute votaram em Maria e que Raquel votou em José, teremos a seguinte saída:
----------- Bem-vindo ao Sistema de Votação -----------
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa candidata:
Maria
Entre com o número da pessoa candidata:
1
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa candidata:
José
Entre com o número da pessoa candidata:
2
Cadastrar pessoa candidata?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
2
----------- Cadastre as pessoas eleitoras -----------
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa eleitora:
João
Entre com o cpf da pessoa eleitora:
154.118.560-94
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa eleitora:
Rute
Entre com o cpf da pessoa eleitora:
589.292.640-00
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
1
Entre com o nome da pessoa eleitora:
Raquel
Entre com o cpf da pessoa eleitora:
023.476.580-18
Cadastrar pessoa eleitora?
1 - Sim
2 - Não
Entre com o número correspondente à opção desejada:
2
----------- Votação iniciada! -----------
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
1
Entre com o cpf da pessoa eleitora:
154.118.560-94
Entre com o número da pessoa candidata:
1
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
1
Entre com o cpf da pessoa eleitora:
589.292.640-00
Entre com o número da pessoa candidata:
1
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
1
Entre com o cpf da pessoa eleitora:
023.476.580-18
Entre com o número da pessoa candidata:
2
Entre com o número correspondente à opção desejada:
1 - Votar
2 - Resultado Parcial
3 - Finalizar Votação
3
Nome: Maria - 2 votos ( 67.0% )
Nome: José - 1 votos ( 33.0% )
Total de votos: 3
Ao finalizar e submeter o desafio, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!
Link: Formulário
O avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, não se assuste se isso acontecer, ok?