Advertisement
THOMAS_SHELBY_18

Lab 6_2 JAVA

Mar 22nd, 2024
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.34 KB | Source Code | 0 0
  1. import java.util.NoSuchElementException;
  2. import java.util.Scanner;
  3. import java.io.*;
  4. public class Main {
  5.         private static final Scanner scan = new Scanner(System.in);
  6.         private static int[][] magicSquare;
  7.         private static int readNum(int min, int max) {
  8.             int n;
  9.             boolean isIncorrect;
  10.             n = 0;
  11.             do {
  12.                 isIncorrect = false;
  13.                 try {
  14.                     n = Integer.parseInt(scan.nextLine());
  15.                 }
  16.                 catch (Exception err) {
  17.                     System.out.println("Вы ввели некорректные данные. Попробуйте снова");
  18.                     isIncorrect = true;
  19.                 }
  20.                 if (!isIncorrect && (n < min || n > max)) {
  21.                     System.out.println("Введено значение не входящее в диапазон допустимых значений");
  22.                     isIncorrect = true;
  23.                 }
  24.             } while (isIncorrect);
  25.             return n;
  26.         }
  27.         private static void printCondition() {
  28.             final int MIN = 3, MAX = 19;
  29.             System.out.println("Данная программа построит магический квадрат нечетного порядка 'методом террас'.");
  30.             System.out.println("Диапазон значений для порядка квадрата - от " + MIN + " до " + MAX + ".");
  31.         }
  32.         private static int inputN() {
  33.             int choice;
  34.             int num;
  35.  
  36.             System.out.println("Выберите вариант ввода:");
  37.             System.out.println("1.Ввод из консоли");
  38.             System.out.println("2.Ввод из файла");
  39.             choice = readNum(1, 2);
  40.  
  41.             if (choice == 1) {
  42.                 num = inputNFromConsole();
  43.             }
  44.             else {
  45.                 num = inputNFromFile();
  46.             }
  47.             return num;
  48.         }
  49.         private static int inputNFromConsole() {
  50.             final int MIN = 3, MAX = 19;
  51.             int num;
  52.             boolean isOdd;
  53.             System.out.println("Порядок магического квадрата (нечётное число от 3 до 19)");
  54.             do {
  55.                 num = readNum(MIN, MAX);
  56.                 if (num % 2 == 0) {
  57.                     isOdd = false;
  58.                     System.out.println("Число должно быть нечётным!");
  59.                 }
  60.                 else
  61.                     isOdd = true;
  62.             } while (!isOdd);
  63.             return num;
  64.         }
  65.         private static int inputNFromFile() {
  66.             String pathFile;
  67.             int num;
  68.             boolean isInputFromFileSuccessfully;
  69.  
  70.             System.out.println("Данные в файле должны содержать gорядок магического квадрата (нечётное число от 3 до 19)");
  71.             do {
  72.                 System.out.print("Введите путь к файлу и его имя с его раширением:");
  73.                 pathFile = scan.nextLine();
  74.                 isInputFromFileSuccessfully = checkFile(pathFile);
  75.             } while(!isInputFromFileSuccessfully);
  76.             num = readFile(pathFile);
  77.             return num;
  78.         }
  79.         private static boolean checkFile(String path){
  80.             final int MIN = 3, MAX = 19;
  81.             int buf;
  82.             boolean isFileCorrect;
  83.             File checkFile;
  84.  
  85.             checkFile = new File(path);
  86.             isFileCorrect = true;
  87.  
  88.             if (!checkFile.isFile()) {
  89.                 System.out.println("Файл не найден! Пожалуйста проверьте существование файла и введите путь заново");
  90.                 isFileCorrect = false;
  91.             }
  92.             if (isFileCorrect && !checkFile.canRead() ) {
  93.                 System.out.println("Файл не может быть прочитан! Пожалуйста проверьте файл и введите путь заново");
  94.                 isFileCorrect = false;
  95.             }
  96.             if (isFileCorrect){
  97.                 try (Scanner fileScan = new Scanner(checkFile)) {
  98.                     buf = fileScan.nextInt();
  99.                     if (buf > MAX || buf < MIN) {
  100.                         System.out.println("В файле данные выходят за пределы допустимых значений. Пожалуйста проверьте файл и введите путь заново");
  101.                         isFileCorrect = false;
  102.                     }
  103.                     if (isFileCorrect && buf % 2 == 0) {
  104.                         isFileCorrect = false;
  105.                         System.out.println("Число должно быть нечётным!");
  106.                     }
  107.                     if (isFileCorrect && fileScan.hasNext()){
  108.                         System.out.println("В файле данные представлены в неправильном формате. Пожалуйста проверьте файл и введите путь заново");
  109.                         isFileCorrect = false;
  110.                     }
  111.                 } catch (FileNotFoundException e) {
  112.                     System.out.println("Файл по данному пути не существует. Пожалуйста проверьте файл и введите путь заново");
  113.                     isFileCorrect = false;
  114.                 } catch (NoSuchElementException e) {
  115.                     System.out.println("В файле данные представлены в неправильном формате. Пожалуйста проверьте файл и введите путь заново");
  116.                     isFileCorrect = false;
  117.                 }
  118.             }
  119.             return isFileCorrect;
  120.         }
  121.         private static int readFile(String path){
  122.             int num = 0;
  123.             File file;
  124.  
  125.             file = new File(path);
  126.  
  127.             try (Scanner fileScan = new Scanner(file)) {
  128.                 num = fileScan.nextInt();
  129.             } catch (IOException e) {
  130.                 System.out.println("Не удалось прочесть данные в файле!");
  131.             }
  132.             return num;
  133.         }
  134.  
  135.         private static void outputMagicSquare() {
  136.             int choice;
  137.  
  138.             System.out.println("Выберите вариант вывода:");
  139.             System.out.println("1.Вывод в консоль");
  140.             System.out.println("2.Вывод в файл");
  141.             choice = readNum(1, 2);
  142.  
  143.             if (choice == 1) {
  144.                 outputMagicSquareToConsole();
  145.             }
  146.             else {
  147.                 outputMagicSquareToFile();
  148.             }
  149.         }
  150.         private static void outputMagicSquareToConsole() {
  151.             for (int[] ints : magicSquare) {
  152.                 for (int j = 0; j < magicSquare.length; j++) {
  153.                     System.out.print(ints[j] + "  ");
  154.                 }
  155.                 System.out.println();
  156.             }
  157.         }
  158.         private static void outputMagicSquareToFile() {
  159.             String path;
  160.             boolean isFileIncorrect;
  161.  
  162.             System.out.println("Введите путь к файлу.");
  163.             System.out.println("Если файл отсутствует, он будет создан автоматически по указанному пути или в корневой папке программы (по умолчанию)");
  164.             do {
  165.                 isFileIncorrect = false;
  166.                 System.out.print("Введите путь к файлу и его имя c расширением: ");
  167.                 path = scan.nextLine();
  168.                 File outputFile = new File(path);
  169.                 try {
  170.                     if (outputFile.isFile()) {
  171.                         if (outputFile.canWrite()) {
  172.                             try (FileWriter writer = new FileWriter(outputFile)) {
  173.                                 for (int i = 0; i < magicSquare.length; i++){
  174.                                     for (int j = 0; j < magicSquare.length; j++) {
  175.                                         writer.write(magicSquare[i][j] + "  ");
  176.                                     }
  177.                                     writer.write('\n');
  178.                                 }
  179.                             }
  180.                         }
  181.                         else {
  182.                             System.out.println("Файл доступен только для чтения!");
  183.                             isFileIncorrect = true;
  184.                         }
  185.                     }
  186.                     else {
  187.                         outputFile.createNewFile();
  188.                         try (FileWriter writer = new FileWriter(outputFile)) {
  189.                             for (int i = 0; i < magicSquare.length; i++){
  190.                                 for (int j = 0; j < magicSquare.length; j++) {
  191.                                     writer.write(magicSquare[i][j] + "  ");
  192.                                 }
  193.                                 writer.write('\n');
  194.                             }
  195.                         }
  196.                     }
  197.                 }
  198.                 catch (IOException e) {
  199.                     System.out.println("Не удалось вывести в файл!");
  200.                     isFileIncorrect = true;
  201.                 }
  202.             } while (isFileIncorrect);
  203.             System.out.println("Вывод данных... успешно!");
  204.         }
  205.  
  206.     public static void buildMagicSquare() {
  207.         int n = magicSquare.length;
  208.         int[][] tempMatrix = new int[2*n-1][2*n-1];
  209.  
  210.         int i = tempMatrix.length / 2;
  211.         int j = 0;
  212.         int counter = 1;
  213.  
  214.         for (counter = 1; counter <= n * n; counter++) {
  215.             tempMatrix[i][j] = counter;
  216.  
  217.             if (counter % n == 0) {
  218.                 j = counter / n;
  219.                 i = tempMatrix.length / 2 + counter / n;
  220.             } else {
  221.                 i--;
  222.                 j++;
  223.             }
  224.         }
  225.         int delta = n / 2;
  226.         for (int k = delta; k >= 1; k--) {
  227.             int m = k;
  228.             j = n / 2 - (delta - k) - 1;
  229.             i = (tempMatrix.length-1) / 2 - k + 1;
  230.  
  231.             while (m > 0) {
  232.                 tempMatrix[i][(tempMatrix.length-1) - delta - (delta-k)] = tempMatrix[i][j];
  233.                 tempMatrix[i][delta + delta-k] = tempMatrix[i][(tempMatrix.length-1) - delta + (delta-k)+1];
  234.  
  235.                 tempMatrix[(tempMatrix.length-1) - delta - (delta-k)][i] = tempMatrix[j][i];
  236.                 tempMatrix[delta + delta-k][i] = tempMatrix[(tempMatrix.length-1) - delta + (delta-k)+1][i];
  237.  
  238.                 i += 2;
  239.                 m--;
  240.             }
  241.         }
  242.  
  243.         delta = n / 2;
  244.         for (i = 0; i < magicSquare.length; i++) {
  245.             for (j = 0; j < magicSquare[i].length; j++) {
  246.                 magicSquare[i][j] = tempMatrix[i + delta][j + delta];
  247.             }
  248.         }
  249.     }
  250.  
  251.     public static void main(String[] args) {
  252.         int num;
  253.         printCondition();
  254.         num = inputN();
  255.         magicSquare = new int[num][num];
  256.         buildMagicSquare();
  257.         outputMagicSquare();
  258.         scan.close();
  259.     }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement