anticlown

Laba.4.Dop.1_Determinant(Java)

Mar 3rd, 2023 (edited)
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.04 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.io.*;
  3.  
  4. final class inpData {
  5.     public int size;
  6.     public int[][] matrix;
  7.  
  8.     public inpData(int size, int[][] matrix) {
  9.         this.size = size;
  10.         this.matrix = matrix;
  11.     }
  12. }
  13.  
  14. public class Main {
  15.     private static final int MIN_SIZE = 2;
  16.     private static final int MAX_SIZE = 10;
  17.     private static final int MIN_VALUE = -1000;
  18.     private static final int MAX_VALUE = 1000;
  19.     private static final Scanner scan = new Scanner(System.in);
  20.  
  21.     public static void outputTaskInfo() {
  22.         System.out.println("Данная программа находит определитель заданной матрицы." + "\n" +
  23.                 "Диапазон ввода значений порядка матрицы : " + MIN_SIZE + "..." + MAX_SIZE + ". \n" +
  24.                 "Диапазон ввода значений элементов матрицы: " + MIN_VALUE + "..." +  MAX_VALUE + ".");
  25.     }
  26.  
  27.     public static int getVerificationOfChoice() {
  28.         int choice = 0;
  29.         boolean isIncorrect;
  30.  
  31.         do {
  32.             isIncorrect = false;
  33.             try {
  34.                 choice = Integer.parseInt(scan.nextLine());
  35.             } catch (NumberFormatException e) {
  36.                 System.out.println("Проверьте корректность ввода данных!");
  37.                 isIncorrect = true;
  38.             }
  39.             if (!isIncorrect && (choice != 0 && choice != 1)) {
  40.                 System.out.println("Для выбора введите 0 или 1!");
  41.                 isIncorrect = true;
  42.             }
  43.         } while (isIncorrect);
  44.  
  45.         return choice;
  46.     }
  47.  
  48.     public static String inputPathToFile() {
  49.         boolean isIncorrect;
  50.         String path;
  51.  
  52.         System.out.println("Укажите путь к файлу: ");
  53.  
  54.         do {
  55.             isIncorrect = false;
  56.             path = scan.nextLine();
  57.             File file = new File(path);
  58.  
  59.             if (!file.exists()) {
  60.                 System.out.println("По указанному пути файл не найден! Укажите правильный путь: ");
  61.                 isIncorrect = true;
  62.             }
  63.         } while (isIncorrect);
  64.  
  65.         return path;
  66.     }
  67.  
  68.     public static int readSizeFromConsole(){
  69.         int size = 0;
  70.         boolean isIncorrect;
  71.  
  72.         System.out.println("Введите значение размера матрицы: ");
  73.  
  74.         do {
  75.             isIncorrect = false;
  76.             try {
  77.                 size = Integer.parseInt(scan.nextLine());
  78.             } catch (NumberFormatException e) {
  79.                 System.out.println("Проверьте корректность ввода данных!");
  80.                 isIncorrect = true;
  81.             }
  82.             if (!isIncorrect && (size < MIN_SIZE || size > MAX_SIZE)) {
  83.                 System.out.println("Введите число от " + MIN_SIZE + " до " + MAX_SIZE + "!");
  84.                 isIncorrect = true;
  85.             }
  86.         } while (isIncorrect);
  87.  
  88.         return size;
  89.     }
  90.  
  91.     public static int readSizeFromFile(final String path) {
  92.         int size;
  93.  
  94.         System.out.println("Происходит чтение размеров матрицы...");
  95.  
  96.         try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  97.             size = Integer.parseInt(br.readLine());
  98.             if (size < MIN_SIZE || size > MAX_SIZE) {
  99.                 System.out.println("Ошибка при считывании размера из файла!Введите размер с консоли!");
  100.                 size = readSizeFromConsole();
  101.             }
  102.         } catch (Exception e) {
  103.             System.out.println("Ошибка при считывании размера из файла!Введите размер с консоли!");
  104.             size = readSizeFromConsole();
  105.         }
  106.  
  107.         return size;
  108.     }
  109.  
  110.     public static void outputSize(final int choice, int size, String path) {
  111.         boolean isIncorrect;
  112.  
  113.         if (choice == 0)
  114.             System.out.println("Размер матрицы равен " + size + ".");
  115.         if (choice == 1) {
  116.             System.out.println("Вывод значения раземера в файл...");
  117.  
  118.             do {
  119.                 isIncorrect = false;
  120.                 try {
  121.                     FileWriter writer = new FileWriter(path);
  122.                     writer.write(size + "\n");
  123.                     writer.close();
  124.                 } catch (IOException e) {
  125.                     isIncorrect = true;
  126.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  127.                     path = inputPathToFile();
  128.                 }
  129.             } while (isIncorrect);
  130.  
  131.             System.out.println("Данные успешно записаны в файл!");
  132.         }
  133.     }
  134.  
  135.     public static int[][] fillMatrixFromConsole(final int size) {
  136.         int[][] matrix = new int[size][size];
  137.         boolean isIncorrect;
  138.  
  139.         for (int i = 0; i < size; i++) {
  140.             for (int j = 0; j < size; j++) {
  141.                 System.out.println("Введите значение элемента " + (i + 1) + "-ой строки " + (j + 1) + "-го столбца матрицы: ");
  142.  
  143.                 do {
  144.                     isIncorrect = false;
  145.                     try {
  146.                         matrix[i][j] = Integer.parseInt(scan.nextLine());
  147.                     } catch (NumberFormatException e) {
  148.                         System.out.println("Проверьте корректность ввода данных!");
  149.                         isIncorrect = true;
  150.                     }
  151.  
  152.                     if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE)) {
  153.                         isIncorrect = true;
  154.                         System.out.println("Введите число от " + MIN_VALUE + " до " + MAX_VALUE + "!");
  155.                     }
  156.                 } while (isIncorrect);
  157.             }
  158.         }
  159.  
  160.         return matrix;
  161.     }
  162.  
  163.     public static int[][] fillMatrixFromFile (final int size, final String path) throws FileNotFoundException {
  164.         int[][] matrix = new int[size][size];
  165.         int count = 0 ;
  166.         Scanner fr = new Scanner(new File(path));
  167.  
  168.         System.out.println("Чтение матрицы...");
  169.         fr.nextLine();
  170.         while (fr.hasNext()) {
  171.             fr.next();
  172.             count++;
  173.         }
  174.  
  175.         fr.close();
  176.  
  177.         if (count > size * size) {
  178.             System.out.println("Ошибка при чтении матрицы! Введите матрицу с консоли!");
  179.             matrix = fillMatrixFromConsole(size);
  180.         } else {
  181.             fr = new Scanner(new File(path));
  182.             fr.nextLine();
  183.  
  184.             for (int i = 0; i < size; i++) {
  185.                 for (int j = 0; j < size; j++) {
  186.                     try {
  187.                         matrix[i][j] = fr.nextInt();
  188.                     } catch (Exception e) {
  189.                         System.out.println("Ошибка при считывании матрицы из файла!Введите матрицу с консоли!");
  190.                         matrix = fillMatrixFromConsole(size);
  191.                     }
  192.                     if (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE) {
  193.                         System.out.println("Ошибка при считывании матрицы из файла!Введите матрицу с консоли!");
  194.                         matrix = fillMatrixFromConsole(size);
  195.                     }
  196.                 }
  197.             }
  198.         }
  199.  
  200.         return matrix;
  201.     }
  202.  
  203.     public static void outputMatrix(final int choice, String path, final int[][] matrix, final int size) {
  204.         boolean isIncorrect;
  205.  
  206.         if (choice == 0) {
  207.             System.out.println("Вывод начальной матрицы: ");
  208.             for (int i = 0; i < size; i++)
  209.             {
  210.                 for (int j = 0; j < size; j++)
  211.                     System.out.print(matrix[i][j] + "\t");
  212.                 System.out.print("\n");
  213.             }
  214.             System.out.print("\n");
  215.         }
  216.  
  217.         if (choice == 1) {
  218.             System.out.println("Вывод начальной матрицы в файл...");
  219.  
  220.             do {
  221.                 isIncorrect = false;
  222.                 try {
  223.                     FileWriter writer = new FileWriter(path, true);
  224.                     BufferedWriter bufferWriter = new BufferedWriter(writer);
  225.  
  226.                     for (int i = 0; i < size; i++)
  227.                     {
  228.                         for (int j = 0; j < size; j++)
  229.                             bufferWriter.write(matrix[i][j] + "\t");
  230.                         bufferWriter.write("\n");
  231.                     }
  232.                     bufferWriter.write("\n");
  233.  
  234.                     bufferWriter.close();
  235.                     writer.close();
  236.                 } catch (IOException e) {
  237.                     isIncorrect = true;
  238.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  239.                     path = inputPathToFile();
  240.                 }
  241.             } while (isIncorrect);
  242.  
  243.             System.out.println("Данные успешно записаны в файл!");
  244.         }
  245.     }
  246.  
  247.     public static int findDeterminant(final int[][] matrix){
  248.         int i, j, m, counter, k, sum, sign;
  249.         sum = 0;
  250.         if (matrix.length == 1) {
  251.             sum = matrix[0][0];
  252.         } else {
  253.             int[][] minor = new int[matrix.length - 1][matrix.length - 1];
  254.             counter = 0;
  255.             for (k = 0; k < matrix.length; k++) {
  256.                 sign = -1;
  257.                 for (m = 0; m < k + 1; m++)
  258.                     sign = -sign;
  259.                 for (i = 1; i < matrix.length; i++)
  260.                     for (j = 0; j < matrix.length; j++)
  261.                         if (j != k) {
  262.                             minor[i - 1][counter % (matrix.length - 1)] = matrix[i][j];
  263.                             counter++;
  264.                         }
  265.                 sum += sign * matrix[0][k] * findDeterminant(minor);
  266.             }
  267.         }
  268.         return sum;
  269.     }
  270.  
  271.     public static void outputDeterminant(final int choice, String path, final int determinant) {
  272.         boolean isIncorrect;
  273.  
  274.         if (choice == 0)
  275.             System.out.println("Определитель матрицы равен " + determinant + ".");
  276.         if (choice == 1) {
  277.             System.out.println("Вывод значения определителя матрицы в файл...");
  278.  
  279.             do {
  280.                 isIncorrect = false;
  281.                 try {
  282.                     FileWriter writer = new FileWriter(path);
  283.                     writer.write(determinant + "\n");
  284.                     writer.close();
  285.                 } catch (IOException e) {
  286.                     isIncorrect = true;
  287.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  288.                     path = inputPathToFile();
  289.                 }
  290.             } while (isIncorrect);
  291.  
  292.             System.out.println("Данные успешно записаны в файл!");
  293.         }
  294.     }
  295.  
  296.     public static inpData processUserInput() throws FileNotFoundException {
  297.         int size = 0;
  298.         int choiceForInput;
  299.         int[][] matrix = new int[0][];
  300.         String pathToIn;
  301.  
  302.         System.out.println("Вы желаете ввести данные с консоли(0) или взять данные из файла(1)?");
  303.         choiceForInput = getVerificationOfChoice();
  304.  
  305.         if (choiceForInput == 0) {
  306.             size = readSizeFromConsole();
  307.             matrix = fillMatrixFromConsole(size);
  308.         }
  309.         if (choiceForInput == 1) {
  310.             pathToIn = inputPathToFile();
  311.             size = readSizeFromFile(pathToIn);
  312.             matrix = fillMatrixFromFile(size, pathToIn);
  313.         }
  314.         return new inpData(size, matrix);
  315.     }
  316.  
  317.     public static void processUserOutput(int size, int[][] matrix, int determinant) {
  318.         int choiceForOutput;
  319.         String pathToOut = "";
  320.  
  321.         System.out.println("Вы желаете получить результат в консоли(0) или в файле(1)?");
  322.         choiceForOutput = getVerificationOfChoice();
  323.  
  324.         if (choiceForOutput == 1)
  325.             pathToOut = inputPathToFile();
  326.         outputSize(choiceForOutput, size, pathToOut);
  327.         outputMatrix(choiceForOutput, pathToOut, matrix, size);
  328.         outputDeterminant(choiceForOutput, pathToOut, determinant);
  329.     }
  330.  
  331.     public static void main (String[] args) throws FileNotFoundException {
  332.         outputTaskInfo();
  333.         inpData data = processUserInput();
  334.         int determinant = findDeterminant(data.matrix);
  335.         processUserOutput(data.size, data.matrix, determinant);
  336.  
  337.         scan.close();
  338.     }
  339. }
Add Comment
Please, Sign In to add comment