Advertisement
richarduie

Eggs.java

Oct 28th, 2013
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.18 KB | None | 0 0
  1. // need these to manage user input for order
  2. import java.util.InputMismatchException;
  3. import java.util.Scanner;
  4.  
  5. public class Eggs
  6. {
  7.     // boundary values for price break points by number of dozens
  8.     private static final int[] BOUNDS = {0, 4, 6, 11};
  9.     // per dozen prices corresponding to break points
  10.     private static final double[] PRICES = {.5, .45, .4, .35};
  11.  
  12.     // for reading order input
  13.     private static Scanner scan = new Scanner( System.in );
  14.    
  15.     public static void main( String[] args ) {
  16.         int order = readOrder();    // get number of eggs
  17.        
  18.         int dozens = order/12;      // compute whole dozens
  19.         int loose = order%12;       // compute loose eggs
  20.         // identify price per whole dozen of eggs
  21.         double pricePerDozen = getPricePerDozen( dozens );
  22.         // compute the price per egg of loose eggs rounded to the
  23.         // nearest whole cent
  24.         double pricePerEgg = Math.floor( .5 + 50 * pricePerDozen) / 100;
  25.  
  26.         // report facts about order
  27.         print( dozens, pricePerDozen, loose, pricePerEgg );
  28.     }
  29.    
  30.     // get number of eggs for order
  31.     private static int readOrder() {
  32.         int order = 0;  // set return into method-global scope
  33.         // read until valid input given
  34.         while (true) {
  35.             System.out.print(
  36.                 "How many eggs would you like to order" +
  37.                 " (must be a positive integer)?: "
  38.             );
  39.             try {
  40.                 order = scan.nextInt();
  41.                 if (0 < order ) break;
  42.                 System.out.println(
  43.                     "invalid value: " + order + "\n" +
  44.                     "input must be a positive integer"
  45.                 );
  46.             }
  47.             catch( InputMismatchException e ) {
  48.                 String sink = scan.next();
  49.                 System.out.println(
  50.                     "invalid value: " + sink + "\n" +
  51.                     "input must be a positive integer\n" +
  52.                     e.toString()
  53.                 );
  54.             }
  55.             System.out.println( "" );
  56.         }
  57.         return order;
  58.     }
  59.     // based on size of order, determine which price is due
  60.     private static double getPricePerDozen( int dozens ) {
  61.         // determine index position of correct price by
  62.         // comparing number of dozens ordered to price
  63.         // break point boundaries
  64.         int idx = 0;    // must be at least first index
  65.         int last = BOUNDS.length - 1;
  66.         // for each remaining break point boundary...
  67.         for (;idx < last; idx++) {
  68.             // if ordered number of dozens is less than
  69.             // next boundary, increment index
  70.             if (BOUNDS[ idx + 1 ] > dozens) break;
  71.         }
  72.         return PRICES[ idx ];
  73.     }
  74.     // report various aspects of order
  75.     private static void print(
  76.         int dozens, double pricePerDozen, int loose, double pricePerEgg
  77.     ) {
  78.         System.out.println(
  79.             "The total price for an order of " +
  80.             (12 * dozens + loose) + " eggs is " +
  81.             getDollars(pricePerDozen * dozens + pricePerEgg * loose) + ".\n" +
  82.             "That's " + getDollars( pricePerDozen ) + " per dozen for the " +
  83.             dozens + " full dozen" + ((1 < dozens) ? "s":"") +
  84.             " and " + getDollars( pricePerEgg ) + ((1 < loose) ? " (each)":"") +
  85.             " for the " + loose + " loose egg" + ((1 < loose) ? "s":"") +"."
  86.         );
  87.     }
  88.     // convert value to decimal format String with dollar sign -
  89.     // values are rounded to nearest whole cent
  90.     protected static final String getDollars( double d ) {
  91.         String sd = "" + (int) Math.floor( .5 + 100 * d );
  92.         return "$" + sd.substring( 0, sd.length() - 2) +
  93.             "." + sd.substring( sd.length() - 2);
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement