Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.PrintWriter;
- import java.io.IOException;
- import java.util.Scanner;
- class Main {
- public static Scanner scan = new Scanner(System.in);
- public static void outputCondition() {
- System.out.println("Программа выполняет рекурсивную процедуру\n" + "решения головоломки Ханойская башня).");
- }
- public static void outputInputChoice() {
- System.out.println("Введите 0, если хотите ввести данные из консоли, и 1, если из файла:");
- }
- public static boolean isUserChoice() {
- final int MIN = 0;
- final int MAX = 1;
- int k = 0;
- boolean isIncorrect;
- boolean isChoice;
- do {
- isIncorrect = false;
- try {
- k = Integer.parseInt(scan.nextLine());
- } catch (Exception e) {
- System.out.println("Введены некорректные данные. Повторите ввод:");
- isIncorrect = true;
- }
- if ((!isIncorrect) && ((k < MIN) || (k > MAX))) {
- System.out.println("Число не входит в допустимый диапазон. Повторите ввод:");
- isIncorrect = true;
- }
- } while (isIncorrect);
- isChoice = !(k == MIN);
- return isChoice;
- }
- public static void outputPathInputCondition() {
- System.out.println("Введите путь к файлу, содержащему количество дисков:");
- }
- public static boolean isFileCorrect(String path) {
- boolean isIncorrect = false;
- File f = new File(path);
- if (!f.exists()) {
- isIncorrect = true;
- System.out.print("Файл по заданному пути отсутствует. ");
- } else if (!path.endsWith(".txt")) {
- isIncorrect = true;
- System.out.print("Недопустимое расширение файла. ");
- }
- return isIncorrect;
- }
- public static void outputSuccessfulInput() {
- System.out.println("Данные из файла считаны успешно.");
- }
- public static int inputNumberOfDisksFromConsole() {
- int n = 0;
- final int MIN_VALUE = 1;
- boolean isIncorrect;
- Scanner scanner = new Scanner(System.in);
- do {
- System.out.println("Введите количество дисков:");
- isIncorrect = false;
- try {
- n = Integer.parseInt(scanner.nextLine());
- if (n < MIN_VALUE) {
- isIncorrect = true;
- System.err.println("Количество дисков должно быть больше 0. Повторите ввод.");
- }
- } catch (NumberFormatException e) {
- isIncorrect = true;
- System.err.println("Некорректный ввод. Повторите ввод.");
- }
- } while (isIncorrect);
- return n;
- }
- public static String takePath() {
- String path;
- boolean isIncorrect;
- do {
- isIncorrect = false;
- path = scan.nextLine();
- isIncorrect = isFileCorrect(path);
- if (isIncorrect) {
- System.out.println("Повторите ввод пути к файлу:");
- }
- } while (isIncorrect);
- return path;
- }
- public static int inputNumberOfDisksFromFile() {
- String path, s;
- int n = 0;
- boolean isIncorrect;
- final int MIN_VALUE = 1;
- do {
- outputPathInputCondition();
- isIncorrect = false;
- path = takePath();
- Scanner scan = null;
- try {
- scan = new Scanner(new File(path));
- } catch (FileNotFoundException e) {
- System.out.println(e.getMessage());
- isIncorrect = true;
- }
- if (!isIncorrect) {
- try (BufferedReader fReader = new BufferedReader(new FileReader(path))) {
- s = fReader.readLine();
- try {
- n = Integer.parseInt(s);
- if (n < MIN_VALUE) {
- isIncorrect = true;
- System.out.println("Количество дисков должно быть больше 0. Исправьте файл и нажмите Enter.");
- }
- } catch (NumberFormatException e) {
- isIncorrect = true;
- System.out.println("Некорректные данные в файле. Исправьте файл и нажмите Enter.");
- }
- } catch (IOException e) {
- isIncorrect = true;
- System.out.println("Ошибка при чтении файла! Исправьте файл и нажмите Enter.");
- }
- }
- if (isIncorrect) {
- scan.nextLine();
- }
- } while (isIncorrect);
- return n;
- }
- public static int inputNumberOfDisks(boolean isInput) {
- int n;
- if (isInput) {
- n = inputNumberOfDisksFromFile();
- outputSuccessfulInput();
- } else {
- n = inputNumberOfDisksFromConsole();
- }
- return n;
- }
- public static void outputPathOutputCondition() {
- System.out.println("Введите путь к файлу, в который вы хотите вывести результат: ");
- }
- public static void outputInFile(int n, String path) {
- try (PrintWriter fileWriter = new PrintWriter(new FileWriter(path, false))) {
- solveHanoiTower(n, 1, 3, 2, fileWriter);
- fileWriter.flush();
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- public static void solveHanoiTower(int n, int source, int destination, int auxiliary, PrintWriter fileWriter) {
- if (n == 1) {
- fileWriter.println("Переместить диск 1 с башни " + source + " на башню " + destination);
- return;
- }
- solveHanoiTower(n - 1, source, auxiliary, destination, fileWriter);
- fileWriter.println("Переместить диск " + n + " с башни " + source + " на башню " + destination);
- solveHanoiTower(n - 1, auxiliary, destination, source, fileWriter);
- }
- public static void outputSuccessfulOutput() {
- System.out.println("Данные записаны в файл успешно.");
- }
- public static void outputInConsole(int n) {
- solveHanoiTower(n, 1, 3, 2, new PrintWriter(System.out, true));
- }
- public static int chooseOutputOption() {
- System.out.println("Введите 0, если хотите вывести результат в консоль, и 1, если хотите вывести в файл: ");
- return scan.nextInt();
- }
- public static void outputFinalTower(int outputChoice, int n, String path) {
- if (outputChoice == 1) {
- if (path == null || path.isEmpty()) {
- System.out.println("Некорректный путь к файлу.");
- return;
- }
- outputInFile(n, path);
- outputSuccessfulOutput();
- } else {
- outputInConsole(n); // Вывод в консоль
- }
- }
- public static void main(String[] args) {
- int n;
- boolean isInput;
- int outputChoice;
- outputCondition();
- outputInputChoice();
- isInput = isUserChoice();
- n = inputNumberOfDisks(isInput);
- outputChoice = chooseOutputOption();
- if (outputChoice == 1) {
- scan.nextLine();
- outputPathOutputCondition();
- String path = takePath();
- outputFinalTower(outputChoice, n, path);
- } else {
- outputFinalTower(outputChoice, n, null);
- }
- scan.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement