Advertisement
gguuppyy

lab44top

Mar 30th, 2024 (edited)
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.47 KB | None | 0 0
  1. import java.io.*;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.PrintWriter;
  7. import java.io.IOException;
  8. import java.util.Scanner;
  9.  
  10. class Main {
  11.     public static Scanner scan = new Scanner(System.in);
  12.  
  13.     public static void outputCondition() {
  14.         System.out.println("Программа выполняет рекурсивную процедуру\n" + "решения головоломки Ханойская башня).");
  15.     }
  16.  
  17.     public static void outputInputChoice() {
  18.         System.out.println("Введите 0, если хотите ввести данные из консоли, и 1, если из файла:");
  19.     }
  20.  
  21.     public static boolean isUserChoice() {
  22.         final int MIN = 0;
  23.         final int MAX = 1;
  24.         int k = 0;
  25.         boolean isIncorrect;
  26.         boolean isChoice;
  27.         do {
  28.             isIncorrect = false;
  29.             try {
  30.                 k = Integer.parseInt(scan.nextLine());
  31.             } catch (Exception e) {
  32.                 System.out.println("Введены некорректные данные. Повторите ввод:");
  33.                 isIncorrect = true;
  34.             }
  35.             if ((!isIncorrect) && ((k < MIN) || (k > MAX))) {
  36.                 System.out.println("Число не входит в допустимый диапазон. Повторите  ввод:");
  37.                 isIncorrect = true;
  38.             }
  39.         } while (isIncorrect);
  40.  
  41.         isChoice = !(k == MIN);
  42.         return isChoice;
  43.     }
  44.  
  45.     public static void outputPathInputCondition() {
  46.         System.out.println("Введите путь к файлу, содержащему количество дисков:");
  47.     }
  48.  
  49.     public static boolean isFileCorrect(String path) {
  50.         boolean isIncorrect = false;
  51.         File f = new File(path);
  52.         if (!f.exists()) {
  53.             isIncorrect = true;
  54.             System.out.print("Файл по заданному пути отсутствует. ");
  55.         } else if (!path.endsWith(".txt")) {
  56.             isIncorrect = true;
  57.             System.out.print("Недопустимое расширение файла. ");
  58.         }
  59.         return isIncorrect;
  60.     }
  61.  
  62.     public static void outputSuccessfulInput() {
  63.         System.out.println("Данные из файла считаны успешно.");
  64.     }
  65.  
  66.  
  67.     public static int inputNumberOfDisksFromConsole() {
  68.         int n = 0;
  69.         final int MIN_VALUE = 1;
  70.         boolean isIncorrect;
  71.         Scanner scanner = new Scanner(System.in);
  72.  
  73.         do {
  74.             System.out.println("Введите количество дисков:");
  75.             isIncorrect = false;
  76.  
  77.             try {
  78.                 n = Integer.parseInt(scanner.nextLine());
  79.  
  80.                 if (n < MIN_VALUE) {
  81.                     isIncorrect = true;
  82.                     System.err.println("Количество дисков должно быть больше 0. Повторите ввод.");
  83.                 }
  84.             } catch (NumberFormatException e) {
  85.                 isIncorrect = true;
  86.                 System.err.println("Некорректный ввод. Повторите ввод.");
  87.             }
  88.         } while (isIncorrect);
  89.  
  90.         return n;
  91.     }
  92.  
  93.     public static String takePath() {
  94.         String path;
  95.         boolean isIncorrect;
  96.         do {
  97.             isIncorrect = false;
  98.             path = scan.nextLine();
  99.             isIncorrect = isFileCorrect(path);
  100.             if (isIncorrect) {
  101.                 System.out.println("Повторите ввод пути к файлу:");
  102.             }
  103.         } while (isIncorrect);
  104.         return path;
  105.     }
  106.  
  107.     public static int inputNumberOfDisksFromFile() {
  108.         String path, s;
  109.         int n = 0;
  110.         boolean isIncorrect;
  111.         final int MIN_VALUE = 1;
  112.  
  113.         do {
  114.             outputPathInputCondition();
  115.             isIncorrect = false;
  116.             path = takePath();
  117.             Scanner scan = null;
  118.             try {
  119.                 scan = new Scanner(new File(path));
  120.             } catch (FileNotFoundException e) {
  121.                 System.out.println(e.getMessage());
  122.                 isIncorrect = true;
  123.             }
  124.  
  125.             if (!isIncorrect) {
  126.                 try (BufferedReader fReader = new BufferedReader(new FileReader(path))) {
  127.                     s = fReader.readLine();
  128.  
  129.                     try {
  130.                         n = Integer.parseInt(s);
  131.  
  132.                         if (n < MIN_VALUE) {
  133.                             isIncorrect = true;
  134.                             System.out.println("Количество дисков должно быть больше 0. Исправьте файл и нажмите Enter.");
  135.                         }
  136.                     } catch (NumberFormatException e) {
  137.                         isIncorrect = true;
  138.                         System.out.println("Некорректные данные в файле. Исправьте файл и нажмите Enter.");
  139.                     }
  140.                 } catch (IOException e) {
  141.                     isIncorrect = true;
  142.                     System.out.println("Ошибка при чтении файла! Исправьте файл и нажмите Enter.");
  143.                 }
  144.             }
  145.             if (isIncorrect) {
  146.                 scan.nextLine();
  147.             }
  148.         } while (isIncorrect);
  149.         return n;
  150.     }
  151.  
  152.  
  153.     public static int inputNumberOfDisks(boolean isInput) {
  154.         int n;
  155.  
  156.         if (isInput) {
  157.             n = inputNumberOfDisksFromFile();
  158.             outputSuccessfulInput();
  159.         } else {
  160.             n = inputNumberOfDisksFromConsole();
  161.         }
  162.  
  163.         return n;
  164.     }
  165.  
  166.  
  167.     public static void outputPathOutputCondition() {
  168.         System.out.println("Введите путь к файлу, в который вы хотите вывести результат: ");
  169.     }
  170.  
  171.     public static void outputInFile(int n, String path) {
  172.         try (PrintWriter fileWriter = new PrintWriter(new FileWriter(path, false))) {
  173.             solveHanoiTower(n, 1, 3, 2, fileWriter);
  174.             fileWriter.flush();
  175.         } catch (IOException e) {
  176.             System.out.println(e.getMessage());
  177.         }
  178.     }
  179.  
  180.     public static void solveHanoiTower(int n, int source, int destination, int auxiliary, PrintWriter fileWriter) {
  181.         if (n == 1) {
  182.             fileWriter.println("Переместить диск 1 с башни " + source + " на башню " + destination);
  183.             return;
  184.         }
  185.         solveHanoiTower(n - 1, source, auxiliary, destination, fileWriter);
  186.         fileWriter.println("Переместить диск " + n + " с башни " + source + " на башню " + destination);
  187.         solveHanoiTower(n - 1, auxiliary, destination, source, fileWriter);
  188.     }
  189.  
  190.     public static void outputSuccessfulOutput() {
  191.         System.out.println("Данные записаны в файл успешно.");
  192.     }
  193.  
  194.     public static void outputInConsole(int n) {
  195.         solveHanoiTower(n, 1, 3, 2, new PrintWriter(System.out, true));
  196.     }
  197.  
  198.     public static int chooseOutputOption() {
  199.         System.out.println("Введите 0, если хотите вывести результат в консоль, и 1, если хотите вывести в файл: ");
  200.         return scan.nextInt();
  201.     }
  202.  
  203.     public static void outputFinalTower(int outputChoice, int n, String path) {
  204.         if (outputChoice == 1) {
  205.             if (path == null || path.isEmpty()) {
  206.                 System.out.println("Некорректный путь к файлу.");
  207.                 return;
  208.             }
  209.             outputInFile(n, path);
  210.             outputSuccessfulOutput();
  211.         } else {
  212.             outputInConsole(n); // Вывод в консоль
  213.         }
  214.     }
  215.  
  216.  
  217.     public static void main(String[] args) {
  218.         int n;
  219.         boolean isInput;
  220.         int outputChoice;
  221.         outputCondition();
  222.         outputInputChoice();
  223.         isInput = isUserChoice();
  224.         n = inputNumberOfDisks(isInput);
  225.         outputChoice = chooseOutputOption();
  226.  
  227.         if (outputChoice == 1) {
  228.             scan.nextLine();
  229.             outputPathOutputCondition();
  230.             String path = takePath();
  231.             outputFinalTower(outputChoice, n, path);
  232.         } else {
  233.             outputFinalTower(outputChoice, n, null);
  234.         }
  235.  
  236.         scan.close();
  237.  
  238.     }
  239. }
  240.  
  241.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement