From 30550ec87d0be68ff446f9dc67dd6850a1f7e826 Mon Sep 17 00:00:00 2001 From: B14D3E33 Date: Wed, 20 Mar 2024 15:32:08 +0300 Subject: [PATCH 1/4] homework_1 --- basics/src/main/java/ru/msu/vmk/NumberSample.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 9961ed3..2a36560 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -1,11 +1,20 @@ package ru.msu.vmk; import java.math.BigDecimal; +import java.math.RoundingMode; public class NumberSample { public static BigDecimal[] split(BigDecimal amount, int n) { // разделить amount на n частей // если остается остаток, прибавить его к первому числу - return null; + BigDecimal[] result = new BigDecimal[n]; + BigDecimal splittedEqualAmount = amount.divide(new BigDecimal(n), 2, RoundingMode.DOWN) + .stripTrailingZeros().movePointRight(1).movePointLeft(1); + + for (int i = 0; i < n; i++) { + result[i] = splittedEqualAmount; + } + + return result; } -} +} \ No newline at end of file From b03f60a230ba8ffa8ddef6cce3739b528aba5a0a Mon Sep 17 00:00:00 2001 From: B14D3E33 Date: Wed, 20 Mar 2024 16:32:58 +0300 Subject: [PATCH 2/4] homework_1 with remainder --- basics/src/main/java/ru/msu/vmk/NumberSample.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 2a36560..0edd4f2 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -2,18 +2,19 @@ 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]; - BigDecimal splittedEqualAmount = amount.divide(new BigDecimal(n), 2, RoundingMode.DOWN) - .stripTrailingZeros().movePointRight(1).movePointLeft(1); - - for (int i = 0; i < n; i++) { - result[i] = splittedEqualAmount; - } + Arrays.fill(result, dividedEqualAmount); + result[0].add(remainder).stripTrailingZeros().movePointRight(1).movePointLeft(1); return result; } From c89a42012a330e25d0414192298ff45fd91513ac Mon Sep 17 00:00:00 2001 From: B14D3E33 Date: Wed, 20 Mar 2024 16:58:09 +0300 Subject: [PATCH 3/4] homework_2 --- .../main/java/ru/msu/vmk/NumberSample.java | 21 ++++++ .../src/main/java/ru/msu/vmk/Quantity.java | 73 +++++++++++++++++-- 2 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 object-oriented-programming/src/main/java/ru/msu/vmk/NumberSample.java 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..7e572ed 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; + validateUnitOfMeasurement(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; + validateUnitOfMeasurement(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; + validateUnitOfMeasurement(quantity); + BigDecimal result = this.amount.multiply(quantity.amount); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -65,7 +89,9 @@ public Quantity multiply(Quantity quantity) throws Exception { * @return частное */ public Quantity divide(Quantity quantity) throws Exception { - return null; + validateUnitOfMeasurement(quantity); + BigDecimal result = this.amount.divide(quantity.amount); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -75,6 +101,41 @@ 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 == null || getClass() != o.getClass()) return false; + Quantity quantity = (Quantity) o; + + return amount.equals(quantity.amount) && unitOfMeasurement.equals(quantity.unitOfMeasurement); + } + + @Override + public int hashCode() { + return Objects.hash(amount, unitOfMeasurement); + } + + @Override + public String toString() { + return amount + " " + unitOfMeasurement; + } + + private void validateUnitOfMeasurement(Quantity q_right) { + if (!this.unitOfMeasurement.equals(q_right.unitOfMeasurement)) { + throw new IllegalArgumentException("Единицы измерения не совпадают: " + + this.unitOfMeasurement + " " + q_right.unitOfMeasurement); + } } } From 3e1ae249f2b350874f8cb1b4e36980d678f9e577 Mon Sep 17 00:00:00 2001 From: B14D3E33 Date: Thu, 21 Mar 2024 01:55:10 +0300 Subject: [PATCH 4/4] homework_2 Quantity rework --- .../src/main/java/ru/msu/vmk/Quantity.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) 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 7e572ed..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 @@ -53,7 +53,7 @@ public void setAmount(BigDecimal amount) { * @return сумма чисел */ public Quantity add(Quantity quantity) throws Exception { - validateUnitOfMeasurement(quantity); + validateEqualUnitOfMeasurement(quantity); BigDecimal sum = this.amount.add(quantity.amount); return new Quantity(sum, this.unitOfMeasurement); } @@ -65,7 +65,7 @@ public Quantity add(Quantity quantity) throws Exception { * @return разность чисел */ public Quantity subtract(Quantity quantity) throws Exception { - validateUnitOfMeasurement(quantity); + validateEqualUnitOfMeasurement(quantity); BigDecimal diff = this.amount.subtract(quantity.amount); return new Quantity(diff, this.unitOfMeasurement); } @@ -77,7 +77,7 @@ public Quantity subtract(Quantity quantity) throws Exception { * @return произведение */ public Quantity multiply(Quantity quantity) throws Exception { - validateUnitOfMeasurement(quantity); + validateEqualUnitOfMeasurement(quantity); BigDecimal result = this.amount.multiply(quantity.amount); return new Quantity(result, this.unitOfMeasurement); } @@ -89,7 +89,8 @@ public Quantity multiply(Quantity quantity) throws Exception { * @return частное */ public Quantity divide(Quantity quantity) throws Exception { - validateUnitOfMeasurement(quantity); + // No check because quantity.amount cannot be null + validateEqualUnitOfMeasurement(quantity); BigDecimal result = this.amount.divide(quantity.amount); return new Quantity(result, this.unitOfMeasurement); } @@ -116,10 +117,8 @@ public Quantity[] divide(int n) throws Exception { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Quantity quantity = (Quantity) o; - - return amount.equals(quantity.amount) && unitOfMeasurement.equals(quantity.unitOfMeasurement); + if (!(o instanceof Quantity quantity)) return false; + return Objects.equals(amount, quantity.amount) && Objects.equals(unitOfMeasurement, quantity.unitOfMeasurement); } @Override @@ -129,13 +128,16 @@ public int hashCode() { @Override public String toString() { - return amount + " " + unitOfMeasurement; + return "Quantity{" + + "amount=" + amount + + ", unitOfMeasurement='" + unitOfMeasurement + '\'' + + '}'; } - private void validateUnitOfMeasurement(Quantity q_right) { - if (!this.unitOfMeasurement.equals(q_right.unitOfMeasurement)) { + private void validateEqualUnitOfMeasurement(Quantity qRight) { + if (!this.unitOfMeasurement.equals(qRight.unitOfMeasurement)) { throw new IllegalArgumentException("Единицы измерения не совпадают: " - + this.unitOfMeasurement + " " + q_right.unitOfMeasurement); + + this.unitOfMeasurement + " " + qRight.unitOfMeasurement); } } }