ValeriaAVR

java24

Oct 31st, 2024
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.16 KB | None | 0 0
  1. import java.io.*;
  2. import java.nio.file.*;
  3. import java.util.Scanner;
  4. public class Main {
  5.     final static int MIN_SIZE = 1;
  6.     final static int MAX_SIZE = 50;
  7.     final static int MIN_A = -1000;
  8.     final static int MAX_A = 1000;
  9.     final static int MIN_C = 1;
  10.     final static int MAX_C = 2;
  11.     static Scanner in = new Scanner(System.in);
  12.  
  13.     public static int inputInteger(final int MIN, final int MAX) {
  14.         boolean isIncorrect;
  15.         int n;
  16.         n = 0;
  17.         do {
  18.             isIncorrect = false;
  19.             System.out.println("Введите значение.");
  20.             try {
  21.                 n = Integer.parseInt(in.nextLine());
  22.             } catch (NumberFormatException e) {
  23.                 isIncorrect = true;
  24.                 System.err.println("Некорректный ввод.");
  25.             }
  26.             if (n < MIN || n > MAX) {
  27.                 System.err.println("Введите корректное значение.");
  28.                 isIncorrect = true;
  29.             }
  30.         } while (isIncorrect);
  31.         return n;
  32.     }
  33.  
  34.     public static boolean isEmpty(final String fileName) {
  35.         boolean isEmpty;
  36.         isEmpty = true;
  37.         try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
  38.             String line = br.readLine();
  39.             if (line != null) {
  40.                 isEmpty = false;
  41.             }
  42.         } catch (IOException e) {
  43.             System.err.println("Ошибка.");
  44.         }
  45.         return isEmpty;
  46.     }
  47.  
  48.     public static String requestFileNameForReading() {
  49.         boolean isIncorrect;
  50.         String fileName;
  51.         isIncorrect = true;
  52.         File tempFile;
  53.         Path path;
  54.         do {
  55.             System.out.println("Введите относительный путь к файлу.");
  56.             fileName = in.nextLine();
  57.             path = Paths.get(fileName);
  58.             tempFile = new File(fileName);
  59.             if (!tempFile.exists()) {
  60.                 System.err.println("Файл не существует.");
  61.             } else if (fileName.length() < 5 || !fileName.endsWith(".txt")) {
  62.                 System.err.println("Файл не является текстовым.");
  63.             } else if (!Files.isReadable(path)) {
  64.                 System.err.println("Этот файл невозможно открыть для чтения.");
  65.             } else if (isEmpty(fileName)) {
  66.                 System.err.println("Этот файл пустой.");
  67.             } else {
  68.                 isIncorrect = false;
  69.             }
  70.         } while (isIncorrect);
  71.         return fileName;
  72.     }
  73.  
  74.     public static String requestFileNameForWriting() {
  75.         boolean isIncorrect;
  76.         String fileName;
  77.         isIncorrect = true;
  78.         File tempFile;
  79.         Path path;
  80.         do {
  81.             System.out.println("Введите относительный путь к файлу.");
  82.             fileName = in.nextLine();
  83.             path = Paths.get(fileName);
  84.             tempFile = new File(fileName);
  85.             if (!tempFile.exists()) {
  86.                 System.err.println("Файл не существует.");
  87.             } else if (fileName.length() < 5 || !fileName.endsWith(".txt")) {
  88.                 System.err.println("Файл не является текстовым.");
  89.             } else if (!Files.isWritable(path)) {
  90.                 System.err.println("Этот файл невозможно открыть для записи.");
  91.             } else {
  92.                 isIncorrect = false;
  93.             }
  94.         } while (isIncorrect);
  95.         return fileName;
  96.     }
  97.  
  98.     public static int inputSizeFromFileForArrA(String fileName) {
  99.         boolean isIncorrect;
  100.         int size;
  101.         do {
  102.             size = 0;
  103.             try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
  104.                 String line = br.readLine();
  105.                 if (line != null) {
  106.                     size = Integer.parseInt(line.trim());
  107.                     isIncorrect = (size < MIN_SIZE) || (size > MAX_SIZE);
  108.                     if (isIncorrect) {
  109.                         System.out.println("Размер не входит в диапазон от " + MIN_SIZE + " до " + MAX_SIZE);
  110.                         fileName = requestFileNameForReading();
  111.                     }
  112.                 } else {
  113.                     System.out.println("Файл пуст.");
  114.                     isIncorrect = true;
  115.                     fileName = requestFileNameForReading();
  116.                 }
  117.             } catch (IOException e) {
  118.                 System.out.println("Ошибка при чтении файла: ");
  119.                 isIncorrect = true;
  120.                 fileName = requestFileNameForReading();
  121.             } catch (NumberFormatException e) {
  122.                 System.out.println("Ошибка в первой строке. Неправильный размер массива");
  123.                 isIncorrect = true;
  124.                 fileName = requestFileNameForReading();
  125.             }
  126.         } while (isIncorrect);
  127.         return size;
  128.     }
  129.  
  130.     public static int inputSizeFromFileForArrB(String fileName) {
  131.         boolean isIncorrect;
  132.         int size;
  133.         do {
  134.             size = 0;
  135.             try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
  136.                 br.readLine();
  137.                 String line = br.readLine();
  138.                 if (line != null) {
  139.                     size = Integer.parseInt(line.trim());
  140.                     isIncorrect = (size < MIN_SIZE) || (size > MAX_SIZE);
  141.                     if (isIncorrect) {
  142.                         System.out.println("Размер не входит в диапазон от " + MIN_SIZE + " до " + MAX_SIZE);
  143.                         fileName = requestFileNameForReading();
  144.                     }
  145.                 } else {
  146.                     System.out.println("Файл пуст.");
  147.                     isIncorrect = true;
  148.                     fileName = requestFileNameForReading();
  149.                 }
  150.             } catch (IOException e) {
  151.                 System.out.println("Ошибка при чтении файла: ");
  152.                 isIncorrect = true;
  153.                 fileName = requestFileNameForReading();
  154.             } catch (NumberFormatException e) {
  155.                 System.out.println("Ошибка в первой строке. Неправильный размер массива");
  156.                 isIncorrect = true;
  157.                 fileName = requestFileNameForReading();
  158.             }
  159.         } while (isIncorrect);
  160.         return size;
  161.     }
  162.  
  163.     public static int[] readArrAFromFile(int size, String fileName) {
  164.         int[] arr;
  165.         boolean isIncorrect;
  166.         String[] intInString;
  167.         String tempLine;
  168.         do {
  169.             isIncorrect = false;
  170.             arr = new int[size];
  171.             try (BufferedReader fReader = new BufferedReader(new FileReader(fileName))) {
  172.                 fReader.readLine();
  173.                 fReader.readLine();
  174.                 for (int i = 0; i < size; i++) {
  175.                     tempLine = fReader.readLine();
  176.                     if (tempLine != null) {
  177.                         intInString = tempLine.split(" ");
  178.                             arr[i]= Integer.parseInt(intInString[i]);
  179.                             if (arr[i] < MIN_A || arr[i] > MAX_A) {
  180.                                 isIncorrect = true;
  181.                             }
  182.                         }
  183.                     }
  184.                 if (isIncorrect) {
  185.                     System.err.println("Элементы массива выходят за диапазон допустимых значений.");
  186.                 }
  187.             } catch (NumberFormatException e) {
  188.                 System.err.println("Некорректный тип данных.");
  189.                 isIncorrect = true;
  190.             } catch (IOException e) {
  191.                 System.err.println("Непредвиденная ошибка.");
  192.                 isIncorrect = true;
  193.             }
  194.             if (isIncorrect) {
  195.                 fileName = requestFileNameForReading();
  196.                 size = inputSizeFromFileForArrA(fileName);
  197.             }
  198.         } while (isIncorrect);
  199.         return arr;
  200.     }
  201.  
  202.     public static int[] readArrBFromFile(int size, String fileName) {
  203.         int[] arr;
  204.         boolean isIncorrect;
  205.         String[] intInString;
  206.         String tempLine;
  207.         do {
  208.             isIncorrect = false;
  209.             arr = new int[size];
  210.             try (BufferedReader fReader = new BufferedReader(new FileReader(fileName))) {
  211.                 fReader.readLine();
  212.                 fReader.readLine();
  213.                 fReader.readLine();
  214.                 for (int i = 0; i < size; i++) {
  215.                     tempLine = fReader.readLine();
  216.                     if (tempLine != null) {
  217.                         intInString = tempLine.split(" ");
  218.                         arr[i]= Integer.parseInt(intInString[i]);
  219.                         if (arr[i] < MIN_A || arr[i] > MAX_A) {
  220.                             isIncorrect = true;
  221.                         }
  222.                     }
  223.                 }
  224.                 if (isIncorrect) {
  225.                     System.err.println("Элементы массива выходят за диапазон допустимых значений.");
  226.                 }
  227.             } catch (NumberFormatException e) {
  228.                 System.err.println("Некорректный тип данных.");
  229.                 isIncorrect = true;
  230.             } catch (IOException e) {
  231.                 System.err.println("Непредвиденная ошибка.");
  232.                 isIncorrect = true;
  233.             }
  234.             if (isIncorrect) {
  235.                 fileName = requestFileNameForReading();
  236.                 size = inputSizeFromFileForArrA(fileName);
  237.             }
  238.         } while (isIncorrect);
  239.         return arr;
  240.     }
  241.  
  242.     public static int[] createArray(final int n) {
  243.         int[] arr = new int[n];
  244.         boolean isIncorrect;
  245.         for (int i = 0; i < n; i++) {
  246.                 do {
  247.                     isIncorrect = false;
  248.                     System.out.println("Введите " + (i + 1) + " элемент массива: ");
  249.                     try {
  250.                         arr[i] = Integer.parseInt(in.nextLine());
  251.                     } catch (NumberFormatException e) {
  252.                         isIncorrect = true;
  253.                         System.err.println("Некорректный ввод. Введите число.");
  254.                     }
  255.                     if (!isIncorrect && (arr[i] < MIN_A || arr[i] > MAX_A) || (i > 0 && arr[i] < arr[i - 1])) {
  256.                         isIncorrect = true;
  257.                         System.err.println("Диапазон значений A от " + MIN_A + " до " + MAX_A + ". Массивы должны быть упорядочены по возрастанию");
  258.                     }
  259.                 } while (isIncorrect);
  260.         }
  261.         return arr;
  262.     }
  263.  
  264.     public static int countSizeOfArrC(int[] arrA, int[] arrB) {
  265.         int count = 0;
  266.         int j = 0;
  267.  
  268.         for (int i = 0; i < arrA.length; i++) {
  269.             if (i == 0 || arrA[i] != arrA[i - 1]) {
  270.                 while (j < arrB.length && arrB[j] < arrA[i]) {
  271.                     if (j == 0 || arrB[j] != arrB[j - 1]) {
  272.                         count++;
  273.                     }
  274.                     j++;
  275.                 }
  276.                 if (j >= arrB.length || arrA[i] != arrB[j]) {
  277.                     count++;
  278.                 }
  279.             }
  280.         }
  281.  
  282.         for (int k = j; k < arrB.length; k++) {
  283.             if (k == 0 || arrB[k] != arrB[k - 1]) {
  284.                 count++;
  285.             }
  286.         }
  287.  
  288.         return count;
  289.     }
  290.  
  291.     public static int[] mergeArrays(int[] arrA, int[] arrB, int k)  {
  292.         int i = 0;
  293.         int j = 0;
  294.         int index = 0;
  295.         int[] arrC = new int[k];
  296.         while (i <= arrA.length - 1 && j <= arrB.length - 1) {
  297.             if (arrA[i] < arrB[j]) {
  298.                 if (index == 0 || arrC[index - 1] != arrA[i]) {
  299.                     arrC[index] = arrA[i];
  300.                     index++;
  301.                 }
  302.                 i++;
  303.             } else if (arrA[i] > arrB[j]) {
  304.                 if (index == 0 || arrC[index - 1] != arrB[j]) {
  305.                     arrC[index] = arrB[j];
  306.                     index++;
  307.                 }
  308.                 j++;
  309.             } else {
  310.                 if (index == 0 || arrC[index - 1] != arrA[i]) {
  311.                     arrC[index] = arrA[i];
  312.                     index++;
  313.                 }
  314.                 i++;
  315.                 j++;
  316.             }
  317.         }
  318.         while (i <= arrA.length - 1) {
  319.             if (index == 0 || arrC[index - 1] != arrA[i]) {
  320.                 arrC[index] = arrA[i];
  321.                 index++;
  322.             }
  323.             i++;
  324.         }
  325.         while (j <= arrB.length - 1) {
  326.             if (index == 0 || arrC[index - 1] != arrB[j]) {
  327.                 arrC[index] = arrB[j];
  328.                 index++;
  329.             }
  330.             j++;
  331.         }
  332.         return arrC;
  333.     }
  334.  
  335.     public static void printToConsole(int[] arrC, int k) {
  336.         for (int i = 0; i < k; i++) {
  337.             System.out.print(arrC[i] + " ");
  338.         }
  339.         System.out.println();
  340.     }
  341.  
  342.     public static void printToFile(String fileName, int[] arrC, int k) {
  343.         boolean isIncorrect;
  344.         isIncorrect = false;
  345.         do {
  346.             try (BufferedWriter fWriter = new BufferedWriter(new FileWriter(fileName))) {
  347.                 for (int i = 0; i < k; i++) {
  348.                     fWriter.write((arrC[i]) + " ");
  349.                 }
  350.                 System.out.println("Результат выведен в файле.");
  351.             } catch (IOException e) {
  352.                 System.err.println("Непредвиденная ошибка.");
  353.                 isIncorrect = true;
  354.                 fileName = requestFileNameForReading();
  355.             }
  356.         } while (isIncorrect);
  357.     }
  358.  
  359.     public static void main(String[] args) {
  360.         int choice;
  361.         int n;
  362.         int m;
  363.         int k;
  364.         int[] arrA;
  365.         int[] arrB;
  366.         int[] arrC;
  367.         String fileName;
  368.         System.out.println("Данная программа выполняет слияние двух упорядоченных по возрастанию массивов целых чисел в один упорядоченный массив (без повторений)." +
  369.                 "\nДиапазон размеров массивов : " + MIN_SIZE + "..." + MAX_SIZE +  "\nДиапазон для значений элементов массива : " + MIN_A +
  370.                 "..." + MAX_A + "\nПри работе с файлом в нём сначала должны быть прописаны размеры массивов, а затем сами массивы." +
  371.                 "\nОткуда Вы хотите вводить данные ? " + "1 - консоль, 2 - файл.");
  372.         choice = inputInteger(MIN_C, MAX_C);
  373.         if (choice == 1) {
  374.             System.out.println("Введите размер массива А.");
  375.             n = inputInteger(MIN_SIZE, MAX_SIZE);
  376.             arrA = createArray(n);
  377.             System.out.println("Введите размер массива В.");
  378.             m = inputInteger(MIN_SIZE, MAX_SIZE);
  379.             arrB = createArray(m);
  380.         } else {
  381.             fileName = requestFileNameForReading();
  382.                 n = inputSizeFromFileForArrA(fileName);
  383.                 m = inputSizeFromFileForArrB(fileName);
  384.                 arrA = readArrAFromFile(n, fileName);
  385.                 arrB = readArrBFromFile(m, fileName);
  386.         }
  387.         k = countSizeOfArrC(arrA, arrB);
  388.         arrC = mergeArrays(arrA, arrB, k);
  389.         System.out.println("Куда Вы хотите вывести результат? \n1 - консоль, 2 - файл.");
  390.         choice = inputInteger(MIN_C, MAX_C);
  391.         if (choice == 1) {
  392.             printToConsole(arrC, k);
  393.         } else {
  394.             fileName = requestFileNameForWriting();
  395.             printToFile(fileName, arrC, k);
  396.         }
  397.         in.close();
  398.     }
  399. }
  400.  
Advertisement
Add Comment
Please, Sign In to add comment