Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // на самом деле довольно очевидно, что ответы совпадают с последовательностью Фиббоначи, так что в рекурсии нет необходимости
- package com.company;
- import java.io.File;
- import java.io.PrintWriter;
- import java.util.ArrayList;
- import java.util.Scanner;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class Main {
- private static Scanner scConsole;
- private static final int N_MIN = 3;
- private static final int N_MAX = 40;
- private static final String ASK_PATH_TO_FILE = "Введите путь к файлу.";
- private static final String CLARIFICATION_ASK_PATH_TO_FILE = "Введите абсолютный путь к текстовому файлу (.txt).";
- private static int bruteForce(short n, short CellIsNowOn) {
- int answer = 0;
- if (CellIsNowOn < n) {
- answer += bruteForce(n, (short) (CellIsNowOn + 1));
- if (CellIsNowOn < n - 1) {
- answer += bruteForce(n, (short) (CellIsNowOn + 2));
- }
- } else
- answer = 1;
- return answer;
- }
- private static short choose(String sQuestion, String[] Options) { // не больше 9-ти вариантов ответа
- final String CLARIFICATION_ASK_DIGIT = "Нужно ввести цифру (одну из предложенных).";
- short nChoice;
- String answer;
- StringBuilder optionsDigits = new StringBuilder();
- System.out.println(sQuestion + "\n\tВарианты: ");
- for (int i = 0; i < Options.length; i++) {
- System.out.println("\t" + (i + 1) + " - " + Options[i]);
- optionsDigits.append(i + 1);
- }
- answer = getAnythingFromConsole("", "^[" + optionsDigits + "]$", CLARIFICATION_ASK_DIGIT);
- nChoice = (short) (Short.parseShort(answer) - 1);
- return nChoice;
- }
- private static String getAnythingFromConsole(String Question, String regEx, String clarification) {
- String sInput;
- String sOutput = "";
- if (!Question.equals("")) {
- System.out.println(Question);
- }
- while (sOutput.equals("")) {
- sInput = scConsole.nextLine();
- sInput = sInput.trim();
- sOutput = findRegEx(sInput, regEx, "")[0];
- if (sOutput.equals("")) {
- System.out.println("Данные введены неверно. " + clarification + " Повторите попытку:");
- }
- }
- return sOutput;
- }
- private static String[] findRegEx(String sInput, String regEx, String outputIfNothingFound) {
- ArrayList<String> arrStringOutput = new ArrayList<>();
- Pattern pattern = Pattern.compile(regEx);
- Matcher matcher = pattern.matcher(sInput);
- if (matcher.find()) {
- do {
- arrStringOutput.add(matcher.group());
- } while (matcher.find());
- } else
- arrStringOutput.add(outputIfNothingFound);
- return arrStringOutput.toArray(new String[0]);
- }
- public static int readNFromFile() {
- final String ERROR_NO_INTS_IN_FILE = "Ошибка. В этом файле нет ни одного целого числа.";
- final String ERROR_NOT_CORRECT_RANGE = "Ошибка. Число должно входить в рамки от " + N_MIN + " до " + N_MAX + ".";
- final String ERROR_FILE_NOT_FOUND = "Ошибка. Надо вводить абсолютный путь к существеющему текстовому файлу (.txt).";
- boolean isNotCorrect = true;
- int n = 0;
- Scanner scFileInput;
- do {
- String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, ".+\\.txt",
- CLARIFICATION_ASK_PATH_TO_FILE);
- try {
- scFileInput = new Scanner(new File(sPathToFile));
- isNotCorrect = false;
- if (scFileInput.hasNextInt()) {
- n = scFileInput.nextInt();
- } else {
- System.out.println(ERROR_NO_INTS_IN_FILE);
- isNotCorrect = true;
- }
- if (!isNotCorrect && (n < N_MIN || n > N_MAX)) {
- System.out.println(ERROR_NOT_CORRECT_RANGE);
- isNotCorrect = true;
- }
- scFileInput.close();
- } catch (java.io.FileNotFoundException e) {
- System.out.println(ERROR_FILE_NOT_FOUND);
- }
- } while (isNotCorrect);
- System.out.println("На входе: " + n);
- return n;
- }
- public static void outputAnswerToFile(int answer) {
- final String MES_OUTPUT_DONE = "Ответ успешно записан в файл.";
- final String ERROR_COULD_NOT_OPEN_OR_CREATE_FILE = "Ошибка. Не удалось создать или открыть текстовый файл в заданной Вами директории.";
- boolean isNotCorrect = true;
- PrintWriter fileOutput;
- do {
- String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, ".+\\.txt",
- CLARIFICATION_ASK_PATH_TO_FILE);
- try {
- fileOutput = new PrintWriter(sPathToFile);
- fileOutput.print(answer);
- isNotCorrect = false;
- fileOutput.close();
- System.out.println(MES_OUTPUT_DONE);
- } catch (java.io.FileNotFoundException e) {
- System.out.println(ERROR_COULD_NOT_OPEN_OR_CREATE_FILE);
- }
- } while (isNotCorrect);
- }
- public static void mainPartOfProgram() {
- final String QUESTION_N_FROM_CONSOLE_OR_FILE = "Хотите ввести число N из консоли или из файла?";
- final String[] ANSWERS_N_FROM_CONSOLE_OR_FILE = new String[]{"из консоли", "из файла"};
- final String QUESTION_WANT_TO_OUTPUT_TO_FILE = "Хотите вывести ответ в файл?";
- final String QUESTION_WANT_TO_INPUT_ANOTHER_N = "Хотите ввести другое число N?";
- final String ASK_N = "Введите число N:";
- final String CLARIFICATION_ASK_N = "Надо ввести число от 3 до 40.";
- final String REG_EX_N = "^[0]*([1-3]\\d|40|[3-9])$";
- short answerOnQuestion;
- int answer;
- int n = 0;
- do {
- answerOnQuestion = choose(QUESTION_N_FROM_CONSOLE_OR_FILE, ANSWERS_N_FROM_CONSOLE_OR_FILE);
- switch (answerOnQuestion) {
- case 0 -> n = Integer.parseInt(getAnythingFromConsole(ASK_N,
- REG_EX_N, CLARIFICATION_ASK_N));
- case 1 -> n = readNFromFile();
- }
- answer = bruteForce((short) n, (short) 1);
- System.out.println("Ответ: " + answer + "\n");
- answerOnQuestion = choose(QUESTION_WANT_TO_OUTPUT_TO_FILE, new String[]{"да", "нет"});
- if (answerOnQuestion == 0) {
- outputAnswerToFile(answer);
- }
- answerOnQuestion = choose("\n" + QUESTION_WANT_TO_INPUT_ANOTHER_N, new String[]{"Да.",
- "Нет, закрыть программу."});
- } while (answerOnQuestion == 0);
- }
- public static void main(String[] args) {
- scConsole = new Scanner(System.in);
- // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 4/input.txt
- // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 4/output.txt
- System.out.println("Задание: Имеется полоска клетчатой бумаги шириной в одну клетку и длиной в n клеток.\n" +
- "На первой клетке установлена шашка. Одним ходом шашку можно передвигать на одну или две клетки.\n" +
- "Разработать рекурсивную функцию, определяющую количество способов продвижения шашки на n-ю клетку.\n");
- mainPartOfProgram();
- scConsole.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment