diff --git a/students/23K0505/23K0505-p21/pom.xml b/students/23K0505/23K0505-p21/pom.xml new file mode 100644 index 000000000..ff9484dc8 --- /dev/null +++ b/students/23K0505/23K0505-p21/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p21 + Лабораторная 21 + diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..c5f90e375 --- /dev/null +++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать первая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java new file mode 100644 index 000000000..fd9e4d7df --- /dev/null +++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java @@ -0,0 +1,22 @@ +package ru.mirea.practice.s23k0505.task1; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Main { + public static List arrToList(T[] array) { + List list = new ArrayList<>(array.length); + for (T e : array) { + list.add(e); + } + return list; + } + + public static void main(String[] args) { + Integer[] arr = {1, 2, 3, 4, 5}; + List list = arrToList(arr); + System.out.println(list); + + Integer[] arr1 = new Integer[10]; + } +} diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Array.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Array.java new file mode 100644 index 000000000..1b91bd415 --- /dev/null +++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Array.java @@ -0,0 +1,26 @@ +package ru.mirea.practice.s23k0505.task2; + +import java.util.Arrays; + +public class Array { + private final T[] array; + private final int length; + + Array(T[] array) { + this.array = array; + this.length = array.length; + } + + public T get(int index) { + return array[index]; + } + + public int getLength() { + return length; + } + + @Override + public String toString() { + return Arrays.toString(array); + } +} diff --git a/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java new file mode 100644 index 000000000..86e38ebbf --- /dev/null +++ b/students/23K0505/23K0505-p21/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java @@ -0,0 +1,9 @@ +package ru.mirea.practice.s23k0505.task2; + +public abstract class Main { + public static void main(String[] args) { + Integer[] arr = {5, 4, 3, 2, 1}; + Array array = new Array<>(arr); + System.out.println(array); + } +} diff --git a/students/23K0505/23K0505-p22/pom.xml b/students/23K0505/23K0505-p22/pom.xml new file mode 100644 index 000000000..8d427e434 --- /dev/null +++ b/students/23K0505/23K0505-p22/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p22 + Лабораторная 22 + diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..c5f90e375 --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать первая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Calculator.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Calculator.java new file mode 100644 index 000000000..0953b67a4 --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Calculator.java @@ -0,0 +1,51 @@ +package ru.mirea.practice.s23k0505.task1; + +import ru.mirea.practice.s23k0505.task1.utilclasses.Number; +import ru.mirea.practice.s23k0505.task1.utilclasses.Operation; + +import java.util.Stack; + +public class Calculator { + private final Stack stack; + + public Calculator() { + this.stack = new Stack<>(); + } + + public void clear() { + stack.clear(); + } + + public void addNumber(Number number) { + stack.push(number); + } + + public void addOperation(Operation operation) { + stack.push(operation); + } + + public Stack getStack() { + return stack; + } + + public Number compute() { + Number result = new Number(); + Number b; + Number a; + ComputingElement popped = stack.pop(); + if (popped instanceof Operation) { + b = compute(); + a = compute(); + result = ((Operation) popped).compute(a, b); + } else if (popped instanceof Number) { + result = (Number) popped; + } + + return result; + } + + @Override + public String toString() { + return stack.toString(); + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/CalculatorController.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/CalculatorController.java new file mode 100644 index 000000000..4a39f0324 --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/CalculatorController.java @@ -0,0 +1,90 @@ +package ru.mirea.practice.s23k0505.task1; + +import ru.mirea.practice.s23k0505.task1.utilclasses.Number; +import ru.mirea.practice.s23k0505.task1.utilclasses.Operation; +import ru.mirea.practice.s23k0505.task1.utilclasses.OperationType; + +import java.util.LinkedList; +import java.util.List; + +public class CalculatorController { + private final Calculator calculator; + private final List fakeStack; + private int numbersCount; + private int operationCount; + + public CalculatorController() { + this.calculator = new Calculator(); + fakeStack = new LinkedList<>(); + numbersCount = 0; + operationCount = 0; + } + + public void addNumber(double number) { + fakeStack.add(new Number(number)); + numbersCount += 1; + } + + public void addOperation(OperationType operationType) { + if (operationCount < numbersCount - 1) { + fakeStack.add(new Operation(operationType)); + operationCount += 1; + } + } + + public void clear() { + fakeStack.clear(); + } + + public ComputingElement delete() { + ComputingElement element = null; + if (!fakeStack.isEmpty()) { + element = fakeStack.remove(fakeStack.size() - 1); + if (element instanceof Number) { + numbersCount -= 1; + } else { + operationCount -= 1; + } + } + return element; + } + + public double compute() { + toRealStack(); + fakeStack.clear(); + final Number result = calculator.compute(); + fakeStack.addAll(calculator.getStack()); + calculator.clear(); + numbersCount -= operationCount + 1; + operationCount = 0; + return result.getValue(); + } + + public int getStackSize() { + return fakeStack.size(); + } + + private void toRealStack() { + for (ComputingElement element : fakeStack) { + if (element instanceof Number) { + calculator.addNumber((Number) element); + } else if (element instanceof Operation) { + calculator.addOperation((Operation) element); + } + } + } + + @Override + public String toString() { + StringBuilder fakeStackStr = new StringBuilder(); + for (ComputingElement element : fakeStack) { + fakeStackStr.append(element.toString()); + fakeStackStr.append(" "); + } + return fakeStackStr.toString(); + } + + public String printStack() { + return String.format("Numbers: %d, Operations: %d", numbersCount, operationCount); + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/ComputingElement.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/ComputingElement.java new file mode 100644 index 000000000..a2918cc4e --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/ComputingElement.java @@ -0,0 +1,4 @@ +package ru.mirea.practice.s23k0505.task1; + +public interface ComputingElement { +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java new file mode 100644 index 000000000..ea9674d0b --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java @@ -0,0 +1,34 @@ +package ru.mirea.practice.s23k0505.task1; + +import ru.mirea.practice.s23k0505.task1.utilclasses.OperationType; + +public abstract class Main { + public static void main(String[] args) { + CalculatorController calculator = new CalculatorController(); + calculator.addNumber(100); + calculator.addNumber(2); + calculator.addNumber(3); + calculator.addNumber(4); + calculator.addNumber(5); + calculator.addNumber(6); + calculator.addOperation(OperationType.MULTIPLY); + calculator.addOperation(OperationType.ADD); + calculator.addOperation(OperationType.SUBTRACT); + calculator.addOperation(OperationType.DIVIDE); + System.out.println(calculator); + System.out.println(calculator.compute()); + System.out.println(calculator); + calculator.addOperation(OperationType.DIVIDE); + System.out.println(calculator); + System.out.println(calculator.compute()); + System.out.println(calculator); + System.out.println(calculator.compute()); + System.out.println(calculator); + System.out.println(calculator.compute()); + System.out.println(calculator); + System.out.println(calculator.compute()); + System.out.println(calculator); + System.out.println(calculator.compute()); + System.out.println(calculator); + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Number.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Number.java new file mode 100644 index 000000000..00bf43109 --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Number.java @@ -0,0 +1,28 @@ +package ru.mirea.practice.s23k0505.task1.utilclasses; + +import ru.mirea.practice.s23k0505.task1.ComputingElement; + +public class Number implements ComputingElement { + private double value; + + public Number() { + // Default constructor + } + + public Number(double value) { + this.value = value; + } + + public double getValue() { + return value; + } + + public void setValue(double value) { + this.value = value; + } + + @Override + public String toString() { + return Double.toString(value); + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Operation.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Operation.java new file mode 100644 index 000000000..ea6d80973 --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/Operation.java @@ -0,0 +1,61 @@ +package ru.mirea.practice.s23k0505.task1.utilclasses; + +import ru.mirea.practice.s23k0505.task1.ComputingElement; + +public class Operation implements ComputingElement { + + private final OperationType operation; + + public Operation(OperationType operation) { + this.operation = operation; + } + + public OperationType getOperation() { + return operation; + } + + public Number compute(Number numA, Number numB) { + double result = 0; + double a = numA.getValue(); + double b = numB.getValue(); + switch (operation) { + case ADD: + result = a + b; + break; + case SUBTRACT: + result = a - b; + break; + case MULTIPLY: + result = a * b; + break; + case DIVIDE: + result = a / b; + break; + default: + break; + } + return new Number(result); + } + + @Override + public String toString() { + String strOp = ""; + switch (operation) { + case ADD: + strOp = "+"; + break; + case SUBTRACT: + strOp = "-"; + break; + case MULTIPLY: + strOp = "*"; + break; + case DIVIDE: + strOp = "/"; + break; + default: + break; + } + return strOp; + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/OperationType.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/OperationType.java new file mode 100644 index 000000000..55d01111a --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task1/utilclasses/OperationType.java @@ -0,0 +1,8 @@ +package ru.mirea.practice.s23k0505.task1.utilclasses; + +public enum OperationType { + ADD, + SUBTRACT, + MULTIPLY, + DIVIDE +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/CalculatorFrame.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/CalculatorFrame.java new file mode 100644 index 000000000..2af94e64a --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/CalculatorFrame.java @@ -0,0 +1,153 @@ +package ru.mirea.practice.s23k0505.task2; + +import ru.mirea.practice.s23k0505.task1.CalculatorController; +import ru.mirea.practice.s23k0505.task1.ComputingElement; +import ru.mirea.practice.s23k0505.task1.utilclasses.Number; +import ru.mirea.practice.s23k0505.task1.utilclasses.OperationType; + +import javax.swing.JFrame; +import javax.swing.JButton; +import javax.swing.JTextField; +import javax.swing.JPanel; +import javax.swing.JLabel; +import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class CalculatorFrame extends JFrame { + private final Map buttons = new HashMap<>(12); + private final CalculatorController controller; + private String cachedNumber; + private JTextField inputTextField; + + CalculatorFrame() { + controller = new CalculatorController(); + cachedNumber = ""; + initComponents(); + pack(); + setDefaultCloseOperation(EXIT_ON_CLOSE); + } + + private void initComponents() { + String[] buttonNames = {"*", "/", "Backspace", "+", "-", "Clear", "7", "8", "9", "4", "5", "6", + "1", "2", "3", "0", ".", "Enter"}; + + for (String name : buttonNames) { + buttons.put(name, new JButton(name)); + buttons.get(name).addActionListener(new ButtonActionListener()); + + } + + setLayout(new GridLayout(2, 1, 1, 20)); + inputTextField = new JTextField(20); + inputTextField.setText(""); + inputTextField.setFont(new Font("Calibri", Font.PLAIN, 30)); + inputTextField.setEditable(false); + add(inputTextField); + + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setLayout(new GridLayout(7, 3, 2, 2)); + for (String name : buttonNames) { + buttonsPanel.add(buttons.get(name)); + } + + buttons.put("=", new JButton("=")); + buttons.get("=").addActionListener(new ButtonActionListener()); + + buttonsPanel.add(new JLabel()); + buttonsPanel.add(buttons.get("=")); + buttonsPanel.add(new JLabel()); + + add(buttonsPanel); + } + + private void performButtonAction(String actionName) { + switch (actionName) { + case "backspace": + delete(); + break; + case "clear": + clear(); + clearCache(); + break; + case "+": + addCached(); + controller.addOperation(OperationType.ADD); + break; + case "*": + addCached(); + controller.addOperation(OperationType.MULTIPLY); + break; + case "-": + addCached(); + controller.addOperation(OperationType.SUBTRACT); + break; + case "/": + addCached(); + controller.addOperation(OperationType.DIVIDE); + break; + case "=": + if (controller.getStackSize() > 0) { + controller.addNumber(controller.compute()); + } + break; + case ".": + if (!cachedNumber.contains(".")) { + cachedNumber = cachedNumber.concat(actionName); + } + break; + case "enter": + if (!cachedNumber.isEmpty()) { + addCached(); + } + break; + default: + cachedNumber = cachedNumber.concat(actionName); + break; + } + inputTextField.setText(controller.toString() + cachedNumber); + } + + private void addCached() { + double cachedNumberDouble; + try { + cachedNumberDouble = Double.parseDouble(String.valueOf(cachedNumber)); + controller.addNumber(cachedNumberDouble); + clearCache(); + } catch (NumberFormatException ignored) { + System.out.println(); + } + } + + private void clearCache() { + cachedNumber = ""; + } + + private void delete() { + if (!String.valueOf(cachedNumber).isEmpty()) { + cachedNumber = cachedNumber.substring(0, cachedNumber.length() - 1); + } else { + ComputingElement element = controller.delete(); + if (element instanceof Number) { + cachedNumber = Double.toString(((Number) element).getValue()); + cachedNumber = cachedNumber.substring(0, cachedNumber.length() - 1); + } + } + } + + private void clear() { + controller.clear(); + } + + class ButtonActionListener implements java.awt.event.ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + JButton button = (JButton) e.getSource(); + String name = button.getText(); + performButtonAction(name.toLowerCase(Locale.US)); + } + } +} diff --git a/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java new file mode 100644 index 000000000..48fadaae1 --- /dev/null +++ b/students/23K0505/23K0505-p22/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java @@ -0,0 +1,8 @@ +package ru.mirea.practice.s23k0505.task2; + +public abstract class Main { + public static void main(String[] args) { + CalculatorFrame frame = new CalculatorFrame(); + frame.setVisible(true); + } +} diff --git a/students/23K0505/23K0505-p23/pom.xml b/students/23K0505/23K0505-p23/pom.xml new file mode 100644 index 000000000..76f875c86 --- /dev/null +++ b/students/23K0505/23K0505-p23/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p23 + Лабораторная 23 + diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..e3a7bcbcc --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать третья практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueue.java new file mode 100644 index 000000000..1461e822c --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueue.java @@ -0,0 +1,107 @@ +package ru.mirea.practice.s23k0505.task1; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class ArrayQueue implements ArrayQueueAdt { + private final int size; + private final List array; + private int indexFront; + private int indexRear; + + ArrayQueue(Collection collection) { + array = new ArrayList<>(collection); + this.size = collection.size(); + indexFront = 0; + indexRear = this.size - 1; + } + + ArrayQueue(int size) { + array = new ArrayList<>(); + for (int i = 0; i < size; i++) { + array.add(i, null); + } + indexFront = 0; + indexRear = -1; + this.size = size; + } + + @Override + public void enqueue(T element) { + indexRear += 1; + if (indexRear == size) { + indexRear = 0; + } + array.set(indexRear, element); + } + + @Override + public T dequeue() { + T element; + if (isEmpty()) { + element = null; + } else { + element = array.get(indexFront); + if (indexRear == indexFront) { + indexRear -= 1; + } + if (indexRear == -1) { + indexRear = size - 1; + } + indexFront += 1; + if (indexFront == size) { + indexFront = 0; + } + } + return element; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return indexRear == -1; + } + + @Override + public void clear() { + array.clear(); + } + + @Override + public T front() { + return array.get(0); + } + + @Override + public T rear() { + return array.get(indexRear); + } + + @Override + public String toString() { + ArrayList tempList = new ArrayList<>(size); + if (indexRear == -1) { + return "[]"; + } else if (indexFront < indexRear) { + for (int i = indexFront; i < indexRear + 1; i++) { + tempList.add(array.get(i)); + } + } else { + for (int i = indexFront; i < size; i++) { + tempList.add(array.get(i)); + } + for (int i = 0; i < indexRear + 1; i++) { + if (i == indexFront) { + break; + } + tempList.add(array.get(i)); + } + } + return tempList.toString(); + } +} diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueAdt.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueAdt.java new file mode 100644 index 000000000..bb72727b5 --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueAdt.java @@ -0,0 +1,17 @@ +package ru.mirea.practice.s23k0505.task1; + +public interface ArrayQueueAdt { + void enqueue(T element); + + T dequeue(); + + int size(); + + boolean isEmpty(); + + void clear(); + + T front(); + + T rear(); +} diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueTest.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueTest.java new file mode 100644 index 000000000..fcd7ae203 --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task1/ArrayQueueTest.java @@ -0,0 +1,27 @@ +package ru.mirea.practice.s23k0505.task1; + +public abstract class ArrayQueueTest { + public static void main(String[] args) { + ArrayQueue queue = new ArrayQueue<>(5); + queue.enqueue(1); + queue.enqueue(2); + queue.enqueue(3); + queue.enqueue(4); + queue.enqueue(5); + System.out.println(queue); + queue.enqueue(8); + System.out.println(queue); + queue.dequeue(); + queue.dequeue(); + queue.dequeue(); + System.out.println(queue); + queue.enqueue(3); + System.out.println(queue); + queue.enqueue(2); + System.out.println(queue); + queue.enqueue(1); + System.out.println(queue); + queue.dequeue(); + System.out.println(queue); + } +} diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractQueue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractQueue.java new file mode 100644 index 000000000..d6dbdce41 --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractQueue.java @@ -0,0 +1,29 @@ +package ru.mirea.practice.s23k0505.task2; + +import java.util.AbstractList; + +public abstract class AbstractQueue implements Queue { + private int size; + private AbstractList list; + + @Override + public abstract void enqueue(T element); + + @Override + public abstract T dequeue(); + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public void clear() { + list.clear(); + } +} diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/LinkedQueue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/LinkedQueue.java new file mode 100644 index 000000000..760cb878d --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/LinkedQueue.java @@ -0,0 +1,49 @@ +package ru.mirea.practice.s23k0505.task2; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +public class LinkedQueue implements Queue { + private final List linkedList; + private int size; + + LinkedQueue(Collection collection) { + linkedList = new LinkedList<>(collection); + this.size = collection.size(); + } + + LinkedQueue() { + linkedList = new LinkedList<>(); + this.size = 0; + } + + @Override + public void enqueue(T element) { + linkedList.add(size - 1, element); + size += 1; + } + + @Override + public T dequeue() { + T element = linkedList.get(0); + linkedList.remove(0); + size -= 1; + return element; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return linkedList.isEmpty(); + } + + @Override + public void clear() { + linkedList.clear(); + } +} diff --git a/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/Queue.java b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/Queue.java new file mode 100644 index 000000000..3c234101e --- /dev/null +++ b/students/23K0505/23K0505-p23/src/main/java/ru/mirea/practice/s23k0505/task2/Queue.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s23k0505.task2; + +public interface Queue { + void enqueue(T element); + + T dequeue(); + + int size(); + + boolean isEmpty(); + + void clear(); +} diff --git a/students/23K0505/23K0505-p24/pom.xml b/students/23K0505/23K0505-p24/pom.xml new file mode 100644 index 000000000..9bc6c89e6 --- /dev/null +++ b/students/23K0505/23K0505-p24/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p24 + Лабораторная 24 + diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..f8a451311 --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать четвёртая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/Complex.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/Complex.java new file mode 100644 index 000000000..092ecdadc --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/Complex.java @@ -0,0 +1,44 @@ +package ru.mirea.practice.s23k0505.task1; + + +public class Complex { + private double real; + private double imag; + + public Complex(double real, double imag) { + this.real = real; + this.imag = imag; + } + + public Complex() { + this.real = 0; + this.imag = 0; + } + + public double getReal() { + return real; + } + + public void setReal(double real) { + this.real = real; + } + + public double getImag() { + return imag; + } + + public void setImag(double imag) { + this.imag = imag; + } + + @Override + public String toString() { + String complexString; + if (imag >= 0) { + complexString = String.format("%f + %fi", real, imag); + } else { + complexString = String.format("%f - %fi", real, Math.abs(imag)); + } + return complexString; + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexAbstractFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexAbstractFactory.java new file mode 100644 index 000000000..2fb45f985 --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexAbstractFactory.java @@ -0,0 +1,7 @@ +package ru.mirea.practice.s23k0505.task1; + +public interface ComplexAbstractFactory { + Complex createComplex(); + + Complex createComplex(int real, int imag); +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexFactory.java new file mode 100644 index 000000000..0a3b23cf2 --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task1/ComplexFactory.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s23k0505.task1; + +public class ComplexFactory implements ComplexAbstractFactory { + @Override + public Complex createComplex() { + return new Complex(); + } + + @Override + public Complex createComplex(int real, int imag) { + return new Complex(real, imag); + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractChairFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractChairFactory.java new file mode 100644 index 000000000..2df111616 --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/AbstractChairFactory.java @@ -0,0 +1,9 @@ +package ru.mirea.practice.s23k0505.task2; + +public abstract class AbstractChairFactory { + abstract VictorianChair createVictorianChair(int age); + + abstract MagicChair createMagicChair(); + + abstract FunctionalChair createFunctionalChair(); +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Chair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Chair.java new file mode 100644 index 000000000..eeb4f7072 --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Chair.java @@ -0,0 +1,5 @@ +package ru.mirea.practice.s23k0505.task2; + +public interface Chair { + +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/ChairFactory.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/ChairFactory.java new file mode 100644 index 000000000..56f253c74 --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/ChairFactory.java @@ -0,0 +1,19 @@ +package ru.mirea.practice.s23k0505.task2; + +public class ChairFactory extends AbstractChairFactory { + + @Override + VictorianChair createVictorianChair(int age) { + return new VictorianChair(age); + } + + @Override + MagicChair createMagicChair() { + return new MagicChair(); + } + + @Override + FunctionalChair createFunctionalChair() { + return new FunctionalChair(); + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Client.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Client.java new file mode 100644 index 000000000..dc00e990b --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/Client.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s23k0505.task2; + +public class Client { + private Chair chair; + + public void sit() { + System.out.printf("The client sat on a %s", chair); + } + + public void setChair(Chair chair) { + this.chair = chair; + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/FunctionalChair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/FunctionalChair.java new file mode 100644 index 000000000..0900c533a --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/FunctionalChair.java @@ -0,0 +1,8 @@ +package ru.mirea.practice.s23k0505.task2; + +public class FunctionalChair { + + public int sum(int a, int b) { + return a + b; + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/MagicChair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/MagicChair.java new file mode 100644 index 000000000..d96d2b2af --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/MagicChair.java @@ -0,0 +1,8 @@ +package ru.mirea.practice.s23k0505.task2; + +public class MagicChair { + + void doMagic() { + System.out.println("Abracadabra!"); + } +} diff --git a/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/VictorianChair.java b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/VictorianChair.java new file mode 100644 index 000000000..2eb4e17da --- /dev/null +++ b/students/23K0505/23K0505-p24/src/main/java/ru/mirea/practice/s23k0505/task2/VictorianChair.java @@ -0,0 +1,13 @@ +package ru.mirea.practice.s23k0505.task2; + +public class VictorianChair implements Chair { + private final int age; + + public VictorianChair(int age) { + this.age = age; + } + + public int getAge() { + return age; + } +} diff --git a/students/23K0505/23K0505-p25/pom.xml b/students/23K0505/23K0505-p25/pom.xml new file mode 100644 index 000000000..e7aa0c92d --- /dev/null +++ b/students/23K0505/23K0505-p25/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p25 + Лабораторная 25 + diff --git a/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..8ec19ca3d --- /dev/null +++ b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать пятая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task4/Main.java b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task4/Main.java new file mode 100644 index 000000000..043e2e4d0 --- /dev/null +++ b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task4/Main.java @@ -0,0 +1,17 @@ +package ru.mirea.practice.s23k0505.task4; + +import java.util.Scanner; +import java.util.regex.Pattern; + +public abstract class Main { + public static void main(String[] args) { + Pattern pattern = Pattern.compile("([a-zA-Z.\\d])+@(([a-z]+\\.[a-z]+)|[a-z]+)"); + String input; + try (Scanner scanner = new Scanner(System.in)) { + input = scanner.nextLine(); + } + if (pattern.matcher(input).matches()) { + System.out.println("Input string is a valid email address"); + } + } +} diff --git a/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task5/Main.java b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task5/Main.java new file mode 100644 index 000000000..43d3878f5 --- /dev/null +++ b/students/23K0505/23K0505-p25/src/main/java/ru/mirea/practice/s23k0505/task5/Main.java @@ -0,0 +1,17 @@ +package ru.mirea.practice.s23k0505.task5; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public abstract class Main { + public static void main(String[] args) { + String text = "Цены: 25.98 USD, 44 ERR, 0.004 EU, 10.00 RUB, 99.95 EUR"; + Pattern pattern = Pattern.compile("\\b\\d{1,3}(\\.\\d{1,2})? (USD|RUB|EUR)\\b"); + Matcher matcher = pattern.matcher(text); + + System.out.println("Цены в USD, RUB, EUR:"); + while (matcher.find()) { + System.out.println(matcher.group()); + } + } +} diff --git a/students/23K0505/23K0505-p26/pom.xml b/students/23K0505/23K0505-p26/pom.xml new file mode 100644 index 000000000..efdade08b --- /dev/null +++ b/students/23K0505/23K0505-p26/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p26 + Лабораторная 26 + diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..4069cf458 --- /dev/null +++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать шестая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java new file mode 100644 index 000000000..d38dda83f --- /dev/null +++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java @@ -0,0 +1,27 @@ +package ru.mirea.practice.s23k0505.task1; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public abstract class Main { + public static List reverse(List list) { + Stack stack = new Stack<>(); + int i = 0; + while (i < list.size() / 2) { + stack.push(list.get(i)); + stack.push(list.get(list.size() - i - 1)); + list.set(i, stack.pop()); + list.set(list.size() - i - 1, stack.pop()); + i++; + } + return list; + } + + public static void main(String[] args) { + ArrayList integers = new ArrayList<>(List.of(new Integer[]{1, 2, 3, 4, 5, 6})); + System.out.println(integers); + reverse(integers); + System.out.println(integers); + } +} diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomIterator.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomIterator.java new file mode 100644 index 000000000..9c8274aa6 --- /dev/null +++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomIterator.java @@ -0,0 +1,20 @@ +package ru.mirea.practice.s23k0505.task2; + +import java.util.Iterator; + +public class CustomIterator implements Iterator { + Node cursor; + + CustomIterator(CustomList list) { + cursor = list.getFirst(); + } + + public boolean hasNext() { + return cursor.getNext() != null; + } + + public T next() { + cursor = cursor.getNext(); + return cursor.getData(); + } +} diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomList.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomList.java new file mode 100644 index 000000000..04667df3f --- /dev/null +++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/CustomList.java @@ -0,0 +1,39 @@ +package ru.mirea.practice.s23k0505.task2; + +import java.util.Iterator; + +public class CustomList implements Iterable { + private Node first; + private final int size; + + public CustomList() { + first = null; + size = 0; + } + + public int getSize() { + return size; + } + + public Node getFirst() { + return first; + } + + public void add(T elem) { + Node node = new Node<>(elem); + if (first == null) { + first = node; + } else { + Node curr = first; + while (curr.getNext() != null) { + curr = curr.getNext(); + } + curr.setNext(node); + } + } + + @Override + public Iterator iterator() { + return new CustomIterator<>(this); + } +} diff --git a/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/Node.java b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/Node.java new file mode 100644 index 000000000..712e4962c --- /dev/null +++ b/students/23K0505/23K0505-p26/src/main/java/ru/mirea/practice/s23k0505/task2/Node.java @@ -0,0 +1,32 @@ +package ru.mirea.practice.s23k0505.task2; + +public class Node { + private T data; + private Node next; + + public Node(T data) { + this.data = data; + next = null; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + + @Override + public String toString() { + return data.toString(); + } +} diff --git a/students/23K0505/23K0505-p27/pom.xml b/students/23K0505/23K0505-p27/pom.xml new file mode 100644 index 000000000..0904ff5be --- /dev/null +++ b/students/23K0505/23K0505-p27/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p27 + Лабораторная 27 + diff --git a/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..81c676d63 --- /dev/null +++ b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать седьмая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Hashtable.java b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Hashtable.java new file mode 100644 index 000000000..6d9a9406c --- /dev/null +++ b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Hashtable.java @@ -0,0 +1,70 @@ +package ru.mirea.practice.s23k0505.task1; + +import java.util.LinkedList; + +class Hashtable { + private static class KeyValue { + String key; + String value; + + KeyValue(String key, String value) { + this.key = key; + this.value = value; + } + } + + private LinkedList[] table; + private int size; + + @SuppressWarnings("unchecked") + public Hashtable(int size) { + this.size = size; + table = new LinkedList[size]; + for (int i = 0; i < size; i++) { + table[i] = new LinkedList<>(); + } + } + + private int hash(String key) { + return Math.abs(key.hashCode() % size); + } + + public void add(String key, String value) { + int index = hash(key); + for (KeyValue kv : table[index]) { + if (kv.key.equals(key)) { + kv.value = value; + return; + } + } + table[index].add(new KeyValue(key, value)); + } + + public String lookup(String key) { + int index = hash(key); + for (KeyValue kv : table[index]) { + if (kv.key.equals(key)) { + return kv.value; + } + } + return null; + } + + public void delete(String key) { + int index = hash(key); + table[index].removeIf(kv -> kv.key.equals(key)); + } + + public void printTable() { + for (int i = 0; i < size; i++) { + if (!table[i].isEmpty()) { + System.out.print("Bucket " + i + ": "); + for (KeyValue kv : table[i]) { + System.out.print("[" + kv.key + ": " + kv.value + "] "); + } + System.out.println(); + } + } + } +} + diff --git a/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java new file mode 100644 index 000000000..2c290f015 --- /dev/null +++ b/students/23K0505/23K0505-p27/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java @@ -0,0 +1,31 @@ +package ru.mirea.practice.s23k0505.task1; + +public abstract class Test { + public static void main(String[] args) { + Hashtable hashTable = new Hashtable(10); + + hashTable.add("key1", "value1"); + hashTable.add("key2", "value2"); + hashTable.add("key3", "value3"); + hashTable.add("key4", "value4"); + hashTable.add("key5", "value5"); + hashTable.add("key6", "value6"); + hashTable.add("key7", "value7"); + hashTable.add("key8", "value8"); + hashTable.add("key9", "value9"); + hashTable.add("key10", "value10"); + + System.out.println("Содержимое хеш-таблицы:"); + hashTable.printTable(); + + String value = hashTable.lookup("key5"); + System.out.println("Поиск key5: " + (value != null ? value : "not found")); + + hashTable.delete("key5"); + System.out.println("После удаления key5:"); + hashTable.printTable(); + + value = hashTable.lookup("key5"); + System.out.println("Поиск key5 после удаления: " + (value != null ? value : "not found")); + } +} diff --git a/students/23K0505/23K0505-p28/pom.xml b/students/23K0505/23K0505-p28/pom.xml new file mode 100644 index 000000000..d6be8943e --- /dev/null +++ b/students/23K0505/23K0505-p28/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p28 + Лабораторная 28 + diff --git a/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..81c676d63 --- /dev/null +++ b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать седьмая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java new file mode 100644 index 000000000..5742d1af7 --- /dev/null +++ b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java @@ -0,0 +1,18 @@ +package ru.mirea.practice.s23k0505.task1; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +public abstract class Main { + public static void main(String[] args) { + Map hashmap = new HashMap<>(); + hashmap.put(1, 2005); + hashmap.put(2, 2012); + hashmap.put(3, 2023); + hashmap.put(4, 2027); + Map treemap = new TreeMap<>(hashmap); + System.out.println(hashmap); + System.out.println(treemap); + } +} diff --git a/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java new file mode 100644 index 000000000..45c842f5f --- /dev/null +++ b/students/23K0505/23K0505-p28/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java @@ -0,0 +1,57 @@ +package ru.mirea.practice.s23k0505.task2; + + +import java.util.HashMap; +import java.util.Map; + +public abstract class Main { + + public static Map createMap() { + Map map = new HashMap<>(); + map.put("Кузнецов", "Алексей"); + map.put("Сидорова", "Мария"); + map.put("Петров", "Иван"); + map.put("Кузнецова", "Анна"); + map.put("Иванов", "Дмитрий"); + map.put("Петрова", "Мария"); + map.put("Смирнов", "Алексей"); + map.put("Иванова", "Елена"); + map.put("Смирнов", "Иван"); + map.put("Иванова", "Мария"); + return map; + } + + public static int getSameFirstNameCount(Map map) { + Map nameMap = new HashMap<>(); + for (String value : map.values()) { + if (nameMap.containsKey(value)) { + nameMap.put(value, nameMap.get(value) + 1); + } else { + nameMap.put(value, 1); + } + } + + int count = 0; + int nameCount; + for (String name : nameMap.keySet()) { + nameCount = nameMap.get(name); + if (nameCount > 1) { + count += nameCount; + } + } + + return count; + } + + public static int getSameLastNameCount(Map map) { + return 0; + // Данный по условию тип данных Map не позволяет + // содержать ключи с одинаковыми значениями + } + + public static void main(String[] args) { + Map map = createMap(); + System.out.println(getSameFirstNameCount(map)); + System.out.println(getSameLastNameCount(map)); + } +} diff --git a/students/23K0505/23K0505-p29/pom.xml b/students/23K0505/23K0505-p29/pom.xml new file mode 100644 index 000000000..7b7342977 --- /dev/null +++ b/students/23K0505/23K0505-p29/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p29 + Лабораторная 29 + diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..e0ee11bc9 --- /dev/null +++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Двадцать девятая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java new file mode 100644 index 000000000..f68f69a11 --- /dev/null +++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task1/Main.java @@ -0,0 +1,35 @@ +package ru.mirea.practice.s23k0505.task1; + + +import java.util.Scanner; + +public abstract class Main { + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + int n = scanner.nextInt(); + if (n == 0) { + System.out.println(0); + return; + } + + int[][] adjacencyMatrix = new int[n][n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + adjacencyMatrix[i][j] = scanner.nextInt(); + } + } + + int roadCount = 0; + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + roadCount += adjacencyMatrix[i][j]; + } + } + + System.out.println(roadCount); + + } catch (RuntimeException e) { + throw new RuntimeException(e); + } + } +} diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java new file mode 100644 index 000000000..a495809ac --- /dev/null +++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/Main.java @@ -0,0 +1,48 @@ +package ru.mirea.practice.s23k0505.task2; + + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.util.Scanner; + +public abstract class Main { + public static void main(String[] args) throws FileNotFoundException { + int[][] graph; + int n; + try (Scanner scanner = new Scanner(new File("students/23K0120/23K0120-p29/src/main/java/ru/mirea/practice/s23k0120/task2/graph.txt"))) { + n = scanner.nextInt(); + graph = new int[n][n]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + graph[i][j] = scanner.nextInt(); + if (graph[i][j] == 0 && i != j) { + graph[i][j] = Integer.MAX_VALUE / 2; + } + } + } + } + + for (int k = 0; k < n; k++) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]); + } + } + } + + try (PrintWriter writer = new PrintWriter(new File("students/23K0120/23K0120-p29/src/" + + "main/java/ru/mirea/practice/s23k0120/task2/graphShortest.txt"))) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (graph[i][j] == Integer.MAX_VALUE / 2) { + writer.print(0 + " "); + } else { + writer.print(graph[i][j] + " "); + } + } + writer.println(); + } + } + } +} diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graph.txt b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graph.txt new file mode 100644 index 000000000..1795f843e --- /dev/null +++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graph.txt @@ -0,0 +1,7 @@ +6 +0 7 9 0 0 14 +7 0 10 15 0 0 +9 10 0 11 0 2 +0 15 11 0 6 0 +0 0 0 6 0 9 +14 0 2 0 9 0 diff --git a/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graphShortest.txt b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graphShortest.txt new file mode 100644 index 000000000..59372392a --- /dev/null +++ b/students/23K0505/23K0505-p29/src/main/java/ru/mirea/practice/s23k0505/task2/graphShortest.txt @@ -0,0 +1,6 @@ +0 7 9 20 20 11 +7 0 10 15 21 12 +9 10 0 11 11 2 +20 15 11 0 6 13 +20 21 11 6 0 9 +11 12 2 13 9 0 diff --git a/students/23K0505/23K0505-p30/pom.xml b/students/23K0505/23K0505-p30/pom.xml new file mode 100644 index 000000000..11d3b5c30 --- /dev/null +++ b/students/23K0505/23K0505-p30/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p30 + Лабораторная 30 + diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..6024cb79f --- /dev/null +++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Тридцатая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree.java new file mode 100644 index 000000000..f3f9fafe8 --- /dev/null +++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree.java @@ -0,0 +1,173 @@ +package ru.mirea.practice.s23k0505.task1; + +public class BinaryTree { + private E data; + private BinaryTree left; + private BinaryTree right; + + public BinaryTree() { + left = null; + right = null; + data = null; + } + + public BinaryTree(E data) { + left = null; + right = null; + this.data = data; + } + + public static int height(BinaryTree tree) { + int h1 = 0; + int h2 = 0; + if (tree == null) { + return 0; + } + if (tree.getLeft() != null) { + h1 = height(tree.getLeft()); + } + if (tree.getRight() != null) { + h2 = height(tree.getRight()); + } + return Math.max(h1, h2) + 1; + } + + public int height() { + return height(this); + } + + public static void reverse(BinaryTree tree) { + BinaryTree treeTemp; + if (tree != null) { + if (tree.getRight() != null && tree.getLeft() != null) { + treeTemp = tree.getLeft(); + tree.setLeft(tree.getRight()); + tree.setRight(treeTemp); + reverse(tree.getRight()); + reverse(tree.getLeft()); + } else if (tree.getRight() == null && tree.getLeft() != null) { + reverse(tree.getLeft()); + } else if (tree.getRight() != null && tree.getLeft() == null) { + reverse(tree.getRight()); + } + } + } + + public void reverse() { + reverse(this); + } + + public static boolean lookup(BinaryTree tree, Comparable data) { + if (tree == null) { + return false; + } else { + if (data.compareTo(tree.getData()) == 0) { + return true; + } else { + if (data.compareTo(tree.getData()) < 0) { + return lookup(tree.getLeft(), data); + } else { + return lookup(tree.getLeft(), data); + } + } + } + } + + public boolean lookup(Comparable data) { + return lookup(this, data); + } + + public static int getMaxWidth(BinaryTree tree) { + int maxWidth = 0; + int width = 0; + int height = height(tree); + for (int i = 0; i < height; i++) { + width = getWidth(tree, i); + if (width > maxWidth) { + maxWidth = width; + } + } + return maxWidth; + } + + public static int getWidth(BinaryTree tree, int level) { + if (tree == null) { + return 0; + } + if (level == 1) { + return 1; + } + return getWidth(tree.getLeft(), level - 1) + getWidth(tree.getRight(), level - 1); + } + + public static int size(BinaryTree tree) { + if (tree == null) { + return 0; + } + return size(tree.getLeft()) + 1 + size(tree.getRight()); + } + + public int size() { + return size(this); + } + + public static boolean isEqual(BinaryTree treeA, BinaryTree treeB) { + if (treeA == null && treeB == null) { + return true; + } else if (treeA != null && treeB != null) { + return treeA.getData().equals(treeB.getData()) + && isEqual(treeA.getLeft(), treeB.getLeft()) + && isEqual(treeA.getRight(), treeB.getRight()); + } + return false; + } + + public E getData() { + return data; + } + + public void setData(E data) { + this.data = data; + } + + public BinaryTree getLeft() { + return left; + } + + public void setLeft(BinaryTree left) { + this.left = left; + } + + public BinaryTree getRight() { + return right; + } + + public void setRight(BinaryTree right) { + this.right = right; + } + + public void addRight(E data) { + this.right = new BinaryTree<>(data); + } + + public void addLeft(E data) { + this.left = new BinaryTree<>(data); + } + + @Override + public String toString() { + String string = ""; + string += "Tree: {"; + if (this.getData() != null) { + string += this.getData().toString(); + } + if (this.left != null) { + string += this.left.toString(); + } + if (this.right != null) { + string += this.right.toString(); + } + string += "} "; + return string; + } +} diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/DataFreq.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/DataFreq.java new file mode 100644 index 000000000..5a31d245b --- /dev/null +++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/DataFreq.java @@ -0,0 +1,29 @@ +package ru.mirea.practice.s23k0505.task2; + +public class DataFreq implements Comparable { + private final E data; + private final double frequency; + + public DataFreq(E data, double frequency) { + this.data = data; + this.frequency = frequency; + } + + public E getData() { + return data; + } + + public double getFrequency() { + return frequency; + } + + @Override + public int compareTo(Object o) { + return Double.compare(frequency, ((DataFreq) o).getFrequency()); + } + + @Override + public String toString() { + return "Data:{" + data + "; Frequency: " + frequency + "}"; + } +} diff --git a/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/Huffman.java b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/Huffman.java new file mode 100644 index 000000000..06ea69650 --- /dev/null +++ b/students/23K0505/23K0505-p30/src/main/java/ru/mirea/practice/s23k0505/task2/Huffman.java @@ -0,0 +1,68 @@ +package ru.mirea.practice.s23k0505.task2; + +import ru.mirea.practice.s23k0505.task1.BinaryTree; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.PriorityQueue; + +public abstract class Huffman { + // This is the worst code I've ever written + // but I don't have time to rewrite it + + public static BinaryTree> huffman(List> elements) { + PriorityQueue> queue = new PriorityQueue<>(); + for (DataFreq element : elements) { + queue.add(new DataFreq<>(new BinaryTree(element.getData()), element.getFrequency())); + } + while (queue.size() != 1) { + DataFreq el1 = queue.poll(); + DataFreq el2 = queue.poll(); + BinaryTree> tempTree = new BinaryTree<>(); + if (el1.compareTo(el2) <= 0) { + tempTree.addLeft(el1); + tempTree.addRight(el2); + } else { + tempTree.addLeft(el2); + tempTree.addRight(el1); + } + queue.add(new DataFreq<>(tempTree, el1.getFrequency() + el2.getFrequency())); + } + return new BinaryTree<>(queue.poll()); + } + + public static void makeHuffmanCodesMap(String code, Map map, BinaryTree tree) { + if (tree.getData() instanceof DataFreq) { + tree = (BinaryTree) ((DataFreq) tree.getData()).getData(); + } + if (tree.getLeft() != null) { + makeHuffmanCodesMap(code + "0", map, tree.getLeft()); + } + if (tree.getLeft() != null) { + makeHuffmanCodesMap(code + "1", map, tree.getRight()); + } + if (tree.getLeft() == null && tree.getRight() == null) { + map.put((E) tree.getData(), code); + } + } + + public static void makeHuffmanCodesMap(Map map, BinaryTree tree) { + makeHuffmanCodesMap("", map, tree); + } + + public static void main(String[] args) { + List> charFreq = new ArrayList<>(); + charFreq.add(new DataFreq<>('a', 5)); + charFreq.add(new DataFreq<>('b', 9)); + charFreq.add(new DataFreq<>('c', 12)); + charFreq.add(new DataFreq<>('d', 13)); + charFreq.add(new DataFreq<>('e', 16)); + charFreq.add(new DataFreq<>('f', 45)); + BinaryTree tree = huffman(charFreq); + HashMap map = new HashMap<>(); + makeHuffmanCodesMap(map, tree); + System.out.println(map); + } +} diff --git a/students/23K0505/23K0505-p30_2/pom.xml b/students/23K0505/23K0505-p30_2/pom.xml new file mode 100644 index 000000000..27df89d88 --- /dev/null +++ b/students/23K0505/23K0505-p30_2/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p30_2 + Лабораторная 30_2 + diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..d8a5b42ab --- /dev/null +++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Тридцатая_2 практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree2.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree2.java new file mode 100644 index 000000000..d4b8f6dbe --- /dev/null +++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/BinaryTree2.java @@ -0,0 +1,117 @@ +package ru.mirea.practice.s23k0505.task1; + +class BinaryTree2 { + Node root; + int count; + + public BinaryTree2() { + root = null; + count = 0; + } + + public void insert(int item) { + Node newNode = new Node(item); + if (root == null) { + root = newNode; + count++; + return; + } + + Node current = root; + Node parent = null; + + while (true) { + parent = current; + if (item < current.data) { + current = current.left; + if (current == null) { + parent.left = newNode; + count++; + return; + } + } else if (item > current.data) { + current = current.right; + if (current == null) { + parent.right = newNode; + count++; + return; + } else { + return; + } + } else { + return; + } + } + } + + public void inorder() { + inorderRec(root); + System.out.println(); + } + + private void inorderRec(Node node) { + if (node != null) { + inorderRec(node.left); + System.out.print(node.data + " "); + inorderRec(node.right); + } + } + + public boolean delete(int key) { + Node current = root; + Node parent = null; + + while (current != null && current.data != key) { + parent = current; + if (key < current.data) { + current = current.left; + } else { + current = current.right; + } + } + + if (current == null) { + return false; + } + + if (current.left == null && current.right == null) { + if (current == root) { + root = null; + } else if (parent.left == current) { + parent.left = null; + } else { + parent.right = null; + } + } else if (current.left == null || current.right == null) { + Node child = (current.left != null) ? current.left : current.right; + if (current == root) { + root = child; + } else if (parent.left == current) { + parent.left = child; + } else { + parent.right = child; + } + } else { + Node successor = findMin(current.right); + int val = successor.data; + delete(successor.data); + current.data = val; + } + + count--; + return true; + } + + private Node findMin(Node node) { + while (node.left != null) { + node = node.left; + } + return node; + } + + public void destroyTree() { + root = null; + count = 0; + } +} + diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java new file mode 100644 index 000000000..8b7c914fd --- /dev/null +++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505.task1; + +public class Node { + int data; + Node left; + Node right; + + public Node(int item) { + data = item; + left = right = null; + } +} diff --git a/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/TestBinaryTree2.java b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/TestBinaryTree2.java new file mode 100644 index 000000000..d86d5b320 --- /dev/null +++ b/students/23K0505/23K0505-p30_2/src/main/java/ru/mirea/practice/s23k0505/task1/TestBinaryTree2.java @@ -0,0 +1,30 @@ +package ru.mirea.practice.s23k0505.task1; + +public abstract class TestBinaryTree2 { + public static void main(String[] args) { + BinaryTree2 tree = new BinaryTree2(); + + int[] nodes = {50, 30, 20, 40, 70, 60, 80, 10, 90, 5}; + for (int node : nodes) { + tree.insert(node); + } + + // Печать содержимого дерева + System.out.println("Содержимое дерева в сортированном порядке:"); + tree.inorder(); + + // Удаление одного узла + int keyToDelete = 70; + System.out.println("Удаление узла с ключом: " + keyToDelete); + tree.delete(keyToDelete); + + // Печать после удаления узла + System.out.println("Содержимое дерева после удаления узла:"); + tree.inorder(); + + // Полное удаление дерева + tree.destroyTree(); + System.out.println("Дерево было успешно удалено."); + } +} + diff --git a/students/23K0505/23K0505-p31/pom.xml b/students/23K0505/23K0505-p31/pom.xml new file mode 100644 index 000000000..84f8c4254 --- /dev/null +++ b/students/23K0505/23K0505-p31/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p31 + Лабораторная 31 + diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..5ef8a66fd --- /dev/null +++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Тридцать первая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java new file mode 100644 index 000000000..b3ee93841 --- /dev/null +++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Node.java @@ -0,0 +1,119 @@ +package ru.mirea.practice.s23k0505.task1; + +public class Node { + int numberOfKeys; // количество занятых ключей + int[] key = new int[3]; + Node first; + Node second; + Node third; + Node fourth; + Node parents; // указатель на родителей + + boolean find(int k) { // ключ находится в вершине или нет + for (int i = 0; i < numberOfKeys; i++) { + if (key[i] == k) { + return true; + } + } + return false; + } + + void swap(int x, int y) { + int tempInt = x; + x = y; + y = tempInt; + } + + void sort2(int x, int y) { + if (x > y) { + swap(x, y); + } + } + + void sort3(int x, int y, int z) { + if (x > y) { + swap(x, y); + } + + if (x > z) { + swap(x, y); + } + + if (y > z) { + swap(y, z); + } + } + + void sort() { + if (numberOfKeys == 2) { + sort2(key[0], key[1]); + } else if (numberOfKeys == 3) { + sort3(key[0], key[1], key[2]); + } + } + + void addKeyInNode(int k) { + key[numberOfKeys] = k; + numberOfKeys++; + sort(); + } + + void deleteKeyFromNode(int k) { + if (numberOfKeys >= 1 && key[0] == k) { + key[0] = key[1]; + key[1] = key[2]; + numberOfKeys--; + } else if (numberOfKeys == 2 && key[1] == k) { + key[1] = key[2]; + numberOfKeys--; + } + } + + void becomeNode2(int k, Node first, Node second) { + key[0] = k; + this.first = first; + this.second = second; + this.third = null; + this.fourth = null; + this.parents = null; + numberOfKeys = 1; + } + + boolean isLeaf() { + return first == null && second == null && third == null; + } + + public Node(int key) { + numberOfKeys = 1; + this.key[0] = key; + first = null; + second = null; + third = null; + fourth = null; + parents = null; + } + + public Node(int key, Node first, Node second, Node third, Node fourth, Node parents) { + numberOfKeys = 1; + this.key[0] = key; + this.first = first; + this.second = second; + this.third = third; + this.fourth = fourth; + this.parents = parents; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < numberOfKeys; i++) { + sb.append(key[i]); + if (i < numberOfKeys - 1) { + sb.append(", "); + } + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java new file mode 100644 index 000000000..54a3504bd --- /dev/null +++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/Test.java @@ -0,0 +1,16 @@ +package ru.mirea.practice.s23k0505.task1; + +public abstract class Test { + public static void main(String[] args) { + + TwoThreeTree tree = new TwoThreeTree(); + tree.root = tree.insert(tree.root, 50); + tree.root = tree.insert(tree.root, 30); + tree.root = tree.insert(tree.root, 70); + tree.root = tree.insert(tree.root, 20); + tree.root = tree.insert(tree.root, 40); + tree.printTree(); + + } +} + diff --git a/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/TwoThreeTree.java b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/TwoThreeTree.java new file mode 100644 index 000000000..acbdd1e3b --- /dev/null +++ b/students/23K0505/23K0505-p31/src/main/java/ru/mirea/practice/s23k0505/task1/TwoThreeTree.java @@ -0,0 +1,464 @@ +package ru.mirea.practice.s23k0505.task1; + +import java.util.LinkedList; +import java.util.Queue; + + +public class TwoThreeTree { + Node root; + + public Node insert(Node root, int key) { + if (root == null) { + return new Node(key); + } + if (root.isLeaf()) { + root.addKeyInNode(key); + } else if (key <= root.key[0]) { + root.first = insert(root.first, key); + } else if (root.numberOfKeys == 1 || root.numberOfKeys == 2 && key <= root.key[1]) { + root.second = insert(root.second, key); + } else { + root.third = insert(root.third, key); + } + return split(root); + } + + Node split(Node node) { + if (node.numberOfKeys < 3) { + return node; + } + Node x = new Node(node.key[0], node.first, node.second, null, null, node.parents); + Node y = new Node(node.key[2], node.third, node.fourth, null, null, node.parents); + + // Устанавливаем правильных родителей + if (x.first != null) { + x.first.parents = x; + } + + if (x.second != null) { + x.second.parents = x; + } + + if (y.first != null) { + x.first.parents = y; + } + + if (y.second != null) { + y.second.parents = y; + } + + if (node.parents != null) { + node.parents.addKeyInNode(node.key[1]); + // Убираем ссылку на разделяемый узел из родительского узла + if (node.parents.first == node) { + node.parents.first = null; + } else if (node.parents.second == node) { + node.parents.second = null; + } else if (node.parents.third == node) { + node.parents.third = null; + } + + // Обновляем ссылки на дочерные узлы в родительском узле + if (node.parents.first == null) { + node.parents.fourth = node.parents.third; + node.parents.third = node.parents.second; + node.parents.second = y; + node.parents.first = x; + } else if (node.parents.second == null) { + node.parents.fourth = node.parents.third; + node.parents.third = y; + node.parents.second = x; + } else { + node.parents.fourth = y; + node.parents.third = x; + } + + Node temp = node.parents; + node = null; + return temp; + } else { + x.parents = node; + y.parents = node; + node.becomeNode2(node.key[1], x, y); + return node; + } + } + + // Поиск ключа + Node search(Node node, int key) { + if (node == null) { + return null; + } + + if (node.find(key)) { + return node; + } else if (key < node.key[0]) { + return search(node.first, key); + } else if (node.numberOfKeys == 2 && key < node.key[1] || node.numberOfKeys == 1) { + return search(node.second, key); + } else if (node.numberOfKeys == 2) { + return search(node.third, key); + } + return null; + } + + // Поиск минимального ключа + Node searchMin(Node node) { + if (node == null) { + return node; + } + + if (node.first == null) { + return node; + } else { + return searchMin(node.first); + } + } + + // Удаление ключа + Node remove(Node node, int key) { + Node item = search(node, key); + + if (item == null) { + return node; + } + + Node min = null; + if (item.key[0] == key) { + min = searchMin(item.second); + } else { + min = searchMin(item.third); + } + + if (min != null) { + int z = key == item.key[0] ? item.key[0] : item.key[1]; + item.swap(z, min.key[0]); + item = min; + } + + item.deleteKeyFromNode(key); + return fix(item); + } + + // Исправление дерева после удаления ключа + Node fix(Node node) { + if (node.numberOfKeys == 0 && node.parents == null) { + return null; + } + + if (node.numberOfKeys != 0) { + if (node.parents != null) { + return fix(node.parents); + } else { + return node; + } + } + + Node parent = node.parents; + if (parent.first.numberOfKeys == 2 || parent.second.numberOfKeys == 2 || parent.numberOfKeys == 2) { + node = redistribute(node); + } else if (parent.numberOfKeys == 2 && parent.third.numberOfKeys == 2) { + node = redistribute(node); + } else { + node = merge(node); + } + return fix(node); + } + + // Перераспределение + Node redistribute(Node leaf) { + Node parent = leaf.parents; + Node first = parent.first; + Node second = parent.second; + Node third = parent.third; + + if (parent.numberOfKeys == 2 && first.numberOfKeys < 2 && second.numberOfKeys < 2 + && third.numberOfKeys < 2) { + + if (first == leaf) { + parent.first = parent.second; + parent.second = parent.third; + parent.third = null; + parent.first.addKeyInNode(parent.key[0]); + parent.first.third = parent.first.second; + parent.first.second = parent.first.first; + + + if (leaf.first != null) { + parent.first.first = leaf.first; + } else if (leaf.second != null) { + parent.first.first = leaf.second; + } + + if (parent.first.parents == null) { + parent.first.first.parents = parent.first; + } + + parent.deleteKeyFromNode(parent.key[0]); + first = null; + + } else if (second == leaf) { + first.addKeyInNode(parent.key[0]); + parent.deleteKeyFromNode(parent.key[0]); + if (leaf.first != null) { + first.third = leaf.first; + } else if (leaf.second != null) { + first.third = leaf.second; + } + + if (first.third != null) { + first.third.parents = first; + } + parent.second = parent.third; + parent.third = null; + second = null; + + } else if (third == leaf) { + second.addKeyInNode(parent.key[1]); + parent.third = null; + parent.deleteKeyFromNode(parent.key[1]); + + if (leaf.first != null) { + second.third = leaf.first; + } else if (leaf.second != null) { + second.third = leaf.second; + } + + if (second.third != null) { + second.third.parents = second; + } + third = null; + } + } else if (parent.numberOfKeys == 2 && (first.numberOfKeys == 2 + || second.numberOfKeys == 2 || third.numberOfKeys == 2)) { + + if (third == leaf) { + + if (leaf.first != null) { + leaf.second = leaf.first; + leaf.first = null; + } + + leaf.addKeyInNode(parent.key[1]); + + if (second.numberOfKeys == 2) { + parent.key[1] = second.key[1]; + leaf.first = second.third; + second.third = null; + + if (leaf.first != null) { + leaf.first.parents = leaf; + } + } else if (first.numberOfKeys == 2) { + parent.key[1] = second.key[0]; + leaf.first = second.second; + second.second = second.first; + + if (leaf.first != null) { + leaf.first.parents = leaf; + } + + second.key[0] = parent.key[0]; + parent.key[0] = first.key[1]; + first.deleteKeyFromNode(first.key[1]); + second.first = first.third; + + if (second.first != null) { + second.first.parents = second; + } + first.third = null; + } + + + } else if (second == leaf) { + + if (third.numberOfKeys == 2) { + + if (leaf.first == null) { + leaf.first = leaf.second; + leaf.second = null; + } + + second.addKeyInNode(parent.key[1]); + parent.key[1] = third.key[0]; + third.deleteKeyFromNode(third.key[0]); + second.second = third.first; + + if (second.second != null) { + second.second.parents = second; + } + third.first = third.second; + third.second = third.third; + third.third = null; + } else if (first.numberOfKeys == 2) { + if (leaf.second == null) { + leaf.second = leaf.first; + leaf.first = null; + } + second.addKeyInNode(parent.key[0]); + parent.key[0] = first.key[1]; + first.deleteKeyFromNode(first.key[1]); + second.first = first.third; + if (second.first != null) { + second.first.parents = second; + } + first.third = null; + } + + + } else if (first == leaf) { + + if (leaf.first == null) { + leaf.first = leaf.second; + leaf.second = null; + } + first.addKeyInNode(parent.key[0]); + + if (second.numberOfKeys == 2) { + parent.key[0] = second.key[0]; + second.deleteKeyFromNode(second.key[0]); + first.second = second.first; + + if (first.second != null) { + first.second.parents = first; + } + second.first = second.second; + second.second = second.third; + second.third = null; + } else if (third.numberOfKeys == 2) { + parent.key[0] = second.key[0]; + second.key[0] = parent.key[1]; + parent.key[1] = third.key[0]; + third.deleteKeyFromNode(third.key[0]); + first.second = second.first; + + if (first.second != null) { + first.second.parents = first; + } + second.first = second.second; + second.second = third.first; + + if (second.second != null) { + second.second.parents = second; + } + third.first = third.second; + third.second = third.third; + third.third = null; + } + } + } else if (parent.numberOfKeys == 1) { + leaf.addKeyInNode(parent.key[0]); + + if (first == leaf && second.numberOfKeys == 2) { + parent.key[0] = second.key[0]; + second.deleteKeyFromNode(second.key[0]); + + if (leaf.first == null) { + leaf.first = leaf.second; + } + leaf.second = second.first; + second.first = second.second; + second.second = second.third; + second.third = null; + + if (leaf.second != null) { + leaf.second.parents = leaf; + } + } else if (second == leaf && first.numberOfKeys == 2) { + parent.key[0] = first.key[1]; + first.deleteKeyFromNode(first.key[1]); + + if (leaf.second == null) { + leaf.second = leaf.first; + } + leaf.first = first.third; + first.third = null; + + if (leaf.first != null) { + leaf.first.parents = leaf; + } + } + } + return parent; + } + + // Склеивание + Node merge(Node leaf) { + Node parent = leaf.parents; + + if (parent.first == leaf) { + parent.second.addKeyInNode(parent.key[0]); + parent.second.third = parent.second.second; + parent.second.second = parent.second.first; + + if (leaf.first != null) { + parent.second.first = leaf.first; + } else if (leaf.second != null) { + parent.second.first = leaf.second; + } + + if (parent.second.first != null) { + parent.second.first.parents = parent.second; + } + parent.deleteKeyFromNode(parent.key[0]); + parent.first = null; + } else if (parent.second == leaf) { + parent.first.addKeyInNode(parent.key[0]); + + if (leaf.first != null) { + parent.first.third = leaf.first; + } else if (leaf.second != null) { + parent.first.third = leaf.second; + } + + if (parent.first.third != null) { + parent.first.third.parents = parent.first; + } + parent.deleteKeyFromNode(parent.key[0]); + parent.second = null; + } + + if (parent.parents == null) { + Node temp = null; + if (parent.first != null) { + temp = parent.first; + } else { + temp = parent.second; + } + temp.parents = null; + parent = null; + return temp; + } + + return parent; + } + + public void printTree() { + if (root == null) { + System.out.println("Tree is empty."); + return; + } + + Queue queue = new LinkedList<>(); + queue.add(root); + + while (!queue.isEmpty()) { + int levelSize = queue.size(); // Количество узлов на текущем уровне + for (int i = 0; i < levelSize; i++) { + Node current = queue.poll(); + System.out.print(current + " "); // Печатаем текущий узел + + if (current.first != null) { + queue.add(current.first); + } + if (current.second != null) { + queue.add(current.second); + } + if (current.third != null) { + queue.add(current.third); + } + } + System.out.println(); + } + } +} diff --git a/students/23K0505/23K0505-p32/pom.xml b/students/23K0505/23K0505-p32/pom.xml new file mode 100644 index 000000000..453b2be25 --- /dev/null +++ b/students/23K0505/23K0505-p32/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + 23K0505 + ru.mirea.practice + 2024.1 + ../pom.xml + + 23K0505-p32 + Лабораторная 32 + diff --git a/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/Main.java b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/Main.java new file mode 100644 index 000000000..dfcb009cb --- /dev/null +++ b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/Main.java @@ -0,0 +1,12 @@ +package ru.mirea.practice.s23k0505; + +public final class Main { + + private Main() { + + } + + public static void main(String[] args) { + System.out.println("Тридцать вторая практическая работа!"); + } +} diff --git a/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/task1/Permutations.java b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/task1/Permutations.java new file mode 100644 index 000000000..8e5ba9501 --- /dev/null +++ b/students/23K0505/23K0505-p32/src/main/java/ru/mirea/practice/s23k0505/task1/Permutations.java @@ -0,0 +1,78 @@ +package ru.mirea.practice.s23k0505.task1; + +public abstract class Permutations { + + static class Element { + int value; + int direction; + + Element(int value) { + this.value = value; + this.direction = -1; + } + } + + public static void generatePermutations(int n) { + Element[] elements = new Element[n]; + + for (int i = 0; i < n; i++) { + elements[i] = new Element(i + 1); + } + + while (true) { + printCurrentPermutation(elements); + int mobileIndex = getMobileIndex(elements); + if (mobileIndex == -1) { + break; + } + + int newIndex = mobileIndex + elements[mobileIndex].direction; + swap(elements, mobileIndex, newIndex); + updateDirections(elements, elements[newIndex].value); + } + } + + private static void printCurrentPermutation(Element[] elements) { + for (Element element : elements) { + System.out.print(element.value + " "); + } + System.out.println(); + } + + private static int getMobileIndex(Element[] elements) { + int mobileIndex = -1; + for (int i = 0; i < elements.length; i++) { + if (isMobile(elements, i) && (mobileIndex == -1 || elements[i].value > elements[mobileIndex].value)) { + mobileIndex = i; + } + } + return mobileIndex; + } + + private static boolean isMobile(Element[] elements, int index) { + if (elements[index].direction == -1) { + return index > 0 && elements[index].value > elements[index - 1].value; + } else { + return index < elements.length - 1 && elements[index].value > elements[index + 1].value; + } + } + + private static void swap(Element[] elements, int i, int j) { + Element temp = elements[i]; + elements[i] = elements[j]; + elements[j] = temp; + } + + private static void updateDirections(Element[] elements, int mobileValue) { + for (Element el : elements) { + if (el.value > mobileValue) { + el.direction = -el.direction; + } + } + } + + public static void main(String[] args) { + int n = 3; + generatePermutations(n); + } +} diff --git a/students/23K0505/pom.xml b/students/23K0505/pom.xml index 0b34b738c..0201e2cb7 100644 --- a/students/23K0505/pom.xml +++ b/students/23K0505/pom.xml @@ -34,5 +34,18 @@ 23K0505-p18 23K0505-p19 23K0505-p20 + 23K0505-p21 + 23K0505-p22 + 23K0505-p23 + 23K0505-p24 + 23K0505-p25 + 23K0505-p26 + 23K0505-p27 + 23K0505-p28 + 23K0505-p29 + 23K0505-p30 + 23K0505-p30_2 + 23K0505-p31 + 23K0505-p32