From 458cc0e01a40b2050cc5bf13ab06a8dd1c5da031 Mon Sep 17 00:00:00 2001 From: Philip Maslov Date: Wed, 5 Feb 2025 01:37:18 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D1=82=D0=BB=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/Archive.kt | 3 + src/main/kotlin/Input.kt | 45 +++++++++++++++ src/main/kotlin/Main.kt | 8 ++- src/main/kotlin/MainScreen.kt | 104 ++++++++++++++++++++++++++++++++++ src/main/kotlin/Note.kt | 2 + src/main/kotlin/ScreenNote.kt | 3 + src/main/kotlin/Selectable.kt | 3 + 7 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/Archive.kt create mode 100644 src/main/kotlin/Input.kt create mode 100644 src/main/kotlin/MainScreen.kt create mode 100644 src/main/kotlin/Note.kt create mode 100644 src/main/kotlin/ScreenNote.kt create mode 100644 src/main/kotlin/Selectable.kt diff --git a/src/main/kotlin/Archive.kt b/src/main/kotlin/Archive.kt new file mode 100644 index 00000000..072db7f5 --- /dev/null +++ b/src/main/kotlin/Archive.kt @@ -0,0 +1,3 @@ +class Archive(override val name: String) : Selectable { + var notes = arrayListOf() +} \ No newline at end of file diff --git a/src/main/kotlin/Input.kt b/src/main/kotlin/Input.kt new file mode 100644 index 00000000..cb0abb79 --- /dev/null +++ b/src/main/kotlin/Input.kt @@ -0,0 +1,45 @@ +import java.util.Scanner + +class Input { + companion object { + var scanner = Scanner(System.`in`) + + fun intInput(menuSize: Int): Int { + var input = -1 + + do { + try { + println("Введите номер пункта меню:") + input = scanner.nextLine().toInt() + if (input > menuSize) { + println("Такой пункт отсутствует") + input = -11 + } + } catch (e: Exception) { + println("Необоходимо ввести число.") + } + } while (input == -1) + return input + } + + fun textInput(prompt: String, maxLength: Int): String { + + var input = "" + val max = maxLength + + do { + println(prompt) + input = scanner.nextLine().trim() + when (input.length) { + in 1..max -> return input + in 0..0 -> println("Значение не может быть пустым") + else -> { + println("Введено слишком длинное значение") + input = "" + } + } + } while (input == "") + return input + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c5..45714c11 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,9 @@ fun main(args: Array) { - println("Hello World!") + var flag = 1 + + val screen = MainScreen() + do { + screen.showMenu() + if (MainScreen.isExit) flag = 0 + } while (flag == 1) } \ No newline at end of file diff --git a/src/main/kotlin/MainScreen.kt b/src/main/kotlin/MainScreen.kt new file mode 100644 index 00000000..0fae39f0 --- /dev/null +++ b/src/main/kotlin/MainScreen.kt @@ -0,0 +1,104 @@ +class MainScreen() { + + private var screenType = ARCHIVE + private val data = mutableMapOf>() + private lateinit var active: Archive //ссылка на архив для экрана с записями + + fun showMenu() { + val caption = "_______ Меню ${screenType[2].lowercase()} _______" + val firstItem = "Создать ${screenType[1].lowercase()}" + val lastItem = "Выйти" + var input = 0 + var num = 0 + val dataItems = if (screenType == ARCHIVE) data.keys.toList() else active.notes.toList() + + println(caption) + println("$num. $firstItem") + for (item in dataItems) { + println("${++num}. \"${item.name}\"") + } + println("${++num}. ${lastItem}") + println("---------------") + + input = Input.intInput(num) + select(dataItems, input, num) + } + + private fun select(dataItems: List, input: Int, menuSize: Int) { + if (menuSize > 1) { + when (input) { + 0 -> create() + in 1 until menuSize -> { + if (screenType == ARCHIVE) { + active = dataItems[input - 1] as Archive + screenType = NOTE + } else { + showNote(dataItems[input - 1] as Note) + } + } + + menuSize -> { + if (screenType == NOTE) { + screenType = ARCHIVE + } else { + isExit = true + } + } + } + } else { + when (input) { + 0 -> create() + 1 -> { + if (screenType == NOTE) { + screenType = ARCHIVE + } else { + isExit = true + } + } + } + } + } + + private fun create() { + println("Процедура создания ${screenType[2].lowercase()}") + + val name = Input.textInput( + "Введите название ${screenType[2].lowercase()}}:\n(не более $NAME_MAX_LENGTH символов)", + NAME_MAX_LENGTH + ) + + when (screenType) { + ARCHIVE -> { + val archive = Archive(name) + data.put(archive, archive.notes) + } + + NOTE -> { + val text = Input.textInput( + "Введите текст ${NOTE[2].lowercase()}:\n(не более $TEXT_MAX_LENGTH символа)", + TEXT_MAX_LENGTH + ) + val note = Note(name, text) + active.notes.add(note) + } + } + } + + private fun showNote(note: Note) { + println("====== Просмотр записи ${note.name} ======") + println("Содержимое записи:") + println("${note.text}") + println("====== Конец ======") + println("\nВведите любой символ, чтобы вернуться в меню...") + Input.scanner.nextLine() + } + + companion object { + const val NAME_MAX_LENGTH = 32 + const val TEXT_MAX_LENGTH = 1024 + val ARCHIVE = listOf("Архив", "Архива", "Архивов") + val NOTE = listOf("Запись", "Записи", "Записей") + var isExit = false + + } +} \ No newline at end of file diff --git a/src/main/kotlin/Note.kt b/src/main/kotlin/Note.kt new file mode 100644 index 00000000..d30403a5 --- /dev/null +++ b/src/main/kotlin/Note.kt @@ -0,0 +1,2 @@ +class Note(override val name: String, val text: String) : Selectable { +} \ No newline at end of file diff --git a/src/main/kotlin/ScreenNote.kt b/src/main/kotlin/ScreenNote.kt new file mode 100644 index 00000000..881e3bd2 --- /dev/null +++ b/src/main/kotlin/ScreenNote.kt @@ -0,0 +1,3 @@ +class ScreenNote { + +} \ No newline at end of file diff --git a/src/main/kotlin/Selectable.kt b/src/main/kotlin/Selectable.kt new file mode 100644 index 00000000..1aa7a0fe --- /dev/null +++ b/src/main/kotlin/Selectable.kt @@ -0,0 +1,3 @@ +interface Selectable { + val name: String +} \ No newline at end of file From 285a3acc46ff27146576695244b9e8485081b695 Mon Sep 17 00:00:00 2001 From: Philip Maslov Date: Wed, 5 Feb 2025 09:56:22 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=BB=D0=B2?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/Input.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/Input.kt b/src/main/kotlin/Input.kt index cb0abb79..2fa11069 100644 --- a/src/main/kotlin/Input.kt +++ b/src/main/kotlin/Input.kt @@ -13,12 +13,12 @@ class Input { input = scanner.nextLine().toInt() if (input > menuSize) { println("Такой пункт отсутствует") - input = -11 + input = -1 } } catch (e: Exception) { println("Необоходимо ввести число.") } - } while (input == -1) + } while (input < 0) return input } From c6fc4e610d58df87236f74a8a5be0504d956095e Mon Sep 17 00:00:00 2001 From: Philip Maslov Date: Sun, 9 Feb 2025 19:29:33 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=B8=D0=BD=D0=BE=D1=80=D0=BD=D1=8B=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D1=80=D0=B5=D1=83=D0=B7=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0?= =?UTF-8?q?=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/Main.kt | 5 ++--- src/main/kotlin/MainScreen.kt | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 45714c11..b3f71076 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,9 +1,8 @@ fun main(args: Array) { - var flag = 1 val screen = MainScreen() do { screen.showMenu() - if (MainScreen.isExit) flag = 0 - } while (flag == 1) + if (screen.isExit) break + } while (true) } \ No newline at end of file diff --git a/src/main/kotlin/MainScreen.kt b/src/main/kotlin/MainScreen.kt index 0fae39f0..01260b40 100644 --- a/src/main/kotlin/MainScreen.kt +++ b/src/main/kotlin/MainScreen.kt @@ -1,10 +1,11 @@ class MainScreen() { - private var screenType = ARCHIVE private val data = mutableMapOf>() + var isExit = false + private lateinit var active: Archive //ссылка на архив для экрана с записями - fun showMenu() { + fun showMenu(screenType: List = this.screenType) { val caption = "_______ Меню ${screenType[2].lowercase()} _______" val firstItem = "Создать ${screenType[1].lowercase()}" val lastItem = "Выйти" @@ -98,7 +99,5 @@ class MainScreen() { const val TEXT_MAX_LENGTH = 1024 val ARCHIVE = listOf("Архив", "Архива", "Архивов") val NOTE = listOf("Запись", "Записи", "Записей") - var isExit = false - } } \ No newline at end of file