Vanilla_Fury

laba_4_2_java_v5

Feb 21st, 2021
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.41 KB | None | 0 0
  1. // на самом деле довольно очевидно, что ответы совпадают с последовательностью Фиббоначи, так что в рекурсии нет необходимости
  2.  
  3. package com.company;
  4.  
  5. import java.io.File;
  6. import java.io.PrintWriter;
  7. import java.util.ArrayList;
  8. import java.util.Scanner;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11.  
  12. public class Main {
  13.  
  14.     private static Scanner scConsole;
  15.  
  16.     private static final int N_MIN = 3;
  17.     private static final int N_MAX = 40;
  18.  
  19.     private static final String ASK_PATH_TO_FILE = "Введите путь к файлу.";
  20.     private static final String CLARIFICATION_ASK_PATH_TO_FILE = "Введите абсолютный путь к текстовому файлу (.txt).";
  21.  
  22.     private static int bruteForce(short n, short CellIsNowOn) {
  23.         int answer = 0;
  24.         if (CellIsNowOn < n) {
  25.             answer += bruteForce(n, (short) (CellIsNowOn + 1));
  26.             if (CellIsNowOn < n - 1) {
  27.                 answer += bruteForce(n, (short) (CellIsNowOn + 2));
  28.             }
  29.         } else
  30.             answer = 1;
  31.         return answer;
  32.     }
  33.  
  34.     private static short choose(String sQuestion, String[] Options) { // не больше 9-ти вариантов ответа
  35.         final String CLARIFICATION_ASK_DIGIT = "Нужно ввести цифру (одну из предложенных).";
  36.  
  37.         short nChoice;
  38.         String answer;
  39.         StringBuilder optionsDigits = new StringBuilder();
  40.  
  41.         System.out.println(sQuestion + "\n\tВарианты: ");
  42.         for (int i = 0; i < Options.length; i++) {
  43.             System.out.println("\t" + (i + 1) + " - " + Options[i]);
  44.             optionsDigits.append(i + 1);
  45.         }
  46.  
  47.         answer = getAnythingFromConsole("", "^[" + optionsDigits + "]$", CLARIFICATION_ASK_DIGIT);
  48.         nChoice = (short) (Short.parseShort(answer) - 1);
  49.  
  50.         return nChoice;
  51.     }
  52.  
  53.     private static String getAnythingFromConsole(String Question, String regEx, String clarification) {
  54.         String sInput;
  55.         String sOutput = "";
  56.  
  57.         if (!Question.equals("")) {
  58.             System.out.println(Question);
  59.         }
  60.  
  61.         while (sOutput.equals("")) {
  62.             sInput = scConsole.nextLine();
  63.             sInput = sInput.trim();
  64.             sOutput = findRegEx(sInput, regEx, "")[0];
  65.             if (sOutput.equals("")) {
  66.                 System.out.println("Данные введены неверно. " + clarification + " Повторите попытку:");
  67.             }
  68.         }
  69.  
  70.         return sOutput;
  71.     }
  72.  
  73.     private static String[] findRegEx(String sInput, String regEx, String outputIfNothingFound) {
  74.         ArrayList<String> arrStringOutput = new ArrayList<>();
  75.         Pattern pattern = Pattern.compile(regEx);
  76.         Matcher matcher = pattern.matcher(sInput);
  77.  
  78.         if (matcher.find()) {
  79.             do {
  80.                 arrStringOutput.add(matcher.group());
  81.             } while (matcher.find());
  82.         } else
  83.             arrStringOutput.add(outputIfNothingFound);
  84.  
  85.         return arrStringOutput.toArray(new String[0]);
  86.     }
  87.  
  88.     public static int readNFromFile() {
  89.         final String ERROR_NO_INTS_IN_FILE = "Ошибка. В этом файле нет ни одного целого числа.";
  90.         final String ERROR_NOT_CORRECT_RANGE = "Ошибка. Число должно входить в рамки от " + N_MIN + " до " + N_MAX + ".";
  91.         final String ERROR_FILE_NOT_FOUND = "Ошибка. Надо вводить абсолютный путь к существеющему текстовому файлу (.txt).";
  92.  
  93.         boolean isNotCorrect = true;
  94.         int n = 0;
  95.         Scanner scFileInput;
  96.         do {
  97.             String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, ".+\\.txt",
  98.                     CLARIFICATION_ASK_PATH_TO_FILE);
  99.             try {
  100.                 scFileInput = new Scanner(new File(sPathToFile));
  101.                 isNotCorrect = false;
  102.                 if (scFileInput.hasNextInt()) {
  103.                     n = scFileInput.nextInt();
  104.                 } else {
  105.                     System.out.println(ERROR_NO_INTS_IN_FILE);
  106.                     isNotCorrect = true;
  107.                 }
  108.                 if (!isNotCorrect && (n < N_MIN || n > N_MAX)) {
  109.                     System.out.println(ERROR_NOT_CORRECT_RANGE);
  110.                     isNotCorrect = true;
  111.                 }
  112.  
  113.                 scFileInput.close();
  114.             } catch (java.io.FileNotFoundException e) {
  115.                 System.out.println(ERROR_FILE_NOT_FOUND);
  116.             }
  117.         } while (isNotCorrect);
  118.  
  119.         System.out.println("На входе: " + n);
  120.         return n;
  121.     }
  122.  
  123.     public static void outputAnswerToFile(int answer) {
  124.         final String MES_OUTPUT_DONE = "Ответ успешно записан в файл.";
  125.         final String ERROR_COULD_NOT_OPEN_OR_CREATE_FILE = "Ошибка. Не удалось создать или открыть текстовый файл в заданной Вами директории.";
  126.  
  127.         boolean isNotCorrect = true;
  128.         PrintWriter fileOutput;
  129.         do {
  130.             String sPathToFile = getAnythingFromConsole(ASK_PATH_TO_FILE, ".+\\.txt",
  131.                     CLARIFICATION_ASK_PATH_TO_FILE);
  132.             try {
  133.                 fileOutput = new PrintWriter(sPathToFile);
  134.                 fileOutput.print(answer);
  135.                 isNotCorrect = false;
  136.                 fileOutput.close();
  137.                 System.out.println(MES_OUTPUT_DONE);
  138.             } catch (java.io.FileNotFoundException e) {
  139.                 System.out.println(ERROR_COULD_NOT_OPEN_OR_CREATE_FILE);
  140.             }
  141.         } while (isNotCorrect);
  142.     }
  143.  
  144.     public static void mainPartOfProgram() {
  145.         final String QUESTION_N_FROM_CONSOLE_OR_FILE = "Хотите ввести число N из консоли или из файла?";
  146.         final String[] ANSWERS_N_FROM_CONSOLE_OR_FILE = new String[]{"из консоли", "из файла"};
  147.         final String QUESTION_WANT_TO_OUTPUT_TO_FILE = "Хотите вывести ответ в файл?";
  148.         final String QUESTION_WANT_TO_INPUT_ANOTHER_N = "Хотите ввести другое число N?";
  149.         final String ASK_N = "Введите число N:";
  150.         final String CLARIFICATION_ASK_N = "Надо ввести число от 3 до 40.";
  151.         final String REG_EX_N = "^[0]*([1-3]\\d|40|[3-9])$";
  152.  
  153.         short answerOnQuestion;
  154.         int answer;
  155.         int n = 0;
  156.  
  157.         do {
  158.             answerOnQuestion = choose(QUESTION_N_FROM_CONSOLE_OR_FILE, ANSWERS_N_FROM_CONSOLE_OR_FILE);
  159.             switch (answerOnQuestion) {
  160.                 case 0 -> n = Integer.parseInt(getAnythingFromConsole(ASK_N,
  161.                         REG_EX_N, CLARIFICATION_ASK_N));
  162.                 case 1 -> n = readNFromFile();
  163.             }
  164.  
  165.             answer = bruteForce((short) n, (short) 1);
  166.             System.out.println("Ответ: " + answer + "\n");
  167.             answerOnQuestion = choose(QUESTION_WANT_TO_OUTPUT_TO_FILE, new String[]{"да", "нет"});
  168.             if (answerOnQuestion == 0) {
  169.                 outputAnswerToFile(answer);
  170.             }
  171.             answerOnQuestion = choose("\n" + QUESTION_WANT_TO_INPUT_ANOTHER_N, new String[]{"Да.",
  172.                     "Нет, закрыть программу."});
  173.         } while (answerOnQuestion == 0);
  174.     }
  175.  
  176.     public static void main(String[] args) {
  177.         scConsole = new Scanner(System.in);
  178.  
  179.         // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 4/input.txt
  180.         // /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 4/output.txt
  181.  
  182.         System.out.println("Задание: Имеется полоска клетчатой бумаги шириной в одну клетку и длиной в n клеток.\n" +
  183.                 "На первой клетке установлена шашка. Одним ходом шашку можно передвигать на одну или две клетки.\n" +
  184.                 "Разработать рекурсивную функцию, определяющую количество способов продвижения шашки на n-ю клетку.\n");
  185.  
  186.         mainPartOfProgram();
  187.  
  188.         scConsole.close();
  189.     }
  190. }
  191.  
Advertisement
Add Comment
Please, Sign In to add comment