ksyshshot

Untitled

Nov 5th, 2022
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.60 KB | Source Code | 0 0
  1. import java.util.Scanner;
  2. import java.io.*;
  3. public class Main {
  4.  
  5.     static Scanner scan = new Scanner(System.in);
  6.  
  7.     public static void main(String[] args) {
  8.         writeTask();
  9.         solution();
  10.         scan.close();
  11.     }
  12.  
  13.     public static void writeTask() {
  14.         System.out.println("Данная программа находит седловую точку квадратной матрицы");
  15.     }
  16.  
  17.     public static String fileInputPath(boolean isFileForRead){
  18.         boolean isNotCorrect;
  19.         String path;
  20.         if (isFileForRead) {
  21.             System.out.println("Введите путь к файлу для чтения: ");
  22.         } else {
  23.             System.out.println("Введите путь к файлу для записи: ");
  24.         }
  25.         do {
  26.             isNotCorrect = false;
  27.             path = scan.nextLine();
  28.             File file = new File(path);
  29.             if (!file.exists()) {
  30.                 isNotCorrect = true;
  31.                 System.out.println("Файл не найден. Повторите попытку...");
  32.             }
  33.         } while (isNotCorrect);
  34.         return path;
  35.     }
  36.  
  37.     public static int fileInputMatrixOrder(String path) {
  38.         final int MAX_ORDER = 10;
  39.         final int MIN_ORDER = 2;
  40.         boolean isFileForRead = true;
  41.         boolean isNotCorrect;
  42.         int order = 0;
  43.         do {
  44.             isNotCorrect = false;
  45.             try(Scanner fileReader = new Scanner (new File (path))) {
  46.                 try {
  47.                     order = Integer.parseInt(fileReader.next());
  48.                 } catch (NumberFormatException e) {
  49.                     System.out.print("Некорректно введённый порядок матрицы. ");
  50.                     isNotCorrect = true;
  51.                 }
  52.                 if ((!isNotCorrect) && ((order < MIN_ORDER) || (order > MAX_ORDER))) {
  53.                     System.out.print("Порядок матрицы неверного диапазона! ");
  54.                     isNotCorrect = true;
  55.                 }
  56.             } catch (IOException e) {
  57.                 isNotCorrect = true;
  58.                 System.out.print("Не удалось открыть файл. ");
  59.             }
  60.             if (isNotCorrect)  {
  61.                 System.out.println("Повторите попытку...");
  62.                 path = fileInputPath(isFileForRead);
  63.             }
  64.         } while (isNotCorrect);
  65.         return order;
  66.     }
  67.  
  68.     public static int[][] fileMatrixInput(String path, int order) {
  69.         boolean isNotCorrect;
  70.         boolean isFileForRead = true;
  71.         int[][] matrix = new int[order][order];
  72.         int i = 0;
  73.         int j;
  74.         do {
  75.             isNotCorrect = false;
  76.             try(Scanner fileReader = new Scanner (new File (path))) {
  77.                 fileReader.nextLine();
  78.                 while ((!isNotCorrect) && (i < order)) {
  79.                     j = 0;
  80.                     while ((!isNotCorrect) && (j < order)) {
  81.                         try {
  82.                             matrix[i][j] = Integer.parseInt(fileReader.next());
  83.                         } catch (NumberFormatException e) {
  84.                             System.out.print("Ошибка! Найдено некорректное значение элемента матрицы. ");
  85.                             isNotCorrect = true;
  86.                             i--;
  87.                         }
  88.                         j++;
  89.                     }
  90.                     i++;
  91.                 }
  92.             } catch (IOException e) {
  93.                 isNotCorrect = true;
  94.                 System.out.print("Не удалось открыть файл. ");
  95.             }
  96.             if (isNotCorrect) {
  97.                 System.out.println("Повторите попытку...");
  98.                 path = fileInputPath(isFileForRead);
  99.             }
  100.         } while (isNotCorrect);
  101.         return matrix;
  102.     }
  103.  
  104.     public static int consoleInputMatrixOrder() {
  105.         final int MAX_ORDER = 10;
  106.         final int MIN_ORDER = 2;
  107.         boolean isNotCorrect;
  108.         int order = 0;
  109.         do {
  110.             System.out.println("Введите порядок квадратной матрицы");
  111.             isNotCorrect = false;
  112.             try {
  113.                 order = Integer.parseInt(scan.nextLine());
  114.             } catch (NumberFormatException e) {
  115.                 System.out.println("Ошибка ввода! Повторите попытку...");
  116.                 isNotCorrect = true;
  117.             }
  118.             if ((!isNotCorrect) && ((order < MIN_ORDER) || (order > MAX_ORDER))) {
  119.                 System.out.println("Ошибка ввода! Проверьте, входит ли ваше\nзначение порядка в диапазон, и повторите попытку");
  120.                 isNotCorrect = true;
  121.             }
  122.         } while (isNotCorrect);
  123.         return order;
  124.     }
  125.  
  126.     public static int[][] consoleMatrixCreation(int order) {
  127.         final int MAX_ELEMENT = 2147483647;
  128.         final int MIN_ELEMENT = -2147483648;
  129.         boolean isNotCorrect;
  130.         int[][] matrix = new int[order][order];
  131.         for (int i = 0; i < order; i++) {
  132.             for (int j = 0; j < order; j++) {
  133.                 do {
  134.                     System.out.println("Введите " + (j + 1) + " элемент " + (i + 1) + " строки");
  135.                     isNotCorrect = false;
  136.                     try {
  137.                         matrix[i][j] = Integer.parseInt(scan.nextLine());
  138.                     } catch (NumberFormatException e) {
  139.                         System.out.println("Ошибка ввода! Повторите попытку...");
  140.                         isNotCorrect = true;
  141.                     }
  142.                     if ((!isNotCorrect) && ((matrix[i][j] < MIN_ELEMENT) || (matrix[i][j] > MAX_ELEMENT))) {
  143.                         System.out.println("Ошибка ввода! Введено число неверного диапазона!");
  144.                         isNotCorrect = true;
  145.                     }
  146.                 } while (isNotCorrect);
  147.             }
  148.         }
  149.         return matrix;
  150.     }
  151.  
  152.  
  153.     public static void consoleMatrixOutput(int[][] matrix) {
  154.         System.out.println("Исходная матрица:");
  155.         for (int i = 0; i < matrix.length; i++) {
  156.             for (int j = 0; j < matrix.length; j++) {
  157.                 System.out.print(matrix[i][j] + " ");
  158.             }
  159.             System.out.println();
  160.         }
  161.     }
  162.  
  163.     public static int[] smallestElementsInLine(int[][] matrix, int order) {
  164.         int[] minIndexes = new int[order];
  165.         int min;
  166.         for (int i = 0; i < order; i++) {
  167.             min = matrix[i][0];
  168.             minIndexes[i] = 0;
  169.             for (int j = 1; j < order; j++) {
  170.                 if (matrix[i][j] <= min) {
  171.                     min = matrix[i][j];
  172.                     minIndexes[i] = j;
  173.                 }
  174.             }
  175.         }
  176.         return minIndexes;
  177.     }
  178.  
  179.     public static int[] largestElementsInColumn(int[][] matrix, int order) {
  180.         int[] maxIndexes = new int[order];
  181.         int max;
  182.         for (int j = 0; j < order; j++) {
  183.             max = matrix[0][j];
  184.             maxIndexes[j] = 0;
  185.             for (int i = 0; i < order; i++) {
  186.                 if (matrix[i][j] >= max) {
  187.                     max = matrix[i][j];
  188.                     maxIndexes[j] = i;
  189.                 }
  190.             }
  191.         }
  192.         return maxIndexes;
  193.     }
  194.  
  195.     public static void findingMatrixSaddlePoints(int[][] matrix, boolean isConsoleAnswer) {
  196.         int saddlePoint = 0;
  197.         int order = matrix.length;
  198.         int[] minElemIndexes = smallestElementsInLine(matrix, order);
  199.         int[] maxElemIndexes = largestElementsInColumn(matrix, order);
  200.         boolean isNotCorrect;
  201.         boolean isSaddlePoint = false;
  202.         String path;
  203.         for (int i = 0; i < order; i++) {
  204.             for (int j = 0; j < order; j++) {
  205.                 if ((minElemIndexes[i] == j) && (maxElemIndexes[j] == i)) {
  206.                     saddlePoint = matrix[i][j];
  207.                     isSaddlePoint = true;
  208.                 }
  209.             }
  210.         }
  211.         if (isConsoleAnswer) {
  212.             if (isSaddlePoint) {
  213.                 System.out.println("Седловая точка матрицы: " + saddlePoint);
  214.             } else {
  215.                 System.out.println("Седловой точки нет");
  216.             }
  217.         } else {
  218.             boolean isFileForRead = false;
  219.             do {
  220.                 isNotCorrect = false;
  221.                 path = fileInputPath(isFileForRead);
  222.                 try (FileWriter fileWriter = new FileWriter(new File(path))) {
  223.                      if (isSaddlePoint) {
  224.                              fileWriter.write("Седловая точка матрицы: " + saddlePoint);
  225.                      } else {
  226.                          fileWriter.write("Седловой точки нет");
  227.                      }
  228.                 } catch (IOException e) {
  229.                     System.out.println("Не удалось открыть файл. Повторите попытку...");
  230.                     isNotCorrect = true;
  231.                 }
  232.             } while (isNotCorrect);
  233.             System.out.println("Седловая точка записана в файл");
  234.         }
  235.     }
  236.  
  237.     public static int[][] fileChoice() {
  238.         boolean isFileForRead = true;
  239.         String path = fileInputPath(isFileForRead);
  240.         int order = fileInputMatrixOrder(path);
  241.         int[][] matrix = fileMatrixInput(path, order);
  242.         return matrix;
  243.     }
  244.  
  245.     public static int[][] consoleChoice() {
  246.         int order = consoleInputMatrixOrder();
  247.         int[][] matrix = consoleMatrixCreation(order);
  248.         consoleMatrixOutput(matrix);
  249.         return matrix;
  250.     }
  251.  
  252.     public static int chooseOutputMethod() {
  253.         boolean isNotCorrect;
  254.         int choice = 0;
  255.         do {
  256.             isNotCorrect = false;
  257.             try {
  258.                 choice = Integer.parseInt(scan.nextLine());
  259.             } catch (NumberFormatException e) {
  260.                 System.out.println("Число введено некорректно. Повторите попытку...");
  261.                 isNotCorrect = true;
  262.             }
  263.             if ((!isNotCorrect) && (choice != 1) && (choice != 2)) {
  264.                 System.out.println("Введите либо 1, либо 2. Ваш выбор: ");
  265.                 isNotCorrect = true;
  266.             }
  267.         } while (isNotCorrect);
  268.         return choice;
  269.     }
  270.  
  271.     public static void solution() {
  272.         boolean isConsoleAnswer = false;
  273.         System.out.println("Введите число, чтобы выбрать способ решения задания:\n1 - через консоль, 2 - с помощью файлов");
  274.         int choice = chooseOutputMethod();
  275.         if (choice == 1) {
  276.             isConsoleAnswer = true;
  277.             int[][] matrix = consoleChoice();
  278.             findingMatrixSaddlePoints(matrix, isConsoleAnswer);
  279.         } else {
  280.             int[][] matrix = fileChoice();
  281.             System.out.println("Введите число, чтобы выбрать способ вывода решения задания:\n1 - через консоль, 2 - с помощью файлов");
  282.             choice = chooseOutputMethod();
  283.             if (choice == 1) {
  284.                 isConsoleAnswer = true;
  285.                 findingMatrixSaddlePoints(matrix, isConsoleAnswer);
  286.             } else {
  287.                 findingMatrixSaddlePoints(matrix, isConsoleAnswer);
  288.             }
  289.         }
  290.     }
  291. }
Add Comment
Please, Sign In to add comment