/* * CoffeePriceCalculator3.java * * Computer Science S-111 * * A structured solution to the coffee-price problem. * It uses procedural decomposition to capture the structure of * the program and to reduce code duplication. It also factors out * code common to both types of drinks. * * See CoffeePriceCalculator1.java for the original unstructured version. * See CoffeePriceCalculator2.java for an unstructured version that * factors out some code that was repeated in the main if-else-if * statement. */ import java.util.*; public class CoffeePriceCalculator3 { /* Class constants */ public static final double TAX_RATE = 0.0625; // sales tax public static final int BREWED = 1; // These two make the main public static final int LATTE = 2; // method more readable. /* * getChoice - uses the Scanner passed in as a parameter * to determine the user's choice for type of drink. * Returns the number of the choice. */ public static int getChoice(Scanner console) { System.out.println("What type of drink would you like?"); System.out.println(" 1) brewed coffee"); System.out.println(" 2) latte"); System.out.print("Enter your choice (1-2): "); int choice = console.nextInt(); return choice; } /* * getSize - uses the Scanner passed in as a parameter * to determine the size of drink that the user wants. * Returns the String that the user enters. */ public static String getSize(Scanner console) { System.out.print("What size (tiny, medio, gigundo)? "); String size = console.next(); return size; } /* * brewedPrice - uses the Scanner passed in as a parameter * to determine the size and thereby the price of a brewed coffee. * Returns the price. */ public static double brewedPrice(Scanner console) { String size = getSize(console); if (size.equals("tiny")) { return 1.60; } else if (size.equals("medio")) { return 1.80; } else { // must be gigundo return 2.00; } } /* * lattePrice - uses the Scanner passed in as a parameter * to determine the details (size & syrup) and thereby * the price of a latte. Returns the price. */ public static double lattePrice(Scanner console) { String size = getSize(console); double price; if (size.equals("tiny")) { price = 2.80; } else if (size.equals("medio")) { price = 3.20; } else { // must be gigundo price = 3.60; } System.out.print("Flavored syrup (yes or no)? "); String reply = console.next(); if (reply.equals("yes")) { price += 0.50; } return price; } /* * computeTax - uses the Scanner and price passed in as parameters * to determine and return the tax associated with the price */ public static double computeTax(Scanner console, double price) { System.out.print("Are you a student (yes or no)? "); String reply = console.next(); if (reply.equals("no")) { return price * TAX_RATE; } else { return 0.0; } } /* * printPrices - prints the prices (base price, tax, and * total price) based on the price and tax passed in as * parameters. */ public static void printPrices(double price, double tax) { System.out.println(); System.out.printf(" base price: $%.2f\n", price); System.out.printf(" tax: $%.2f\n", tax); System.out.printf("total price: $%.2f\n", price + tax); } public static void main(String[] args) { Scanner console = new Scanner(System.in); // only create this once! System.out.println("Welcome to Javabucks!"); System.out.println(); int choice = getChoice(console); double price = 0.0; if (choice == BREWED) { price = brewedPrice(console); } else if (choice == LATTE) { price = lattePrice(console); } double tax = computeTax(console, price); printPrices(price, tax); } }