Skip to content
This repository was archived by the owner on Dec 28, 2024. It is now read-only.

Commit 50b3dfd

Browse files
authored
Merge pull request #636 from Eliizava/features/lab31-32
Лабораторная №31-32
2 parents 067529d + 9eefa5e commit 50b3dfd

File tree

9 files changed

+442
-6
lines changed

9 files changed

+442
-6
lines changed
Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
package ru.mirea.practice.s23k0143;
22

3-
public final class Main {
4-
5-
private Main() {
6-
7-
}
3+
import java.util.Scanner;
4+
import java.io.IOException;
85

6+
public abstract class Main {
97
public static void main(String[] args) {
10-
System.out.println("первая практическая работа!");
8+
ProcessorDatabase db = new ProcessorDatabase();
9+
try {
10+
db.loadFromFile("PROCS.TXT");
11+
} catch (IOException e) {
12+
System.out.println("Ошибка при чтении файла: " + e.getMessage());
13+
return;
14+
}
15+
16+
try (Scanner scanner = new Scanner(System.in)) {
17+
System.out.println("Введите команду (L, D n, A n, S, E):");
18+
while (true) {
19+
String command = scanner.nextLine();
20+
db.executeCommand(command);
21+
}
22+
} catch (RuntimeException e) {
23+
throw new RuntimeException(e);
24+
}
1125
}
1226
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ru.mirea.practice.s23k0143;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class Node {
7+
List<ProcessorRecord> records;
8+
List<Node> children;
9+
boolean isLeaf;
10+
11+
public Node() {
12+
records = new ArrayList<>();
13+
children = new ArrayList<>();
14+
isLeaf = true;
15+
}
16+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package ru.mirea.practice.s23k0143;
2+
3+
import java.io.BufferedReader;
4+
import java.io.FileReader;
5+
import java.io.IOException;
6+
import java.util.Scanner;
7+
import java.util.Locale;
8+
9+
public class ProcessorDatabase {
10+
private TwoThreeTree tree;
11+
12+
public ProcessorDatabase() {
13+
tree = new TwoThreeTree();
14+
}
15+
16+
public void loadFromFile(String filename) throws IOException {
17+
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
18+
String line;
19+
while ((line = reader.readLine()) != null) {
20+
String[] parts = line.split(", ");
21+
int key = Integer.parseInt(parts[0].trim());
22+
String name = parts[1].trim();
23+
double clockSpeed = Double.parseDouble(parts[2].trim());
24+
int cacheSize = Integer.parseInt(parts[3].trim());
25+
double busSpeed = Double.parseDouble(parts[4].trim());
26+
int specInt = Integer.parseInt(parts[5].trim());
27+
int specFp = Integer.parseInt(parts[6].trim());
28+
ProcessorRecord record = new ProcessorRecord(key, name, clockSpeed, cacheSize, busSpeed, specInt, specFp);
29+
tree.insert(record);
30+
}
31+
}
32+
}
33+
34+
public void executeCommand(String command) {
35+
switch (command.toUpperCase(Locale.ROOT)) {
36+
case "L":
37+
System.out.println("Вывод дерева по уровням:");
38+
tree.printLevelOrder();
39+
break;
40+
case "S":
41+
tree.saveToFile("PROCS.TXT");
42+
System.out.println("Данные сохранены в файл PROCS.TXT.");
43+
break;
44+
case "E":
45+
System.exit(0);
46+
break;
47+
default:
48+
if (command.startsWith("D ")) {
49+
int key = Integer.parseInt(command.split(" ")[1]);
50+
if (tree.delete(key)) {
51+
System.out.println("Запись удалена.");
52+
} else {
53+
System.out.println("Запись не найдена.");
54+
}
55+
} else if (command.startsWith("A ")) {
56+
int key = Integer.parseInt(command.split(" ")[1]);
57+
if (tree.search(key) != null) {
58+
System.out.println("Запись с ключом " + key + " уже существует.");
59+
} else {
60+
addNewRecord(key);
61+
}
62+
}
63+
break;
64+
}
65+
}
66+
67+
private void addNewRecord(int key) {
68+
try (Scanner scanner = new Scanner(System.in)) {
69+
System.out.println("Введите название процессора:");
70+
final String name = scanner.nextLine();
71+
System.out.println("Введите тактовую частоту (ГГц):");
72+
final double clockSpeed = scanner.nextDouble();
73+
System.out.println("Введите размер кеш-памяти (Кб):");
74+
final int cacheSize = scanner.nextInt();
75+
System.out.println("Введите частоту системной шины (ГГц):");
76+
final double busSpeed = scanner.nextDouble();
77+
System.out.println("Введите результат теста SPECint:");
78+
final int specInt = scanner.nextInt();
79+
System.out.println("Введите результат теста SPECfp:");
80+
final int specFp = scanner.nextInt();
81+
scanner.nextLine();
82+
83+
ProcessorRecord newRecord = new ProcessorRecord(key, name, clockSpeed, cacheSize, busSpeed, specInt, specFp);
84+
tree.insert(newRecord);
85+
System.out.println("Запись добавлена.");
86+
} catch (RuntimeException e) {
87+
throw new RuntimeException(e);
88+
}
89+
}
90+
}
91+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ru.mirea.practice.s23k0143;
2+
3+
public class ProcessorRecord {
4+
int key;
5+
String name;
6+
double clockSpeed;
7+
int cacheSize;
8+
double busSpeed;
9+
int specInt;
10+
int specFp;
11+
12+
public ProcessorRecord(int key, String name, double clockSpeed, int cacheSize, double busSpeed, int specInt, int specFp) {
13+
this.key = key;
14+
this.name = name;
15+
this.clockSpeed = clockSpeed;
16+
this.cacheSize = cacheSize;
17+
this.busSpeed = busSpeed;
18+
this.specInt = specInt;
19+
this.specFp = specFp;
20+
}
21+
}
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
package ru.mirea.practice.s23k0143;
2+
3+
import java.io.BufferedWriter;
4+
import java.io.FileWriter;
5+
import java.io.IOException;
6+
import java.util.LinkedList;
7+
import java.util.Queue;
8+
9+
class TwoThreeTree {
10+
Node root;
11+
12+
public TwoThreeTree() {
13+
root = null;
14+
}
15+
16+
public void insert(ProcessorRecord record) {
17+
if (root == null) {
18+
root = new Node();
19+
root.records.add(record);
20+
} else {
21+
Node newRoot = insert(root, record);
22+
if (newRoot != null) {
23+
root = newRoot;
24+
}
25+
}
26+
}
27+
28+
private Node insert(Node node, ProcessorRecord record) {
29+
if (node.isLeaf) {
30+
node.records.add(record);
31+
node.records.sort((r1, r2) -> Integer.compare(r1.key, r2.key));
32+
if (node.records.size() <= 3) {
33+
return null;
34+
} else {
35+
return splitNode(node);
36+
}
37+
} else {
38+
for (int i = 0; i < node.records.size(); i++) {
39+
if (record.key < node.records.get(i).key) {
40+
Node newChild = insert(node.children.get(i), record);
41+
if (newChild != null) {
42+
node.records.add(i, newChild.records.get(0));
43+
node.children.add(i + 1, newChild.children.get(1));
44+
if (node.records.size() > 3) {
45+
return splitNode(node);
46+
}
47+
}
48+
return null;
49+
}
50+
}
51+
Node newChild = insert(node.children.get(node.children.size() - 1), record);
52+
if (newChild != null) {
53+
node.records.add(newChild.records.get(0));
54+
node.children.add(newChild.children.get(1));
55+
if (node.records.size() > 3) {
56+
return splitNode(node);
57+
}
58+
}
59+
return null;
60+
}
61+
}
62+
63+
private Node splitNode(Node node) {
64+
Node newNode = new Node();
65+
newNode.isLeaf = node.isLeaf;
66+
newNode.records.add(node.records.get(2));
67+
node.records.remove(2);
68+
if (!node.isLeaf) {
69+
newNode.children.add(node.children.get(2));
70+
newNode.children.add(node.children.get(3));
71+
node.children.subList(2, 4).clear();
72+
}
73+
return newNode;
74+
}
75+
76+
public boolean delete(int key) {
77+
if (root == null) {
78+
return false;
79+
}
80+
81+
boolean deleted = delete(root, key);
82+
if (root.records.isEmpty()) {
83+
root = root.children.isEmpty() ? null : root.children.get(0);
84+
}
85+
86+
return deleted;
87+
}
88+
89+
private boolean delete(Node node, int key) {
90+
if (node.isLeaf) {
91+
for (int i = 0; i < node.records.size(); i++) {
92+
if (node.records.get(i).key == key) {
93+
node.records.remove(i);
94+
return true;
95+
}
96+
}
97+
return false;
98+
} else {
99+
for (int i = 0; i < node.records.size(); i++) {
100+
if (key < node.records.get(i).key) {
101+
boolean deleted = delete(node.children.get(i), key);
102+
if (deleted) {
103+
if (node.children.get(i).records.size() < 1) {
104+
node.children.remove(i);
105+
if (i > 0) {
106+
node.records.remove(i - 1);
107+
} else {
108+
node.records.remove(i);
109+
}
110+
}
111+
return true;
112+
}
113+
return false;
114+
}
115+
}
116+
boolean deleted = delete(node.children.get(node.children.size() - 1), key);
117+
if (deleted) {
118+
if (node.children.get(node.children.size() - 1).records.size() < 1) {
119+
node.children.remove(node.children.size() - 1);
120+
}
121+
}
122+
return deleted;
123+
}
124+
}
125+
126+
public void printLevelOrder() {
127+
if (root == null) {
128+
return;
129+
}
130+
Queue<Node> queue = new LinkedList<>();
131+
queue.add(root);
132+
while (!queue.isEmpty()) {
133+
Node current = queue.poll();
134+
for (ProcessorRecord rec : current.records) {
135+
System.out.print(rec.key + " ");
136+
}
137+
System.out.println();
138+
if (!current.isLeaf) {
139+
for (Node child : current.children) {
140+
queue.add(child);
141+
}
142+
}
143+
}
144+
}
145+
146+
public ProcessorRecord search(int key) {
147+
return search(root, key);
148+
}
149+
150+
private ProcessorRecord search(Node node, int key) {
151+
if (node == null) {
152+
return null;
153+
}
154+
for (ProcessorRecord record : node.records) {
155+
if (record.key == key) {
156+
return record;
157+
}
158+
}
159+
for (int i = 0; i <= node.records.size(); i++) {
160+
if (i == node.records.size() || key < node.records.get(i).key) {
161+
return search(i < node.children.size() ? node.children.get(i) : null, key);
162+
}
163+
}
164+
return null;
165+
}
166+
167+
public void saveToFile(String filename) {
168+
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
169+
saveToFile(root, writer);
170+
} catch (IOException e) {
171+
System.out.println("Ошибка при сохранении в файл: " + e.getMessage());
172+
}
173+
}
174+
175+
private void saveToFile(Node node, BufferedWriter writer) throws IOException {
176+
if (node == null) {
177+
return;
178+
}
179+
for (ProcessorRecord record : node.records) {
180+
writer.write(record.key + ", " + record.name + ", " + record.clockSpeed + ", "
181+
+ record.cacheSize + ", " + record.busSpeed + ", "
182+
+ record.specInt + ", " + record.specFp);
183+
writer.newLine();
184+
}
185+
for (Node child : node.children) {
186+
saveToFile(child, writer);
187+
}
188+
}
189+
}
190+

students/23K0143/23K0143-p32/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<artifactId>23K0143</artifactId>
7+
<groupId>ru.mirea.practice</groupId>
8+
<version>2024.1</version>
9+
<relativePath>../pom.xml</relativePath>
10+
</parent>
11+
<artifactId>23K0143-p32</artifactId>
12+
<description>Массивы</description>
13+
</project>

0 commit comments

Comments
 (0)