import java.io.*;
import java.util.*;
import es.*;
/**
* ListaTest Aplicación que genera los datos de un test a partir de un
* fichero de entrada y produce el resultado en un fichero de salida
*
* @author Fco Gutiérrez MAQUINA: propia
* @version 1.0 4/2/2001
*/
public class ListaTest
{
/**
* main Método principal de la aplicación
*
* @param args que debe incluri dos argumentos, fichero de entrada y
* fichero de salida
* @return
*/
public static void main(String [] args) {
// Mapa para guardar los alumnos ordenados por nombre
SortedMap alumnos = new TreeMap();
try
{
String fichero = args[0]; // fichero de entrada
String salida = args[1]; // fichero de salida
// Se genera el flujo de entrada
BufferedReader fr = new BufferedReader(new FileReader(fichero));
// y el flujo de salida
PrintWriter pw = new PrintWriter(new FileWriter(salida));
// Creamos un objeto Test desde el flujo de entrada
Test test = creaTest(fr);
// Leemos linea a linea.
String linea = fr.readLine();
while (linea!=null)
{
// Cada linea contiene los datos de un alumno
Alumno al = creaAlumno(linea);
// Se corrige su test
int puntos = al.corrige(test);
// Se almacena el nombre junto a su puntuacióon
alumnos.put(al.nombre(),new Integer(puntos));
linea = fr.readLine();
}
fr.close();
// Fin de entrada de datos
// Comeinza la salida de datos.
ES.newOutput(pw);
ES.writeString(" Nombre Alumno ",35,ES.LEFT);
ES.writeStringLn("Puntuación",15,ES.LEFT);
// Se construye un iterador sobre las entradas del mapa
Iterator it = alumnos.entrySet().iterator();
while (it.hasNext())
{
Map.Entry me = (Map.Entry)it.next();
ES.writeString((String)me.getKey(),35,ES.LEFT);
ES.writeIntLn(((Integer)me.getValue()).intValue(),5);
}
pw.close();
// Fin de salida
// Control de excepciones
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Error en uso: ListaTest entrada salida");
} catch (IOException e) {
System.out.println("Error de E/S: "+e.getMessage());
} catch (Exception e) {
System.err.println("Error en formato fichero: "+e.getMessage());
}
}
/**
* creaTest Recoge los datos del flujo de entrada y crea un objeto test
*
* @param fr El Flujo de lectura
* @return El Test generado.
*/
public static Test creaTest(BufferedReader fr) throws Exception {
// Valor de las acertadas
int vp = (new Integer(fr.readLine())).intValue();
// Valor de las falladas
int vn = (new Integer(fr.readLine())).intValue();
// Numero de modelos
int nm = (new Integer(fr.readLine())).intValue();
// Número de preguntas por modelo
int np = (new Integer(fr.readLine())).intValue();
// Se inicializa Test
Test.ValorPositivas(vp);
Test.ValorNegativas(vn);
// Se crea un objeto test
Test test = new Test(nm,np);
// Se completan las respuestas de cada modelo
for(int i=0;i<nm;i++) {
String modelo = fr.readLine();
test.respModelo(i+1,modelo);
}
return test;
}
/**
* creaAlumno Crea un alumno con la información dada en un String
*
* @param linea El String con la información del alumno
* numModelo:respuestas:nombre
* @return El alumno generado
*/
public static Alumno creaAlumno(String linea) {
StringTokenizer st = new StringTokenizer(linea,":");
// EL número de modelo
int nm = (new Integer(st.nextToken())).intValue();
// Las repsuestas
String md = st.nextToken();
// El nombre del alumno
String nb = st.nextToken();
return new Alumno(nb,nm,md);
}
}