Advertisement
anticlown

Laba.7.2(Java)

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