Advertisement
anticlown

Laba.4.2(Java)

Mar 3rd, 2023 (edited)
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.47 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.io.*;
  3.  
  4. public class Main {
  5.     private static final int MIN_SIZE = 2;
  6.     private static final int MAX_SIZE = 10;
  7.     private static final int MIN_VALUE = 0;
  8.     private static final int MAX_VALUE = 1;
  9.     private static final Scanner scan = new Scanner(System.in);
  10.     private static int counter = 0;
  11.     public static void outputTaskInfo() {
  12.         System.out.println("Данная программа находит максимальную площадь подматриц, состоящей из единиц, полученную из данной матрицы" + "\n" +
  13.                 "Диапазон ввода значений длины и ширины: " + MIN_SIZE + "..." + MAX_SIZE + ". \n" +
  14.                 "Диапазон ввода значений в матрицу: " + MIN_VALUE + "..." + MAX_VALUE + ".");
  15.     }
  16.  
  17.     public static int getVerificationOfChoice() {
  18.         int choice = 0;
  19.         boolean isIncorrect;
  20.  
  21.         do {
  22.             isIncorrect = false;
  23.             try {
  24.                 choice = Integer.parseInt(scan.nextLine());
  25.             } catch (NumberFormatException e) {
  26.                 System.out.println("Проверьте корректность ввода данных!");
  27.                 isIncorrect = true;
  28.             }
  29.             if (!isIncorrect && (choice != 0 && choice != 1)) {
  30.                 System.out.println("Для выбора введите 0 или 1!");
  31.                 isIncorrect = true;
  32.             }
  33.         } while (isIncorrect);
  34.  
  35.         return choice;
  36.     }
  37.  
  38.     public static String inputPathToFile() {
  39.         boolean isIncorrect;
  40.         String path;
  41.  
  42.         System.out.println("Укажите путь к файлу: ");
  43.  
  44.         do {
  45.             isIncorrect = false;
  46.             path = scan.nextLine();
  47.             File file = new File(path);
  48.  
  49.             if (!file.exists()) {
  50.                 System.out.println("По указанному пути файл не найден! Укажите правильный путь: ");
  51.                 isIncorrect = true;
  52.             }
  53.         } while (isIncorrect);
  54.  
  55.         return path;
  56.     }
  57.  
  58.     public static int readLengthFromConsole() {
  59.         int length = 0;
  60.         boolean isIncorrect;
  61.  
  62.         System.out.println("Введите значение длины матрицы: ");
  63.  
  64.         do {
  65.             isIncorrect = false;
  66.             try {
  67.                 length = Integer.parseInt(scan.nextLine());
  68.             } catch (NumberFormatException e) {
  69.                 System.out.println("Проверьте корректность ввода данных!");
  70.                 isIncorrect = true;
  71.             }
  72.             if (!isIncorrect && (length < MIN_SIZE || length > MAX_SIZE)) {
  73.                 System.out.println("Введите число от " + MIN_SIZE + " до " + MAX_SIZE + "! \n");
  74.                 isIncorrect = true;
  75.             }
  76.         } while (isIncorrect);
  77.  
  78.         return length;
  79.     }
  80.  
  81.     public static int readLengthFromFile(final String path) {
  82.         int length;
  83.         boolean isIncorrect = true;
  84.  
  85.         System.out.println("Происходит чтение длины матрицы...");
  86.  
  87.         try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  88.             length = Integer.parseInt(br.readLine());
  89.         } catch (Exception e) {
  90.             isIncorrect = false;
  91.             System.out.println("Ошибка при чтении данных! Введите количество уравнений с консоли!");
  92.             length = readLengthFromConsole();
  93.         }
  94.  
  95.         return length;
  96.     }
  97.  
  98.     public static void outputLength(final int choice, int length, String path) {
  99.         boolean isIncorrect;
  100.  
  101.         if (choice == 0)
  102.             System.out.println("Длина матрицы равна: " + length + ".");
  103.  
  104.         if (choice == 1) {
  105.             System.out.println("Вывод длины матрицы в файл...");
  106.  
  107.             do {
  108.                 isIncorrect = false;
  109.                 try {
  110.                     FileWriter writer = new FileWriter(path);
  111.                     writer.write(length + "\n");
  112.                     writer.close();
  113.                 } catch (IOException e) {
  114.                     isIncorrect = true;
  115.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  116.                     path = inputPathToFile();
  117.                 }
  118.             } while (isIncorrect);
  119.  
  120.             System.out.println("Данные успешно записаны в файл!");
  121.         }
  122.     }
  123.  
  124.     public static int readWidthFromConsole() {
  125.         int width = 0;
  126.         boolean isIncorrect;
  127.  
  128.         System.out.println("Введите значение ширины матрицы: ");
  129.  
  130.         do {
  131.             isIncorrect = false;
  132.             try {
  133.                 width = Integer.parseInt(scan.nextLine());
  134.             } catch (NumberFormatException e) {
  135.                 System.out.println("Проверьте корректность ввода данных!");
  136.                 isIncorrect = true;
  137.             }
  138.             if (!isIncorrect && (width < MIN_SIZE || width > MAX_SIZE)) {
  139.                 System.out.println("Введите число от " + MIN_SIZE + " до " + MAX_SIZE + "! \n");
  140.                 isIncorrect = true;
  141.             }
  142.         } while (isIncorrect);
  143.  
  144.         return width;
  145.     }
  146.  
  147.     public static int readWidthFromFile(final String path) {
  148.         int width;
  149.         boolean isIncorrect = true;
  150.  
  151.         System.out.println("Происходит чтение ширины матрицы...");
  152.  
  153.         try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  154.             br.readLine();
  155.             width = Integer.parseInt(br.readLine());
  156.         } catch (Exception e) {
  157.             isIncorrect = false;
  158.             System.out.println("Ошибка при чтении данных! Введите количество уравнений с консоли!");
  159.             width = readLengthFromConsole();
  160.         }
  161.  
  162.         return width;
  163.     }
  164.  
  165.     public static void outputWidth(final int choice, int width, String path) {
  166.         boolean isIncorrect;
  167.  
  168.         if (choice == 0)
  169.             System.out.println("Ширина матрицы равна: " + width + ".");
  170.  
  171.         if (choice == 1) {
  172.             System.out.println("Вывод длины матрицы в файл...");
  173.  
  174.             do {
  175.                 isIncorrect = false;
  176.                 try {
  177.                     FileWriter writer = new FileWriter(path);
  178.                     writer.write(width + "\n");
  179.                     writer.close();
  180.                 } catch (IOException e) {
  181.                     isIncorrect = true;
  182.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  183.                     path = inputPathToFile();
  184.                 }
  185.             } while (isIncorrect);
  186.  
  187.             System.out.println("Данные успешно записаны в файл!");
  188.         }
  189.     }
  190.  
  191.     public static int[][] fillMatrixFromConsole(final int length, final int width) {
  192.         int[][] matrix = new int[length][width];
  193.         boolean isIncorrect;
  194.  
  195.         for (int i = 0; i < length; i++) {
  196.             for (int j = 0; j < width; j++) {
  197.                 System.out.println("Введите значение матрицы в " + (i + 1) + "-ой строке " + (j + 1) + "-ого столбца: ");
  198.  
  199.                 do {
  200.                     isIncorrect = false;
  201.                     try {
  202.                         matrix[i][j] = Integer.parseInt(scan.nextLine());
  203.                     } catch (NumberFormatException e) {
  204.                         System.out.println("Проверьте корректность ввода данных!");
  205.                         isIncorrect = true;
  206.                     }
  207.  
  208.                     if (!isIncorrect && (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE)) {
  209.                         isIncorrect = true;
  210.                         System.out.println("Введите число от " + MIN_VALUE + " до " + MAX_VALUE + "!");
  211.                     }
  212.                 } while (isIncorrect);
  213.             }
  214.         }
  215.  
  216.         return matrix;
  217.     }
  218.  
  219.     public static int[][] fillMatrixFromFile (final int length, final int width, final String path) throws FileNotFoundException {
  220.         int[][] matrix = new int[length][width];
  221.         int count = 0 ;
  222.         Scanner fr = new Scanner(new File(path));
  223.  
  224.         System.out.println("Чтение матрицы...");
  225.         fr.nextLine();
  226.         fr.nextLine();
  227.         while (fr.hasNext()) {
  228.             fr.next();
  229.             count++;
  230.         }
  231.  
  232.         fr.close();
  233.  
  234.         if (count > length * width) {
  235.             System.out.println("Ошибка при чтении матрицы! Введите матрицу с консоли!");
  236.             matrix = fillMatrixFromConsole(length, width);
  237.         } else {
  238.             fr = new Scanner(new File(path));
  239.             fr.nextLine();
  240.             fr.nextLine();
  241.  
  242.             for (int i = 0; i < length; i++) {
  243.                 for (int j = 0; j < width; j++) {
  244.                     try {
  245.                         matrix[i][j] = fr.nextInt();
  246.                     } catch (Exception e) {
  247.                         System.out.println("Ошибка при считывании матрицы из файла!Введите матрицу с консоли!");
  248.                         matrix = fillMatrixFromConsole(length, width);
  249.                     }
  250.                     if (matrix[i][j] < MIN_VALUE || matrix[i][j] > MAX_VALUE) {
  251.                         System.out.println("Ошибка при считывании матрицы из файла!Введите матрицу с консоли!");
  252.                         matrix = fillMatrixFromConsole(length, width);
  253.                     }
  254.                 }
  255.             }
  256.         }
  257.  
  258.         return matrix;
  259.     }
  260.     public static void outputMatrix(final int choice, String path, final int[][] matrix, final int length, final int width) {
  261.         boolean isIncorrect;
  262.  
  263.         if (choice == 0) {
  264.             System.out.println("Вывод начальной матрицы: ");
  265.             for (int i = 0; i < length; i++)
  266.             {
  267.                 for (int j = 0; j < width; j++)
  268.                     System.out.print(matrix[i][j] + "\t");
  269.                 System.out.print("\n");
  270.             }
  271.             System.out.print("\n");
  272.         }
  273.  
  274.         if (choice == 1) {
  275.             System.out.println("Вывод начальной матрицы в файл...");
  276.  
  277.             do {
  278.                 isIncorrect = false;
  279.                 try {
  280.                     FileWriter writer = new FileWriter(path, true);
  281.                     BufferedWriter bufferWriter = new BufferedWriter(writer);
  282.  
  283.                     for (int i = 0; i < length; i++)
  284.                     {
  285.                         for (int j = 0; j < width; j++)
  286.                             bufferWriter.write(matrix[i][j] + "\t");
  287.                         bufferWriter.write("\n");
  288.                     }
  289.                     bufferWriter.write("\n");
  290.  
  291.                     bufferWriter.close();
  292.                     writer.close();
  293.                 } catch (IOException e) {
  294.                     isIncorrect = true;
  295.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  296.                     path = inputPathToFile();
  297.                 }
  298.             } while (isIncorrect);
  299.  
  300.             System.out.println("Данные успешно записаны в файл!");
  301.         }
  302.     }
  303.  
  304.     public static void changePos(final int[][] matrix, int row, int col) {
  305.         col++;
  306.         if (col > matrix.length - 1)
  307.         {
  308.             col %= matrix.length;
  309.             row++;
  310.         }
  311.     }
  312.  
  313.     public static int getSumInRow(int[][] matrix, int row, int col) {
  314.         int newRow, newCol, sum, temp;
  315.         newRow = row;
  316.         newCol = col;
  317.         temp = matrix.length;
  318.         sum = 0;
  319.         while (newRow < matrix.length && matrix[newRow][col] == 1) {
  320.             newCol = col;
  321.             while (newCol < matrix[0].length && matrix[newRow][newCol] == 1) {
  322.                 newCol++;
  323.             }
  324.  
  325.             if (temp > (newCol - col))
  326.                 temp = newCol - col;
  327.  
  328.             newRow++;
  329.             sum = (newRow - row) * temp;
  330.  
  331.             if (sum > counter)
  332.                 counter = sum;
  333.         }
  334.         return counter;
  335.     }
  336.  
  337.     public static int findArea(int[][] matrix, int row, int col) {
  338.         int sumRow, count;
  339.         sumRow = 0;
  340.         count = 0;
  341.         do {
  342.             if (row == matrix.length - 1 && col == matrix[0].length - 1) {
  343.                 count = matrix[matrix.length - 1][matrix[0].length - 1];
  344.                 return count;
  345.             } else {
  346.                 if (matrix[row][col] == 0) {
  347.                     changePos(matrix, row, col);
  348.                     sumRow = findArea(matrix, row, col);
  349.                 } else {
  350.                     sumRow = getSumInRow(matrix, row, col);
  351.                     changePos(matrix, row, col);
  352.                 }
  353.             }
  354.  
  355.             if (sumRow > count) {
  356.                 count = sumRow;
  357.             }
  358.         } while (row == matrix.length - 1 && col == matrix[0].length - 1);
  359.  
  360.         return count;
  361.     }
  362.  
  363.     public static void outputArea(final int choice, String path, final int area) {
  364.         boolean isIncorrect;
  365.  
  366.         if (choice == 0)
  367.             System.out.println("Площадь полученной подматрицы равна " + area + ".");
  368.         if (choice == 1) {
  369.             System.out.println("Вывод значения площади подматрицы в файл...");
  370.  
  371.             do {
  372.                 isIncorrect = false;
  373.                 try {
  374.                     FileWriter writer = new FileWriter(path);
  375.                     writer.write(area + "\n");
  376.                     writer.close();
  377.                 } catch (IOException e) {
  378.                     isIncorrect = true;
  379.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  380.                     path = inputPathToFile();
  381.                 }
  382.             } while (isIncorrect);
  383.  
  384.             System.out.println("Данные успешно записаны в файл!");
  385.         }
  386.     }
  387.     public static int[][] processUserInput() throws FileNotFoundException {
  388.         int length, width;
  389.         int choiceForInput;
  390.         int[][] matrix = new int[0][];
  391.         String pathToIn;
  392.  
  393.         System.out.println("Вы желаете ввести данные с консоли(0) или взять данные из файла(1)?");
  394.         choiceForInput = getVerificationOfChoice();
  395.  
  396.         if (choiceForInput == 0) {
  397.             length = readLengthFromConsole();
  398.             width = readWidthFromConsole();
  399.             matrix = fillMatrixFromConsole(length, width);
  400.         }
  401.         if (choiceForInput == 1) {
  402.             pathToIn = inputPathToFile();
  403.             length = readLengthFromFile(pathToIn);
  404.             width = readWidthFromFile(pathToIn);
  405.             matrix = fillMatrixFromFile(length, width, pathToIn);
  406.         }
  407.  
  408.         return matrix;
  409.     }
  410.  
  411.     public static void processUserOutput(int length, int width, int[][] matrix, int area) {
  412.         int choiceForOutput;
  413.         String pathToOut = "";
  414.  
  415.         System.out.println("Вы желаете получить результат в консоли(0) или в файле(1)?");
  416.         choiceForOutput = getVerificationOfChoice();
  417.  
  418.         if (choiceForOutput == 1)
  419.             pathToOut = inputPathToFile();
  420.         outputLength(choiceForOutput, length, pathToOut);
  421.         outputWidth(choiceForOutput, width, pathToOut);
  422.         outputMatrix(choiceForOutput, pathToOut, matrix, length, width);
  423.         outputArea(choiceForOutput, pathToOut, area);
  424.     }
  425.  
  426.     public static void main (String[] args) throws FileNotFoundException {
  427.         int row = 0;
  428.         int col = 0;
  429.         outputTaskInfo();
  430.         int[][] matrix = processUserInput();
  431.         int area = findArea(matrix, row, col);
  432.         processUserOutput(matrix.length, matrix[0].length, matrix, area);
  433.  
  434.         scan.close();
  435.     }
  436. }
  437.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement