Advertisement
gguuppyy

lab51

Apr 5th, 2024
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.55 KB | Source Code | 0 0
  1. import java.io.*;
  2. import java.text.ParseException;
  3. import java.util.Scanner;
  4.  
  5. class ListPt {
  6.     int data;
  7.     ListPt next;
  8.     ListPt (int data, ListPt next) {
  9.         this.data = data;
  10.         this.next = next;
  11.     }
  12. }
  13.  
  14. public class Main {
  15.  
  16.     enum Choice {
  17.         addElem("Добавить"),
  18.         loadFormFile("Загрузить списки из файла"),
  19.         merge("Слить два списка"),
  20.         close("Закрыть");
  21.  
  22.         private final String inf;
  23.         Choice (String infLine) {
  24.             this.inf = infLine;
  25.         }
  26.         private String getInf(){return this.ordinal() + ") " + this.inf;}
  27.     }
  28.  
  29.     static final int FIRST = 1;
  30.     static final int SECOND = 2;
  31.  
  32.     enum ErrCode {
  33.         SUCCESS,
  34.         INCORRECT_DATA,
  35.         FILE_NOT_EXIST,
  36.         EMPTY_LINE,
  37.         NOT_TXT,
  38.         IN_OUT_FILE_EXCEPTION,
  39.         EMPTY_LISTS,
  40.     }
  41.  
  42.     static final String[] ERRORS = {"Удача",
  43.             "Данные не корректные или число слишком большое (должно быть от %d до %d)\n",
  44.             "Такого файла не существует",
  45.             "Строка пустая, будьте внимательны",
  46.             "Файл не .txt",
  47.             "Exception with output/input from the file",
  48.             "Списки должны иметь хотя бы по одному элементу"};
  49.  
  50.     static final String INFORMATION_TEXT = """
  51.                        Инструкция:
  52.                            1) Элементы списка должны быть от 0 до 100000
  53.                            2) Чтобы добавить элемент выберите соответствующую кнопку
  54.                            3) Данные можно сохранить в файл
  55.                        """,
  56.             CHOICE_SAVE_TEXT = """
  57.                        Вы хотите сохранить результат?
  58.                        1) да
  59.                        2) нет
  60.                        """;
  61.  
  62.     static final int MIN_ELEM = 0,
  63.             MAX_ELEM = 100000;
  64.  
  65.     static void add(ListPt headPt, int elem) {
  66.         boolean isAdded = false;
  67.         int temp;
  68.         ListPt tempPt;
  69.         while ((headPt.next != null) && !isAdded) {
  70.             headPt = headPt.next;
  71.             if (headPt.data > elem) {
  72.                 temp = headPt.data;
  73.                 tempPt = headPt.next;
  74.                 headPt.data = elem;
  75.                 headPt.next = new ListPt(temp, tempPt);
  76.                 isAdded = true;
  77.             }
  78.         }
  79.         if (!isAdded)
  80.             headPt.next = new ListPt(elem, null);
  81.     }
  82.  
  83.     static void merge(ListPt dest, ListPt first, ListPt second) {
  84.         first = first.next;
  85.         second = second.next;
  86.         int temp;
  87.  
  88.         do {
  89.             if (first.data > second.data) {
  90.                 temp = second.data;
  91.                 second = second.next;
  92.             } else {
  93.                 temp = first.data;
  94.                 first = first.next;
  95.             }
  96.             dest.next = new ListPt(temp, null);
  97.             dest = dest.next;
  98.         } while (first != null && second != null);
  99.  
  100.         while (first != null) {
  101.             dest.next = new ListPt(first.data, null);
  102.             dest = dest.next;
  103.             first = first.next;
  104.         }
  105.         while (second != null) {
  106.             dest.next = new ListPt(second.data, null);
  107.             dest = dest.next;
  108.             second = second.next;
  109.         }
  110.     }
  111.  
  112.     static void printList(ListPt headPt, int countList) {
  113.         System.out.printf("Список %d: ", countList);
  114.         if (headPt.next == null)
  115.             System.out.print("пусто");
  116.         while (headPt.next != null) {
  117.             headPt = headPt.next;
  118.             System.out.print(headPt.data + " ");
  119.         }
  120.         System.out.println();
  121.     }
  122.  
  123.     static void printMenu() {
  124.         Choice[] choices = Choice.values();
  125.         for (Choice choice : choices) {
  126.             System.out.println(choice.getInf());
  127.         }
  128.     }
  129.  
  130.     static void printInf(Scanner input) {
  131.         System.out.println(INFORMATION_TEXT);
  132.         System.out.println("нажмите enter чтобы продолжить");
  133.         input.nextLine();
  134.     }
  135.  
  136.     static ErrCode enterOneNum(int[] numberArr, Scanner input, final int MIN, final int MAX) {
  137.         int number = 0;
  138.         ErrCode err = ErrCode.SUCCESS;
  139.         try {
  140.             number = Integer.parseInt(input.nextLine());
  141.         } catch (NumberFormatException e) {
  142.             err = ErrCode.INCORRECT_DATA;
  143.         }
  144.         if ((err == ErrCode.SUCCESS) && (number < MIN || number > MAX))
  145.             err = ErrCode.INCORRECT_DATA;
  146.         numberArr[0] = err == ErrCode.SUCCESS ? number : 0;
  147.         return err;
  148.     }
  149.  
  150.     static int getNumConsole(Scanner input, final int MIN, final int MAX) {
  151.         ErrCode err;
  152.         int[] numberArr = {0};
  153.         do {
  154.             err = enterOneNum(numberArr, input, MIN, MAX);
  155.             if (err != ErrCode.SUCCESS) {
  156.                 System.err.printf(ERRORS[err.ordinal()], MIN, MAX);
  157.                 System.out.println("Введите снова");
  158.             }
  159.         } while (err != ErrCode.SUCCESS);
  160.         return numberArr[0];
  161.     }
  162.  
  163.     static Choice getChoice(Scanner input) {
  164.         int choice;
  165.         int maxChoice = Choice.values().length - 1;
  166.         choice = getNumConsole(input, 0, maxChoice);
  167.         return Choice.values()[choice];
  168.     }
  169.  
  170.     static void addToList(ListPt headPt, Scanner input) {
  171.         System.out.printf("Введите новый элемент списка (от %d до %d)\n", MIN_ELEM, MAX_ELEM);
  172.         int elem = getNumConsole(input, MIN_ELEM, MAX_ELEM);
  173.         add(headPt, elem);
  174.     }
  175.  
  176.     static ErrCode validateFileExistence(String fileName) {
  177.         File file = new File(fileName);
  178.         return file.exists() ? ErrCode.SUCCESS : ErrCode.FILE_NOT_EXIST;
  179.     }
  180.  
  181.     static ErrCode validateFileExtension(String fileName) {
  182.         return fileName.endsWith(".txt") ? ErrCode.SUCCESS : ErrCode.NOT_TXT;
  183.     }
  184.  
  185.     static ErrCode enterFileName(String[] fileName, Scanner input) {
  186.         ErrCode err;
  187.         fileName[0] = input.nextLine();
  188.         if (fileName[0].isEmpty())
  189.             err = ErrCode.EMPTY_LINE;
  190.         else {
  191.             err = validateFileExistence(fileName[0]);
  192.             if (err.equals(ErrCode.SUCCESS)) {
  193.                 err = validateFileExtension(fileName[0]);
  194.             }
  195.         }
  196.         return err;
  197.     }
  198.  
  199.     static String getFileName(Scanner input) {
  200.         String[] fileName = {""};
  201.         ErrCode err;
  202.         System.out.println("Введите полный путь к файлу");
  203.         do {
  204.             err = enterFileName(fileName, input);
  205.             if (err != ErrCode.SUCCESS) {
  206.                 System.err.println(ERRORS[err.ordinal()]);
  207.             }
  208.         } while (err != ErrCode.SUCCESS);
  209.         return fileName[0];
  210.     }
  211.  
  212.     public static ListPt InputListFromFile(ListPt list, String fileName, int numberOfArray) {
  213.         String inputedString = "";
  214.         String[] stringNums;
  215.         int size = 0;
  216.         boolean isCorrect = true;
  217.         try (BufferedReader reader = new BufferedReader(new FileReader(fileName)))
  218.         {
  219.             try {
  220.                 if (numberOfArray == SECOND)
  221.                 {
  222.                     reader.readLine();
  223.                     reader.readLine();
  224.                 }
  225.                 size = Integer.parseInt(reader.readLine());
  226.                 inputedString = reader.readLine();
  227.             }
  228.             catch (NumberFormatException exception) {
  229.                 isCorrect = false;
  230.                 System.err.println("Не верный тип данных. Проверьте файл.");
  231.             }
  232.         }
  233.         catch (IOException ex)
  234.         {
  235.             isCorrect = false;
  236.             System.err.println("Что-то пошло не так!");
  237.         }
  238.         stringNums = inputedString.split(" ");
  239.         if (size != stringNums.length)
  240.         {
  241.             System.out.println("Проблемы в файле!");
  242.             isCorrect = false;
  243.         }
  244.         else {
  245.             for (int i = 0; i < stringNums.length; i++) {
  246.                 if (isCorrect) {
  247.                     try {
  248.                         add(list, Integer.parseInt(stringNums[i]));
  249.                     } catch (NumberFormatException ex) {
  250.                         System.out.println("Проблемы в файле!");
  251.                         isCorrect = false;
  252.                     }
  253.                 }
  254.             }
  255.         }
  256.         return list;
  257.     }
  258.  
  259.  
  260.     public static String inputFileName(Scanner input) {
  261.         String fileName = "\0";
  262.         boolean isIncorrect = true;
  263.         File tempFile;
  264.         do {
  265.             System.out.println("Введите путь к файлу:");
  266.             fileName = input.nextLine();
  267.             tempFile = new File(fileName);
  268.             if (!tempFile.exists()) {
  269.                 System.err.println("Файл не найден!");
  270.             } else if (!fileName.endsWith(".txt")) {
  271.                 System.err.println("Файл не текстовый!");
  272.             } else if (!tempFile.canRead()) {
  273.                 System.err.println("Файл закрыт для чтения!");
  274.             } else {
  275.                 isIncorrect = false;
  276.             }
  277.         } while (isIncorrect);
  278.         return fileName;
  279.     }
  280.  
  281.     static void saveToFile(Scanner input, ListPt headPt) {
  282.         ErrCode err;
  283.         do {
  284.             err = ErrCode.SUCCESS;
  285.             String fileName = getFileName(input);
  286.             try (PrintWriter file = new PrintWriter(fileName)) {
  287.                 while (headPt.next != null) {
  288.                     headPt = headPt.next;
  289.                     file.write(headPt.data + " ");
  290.                 }
  291.             } catch (IOException e) {
  292.                 err = ErrCode.IN_OUT_FILE_EXCEPTION;
  293.                 System.err.println(ERRORS[err.ordinal()]);
  294.             }
  295.         } while (err != ErrCode.SUCCESS);
  296.     }
  297.  
  298.     static void saveOrNot(Scanner input, ListPt headPt) {
  299.         System.out.println(CHOICE_SAVE_TEXT);
  300.         int choice = getNumConsole(input, 1, 2);
  301.         if (choice == 1) {
  302.             saveToFile(input, headPt);
  303.         }
  304.     }
  305.  
  306.     static boolean doFunction(ListPt firstList, ListPt secondList, Scanner input) {
  307.         Choice choice = getChoice(input);
  308.         boolean isClose = false;
  309.         switch (choice) {
  310.             case addElem -> {
  311.                 System.out.println("Введите список в который хотите добавить элемент (1 или 2)");
  312.                 int numList = getNumConsole(input, 1, 2);
  313.                 if (numList == 1) {
  314.                     addToList(firstList, input);
  315.                 } else {
  316.                     addToList(secondList, input);
  317.                 }
  318.             }
  319.             case loadFormFile -> {
  320.                 boolean isNotGood = true;
  321.                 String fileName;
  322.                 do {
  323.                     fileName = inputFileName(input);
  324.                     InputListFromFile(firstList,fileName,FIRST);
  325.                     if (firstList != null){
  326.                         InputListFromFile(secondList,fileName,SECOND);
  327.                         if (secondList != null) {
  328.                             isNotGood = false;
  329.                         }
  330.                     }
  331.                 } while(isNotGood);
  332.             }
  333.             case merge -> {
  334.                 ListPt mergedList = new ListPt(0, null);
  335.                 if (firstList.next != null && secondList.next != null) {
  336.                     merge(mergedList, firstList, secondList);
  337.                     printList(mergedList, 0);
  338.                     saveOrNot(input, mergedList);
  339.                 } else {
  340.                     System.err.println(ERRORS[ErrCode.EMPTY_LISTS.ordinal()]);
  341.                 }
  342.  
  343.                 System.out.println();
  344.             }
  345.             case close -> isClose = true;
  346.         }
  347.         return isClose;
  348.     }
  349.  
  350.     public static void main(String[] args) {
  351.         ListPt firstHead = new ListPt(0, null);
  352.         ListPt secondHead = new ListPt(0, null);
  353.         Scanner input = new Scanner(System.in);
  354.         printInf(input);
  355.  
  356.         boolean isClose;
  357.         do {
  358.             printList(firstHead, 1);
  359.             printList(secondHead, 2);
  360.             printMenu();
  361.             isClose = doFunction(firstHead, secondHead, input);
  362.         } while (!isClose);
  363.         input.close();
  364.     }
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement