Para a contabilização dos votos da eleição de representante de turma, foi gerado um arquivo
contendo apenas o código do candidato, a cada vez que este recebia um voto. Faça um programa em
JAVA que seja capaz de:
➢ ler o arquivo contendo os votos (votos.txt);
➢ contabilizar a quantidade de votos que cada candidato recebeu;
➢ exibir o percentual de votos de cada candidato;
➢ contabilizar os votos nulos e em branco;
➢ criar um relatório, em arquivo, contendo o nome do primeiro e do segundo colocado na
eleição, com a quantidade de seus respectivos votos.
Considere os seguintes códigos:
1 ? Zé
2 ? Creuza
3 ? Afrânio
0 ? Voto em Branco
Qualquer outro código caracteriza voto NULO
publicclassApuracao{/** * @param args the command line arguments */staticStringBuffermemoria=newStringBuffer();publicstaticvoidmain(String[]args){// TODO code application logic heretry{Stringarquivo=EscolherArquivo.caminho();BufferedReaderarqentrada;Stringlinha=null;arqentrada=newBufferedReader(newFileReader(arquivo));while((linha=arqentrada.readLine())!=null){StringTokenizerst=newStringTokenizer(linha,"*");while(st.hasMoreTokens()){System.out.println("Voto: "+st.nextToken());}}arqentrada.close();}catch(IOExceptione){System.out.println("Erro: "+e.toString());}}}
Mas não estou conseguindo manipular o conteúdo do arquivo de modo que possa contabilizar o total de votos.
Alguém sabe como me ajudar!?
Tente um linha.split("[*]"); no lugar de StringTokenizer, ele vai voltar um array de String, depois com cada elemento pode fazer um if (elemento.equals(“1”) contZé++; e assim vai um monte de ifs para todos.
É o método mais simples.
santosmm
Bruno Laturner:
Qual é o formato desse arquivo de votos?
Tente um linha.split("[*]"); no lugar de StringTokenizer, ele vai voltar um array de String, depois com cada elemento pode fazer um if (elemento.equals(“1”) contZé++; e assim vai um monte de ifs para todos.
É o método mais simples.
Muito Obrigado pela ajuda…mais ainda não funcionou!
Help me!
B
Bruno_Laturner
O que não funcionou? Como é o layout dos dados no arquivo? Esse EscolherArquivo obtém o caminho certinho? Já debugou o código? Pelo menos um System.out.println já ajudaria para saber o conteúdo das variáveis.
santosmm
Bruno segue as 2 classe que fiz.
Esta primeira é a EscolherArquivo
packageeleicao;importjava.io.File;importjavax.swing.JFileChooser;importjavax.swing.JOptionPane;/** * * @author santosmm */publicclassEscolherArquivo{publicstaticStringcaminho(){JFileChooserfileChooser=newJFileChooser();fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);intresult=fileChooser.showOpenDialog(null);if(result==JFileChooser.CANCEL_OPTION)returnnull;Filearquivo=fileChooser.getSelectedFile();if(arquivo==null||arquivo.getName().equals(""))JOptionPane.showMessageDialog(null,"Nome do arquivo inválido");elsereturnarquivo.getPath();returnnull;}}
*Tochangethistemplate,chooseTools|Templates*andopenthetemplateintheeditor.*/packageeleicao;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.StringTokenizer;importjavax.swing.JOptionPane;/** * * @author santosmm */publicclassApuracao{/** * @param args the command line arguments */staticStringBuffermemoria=newStringBuffer();publicstaticvoidmain(String[]args){// TODO code application logic heretry{Stringarquivo=EscolherArquivo.caminho();BufferedReaderarqentrada;Stringlinha=null;arqentrada=newBufferedReader(newFileReader(arquivo));while((linha=arqentrada.readLine())!=null){StringTokenizervoto=newStringTokenizer(linha,"*");while(voto.hasMoreTokens()){System.out.println("Voto: "+voto.nextToken());}}arqentrada.close();}catch(IOExceptione){System.out.println("Erro: "+e.toString());}}}
santosmm
Segue também o layout do arquivo .txt.
B
Bruno_Laturner
Não tem nenhum * no arquivo para você usar como separador… Se você não tem caracter separador, use uma string vazia “”.
santosmm
Bruno Laturner:
Não tem nenhum * no arquivo para você usar como separador... Se você não tem caracter separador, use uma string vazia "".
Veja se entendi bem....você esta propondo eu substituir o StringTokenizer por String correto?
Mas não estou conseguindo visualizar como ficaria o código....devo esta errando na lógica.
publicstaticvoidmain(String[]args){// TODO code application logic heretry{Stringarquivo=EscolherArquivo.caminho();BufferedReaderarqentrada;Stringlinha=null;arqentrada=newBufferedReader(newFileReader(arquivo));while((linha=arqentrada.readLine())!=null){StringTokenizervoto=newStringTokenizer(linha,"");while(voto.hasMoreTokens()){System.out.println("Voto: "+voto.nextToken());}}arqentrada.close();}catch(IOExceptione){System.out.println("Erro: "+e.toString());}}}
B
Bruno_Laturner
public static void main(String[] args) {
// TODO code application logic here
try {
String arquivo = EscolherArquivo.caminho();
BufferedReader arqentrada;
String linha = null;
arqentrada = new BufferedReader(new FileReader(arquivo));
while ((linha = arqentrada.readLine()) != null) {
String[] votos = linha.split("");
for (String voto: votos) {
System.out.println("Voto: " + voto);
}
}
arqentrada.close();
} catch (IOException e) {
System.out.println("Erro: " + e.toString());
}
}
}
santosmm
Show de bola cara!
Muito obrigado mesmo…agora vou tentar fazer os “IFS” para manipular o resultado…mais uma vez obrigado.
santosmm
Não consigo apresentar o número de votos.
Poderia me ajudar?
publicstaticvoidmain(String[]args){// TODO code application logic heretry{Stringarquivo=EscolherArquivo.caminho();BufferedReaderarqentrada;Stringlinha=null;intnumero=0;intcontZe=0;intcontCreuza=0;intcontAfranio=0;intcontVB=0;intcontOutros=0;arqentrada=newBufferedReader(newFileReader(arquivo));while((linha=arqentrada.readLine())!=null){numero=Integer.parseInt(linha);if(numero==1){contZe++;}elseif(numero==2){contCreuza++;}elseif(numero==3){contAfranio++;}elseif(numero==0){contVB++;}else{contOutros++;}}System.out.println("O número de votos de Zé é "+contZe);System.out.println("O número de votos de Creuza é "+contCreuza);System.out.println("O número de votos de Afrânio é "+contAfranio);System.out.println("O número de votos de em Branco é "+contVB);System.out.println("O número de votos nulos é "+contOutros);arqentrada.close();}catch(IOExceptione){System.out.println("Erro: "+e.toString());}}}
santosmm
O erro é o seguinte:
java.lang.NumberFormatException: For input string: “”
B
Bruno_Laturner
santosmm, você, novamente, ignorou o que eu postei da última vez.
Você tem uma linha no formato 012301230123012301230123, sendo que cada caracter dessa linha é um código para o candidato. O que você não está fazendo é pegar cada caracter, um de cada vez, e contar cada voto a partir deles. O javadoc da classe String explica todos os métodos que você precisa. Veja os métodos charAt, o split (que usei antes), ou o toCharArray, os três podem resolver o problema.
Obs: Não precisa transformar os códigos para int, comparação de char também funciona.
santosmm
Bruno muito obrigado mesmo cara, realmente fui negligente e faltou-me um pouquinho de lógica de programação.
Mas agora já esta funcionando....olha o código ai:
publicstaticvoidmain(String[]args){// TODO code application logic heretry{Stringarquivo=EscolherArquivo.caminho();BufferedReaderarqentrada;Stringlinha=null;//String numero =intcontZe=0;intcontCreuza=0;intcontAfranio=0;intcontVB=0;intcontOutros=0;arqentrada=newBufferedReader(newFileReader(arquivo));while((linha=arqentrada.readLine())!=null){// numero = Integer.parseInt(linha);if(linha.equals("1")){contZe++;}elseif(linha.equals("2")){contCreuza++;}elseif(linha.equals("3")){contAfranio++;}elseif(linha.equals("0")){contVB++;}else{contOutros++;}}System.out.println("O número de votos de Zé é "+contZe);System.out.println("O número de votos de Creuza é "+contCreuza);System.out.println("O número de votos de Afrânio é "+contAfranio);System.out.println("O número de votos de em Branco é "+contVB);System.out.println("O número de votos nulos é "+contOutros);arqentrada.close();}catch(IOExceptione){System.out.println("Erro: "+e.toString());}}}