Advertisement
Sauka1337

4.3

May 19th, 2024
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.74 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.Scanner;
  3.  
  4. public class Main {
  5.     private static final int MAX_SIZE_VALUE = 20;
  6.     private static final int MIN_SIZE_VALUE = 1;
  7.     private static final int MAX_ELEMENT_VALUE = 1000;
  8.     private static final int MIN_ELEMENT_VALUE = -1000;
  9.  
  10.     public static void main(String[] args) {
  11.  
  12.         Scanner scanner = new Scanner(System.in);
  13.  
  14.         int[][]Matrix = new int[0][0];
  15.         int matrixSize = 0;
  16.  
  17.         System.out.println("This program finds matrix determinant.");
  18.  
  19.         int inputMethodChoice = chooseInputMethod();
  20.  
  21.  
  22.         if (inputMethodChoice == 1) {
  23.             matrixSize = setMatrixSize(scanner);
  24.             Matrix = new int[matrixSize][matrixSize];
  25.             fillMatrixManually(Matrix);
  26.  
  27.         } else if (inputMethodChoice == 2) {
  28.             String filePath = findFile();
  29.             matrixSize = getMatrixSize(scanner, filePath);
  30.             Matrix = new int[matrixSize][matrixSize];
  31.             Matrix = fillMatrixFromFile(filePath);
  32.  
  33.         }
  34.         int det = calculateDeterminant(Matrix, matrixSize);
  35.  
  36.         System.out.println("Determinant = " + (det) + ".");
  37.         writeToFile(det);
  38.     }
  39.  
  40.     private static int[][] fillMatrixManually(int[][] matrix) {
  41.         Scanner scanner = new Scanner(System.in);
  42.         System.out.println("Enter the elements for the matrix:");
  43.  
  44.         for (int i = 0; i < matrix.length; i++) {
  45.             for (int j = 0; j < matrix.length; j++) {
  46.                 boolean isCorrect;
  47.                 do {
  48.                     System.out.print("Element at position (" + (i + 1) + ", " + (j + 1) + "): ");
  49.                     isCorrect = true;
  50.                     try {
  51.                         matrix[i][j] = scanner.nextInt();
  52.                     } catch (Exception e) {
  53.                         System.out.println("Invalid input.");
  54.                         isCorrect = false;
  55.                         scanner.nextLine();
  56.                     }
  57.  
  58.                     if (isCorrect && (matrix[i][j] < MIN_ELEMENT_VALUE || matrix[i][j] > MAX_ELEMENT_VALUE)) {
  59.                         System.out.println("Please enter a value from " + MIN_ELEMENT_VALUE + " to " + MAX_ELEMENT_VALUE + "!");
  60.                         isCorrect = false;
  61.                     }
  62.                 } while (!isCorrect);
  63.             }
  64.         }
  65.         return matrix;
  66.     }
  67.  
  68.     private static int[][] fillMatrixFromFile(String path) {
  69.         int[][] Matrix;
  70.         Matrix = new int[0][0];
  71.         System.out.println("Reading matrix...");
  72.  
  73.         try (Scanner fileScanner = new Scanner(new File(path))) {
  74.             System.out.println("Reading file...");
  75.  
  76.             String line = fileScanner.nextLine();
  77.             String[] parts = line.split(" ");
  78.  
  79.             int matrixSize = Integer.parseInt(parts[0]);
  80.             Matrix = new int[matrixSize][matrixSize];
  81.  
  82.             for (int i = 0; i < matrixSize; i++) {
  83. //                String[] integerInString = fReader.readLine().split(" ");
  84.                 line = fileScanner.nextLine();
  85.                 parts = line.split(" ");
  86.                 for (int j = 0; j < matrixSize; j++) {
  87. //                    Matrix[i][j] = Integer.parseInt(integerInString[j]);
  88.                     Matrix[i][j] = Integer.parseInt(parts[j]);
  89.                     if (Matrix[i][j] < MIN_ELEMENT_VALUE || Matrix[i][j] > MAX_ELEMENT_VALUE) {
  90.                         System.out.println("The number entered is out of range! Enter the matrix from the console!");
  91.                         return fillMatrixManually(Matrix);
  92.                     }
  93.                 }
  94.             }
  95.         } catch (IOException e) {
  96.             System.out.println("Error reading file!");
  97.         }
  98.         return Matrix;
  99.     }
  100.  
  101.     private static int getMatrixSize(Scanner scanner, String path) {
  102.         int matrixSize = 0;
  103.         try (Scanner fileScanner = new Scanner(new File(path))) {
  104.  
  105.             String line = fileScanner.nextLine();
  106.             String[] parts = line.split(" ");
  107.  
  108.             matrixSize = Integer.parseInt(parts[0]);
  109.  
  110.             if (matrixSize < MIN_SIZE_VALUE || matrixSize > MAX_SIZE_VALUE) {
  111.                 System.out.println("The number entered is out of range! Enter the matrix size from the console!");
  112.                 matrixSize = setMatrixSize(scanner);
  113.             }
  114.         } catch (IOException e) {
  115.             System.out.println("Error reading file!");
  116.         }
  117.         return matrixSize;
  118.     }
  119.  
  120.     private static String findFile() {
  121.         Scanner scanner = new Scanner(System.in);
  122.         String filePath;
  123.         boolean isCorrect;
  124.  
  125.         do {
  126.             isCorrect = true;
  127.             System.out.println("Enter path to the file: ");
  128.             filePath = scanner.nextLine();
  129.  
  130.             File file = new File(filePath);
  131.  
  132.             if (!file.exists()) {
  133.                 isCorrect = false;
  134.                 System.out.println("File not found at the specified path.");
  135.             } else if (!filePath.toLowerCase().endsWith(".txt")) {
  136.                 isCorrect = false;
  137.                 System.out.println("Error, wrong file type! File should have .txt extension.");
  138.             }
  139.         } while (!isCorrect);
  140.  
  141.         System.out.println("Matrix file found.");
  142.         return filePath;
  143.     }
  144.  
  145.     private static void writeToFile(int determinant) {
  146.         System.out.print("Enter file name: ");
  147.         Scanner scanner = new Scanner(System.in);
  148.         String fileName = scanner.nextLine() + ".txt";
  149.  
  150.         try (FileWriter writer = new FileWriter(fileName)) {
  151.             writer.write("Determinant = " + determinant + ".");
  152.             System.out.println("Writing to the file is complete.");
  153.             writer.close();
  154.         } catch (IOException e) {
  155.             System.out.println("Error writing to file!");
  156.         }
  157.         System.out.println();
  158.     }
  159.  
  160.     private static int chooseInputMethod() {
  161.         int choice;
  162.         boolean isCorrect;
  163.  
  164.         choice = -1;
  165.  
  166.         do {
  167.             System.out.println("Choose an option:");
  168.             System.out.println("1. Input matrix manually");
  169.             System.out.println("2. Read matrix from a text file");;
  170.             isCorrect = true;
  171.             try {
  172.                 Scanner scanner = new Scanner(System.in);
  173.                 choice = scanner.nextInt();
  174.             } catch (NumberFormatException e) {
  175.                 System.out.println("Invalid input.");
  176.                 isCorrect = false;
  177.                 continue;
  178.             }
  179.  
  180.             if (!isCorrect || !(choice == 1 || choice == 2)) {
  181.                 System.out.println("Error! You have to input either 1 or 2.");
  182.                 isCorrect = false;
  183.             }
  184.         } while (!isCorrect);
  185.         return choice;
  186.     }
  187.  
  188.     private static int setMatrixSize(Scanner scanner) {
  189.         boolean isCorrect;
  190.         int rows = 0;
  191.  
  192.         do {
  193.             System.out.print("Enter the order of the square matrix A: ");
  194.             isCorrect = true;
  195.             try {
  196.                 rows = scanner.nextInt();
  197.             } catch (Exception e) {
  198.                 System.out.println("Invalid input.");
  199.                 isCorrect = false;
  200.                 continue;
  201.             }
  202.  
  203.             if (isCorrect && (rows < MIN_SIZE_VALUE || rows > MAX_SIZE_VALUE)) {
  204.                 System.out.println("Please enter a value from " + MIN_SIZE_VALUE + " to " + MAX_SIZE_VALUE + "!");
  205.                 isCorrect = false;
  206.             }
  207.  
  208.         } while (!isCorrect);
  209.  
  210.         return rows;
  211.     }
  212.     public static int calculateDeterminant(int[][] matrix, int size) {
  213.         if (size == 1) {
  214.             return matrix[0][0];
  215.         } else {
  216.             int result = 0;
  217.             int sign = 1;
  218.             int[][] minor = new int[size - 1][size - 1];
  219.  
  220.             for (int i = 0; i < size - 1; i++) {
  221.                 minor[i] = new int[size - 1];
  222.             }
  223.  
  224.             for (int k = 0; k < size; k++) {
  225.                 int minorRow = 0;
  226.                 for (int i = 1; i < size; i++) {
  227.                     int minorCol = 0;
  228.                     for (int j = 0; j < size; j++) {
  229.                         if (j != k) {
  230.                             minor[minorRow][minorCol] = matrix[i][j];
  231.                             minorCol++;
  232.                         }
  233.                     }
  234.                     minorRow++;
  235.                 }
  236.  
  237.                 result += sign * matrix[0][k] * calculateDeterminant(minor, size - 1);
  238.  
  239.                 sign = -sign;
  240.             }
  241.  
  242.             for (int i = 0; i < size - 1; i++) {
  243.                 // Clean up memory by releasing the minor matrix rows
  244.                 minor[i] = null;
  245.             }
  246.             // Clean up memory by releasing the minor matrix itself
  247.             minor = null;
  248.  
  249.             return result;
  250.         }
  251.     }
  252.  
  253. }
  254.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement