Я обычно не в пользу выполнения заданий для студентов Тома Сойера, но в этом случае я думаю, что есть возможность получить образование для любого новичка, который учится смотреть на проблему по-разному.
Это простой класс, но неплохо разработать хорошие привычки, если вы хотите быть программистом.
Обращайте внимание на форматирование и читаемость кода. Подумайте, долго и упорно об именах для классов, методов и переменных. Вам нужно меньше комментариев, если имена не требуют пояснений.
Узнать и следовать Java coding standards. Это поможет читаемости.
Забудьте о вводе и выводе и пользовательском интерфейсе - сначала получите функциональность.
import java.util.LinkedHashMap;
import java.util.Map;
/**
* CoffeePriceCalculator
* User: mduffy
* Date: 7/22/2016
* Time: 7:46 AM
* @link http://stackoverflow.com/questions/38525213/simple-discount
*/
public class CoffeePriceCalculator {
// Is double a good way to represent money? What about units? Conversions?
public static final double DEFAULT_UNIT_PRICE = 3.75; // British pounds
private static final Map<Integer, Double> DISCOUNT_PERCENTAGE;
static {
DISCOUNT_PERCENTAGE = new LinkedHashMap<>();
DISCOUNT_PERCENTAGE.put(10, 0.05);
DISCOUNT_PERCENTAGE.put(20, 0.10);
}
public double calculatePrice(int numBags, double unitPrice) {
if (numBags < 0) throw new IllegalArgumentException("Number of bags must be positive");
if (unitPrice < 0.0) throw new IllegalArgumentException("Unit price must be positive");
double price = numBags*unitPrice;
price -= calculateDiscount(numBags, price);
return price;
}
public double calculatePrice(int numBags) {
return this.calculatePrice(numBags, DEFAULT_UNIT_PRICE);
}
public double calculateDiscount(int numBags, double price) {
if (numBags < 0) throw new IllegalArgumentException("Number of bags must be positive");
if (price < 0.0) throw new IllegalArgumentException("Total price must be positive");
double discount = 0.0;
for (int minBags : DISCOUNT_PERCENTAGE.keySet()) {
if (numBags >= minBags) {
discount = price*DISCOUNT_PERCENTAGE.get(minBags);
break;
}
}
return discount;
}
}
Это не слишком рано, чтобы узнать о JUnit и Test Driven Development.
import org.junit.Assert;
import org.junit.Test;
/**
* Junit test for CoffeePriceCalculator
* User: mduffy
* Date: 7/22/2016
* Time: 7:50 AM
* @link http://stackoverflow.com/questions/38525213/simple-discount
*/
public class CoffeePriceCalculatorTest {
public static final double TOLERANCE = 1.0e-3;
@Test
public void testCalculatePrice_NoDiscount() {
// setup
CoffeePriceCalculator coffeePriceCalculator = new CoffeePriceCalculator();
int numBags = 5;
// exercise
double actual = coffeePriceCalculator.calculatePrice(numBags);
// assert
Assert.assertEquals(numBags * CoffeePriceCalculator.DEFAULT_UNIT_PRICE, actual, TOLERANCE);
}
@Test
public void testCalculatorPrice_LowDiscount() {
// setup
CoffeePriceCalculator coffeePriceCalculator = new CoffeePriceCalculator();
int numBags = 15;
// exercise
double actual = coffeePriceCalculator.calculatePrice(numBags);
// assert
Assert.assertEquals(numBags * CoffeePriceCalculator.DEFAULT_UNIT_PRICE*0.95, actual, TOLERANCE);
}
@Test
public void testCalculatorPrice_HighDiscount() {
// setup
CoffeePriceCalculator coffeePriceCalculator = new CoffeePriceCalculator();
int numBags = 25;
// exercise
double actual = coffeePriceCalculator.calculatePrice(numBags);
// assert
Assert.assertEquals(numBags * CoffeePriceCalculator.DEFAULT_UNIT_PRICE*0.90, actual, TOLERANCE);
}
@Test(expected = IllegalArgumentException.class)
public void testCalculatePrice_NegativeBags() {
// setup
CoffeePriceCalculator coffeePriceCalculator = new CoffeePriceCalculator();
int numBags = -25;
// exercise
coffeePriceCalculator.calculatePrice(numBags);
}
}
Я предлагаю вам использовать базовый синтаксис Java, pronto. –
Это недопустимо Java. – duffymo
Вы используете IDE? В коде отсутствует LOT базового синтаксиса. –