diff --git a/.idea/misc.xml b/.idea/misc.xml
index 9c8e7400..52b96137 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/ArchiveMenu.kt b/src/main/kotlin/ArchiveMenu.kt
new file mode 100644
index 00000000..8a30e626
--- /dev/null
+++ b/src/main/kotlin/ArchiveMenu.kt
@@ -0,0 +1,21 @@
+class ArchiveMenu(archives: List) : Menu(archives, "Список архивов:") {
+ override fun getDisplayName(item: Models.Archive) = item.name
+ override fun createItem(): Boolean {
+ print("Введите название архива: ")
+ val name = scanner.nextLine().trim()
+ when {
+ name.isEmpty() -> showError("Название не может быть пустым")
+ else -> {
+ items as MutableList
+ items.add(Models.Archive(name))
+ println("Архив '$name' создан")
+ }
+ }
+ return true
+ }
+
+ override fun selectItem(item: Models.Archive): Boolean {
+ NoteMenu(item.notes).show()
+ return true
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt
index aade54c5..7dbeefaf 100644
--- a/src/main/kotlin/Main.kt
+++ b/src/main/kotlin/Main.kt
@@ -1,3 +1,4 @@
-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 00000000..372825c8
--- /dev/null
+++ b/src/main/kotlin/Menu.kt
@@ -0,0 +1,42 @@
+import java.util.Scanner
+
+abstract class Menu(protected val items: List, protected val header: String) {
+ protected val scanner = Scanner(System.`in`)
+
+ open fun show() {
+ while (true) {
+ printMenu()
+ when (val input = readInput()) {
+ 0 -> if (createItem()) continue else return
+ in 1..items.size -> if (selectItem(items[input - 1])) continue else return
+ items.size + 1 -> return
+ else -> showError("Неверный пункт меню")
+ }
+ }
+ }
+
+ protected open fun printMenu() {
+ println(header)
+ println("0. Создать")
+ items.forEachIndexed { index, item -> println("${index + 1}. ${getDisplayName(item)}") }
+ println("${items.size + 1}. Выход")
+ }
+
+ protected fun readInput(): Int {
+ while (true) {
+ try {
+ return scanner.nextLine().toInt()
+ } catch (e: NumberFormatException) {
+ showError("Введите число")
+ }
+ }
+ }
+
+ protected fun showError(message: String) {
+ println("Ошибка: $message")
+ }
+
+ abstract fun getDisplayName(item: T): String
+ abstract fun createItem(): Boolean
+ abstract fun selectItem(item: T): Boolean
+}
\ No newline at end of file
diff --git a/src/main/kotlin/Models.kt b/src/main/kotlin/Models.kt
new file mode 100644
index 00000000..84b1cd75
--- /dev/null
+++ b/src/main/kotlin/Models.kt
@@ -0,0 +1,5 @@
+class Models {
+ data class Archive(val name: String, val notes: MutableList = mutableListOf())
+
+ data class Note(val title: 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 00000000..ce6e8f8c
--- /dev/null
+++ b/src/main/kotlin/NoteMenu.kt
@@ -0,0 +1,30 @@
+class NoteMenu(private val notes: MutableList) : Menu(notes, "Список заметок:") {
+ override fun getDisplayName(item: Models.Note) = item.title
+ override fun createItem(): Boolean {
+ print("Введите название заметки: ")
+ val title = scanner.nextLine().trim()
+ if (title.isEmpty()) {
+ showError("Название не может быть пустым")
+ return true
+ }
+
+ print("Введите содержание заметки: ")
+ val content = scanner.nextLine().trim()
+ if (content.isEmpty()) {
+ showError("Содержание не может быть пустым")
+ return true
+ }
+
+ notes.add(Models.Note(title, content))
+ println("Заметка '$title' создана")
+ return true
+ }
+
+ override fun selectItem(item: Models.Note): Boolean {
+ println("\n=== ${item.title} ===")
+ println(item.content)
+ println("\nНажмите Enter для возврата")
+ scanner.nextLine()
+ return true
+ }
+}
\ No newline at end of file