Advertisement
gguuppyy

lab43izm

Mar 27th, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.32 KB | Source Code | 0 0
  1. import java.io.File;
  2. import java.util.Scanner;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. public class Main {
  7.     public static final int
  8.             MIN_O = 1,
  9.             MAX_O = 10,
  10.             MIN_MAT = -1000000,
  11.             MAX_MAT = 1000000,
  12.             YES = 1,
  13.             NO = 2;
  14.     static Scanner scanConsole = new Scanner(System.in);
  15.     static Scanner scanFile;
  16.     static File file;
  17.     public static void printTask() {
  18.         System.out.println("Данная программа подсчитывает опредлтитель матрицы.\n");
  19.     }
  20.     public static boolean chooseFileInput() {
  21.         int isFileInput;
  22.         boolean isCorrect, choose;
  23.         isFileInput = 0;
  24.         choose = true;
  25.         do {
  26.             System.out.println("Вы хотите вводить матрицу через файл? (Да - " + YES + " / Нет - " + NO + ")");
  27.             isCorrect = true;
  28.             try {
  29.                 isFileInput = Integer.parseInt(scanConsole.nextLine());
  30.             } catch (NumberFormatException e) {
  31.                 System.out.println("Некорректный выбор!");
  32.                 isCorrect = false;
  33.             }
  34.             if (isCorrect) {
  35.                 if (isFileInput == 1)
  36.                     choose = true;
  37.                 else if (isFileInput == 2)
  38.                     choose = false;
  39.                 else {
  40.                     isCorrect = false;
  41.                     System.out.println("Некорректный выбор!");
  42.                 }
  43.             }
  44.         } while (!isCorrect);
  45.         return choose;
  46.     }
  47.     public static boolean checkUserArea(int num, int MIN, int MAX) {
  48.         boolean isCorrect;
  49.         if (num < MIN || num > MAX) {
  50.             System.out.println("Значение не попадает в диапазон!");
  51.             isCorrect = false;
  52.         }
  53.         else
  54.             isCorrect = true;
  55.         return isCorrect;
  56.     }
  57.     public static int readUserO(int num, int MIN, int MAX) {
  58.         boolean isCorrect;
  59.         do {
  60.             System.out.print("Введите порядок матрицы N[" + MIN + "; " + MAX + "]: ");
  61.             isCorrect = true;
  62.             try {
  63.                 num = Integer.parseInt(scanConsole.nextLine());
  64.             } catch (NumberFormatException e) {
  65.                 System.out.println("Проверьте корректность ввода данных!");
  66.                 isCorrect = false;
  67.             }
  68.             if (isCorrect)
  69.                 isCorrect = checkUserArea(num, MIN, MAX);
  70.         } while (!isCorrect);
  71.         return num;
  72.     }
  73.     public static int readUserMatrix(int num, int row, int col, int MIN, int MAX) {
  74.         boolean isCorrect;
  75.         do {
  76.             System.out.print("Введите в " + (row + 1) + " строке " + (col + 1) + " столбце элемент[" + MIN + "; " + MAX + "]: ");
  77.             isCorrect = true;
  78.             try {
  79.                 num = Integer.parseInt(scanConsole.nextLine());
  80.             } catch (NumberFormatException e) {
  81.                 System.out.println("Проверьте корректность ввода данных!");
  82.                 isCorrect = false;
  83.             }
  84.             if (isCorrect)
  85.                 isCorrect = checkUserArea(num, MIN, MAX);
  86.         } while (!isCorrect);
  87.         return num;
  88.     }
  89.     public static String readPathFile() {
  90.         boolean isCorrect;
  91.         int len;
  92.         String pathToFile;
  93.         do {
  94.             System.out.println("Введите путь к файлу с расширением .txt с матрицей, у которой разряд не должен превышать " + MAX_O + ", а её элементы должны лежать в пределе[" + MIN_MAT + ":" + MAX_MAT + "]: ");
  95.             pathToFile = scanConsole.nextLine();
  96.             len = pathToFile.length();
  97.             if (len > 4 && pathToFile.substring(len - 4).equals(".txt"))
  98.                 isCorrect = true;
  99.             else
  100.             {
  101.                 isCorrect = false;
  102.                 System.out.println("Расширение файла не .txt!");
  103.             }
  104.         } while (!isCorrect);
  105.         return pathToFile;
  106.     }
  107.     public static boolean isExists(String pathToFile) {
  108.         boolean isCorrect;
  109.         file = new File(pathToFile);
  110.         if (file.exists())
  111.             isCorrect = true;
  112.         else
  113.             isCorrect = false;
  114.         return isCorrect;
  115.     }
  116.     public static boolean isAbleToReading() {
  117.         boolean isCorrect;
  118.         if (file.canRead())
  119.             isCorrect = true;
  120.         else
  121.             isCorrect = false;
  122.         return isCorrect;
  123.     }
  124.     public static boolean isAbleToWriting() {
  125.         boolean isCorrect;
  126.         if (file.canWrite())
  127.             isCorrect = true;
  128.         else
  129.             isCorrect = false;
  130.         return isCorrect;
  131.     }
  132.     public static boolean isEmpty() {
  133.         boolean isCorrect;
  134.         if (file.length() == 0)
  135.             isCorrect = true;
  136.         else
  137.             isCorrect = false;
  138.         return isCorrect;
  139.     }
  140.     public static int readOrder() {
  141.         int order;
  142.         boolean isCorrect;
  143.         order = 0;
  144.         try {scanFile = new Scanner(file);} catch (FileNotFoundException e) {}
  145.         isCorrect = true;
  146.         try {
  147.             order = scanFile.nextInt();
  148.         } catch (NumberFormatException e) {
  149.             System.out.println("Проверьте порядок матрицы!");
  150.             isCorrect = false;
  151.         }
  152.         if (isCorrect)
  153.             isCorrect = checkUserArea(order, MIN_O, MAX_O);
  154.         if (isCorrect) {
  155.             if (!scanFile.hasNextLine()) {
  156.                 isCorrect = false;
  157.                 System.out.println("Неправильный порядок матрицы!");
  158.             }
  159.         }
  160.         scanFile.close();
  161.         if (!isCorrect)
  162.             order = -1;
  163.         return order;
  164.     }
  165.     public static boolean isRightNums() {
  166.         int k;
  167.         boolean isCorrect;
  168.         try {scanFile = new Scanner(file);} catch (FileNotFoundException e) {}
  169.         scanFile.nextLine();
  170.         isCorrect = true;
  171.         k = 0;
  172.         while (isCorrect && scanFile.hasNextInt()) {
  173.             try {
  174.                 k = scanFile.nextInt();
  175.             } catch (NumberFormatException e) {
  176.                 System.out.println("Некорректный тип данных внутри файла!");
  177.                 isCorrect = false;
  178.             }
  179.             if (isCorrect)
  180.                 isCorrect = checkUserArea(k, MIN_MAT, MAX_MAT);
  181.         }
  182.         scanFile.close();
  183.         return isCorrect;
  184.     }
  185.     public static boolean isOrdersEqual(int order) {
  186.         int rows, cols, k;
  187.         boolean isCorrect;
  188.         rows = 0;
  189.         try {scanFile = new Scanner(file);} catch (FileNotFoundException e) {}
  190.         scanFile.nextLine();
  191.         isCorrect = true;
  192.         while (isCorrect && scanFile.hasNext()) {
  193.             Scanner lineScanFile = new Scanner(scanFile.nextLine());
  194.             cols = 0;
  195.             while (isCorrect && lineScanFile.hasNextInt()) {
  196.                 k = lineScanFile.nextInt();
  197.                 cols++;
  198.                 isCorrect = checkUserArea(cols, MIN_O, MAX_O);
  199.             }
  200.             if (isCorrect) {
  201.                 rows++;
  202.                 isCorrect = checkUserArea(rows, MIN_O, MAX_O);
  203.                 if (cols != order)
  204.                     isCorrect = false;
  205.             }
  206.         }
  207.         scanFile.close();
  208.         if (isCorrect && rows != order)
  209.             isCorrect = false;
  210.         return isCorrect;
  211.     }
  212.     public static int[][] readFileMatrix(int order) {
  213.         int row, col;
  214.         int[][] matrix = new int[order][order];
  215.         row = 0;
  216.         col = 0;
  217.         try {scanFile = new Scanner(file);} catch (FileNotFoundException e) {}
  218.         scanFile.nextLine();
  219.         while (row < order) {
  220.             matrix[row] = new int[order];
  221.             while (col < order) {
  222.                 matrix[row][col] = scanFile.nextInt();
  223.                 col++;
  224.             }
  225.             col = 0;
  226.             row++;
  227.         }
  228.         scanFile.close();
  229.         return matrix;
  230.     }
  231.     public static int[][] readFile() {
  232.         String pathToFile;
  233.         int order;
  234.         boolean isCorrect;
  235.         int[][] matrix;
  236.         order = 0;
  237.         isCorrect = true;
  238.         do {
  239.             pathToFile = readPathFile();
  240.             if (!isExists(pathToFile)) {
  241.                 isCorrect = false;
  242.                 System.out.println("Проверьте корректность ввода пути к файлу!");
  243.             }
  244.             if (isCorrect && !isAbleToReading()) {
  245.                 isCorrect = false;
  246.                 System.out.println("Файл закрыт для чтения!");
  247.             }
  248.             if (isCorrect && !isAbleToWriting()) {
  249.                 isCorrect = false;
  250.                 System.out.println("Файл закрыт для записи!");
  251.             }
  252.             if (isCorrect && isEmpty()) {
  253.                 isCorrect = false;
  254.                 System.out.println("Файл пуст!");
  255.             }
  256.             if (isCorrect) {
  257.                 order = readOrder();
  258.                 if (order == -1)
  259.                     isCorrect = false;
  260.             }
  261.             if (isCorrect && !isRightNums())
  262.                 isCorrect = false;
  263.             if (isCorrect && !isOrdersEqual(order)) {
  264.                 isCorrect = false;
  265.                 System.out.println("Значения порядков не равны!");
  266.             }
  267.         } while (!isCorrect);
  268.         matrix = readFileMatrix(order);
  269.         return matrix;
  270.     }
  271.     public static void addAnswerToFile(int determinant) {
  272.         try {
  273.             FileWriter writer = new FileWriter(file, true);
  274.             writer.write("\nОпределитель матрицы: " + determinant);
  275.             writer.close();
  276.         } catch (IOException e) {}
  277.     }
  278.     public static int[][] readConsole() {
  279.         int order;
  280.         order = 0;
  281.         order = readUserO(order, MIN_O, MAX_O);
  282.         int[][] matrix = new int[order][order];
  283.         for (int row = 0; row < order; row++)
  284.             for (int col = 0; col < order; col++)
  285.                 matrix[row][col] = readUserMatrix(matrix[row][col], row, col, MIN_MAT, MAX_MAT);
  286.         return matrix;
  287.     }
  288.     public static int calcDeterminant(int[][] matrix) {
  289.         int size = matrix.length;
  290.  
  291.         if (size == 1) {
  292.             return matrix[0][0];
  293.         } else if (size == 2) {
  294.             return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
  295.         } else {
  296.             int determinant = 0;
  297.             int sign = 1;
  298.  
  299.             for (int i = 0; i < size; i++) {
  300.                 int[][] subMatrix = new int[size - 1][size - 1];
  301.  
  302.                 for (int j = 1; j < size; j++) {
  303.                     for (int k = 0; k < size; k++) {
  304.                         if (k < i) {
  305.                             subMatrix[j - 1][k] = matrix[j][k];
  306.                         } else if (k > i) {
  307.                             subMatrix[j - 1][k - 1] = matrix[j][k];
  308.                         }
  309.                     }
  310.                 }
  311.  
  312.                 determinant += sign * matrix[0][i] * calcDeterminant(subMatrix);
  313.                 sign *= -1;
  314.             }
  315.  
  316.             return determinant;
  317.         }
  318.     }
  319.     public static int getResultFromFile() {
  320.         int[][] matrix;
  321.         int determinant;
  322.         matrix = readFile();
  323.         determinant = calcDeterminant(matrix);
  324.         addAnswerToFile(determinant);
  325.         return determinant;
  326.     }
  327.     public static int getResultFromConsole() {
  328.         int[][] matrix;
  329.         int determinant;
  330.         matrix = readConsole();
  331.         determinant = calcDeterminant(matrix);
  332.         return determinant;
  333.     }
  334.     public static void printResult(int count) {
  335.         System.out.println("\nОпределитель матрицы " + count);
  336.     }
  337.     public static void main(String[] args) {
  338.         int determinant;
  339.         determinant = 0;
  340.         printTask();
  341.         if (chooseFileInput())
  342.             determinant = getResultFromFile();
  343.         else
  344.             determinant = getResultFromConsole();
  345.         scanConsole.close();
  346.         printResult(determinant);
  347.     }
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement