diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml
new file mode 100644
index 00000000..81787186
--- /dev/null
+++ b/.idea/caches/deviceStreaming.xml
@@ -0,0 +1,787 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 9c8e7400..9bb64215 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..23a4dc74
--- /dev/null
+++ b/src/main/kotlin/ArchiveMenu.kt
@@ -0,0 +1,19 @@
+class ArchiveMenu(private val archives: MutableList) : Menu() {
+ override val items: List = archives
+ override val createItemText: String = "Создать архив"
+ override val menuTitle: String = "Список архивов"
+ override val exitText: String = "Выход"
+
+ override fun displayItem(item: Archive): String = item.name
+
+ override fun onCreateItem() {
+ println("\nСоздание архива")
+ val name = readNonEmptyInput("Введите название архива: ")
+ archives.add(Archive(name))
+ println("Архив '$name' создан!")
+ }
+
+ override fun onItemSelected(item: Archive) {
+ NoteMenu(item.notes, item.name).show()
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt
index aade54c5..3558ca2e 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 app = NotesApp()
+ app.start()
}
\ 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..004197be
--- /dev/null
+++ b/src/main/kotlin/Menu.kt
@@ -0,0 +1,65 @@
+abstract class Menu {
+ protected abstract val items: List
+ protected abstract val createItemText: String
+ protected abstract val menuTitle: String
+ protected abstract val exitText: String
+
+ protected abstract fun displayItem(item: T): String
+ protected abstract fun onCreateItem()
+ protected abstract fun onItemSelected(item: T)
+
+ fun show() {
+ while (true) {
+ val menuItems = mutableListOf().apply {
+ add(createItemText)
+ addAll(items.map { displayItem(it) })
+ }
+
+ println("\n$menuTitle:")
+ menuItems.forEachIndexed { index, item ->
+ println("$index. $item")
+ }
+ println("${menuItems.size}. $exitText")
+
+ when (val choice = getUserChoice(menuItems.size)) {
+ menuItems.size -> return
+ 0 -> onCreateItem()
+ else -> onItemSelected(items[choice - 1])
+ }
+ }
+ }
+
+ private fun getUserChoice(maxItem: Int): Int {
+ while (true) {
+ print("\nВыберите пункт: ")
+ val input = readlnOrNull()
+
+ if (input.isNullOrBlank()) {
+ println("Пожалуйста, введите число")
+ continue
+ }
+
+ try {
+ val choice = input.toInt()
+ if (choice in 0..maxItem) {
+ return choice
+ } else {
+ println("Число должно быть от 0 до $maxItem")
+ }
+ } catch (e: NumberFormatException) {
+ println("Пожалуйста, введите корректное число")
+ }
+ }
+ }
+
+ protected fun readNonEmptyInput(prompt: String): String {
+ while (true) {
+ print(prompt)
+ val input = readlnOrNull()?.trim()
+ if (!input.isNullOrEmpty()) {
+ return input
+ }
+ println("Поле не может быть пустым. Пожалуйста, введите значение.")
+ }
+ }
+}
\ 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..eb1f4be2
--- /dev/null
+++ b/src/main/kotlin/Models.kt
@@ -0,0 +1,3 @@
+data class Note(val title: String, val content: String)
+
+data class Archive(val name: String, val notes: MutableList = mutableListOf())
\ 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..6c0127ec
--- /dev/null
+++ b/src/main/kotlin/NoteMenu.kt
@@ -0,0 +1,26 @@
+class NoteMenu(
+ private val notes: MutableList,
+ private val archiveName: String
+) : Menu() {
+ override val items: List = notes
+ override val createItemText: String = "Создать заметку"
+ override val menuTitle: String = "Список заметок в архиве '$archiveName'"
+ override val exitText: String = "Назад"
+
+ override fun displayItem(item: Note): String = item.title
+
+ override fun onCreateItem() {
+ println("\nСоздание заметки")
+ val title = readNonEmptyInput("Введите название заметки: ")
+ val content = readNonEmptyInput("Введите текст заметки: ")
+ notes.add(Note(title, content))
+ println("Заметка '$title' создана!")
+ }
+
+ override fun onItemSelected(item: Note) {
+ println("\nЗаметка: ${item.title}")
+ println("Текст: ${item.content}")
+ println("\nНажмите Enter чтобы вернуться...")
+ readlnOrNull()
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/NotesApp.kt b/src/main/kotlin/NotesApp.kt
new file mode 100644
index 00000000..dfacfbfd
--- /dev/null
+++ b/src/main/kotlin/NotesApp.kt
@@ -0,0 +1,9 @@
+class NotesApp {
+ private val archives = mutableListOf()
+
+ fun start() {
+ println("Добро пожаловать в приложение Заметки!")
+ ArchiveMenu(archives).show()
+ println("\nДо свидания!")
+ }
+}
\ No newline at end of file