Advertisement
Vladislav8653

laba_3_5_java

Dec 8th, 2022 (edited)
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.91 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.Scanner;
  3.  
  4. public class Main {
  5.     public static Scanner in = new Scanner(System.in);
  6.     private static Scanner fileScanner;
  7.  
  8.     private static int inputData() {
  9.         int n = 0;
  10.         boolean isIncorrect;
  11.         do {
  12.             isIncorrect = false;
  13.             try {
  14.                 n = Integer.parseInt(in.nextLine());
  15.             } catch (Exception e) {
  16.                 isIncorrect = true;
  17.                 System.out.println("Please, enter a integer number:");
  18.             }
  19.         } while (isIncorrect);
  20.         return n;
  21.     }
  22.  
  23.     public static int readCountRoots() {
  24.         final int MIN_COUNT = 2;
  25.         final int MAX_COUNT = 10;
  26.         int tmpCountRoots ;
  27.         boolean isIncorrect;
  28.         do {
  29.             isIncorrect = false;
  30.             System.out.println("Enter the number of unknowns of the system of equations (an integer in the range from 2 to 10:)");
  31.             tmpCountRoots = inputData();
  32.             if (tmpCountRoots < MIN_COUNT || tmpCountRoots > MAX_COUNT) {
  33.                 System.out.println("You are out of input range!:");
  34.                 isIncorrect = true;
  35.             }
  36.         } while (isIncorrect);
  37.         return tmpCountRoots;
  38.     }
  39.  
  40.     private static boolean choose() {
  41.         int inputNumber;
  42.         boolean isIncorrect;
  43.         final int MIN_NUM = 0;
  44.         final int MAX_NUM = 1;
  45.         do {
  46.             isIncorrect = false;
  47.             inputNumber = inputData();
  48.             if (inputNumber < MIN_NUM || inputNumber > MAX_NUM) {
  49.                 System.out.println("You are out of input range!:");
  50.                 isIncorrect = true;
  51.             }
  52.         } while (isIncorrect);
  53.         if (inputNumber == 1)
  54.             return true;
  55.         else
  56.             return false;
  57.     }
  58.  
  59.     public static double inputMatrixCell() {
  60.         return inputData();
  61.     }
  62.  
  63.     private static double[][] inputTriangularMatrixConsole(int tmpCountRoots) {
  64.         double[][] arrOfMatrixElements = new double[tmpCountRoots][tmpCountRoots];
  65.         for (int i = 0; i < tmpCountRoots; i++)
  66.             arrOfMatrixElements[i] = new double[tmpCountRoots];
  67.         for (int i = 0; i < tmpCountRoots; i++) {
  68.             for (int j = 0; j < tmpCountRoots; j++) {
  69.                 if (j - i > -1) {
  70.                     System.out.print("a[" + (i + 1) + "," + (j + 1) + "] = ");
  71.                     arrOfMatrixElements[i][j] = inputMatrixCell();
  72.                 }
  73.             }
  74.         }
  75.         return arrOfMatrixElements;
  76.     }
  77.  
  78.     private static double[] inputFreeMembersConsole(int tmpCountRoots) {
  79.         double[] arrOfFreeMembers = new double[tmpCountRoots];
  80.         for (int i = 0; i < tmpCountRoots; i++) {
  81.             System.out.print("b[" + (i + 1) + "] = ");
  82.             arrOfFreeMembers[i] = inputMatrixCell();
  83.         }
  84.         return arrOfFreeMembers;
  85.     }
  86.  
  87.     private static double[][] randomizeOtherElements(int tmpCountRoots, double[][] arrOfMatrixElements) { //рандом элементов ниже главное диагонали
  88.         double max = arrOfMatrixElements[0][0];
  89.         double min = arrOfMatrixElements[0][0];
  90.         for (int i = 0; i < tmpCountRoots; i++) {
  91.             for (int j = 0; j < tmpCountRoots; j++) {
  92.                 if (arrOfMatrixElements[i][j] > max)
  93.                     max = arrOfMatrixElements[i][j];
  94.                 if (arrOfMatrixElements[i][j] < min)
  95.                     min = arrOfMatrixElements[i][j];
  96.             }
  97.         }
  98.         double diff = max - min;
  99.         double[][] arrOfMatrixElementsRandom = new double[tmpCountRoots][tmpCountRoots];
  100.         for (int i = 0; i < tmpCountRoots; i++)
  101.             arrOfMatrixElementsRandom[i] = new double[tmpCountRoots];
  102.         for (int i = 0; i < tmpCountRoots; i++) {
  103.             for (int j = 0; j < tmpCountRoots; j++) {
  104.                 if (j - i < 0) {
  105.                     arrOfMatrixElementsRandom[i][j] = min + Math.random() * diff;
  106.                 }
  107.             }
  108.         }
  109.         return arrOfMatrixElementsRandom;
  110.     }
  111.  
  112.     private static double[][] createMatrix(double[][] arrOfMatrixElements, int tmpCountRoots, double[][] arrOfMatrixElementsRandom, double[] arrOfFreeMembers) {
  113.         double[][] matrix = new double[tmpCountRoots][tmpCountRoots + 1];
  114.         for (int i = 0; i < tmpCountRoots; i++)
  115.             matrix[i] = new double[tmpCountRoots + 1];
  116.         for (int i = 0; i < tmpCountRoots; i++) {
  117.             for (int j = 0; j < tmpCountRoots; j++) {
  118.                 if (j - i < 0)
  119.                     matrix[i][j] = arrOfMatrixElementsRandom[i][j];
  120.                 if (j - i > -1)
  121.                     matrix[i][j] = arrOfMatrixElements[i][j];
  122.             }
  123.         }
  124.         for (int i = 0; i < tmpCountRoots; i++) {
  125.             matrix[i][tmpCountRoots] = arrOfFreeMembers[i];
  126.         }
  127.         return matrix;
  128.     }
  129.  
  130.     public static void writeMatrixInC(double[][] matrix) {
  131.         int lastNum = matrix.length + 1;
  132.         System.out.println("Your virgin matrix:");
  133.         for (int i = 0; i < matrix.length; i++) {
  134.             for (int j = 0; j < lastNum; j++) {
  135.                 System.out.print(matrix[i][j] + " ");
  136.             }
  137.             System.out.println();
  138.         }
  139.     }
  140.  
  141.     //сам алгос прямого хода ниже
  142.     public static void moveStrings(double[][] matrix, int firstRow, int secondRow) {
  143.         int lastNum = matrix.length + 1;
  144.         double r;
  145.         if ((firstRow < lastNum) && (secondRow < lastNum)) {
  146.             for (int j = 0; j < lastNum; j++) {
  147.                 r = matrix[secondRow][j];
  148.                 matrix[secondRow][j] = matrix[firstRow][j];
  149.                 matrix[firstRow][j] = r;
  150.             }
  151.         }
  152.     }
  153.  
  154.     public static double[][] newMatrix(double[][] matrix) {
  155.         int tmpI, lastNum1, lastNum2;
  156.         double k;
  157.         lastNum1 = matrix.length - 1;
  158.         lastNum2 = matrix.length + 1;
  159.         for (int j = 0; j < matrix.length; j++) {
  160.             if ((matrix[j][j] == 0) && (j < lastNum1)) {
  161.                 tmpI = j + 1;
  162.                 do {
  163.                     if (matrix[tmpI][j] != 0) {
  164.                         moveStrings(matrix, j, tmpI);
  165.                     }
  166.                 } while ((matrix[j][j] == 0));
  167.             }
  168.             for (int i = (j + 1); i < matrix.length; i++) {
  169.                 k = matrix[i][j] / matrix[j][j];
  170.                 for (int m = j; m < lastNum2; m++) {
  171.                     matrix[i][m] = matrix[i][m] - k * matrix[j][m];
  172.                 }
  173.             }
  174.         }
  175.         return matrix;
  176.     }
  177.  
  178.     public static double[] findRoots(double[][] matrix) {
  179.         int tmpCountRoots = matrix.length;
  180.         double[] tmpRoots = new double[tmpCountRoots];
  181.         double sum;
  182.         for (int i = tmpCountRoots - 1; i > -1; i--) {
  183.             sum = 0;
  184.             for (int j = i + 1; j < tmpCountRoots; j++) {
  185.                 sum = sum + tmpRoots[j] * matrix[i][j];
  186.             }
  187.             if (matrix[i][i] == 0) {
  188.                 tmpRoots[i] = 0;
  189.             } else {
  190.                 tmpRoots[i] = (matrix[i][tmpCountRoots] - sum) /
  191.                         matrix[i][i];
  192.             }
  193.         }
  194.         return tmpRoots;
  195.     }
  196.  
  197.     public static double[] gaussM(double[][] matrix) {
  198.         writeMatrixInC(matrix);
  199.         newMatrix(matrix);
  200.         return findRoots(matrix);
  201.     }
  202.  
  203.     public static void writeRoots(double[] roots) {
  204.         int tmpCountRoots = roots.length;
  205.         System.out.println("Roots are: ");
  206.         for (int i = 0; i < tmpCountRoots; i++) {
  207.             System.out.print(roots[i] + " ");
  208.         }
  209.         System.out.println();
  210.     }
  211.  
  212.     private static String inputFilePath() {
  213.         String path;
  214.         boolean isIncorrect;
  215.         do {
  216.             isIncorrect = false;
  217.             System.out.println("Input file path:");
  218.             path = in.nextLine();
  219.             File file = new File(path);
  220.             if (!file.exists()) {
  221.                 System.out.println("Wrong way to file.");
  222.                 isIncorrect = true;
  223.             }
  224.             if (!file.canRead() && file.exists()) {
  225.                 System.out.println("Impossible to read a file.");
  226.                 isIncorrect = true;
  227.             }
  228.             if (!file.canWrite() && file.canRead()) {
  229.                 System.out.println("Impossible to write a file.");
  230.                 isIncorrect = true;
  231.             }
  232.         } while (isIncorrect);
  233.         return path;
  234.     }
  235.  
  236.     private static int inputSizeOfMatrixFromFile(String path) throws FileNotFoundException {
  237.         int size = 0;
  238.         final int MIN_VALUE = -100;
  239.         final int MAX_VALUE = 100;
  240.         boolean isIncorrect;
  241.         fileScanner = new Scanner(new File(path));
  242.         do {
  243.             isIncorrect = false;
  244.             try {
  245.                 size = fileScanner.nextInt();
  246.             } catch (Exception q) {
  247.                 isIncorrect = true;
  248.                 System.out.println("Check data correctness.");
  249.             }
  250.             if (!isIncorrect && (size < MIN_VALUE || size > MAX_VALUE)) {
  251.                 isIncorrect = true;
  252.                 System.out.println("Invalid input range.");
  253.             }
  254.         } while (isIncorrect);
  255.         return size;
  256.     }
  257.  
  258.     private static double[][] inputTriangularMatrixFile(int num, Scanner fileScanner) {
  259.         boolean isIncorrect = false;
  260.         double[][] arrOfMatrixElements = new double[num][num];
  261.  
  262.         for (int i = 0; i < num; i++) {
  263.             arrOfMatrixElements[i] = new double[num];
  264.         }
  265.         for (int i = 0; (i < num) && (!isIncorrect); i++) {
  266.             for (int j = 0; (j < num) && (!isIncorrect); j++) {
  267.                 if (j - i > -1) {
  268.                     try {
  269.                         arrOfMatrixElements[i][j] = Integer.parseInt(fileScanner.next());
  270.                     } catch (Exception e) {
  271.                         System.out.println("Mistake of reading elements of matrix.");
  272.  
  273.                     }
  274.  
  275.                 }
  276.             }
  277.         }
  278.         return arrOfMatrixElements;
  279.     }
  280.  
  281.     private static double[] inputFreeMembersFile(int num, Scanner fileScanner) {
  282.         boolean isIncorrect = false;
  283.         double[] arrOfFreeMembers = new double[num];
  284.         for (int i = 0; (i < num) && (!isIncorrect); i++) {
  285.             try {
  286.                 arrOfFreeMembers[i] = Integer.parseInt(fileScanner.next());
  287.             } catch (Exception e) {
  288.                 System.out.println("Mistake of reading free members.");
  289.             }
  290.         }
  291.         return arrOfFreeMembers;
  292.     }
  293.  
  294.     private static void fileOutput(double[] arrOfSystemRoots, int num, String path) {
  295.         boolean isIncorrect;
  296.         do {
  297.             isIncorrect = false;
  298.             try {
  299.                 FileWriter writer = new FileWriter(path);
  300.                 writer.write("Equations roots: " + "\n");
  301.                 for (int i = 0; i < num; i++) {
  302.                     writer.write(arrOfSystemRoots[i] + "\n");
  303.                 }
  304.                 writer.close();
  305.             } catch (IOException e) {
  306.                 isIncorrect = true;
  307.                 System.out.println("Mistake of output in file. Input path.");
  308.                 path = inputFilePath();
  309.             }
  310.         } while (isIncorrect);
  311.         System.out.println("Successful output in file.");
  312.     }
  313.  
  314.     public static void main(String[] args) throws FileNotFoundException {
  315.         boolean choice;
  316.         int num;
  317.         double[][] arrOfMatrixElements;
  318.         double[] arrOfFreeMembers;
  319.         double[][] arrOfMatrixElementsRandom;
  320.         double[][] matrix;
  321.         double[] roots;
  322.         System.out.println("Gauss method. Input elements above main diagonal and free members.");
  323.         System.out.println("Type 0 - console input, type 1 - file input.");
  324.         choice = choose();
  325.         if (!choice) {
  326.             System.out.println("Input number of unknown equations: ");
  327.             num = readCountRoots();
  328.             System.out.println("Input matrix elements: ");
  329.             arrOfMatrixElements = inputTriangularMatrixConsole(num);
  330.             System.out.println("Input Free members: ");
  331.             arrOfFreeMembers = inputFreeMembersConsole(num);
  332.         } else {
  333.             String path = inputFilePath();
  334.             num = inputSizeOfMatrixFromFile(path);
  335.             arrOfMatrixElements = inputTriangularMatrixFile(num, fileScanner);
  336.             arrOfFreeMembers = inputFreeMembersFile(num, fileScanner);
  337.         }
  338.         arrOfMatrixElementsRandom = randomizeOtherElements(num, arrOfMatrixElements);
  339.         matrix = createMatrix(arrOfMatrixElements, num, arrOfMatrixElementsRandom, arrOfFreeMembers);
  340.         roots = gaussM(matrix);
  341.         System.out.println("Type 0 - console output, type 1 - file output.");
  342.         choice = choose();
  343.         if (!choice) {
  344.             writeRoots(roots);
  345.         } else {
  346.             String path = inputFilePath();
  347.             fileOutput(roots, num, path);
  348.         }
  349.         in.close();
  350.     }
  351. }
  352.  
  353.  
  354.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement