Advertisement
anticlown

Laba.4.1.Full(Java)

Mar 3rd, 2023
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.04 KB | None | 0 0
  1. //Main
  2. import java.io.File;
  3. import java.io.*;
  4. import java.util.Scanner;
  5.  
  6. public class Main {
  7.     private static final Scanner scan = new Scanner(System.in);
  8.     static DocumentListMenu DocumentList = new DocumentListMenu();
  9.  
  10.     public static void waitForAction() {
  11.         System.out.println("Для выхода в меню нажмите Enter...");
  12.         scan.nextLine();
  13.     }
  14.  
  15.     public static void outputProgramInfo() {
  16.         System.out.println("=======================================================================================================" + "\n" +
  17.                 "                  Добро пожаловать в программу Хранитель рефератов™!" + "\n" +
  18.                 "Данная программа позволяет хранить основную информацию о рефератах за текущий год. " + "\n" +
  19.                 "Программа дает возможность создать список рефератов и сохранить его в файл со специальном разрешением." + "\n" +
  20.                 "Также представлена возможность производить с записями о рефератах следующие операции:" + "\n" +
  21.                 "- Создание новой записи о реферате; " + "\n" +
  22.                 "- Корректировка записи о реферате;" + "\n" +
  23.                 "- Удаление записи о реферате;" + "\n" +
  24.                 "- Поиск нужных рефератов с помощью фильтров поиска;" + "\n" +
  25.                 "                 Желаем успешного и приятного пользования программой" + "\n" +
  26.                 "                                Хранитель рефератов™!" + "\n" +
  27.                 "=======================================================================================================");
  28.     }
  29.  
  30.     public static void outputHelpInfo() {
  31.         System.out.println("Справка:\n" +
  32.                         "1) Максимальная длина названия темы, фамилии - 20 символов. \n" +
  33.                         "2) Максимальное кол-во страниц реферата - 20. \n" +
  34.                         "3) Дата указывается в формате ДД.ММ.\n" +
  35.                         "4) При загрузке корректриующего файла записи добавляются к уже существующим.\n" +
  36.                         "5) !Важно: при загрузке корректирующего файла список не должен быть пустым");
  37.     }
  38.  
  39.     public static String inputPathToFile() {
  40.         boolean isIncorrect;
  41.         String path;
  42.  
  43.         System.out.println("Укажите путь к файлу: ");
  44.  
  45.         do {
  46.             isIncorrect = false;
  47.             path = scan.nextLine();
  48.             File file = new File(path);
  49.  
  50.             if (!file.exists()) {
  51.                 System.out.println("По указанному пути файл не найден! Укажите правильный путь: ");
  52.                 isIncorrect = true;
  53.             }
  54.         } while (isIncorrect);
  55.  
  56.         return path;
  57.     }
  58.  
  59.     public static Document[] inputDocumentsFromFile(String filePath){
  60.         final int MIN_PAGES = 1;
  61.         final int MAX_PAGES = 20;
  62.         Document[] documents = new Document[0];
  63.         String currentString;
  64.         boolean isIncorrect = false;
  65.  
  66.         try (BufferedReader reader = new BufferedReader(new FileReader(filePath)) ) {
  67.             while((reader.read() != -1) && !(isIncorrect)) {
  68.                 currentString = reader.readLine();
  69.                 String[] words = currentString.split(" ", 4);
  70.                 String theme = words[0];
  71.                 String surname = words[1];
  72.                 int pages = Integer.parseInt(words[2]);
  73.                 String[] dayMonthYear = words[3].split("[.]", 3);
  74.                 int day = Integer.parseInt(dayMonthYear[0].trim());
  75.                 int month = Integer.parseInt(dayMonthYear[1].trim());
  76.                 if (surname.length() > 20 || theme.length() > 20 || surname.isEmpty() || pages < MIN_PAGES || pages > MAX_PAGES ||
  77.                         theme.isEmpty() || !Date.isCorrectDate(day, month)) {
  78.                     isIncorrect = true;
  79.                     System.out.println("В файле некорректные данные!");
  80.                 } else {
  81.                     documents = DocumentList.changeCountOfDocuments(documents, documents.length + 1);
  82.                     documents[documents.length - 1] = new Document(theme, surname, pages, new Date(day, month));
  83.                 }
  84.             }
  85.             if (!isIncorrect) {
  86.                 System.out.println("Информация была успешно загружена");
  87.             }
  88.         } catch (Exception e) {
  89.             System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  90.         }
  91.         return documents;
  92.     }
  93.     public static Document[] AddDocumentsFromFile(String filePath, Document[] documents){
  94.         final int MIN_PAGES = 1;
  95.         final int MAX_PAGES = 20;
  96.         String currentString;
  97.         boolean isIncorrect = false;
  98.  
  99.         try (BufferedReader reader = new BufferedReader(new FileReader(filePath)) ) {
  100.             while((reader.read() != -1) && !(isIncorrect)) {
  101.                 currentString = reader.readLine();
  102.                 String[] words = currentString.split(" ", 4);
  103.                 String theme = words[0];
  104.                 String surname = words[1];
  105.                 int pages = Integer.parseInt(words[2]);
  106.                 String[] dayMonthYear = words[3].split("[.]", 3);
  107.                 int day = Integer.parseInt(dayMonthYear[0].trim());
  108.                 int month = Integer.parseInt(dayMonthYear[1].trim());
  109.                 if (surname.length() > 20 || theme.length() > 20 || surname.isEmpty() || pages < MIN_PAGES || pages > MAX_PAGES ||
  110.                         theme.isEmpty() || !Date.isCorrectDate(day, month)) {
  111.                     isIncorrect = true;
  112.                     System.out.println("В файле некорректные данные!");
  113.                 } else {
  114.                     documents = DocumentList.changeCountOfDocuments(documents, documents.length + 1);
  115.                     documents[documents.length - 1] = new Document(theme, surname, pages, new Date(day, month));
  116.                 }
  117.             }
  118.             if (!isIncorrect) {
  119.                 System.out.println("Информация была успешно загружена");
  120.             }
  121.         } catch (Exception e) {
  122.             System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  123.         }
  124.         return documents;
  125.     }
  126.     public static void saveToFile(Document[] documents, String filePath) {
  127.         try (PrintWriter fileOut = new PrintWriter(filePath)) {
  128.             for (Document product : documents)
  129.                 fileOut.println(product.getTheme() + " " + product.getSurname() + " " +
  130.                         product.getPages() + " " +
  131.                         product.getDate().getDay() + "." +
  132.                         product.getDate().getMonth() + "." + "2023");
  133.         } catch (Exception e) {
  134.             System.out.println("Произошла ошибка при записи в файл...");
  135.         }
  136.         System.out.println("Данные успешно сохранены в файл!");
  137.     }
  138.  
  139.     public static int inputIndex(){
  140.         final int MIN_INDEX = 1;
  141.         final int MAX_INDEX = 20;
  142.         int index = 0;
  143.         boolean isIncorrect;
  144.         System.out.println("Введите номер записи");
  145.         do {
  146.             isIncorrect = false;
  147.             try {
  148.                 index = Integer.parseInt(scan.nextLine());
  149.             } catch (Exception e){
  150.                 System.out.println("Проверьте корректность введенных данных!");
  151.                 isIncorrect = true;
  152.             }
  153.             if (!isIncorrect && (index < MIN_INDEX || index > MAX_INDEX)){
  154.                 System.out.println("Неверный номер записи!");
  155.                 isIncorrect = true;
  156.             }
  157.         } while (isIncorrect);
  158.         return index;
  159.     }
  160.  
  161.     public static String inputSurname() {
  162.         final int MAX_SIZE = 20;
  163.         String surname;
  164.         boolean isIncorrect;
  165.  
  166.         System.out.println("Введите фамилию автора. Длина не должна превышать 20 букв.");
  167.         do {
  168.             isIncorrect = false;
  169.             surname = scan.nextLine();
  170.             if (surname.length() > MAX_SIZE) {
  171.                 isIncorrect = true;
  172.                 System.out.println("Длина не должна превышать 20 букв! Повторите попытку");
  173.             }
  174.             if (surname.isEmpty()) {
  175.                 isIncorrect = true;
  176.                 System.out.println("Введите фамилию!");
  177.             }
  178.         } while (isIncorrect);
  179.  
  180.         return surname;
  181.     }
  182.  
  183.     public static String inputTheme() {
  184.         final int MAX_SIZE = 20;
  185.         String theme;
  186.         boolean isIncorrect;
  187.         System.out.println("Введите название темы. Длина не должна превышать 20 букв.");
  188.         do {
  189.             isIncorrect = false;
  190.             theme = scan.nextLine();
  191.             if (theme.length() > MAX_SIZE) {
  192.                 isIncorrect = true;
  193.                 System.out.println("Длина названия темы не должна превышать 20 букв!");
  194.             }
  195.             if (theme.isEmpty()) {
  196.                 isIncorrect = true;
  197.                 System.out.println("Введите название темы!");
  198.             }
  199.         } while (isIncorrect);
  200.         return theme;
  201.     }
  202.  
  203.     public static Integer inputPages(){
  204.         final int MIN_VALUE = 1;
  205.         final int MAX_VALUE = 20;
  206.         boolean isIncorrect;
  207.         int pages = 0;
  208.         System.out.println("Введите кол-во страниц реферата. Кол-во страниц не должно превышать 20 стр.");
  209.         do {
  210.             isIncorrect = false;
  211.             try {
  212.                 pages = Integer.parseInt(scan.nextLine());
  213.             } catch(NumberFormatException e){
  214.                 System.out.println("Проверьте корректность ввода данных!");
  215.                 isIncorrect = true;
  216.             }
  217.  
  218.             if (!isIncorrect && (pages < MIN_VALUE || pages > MAX_VALUE)) {
  219.                         System.out.println("Вы ввели некорректное количество!");
  220.                         isIncorrect = true;
  221.             }
  222.         } while (isIncorrect);
  223.  
  224.         return pages;
  225.     }
  226.  
  227.     public static Date inputDate(){
  228.         boolean isIncorrect;
  229.         int day = 0;
  230.         int month = 0;
  231.         String date;
  232.         String[] dayMonthYear;
  233.         System.out.println("Введите дату получения товара. Формат ввода - DD.MM, где DD - день, MM - месяц");
  234.         do {
  235.             isIncorrect = false;
  236.             date = scan.nextLine();
  237.             if (date.isEmpty()) {
  238.                 isIncorrect = true;
  239.                 System.out.println("Введите дату!");
  240.             }
  241.             if (!isIncorrect) {
  242.                 try {
  243.                     dayMonthYear = date.split("[.]", 2);
  244.                     day = Integer.parseInt(dayMonthYear[0].trim());
  245.                     month = Integer.parseInt(dayMonthYear[1].trim());
  246.                     if (!Date.isCorrectDate(day, month)){
  247.                         isIncorrect = true;
  248.                         System.out.println("Вы ввели некорректную дату!");
  249.                     }
  250.                 } catch (Exception e) {
  251.                     System.out.println("Вы ввели некорректные данные!");
  252.                     isIncorrect = true;
  253.                 }
  254.             }
  255.         } while (isIncorrect);
  256.  
  257.         return new Date(day, month);
  258.     }
  259.  
  260.     public static int inputChoice(int menuType) {
  261.         final int MIN_CHOICE = 1;
  262.         final int MAX_CHOICE = 10;
  263.         int choice = 0;
  264.         boolean isIncorrect;
  265.        
  266.         if(menuType == 1){
  267.             System.out.println("Меню действий: \n" +
  268.                             "1) Добавить новую запись \n" +
  269.                             "2) Изменить информацию о существующей записи \n" +
  270.                             "3) Удалить существующую запись \n" +
  271.                             "4) Показать весь список записей \n" +
  272.                             "5) Отсортировать список записей по дате \n" +
  273.                             "6) Загрузить файл с записями \n" +
  274.                             "7) Загрузить корректирующий файл \n" +
  275.                             "8) Сохранить список записей в файл \n" +
  276.                             "9) Вызвать справку \n" +
  277.                             "10) Выход из программы \n" +
  278.                             "Выберите одно из действий");
  279.         } else {
  280.             System.out.println("Меню действий: \n" +
  281.                             "1) Изменить название темы\n" +
  282.                             "2) Изменить фамилию автора\n" +
  283.                             "3) Изменить кол-во стр.\n" +
  284.                             "4) Изменить дату написания\n" +
  285.                             "5) Выйти в главное меню\n" +
  286.                             "Выберите одно из действий");
  287.         }
  288.        
  289.         do {
  290.             isIncorrect = false;
  291.             try {
  292.                 choice = Integer.parseInt(scan.nextLine());
  293.             } catch (Exception e){
  294.                 System.out.println("Проверьте корректность введенных данных!");
  295.                 isIncorrect = true;
  296.             }
  297.             if (!isIncorrect && (choice < MIN_CHOICE || choice > MAX_CHOICE)){
  298.                 System.out.println("Для выбора введите от " + MIN_CHOICE + " до " + MAX_CHOICE + "!");
  299.                 isIncorrect = true;
  300.             }
  301.         } while (isIncorrect);
  302.        
  303.         return choice;
  304.     }
  305.  
  306.     public static void choiceMenuOption(int choice) {
  307.         switch (choice) {
  308.             case 1 -> {
  309.                 DocumentList.AddDocument(inputSurname(), inputTheme(), inputPages(), inputDate());
  310.                 System.out.println("Запись была успешно добавлена.");
  311.                 waitForAction();
  312.             }
  313.             case 2 -> {
  314.                 if (DocumentList.getDocuments().length != 0) {
  315.                     System.out.println("Список записей:");
  316.                     DocumentList.showAllDocuments();
  317.                     int index = inputIndex() - 1;
  318.                     Document newDocument = DocumentList.getDocuments()[index];
  319.                     int choiceChangeMenu;
  320.                     do {
  321.                         System.out.println("Выбранная запись:\n" + newDocument.toString());
  322.                         choiceChangeMenu = inputChoice(2);
  323.                         newDocument = changeMenu(newDocument, choiceChangeMenu);
  324.                     } while (choiceChangeMenu != 5);
  325.                     DocumentList.changeDocument(index, newDocument);
  326.                 } else {
  327.                     System.out.println("На данный момент записей нет...");
  328.                     waitForAction();
  329.                 }
  330.             }
  331.             case 3 -> {
  332.                 int size = DocumentList.getDocuments().length;
  333.                 if (size != 0) {
  334.                     System.out.println("Список записей:");
  335.                     DocumentList.showAllDocuments();
  336.                     DocumentList.deleteDocument(inputIndex() - 1);
  337.                     System.out.println("Запись была успешно удалена");
  338.                 } else {
  339.                     System.out.println("Записей пока нет...");
  340.                 }
  341.                 waitForAction();
  342.             }
  343.             case 4 -> {
  344.                 if (DocumentList.getDocuments().length != 0) {
  345.                     System.out.println("Список записей:");
  346.                     DocumentList.showAllDocuments();
  347.                 } else {
  348.                     System.out.println("Записей пока нет...");
  349.                 }
  350.                 waitForAction();
  351.             }
  352.             case 5 -> {
  353.                 if (DocumentList.getDocuments().length != 0) {
  354.                     int i = 0;
  355.                     System.out.println("Отсортированный список записей:\n" + "№ - Тема - Фамилия - Кол-во стр. - Дата написания");
  356.                     for (Document sortedDocuemtList : DocumentList.sortDocuments()){
  357.                         System.out.println("[" + (++i) + "]" + sortedDocuemtList.toString());
  358.                     }
  359.                 } else {
  360.                     System.out.println("Записей пока нет...");
  361.                 }
  362.                 waitForAction();
  363.             }
  364.             case 6 -> {
  365.                 DocumentList.setDocuments(inputDocumentsFromFile(inputPathToFile()));
  366.                 waitForAction();
  367.             }
  368.             case 7 -> {
  369.                 DocumentList.setDocuments(AddDocumentsFromFile(inputPathToFile(), DocumentList.getDocuments()));
  370.                 waitForAction();
  371.             }
  372.             case 8 -> {
  373.                 if (DocumentList.getDocuments().length != 0) {
  374.                     saveToFile(DocumentList.getDocuments(), inputPathToFile());
  375.                 } else {
  376.                     System.out.println("Записей пока нет...");
  377.                 }
  378.                 waitForAction();
  379.             }
  380.             case 9 -> {
  381.                 outputHelpInfo();
  382.                 waitForAction();
  383.             }
  384.             case 10 -> {
  385.                 System.out.println("Завершение сеанса. Благодарим за использование! Всех благ!");
  386.                 System.out.println("=======================================================================================================" + "\n" +
  387.                         "                 Ученье - свет! Неученье - чуть свет и на работу!" + "\n" +
  388.                         "                             -Хранитель рефератов™!" + "\n" +
  389.                         "=======================================================================================================");
  390.                 ;
  391.             }
  392.         }
  393.     }
  394.  
  395.     public static Document changeMenu(Document newDocument, int choice){
  396.         switch (choice) {
  397.             case 1 -> {
  398.                 newDocument.setTheme(inputTheme());
  399.                 System.out.println("Информация была успешно изменена");
  400.             }
  401.             case 2 -> {
  402.                 newDocument.setSurname(inputSurname());
  403.                 System.out.println("Информация была успешно изменена");
  404.             }
  405.             case 3 -> {
  406.                 newDocument.setPages(inputPages());
  407.                 System.out.println("Информация была успешно изменена");
  408.             }
  409.             case 4 -> {
  410.                 newDocument.setDate(inputDate());
  411.                 System.out.println("Информация была успешно изменена");
  412.             }
  413.         }
  414.         return newDocument;
  415.     }
  416.  
  417.     public static void main(String[] args) {
  418.         int choiceForMenu;
  419.  
  420.         outputProgramInfo();
  421.  
  422.         do {
  423.             choiceForMenu = inputChoice(1);
  424.             choiceMenuOption(choiceForMenu);
  425.         } while(choiceForMenu != 10);
  426.  
  427.         scan.close();
  428.     }
  429. }
  430.  
  431. ///Document
  432.  
  433. public class Document {
  434.     private String theme;
  435.     private String surname;
  436.     private Integer pages;
  437.     private Date date;
  438.  
  439.     Document(String theme, String surname, Integer pages, Date date) {
  440.         this.theme = theme;
  441.         this.surname = surname;
  442.         this.pages = pages;
  443.         this.date = date;
  444.     }
  445.  
  446.     public void setTheme(String theme) {
  447.         this.theme = theme;
  448.     }
  449.  
  450.     public String getTheme() {
  451.         return this.theme;
  452.     }
  453.  
  454.     public void setSurname(String surname) {
  455.         this.surname = surname;
  456.     }
  457.  
  458.     public String getSurname() {
  459.         return surname;
  460.     }
  461.  
  462.     public void setPages(Integer pages) {
  463.         this.pages = pages;
  464.     }
  465.  
  466.     public Integer getPages() {
  467.         return pages;
  468.     }
  469.  
  470.     public void setDate(Date date) {
  471.         this.date = date;
  472.     }
  473.  
  474.     public Date getDate() {
  475.         return date;
  476.     }
  477.  
  478.     public String toString() {
  479.         return "[" + theme + "]" + "[" + surname + "]" + "[" + pages.toString() +
  480.                 "]" + "[" + date.toString() + "]";
  481.     }
  482. }
  483.  
  484. /////DocumentListMenu
  485.  
  486. public class DocumentListMenu {
  487.     private Document[] documents;
  488.  
  489.     DocumentListMenu(){
  490.         documents = new Document[0];
  491.     }
  492.  
  493.     public void AddDocument(String theme, String surname, Integer pages, Date date){
  494.         documents = changeCountOfDocuments(documents, documents.length + 1);
  495.         documents[documents.length - 1] = new Document(theme, surname, pages, date);
  496.     }
  497.  
  498.     public void deleteDocument(int index){
  499.         if (index != documents.length - 1){
  500.             for (int i = index; i < documents.length - 1; i++){
  501.                 documents[i] = documents[i + 1];
  502.             }
  503.         }
  504.         documents = changeCountOfDocuments(documents, documents.length - 1);
  505.     }
  506.  
  507.     public void changeDocument(int index, Document newDocument){
  508.         documents[index] = newDocument;
  509.     }
  510.  
  511.     public Document[] sortDocuments(){
  512.         Document[] sortedDocuments = new Document[0];
  513.         for (int i = 0; i < sortedDocuments.length; i++){
  514.             for (int j = 1; j < sortedDocuments.length - i; j++){
  515.                 if (sortedDocuments[j - 1].getDate().getMonth() > sortedDocuments[j].getDate().getMonth()){
  516.                     Document tempDoc = sortedDocuments[j - 1];
  517.                     sortedDocuments[j - 1] = sortedDocuments[j];
  518.                     sortedDocuments[j] = tempDoc;
  519.                 } else if (sortedDocuments[j - 1].getDate().getDay() > sortedDocuments[j].getDate().getDay()) {
  520.                     Document tempDoc = sortedDocuments[j - 1];
  521.                     sortedDocuments[j - 1] = sortedDocuments[j];
  522.                     sortedDocuments[j] = tempDoc;
  523.                 }
  524.             }
  525.         }
  526.         return sortedDocuments;
  527.     }
  528.  
  529.     public void showAllDocuments(){
  530.         int i = 0;
  531.  
  532.         System.out.println("№ - Тема - Фамилия - Стр. - Дата написания");
  533.         for(Document document : documents){
  534.             System.out.println("[" + (++i) + "]" + document.toString());
  535.         }
  536.     }
  537.  
  538.     public void setDocuments(Document[] documents){
  539.         this.documents = documents;
  540.     }
  541.  
  542.     public Document[] getDocuments(){
  543.         return documents;
  544.     }
  545.  
  546.     Document[] changeCountOfDocuments(Document[] documents, int newLength){
  547.         int size = documents.length;
  548.         Document[] newDocuments = new Document[newLength];
  549.         System.arraycopy(documents, 0, newDocuments, 0, Math.min(newLength, size));
  550.         return newDocuments;
  551.     }
  552. }
  553.  
  554. /////DateClass
  555.  
  556. public class Date {
  557.     private int day;
  558.     private int month;
  559.  
  560.     Date(int day, int month){
  561.         this.day = day;
  562.         this.month = month;
  563.     }
  564.  
  565.     public int getDay(){
  566.         return day;
  567.     }
  568.  
  569.     public int getMonth(){
  570.         return month;
  571.     }
  572.  
  573.     public static boolean isCorrectDate(int day, int month){
  574.         final int MIN_DAY_MONTH = 1;
  575.         final int MAX_DAY = 31;
  576.         final int MAX_MONTH = 12;
  577.         boolean isCorrect;
  578.         isCorrect = true;
  579.         if (day < MIN_DAY_MONTH || day > MAX_DAY || month < MIN_DAY_MONTH || month > MAX_MONTH){
  580.             isCorrect = false;
  581.         } else if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
  582.             isCorrect = false;
  583.         } else if ((month == 2) && (day > 28)) {
  584.             isCorrect = false;
  585.         }
  586.         return isCorrect;
  587.     }
  588.  
  589.     public String toString(){
  590.         return  day + "/" + month + "/" + "2023 г.";
  591.     }
  592. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement