Computer Science 202
Introduction to Programming

Fall 2013, The College of Saint Rose

MassPikeTollsBetter BlueJ Project

Click here to download a BlueJ project for MassPikeTollsBetter.


MassPikeTollsBetter Source Code

The Java source code for MassPikeTollsBetter is below. Click on a file name to download it.


MassPikeTollsBetter.java

/*
 * Example MassPikeTollsBetter: program to determine whether a vehicle will
 * pay a toll on a given segment of the ticket-controlled portion of 
 * the Massachusetts Turnpike.  Before the "Big Dig", there were tolls
 * for all vehicles along the entire road, but western Mass. was exempted
 * from car tolls.  The ticket-controlled portion extends from Exit 1 in 
 * Stockbridge to Exit 15 at I-95 outside of Boston.  Trucks always pay
 * tolls, but cars pay tolls only on the part between exits 6 and 15.
 * Given an entry interchange, and exit interchange, and a vehicle type
 * (motorcycle, car, or truck), determine whether there will be a toll
 * on the entire distance travelled, part of the distance travelled, or
 * if there will be no toll.
 *
 * This version includes loops to ensure that valid inputs are given
 * rather than just exiting.
 * 
 * Note: we pretend interchange 10A for MA 146 does not exist, so we can
 * use int values to hold interchange numbers.
 *
 * Note 2: we also ignore the fact that the Mass Pike reinstated car
 * tolls on the western portion in 2013.  Oh well.
 *
 * Jim Teresco, The College of Saint Rose, CSC 202, Fall 2012
 * Updated for Fall 2013
 *
 * $Id: MassPikeTollsBetter.java 2229 2013-10-24 16:52:50Z terescoj $
 */

import javax.swing.JOptionPane;

public class MassPikeTollsBetter {

    public static void main(String[] args) {

        // we start out by gathering the information we need as inputs
        String input;

        // get the entry interchange
        // we start by setting an intentionally invalid value for the 
        // entryInterchange to make sure we get into the loop once
        int entryInterchange = 0;

        while (entryInterchange < 1 || entryInterchange > 15) {
            input = JOptionPane.showInputDialog("At what interchange did you enter the Mass Pike (1-15)?");
            entryInterchange = Integer.parseInt(input);

            // make sure it's valid
            if (entryInterchange < 1 || entryInterchange > 15) {
                JOptionPane.showMessageDialog(null, "Entry interchange must be in the range 1-15!", 
                    "Error", JOptionPane.ERROR_MESSAGE);
            }
        }

        // get the exit interchange
        int exitInterchange = 0;

        while (exitInterchange < 1 || exitInterchange > 15 || entryInterchange == exitInterchange) {
            input = JOptionPane.showInputDialog("At what interchange did you exit the Mass Pike (1-15)?");
            exitInterchange = Integer.parseInt(input);

            // make sure this one is valid as well
            if (exitInterchange < 1 || exitInterchange > 15) {
                JOptionPane.showMessageDialog(null, "Exit interchange must be in the range 1-15!", 
                    "Error", JOptionPane.ERROR_MESSAGE);
            }

            // one more check on the input: no one should be allowed to enter
            // and exit at the same interchange
            if (entryInterchange == exitInterchange) {
                JOptionPane.showMessageDialog(null, "Entry interchange and exit interchange must be different\n(No U Turns!)", 
                    "Error", JOptionPane.ERROR_MESSAGE);
            }
        }

        // loop-based error checking is a bit more complex here -- so we set a boolean
        // variable to false to start, and only set it to true when we get a valid 
        // input
        boolean goodResponse = false;

        // we also need to declare isTruck before we get into the loop, since a declaration
        // inside the loop will result in the scope being limited to the loop body
        boolean isTruck = false;
        
        while (!goodResponse) {
            input = JOptionPane.showInputDialog("Were you in a motorcycle, a car, or a truck?");

            // now make sure we got a valid response and set a boolean variable to true
            // only if it was a truck.
            if (input.equals("truck")) {
                isTruck = true;
                goodResponse = true;
            }
            else if (input.equals("car")) {
                isTruck = false;
                goodResponse = true;
            }
            else if (input.equals("motorcycle")) {
                isTruck = false;
                goodResponse = true;
            }
            else {
                JOptionPane.showMessageDialog(null, "Invalid vehicle type!", 
                    "Error", JOptionPane.ERROR_MESSAGE);
            }
        }

        // now we report on whether there is a toll based on this input
        if (isTruck || ((entryInterchange >= 6) && (exitInterchange >= 6))) {
            JOptionPane.showMessageDialog(null, "You paid a toll on the entire trip...");
        }
        else if ((entryInterchange <= 6) && (exitInterchange <= 6)) {
            JOptionPane.showMessageDialog(null, "No tolls for you in western Mass!");
        }
        else {
            JOptionPane.showMessageDialog(null, "You paid a toll, but only for travels east of Exit 6");
        }
    }
}