diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 9961ed3..0edd4f2 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -1,11 +1,21 @@ package ru.msu.vmk; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; public class NumberSample { public static BigDecimal[] split(BigDecimal amount, int n) { // разделить amount на n частей // если остается остаток, прибавить его к первому числу - return null; + BigDecimal dividedEqualAmount = amount.divide(new BigDecimal(n), 2, RoundingMode.DOWN) + .stripTrailingZeros().movePointRight(1).movePointLeft(1); + BigDecimal remainder = amount.subtract(dividedEqualAmount.multiply(new BigDecimal(n))); + + BigDecimal[] result = new BigDecimal[n]; + Arrays.fill(result, dividedEqualAmount); + result[0].add(remainder).stripTrailingZeros().movePointRight(1).movePointLeft(1); + + return result; } -} +} \ No newline at end of file diff --git a/object-oriented-programming/src/main/java/ru/msu/vmk/NumberSample.java b/object-oriented-programming/src/main/java/ru/msu/vmk/NumberSample.java new file mode 100644 index 0000000..0edd4f2 --- /dev/null +++ b/object-oriented-programming/src/main/java/ru/msu/vmk/NumberSample.java @@ -0,0 +1,21 @@ +package ru.msu.vmk; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; + +public class NumberSample { + public static BigDecimal[] split(BigDecimal amount, int n) { + // разделить amount на n частей + // если остается остаток, прибавить его к первому числу + BigDecimal dividedEqualAmount = amount.divide(new BigDecimal(n), 2, RoundingMode.DOWN) + .stripTrailingZeros().movePointRight(1).movePointLeft(1); + BigDecimal remainder = amount.subtract(dividedEqualAmount.multiply(new BigDecimal(n))); + + BigDecimal[] result = new BigDecimal[n]; + Arrays.fill(result, dividedEqualAmount); + result[0].add(remainder).stripTrailingZeros().movePointRight(1).movePointLeft(1); + + return result; + } +} \ No newline at end of file diff --git a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java index 6c1810e..659cae2 100644 --- a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java +++ b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java @@ -1,6 +1,8 @@ package ru.msu.vmk; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Objects; /** * По примеру класса {@link Money} реализовать класс Quantity: @@ -13,11 +15,23 @@ *
- для проверки работы реализовать функцию main() или Unit-test */ public class Quantity { + + private BigDecimal amount; + private String unitOfMeasurement; + /** * @param amount - сумма * @param unitOfMeasurement - единица измерения */ public Quantity(BigDecimal amount, String unitOfMeasurement) { + if (amount == null) { + throw new IllegalArgumentException("amount cannot be null"); + } + if (unitOfMeasurement == null || unitOfMeasurement.isBlank()) { + throw new IllegalArgumentException("units cannot be empty"); + } + this.amount = amount.setScale(2, RoundingMode.HALF_EVEN); + this.unitOfMeasurement = unitOfMeasurement; } /** @@ -25,7 +39,11 @@ public Quantity(BigDecimal amount, String unitOfMeasurement) { * @return {@link Quantity#amount} */ public BigDecimal getAmount() { - return null; + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; } /** @@ -35,7 +53,9 @@ public BigDecimal getAmount() { * @return сумма чисел */ public Quantity add(Quantity quantity) throws Exception { - return null; + validateEqualUnitOfMeasurement(quantity); + BigDecimal sum = this.amount.add(quantity.amount); + return new Quantity(sum, this.unitOfMeasurement); } /** @@ -45,7 +65,9 @@ public Quantity add(Quantity quantity) throws Exception { * @return разность чисел */ public Quantity subtract(Quantity quantity) throws Exception { - return null; + validateEqualUnitOfMeasurement(quantity); + BigDecimal diff = this.amount.subtract(quantity.amount); + return new Quantity(diff, this.unitOfMeasurement); } /** @@ -55,7 +77,9 @@ public Quantity subtract(Quantity quantity) throws Exception { * @return произведение */ public Quantity multiply(Quantity quantity) throws Exception { - return null; + validateEqualUnitOfMeasurement(quantity); + BigDecimal result = this.amount.multiply(quantity.amount); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -65,7 +89,10 @@ public Quantity multiply(Quantity quantity) throws Exception { * @return частное */ public Quantity divide(Quantity quantity) throws Exception { - return null; + // No check because quantity.amount cannot be null + validateEqualUnitOfMeasurement(quantity); + BigDecimal result = this.amount.divide(quantity.amount); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -75,6 +102,42 @@ public Quantity divide(Quantity quantity) throws Exception { * @return равные части числа */ public Quantity[] divide(int n) throws Exception { - return null; + if (n == 0) { + throw new IllegalArgumentException("Невозможно разделить на 0 частей"); + } + + BigDecimal[] splitted = NumberSample.split(this.amount, n); + Quantity[] quantityResult = new Quantity[n]; + for (int i = 0; i < n; i++) { + quantityResult[i] = new Quantity(splitted[i], this.unitOfMeasurement); + } + return quantityResult; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Quantity quantity)) return false; + return Objects.equals(amount, quantity.amount) && Objects.equals(unitOfMeasurement, quantity.unitOfMeasurement); + } + + @Override + public int hashCode() { + return Objects.hash(amount, unitOfMeasurement); + } + + @Override + public String toString() { + return "Quantity{" + + "amount=" + amount + + ", unitOfMeasurement='" + unitOfMeasurement + '\'' + + '}'; + } + + private void validateEqualUnitOfMeasurement(Quantity qRight) { + if (!this.unitOfMeasurement.equals(qRight.unitOfMeasurement)) { + throw new IllegalArgumentException("Единицы измерения не совпадают: " + + this.unitOfMeasurement + " " + qRight.unitOfMeasurement); + } } }