chillurbrain

PortSimulator.java

Nov 21st, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.23 KB | None | 0 0
  1. package sat_final_lab;
  2.  
  3.  
  4. import java.util.ArrayList;
  5.  
  6. public class PortSimulator {
  7.     /**
  8.      * LENGTH - константа, определяющая количество входных слов.
  9.      * previousCondition определяет предыдущее состояние.
  10.      * operationalCondition определяет оперативное состояние.
  11.      * portNumber - максимальное количество портов. Переменная декрементируется в методе run(), а ее значение заносится
  12.      * в changedPorts, если на порту произошло изменение.
  13.      * previousConditionParts и operationalConditionParts хранят массив слов в целочисленном формате.
  14.      * changedPorts - список, хранящий номера портов, на которых произошло изменение.
  15.      */
  16.     private static final int LENGTH = 4;
  17.     private String previousCondition = "10011001 11110011 00001111 11000011";
  18.     private String operationalCondition;
  19.     private int portNumber = 31;
  20.     private int[] previousConditionParts = new int[LENGTH];
  21.     private int[] operationalConditionParts = new int[LENGTH];
  22.     private ArrayList<Integer> changedPorts = new ArrayList<>();
  23.     private ArrayList<Integer> freePorts = new ArrayList<>();
  24.  
  25.     /**
  26.      * Конструктор класса
  27.      * @param operationalCondition - оперативное состояние, вводимое пользователем.
  28.      */
  29.     public PortSimulator(String operationalCondition) {
  30.         this.operationalCondition = operationalCondition;
  31.  
  32.         // Временные массивы, хранящие в себе слова состояний.
  33.         String[] tempPrevious = parseCondition(previousCondition);
  34.         String[] tempOperational = parseCondition(operationalCondition);
  35.  
  36.         /**
  37.          * Цикл, в котором заполняются массивы previousConditionParts и operationalConditionParts.
  38.          */
  39.         for (int i = 0; i < LENGTH; i++) {
  40.             previousConditionParts[i] = Integer.parseInt(tempPrevious[i], 2);
  41.             operationalConditionParts[i] = Integer.parseInt(tempOperational[i], 2);
  42.         }
  43.     }
  44.  
  45.     /**
  46.      * Метод, выполняющий разбиение строки condition по пробелам.
  47.      * @param condition - состояние: оперативное или предыдущее
  48.      * @return строковый массив.
  49.      */
  50.     private String[] parseCondition(String condition) {
  51.         return condition.split(" ");
  52.     }
  53.  
  54.     /**
  55.      * Метод для получения предыдущего состояния.
  56.      * @return
  57.      */
  58.     public String getPreviousCondition() { return previousCondition; }
  59.  
  60.     /**
  61.      * Метод, содержащий логику программы.
  62.      * int temp - переменная, хранящая результат (предудущее состояние xor оперативное сосотояние).
  63.      * String tempBinValue - строка, хранящая строковое значение, возвращаемое методом toBinaryString();
  64.      * StringBuilder conditionBinValue - "строка", хранящая состояние изменений.
  65.      */
  66.     public void run() {
  67.  
  68.         int temp;
  69.         String tempBinValue;
  70.         String tempBinValueForPorts;
  71.         StringBuilder changesBinValue = new StringBuilder();
  72.         StringBuilder freePortsSB = new StringBuilder();
  73.  
  74.         // Цикл, выполняющийся для всех слов состояний (4 раза).
  75.         for (int iteration = 0; iteration < LENGTH; iteration++) {
  76.             // Если слово предыдущего состояния не равно слову оперативного состояния,
  77.             if (previousConditionParts[iteration] != operationalConditionParts[iteration]) {
  78.                 // то выпоняется операция xor над словом предыдущего состояния и словом оперативного состояния,
  79.                 temp = previousConditionParts[iteration] ^ operationalConditionParts[iteration];
  80.                 // а затем выполняется операция and (логическое умножение) над результатом xor и
  81.                 // словом оперативного состояния и записывается в строку в двоичном виде.
  82.                 tempBinValue = Integer.toBinaryString(temp & operationalConditionParts[iteration]);
  83.                 // Условие, созданное для представления слова состояния в двоичном виде в полной форме.
  84.                 // Если длина строки <= 8, то
  85.                 if (tempBinValue.length() <= 8) {
  86.                     // выполняется цикл от 0 до разницы (8 - длина бинарной строки),
  87.                     for (int i = 0; i < 8 - tempBinValue.length(); i++)
  88.                         // который на каждой итерации записывает 0 в changesBinValue,
  89.                         changesBinValue.append("0");
  90.                     // а затем добавляется само значение бинарной строки.
  91.                     changesBinValue.append(tempBinValue);
  92.                 }
  93.                 // Условие, при котором слово предыдущего состояния изменяется на слово оперативного состояния.
  94.                 if (tempBinValue.contains("1"))
  95.                     previousConditionParts[iteration] = operationalConditionParts[iteration];
  96.                 // Умножение на слово предыдущего состояния для выявления освободившихся портов.
  97.                 tempBinValueForPorts = Integer.toBinaryString(temp & previousConditionParts[iteration]);
  98.                 if (tempBinValueForPorts.length() <= 8) {
  99.                     for (int i = 0; i < 8 - tempBinValueForPorts.length(); i++)
  100.                         freePortsSB.append("0");
  101.                     freePortsSB.append(tempBinValueForPorts);
  102.                 }
  103.             }
  104.         }
  105.         // Цикл, который выискивает единицу в строке и записывает номер порта, на котором произошло изменение, в
  106.         // список changedPorts.
  107.         for (int i = 0; i < changesBinValue.length(); i++) {
  108.             if (changesBinValue.charAt(i) == '1') {
  109.                 changedPorts.add(portNumber);
  110.             }
  111.             portNumber--;
  112.         }
  113.  
  114.         portNumber = 31;
  115.  
  116.         // Цикл, который выискивает единицу в строке и записывает номер освободившегося порта в
  117.         // список freePorts.
  118.         for (int i = 0; i < freePortsSB.length(); i++) {
  119.             if (freePortsSB.charAt(i) == '1') {
  120.                 freePorts.add(portNumber);
  121.             }
  122.             portNumber--;
  123.         }
  124.         // Если список не пуст,
  125.         if (!changedPorts.isEmpty()) {
  126.             // то выводим на экран номера портов, содержащиеся в списке,
  127.             System.out.print("Изменения произошли на портах: ");
  128.             for (int port : changedPorts)
  129.                 System.out.print(port + " ");
  130.             // иначе изменений не произошло и список пуст.
  131.         } else {
  132.             System.out.println("Изменений не произошло.");
  133.         }
  134.         System.out.println();
  135.         // Если список не пуст,
  136.         if (!freePorts.isEmpty()) {
  137.             // то выводим на экран номера портов, содержащиеся в списке,
  138.             System.out.print("Освободившиеся порты: ");
  139.             for (int port : freePorts)
  140.                 System.out.print(port + " ");
  141.             // иначе изменений не произошло и список пуст.
  142.         } else {
  143.             System.out.println("Изменений не произошло.");
  144.         }
  145.         System.out.println();
  146.        
  147.         // Изменение строки предыдущего состояния на новую.
  148.         StringBuilder newPreviousCondition = new StringBuilder();
  149.         for (int number : previousConditionParts) {
  150.             String tmp = Integer.toBinaryString(number);
  151.             if (tmp.length() <= 8) {
  152.                 for (int i = 0; i < 8 - tmp.length(); i++)
  153.                     freePortsSB.append("0");
  154.                 newPreviousCondition.append(tmp);
  155.                 newPreviousCondition.append(" ");
  156.             }
  157.         }
  158.         System.out.println();
  159.         System.out.println("Новая строка предыдущего состояния: " + newPreviousCondition.toString());
  160.     }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment