Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sat_final_lab;
- import java.util.ArrayList;
- public class PortSimulator {
- /**
- * LENGTH - константа, определяющая количество входных слов.
- * previousCondition определяет предыдущее состояние.
- * operationalCondition определяет оперативное состояние.
- * portNumber - максимальное количество портов. Переменная декрементируется в методе run(), а ее значение заносится
- * в changedPorts, если на порту произошло изменение.
- * previousConditionParts и operationalConditionParts хранят массив слов в целочисленном формате.
- * changedPorts - список, хранящий номера портов, на которых произошло изменение.
- */
- private static final int LENGTH = 4;
- private String previousCondition = "10011001 11110011 00001111 11000011";
- private String operationalCondition;
- private int portNumber = 31;
- private int[] previousConditionParts = new int[LENGTH];
- private int[] operationalConditionParts = new int[LENGTH];
- private ArrayList<Integer> changedPorts = new ArrayList<>();
- private ArrayList<Integer> freePorts = new ArrayList<>();
- /**
- * Конструктор класса
- * @param operationalCondition - оперативное состояние, вводимое пользователем.
- */
- public PortSimulator(String operationalCondition) {
- this.operationalCondition = operationalCondition;
- // Временные массивы, хранящие в себе слова состояний.
- String[] tempPrevious = parseCondition(previousCondition);
- String[] tempOperational = parseCondition(operationalCondition);
- /**
- * Цикл, в котором заполняются массивы previousConditionParts и operationalConditionParts.
- */
- for (int i = 0; i < LENGTH; i++) {
- previousConditionParts[i] = Integer.parseInt(tempPrevious[i], 2);
- operationalConditionParts[i] = Integer.parseInt(tempOperational[i], 2);
- }
- }
- /**
- * Метод, выполняющий разбиение строки condition по пробелам.
- * @param condition - состояние: оперативное или предыдущее
- * @return строковый массив.
- */
- private String[] parseCondition(String condition) {
- return condition.split(" ");
- }
- /**
- * Метод для получения предыдущего состояния.
- * @return
- */
- public String getPreviousCondition() { return previousCondition; }
- /**
- * Метод, содержащий логику программы.
- * int temp - переменная, хранящая результат (предудущее состояние xor оперативное сосотояние).
- * String tempBinValue - строка, хранящая строковое значение, возвращаемое методом toBinaryString();
- * StringBuilder conditionBinValue - "строка", хранящая состояние изменений.
- */
- public void run() {
- int temp;
- String tempBinValue;
- String tempBinValueForPorts;
- StringBuilder changesBinValue = new StringBuilder();
- StringBuilder freePortsSB = new StringBuilder();
- // Цикл, выполняющийся для всех слов состояний (4 раза).
- for (int iteration = 0; iteration < LENGTH; iteration++) {
- // Если слово предыдущего состояния не равно слову оперативного состояния,
- if (previousConditionParts[iteration] != operationalConditionParts[iteration]) {
- // то выпоняется операция xor над словом предыдущего состояния и словом оперативного состояния,
- temp = previousConditionParts[iteration] ^ operationalConditionParts[iteration];
- // а затем выполняется операция and (логическое умножение) над результатом xor и
- // словом оперативного состояния и записывается в строку в двоичном виде.
- tempBinValue = Integer.toBinaryString(temp & operationalConditionParts[iteration]);
- // Условие, созданное для представления слова состояния в двоичном виде в полной форме.
- // Если длина строки <= 8, то
- if (tempBinValue.length() <= 8) {
- // выполняется цикл от 0 до разницы (8 - длина бинарной строки),
- for (int i = 0; i < 8 - tempBinValue.length(); i++)
- // который на каждой итерации записывает 0 в changesBinValue,
- changesBinValue.append("0");
- // а затем добавляется само значение бинарной строки.
- changesBinValue.append(tempBinValue);
- }
- // Условие, при котором слово предыдущего состояния изменяется на слово оперативного состояния.
- if (tempBinValue.contains("1"))
- previousConditionParts[iteration] = operationalConditionParts[iteration];
- // Умножение на слово предыдущего состояния для выявления освободившихся портов.
- tempBinValueForPorts = Integer.toBinaryString(temp & previousConditionParts[iteration]);
- if (tempBinValueForPorts.length() <= 8) {
- for (int i = 0; i < 8 - tempBinValueForPorts.length(); i++)
- freePortsSB.append("0");
- freePortsSB.append(tempBinValueForPorts);
- }
- }
- }
- // Цикл, который выискивает единицу в строке и записывает номер порта, на котором произошло изменение, в
- // список changedPorts.
- for (int i = 0; i < changesBinValue.length(); i++) {
- if (changesBinValue.charAt(i) == '1') {
- changedPorts.add(portNumber);
- }
- portNumber--;
- }
- portNumber = 31;
- // Цикл, который выискивает единицу в строке и записывает номер освободившегося порта в
- // список freePorts.
- for (int i = 0; i < freePortsSB.length(); i++) {
- if (freePortsSB.charAt(i) == '1') {
- freePorts.add(portNumber);
- }
- portNumber--;
- }
- // Если список не пуст,
- if (!changedPorts.isEmpty()) {
- // то выводим на экран номера портов, содержащиеся в списке,
- System.out.print("Изменения произошли на портах: ");
- for (int port : changedPorts)
- System.out.print(port + " ");
- // иначе изменений не произошло и список пуст.
- } else {
- System.out.println("Изменений не произошло.");
- }
- System.out.println();
- // Если список не пуст,
- if (!freePorts.isEmpty()) {
- // то выводим на экран номера портов, содержащиеся в списке,
- System.out.print("Освободившиеся порты: ");
- for (int port : freePorts)
- System.out.print(port + " ");
- // иначе изменений не произошло и список пуст.
- } else {
- System.out.println("Изменений не произошло.");
- }
- System.out.println();
- // Изменение строки предыдущего состояния на новую.
- StringBuilder newPreviousCondition = new StringBuilder();
- for (int number : previousConditionParts) {
- String tmp = Integer.toBinaryString(number);
- if (tmp.length() <= 8) {
- for (int i = 0; i < 8 - tmp.length(); i++)
- freePortsSB.append("0");
- newPreviousCondition.append(tmp);
- newPreviousCondition.append(" ");
- }
- }
- System.out.println();
- System.out.println("Новая строка предыдущего состояния: " + newPreviousCondition.toString());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment