Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // need these to manage user input for order
- import java.util.InputMismatchException;
- import java.util.Scanner;
- public class Eggs
- {
- // boundary values for price break points by number of dozens
- private static final int[] BOUNDS = {0, 4, 6, 11};
- // per dozen prices corresponding to break points
- private static final double[] PRICES = {.5, .45, .4, .35};
- // for reading order input
- private static Scanner scan = new Scanner( System.in );
- public static void main( String[] args ) {
- int order = readOrder(); // get number of eggs
- int dozens = order/12; // compute whole dozens
- int loose = order%12; // compute loose eggs
- // identify price per whole dozen of eggs
- double pricePerDozen = getPricePerDozen( dozens );
- // compute the price per egg of loose eggs rounded to the
- // nearest whole cent
- double pricePerEgg = Math.floor( .5 + 50 * pricePerDozen) / 100;
- // report facts about order
- print( dozens, pricePerDozen, loose, pricePerEgg );
- }
- // get number of eggs for order
- private static int readOrder() {
- int order = 0; // set return into method-global scope
- // read until valid input given
- while (true) {
- System.out.print(
- "How many eggs would you like to order" +
- " (must be a positive integer)?: "
- );
- try {
- order = scan.nextInt();
- if (0 < order ) break;
- System.out.println(
- "invalid value: " + order + "\n" +
- "input must be a positive integer"
- );
- }
- catch( InputMismatchException e ) {
- String sink = scan.next();
- System.out.println(
- "invalid value: " + sink + "\n" +
- "input must be a positive integer\n" +
- e.toString()
- );
- }
- System.out.println( "" );
- }
- return order;
- }
- // based on size of order, determine which price is due
- private static double getPricePerDozen( int dozens ) {
- // determine index position of correct price by
- // comparing number of dozens ordered to price
- // break point boundaries
- int idx = 0; // must be at least first index
- int last = BOUNDS.length - 1;
- // for each remaining break point boundary...
- for (;idx < last; idx++) {
- // if ordered number of dozens is less than
- // next boundary, increment index
- if (BOUNDS[ idx + 1 ] > dozens) break;
- }
- return PRICES[ idx ];
- }
- // report various aspects of order
- private static void print(
- int dozens, double pricePerDozen, int loose, double pricePerEgg
- ) {
- System.out.println(
- "The total price for an order of " +
- (12 * dozens + loose) + " eggs is " +
- getDollars(pricePerDozen * dozens + pricePerEgg * loose) + ".\n" +
- "That's " + getDollars( pricePerDozen ) + " per dozen for the " +
- dozens + " full dozen" + ((1 < dozens) ? "s":"") +
- " and " + getDollars( pricePerEgg ) + ((1 < loose) ? " (each)":"") +
- " for the " + loose + " loose egg" + ((1 < loose) ? "s":"") +"."
- );
- }
- // convert value to decimal format String with dollar sign -
- // values are rounded to nearest whole cent
- protected static final String getDollars( double d ) {
- String sd = "" + (int) Math.floor( .5 + 100 * d );
- return "$" + sd.substring( 0, sd.length() - 2) +
- "." + sd.substring( sd.length() - 2);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement