/* title: BicycleRace.java description: Software to handle the information management requirements for the race managers... output: http://paepcke.net/BicycleRace_output.html Note: Kavan and I began development together and then branched off */ import java.io.*; class BicycleRace { private static RaceManager Roster = new RaceManager(); private static FileWriter HTMLFile; // For HTML generation public static final long secsInHr = 3600; // Simplify time conversions later public static final long secsInMin = 60; public static void main(String[] arg) { String Cmd; for( ; ; ) { System.out.println("\nRacing Manager\n"); Menu(); System.out.print("\nHow Would You Like To Proceed? "); Cmd = Input.line(); if (Cmd.equals("q")) break; else if(Cmd.equals("a")) addRacer(); else if(Cmd.equals("v")) viewRacer(); else if(Cmd.equals("s")) startTime(); else if(Cmd.equals("f")) finishTime(); else if(Cmd.equals("l")) showRacer(); else if(Cmd.equals("g")) htmlGen(); } } public static void Menu(){ //Menu items will call methods System.out.println("Add Racers... (a)dd"); //in this class, which in turn System.out.println("Enter Start Time... (s)tart"); //talk to RaceManager (array) System.out.println("Enter Finish Time...(f)inish"); //and RacerData (object) System.out.println("Lookup Racer... (l)ookup"); System.out.println("View All Racers... (v)iew"); System.out.println("Generate Report... (g)enerate"); System.out.println("Leave Program... (q)uit"); } public static String grabIdentification() { System.out.print("Enter Name or ID: "); return (Input.line()); } public static void addRacer() { String Name, Home, cmd; System.out.println("Enter the Racers Information Below."); System.out.print("Enter Racer's Name: "); //Add method runs infinitely until "s" Name = Input.line(); System.out.print("Enter Contestant's Hometown: "); Home = Input.line(); Roster.Add(Name, Home); for ( ; ; ){ System.out.print("Enter next racer or (s)top: "); cmd = Input.line(); if(cmd.equals("s")) break; else { Name = cmd; System.out.print("Enter Contestant's Hometown: "); Home = Input.line(); Roster.Add(Name, Home); } } } public static void viewRacer() { System.out.println("ViewRacer was called"); Roster.showroster(); } public static void showRacer() { System.out.println("showRacer was called"); RacerData theRacerObj = lookupRacer(); if(theRacerObj == null) System.out.println("This racer was not found"); else theRacerObj.showRacer(); } public static RacerData lookupRacer() { //Allows user to enter either ID RacerData theRacerObj; //or name without having to specify String tmpID = grabIdentification(); //shared by startTime() & finishTime() if(Character.isLetter(tmpID.charAt(0))) theRacerObj = Roster.getRacerByName(tmpID); else { int tmpNum = Integer.parseInt(tmpID); theRacerObj = Roster.getRacerByID(tmpNum); } return theRacerObj; } public static void startTime() { RacerData tmpRacerObj = lookupRacer(); if(tmpRacerObj == null) System.out.println("This racer was not found"); else { tmpRacerObj.setStartTime(inputTime("start")); System.out.println("New start time set successfullly"); } } public static void finishTime() { RacerData tmpRacerObj = lookupRacer(); if(tmpRacerObj == null) System.out.println("This racer was not found"); else { tmpRacerObj.setFinishTime(inputTime("finish")); System.out.println("New finish time set successfullly"); } } public static long inputTime(String prompt) { //Receives time in hour/min/sec //converts to seconds before return int hrs, mins, secs; System.out.print("Enter " + prompt + " time hour: "); hrs = Input.integer(); System.out.print("Enter " + prompt + " time minute: "); mins = Input.integer(); System.out.print("Enter " + prompt + " time second: "); secs = Input.integer(); return(makeSecs(hrs, mins, secs)); } public static long makeSecs(int hrs, int mins, int secs) { return(hrs * secsInHr + mins * secsInMin + secs); } // #### Begin HTML Generation methods #### //Calls several methods in RacerData //in order to obtain data public static void htmlGen() { //Will run in for() to write out 's String winnerInfo; String loserInfo; Roster.findWinnerAndLoser(); if (Roster.getWinner() == null) winnerInfo = ""; else winnerInfo = Roster.getWinner().getName(); if (Roster.getLoser() == null) loserInfo = ""; else loserInfo = Roster.getLoser().getName(); openOutputFile("c:\\GoGonzo_Report.htm"); RacerData racerTmp = null; writelnFile(""); writelnFile("GoGonzo Racing Report\n"); writelnFile(""); writelnFile(""); writelnFile("\n\n\n\n"); for( int i = 0 ; i < Roster.getcurrSize() ; i++) { racerTmp = Roster.getRacerByID(i); writelnFile(""); writelnFile(" "); writelnFile(" "); writelnFile(" "); writelnFile(" "); writelnFile(" "); writelnFile(""); } writelnFile("
NameHomeStartFinishElapsed
" + racerTmp.getName() + "" + racerTmp.getHome() + "" + racerTmp.getStartTime() + "" + racerTmp.getFinishTime() + "" + racerTmp.getElapsedTime() + "

"); writelnFile("The fastest bicyclist is: " + winnerInfo + "

"); writelnFile("The slowest bicyclist is: " + loserInfo + " :-("); writelnFile(""); closeOutputFile(); try { Runtime.getRuntime().exec("c:\\program files\\internet explorer\\iexplore.exe file://c:\\GoGonzo_Report.htm"); } catch(IOException e) { System.err.println(e); System.out.println("GoGonzo was unable to located your Internet Explorer\nOpen file manually"); } System.out.println("Report is in GoGonzo_Report.htm"); //Just launched IE } public static void openOutputFile(String filename) { try { HTMLFile = new FileWriter(filename); } catch(IOException e) { System.err.println(e); } } public static void writelnFile(String text) { //IO methods try { HTMLFile.write(text + "\n"); } catch(IOException e) { System.err.println(e); } } public static void closeOutputFile() { try { HTMLFile.close(); } catch(IOException e) { System.err.println(e); } } // #### End HTML Generation methods #### } // End of BicycleRace class class RaceManager { private int maxSize = 25; //Total number of objects allowed private int currSize = 0; //Total number in the list so far private static RacerData[] RacerArray; //An array of objects private static RacerData winner = null; private static RacerData loser = null; public RaceManager(){ RacerArray = new RacerData[maxSize]; for (int i=0; i loser.getRaceTimeInSec()) loser = racerTmp; else if (hisTime < winner.getRaceTimeInSec()) winner = racerTmp; } } public RacerData getRacerByID(int ID){ if(ID < currSize) return(RacerArray[ID]); else return(null); } } //End class RaceManager class RacerData { private String theName, theHome; private long theStartTime = 0; private long theFinishTime = 0; public RacerData(String Name, String Home) { theName = Name; theHome = Home; } public void showRacer(){ //Responsible for the (v) command System.out.print("Name: " + theName + ", "); System.out.print("Home: " + theHome + ", "); System.out.print("Start: " + toString(theStartTime) + ", "); System.out.println("Finish: " + toString(theFinishTime)); } public String getName(){ return(theName); } //Pass around more values public String getHome(){ return(theHome); } public String getStartTime() { return(toString(theStartTime)); } public String getFinishTime(){ return(toString(theFinishTime)); } public String getElapsedTime(){ return(toString(getRaceTimeInSec())); } public long getRaceTimeInSec() { //Differentiates between entered if ((theFinishTime - theStartTime) <= 0) //and missing times return 0; else if (theFinishTime == 0) return 0; else if (theStartTime == 0) return 0; else return(theFinishTime - theStartTime); } public String toString(long time) { //Translate seconds to readable double hrs; //format - Used in (g) and (v) double minutes; //Returns "n/a" if nonexistant double seconds; if (time == 0) return("n/a"); else { hrs = Math.floor((double) time/BicycleRace.secsInHr); time = time - (long) hrs * BicycleRace.secsInHr; minutes = Math.floor((double) time/BicycleRace.secsInMin); time = time - (long) minutes * BicycleRace.secsInMin; seconds = (double) time; return((int)hrs + ":" + (int)minutes + ":" + (int)seconds); } } public void setStartTime(long startTime){ //Enter start & finish times into Obj. theStartTime = startTime; } public void setFinishTime(long finishTime){ theFinishTime = finishTime; } }