From 8cc1a36579e42cd534e93943311ef520cf4451c7 Mon Sep 17 00:00:00 2001 From: neret Date: Wed, 25 Mar 2026 23:29:54 +0400 Subject: [PATCH 1/2] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/caches/deviceStreaming.xml | 1550 ++++++++++++++++++++++++++++++ .idea/markdown.xml | 8 + .idea/misc.xml | 2 +- src/main/kotlin/Archive.kt | 3 + src/main/kotlin/ArchiveMenu.kt | 51 + src/main/kotlin/Main.kt | 6 +- src/main/kotlin/Menu.kt | 37 + src/main/kotlin/MenuItem.kt | 5 + src/main/kotlin/Note.kt | 1 + src/main/kotlin/NoteMenu.kt | 55 ++ src/main/kotlin/NoteView.kt | 13 + 11 files changed, 1728 insertions(+), 3 deletions(-) create mode 100644 .idea/caches/deviceStreaming.xml create mode 100644 .idea/markdown.xml create mode 100644 src/main/kotlin/Archive.kt create mode 100644 src/main/kotlin/ArchiveMenu.kt create mode 100644 src/main/kotlin/Menu.kt create mode 100644 src/main/kotlin/MenuItem.kt create mode 100644 src/main/kotlin/Note.kt create mode 100644 src/main/kotlin/NoteMenu.kt create mode 100644 src/main/kotlin/NoteView.kt diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 000000000..6a3e9f5d9 --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,1550 @@ + + + + + + \ No newline at end of file diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 000000000..c61ea3346 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9c8e74009..1945ce5fd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/Archive.kt b/src/main/kotlin/Archive.kt new file mode 100644 index 000000000..e33c452c6 --- /dev/null +++ b/src/main/kotlin/Archive.kt @@ -0,0 +1,3 @@ +class Archive(val name: String) { + val notes: MutableList = mutableListOf() +} \ No newline at end of file diff --git a/src/main/kotlin/ArchiveMenu.kt b/src/main/kotlin/ArchiveMenu.kt new file mode 100644 index 000000000..cf5638621 --- /dev/null +++ b/src/main/kotlin/ArchiveMenu.kt @@ -0,0 +1,51 @@ +import java.util.Scanner + +class ArchiveMenu(private val archives: MutableList) { + + fun show() { + val menuItems = mutableListOf() + + menuItems.add(MenuItem( + name = "Создать архив", + action = { + createArchive() + show() + } + )) + + archives.forEach { archive -> + menuItems.add(MenuItem( + name = archive.name, + action = { + NoteMenu(archive).show() + show() + } + )) + } + + menuItems.add(MenuItem( + name = "Выход", + action = { }, + isExit = true + )) + + Menu("Список архивов:", menuItems).show() + } + + private fun createArchive() { + println("Введите название архива:") + val name = readNonEmptyString() + archives.add(Archive(name)) + println("Архив '$name' успешно создан!") + } + + private fun readNonEmptyString(): String { + while (true) { + val input = Scanner(System.`in`).nextLine() + if (input.isNotBlank()) { + return input + } + println("Ошибка: название не может быть пустым. Попробуйте снова:") + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index aade54c57..f8434ea97 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,3 +1,5 @@ -fun main(args: Array) { - println("Hello World!") + +fun main() { + val archives = mutableListOf() + ArchiveMenu(archives).show() } \ No newline at end of file diff --git a/src/main/kotlin/Menu.kt b/src/main/kotlin/Menu.kt new file mode 100644 index 000000000..a0568b511 --- /dev/null +++ b/src/main/kotlin/Menu.kt @@ -0,0 +1,37 @@ +import java.util.Scanner + +class Menu(private val title: String, private val items: MutableList) { + + fun show() { + while (true) { + println("\n$title") + items.forEachIndexed { index, item -> + println("$index. ${item.name}") + } + + print("Выберите пункт меню: ") + val input = Scanner(System.`in`).nextLine() + + when { + !isNumber(input) -> { + println("Ошибка: введите число") + } + else -> { + val index = input.toInt() + if (index in items.indices) { + items[index].action() + if (items[index].isExit) { + break + } + } else { + println("Ошибка: пункта с номером $index не существует") + } + } + } + } + } + + private fun isNumber(str: String): Boolean { + return str.matches(Regex("\\d+")) + } +} \ No newline at end of file diff --git a/src/main/kotlin/MenuItem.kt b/src/main/kotlin/MenuItem.kt new file mode 100644 index 000000000..72cb09d8d --- /dev/null +++ b/src/main/kotlin/MenuItem.kt @@ -0,0 +1,5 @@ +class MenuItem( + val name: String, + val action: () -> Unit, + val isExit: Boolean = 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 000000000..4c0fe23e5 --- /dev/null +++ b/src/main/kotlin/Note.kt @@ -0,0 +1 @@ +class Note(val name: String, val content: String) \ No newline at end of file diff --git a/src/main/kotlin/NoteMenu.kt b/src/main/kotlin/NoteMenu.kt new file mode 100644 index 000000000..6a17f16be --- /dev/null +++ b/src/main/kotlin/NoteMenu.kt @@ -0,0 +1,55 @@ +import java.util.Scanner + +class NoteMenu(private val archive: Archive) { + + fun show() { + val menuItems = mutableListOf() + + menuItems.add(MenuItem( + name = "Создать заметку", + action = { + createNote() + show() + } + )) + + archive.notes.forEach { note -> + menuItems.add(MenuItem( + name = note.name, + action = { + NoteView(note).show() + show() + } + )) + } + + menuItems.add(MenuItem( + name = "Назад", + action = { }, + isExit = true + )) + + Menu("Архив: ${archive.name}", menuItems).show() + } + + private fun createNote() { + println("Введите название заметки:") + val name = readNonEmptyString() + + println("Введите текст заметки:") + val content = readNonEmptyString() + + archive.notes.add(Note(name, content)) + println("Заметка '$name' успешно создана!") + } + + private fun readNonEmptyString(): String { + while (true) { + val input = Scanner(System.`in`).nextLine() + if (input.isNotBlank()) { + return input + } + println("Ошибка: поле не может быть пустым. Попробуйте снова:") + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/NoteView.kt b/src/main/kotlin/NoteView.kt new file mode 100644 index 000000000..30889f85e --- /dev/null +++ b/src/main/kotlin/NoteView.kt @@ -0,0 +1,13 @@ +import java.util.Scanner + +class NoteView(private val note: Note) { + + fun show() { + println("\nЗаметка: ${note.name}") + println("=".repeat(50)) + println(note.content) + println("=".repeat(50)) + println("Нажмите Enter, чтобы вернуться...") + Scanner(System.`in`).nextLine() + } +} \ No newline at end of file From ed520dafc8d7e04980560badc534e05743e05d94 Mon Sep 17 00:00:00 2001 From: neret Date: Fri, 27 Mar 2026 22:52:55 +0400 Subject: [PATCH 2/2] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 1 - src/main/kotlin/ArchiveMenu.kt | 20 ++++++++++++-------- src/main/kotlin/Menu.kt | 20 ++++++++++++++++---- src/main/kotlin/NoteMenu.kt | 18 +++++++++++------- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 1945ce5fd..cf9058214 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/src/main/kotlin/ArchiveMenu.kt b/src/main/kotlin/ArchiveMenu.kt index cf5638621..aee990247 100644 --- a/src/main/kotlin/ArchiveMenu.kt +++ b/src/main/kotlin/ArchiveMenu.kt @@ -5,7 +5,8 @@ class ArchiveMenu(private val archives: MutableList) { fun show() { val menuItems = mutableListOf() - menuItems.add(MenuItem( + menuItems.add( + MenuItem( name = "Создать архив", action = { createArchive() @@ -14,7 +15,8 @@ class ArchiveMenu(private val archives: MutableList) { )) archives.forEach { archive -> - menuItems.add(MenuItem( + menuItems.add( + MenuItem( name = archive.name, action = { NoteMenu(archive).show() @@ -23,11 +25,13 @@ class ArchiveMenu(private val archives: MutableList) { )) } - menuItems.add(MenuItem( - name = "Выход", - action = { }, - isExit = true - )) + menuItems.add( + MenuItem( + name = "Выход", + action = { }, + isExit = true + ) + ) Menu("Список архивов:", menuItems).show() } @@ -45,7 +49,7 @@ class ArchiveMenu(private val archives: MutableList) { if (input.isNotBlank()) { return input } - println("Ошибка: название не может быть пустым. Попробуйте снова:") + println("Ошибка: поле не может быть пустым. Попробуйте снова:") } } } \ No newline at end of file diff --git a/src/main/kotlin/Menu.kt b/src/main/kotlin/Menu.kt index a0568b511..b3de3fa96 100644 --- a/src/main/kotlin/Menu.kt +++ b/src/main/kotlin/Menu.kt @@ -13,8 +13,8 @@ class Menu(private val title: String, private val items: MutableList) val input = Scanner(System.`in`).nextLine() when { - !isNumber(input) -> { - println("Ошибка: введите число") + !isValidNumber(input) -> { + println("Ошибка: введите целое число") } else -> { val index = input.toInt() @@ -31,7 +31,19 @@ class Menu(private val title: String, private val items: MutableList) } } - private fun isNumber(str: String): Boolean { - return str.matches(Regex("\\d+")) + private fun isValidNumber(str: String): Boolean { + // Проверяем, что строка не пустая и состоит только из цифр + if (str.isEmpty()) return false + // Проверяем, что все символы - цифры + for (c in str) { + if (!c.isDigit()) return false + } + // Проверяем, что число не выходит за пределы Int + try { + str.toInt() + return true + } catch (e: NumberFormatException) { + return false + } } } \ No newline at end of file diff --git a/src/main/kotlin/NoteMenu.kt b/src/main/kotlin/NoteMenu.kt index 6a17f16be..045b8d68c 100644 --- a/src/main/kotlin/NoteMenu.kt +++ b/src/main/kotlin/NoteMenu.kt @@ -5,7 +5,8 @@ class NoteMenu(private val archive: Archive) { fun show() { val menuItems = mutableListOf() - menuItems.add(MenuItem( + menuItems.add( + MenuItem( name = "Создать заметку", action = { createNote() @@ -14,7 +15,8 @@ class NoteMenu(private val archive: Archive) { )) archive.notes.forEach { note -> - menuItems.add(MenuItem( + menuItems.add( + MenuItem( name = note.name, action = { NoteView(note).show() @@ -23,11 +25,13 @@ class NoteMenu(private val archive: Archive) { )) } - menuItems.add(MenuItem( - name = "Назад", - action = { }, - isExit = true - )) + menuItems.add( + MenuItem( + name = "Назад", + action = { }, + isExit = true + ) + ) Menu("Архив: ${archive.name}", menuItems).show() }