redmanexe

Lab3Challenge3Java

Nov 3rd, 2024
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.69 KB | None | 0 0
  1. package dev.rexe;
  2.  
  3. import java.io.*;
  4. import java.util.Arrays;
  5. import java.util.Scanner;
  6.  
  7. public class Main3 {
  8.     public final static String DEFAULT_INPUT_FILE = "input.txt";
  9.     public final static String DEFAULT_OUTPUT_FILE = "output.txt";
  10.  
  11.     public final static int PRINT_TYPE_MIN = 0;
  12.     public final static int PRINT_TYPE_MAX = 2;
  13.  
  14.     public final static int SCAN_TYPE_MIN = 0;
  15.     public final static int SCAN_TYPE_MAX = 1;
  16.  
  17.     public final static int ARRAY_LENGTH_MIN = 1;
  18.     public final static int ARRAY_LENGTH_MAX = 1000;
  19.  
  20.     public final static int ARRAY_VALUES_MIN = -10000;
  21.     public final static int ARRAY_VALUES_MAX = 10000;
  22.  
  23.     public static void main(String[] args) {
  24.         System.out.println("3. Сортировка методом простых вставок.");
  25.         Scanner scanner = new Scanner(System.in);
  26.         int[] arr;
  27.         arr = Main3.readArray(scanner);
  28.         Main3.sortArray(arr);
  29.         Main3.printResult(scanner, arr);
  30.         scanner.close();
  31.     }
  32.  
  33.     public static boolean checkFileAvailability(String filePath, boolean read) {
  34.         boolean fl;
  35.         fl = true;
  36.         try {
  37.             File file = new File(filePath);
  38.             if (!read) {
  39.                 BufferedWriter fileWriter = new BufferedWriter(new FileWriter(file));
  40.                 fileWriter.close();
  41.             } else {
  42.                 BufferedReader fileReader = new BufferedReader(new FileReader(file));
  43.                 fileReader.close();
  44.             }
  45.         } catch (Exception e) {
  46.             fl = false;
  47.         }
  48.         if (!isTextFile(filePath)) {
  49.             fl = false;
  50.         }
  51.         return fl;
  52.     }
  53.     public static boolean isTextFile(String filePath) {
  54.         boolean isTxt;
  55.         isTxt = (filePath.length() > 4 &&
  56.                 filePath.charAt(filePath.length() - 4) == '.' &&
  57.                 filePath.charAt(filePath.length() - 3) == 't' &&
  58.                 filePath.charAt(filePath.length() - 2) == 'x' &&
  59.                 filePath.charAt(filePath.length() - 1) == 't');
  60.  
  61.         return isTxt;
  62.     }
  63.  
  64.     public static int[] readArray(Scanner scanner) {
  65.         int[] arr;
  66.         int type;
  67.         System.out.println("\nКак считать значения для поиска решения?");
  68.         System.out.println("0 - Из ввода с клавиатуры (консоль)");
  69.         System.out.println("1 - Из файла");
  70.         type = takeIntValueInRangeFromConsole(scanner, "Выбранный вариант ввода: ", SCAN_TYPE_MIN, SCAN_TYPE_MAX);
  71.         if (type == 1) {
  72.             arr = readArrayFromFile(scanner);
  73.         } else {
  74.             arr = readArrayFromConsole(scanner);
  75.         }
  76.  
  77.         return arr;
  78.     }
  79.     public static int[] readArrayFromFile(Scanner scanner) {
  80.         int[] a;
  81.         a = new int[0];
  82.         boolean isInCorrect = true;
  83.         while (isInCorrect) {
  84.             File file = takeCorrectFile(scanner, true);
  85.             isInCorrect = false;
  86.             try {
  87.                 BufferedReader reader = new BufferedReader(new FileReader(file));
  88.                 int n = Integer.parseInt(takeValueFromFile(reader));
  89.                 if (n > ARRAY_LENGTH_MIN && n < ARRAY_LENGTH_MAX) {
  90.                     a = new int[n];
  91.  
  92.                     for (int i = 0; i < n; i++) {
  93.                         String aString = takeValueFromFile(reader);
  94.                         int value = Integer.parseInt(aString);
  95.                         if (value < ARRAY_VALUES_MIN || value > ARRAY_VALUES_MAX)
  96.                             aString = "e";
  97.                         a[i] = Integer.parseInt(aString);
  98.                     }
  99.                 } else {
  100.                     isInCorrect = true;
  101.                     System.out.println("Массив не может быть размером меньше, чем " + ARRAY_LENGTH_MIN + "!");
  102.                 }
  103.  
  104.                 reader.close();
  105.             } catch (IOException e) {
  106.                 isInCorrect = true;
  107.                 System.out.println("Этот файл не существует! Введите путь до существующего файла!");
  108.             } catch (NumberFormatException e) {
  109.                 isInCorrect = true;
  110.                 System.out.println("В файле содержится неверные значения! Введите путь до файла с верным содержимым!");
  111.             }
  112.         }
  113.  
  114.         return a;
  115.     }
  116.     public static int[] readArrayFromConsole(Scanner scanner) {
  117.         int[] a;
  118.         int n = takeIntValueInRangeFromConsole(scanner, "Введите длину массива (значение должно быть в границах от " + ARRAY_LENGTH_MIN + " и до " + ARRAY_LENGTH_MAX + "): ", ARRAY_LENGTH_MIN, ARRAY_LENGTH_MAX);
  119.         a = new int[n];
  120.  
  121.         for (int i = 0; i < n; i++)
  122.             a[i] = takeIntValueInRangeFromConsole(scanner, "Элемент " + (i + 1) + " массива (значение должно быть в границах от " + ARRAY_VALUES_MIN + " и до " + ARRAY_VALUES_MAX + "): ", ARRAY_VALUES_MIN, ARRAY_VALUES_MAX);
  123.  
  124.         return a;
  125.     }
  126.  
  127.     public static String takeValueFromFile(BufferedReader reader) {
  128.         boolean isValue;
  129.         StringBuilder value;
  130.         value = new StringBuilder("e");
  131.         isValue = true;
  132.         try {
  133.             while (isValue) {
  134.                 int c = reader.read();
  135.                 if (c != -1 && c != '\n' && c != ' ') {
  136.                     if (value.toString().equals("e"))
  137.                         value = new StringBuilder();
  138.                     value.append((char) c);
  139.                 } else
  140.                     isValue = false;
  141.             }
  142.         } catch (IOException ignored) {}
  143.  
  144.         return value.toString();
  145.     }
  146.     public static int takeIntValueFromConsole(Scanner scanner, String text) {
  147.         boolean isInCorrect;
  148.         int value;
  149.         isInCorrect = true;
  150.         value = 0;
  151.         while (isInCorrect) {
  152.             System.out.print(text);
  153.             try {
  154.                 value = Integer.parseInt(scanner.nextLine());
  155.                 isInCorrect = false;
  156.             } catch (NumberFormatException e) {
  157.                 System.out.println("Введите число, а не строку или что-то иное!");
  158.             }
  159.         }
  160.  
  161.         return value;
  162.     }
  163.     public static int takeIntValueInRangeFromConsole(Scanner scanner, String text, int min, int max) {
  164.         boolean isInCorrect;
  165.         int value;
  166.         isInCorrect = true;
  167.         value = 0;
  168.         while (isInCorrect) {
  169.             value = takeIntValueFromConsole(scanner, text);
  170.             isInCorrect = false;
  171.             if (value < min || value > max) {
  172.                 isInCorrect = true;
  173.                 System.out.println("Значение должно находится в границах от " + min + " до " + max + "!");
  174.             }
  175.         }
  176.  
  177.         return value;
  178.     }
  179.     public static File takeCorrectFile(Scanner scanner, boolean input) {
  180.         boolean isInCorrect;
  181.         String value = "";
  182.         isInCorrect = true;
  183.         while(isInCorrect) {
  184.             if (input)
  185.                 System.out.print("Введите путь до входного файла (пустая строка – " + DEFAULT_INPUT_FILE + "): ");
  186.             else
  187.                 System.out.print("Введите путь до выходного файла (пустая строка – " + DEFAULT_OUTPUT_FILE + "): ");
  188.             value = scanner.nextLine();
  189.             isInCorrect = false;
  190.             if (value.isEmpty()) {
  191.                 if (input)
  192.                     value = DEFAULT_INPUT_FILE;
  193.                 else
  194.                     value = DEFAULT_OUTPUT_FILE;
  195.             }
  196.             if (!checkFileAvailability(value, input)) {
  197.                 isInCorrect = true;
  198.                 System.out.println("Путь ведёт до файла, который недоступен или который не является текстовым файлом!");
  199.             }
  200.         }
  201.         return new File(value);
  202.     }
  203.  
  204.     public static void printResult(Scanner scanner, int[] arr) {
  205.         boolean saved;
  206.         int type;
  207.         System.out.println("\nКуда вывести результат решения?");
  208.         System.out.println("0 - Только консоль");
  209.         System.out.println("1 - Только в файл");
  210.         System.out.println("2 - И в файл, и в консоль");
  211.         type = takeIntValueInRangeFromConsole(scanner, "Выбранный вариант вывода: ", PRINT_TYPE_MIN, PRINT_TYPE_MAX);
  212.         saved = false;
  213.  
  214.         switch (type) {
  215.             case 0 -> {
  216.                 printResultIntoConsole(arr);
  217.             }
  218.             case 1 -> {
  219.                 File output = takeCorrectFile(scanner, false);
  220.                 saved = saveResultIntoFile(output, arr);
  221.             }
  222.             case 2 -> {
  223.                 File output = takeCorrectFile(scanner, false);
  224.                 saved = saveResultIntoFile(output, arr);
  225.                 printResultIntoConsole(arr);
  226.             }
  227.         }
  228.  
  229.         if (saved)
  230.             System.out.println("Результат записан в выходной файл!");
  231.     }
  232.     public static void printResultIntoConsole(int[] arr) {
  233.         System.out.println("\nОтсортированный массив:");
  234.         for (int j : arr)
  235.             System.out.print(j + " ");
  236.         System.out.println();
  237.     }
  238.     public static boolean saveResultIntoFile(File output, int[] arr) {
  239.         boolean saved;
  240.         saved = true;
  241.         try {
  242.             BufferedWriter writer = new BufferedWriter(new FileWriter(output));
  243.             StringBuilder numbers = new StringBuilder();
  244.             for (int j : arr)
  245.                 numbers.append(j).append(" ");
  246.             writer.append(numbers.toString());
  247.             writer.close();
  248.         } catch (IOException e) {
  249.             System.out.println("Данные в файл не могут быть записаны! У программы нет доступа к файлу или он занят другим процессом!");
  250.             saved = false;
  251.         }
  252.  
  253.         return saved;
  254.     }
  255.  
  256.     public static void sortArray(int[] arr) {
  257.         System.out.println(Arrays.toString(arr) + "; i = 0");
  258.         for (int i = 1; i < arr.length; i++) {
  259.             int key = arr[i];
  260.  
  261.             int j = i - 1;
  262.             while (j >= 0 && arr[j] > key) {
  263.                 arr[j + 1] = arr[j];
  264.                 j = j - 1;
  265.             }
  266.             arr[j + 1] = key;
  267.  
  268.             System.out.println(Arrays.toString(arr) + "; i = " + i);
  269.         }
  270.     }
  271. }
Advertisement
Add Comment
Please, Sign In to add comment