From 18e0254a04f14f529b63201bb52d93d4b8bc1a74 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Thu, 24 Nov 2022 15:14:33 +0300 Subject: [PATCH 01/24] Add blank base classes and interfaces --- lab-01/src/by/dudkoandrei/quizer/Main.java | 18 +++++ lab-01/src/by/dudkoandrei/quizer/Quiz.java | 71 +++++++++++++++++++ lab-01/src/by/dudkoandrei/quizer/Result.java | 10 +++ .../quizer/task_generators/TaskGenerator.java | 18 +++++ .../src/by/dudkoandrei/quizer/tasks/Task.java | 23 ++++++ 5 files changed, 140 insertions(+) create mode 100644 lab-01/src/by/dudkoandrei/quizer/Main.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/Quiz.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/Result.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/tasks/Task.java diff --git a/lab-01/src/by/dudkoandrei/quizer/Main.java b/lab-01/src/by/dudkoandrei/quizer/Main.java new file mode 100644 index 0000000..b0f58e0 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/Main.java @@ -0,0 +1,18 @@ +package by.dudkoandrei.quizer; + +import java.util.Map; + +public class Main { + + /** + * @return тесты в {@link Map}, где ключ - название теста {@link String} значение - сам тест + * {@link Quiz} + */ + static Map getQuizMap() { + + } + + public static void main(String[] args) { + // ... + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/Quiz.java b/lab-01/src/by/dudkoandrei/quizer/Quiz.java new file mode 100644 index 0000000..40a5a85 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/Quiz.java @@ -0,0 +1,71 @@ +package by.dudkoandrei.quizer; + +import by.dudkoandrei.quizer.task_generators.TaskGenerator; +import by.dudkoandrei.quizer.tasks.Task; + +/** + * Class, который описывает один тест + */ +class Quiz { + + /** + * @param generator генератор заданий + * @param taskCount количество заданий в тесте + */ + Quiz(TaskGenerator generator, int taskCount) { + // ... + } + + /** + * @return задание, повторный вызов вернет слелующее + * @see Task + */ + Task nextTask() { + // ... + } + + /** + * Предоставить ответ ученика. Если результат {@link Result#INCORRECT_INPUT}, то счетчик + * неправильных ответов не увеличивается, а {@link #nextTask()} в следующий раз вернет тот же + * самый объект {@link Task}. + */ + Result provideAnswer(String answer) { + // ... + } + + /** + * @return завершен ли тест + */ + boolean isFinished() { + // ... + } + + /** + * @return количество правильных ответов + */ + int getCorrectAnswerNumber() { + // ... + } + + /** + * @return количество неправильных ответов + */ + int getWrongAnswerNumber() { + // ... + } + + /** + * @return количество раз, когда был предоставлен неправильный ввод + */ + int getIncorrectInputNumber() { + // ... + } + + /** + * @return оценка, которая является отношением количества правильных ответов к количеству всех + * вопросов. Оценка выставляется только в конце! + */ + double getMark() { + // ... + } +} \ No newline at end of file diff --git a/lab-01/src/by/dudkoandrei/quizer/Result.java b/lab-01/src/by/dudkoandrei/quizer/Result.java new file mode 100644 index 0000000..1730e9d --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/Result.java @@ -0,0 +1,10 @@ +package by.dudkoandrei.quizer; + +/** + * Enum, который описывает результат ответа на задание + */ +public enum Result { + OK, // Получен правильный ответ + WRONG, // Получен неправильный ответ + INCORRECT_INPUT // Некорректный ввод. Например, текст, когда ожидалось число +} diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java new file mode 100644 index 0000000..b16b7ec --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java @@ -0,0 +1,18 @@ +package by.dudkoandrei.quizer.task_generators; + +import by.dudkoandrei.quizer.tasks.Task; + +/** + * Interface, который описывает один генератор заданий + */ +public interface TaskGenerator { + + /** + * Возвращает задание. При этом новый объект может не создаваться, если класс задания + * иммутабельный. + * + * @return задание + * @see Task + */ + Task generate(); +} diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java new file mode 100644 index 0000000..1fcd1b8 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java @@ -0,0 +1,23 @@ +package by.dudkoandrei.quizer.tasks; + +import by.dudkoandrei.quizer.Result; + +/** + * Interface, который описывает одно задание + */ +public interface Task { + + /** + @return текст задания + */ + String getText(); + + /** + * Проверяет ответ на задание и возвращает результат + * + * @param answer ответ на задание + * @return результат ответа + * @see Result + */ + Result validate(String answer); +} \ No newline at end of file From 83b01fe1c89413129ebe6a8bd96a7292e9427c1d Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Thu, 24 Nov 2022 15:28:39 +0300 Subject: [PATCH 02/24] Fix some javadocs --- lab-01/src/by/dudkoandrei/quizer/Quiz.java | 2 +- lab-01/src/by/dudkoandrei/quizer/Result.java | 2 +- lab-01/src/by/dudkoandrei/quizer/tasks/Task.java | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/Quiz.java b/lab-01/src/by/dudkoandrei/quizer/Quiz.java index 40a5a85..df98cbf 100644 --- a/lab-01/src/by/dudkoandrei/quizer/Quiz.java +++ b/lab-01/src/by/dudkoandrei/quizer/Quiz.java @@ -4,7 +4,7 @@ import by.dudkoandrei.quizer.tasks.Task; /** - * Class, который описывает один тест + * Class, который описывает один тест. */ class Quiz { diff --git a/lab-01/src/by/dudkoandrei/quizer/Result.java b/lab-01/src/by/dudkoandrei/quizer/Result.java index 1730e9d..f024e8c 100644 --- a/lab-01/src/by/dudkoandrei/quizer/Result.java +++ b/lab-01/src/by/dudkoandrei/quizer/Result.java @@ -1,7 +1,7 @@ package by.dudkoandrei.quizer; /** - * Enum, который описывает результат ответа на задание + * Enum, который описывает результат ответа на задание. */ public enum Result { OK, // Получен правильный ответ diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java index 1fcd1b8..a696c29 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java @@ -3,21 +3,23 @@ import by.dudkoandrei.quizer.Result; /** - * Interface, который описывает одно задание + * Interface, который описывает одно задание. */ public interface Task { /** - @return текст задания + * Возвращает текст задания. + * + * @return текст задания */ String getText(); /** - * Проверяет ответ на задание и возвращает результат + * Проверяет ответ на задание и возвращает результат. * - * @param answer ответ на задание - * @return результат ответа - * @see Result + * @param answer ответ на задание + * @return результат ответа + * @see Result */ Result validate(String answer); } \ No newline at end of file From 0affb72bedc04cbd03ceda351e58bd41e11f3a6d Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Thu, 24 Nov 2022 15:31:14 +0300 Subject: [PATCH 03/24] Make TaskGenerator Task's nested interface --- lab-01/src/by/dudkoandrei/quizer/Quiz.java | 3 +-- .../quizer/task_generators/TaskGenerator.java | 18 ------------------ .../src/by/dudkoandrei/quizer/tasks/Task.java | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 20 deletions(-) delete mode 100644 lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java diff --git a/lab-01/src/by/dudkoandrei/quizer/Quiz.java b/lab-01/src/by/dudkoandrei/quizer/Quiz.java index df98cbf..c9644aa 100644 --- a/lab-01/src/by/dudkoandrei/quizer/Quiz.java +++ b/lab-01/src/by/dudkoandrei/quizer/Quiz.java @@ -1,6 +1,5 @@ package by.dudkoandrei.quizer; -import by.dudkoandrei.quizer.task_generators.TaskGenerator; import by.dudkoandrei.quizer.tasks.Task; /** @@ -12,7 +11,7 @@ class Quiz { * @param generator генератор заданий * @param taskCount количество заданий в тесте */ - Quiz(TaskGenerator generator, int taskCount) { + Quiz(Task.Generator generator, int taskCount) { // ... } diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java deleted file mode 100644 index b16b7ec..0000000 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/TaskGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package by.dudkoandrei.quizer.task_generators; - -import by.dudkoandrei.quizer.tasks.Task; - -/** - * Interface, который описывает один генератор заданий - */ -public interface TaskGenerator { - - /** - * Возвращает задание. При этом новый объект может не создаваться, если класс задания - * иммутабельный. - * - * @return задание - * @see Task - */ - Task generate(); -} diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java index a696c29..4856a94 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java @@ -7,6 +7,21 @@ */ public interface Task { + /** + * Interface, который описывает один генератор заданий. + */ + interface Generator { + + /** + * Возвращает задание. При этом новый объект может не создаваться, если класс задания + * иммутабельный. + * + * @return задание + * @see Task + */ + Task generate(); + } + /** * Возвращает текст задания. * From 9a57b7da527b76603267601d85d643868d84450b Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Fri, 25 Nov 2022 17:08:16 +0300 Subject: [PATCH 04/24] Implement Quiz methods --- lab-01/src/by/dudkoandrei/quizer/Quiz.java | 66 ++++++++++++++++--- .../src/by/dudkoandrei/quizer/tasks/Task.java | 2 +- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/Quiz.java b/lab-01/src/by/dudkoandrei/quizer/Quiz.java index c9644aa..4bb0020 100644 --- a/lab-01/src/by/dudkoandrei/quizer/Quiz.java +++ b/lab-01/src/by/dudkoandrei/quizer/Quiz.java @@ -7,12 +7,29 @@ */ class Quiz { + private final Task.Generator taskGenerator; + + private Task currentTask = null; + private final int taskCount; + private boolean answeredOnCurrentTask = false; + + private int correctAnswerNumber = 0; + private int wrongAnswerNumber = 0; + private int incorrectInputNumber = 0; + /** * @param generator генератор заданий * @param taskCount количество заданий в тесте */ Quiz(Task.Generator generator, int taskCount) { - // ... + if (taskCount <= 0) { + // exception + } + if (generator == null) { + // exception + } + this.taskGenerator = generator; + this.taskCount = taskCount; } /** @@ -20,7 +37,16 @@ class Quiz { * @see Task */ Task nextTask() { - // ... + if (isFinished()) { + // exception + } + + if (answeredOnCurrentTask || currentTask == null) { + currentTask = taskGenerator.generate(); + answeredOnCurrentTask = false; + } + + return currentTask; } /** @@ -29,35 +55,53 @@ Task nextTask() { * самый объект {@link Task}. */ Result provideAnswer(String answer) { - // ... + if (isFinished()) { + // exception + } + + Result result = currentTask.validate(answer); + + switch (result) { + case OK -> { + correctAnswerNumber++; + answeredOnCurrentTask = true; + } + case WRONG -> { + wrongAnswerNumber++; + answeredOnCurrentTask = true; + } + case INCORRECT_INPUT -> incorrectInputNumber++; + } + + return result; } /** * @return завершен ли тест */ boolean isFinished() { - // ... + return correctAnswerNumber + wrongAnswerNumber == taskCount; } /** * @return количество правильных ответов */ int getCorrectAnswerNumber() { - // ... + return correctAnswerNumber; } /** * @return количество неправильных ответов */ int getWrongAnswerNumber() { - // ... + return wrongAnswerNumber; } /** * @return количество раз, когда был предоставлен неправильный ввод */ int getIncorrectInputNumber() { - // ... + return incorrectInputNumber; } /** @@ -65,6 +109,10 @@ int getIncorrectInputNumber() { * вопросов. Оценка выставляется только в конце! */ double getMark() { - // ... + if (!isFinished()) { + // exception + } + + return ((double) correctAnswerNumber) / taskCount; } -} \ No newline at end of file +} diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java index 4856a94..542a9b3 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/Task.java @@ -37,4 +37,4 @@ interface Generator { * @see Result */ Result validate(String answer); -} \ No newline at end of file +} From afca867594a5e3c58603b38810ce81b2326aa36e Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Sun, 27 Nov 2022 14:00:54 +0300 Subject: [PATCH 05/24] Add MathTask interface and AbstractMathTask class --- .../tasks/math_tasks/AbstractMathTask.java | 98 +++++++++++++++++++ .../quizer/tasks/math_tasks/MathTask.java | 63 ++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java new file mode 100644 index 0000000..2068625 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -0,0 +1,98 @@ +package by.dudkoandrei.quizer.tasks.math_tasks; + +import by.dudkoandrei.quizer.Result; +import java.util.EnumSet; + +public abstract class AbstractMathTask implements MathTask { + + protected final double answer; + protected final int precision; + protected final double eps; + + AbstractMathTask(double answer, int precision) { + if (precision < 0) { + // exception + } + + this.answer = answer; + this.precision = precision; + this.eps = Math.pow(0.1, precision); + } + + @Override + public Result validate(String answer) { + double givenAnswer; + + try { + givenAnswer = Double.parseDouble(answer); + } catch (NumberFormatException e) { + return Result.INCORRECT_INPUT; + } + + if (Math.abs(givenAnswer - this.answer) < eps) { + return Result.OK; + } else { + return Result.WRONG; + } + } + + abstract static class Generator implements MathTask.Generator { + + protected final double minNumber; + protected final double maxNumber; + protected final int precision; + protected final EnumSet allowedOperations; + + Generator(double minNumber, double maxNumber, EnumSet operations) { + if (operations == null) { + // exception + } + if (operations.isEmpty()) { + // exception + } + if (minNumber > maxNumber) { + // exception + } + + this.minNumber = minNumber; + this.maxNumber = maxNumber; + this.allowedOperations = operations.clone(); + this.precision = 0; + } + + Generator(double minNumber, double maxNumber, int precision, EnumSet operations) { + if (operations == null) { + // exception + } + if (operations.isEmpty()) { + // exception + } + if (minNumber > maxNumber) { + // exception + } + if (precision < 0) { + // exception + } + + this.minNumber = minNumber; + this.maxNumber = maxNumber; + this.allowedOperations = operations.clone(); + this.precision = precision; + } + + @Override + public double getMinNumber() { + return minNumber; + } + + @Override + public double getMaxNumber() { + return maxNumber; + } + + @Override + public int getPrecision() { + return precision; + } + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java new file mode 100644 index 0000000..f8007be --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java @@ -0,0 +1,63 @@ +package by.dudkoandrei.quizer.tasks.math_tasks; + +import by.dudkoandrei.quizer.tasks.Task; + +public interface MathTask extends Task { + + interface Generator extends Task.Generator { + + /** + * @return минимальное число + */ + double getMinNumber(); + + /** + * @return максимальное число + */ + double getMaxNumber(); + + /** + * @return количество знаков после запятой в генерируемых числах + */ + int getPrecision(); + + /** + * @return разница между максимальным и минимальным возможным числом + */ + default double getDiffNumber() { + return getMaxNumber() - getMinNumber(); + } + } + + /** + * Enum, который описывает допустимые операции для {@link MathTask}. + */ + enum Operation { + ADD, + SUBTRACT, + DIVIDE, + MULTIPLY; + + @Override + public String toString() { + switch (this) { + case ADD -> { + return "+"; + } + case SUBTRACT -> { + return "-"; + } + case MULTIPLY -> { + return "*"; + } + case DIVIDE -> { + return "/"; + } + default -> { + // exception + } + } + return ""; + } + } +} From 0c5145f685b077f3da4426e845430690ea91e4d3 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Sun, 27 Nov 2022 17:31:37 +0300 Subject: [PATCH 06/24] Add TextTask class --- .../by/dudkoandrei/quizer/tasks/TextTask.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java new file mode 100644 index 0000000..0ca92ac --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java @@ -0,0 +1,51 @@ +package by.dudkoandrei.quizer.tasks; + +import by.dudkoandrei.quizer.Result; + +/** + * Задание с заранее заготовленным текстом. Можно использовать {@link PoolTaskGenerator}, чтобы + * задавать задания такого типа. + */ +class TextTask implements Task { + + private final String text; + private final String answer; + + /** + * @param text текст задания + * @param answer ответ на задание + */ + TextTask(String text, String answer) { + if (text == null || answer == null) { + // exception + } + if (text.isEmpty() || answer.isEmpty()) { + // exception + } + + this.text = text; + this.answer = answer; + } + + @Override + public String getText() { + return text; + } + + @Override + public Result validate(String answer) { + if (answer == null) { + // exception + } + + if (answer.isEmpty()) { + return Result.INCORRECT_INPUT; + } + + if (answer.equalsIgnoreCase(this.answer)) { + return Result.OK; + } else { + return Result.WRONG; + } + } +} \ No newline at end of file From 32cd8fbdb8bf56345da7abfeea85958bcc413530 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Sun, 27 Nov 2022 18:18:36 +0300 Subject: [PATCH 07/24] Add PoolTaskGenerator class --- .../task_generators/PoolTaskGenerator.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java new file mode 100644 index 0000000..530c17f --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java @@ -0,0 +1,70 @@ +package by.dudkoandrei.quizer.task_generators; + +import by.dudkoandrei.quizer.tasks.Task; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Random; + +/** + * Task.Generator, который отдает задания из заранее заготовленного набора. + */ +public class PoolTaskGenerator implements Task.Generator { + + private final ArrayList tasks; + private final boolean allowDuplicate; + private int currentPosition = 0; + private static final Random rnd = new Random(); + + /** + * Конструктор с переменным числом аргументов. + * + * @param allowDuplicate разрешить повторения + * @param tasks задания, которые в конструктор передаются через запятую + */ + PoolTaskGenerator(boolean allowDuplicate, Task... tasks) { + this(allowDuplicate, Arrays.asList(tasks)); + } + + /** + * Конструктор, который принимает коллекцию заданий. + * + * @param allowDuplicate разрешить повторения + * @param tasks задания, которые передаются в конструктор в Collection (например, + * {@link LinkedList}) + */ + PoolTaskGenerator(boolean allowDuplicate, Collection tasks) { + if (tasks == null) { + // exception + } + if (tasks.isEmpty()) { + // exception + } + if (tasks.contains(null)) { + // exception + } + + this.allowDuplicate = allowDuplicate; + this.tasks = new ArrayList<>(tasks); + + if (!allowDuplicate) { + Collections.shuffle(this.tasks); + } + } + + /** + * @return случайная задача из списка + */ + public Task generate() { + if (allowDuplicate) { + return tasks.get(rnd.nextInt(tasks.size())); + } + + if (currentPosition == tasks.size()) { + // exception; + } + + return tasks.get(currentPosition++); + } +} From bbd824144cd4c86e33052d6c5609141a06789a62 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Sun, 27 Nov 2022 18:33:32 +0300 Subject: [PATCH 08/24] Add GroupTaskGenerator class --- .../task_generators/GroupTaskGenerator.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java new file mode 100644 index 0000000..1d09a32 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java @@ -0,0 +1,62 @@ +package by.dudkoandrei.quizer.task_generators; + +import by.dudkoandrei.quizer.tasks.Task; +import by.dudkoandrei.quizer.tasks.Task.Generator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +/** + * Task.Generator, который позволяет объединить несколько других Task.Generator. + */ +public class GroupTaskGenerator implements Task.Generator { + + private final ArrayList generators; + + /** + * Конструктор с переменным числом аргументов + * + * @param generators генераторы, которые в конструктор передаются через запятую + */ + GroupTaskGenerator(Task.Generator... generators) { + this(Arrays.asList(generators)); + } + + /** + * Конструктор, который принимает коллекцию генераторов + * + * @param generators генераторы, которые передаются в конструктор в Collection (например, + * {@link ArrayList}) + */ + GroupTaskGenerator(Collection generators) { + if (generators == null) { + // exception + } + if (generators.isEmpty()) { + // exception + } + if (generators.contains(null)) { + // exception + } + + this.generators = new ArrayList<>(generators); + } + + /** + * @return результат метода generate() случайного генератора из списка. Если этот генератор + * выбросил исключение в методе generate(), выбирается другой. Если все генераторы выбрасывают + * исключение, то и тут выбрасывается исключение. + */ + public Task generate() { + Collections.shuffle(generators); + try { + for (Generator generator : generators) { + return generator.generate(); + } + } catch (Exception ignored) { + } + + throw new RuntimeException(""); + } +} From da6e27b442eabccc3dafea2d344544bc3f9736dd Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Mon, 28 Nov 2022 21:35:06 +0300 Subject: [PATCH 09/24] Add isDoubleEqual and truncate methods to AbstractMathTask --- .../tasks/math_tasks/AbstractMathTask.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index 2068625..3ce03c0 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -19,6 +19,20 @@ public abstract class AbstractMathTask implements MathTask { this.eps = Math.pow(0.1, precision); } + static boolean isDoubleEqual(double lhs, double rhs, double eps) { + return Math.abs(lhs - rhs) < eps; + } + + static double truncate(double number, int precision) { + if (precision < 0) { + // exception + } + + double scale = Math.pow(10, precision); + + return Math.floor(number * scale) / scale; + } + @Override public Result validate(String answer) { double givenAnswer; @@ -29,7 +43,7 @@ public Result validate(String answer) { return Result.INCORRECT_INPUT; } - if (Math.abs(givenAnswer - this.answer) < eps) { + if (isDoubleEqual(this.answer, givenAnswer, eps)) { return Result.OK; } else { return Result.WRONG; From 3beb74843b430c2a1bed25af249eec09c849611e Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 00:00:59 +0300 Subject: [PATCH 10/24] Add compute method to MathTask.Operation --- .../quizer/tasks/math_tasks/MathTask.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java index f8007be..89127ec 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java @@ -38,6 +38,26 @@ enum Operation { DIVIDE, MULTIPLY; + double compute(double lhs, double rhs) { + switch (this) { + case ADD -> { + return lhs + rhs; + } + case SUBTRACT -> { + return lhs - rhs; + } + case MULTIPLY -> { + return lhs * rhs; + } + case DIVIDE -> { + return lhs / rhs; + } + default -> { + // exception + } + } + } + @Override public String toString() { switch (this) { From 3f7f5a033341b9fa00552a725e8e594b741c1876 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 00:04:09 +0300 Subject: [PATCH 11/24] Add ExpressionTask class --- .../tasks/math_tasks/AbstractMathTask.java | 34 +++++++++- .../tasks/math_tasks/ExpressionTask.java | 65 +++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index 3ce03c0..707d02e 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -1,13 +1,18 @@ package by.dudkoandrei.quizer.tasks.math_tasks; import by.dudkoandrei.quizer.Result; +import java.text.DecimalFormat; import java.util.EnumSet; +import java.util.Iterator; +import java.util.Random; public abstract class AbstractMathTask implements MathTask { protected final double answer; protected final int precision; protected final double eps; + protected String text; + protected static final DecimalFormat df = new DecimalFormat(); AbstractMathTask(double answer, int precision) { if (precision < 0) { @@ -50,14 +55,23 @@ public Result validate(String answer) { } } + @Override + public String getText() { + return text; + } + abstract static class Generator implements MathTask.Generator { protected final double minNumber; protected final double maxNumber; protected final int precision; protected final EnumSet allowedOperations; + protected static Random rnd = new Random(); - Generator(double minNumber, double maxNumber, EnumSet operations) { + Generator( + double minNumber, + double maxNumber, + EnumSet operations) { if (operations == null) { // exception } @@ -74,7 +88,11 @@ abstract static class Generator implements MathTask.Generator { this.precision = 0; } - Generator(double minNumber, double maxNumber, int precision, EnumSet operations) { + Generator( + double minNumber, + double maxNumber, + int precision, + EnumSet operations) { if (operations == null) { // exception } @@ -94,6 +112,18 @@ abstract static class Generator implements MathTask.Generator { this.precision = precision; } + Operation getRandomOperation() { + int index = rnd.nextInt(allowedOperations.size()); + Iterator iter = allowedOperations.iterator(); + + while (index != 0) { + iter.next(); + --index; + } + + return iter.next(); + } + @Override public double getMinNumber() { return minNumber; diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java new file mode 100644 index 0000000..7a370cd --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java @@ -0,0 +1,65 @@ +package by.dudkoandrei.quizer.tasks.math_tasks; + +import java.util.EnumSet; + +public class ExpressionTask extends AbstractMathTask { + + public ExpressionTask( + double firstNumber, + double secondNumber, + int precision, + Operation operation) { + super(operation.compute(firstNumber, secondNumber), precision); + + df.setMaximumFractionDigits(precision); + df.setMinimumFractionDigits(precision); + + text = df.format(firstNumber) + " " + operation + " " + df.format(secondNumber) + " = ?"; + } + + public static class Generator extends AbstractMathTask.Generator { + + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param operations разрешённые операции + */ + public Generator( + double minNumber, + double maxNumber, + EnumSet operations) { + super(minNumber, maxNumber, operations); + } + + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param precision количество знаков после зяпятой в генерируемых числах + * @param operations разрешённые операции + */ + public Generator( + double minNumber, + double maxNumber, + int precision, + EnumSet operations) { + super(minNumber, maxNumber, precision, operations); + } + + /** + * @return задание типа {@link ExpressionTask} + */ + @Override + public ExpressionTask generate() { + double firstNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); + double secondNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); + Operation operation = getRandomOperation(); + + if (operation == Operation.DIVIDE + && isDoubleEqual(secondNumber, 0.0, Math.pow(0.1, precision))) { + operation = Operation.MULTIPLY; + } + + return new ExpressionTask(firstNumber, secondNumber, precision, operation); + } + } +} From ac5bc5544cb4e30463f028161c7d39ddb5534c79 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 12:39:33 +0300 Subject: [PATCH 12/24] Remove code duplicates from AbstractMathTask.Generator class --- .../tasks/math_tasks/AbstractMathTask.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index 707d02e..f4e4ed6 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -72,20 +72,7 @@ abstract static class Generator implements MathTask.Generator { double minNumber, double maxNumber, EnumSet operations) { - if (operations == null) { - // exception - } - if (operations.isEmpty()) { - // exception - } - if (minNumber > maxNumber) { - // exception - } - - this.minNumber = minNumber; - this.maxNumber = maxNumber; - this.allowedOperations = operations.clone(); - this.precision = 0; + this(minNumber, maxNumber, 0, operations); } Generator( @@ -99,7 +86,7 @@ abstract static class Generator implements MathTask.Generator { if (operations.isEmpty()) { // exception } - if (minNumber > maxNumber) { + if (minNumber >= maxNumber) { // exception } if (precision < 0) { From cf8324a6b40be0ae7a376e9e69dc71e32db4083c Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 13:59:56 +0300 Subject: [PATCH 13/24] Add EquationTask class --- .../quizer/tasks/math_tasks/EquationTask.java | 84 +++++++++++++++++++ .../quizer/tasks/math_tasks/MathTask.java | 30 +++++++ 2 files changed, 114 insertions(+) create mode 100644 lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java new file mode 100644 index 0000000..636834e --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java @@ -0,0 +1,84 @@ +package by.dudkoandrei.quizer.tasks.math_tasks; + +import java.util.EnumSet; + +public class EquationTask extends AbstractMathTask { + + public EquationTask( + double firstNumber, + double secondNumber, + int precision, + boolean isFirstNumberUnknown, + Operation operation) { + super(operation.solve(firstNumber, secondNumber, isFirstNumberUnknown), precision); + + df.setMaximumFractionDigits(precision); + df.setMinimumFractionDigits(precision); + + if (isFirstNumberUnknown) { + text = "x " + operation + " " + df.format(firstNumber) + " = " + df.format(secondNumber); + } else { + text = df.format(firstNumber) + " " + operation + " x = " + df.format(secondNumber); + } + } + + public static class Generator extends AbstractMathTask.Generator { + + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param operations разрешённые операции + */ + public Generator( + double minNumber, + double maxNumber, + EnumSet operations) { + super(minNumber, maxNumber, operations); + } + + /** + * @param minNumber минимальное число + * @param maxNumber максимальное число + * @param precision количество знаков после зяпятой в генерируемых числах + * @param operations разрешённые операции + */ + public Generator( + double minNumber, + double maxNumber, + int precision, + EnumSet operations) { + super(minNumber, maxNumber, precision, operations); + } + + /** + * @return задание типа {@link ExpressionTask} + */ + @Override + public EquationTask generate() { + double eps = Math.pow(0.1, precision); + + double firstNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); + double secondNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); + boolean isFirstNumberUnknown = rnd.nextBoolean(); + Operation operation = getRandomOperation(); + + if (operation == Operation.DIVIDE && isDoubleEqual(secondNumber, 0.0, eps)) { + operation = Operation.MULTIPLY; + } + if (operation == Operation.MULTIPLY && isDoubleEqual(firstNumber, 0.0, eps)) { + operation = Operation.ADD; + } + if (isFirstNumberUnknown && operation == Operation.DIVIDE + && isDoubleEqual(firstNumber, 0.0, eps)) { + operation = Operation.ADD; + } + if (!isFirstNumberUnknown && operation == Operation.DIVIDE + && isDoubleEqual(secondNumber, 0.0, eps)) { + operation = Operation.ADD; + } + + return new EquationTask(firstNumber, secondNumber, precision, isFirstNumberUnknown, + operation); + } + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java index 89127ec..bbaeb9c 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java @@ -53,6 +53,7 @@ enum Operation { return lhs / rhs; } default -> { + return 0; // exception } } @@ -79,5 +80,34 @@ public String toString() { } return ""; } + + double solve(double firstNumber, double secondNumber, boolean isFirstNumberUnknown) { + switch (this) { + case ADD -> { + return secondNumber - firstNumber; + } + case MULTIPLY -> { + return secondNumber / firstNumber; + } + case SUBTRACT -> { + if (isFirstNumberUnknown) { + return secondNumber + firstNumber; + } else { + return firstNumber - secondNumber; + } + } + case DIVIDE -> { + if (isFirstNumberUnknown) { + return firstNumber * secondNumber; + } else { + return firstNumber / secondNumber; + } + } + default -> { + return 0; + // exception + } + } + } } } From 8f45f5255ccd9b7c4b65b9192d2e6a5a9239d6b6 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 16:01:21 +0300 Subject: [PATCH 14/24] Add getRandomDouble method to AbstractMathTask.Generator class --- .../quizer/tasks/math_tasks/AbstractMathTask.java | 6 +++++- .../dudkoandrei/quizer/tasks/math_tasks/EquationTask.java | 4 ++-- .../dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index f4e4ed6..aacb0a3 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -86,7 +86,7 @@ abstract static class Generator implements MathTask.Generator { if (operations.isEmpty()) { // exception } - if (minNumber >= maxNumber) { + if (minNumber > maxNumber) { // exception } if (precision < 0) { @@ -99,6 +99,10 @@ abstract static class Generator implements MathTask.Generator { this.precision = precision; } + double getRandomDouble() { + return truncate(rnd.nextDouble(minNumber, maxNumber + Double.MIN_VALUE), precision); + } + Operation getRandomOperation() { int index = rnd.nextInt(allowedOperations.size()); Iterator iter = allowedOperations.iterator(); diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java index 636834e..4020ed8 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java @@ -57,8 +57,8 @@ public Generator( public EquationTask generate() { double eps = Math.pow(0.1, precision); - double firstNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); - double secondNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); + double firstNumber = getRandomDouble(); + double secondNumber = getRandomDouble(); boolean isFirstNumberUnknown = rnd.nextBoolean(); Operation operation = getRandomOperation(); diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java index 7a370cd..ad37465 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java @@ -50,8 +50,8 @@ public Generator( */ @Override public ExpressionTask generate() { - double firstNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); - double secondNumber = truncate(rnd.nextDouble(minNumber, maxNumber), precision); + double firstNumber = getRandomDouble(); + double secondNumber = getRandomDouble(); Operation operation = getRandomOperation(); if (operation == Operation.DIVIDE From 904ebb483c47f248f1dc2d750f521c0babfa5d57 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 16:44:53 +0300 Subject: [PATCH 15/24] Add exceptions --- lab-01/src/by/dudkoandrei/quizer/Quiz.java | 13 +++++++------ .../exceptions/GeneratorsFailedException.java | 8 ++++++++ .../quizer/exceptions/NoMoreTasksException.java | 8 ++++++++ .../quizer/exceptions/QuizFinishedException.java | 8 ++++++++ .../quizer/exceptions/QuizNotFinishedException.java | 8 ++++++++ .../quizer/task_generators/GroupTaskGenerator.java | 10 ++++++---- .../quizer/task_generators/PoolTaskGenerator.java | 9 +++++---- .../src/by/dudkoandrei/quizer/tasks/TextTask.java | 6 +++--- .../quizer/tasks/math_tasks/AbstractMathTask.java | 12 ++++++------ 9 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 lab-01/src/by/dudkoandrei/quizer/exceptions/GeneratorsFailedException.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/exceptions/NoMoreTasksException.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/exceptions/QuizFinishedException.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/exceptions/QuizNotFinishedException.java diff --git a/lab-01/src/by/dudkoandrei/quizer/Quiz.java b/lab-01/src/by/dudkoandrei/quizer/Quiz.java index 4bb0020..f4b5a03 100644 --- a/lab-01/src/by/dudkoandrei/quizer/Quiz.java +++ b/lab-01/src/by/dudkoandrei/quizer/Quiz.java @@ -1,5 +1,7 @@ package by.dudkoandrei.quizer; +import by.dudkoandrei.quizer.exceptions.QuizFinishedException; +import by.dudkoandrei.quizer.exceptions.QuizNotFinishedException; import by.dudkoandrei.quizer.tasks.Task; /** @@ -12,7 +14,6 @@ class Quiz { private Task currentTask = null; private final int taskCount; private boolean answeredOnCurrentTask = false; - private int correctAnswerNumber = 0; private int wrongAnswerNumber = 0; private int incorrectInputNumber = 0; @@ -23,10 +24,10 @@ class Quiz { */ Quiz(Task.Generator generator, int taskCount) { if (taskCount <= 0) { - // exception + throw new IllegalArgumentException("Task count should be positive"); } if (generator == null) { - // exception + throw new IllegalArgumentException("Generator is null"); } this.taskGenerator = generator; this.taskCount = taskCount; @@ -38,7 +39,7 @@ class Quiz { */ Task nextTask() { if (isFinished()) { - // exception + throw new QuizFinishedException(); } if (answeredOnCurrentTask || currentTask == null) { @@ -56,7 +57,7 @@ Task nextTask() { */ Result provideAnswer(String answer) { if (isFinished()) { - // exception + throw new QuizFinishedException(); } Result result = currentTask.validate(answer); @@ -110,7 +111,7 @@ int getIncorrectInputNumber() { */ double getMark() { if (!isFinished()) { - // exception + throw new QuizNotFinishedException(); } return ((double) correctAnswerNumber) / taskCount; diff --git a/lab-01/src/by/dudkoandrei/quizer/exceptions/GeneratorsFailedException.java b/lab-01/src/by/dudkoandrei/quizer/exceptions/GeneratorsFailedException.java new file mode 100644 index 0000000..f8f1c39 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/exceptions/GeneratorsFailedException.java @@ -0,0 +1,8 @@ +package by.dudkoandrei.quizer.exceptions; + +public class GeneratorsFailedException extends RuntimeException { + + public GeneratorsFailedException() { + super("All generators threw exceptions"); + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/exceptions/NoMoreTasksException.java b/lab-01/src/by/dudkoandrei/quizer/exceptions/NoMoreTasksException.java new file mode 100644 index 0000000..a7ee9b1 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/exceptions/NoMoreTasksException.java @@ -0,0 +1,8 @@ +package by.dudkoandrei.quizer.exceptions; + +public class NoMoreTasksException extends RuntimeException { + + public NoMoreTasksException() { + super("No more tasks"); + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/exceptions/QuizFinishedException.java b/lab-01/src/by/dudkoandrei/quizer/exceptions/QuizFinishedException.java new file mode 100644 index 0000000..31dd763 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/exceptions/QuizFinishedException.java @@ -0,0 +1,8 @@ +package by.dudkoandrei.quizer.exceptions; + +public class QuizFinishedException extends RuntimeException { + + public QuizFinishedException() { + super("Quiz is finished"); + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/exceptions/QuizNotFinishedException.java b/lab-01/src/by/dudkoandrei/quizer/exceptions/QuizNotFinishedException.java new file mode 100644 index 0000000..b166049 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/exceptions/QuizNotFinishedException.java @@ -0,0 +1,8 @@ +package by.dudkoandrei.quizer.exceptions; + +public class QuizNotFinishedException extends RuntimeException { + + public QuizNotFinishedException() { + super("Quiz is not finished"); + } +} diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java index 1d09a32..ee50e68 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java @@ -1,5 +1,6 @@ package by.dudkoandrei.quizer.task_generators; +import by.dudkoandrei.quizer.exceptions.GeneratorsFailedException; import by.dudkoandrei.quizer.tasks.Task; import by.dudkoandrei.quizer.tasks.Task.Generator; import java.util.ArrayList; @@ -31,13 +32,13 @@ public class GroupTaskGenerator implements Task.Generator { */ GroupTaskGenerator(Collection generators) { if (generators == null) { - // exception + throw new IllegalArgumentException("generators is null"); } if (generators.isEmpty()) { - // exception + throw new IllegalArgumentException("generators is empty"); } if (generators.contains(null)) { - // exception + throw new IllegalArgumentException("generators contains null"); } this.generators = new ArrayList<>(generators); @@ -50,6 +51,7 @@ public class GroupTaskGenerator implements Task.Generator { */ public Task generate() { Collections.shuffle(generators); + try { for (Generator generator : generators) { return generator.generate(); @@ -57,6 +59,6 @@ public Task generate() { } catch (Exception ignored) { } - throw new RuntimeException(""); + throw new GeneratorsFailedException(); } } diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java index 530c17f..a969f4d 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java @@ -1,5 +1,6 @@ package by.dudkoandrei.quizer.task_generators; +import by.dudkoandrei.quizer.exceptions.NoMoreTasksException; import by.dudkoandrei.quizer.tasks.Task; import java.util.ArrayList; import java.util.Arrays; @@ -36,13 +37,13 @@ public class PoolTaskGenerator implements Task.Generator { */ PoolTaskGenerator(boolean allowDuplicate, Collection tasks) { if (tasks == null) { - // exception + throw new IllegalArgumentException("tasks is null"); } if (tasks.isEmpty()) { - // exception + throw new IllegalArgumentException("tasks is empty"); } if (tasks.contains(null)) { - // exception + throw new IllegalArgumentException("tasks contains null"); } this.allowDuplicate = allowDuplicate; @@ -62,7 +63,7 @@ public Task generate() { } if (currentPosition == tasks.size()) { - // exception; + throw new NoMoreTasksException(); } return tasks.get(currentPosition++); diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java index 0ca92ac..1132680 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java @@ -17,10 +17,10 @@ class TextTask implements Task { */ TextTask(String text, String answer) { if (text == null || answer == null) { - // exception + throw new IllegalArgumentException("Arguments shouldn't be null"); } if (text.isEmpty() || answer.isEmpty()) { - // exception + throw new IllegalArgumentException("Arguments shouldn't be empty"); } this.text = text; @@ -35,7 +35,7 @@ public String getText() { @Override public Result validate(String answer) { if (answer == null) { - // exception + throw new IllegalArgumentException("answer is null"); } if (answer.isEmpty()) { diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index aacb0a3..ebdc3c6 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -16,7 +16,7 @@ public abstract class AbstractMathTask implements MathTask { AbstractMathTask(double answer, int precision) { if (precision < 0) { - // exception + throw new IllegalArgumentException("precision is negative"); } this.answer = answer; @@ -30,7 +30,7 @@ static boolean isDoubleEqual(double lhs, double rhs, double eps) { static double truncate(double number, int precision) { if (precision < 0) { - // exception + throw new IllegalArgumentException("precision is negative"); } double scale = Math.pow(10, precision); @@ -81,16 +81,16 @@ abstract static class Generator implements MathTask.Generator { int precision, EnumSet operations) { if (operations == null) { - // exception + throw new IllegalArgumentException("operations is null"); } if (operations.isEmpty()) { - // exception + throw new IllegalArgumentException("operations is empty"); } if (minNumber > maxNumber) { - // exception + throw new IllegalArgumentException("minNumber is greater that maxNumber"); } if (precision < 0) { - // exception + throw new IllegalArgumentException("precision is negative"); } this.minNumber = minNumber; From 913ebbed7bb348c84713464a43e5f1a6e072572a Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 16:45:36 +0300 Subject: [PATCH 16/24] Make TextTask class public --- lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java index 1132680..9f345f7 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java @@ -6,7 +6,7 @@ * Задание с заранее заготовленным текстом. Можно использовать {@link PoolTaskGenerator}, чтобы * задавать задания такого типа. */ -class TextTask implements Task { +public class TextTask implements Task { private final String text; private final String answer; @@ -15,7 +15,7 @@ class TextTask implements Task { * @param text текст задания * @param answer ответ на задание */ - TextTask(String text, String answer) { + public TextTask(String text, String answer) { if (text == null || answer == null) { throw new IllegalArgumentException("Arguments shouldn't be null"); } From 504603f75ea631fc6e375115029b55054c3f2050 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 16:46:15 +0300 Subject: [PATCH 17/24] Refactor switches in MathTask class --- .../quizer/tasks/math_tasks/MathTask.java | 82 +++++-------------- 1 file changed, 20 insertions(+), 62 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java index bbaeb9c..72bef9e 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/MathTask.java @@ -39,75 +39,33 @@ enum Operation { MULTIPLY; double compute(double lhs, double rhs) { - switch (this) { - case ADD -> { - return lhs + rhs; - } - case SUBTRACT -> { - return lhs - rhs; - } - case MULTIPLY -> { - return lhs * rhs; - } - case DIVIDE -> { - return lhs / rhs; - } - default -> { - return 0; - // exception - } - } + return switch (this) { + case ADD -> lhs + rhs; + case SUBTRACT -> lhs - rhs; + case MULTIPLY -> lhs * rhs; + case DIVIDE -> lhs / rhs; + }; } @Override public String toString() { - switch (this) { - case ADD -> { - return "+"; - } - case SUBTRACT -> { - return "-"; - } - case MULTIPLY -> { - return "*"; - } - case DIVIDE -> { - return "/"; - } - default -> { - // exception - } - } - return ""; + return switch (this) { + case ADD -> "+"; + case SUBTRACT -> "-"; + case MULTIPLY -> "*"; + case DIVIDE -> "/"; + }; } double solve(double firstNumber, double secondNumber, boolean isFirstNumberUnknown) { - switch (this) { - case ADD -> { - return secondNumber - firstNumber; - } - case MULTIPLY -> { - return secondNumber / firstNumber; - } - case SUBTRACT -> { - if (isFirstNumberUnknown) { - return secondNumber + firstNumber; - } else { - return firstNumber - secondNumber; - } - } - case DIVIDE -> { - if (isFirstNumberUnknown) { - return firstNumber * secondNumber; - } else { - return firstNumber / secondNumber; - } - } - default -> { - return 0; - // exception - } - } + return switch (this) { + case ADD -> secondNumber - firstNumber; + case MULTIPLY -> secondNumber / firstNumber; + case SUBTRACT -> + isFirstNumberUnknown ? secondNumber + firstNumber : firstNumber - secondNumber; + case DIVIDE -> + isFirstNumberUnknown ? firstNumber * secondNumber : firstNumber / secondNumber; + }; } } } From f751caaf06f884abb3904a4bd0783515138b2304 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 21:53:21 +0300 Subject: [PATCH 18/24] Fix GroupTaskGenerator.generate and make constructors public --- .../quizer/task_generators/GroupTaskGenerator.java | 10 +++++----- .../quizer/task_generators/PoolTaskGenerator.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java index ee50e68..a42fcc4 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java @@ -20,7 +20,7 @@ public class GroupTaskGenerator implements Task.Generator { * * @param generators генераторы, которые в конструктор передаются через запятую */ - GroupTaskGenerator(Task.Generator... generators) { + public GroupTaskGenerator(Task.Generator... generators) { this(Arrays.asList(generators)); } @@ -30,7 +30,7 @@ public class GroupTaskGenerator implements Task.Generator { * @param generators генераторы, которые передаются в конструктор в Collection (например, * {@link ArrayList}) */ - GroupTaskGenerator(Collection generators) { + public GroupTaskGenerator(Collection generators) { if (generators == null) { throw new IllegalArgumentException("generators is null"); } @@ -52,11 +52,11 @@ public class GroupTaskGenerator implements Task.Generator { public Task generate() { Collections.shuffle(generators); - try { - for (Generator generator : generators) { + for (Generator generator : generators) { + try { return generator.generate(); + } catch (Exception ignored) { } - } catch (Exception ignored) { } throw new GeneratorsFailedException(); diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java index a969f4d..a6f87ee 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java @@ -24,7 +24,7 @@ public class PoolTaskGenerator implements Task.Generator { * @param allowDuplicate разрешить повторения * @param tasks задания, которые в конструктор передаются через запятую */ - PoolTaskGenerator(boolean allowDuplicate, Task... tasks) { + public PoolTaskGenerator(boolean allowDuplicate, Task... tasks) { this(allowDuplicate, Arrays.asList(tasks)); } @@ -35,7 +35,7 @@ public class PoolTaskGenerator implements Task.Generator { * @param tasks задания, которые передаются в конструктор в Collection (например, * {@link LinkedList}) */ - PoolTaskGenerator(boolean allowDuplicate, Collection tasks) { + public PoolTaskGenerator(boolean allowDuplicate, Collection tasks) { if (tasks == null) { throw new IllegalArgumentException("tasks is null"); } From a3967d2b9c72deccf0f753593d95322fdda65604 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 22:12:54 +0300 Subject: [PATCH 19/24] Fix some cases with integer division --- .../quizer/tasks/math_tasks/EquationTask.java | 10 +++++++++- .../quizer/tasks/math_tasks/ExpressionTask.java | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java index 4020ed8..4e61913 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/EquationTask.java @@ -70,12 +70,20 @@ public EquationTask generate() { } if (isFirstNumberUnknown && operation == Operation.DIVIDE && isDoubleEqual(firstNumber, 0.0, eps)) { - operation = Operation.ADD; + operation = Operation.SUBTRACT; } if (!isFirstNumberUnknown && operation == Operation.DIVIDE && isDoubleEqual(secondNumber, 0.0, eps)) { operation = Operation.ADD; } + if (precision == 0 && operation == Operation.MULTIPLY + && (int) secondNumber % (int) firstNumber != 0) { + operation = Operation.SUBTRACT; + } + if (precision == 0 && !isFirstNumberUnknown && operation == Operation.DIVIDE + && (int) firstNumber % (int) secondNumber != 0) { + operation = Operation.ADD; + } return new EquationTask(firstNumber, secondNumber, precision, isFirstNumberUnknown, operation); diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java index ad37465..641b753 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/ExpressionTask.java @@ -58,6 +58,10 @@ public ExpressionTask generate() { && isDoubleEqual(secondNumber, 0.0, Math.pow(0.1, precision))) { operation = Operation.MULTIPLY; } + if (precision == 0 && operation == Operation.DIVIDE + && (int) firstNumber % (int) secondNumber != 0) { + operation = Operation.MULTIPLY; + } return new ExpressionTask(firstNumber, secondNumber, precision, operation); } From a3d5646297db5a588f95edd2dff6920552a1a404 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 22:22:37 +0300 Subject: [PATCH 20/24] Fix minor problems --- .../quizer/task_generators/GroupTaskGenerator.java | 4 ++-- .../dudkoandrei/quizer/task_generators/PoolTaskGenerator.java | 1 + lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java | 3 ++- .../dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java | 4 +--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java index a42fcc4..1a3d915 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java @@ -16,7 +16,7 @@ public class GroupTaskGenerator implements Task.Generator { private final ArrayList generators; /** - * Конструктор с переменным числом аргументов + * Конструктор с переменным числом аргументов. * * @param generators генераторы, которые в конструктор передаются через запятую */ @@ -25,7 +25,7 @@ public GroupTaskGenerator(Task.Generator... generators) { } /** - * Конструктор, который принимает коллекцию генераторов + * Конструктор, который принимает коллекцию генераторов. * * @param generators генераторы, которые передаются в конструктор в Collection (например, * {@link ArrayList}) diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java index a6f87ee..f37229c 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.LinkedList; import java.util.Random; /** diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java index 9f345f7..e5bc38a 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/TextTask.java @@ -1,6 +1,7 @@ package by.dudkoandrei.quizer.tasks; import by.dudkoandrei.quizer.Result; +import by.dudkoandrei.quizer.task_generators.PoolTaskGenerator; /** * Задание с заранее заготовленным текстом. Можно использовать {@link PoolTaskGenerator}, чтобы @@ -48,4 +49,4 @@ public Result validate(String answer) { return Result.WRONG; } } -} \ No newline at end of file +} diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index ebdc3c6..a53717a 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -9,7 +9,6 @@ public abstract class AbstractMathTask implements MathTask { protected final double answer; - protected final int precision; protected final double eps; protected String text; protected static final DecimalFormat df = new DecimalFormat(); @@ -20,7 +19,6 @@ public abstract class AbstractMathTask implements MathTask { } this.answer = answer; - this.precision = precision; this.eps = Math.pow(0.1, precision); } @@ -66,7 +64,7 @@ abstract static class Generator implements MathTask.Generator { protected final double maxNumber; protected final int precision; protected final EnumSet allowedOperations; - protected static Random rnd = new Random(); + protected static final Random rnd = new Random(); Generator( double minNumber, From f69fa097d0e2ef0b585472e27050093f25f4e24f Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Tue, 29 Nov 2022 22:22:50 +0300 Subject: [PATCH 21/24] Add quizzes --- lab-01/src/by/dudkoandrei/quizer/Main.java | 57 ++++++++++++++++++- .../EquationTaskGeneratorConstants.java | 19 +++++++ .../ExpressionTaskGeneratorConstants.java | 19 +++++++ .../constants/TextGeneratorConstats.java | 26 +++++++++ 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 lab-01/src/by/dudkoandrei/quizer/constants/EquationTaskGeneratorConstants.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/constants/ExpressionTaskGeneratorConstants.java create mode 100644 lab-01/src/by/dudkoandrei/quizer/constants/TextGeneratorConstats.java diff --git a/lab-01/src/by/dudkoandrei/quizer/Main.java b/lab-01/src/by/dudkoandrei/quizer/Main.java index b0f58e0..e51952a 100644 --- a/lab-01/src/by/dudkoandrei/quizer/Main.java +++ b/lab-01/src/by/dudkoandrei/quizer/Main.java @@ -1,6 +1,12 @@ package by.dudkoandrei.quizer; +import by.dudkoandrei.quizer.constants.EquationTaskGeneratorConstants; +import by.dudkoandrei.quizer.constants.ExpressionTaskGeneratorConstants; +import by.dudkoandrei.quizer.constants.TextGeneratorConstats; +import by.dudkoandrei.quizer.task_generators.GroupTaskGenerator; +import java.util.HashMap; import java.util.Map; +import java.util.Scanner; public class Main { @@ -9,10 +15,59 @@ public class Main { * {@link Quiz} */ static Map getQuizMap() { + Map quizMap = new HashMap<>(); + quizMap.put("Text Quiz", new Quiz(TextGeneratorConstats.generator, 3)); + quizMap.put("Integer equations", new Quiz(EquationTaskGeneratorConstants.integerGenerator, 10)); + quizMap.put("Equations", new Quiz(EquationTaskGeneratorConstants.generator, 10)); + quizMap.put("Integer expressions", + new Quiz(ExpressionTaskGeneratorConstants.integerGenerator, 10)); + quizMap.put("Expressions", new Quiz(ExpressionTaskGeneratorConstants.generator, 10)); + quizMap.put("All tasks", new Quiz( + new GroupTaskGenerator(TextGeneratorConstats.generator, + EquationTaskGeneratorConstants.integerGenerator, + EquationTaskGeneratorConstants.generator, + ExpressionTaskGeneratorConstants.integerGenerator, + ExpressionTaskGeneratorConstants.generator), 20)); + + return quizMap; } public static void main(String[] args) { - // ... + Scanner scanner = new Scanner(System.in); + + var quizMap = getQuizMap(); + + System.out.println("Available quizzes:"); + + for (var name : quizMap.keySet()) { + System.out.println(name); + } + + System.out.println("Select quiz:"); + + String name = scanner.nextLine(); + while (!quizMap.containsKey(name)) { + System.out.println("No such quiz. Try again"); + name = scanner.nextLine(); + } + + Quiz quiz = quizMap.get(name); + + System.out.println("Quiz: \"" + name + "\" started"); + while (!quiz.isFinished()) { + System.out.println(quiz.nextTask().getText()); + + String answer = scanner.nextLine(); + Result result = quiz.provideAnswer(answer); + + System.out.println(result + "\n"); + } + + System.out.println("Quiz ended"); + System.out.println("Your score: " + quiz.getMark() * 10); + System.out.println("Correct answers: " + quiz.getCorrectAnswerNumber()); + System.out.println("Wrong answers: " + quiz.getWrongAnswerNumber()); + System.out.println("Incorrect input: " + quiz.getIncorrectInputNumber()); } } diff --git a/lab-01/src/by/dudkoandrei/quizer/constants/EquationTaskGeneratorConstants.java b/lab-01/src/by/dudkoandrei/quizer/constants/EquationTaskGeneratorConstants.java new file mode 100644 index 0000000..aa76ddd --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/constants/EquationTaskGeneratorConstants.java @@ -0,0 +1,19 @@ +package by.dudkoandrei.quizer.constants; + +import by.dudkoandrei.quizer.tasks.Task.Generator; +import by.dudkoandrei.quizer.tasks.math_tasks.EquationTask; +import by.dudkoandrei.quizer.tasks.math_tasks.MathTask.Operation; +import java.util.EnumSet; + +public class EquationTaskGeneratorConstants { + + public static final Generator generator = new EquationTask.Generator( + 0, + 25, + 4, + EnumSet.allOf(Operation.class)); + public static final Generator integerGenerator = new EquationTask.Generator( + 0, + 25, + EnumSet.allOf(Operation.class)); +} diff --git a/lab-01/src/by/dudkoandrei/quizer/constants/ExpressionTaskGeneratorConstants.java b/lab-01/src/by/dudkoandrei/quizer/constants/ExpressionTaskGeneratorConstants.java new file mode 100644 index 0000000..4a0bde9 --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/constants/ExpressionTaskGeneratorConstants.java @@ -0,0 +1,19 @@ +package by.dudkoandrei.quizer.constants; + +import by.dudkoandrei.quizer.tasks.Task.Generator; +import by.dudkoandrei.quizer.tasks.math_tasks.ExpressionTask; +import by.dudkoandrei.quizer.tasks.math_tasks.MathTask.Operation; +import java.util.EnumSet; + +public class ExpressionTaskGeneratorConstants { + + public static final Generator generator = new ExpressionTask.Generator( + 0, + 25, + 4, + EnumSet.allOf(Operation.class)); + public static final Generator integerGenerator = new ExpressionTask.Generator( + 0, + 25, + EnumSet.allOf(Operation.class)); +} diff --git a/lab-01/src/by/dudkoandrei/quizer/constants/TextGeneratorConstats.java b/lab-01/src/by/dudkoandrei/quizer/constants/TextGeneratorConstats.java new file mode 100644 index 0000000..3fc3f9d --- /dev/null +++ b/lab-01/src/by/dudkoandrei/quizer/constants/TextGeneratorConstats.java @@ -0,0 +1,26 @@ +package by.dudkoandrei.quizer.constants; + +import by.dudkoandrei.quizer.task_generators.PoolTaskGenerator; +import by.dudkoandrei.quizer.tasks.Task.Generator; +import by.dudkoandrei.quizer.tasks.TextTask; + +public class TextGeneratorConstats { + + public static final Generator generator = new PoolTaskGenerator( + false, + new TextTask("Fill in the blank: \"_____. I'm your father.\"\n" + + "a) Luke\n" + + "b) Boy\n" + + "c) Skywalker\n" + + "d) No", "d"), + new TextTask("Mace Windu light-saber color?\n" + + "a) Red\n" + + "b) Purple\n" + + "c) Green\n" + + "d) Blue", "b"), + new TextTask("What species of alien is Yoda?\n" + + "a) Ortolan\n" + + "b) Human\n" + + "c) Unknown\n" + + "d) Gungan", "c")); +} From 822abe300e5d5c0d846d42cc6e163a916bdf22fc Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Wed, 7 Dec 2022 10:46:35 +0300 Subject: [PATCH 22/24] Refactor AbstractMathTask.Generator.getRandomDouble method --- .../quizer/tasks/math_tasks/AbstractMathTask.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java index a53717a..2c400f8 100644 --- a/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java +++ b/lab-01/src/by/dudkoandrei/quizer/tasks/math_tasks/AbstractMathTask.java @@ -98,7 +98,11 @@ abstract static class Generator implements MathTask.Generator { } double getRandomDouble() { - return truncate(rnd.nextDouble(minNumber, maxNumber + Double.MIN_VALUE), precision); + try { + return truncate(rnd.nextDouble(minNumber, maxNumber), precision); + } catch (IllegalArgumentException e) { + return truncate(minNumber, precision); + } } Operation getRandomOperation() { From f142e48b9b742ead89d34ef53107f0d2b91caa0c Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Wed, 7 Dec 2022 10:57:21 +0300 Subject: [PATCH 23/24] Fix PoolTaskGenerator constructor --- .../quizer/task_generators/GroupTaskGenerator.java | 3 ++- .../quizer/task_generators/PoolTaskGenerator.java | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java index 1a3d915..f145e18 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java @@ -7,13 +7,14 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.List; /** * Task.Generator, который позволяет объединить несколько других Task.Generator. */ public class GroupTaskGenerator implements Task.Generator { - private final ArrayList generators; + private final List generators; /** * Конструктор с переменным числом аргументов. diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java index f37229c..9681ad1 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/PoolTaskGenerator.java @@ -7,14 +7,16 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedList; +import java.util.List; import java.util.Random; +import java.util.stream.Collectors; /** * Task.Generator, который отдает задания из заранее заготовленного набора. */ public class PoolTaskGenerator implements Task.Generator { - private final ArrayList tasks; + private final List tasks; private final boolean allowDuplicate; private int currentPosition = 0; private static final Random rnd = new Random(); @@ -48,11 +50,14 @@ public PoolTaskGenerator(boolean allowDuplicate, Collection tasks) { } this.allowDuplicate = allowDuplicate; - this.tasks = new ArrayList<>(tasks); if (!allowDuplicate) { - Collections.shuffle(this.tasks); + this.tasks = tasks.stream().distinct().collect(Collectors.toList()); + } else { + this.tasks = new ArrayList<>(tasks); } + + Collections.shuffle(this.tasks); } /** From 2224cf5d2ec49bd89dac3f9ca228343d18166087 Mon Sep 17 00:00:00 2001 From: DudkoAndrei Date: Wed, 7 Dec 2022 11:24:10 +0300 Subject: [PATCH 24/24] Refactor GroupTaskGenerator.generate method --- .../task_generators/GroupTaskGenerator.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java index f145e18..c987ebd 100644 --- a/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java +++ b/lab-01/src/by/dudkoandrei/quizer/task_generators/GroupTaskGenerator.java @@ -15,6 +15,7 @@ public class GroupTaskGenerator implements Task.Generator { private final List generators; + private int lastGeneratorIndex = 0; /** * Конструктор с переменным числом аргументов. @@ -43,6 +44,8 @@ public GroupTaskGenerator(Collection generators) { } this.generators = new ArrayList<>(generators); + + Collections.shuffle(this.generators); } /** @@ -51,15 +54,20 @@ public GroupTaskGenerator(Collection generators) { * исключение, то и тут выбрасывается исключение. */ public Task generate() { - Collections.shuffle(generators); - - for (Generator generator : generators) { + for (int offset = 1; offset <= generators.size(); ++offset) { try { - return generator.generate(); + int index = getGeneratorIndex(offset); + Task t = generators.get(index).generate(); + lastGeneratorIndex = index; + return t; } catch (Exception ignored) { } } throw new GeneratorsFailedException(); } + + private int getGeneratorIndex(int offset) { + return (lastGeneratorIndex + offset) % generators.size(); + } }