Skoytelop.java [Last ned]

import static java.lang.System.*;
import java.lang.Double;
import java.lang.Integer;
import java.util.*;
import java.io.*;
 
/*
 *  Hovedklasse for registrering av skøytetider.
 *
 *  Resultatene blir lagret på en fast tekstfil og blir
 *  registrert i to omganger (etter dag 1 og etter dag 2).
 *
 *  Hvis datafilen er tom, så blir programmet kjørt for dag 1,
 *  dvs. at nr, navn og tider for 500 og 5000 skal registreres.
 *  Etter dag 2 skal data for dag 1 først leses inn fra fil, 
 *  og tider for 1500 og 10000 legges til.
 *
 *  Etter dag 2 blir navn på vinnere skrevet ut, sammen med
 *  navn, tider og poengsum for alle deltagere.
 *  
 */
public class Skoytelop {
 
  // Skilletegn ved lagring til fil
  private static String SKILLETEGN = ";";
 
  // Navn på tekstfil der resultatene blir lagret.
  private static String FILNAVN = "skoytelop.txt";
 
  // Referansetabell for å ta vare på deltagere.
  private static Deltager[] løperTab;
 
  // Settes til true hvis datafilen er tom.
  private static boolean dag1;
 
 
  public static void main(String[] args) throws Exception {
    lesInnFraFil();
    lesInnResultat();
    skrivTilFil();
 
    if (!dag1) {
      double best = bestePoengsum();
      visResultater(best);
    }
  }
 
  private static void lesInnFraFil() throws Exception {
 
    // Inndatastrøm åpnes
    File fil = new File(FILNAVN);
    Scanner leser = new Scanner(fil);
 
    // Første linje på filen inneholder antall deltagere.
    // Hvis filen er tom, leses antall deltagere inn fra bruker.
    int antall;
    if (leser.hasNextLine()) {
      antall = Integer.parseInt(leser.nextLine());
      dag1 = false;
    }
    else {
      antall = Dialog.lesInt("Antall deltagere:");
      dag1 = true;
    }
    løperTab = new Deltager[antall];
 
    // Les inn resultater for alle deltagere
    int pos = 0;
    while (leser.hasNextLine()) {
      String linje = leser.nextLine();
      String[] data = linje.split(SKILLETEGN);
      int nr = Integer.parseInt(data[0]);
      String navn = data[1];
      double tid5H = Double.parseDouble(data[2]);
      double tid5T = Double.parseDouble(data[3]);
      double tid15H = Double.parseDouble(data[4]); // Settes til 0.0 etter dag 1
      double tid10T = Double.parseDouble(data[5]); // Settes til 0.0 etter dag 1
      Deltager d = new Deltager(nr, navn, tid5H, tid5T, tid15H, tid10T);
      løperTab[pos] = d;
      pos++;
    }
 
    leser.close();
  }
 
  public static void skrivTilFil() throws Exception {
    PrintWriter skriver = new PrintWriter(FILNAVN);
 
    // Skriv antall deltagere på første linje
    int antall = løperTab.length;
    skriver.println(antall);
 
    // Skriv ut alle deltagere
    for (int nr=0; nr<antall; nr++) {
      Deltager d = løperTab[nr];
      String linje = d.getNr() + SKILLETEGN
        + d.getNavn() + SKILLETEGN
        + d.getTid5H() + SKILLETEGN
        + d.getTid5T() + SKILLETEGN
        + d.getTid15H() + SKILLETEGN
        + d.getTid10T();
      skriver.println(linje);
    }
 
    skriver.close();
  }
 
  private static void lesInnResultat() {
 
    if (dag1) {
      // Les inn nr, navn og tider for 500m og 5000m
      for (int nr=0; nr<løperTab.length; nr++) {
        løperTab[nr] = lesDeltagerDag1();
      }
    }
 
    else { 
      // Dag 2: Oppdater med tider for 1500m og 10000m
      for (int nr=0; nr<løperTab.length; nr++) {
        oppdaterDeltagerDag2(løperTab[nr]);
      }
    }
  }
 
  private static Deltager lesDeltagerDag1() {
    int nr       = Dialog.lesInt("Deltagernr:");
    String navn  = Dialog.lesString("Navn:");
    double tid5H = Dialog.lesDouble("Tid 500m:");
    double tid5T = Dialog.lesDouble("Tid 5000m:");
 
    // Opprett nytt Deltager-objekt.
    Deltager d = new Deltager(nr, navn, tid5H, tid5T);
 
    return d;
  }
 
  private static void oppdaterDeltagerDag2(Deltager d) {
    int dnr = d.getNr();
    double tid15H  = Dialog.lesDouble("Tid 1500m for deltager " + dnr + ":");
    double tid10T = Dialog.lesDouble("Tid 10000m for deltager " + dnr + ":");
 
    // Oppdater Deltager-objekt
    d.setTid15H(tid15H);
    d.setTid10T(tid10T);
  }
 
  private static double bestePoengsum() {
    double bestePoengsum = Double.MAX_VALUE;
 
    for (int nr=0; nr<løperTab.length; nr++) {
      // Ta vare på hvis ny beste poengsum
      if (løperTab[nr].poengsum() < bestePoengsum) {
        bestePoengsum = løperTab[nr].poengsum();
      }
    }
 
    return bestePoengsum;
  }
 
  private static void visResultater(double best) {
    String vinnere = "Vinnere:\n";
    for (int lnr=0; lnr<løperTab.length; lnr++) {
 
      // Skriv ut navn, tider og poengsum for alle
      out.println(løperTab[lnr].toString());
 
      // Ta vare på navn til de som har best poengsum
      if (løperTab[lnr].poengsum() == best) {
        vinnere += løperTab[lnr].getNavn() + " ";
      }
    }
 
    out.println(vinnere);
  }
 
}
Kildekode blir vist ved hjelp av GeSHi.