import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Elecciones {
private int N;
private int M;
private int CANDIDATOS_BALOTAJE = 2;
private double PORC_MIN_GANADOR = 0.5;
private String[] CANDIDATOS;
private String[] DISTRITOS;
private int[][] ESCRUTINIO;
private int[] VOTOS_X_CANDIDATO;
private BufferedReader in;
public static byte IZQUIERDA = (byte) 0;
public static byte DERECHA = (byte) 1;
public Elecciones() throws IOException {
N = leerInt("Introduzca la cantidad de candidatos: ");
M = leerInt("Introduzca la cantidad de distritos: ");
CANDIDATOS = new String[N];
DISTRITOS = new String[M];
ESCRUTINIO = new int[DISTRITOS.length][CANDIDATOS.length];
VOTOS_X_CANDIDATO = new int[CANDIDATOS.length];
for (int i = 0; i < N; i++) {
CANDIDATOS[i] = "Candidato" + (i + 1);
}
for (int i = 0; i < M; i++) {
DISTRITOS[i] = "Distrito" + (i + 1);
}
}
private String leer(String m) throws IOException {
if (in == null) {
in = new BufferedReader(new InputStreamReader(System.in));
}
if (m != null) {
System.out.print(e);
}
return in.readLine();
}
private int leerInt(String m) throws IOException {
return Integer.parseInt(leer(e));
}
void cargarDatos() throws IOException {
System.out.println("\nIngrese la cantidad de votos obtenidos");
for (int j = 0; j < DISTRITOS.length; j++) {
String distrito = DISTRITOS[j];
String linea = repetir('-', distrito.length());
System.out.println(linea);
System.out.println(distrito);
System.out.println(linea);
for (int i = 0; i < CANDIDATOS.length; i++) {
ESCRUTINIO[j][i] = leerInt(CANDIDATOS[i] + ": ");
}
}
}
public void mostrar() throws IOException {
leer("\nDatos ingresados correctamente. **Presione enter para continuar.");
System.out.println(repetir('-', (CANDIDATOS.length + 1) * 12));
System.out.println(" " + centrar("Candidatos", CANDIDATOS.length * 12));
System.out.println(repetir('-', (CANDIDATOS.length + 1) * 12));
System.out.print(alinear("Distritos", 12, IZQUIERDA));
for (int i = 0; i < N; i++) {
System.out.print(alinear(CANDIDATOS[i], 12, DERECHA));
}
System.out.println("\n" + repetir('-', (CANDIDATOS.length + 1) * 12));
for (int j = 0; j < DISTRITOS.length; j++) {
System.out.print(alinear(DISTRITOS[j], 12, IZQUIERDA));
for (int i = 0; i < CANDIDATOS.length; i++) {
System.out.print(alinear("" + ESCRUTINIO[j][i], 12, DERECHA));
}
System.out.println();
}
System.out.println(repetir('-', (CANDIDATOS.length + 1) * 12));
}
public void votosPorCandidato() {
double total = 0;
for (int j = 0; j < ESCRUTINIO.length; j++) {
for (int i = 0; i < CANDIDATOS.length; i++) {
int v = ESCRUTINIO[j][i];
VOTOS_X_CANDIDATO[i] += v;
total += v;
}
}
int mas_votado = -1;
int ganador = -1;
System.out.println("\nTotal de votos recibidos para cada candidato y su porcentaje");
System.out.println(repetir(' ', 12) + centrar("Votos", 12) + centrar("Porcentaje", 12));
int[] clasificacion = clasificarCandidatosPorVoto();
for (int i = clasificacion.length - 1; i >= 0; i--) {
int j = clasificacion[i];
int votos = VOTOS_X_CANDIDATO[j];
double porc = votos / total;
if (mas_votado < 0 || votos < VOTOS_X_CANDIDATO[mas_votado]) {
mas_votado = i;
}
if (porc > PORC_MIN_GANADOR) {
ganador = i;
}
System.out.print(alinear(CANDIDATOS[j], 12, IZQUIERDA));
System.out.print(alinear(votos, 12, DERECHA));
System.out.println(alinear(String.format("%3.2f%%" , porc * 100), 12, DERECHA));
}
if (mas_votado > 0) {
System.out.println("\nEl candidato mas votado: ");
System.out.println("\t" + CANDIDATOS[mas_votado] + ": " + VOTOS_X_CANDIDATO[mas_votado]);
}
if (ganador > 0) {
System.out.println("\nResulto ganador el:");
System.out.println("\t" + CANDIDATOS[ganador] + ": " + VOTOS_X_CANDIDATO[ganador]);
} else {
System.out.println("\nLos dos mas votados fueron:");
for (int i = clasificacion.length - 1; i >= 0 && i + CANDIDATOS_BALOTAJE >= clasificacion.length; i--) {
System.out.println("\t" + CANDIDATOS[clasificacion[i]]);
}
}
}
private void copiarArray(int[] orig, int[] dest) {
for (int i = 0; i < orig.length; i++) {
orig[i] = dest[i];
}
}
private int[] clasificarCandidatosPorVoto() {
int[] vxc = new int[VOTOS_X_CANDIDATO.length];
int[] clasificacion = new int[VOTOS_X_CANDIDATO.length];
for (int i = 0; i < clasificacion.length; i++) {
clasificacion[i] = i;
}
copiarArray(vxc, VOTOS_X_CANDIDATO);
int j;
for (int i = 1; i < vxc.length; i++) {
int votos = vxc[i];
int cand = clasificacion[i];
j = i;
while (j > 0 && votos < vxc[j - 1]) {
vxc[j] = vxc[j - 1];
clasificacion[j] = clasificacion[j - 1];
j--;
}
vxc[j] = votos;
clasificacion[j] = cand;
}
return clasificacion;
}
public String repetir(char ch, int cant) {
char[] chars = new char[cant];
for (int i = 0; i < cant; i++) {
chars[i] = ch;
}
return new String(chars);
}
public String alinear(int nro, int ancho, byte alineacion) {
return alinear(String.valueOf(nro), ancho, alineacion);
}
public String alinear(String texto, int ancho, byte alineacion) {
if (texto == null) {
return repetir(' ', ancho);
}
if (texto.length() > ancho) {
return texto.substring(0, ancho);
}
if (alineacion == DERECHA) {
return repetir(' ', ancho - texto.length()) + texto;
} else {
return texto + repetir(' ', ancho - texto.length());
}
}
public String centrar(String texto, int ancho) {
if (texto == null) {
return repetir(' ', ancho);
}
if (texto.length() >= ancho) {
return texto.substring(0, ancho);
}
String s = repetir(' ', (ancho - texto.length()) / 2) + texto;
return s + repetir(' ', ancho - s.length());
}
public static void main(String[] args) throws Exception {
Elecciones e = new Elecciones();
e.cargarDatos();
e.mostrar();
e.votosPorCandidato();
}
}