Advertisement
gguuppyy

lab44

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