Vanilla_Fury

laba_3_2_java

Nov 21st, 2020
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.98 KB | None | 0 0
  1. // Дана непустая последовательность символов, требуется построить и напечатать множество, элементами которого являются
  2. // встречающиеся в последовательности знаки арифметических операций и нечётные цифры.
  3.  
  4. package com.company;
  5.  
  6. import java.io.File;
  7. import java.io.PrintWriter;
  8. import java.util.HashSet;
  9. import java.util.Scanner;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;
  12.  
  13. class ExceptionFileCannotBeReadOrEmpty extends Exception {
  14. }
  15.  
  16. class ExceptionEmptyStringFound extends Exception {
  17. }
  18.  
  19. public class Main {
  20.  
  21. private static Scanner scConsole;
  22.  
  23. private static final String MES_TASK = "Дана непустая последовательность символов, требуется построить и напечатать " +
  24. "множество, элементами которого являются встречающиеся в последовательности знаки арифметических операций и нечётные цифры.";
  25. private static final String ERROR_FILE_NOT_FOUND = "Файл не найден.";
  26. private static final String FORMAT_INPUT_OF_PATH = "Пожалуйста, введите путь к файлу %s: ";
  27. private static final String MES_ASK_INPUT_METHOD = "\nОткуда брать данные?\n\t1 - из файла\n\t2 - ввести вручную\n";
  28. private static final String MES_ASK_AGAIN_INPUT_METHOD = "\t\"1\" - повторить попытку.\n\t\"2\" - ввести данные из консоли.\n";
  29. private static final String ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY = "Файл не может быть прочитан или пуст.";
  30. private static final String MES_ASK_OUTPUT_TO_FILE = "Хотите вывести ответ в файл?\n\t1 - да\n\t2 - нет\n";
  31. private static final String ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED = "Файл не может быть создан или открыт. Повторите попытку:\n";
  32. private static final String ERROR_CHOICE_IS_INCORRECT = "\tНадо ввести \"1\" или \"2\".\n\tПовторите попытку: ";
  33. private static final String ERROR_EMPTY_STRING = "Обнаружена пустая строка. ";
  34. private static final String MES_NO_APPROPRIATE_CHARS_FOUND = "Нет ни одного подходящего под описание символа";
  35.  
  36. private static String choose(String sChoice1, String sChoice2, String sQuestion) {
  37. short nChoice = 2;
  38. boolean bIsIncorrect;
  39. String sAnswer;
  40.  
  41. System.out.println(sQuestion + "\tВаш выбор: ");
  42. do {
  43. bIsIncorrect = false;
  44. try {
  45. nChoice = Short.parseShort(scConsole.nextLine());
  46. } catch (NumberFormatException e) {
  47. bIsIncorrect = true;
  48. }
  49. if (!bIsIncorrect && !(nChoice == 1) && !(nChoice == 2)) {
  50. bIsIncorrect = true;
  51. }
  52. if (bIsIncorrect) {
  53. System.out.println(ERROR_CHOICE_IS_INCORRECT);
  54. }
  55. } while (bIsIncorrect);
  56.  
  57. sAnswer = nChoice == 1 ? sChoice1 : sChoice2;
  58.  
  59. return sAnswer;
  60. }
  61.  
  62. private static String inputPathToFile(boolean bIsInput) {
  63. String sPath;
  64.  
  65. System.out.printf(FORMAT_INPUT_OF_PATH, bIsInput ? "ввода" : "вывода");
  66. sPath = scConsole.nextLine();
  67. return sPath;
  68. }
  69.  
  70. private static String readStringFromFile(String sPathToFile) throws java.io.FileNotFoundException, ExceptionFileCannotBeReadOrEmpty, ExceptionEmptyStringFound {
  71. Scanner scFileInput = new Scanner(new File(sPathToFile));
  72. String sInput;
  73.  
  74. if (scFileInput.hasNextLine()) {
  75. sInput = scFileInput.nextLine();
  76. if (sInput.equals("")) {
  77. throw new ExceptionEmptyStringFound();
  78. }
  79. } else {
  80. throw new ExceptionFileCannotBeReadOrEmpty();
  81. }
  82.  
  83. scFileInput.close();
  84.  
  85.  
  86. System.out.println("На входе:\n" + sInput);
  87. return sInput;
  88. }
  89.  
  90. private static String readStringFromConsole() {
  91. String sInput = "";
  92.  
  93. System.out.println("Введите строку:");
  94. while (sInput.equals("")) {
  95. sInput = scConsole.nextLine();
  96. if (sInput.equals("")) {
  97. System.out.println(ERROR_EMPTY_STRING + "Повторите попытку");
  98. }
  99. }
  100.  
  101. return sInput;
  102. }
  103.  
  104. private static String getInput() {
  105. String sInput = "";
  106. boolean bInputIsNotDone = true;
  107.  
  108. String sInputMethod = choose("FromFile", "FromConsole", MES_ASK_INPUT_METHOD);
  109.  
  110. do {
  111. switch (sInputMethod) {
  112. case "FromFile" -> {
  113. String sPathToFile = inputPathToFile(true);
  114. try {
  115. sInput = readStringFromFile(sPathToFile);
  116. bInputIsNotDone = false;
  117. } catch (java.io.FileNotFoundException e) {
  118. System.out.println(ERROR_FILE_NOT_FOUND);
  119. } catch (ExceptionFileCannotBeReadOrEmpty e) {
  120. System.out.println(ERROR_FILE_CANNOT_BE_READ_OR_IS_EMPTY);
  121. } catch (ExceptionEmptyStringFound e) {
  122. System.out.println(ERROR_EMPTY_STRING);
  123. }
  124. if (bInputIsNotDone) {
  125. sInputMethod = choose("FromFile", "FromConsole", MES_ASK_AGAIN_INPUT_METHOD);
  126. }
  127. }
  128. case "FromConsole" -> {
  129. sInput = readStringFromConsole();
  130. bInputIsNotDone = false;
  131. }
  132. }
  133. } while (bInputIsNotDone);
  134.  
  135. return sInput;
  136. }
  137.  
  138. private static HashSet<Character> computeAns(String sInput) throws java.lang.IllegalStateException {
  139. HashSet<Character> setSet = new HashSet<>();
  140.  
  141. Pattern pattern = Pattern.compile("[13579+*/-]");
  142. Matcher matcher = pattern.matcher(sInput);
  143.  
  144. while (matcher.find()) {
  145. setSet.add(matcher.group().charAt(0));
  146. }
  147.  
  148. return setSet;
  149. }
  150.  
  151. private static void outputToFile(HashSet<Character> setSet, String sPathToFile) {
  152. boolean bOutputNotReady = true;
  153. do {
  154. try {
  155. PrintWriter fOutput = new PrintWriter(sPathToFile);
  156.  
  157. if (setSet.size() > 0) {
  158. for (int i = 0; i < setSet.size() - 1; i++) {
  159. fOutput.print(setSet.toArray()[i] + " ");
  160. }
  161. fOutput.print(setSet.toArray()[setSet.size()]);
  162. } else {
  163. fOutput.print(MES_NO_APPROPRIATE_CHARS_FOUND);
  164. }
  165.  
  166. fOutput.close();
  167. bOutputNotReady = false;
  168. } catch (Exception e) {
  169. System.out.print(ERROR_FILE_CANNOT_BE_CREATED_OT_OPENED);
  170. String sShouldOutputInfoToFile = choose("Output to file", "Don't output to file", MES_ASK_OUTPUT_TO_FILE);
  171. if (sShouldOutputInfoToFile.equals("Output to file")) {
  172. sPathToFile = inputPathToFile(false);
  173. } else {
  174. bOutputNotReady = false;
  175. }
  176. }
  177. } while (bOutputNotReady);
  178. }
  179.  
  180. private static void outputAnswer(HashSet<Character> setSet) {
  181. System.out.println("Ответ: ");
  182. if (setSet.size() > 0) {
  183. for (int i = 0; i < setSet.size() - 1; i++) {
  184. System.out.print(setSet.toArray()[i] + ", ");
  185. }
  186. System.out.println(setSet.toArray()[setSet.size() - 1]);
  187. } else {
  188. System.out.println(MES_NO_APPROPRIATE_CHARS_FOUND);
  189. }
  190.  
  191. String sShouldOutputInfoToFile = choose("Output to file", "Don't output to file", MES_ASK_OUTPUT_TO_FILE);
  192. if (sShouldOutputInfoToFile.equals("Output to file")) {
  193. String sPathToFile = inputPathToFile(false);
  194. outputToFile(setSet, sPathToFile);
  195. }
  196.  
  197. }
  198.  
  199. public static void main(String[] args) {
  200. scConsole = new Scanner(System.in);
  201. HashSet<Character> setSet = new HashSet<>();
  202.  
  203. System.out.println(MES_TASK);
  204. // Путь к моему файлу ввода: /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 3/input.txt
  205. // Путь к моему файлу вывода: /Users/sasha/Documents/___Университет/ОАиП/Пз/Лабы/блок 3/output.txt
  206.  
  207. String sInput = getInput();
  208. setSet = computeAns(sInput);
  209. outputAnswer(setSet);
  210.  
  211. scConsole.close();
  212. }
  213. }
  214.  
Advertisement
Add Comment
Please, Sign In to add comment