Skola.java:
package stipendium;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Skola
{
private static final int POCET_PREDMETU = 10;
private static final String ODDELOVAC_ZNAMEK_REGEXP = "[\\s]+"; // bile znaky, http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html
public static void main(String[] args)
{
zpracujSoubor();
}
public static int getPocetPredmetu()
{
return POCET_PREDMETU;
}
private static void zpracujSoubor()
{
System.out.println("\nZpracovani studijnich vysledku\n");
Scanner scanner = null;
LineNumberReader reader = null;
BufferedWriter writer = null;
try
{
scanner = new Scanner(System.in);
// vstupni soubor
String nazevVstupnihoSouboru = null;
boolean vstupnihoSouborNalezen = false;
while (!vstupnihoSouborNalezen)
{
System.out.print("Zadejte nazev vstupniho souboru: ");
nazevVstupnihoSouboru = scanner.nextLine();
try
{
reader = new LineNumberReader(new BufferedReader(new FileReader(nazevVstupnihoSouboru)));
vstupnihoSouborNalezen = true;
}
catch (FileNotFoundException e)
{
System.out.println("Nemohu najit vstupni soubor '" + nazevVstupnihoSouboru + "'\n");
}
}
// vytupni soubor
boolean vytupniSouborOveren = false;
while (!vytupniSouborOveren)
{
System.out.print("\nZadejte nazev vystupniho souboru: ");
String nazevVytupnihoSouboru = scanner.nextLine();
File vytupniSoubor = new File(nazevVytupnihoSouboru);
try
{
if (vytupniSoubor.exists())
{
String prepsat = null;
while (!("Y".equalsIgnoreCase(prepsat) || "N".equalsIgnoreCase(prepsat)))
{
System.out.print("\nSoubor '" + nazevVytupnihoSouboru + "' jiz existuje. Prepsat? (Y/N): ");
prepsat = scanner.nextLine();
}
if ("N".equalsIgnoreCase(prepsat))
{
continue;
}
}
else
{
vytupniSoubor.createNewFile();
}
writer = new BufferedWriter(new PrintWriter(vytupniSoubor));
vytupniSouborOveren = true;
}
catch (IOException e)
{
System.out.println("Nemohu vytvorit vystupni soubor '" + nazevVytupnihoSouboru + "'\n");
}
}
// vlastni zpracovani
String prvniRadek = null;
String[] radky = null;
try
{
while ((prvniRadek = reader.readLine()) != null)
{
radky = new String[] {prvniRadek, reader.readLine(), reader.readLine(), reader.readLine()};
Student student = nactiStudenta(radky);
if (student.getStipendium() > 0)
{
writer.write(asString(student));
writer.newLine();
}
}
}
catch (IllegalArgumentException e)
{
System.out.println("\nChyba pri zpracovani vstupniho souboru '" + nazevVstupnihoSouboru + "' (pocet zpracovanych radku je " + reader.getLineNumber() + "): " + e.getMessage());
int zbytek = reader.getLineNumber() % radky.length;
int pocetChybejicichRadku = (zbytek == 0) ? 0 : (radky.length - zbytek);
if (pocetChybejicichRadku != 0)
{
System.out.println("Soubor '" + nazevVstupnihoSouboru + "' nema odpovidajici pocet radku - chybi " + pocetChybejicichRadku + " radku u studenta cislo " + prvniRadek);
}
System.exit(-1);
}
catch (Exception e)
{
System.out.println("\nChyba pri zpracovani vstupniho souboru '" + nazevVstupnihoSouboru + "' na radku " + reader.getLineNumber() + ": " + e);
System.exit(-1);
}
}
finally
{
try
{
scanner.close();
}
catch (Exception e)
{}
try
{
reader.close();
}
catch (Exception e)
{}
try
{
writer.close();
}
catch (Exception e)
{}
}
System.out.println("\nZpracovani studijnich vysledku uspesne dokonceno");
}
private static Student nactiStudenta(String[] radky)
{
long studentskeCislo;
try
{
studentskeCislo = Long.parseLong(radky[0]);
}
catch (NumberFormatException e)
{
throw new IllegalArgumentException("Neplatne studentske cislo: '" + radky[0] + "'");
}
String jmeno = radky[1];
if ((jmeno == null) || (jmeno.trim().equals("")))
{
throw new IllegalArgumentException("Neplatne prazdne jmeno studenta: '" + jmeno + "'");
}
String prijmeni = radky[2];
if ((prijmeni == null) || (prijmeni.trim().equals("")))
{
throw new IllegalArgumentException("Neplatne prazdne prijmeni studenta: '" + prijmeni + "'");
}
String radekZnamek = radky[3];
if ((radekZnamek == null) || (radekZnamek.trim().equals("")))
{
throw new IllegalArgumentException("Neplatny prazdny radek se znamkami studenta: '" + radekZnamek + "'");
}
List<Hodnoceni> znamky = new ArrayList<Hodnoceni>(getPocetPredmetu());
for (String z : radekZnamek.trim().split(ODDELOVAC_ZNAMEK_REGEXP))
{
int znamka;
try
{
znamka = Integer.parseInt(z);
}
catch (NumberFormatException e)
{
throw new IllegalArgumentException("Neplatna znamka studenta: '" + z + "'");
}
Hodnoceni hodnoceni = Hodnoceni.forInt(znamka);
if (hodnoceni == null)
{
throw new IllegalArgumentException("Neplatna znamka studenta: '" + z + "'");
}
znamky.add(hodnoceni);
}
Student student = new Student(jmeno, prijmeni, studentskeCislo);
student.setZnamky(znamky);
return student;
}
private static String asString(Student student)
{
return student.getJmeno() + " " + student.getPrijmeni() + " " + student.getStudentskeCislo() + " " + student.getStipendium();
}
}
Student.java:
package stipendium;
import java.math.BigDecimal;
import java.util.List;
public class Student
{
private static final double PRUMER_NEURCEN = 0;
private static final int PRUMER__POCET_DESETINNYCH_MIST = 2;
private static int pocetPredmetu = Skola.getPocetPredmetu();
private String jmeno;
private String prijmeni;
private long studentskeCislo;
private List<Hodnoceni> znamky;
private double prumer;
public Student(String jmeno, String prijmeni, long studentskeCislo)
{
this.jmeno = jmeno;
this.prijmeni = prijmeni;
this.studentskeCislo = studentskeCislo;
prumer = PRUMER_NEURCEN;
}
public String getJmeno()
{
return jmeno;
}
public String getPrijmeni()
{
return prijmeni;
}
public long getStudentskeCislo()
{
return studentskeCislo;
}
public void setZnamky(List<Hodnoceni> znamky)
{
this.znamky = znamky;
prumer = spoctiPrumer();
}
public double getPrumer()
{
return prumer;
}
public boolean maVsechnyZkousky()
{
return ((znamky != null) && (znamky.size() >= pocetPredmetu) && !znamky.contains(null) && !znamky.contains(Hodnoceni.NEVYHOVEL));
}
public int getStipendium()
{
return ((prumer == PRUMER_NEURCEN) || !maVsechnyZkousky()) ? Stipendium.BEZ_STIPENDIA.mesicniVyseStipendia : Stipendium.getStipendium(prumer).mesicniVyseStipendia;
}
private double spoctiPrumer()
{
if ((znamky == null) || znamky.isEmpty())
{
return PRUMER_NEURCEN;
}
int soucet = 0;
for (Hodnoceni hodnoceni : znamky)
{
soucet += hodnoceni.znamka;
}
return zaokrouhleni(((double) soucet / znamky.size())); // pretypovani na je nutne!
}
private static double zaokrouhleni(double prumer)
{
return (new BigDecimal(prumer)).setScale(PRUMER__POCET_DESETINNYCH_MIST, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
Hodnoceni.java:
package stipendium;
public enum Hodnoceni
{
VYBORNE(1), VELMI_DOBRE(2), DOBRE(3), NEVYHOVEL(4);
public final int znamka;
Hodnoceni(int znamka)
{
this.znamka = znamka;
}
public static Hodnoceni forInt(int znamka)
{
for (Hodnoceni hodnoceni : Hodnoceni.values())
{
if (hodnoceni.znamka == znamka)
{
return hodnoceni;
}
}
return null;
}
}
Stipendium.java:
package stipendium;
public enum Stipendium
{
STIPENDIUM_5000(0, 1, 5000),
STIPENDIUM_3000(1, 1.2, 3000),
STIPENDIUM_2000(1.2, 1.5, 2000),
STIPENDIUM_1000(1.5, 1.8, 1000),
BEZ_STIPENDIA(1.8, Double.MAX_VALUE, 0);
public final double prumerOd;
public final double prumerDo;
public final int mesicniVyseStipendia;
private Stipendium(double prumerOd, double prumerDo, int mesicniVyseStipendia)
{
this.prumerOd = prumerOd;
this.prumerDo = prumerDo;
this.mesicniVyseStipendia = mesicniVyseStipendia;
}
public static Stipendium getStipendium(double prumer)
{
for (Stipendium stipendium : Stipendium.values())
{
if ((stipendium.prumerOd < prumer) && (prumer <= stipendium.prumerDo))
{
return stipendium;
}
}
return BEZ_STIPENDIA;
}
}