Advertisement
anticlown

Laba.5.1.Full(Java)

Mar 13th, 2023
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.22 KB | None | 0 0
  1. //Main
  2. import java.util.Scanner;
  3. import java.io.*;
  4.  
  5. final class inpData {
  6.     public int numberOfPlayers;
  7.     public int numberOut;
  8.     public CircularLinkedList playerList;
  9.  
  10.     public inpData(int numberOfPlayers, int numberOut, CircularLinkedList playerList) {
  11.         this.numberOfPlayers = numberOfPlayers;
  12.         this.numberOut = numberOut;
  13.         this.playerList = playerList;
  14.     }
  15. }
  16.  
  17. public class Main {
  18.     private static final int MIN_PLAYERS = 3;
  19.     private static final int MAX_PLAYERS = 10;
  20.     private static final int MIN_VALUE = 1;
  21.     //private static final int MAX_VALUE = 1;
  22.     private static final Scanner scan = new Scanner(System.in);
  23.     public static void outputTaskInfo() {
  24.         System.out.println("Данная программа реализует игру: N ребят встали в круг."  + "\n" +
  25.                 "Каждый раз, начиная с первого, из круга выводится каждый M-й." + "\n" +
  26.                 "Программа выводит номера в порядке выбывания и последнего оставшегося." + "\n" +
  27.                 "Диапазон ввода количества игроков: " + MIN_PLAYERS + "..." + MAX_PLAYERS + ". \n" +
  28.                 "Диапазон ввода номера выбывающего: " + MIN_VALUE + "..." + "(Номер последнего игркока)" + ".");
  29.     }
  30.  
  31.     public static int getVerificationOfChoice() {
  32.         int choice = 0;
  33.         boolean isIncorrect;
  34.  
  35.         do {
  36.             isIncorrect = false;
  37.             try {
  38.                 choice = Integer.parseInt(scan.nextLine());
  39.             } catch (NumberFormatException e) {
  40.                 System.out.println("Проверьте корректность ввода данных!");
  41.                 isIncorrect = true;
  42.             }
  43.             if (!isIncorrect && (choice != 0 && choice != 1)) {
  44.                 System.out.println("Для выбора введите 0 или 1!");
  45.                 isIncorrect = true;
  46.             }
  47.         } while (isIncorrect);
  48.  
  49.         return choice;
  50.     }
  51.  
  52.     public static String inputPathToFile() {
  53.         boolean isIncorrect;
  54.         String path;
  55.  
  56.         System.out.println("Укажите путь к файлу: ");
  57.  
  58.         do {
  59.             isIncorrect = false;
  60.             path = scan.nextLine();
  61.             File file = new File(path);
  62.  
  63.             if (!file.exists()) {
  64.                 System.out.println("По указанному пути файл не найден! Укажите правильный путь: ");
  65.                 isIncorrect = true;
  66.             }
  67.         } while (isIncorrect);
  68.  
  69.         return path;
  70.     }
  71.  
  72.     public static int readNumberOfPlayersFromConsole() {
  73.         int numberOfPlayers = 0;
  74.         boolean isIncorrect;
  75.  
  76.         System.out.println("Введите значение количетва участников: ");
  77.  
  78.         do {
  79.             isIncorrect = false;
  80.             try {
  81.                 numberOfPlayers = Integer.parseInt(scan.nextLine());
  82.             } catch (NumberFormatException e) {
  83.                 System.out.println("Проверьте корректность ввода данных!");
  84.                 isIncorrect = true;
  85.             }
  86.             if (!isIncorrect && (numberOfPlayers < MIN_PLAYERS || numberOfPlayers > MAX_PLAYERS)) {
  87.                 System.out.println("Введите число от " + MIN_PLAYERS + " до " + MAX_PLAYERS + "!");
  88.                 isIncorrect = true;
  89.             }
  90.         } while (isIncorrect);
  91.  
  92.         return numberOfPlayers;
  93.     }
  94.  
  95.     public static int readNumberOfPlayersFromFile(final String path) {
  96.         int numberOfPlayers;
  97.         boolean isIncorrect = true;
  98.  
  99.         System.out.println("Происходит чтение количества участников...");
  100.  
  101.         try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  102.             numberOfPlayers = Integer.parseInt(br.readLine());
  103.         } catch (Exception e) {
  104.             isIncorrect = false;
  105.             System.out.println("Ошибка при чтении данных! Введите количество участников с консоли!");
  106.             numberOfPlayers = readNumberOfPlayersFromConsole();
  107.         }
  108.  
  109.         return numberOfPlayers;
  110.     }
  111.  
  112.     public static void outputNumberOfPlayers(final int choice, int numberOfPlayers, String path) {
  113.         boolean isIncorrect;
  114.  
  115.         if (choice == 0)
  116.             System.out.println("Количество игроков равно: " + numberOfPlayers + ".");
  117.  
  118.         if (choice == 1) {
  119.             System.out.println("Вывод количества игроков в файл...");
  120.  
  121.             do {
  122.                 isIncorrect = false;
  123.                 try {
  124.                     FileWriter writer = new FileWriter(path);
  125.                     writer.write("Кол-во игроков: " + numberOfPlayers + "\n");
  126.                     writer.close();
  127.                 } catch (IOException e) {
  128.                     isIncorrect = true;
  129.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  130.                     path = inputPathToFile();
  131.                 }
  132.             } while (isIncorrect);
  133.  
  134.             System.out.println("Данные успешно записаны в файл!");
  135.         }
  136.     }
  137.  
  138.     public static int readNumberOutFromConsole(int numberOfPlayers) {
  139.         int numberOut = 0;
  140.         boolean isIncorrect;
  141.  
  142.         System.out.println("Введите номер выбывающего участника: ");
  143.  
  144.         do {
  145.             isIncorrect = false;
  146.             try {
  147.                 numberOut = Integer.parseInt(scan.nextLine());
  148.             } catch (NumberFormatException e) {
  149.                 System.out.println("Проверьте корректность ввода данных!");
  150.                 isIncorrect = true;
  151.             }
  152.             if (!isIncorrect && (numberOut < MIN_VALUE || numberOut > numberOfPlayers)) {
  153.                 System.out.println("Введите число от " + MIN_PLAYERS + " до " + numberOfPlayers + "!");
  154.                 isIncorrect = true;
  155.             }
  156.         } while (isIncorrect);
  157.  
  158.         return numberOut;
  159.     }
  160.  
  161.     public static int readNumberOutFromFile(final String path) {
  162.         int numberOut;
  163.         boolean isIncorrect = true;
  164.  
  165.         System.out.println("Происходит чтение номера выбывающего...");
  166.  
  167.         try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  168.             br.readLine();
  169.             numberOut = Integer.parseInt(br.readLine());
  170.         } catch (Exception e) {
  171.             isIncorrect = false;
  172.             System.out.println("Ошибка при чтении данных! Введите количество участников с консоли!");
  173.             numberOut = readNumberOfPlayersFromConsole();
  174.         }
  175.  
  176.         return numberOut;
  177.     }
  178.  
  179.     public static void outputNumberOut(final int choice, int numberOut, String path) {
  180.         boolean isIncorrect;
  181.  
  182.         if (choice == 0)
  183.             System.out.println("Номер выбывающего игрока: " + numberOut + ".");
  184.  
  185.         if (choice == 1) {
  186.             System.out.println("Вывод номера выбывающего игрока в файл...");
  187.  
  188.             do {
  189.                 isIncorrect = false;
  190.                 try {
  191.                     FileWriter writer = new FileWriter(path, true);
  192.                     writer.write("Номер выбывающего игрока: " + numberOut + "\n");
  193.                     writer.close();
  194.                 } catch (IOException e) {
  195.                     isIncorrect = true;
  196.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  197.                     path = inputPathToFile();
  198.                 }
  199.             } while (isIncorrect);
  200.  
  201.             System.out.println("Данные успешно записаны в файл!");
  202.         }
  203.     }
  204.  
  205.     public static CircularLinkedList createCircularLinkedList(final int numberOfPlayers) {
  206.         CircularLinkedList cll = new CircularLinkedList();
  207.  
  208.         for (int i = 1; i <= numberOfPlayers; i++) {
  209.             cll.addNode(i);
  210.         }
  211.  
  212.         return cll;
  213.     }
  214.  
  215.     public static void outputStartPlayerList(String path, final int choice, final CircularLinkedList playerList){
  216.         boolean isIncorrect;
  217.         Node currentNode = playerList.head;
  218.  
  219.         if (choice == 0) {
  220.             System.out.println("Вывод начальной последовательности игроков: ");
  221.             if (playerList.head != null) {
  222.                 do {
  223.                     System.out.print(currentNode.value + " ");
  224.                     currentNode = currentNode.nextNode;
  225.                 } while (currentNode != playerList.head);
  226.             }
  227.             System.out.print("\n");
  228.         }
  229.         if (choice == 1) {
  230.             System.out.println("Вывод начальной последовательности игроков в файл...");
  231.  
  232.             do {
  233.                 isIncorrect = false;
  234.                 try {
  235.                     FileWriter writer = new FileWriter(path, true);
  236.                     BufferedWriter bufferWriter = new BufferedWriter(writer);
  237.  
  238.                     bufferWriter.write("Начальная последовательноcть: ");
  239.                     if (playerList.head != null) {
  240.                         do {
  241.                             bufferWriter.write(currentNode.value + " ");
  242.                             currentNode = currentNode.nextNode;
  243.                         } while (currentNode != playerList.head);
  244.                     }
  245.                     bufferWriter.write("\n");
  246.  
  247.                     bufferWriter.close();
  248.                     writer.close();
  249.                 } catch (IOException e) {
  250.                     isIncorrect = true;
  251.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  252.                     path = inputPathToFile();
  253.                 }
  254.             } while (isIncorrect);
  255.  
  256.             System.out.println("Данные успешно записаны в файл!");
  257.         }
  258.     }
  259.  
  260.     public static int[] processGame(inpData data) {
  261.         Node currentNode = data.playerList.head;
  262.         int counter = 0;
  263.         int[] ansArr = new int[data.numberOfPlayers];
  264.  
  265.         if (data.playerList.head != null) {
  266.             do {
  267.                 int i = 0;
  268.                 while (i < data.numberOut - 1) {
  269.                     currentNode = currentNode.nextNode;
  270.                     i++;
  271.                 }
  272.  
  273.                 ansArr[counter] = currentNode.value;
  274.                 counter++;
  275.                 data.playerList.deleteNode(currentNode.value);
  276.                 currentNode = currentNode.nextNode;
  277.             } while (data.playerList.tail != data.playerList.head);
  278.         }
  279.  
  280.         ansArr[counter] = currentNode.value;
  281.         return ansArr;
  282.     }
  283.  
  284.     public static void outputAnsArr(final int choice, String path, final int[] ansArr, final int numberOfPlayers) {
  285.         boolean isIncorrect;
  286.  
  287.         if (choice == 0) {
  288.             System.out.print("Вывод последовательсности выбывших: ");
  289.  
  290.             for (int i = 0; i < numberOfPlayers - 1; i++)
  291.             {
  292.                 System.out.print(ansArr[i] + " ");
  293.             }
  294.             System.out.print("\nПоследний: " + ansArr[numberOfPlayers - 1]);
  295.         }
  296.  
  297.         if (choice == 1) {
  298.             System.out.println("Вывод последовательсности выбывших в файл...");
  299.  
  300.             do {
  301.                 isIncorrect = false;
  302.                 try {
  303.                     FileWriter writer = new FileWriter(path, true);
  304.                     BufferedWriter bufferWriter = new BufferedWriter(writer);
  305.  
  306.                     bufferWriter.write("Выбывшие: ");
  307.                     for (int i = 0; i < numberOfPlayers - 1; i++)
  308.                     {
  309.                         bufferWriter.write(ansArr[i] + " ");
  310.                     }
  311.                     bufferWriter.write("\nПоследний: " + ansArr[numberOfPlayers - 1]);
  312.  
  313.                     bufferWriter.close();
  314.                     writer.close();
  315.                 } catch (IOException e) {
  316.                     isIncorrect = true;
  317.                     System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!");
  318.                     path = inputPathToFile();
  319.                 }
  320.             } while (isIncorrect);
  321.  
  322.             System.out.println("Данные успешно записаны в файл!");
  323.         }
  324.     }
  325.  
  326.     public static inpData processUserInput() {
  327.         int numberOfPlayers = 0, numberOut = 0;
  328.         CircularLinkedList playerList = null;
  329.         int choiceForInput;
  330.         String pathToIn;
  331.  
  332.         System.out.println("Вы желаете ввести данные с консоли(0) или взять данные из файла(1)?");
  333.         choiceForInput = getVerificationOfChoice();
  334.  
  335.         if (choiceForInput == 0) {
  336.             numberOfPlayers = readNumberOfPlayersFromConsole();
  337.             numberOut = readNumberOutFromConsole(numberOfPlayers);
  338.             playerList = createCircularLinkedList(numberOfPlayers);
  339.         }
  340.         if (choiceForInput == 1) {
  341.             pathToIn = inputPathToFile();
  342.             numberOfPlayers = readNumberOfPlayersFromFile(pathToIn);
  343.             numberOut = readNumberOutFromFile(pathToIn);
  344.             playerList = createCircularLinkedList(numberOfPlayers);
  345.         }
  346.  
  347.         return new inpData(numberOfPlayers, numberOut, playerList);
  348.     }
  349.  
  350.     public static void processUserOutput(inpData data) {
  351.         int choiceForOutput;
  352.         String pathToOut = "";
  353.         int[] ansArr = new int[data.numberOfPlayers];
  354.  
  355.         System.out.println("Вы желаете получить результат в консоли(0) или в файле(1)?");
  356.         choiceForOutput = getVerificationOfChoice();
  357.  
  358.         if (choiceForOutput == 1)
  359.             pathToOut = inputPathToFile();
  360.         outputNumberOfPlayers(choiceForOutput, data.numberOfPlayers, pathToOut);
  361.         outputNumberOut(choiceForOutput, data.numberOut, pathToOut);
  362.         outputStartPlayerList(pathToOut, choiceForOutput, data.playerList);
  363.         ansArr = processGame(data);
  364.         outputAnsArr (choiceForOutput, pathToOut, ansArr, data.numberOfPlayers);
  365.     }
  366.  
  367.     public static void main (String[] args) {
  368.         outputTaskInfo();
  369.         inpData data = processUserInput();
  370.         processUserOutput(data);
  371.  
  372.         scan.close();
  373.     }
  374. }
  375.  
  376. //CircularLinkedList
  377.  
  378. public class CircularLinkedList {
  379.     public Node head = null;
  380.     public Node tail = null;
  381.  
  382.     public void addNode(int value) {
  383.         Node newNode = new Node(value);
  384.  
  385.         if (head == null) {
  386.             head = newNode;
  387.         } else {
  388.             tail.nextNode = newNode;
  389.         }
  390.  
  391.         tail = newNode;
  392.         tail.nextNode = head;
  393.     }
  394.  
  395.     public void deleteNode(int valueToDelete) {
  396.         Node currentNode = head;
  397.         if (head == null) {
  398.             return;
  399.         }
  400.         do {
  401.             Node nextNode = currentNode.nextNode;
  402.             if (nextNode.value == valueToDelete) {
  403.                 if (tail == head) {
  404.                     head = null;
  405.                     tail = null;
  406.                 } else {
  407.                     currentNode.nextNode = nextNode.nextNode;
  408.                     if (head == nextNode) {
  409.                         head = head.nextNode;
  410.                     }
  411.                     if (tail == nextNode) {
  412.                         tail = currentNode;
  413.                     }
  414.                 }
  415.                 break;
  416.             }
  417.             currentNode = nextNode;
  418.         } while (currentNode != head);
  419.     }
  420. }
  421.  
  422. //Node
  423.  
  424. class Node {
  425.  
  426.     int value;
  427.     Node nextNode;
  428.  
  429.     public Node(int value) {
  430.         this.value = value;
  431.     }
  432. }
  433.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement