} catch (Exception e) { JOptionPane.showMessageDialog(null, "HeadlessException.
Ошибка совместимости периферии", "Ошибка", JOptionPane.ERROR_MESSAGE); e.printStackTrace();
}
}
});
}
// Метод добавления вектора
private void addVector(String string) { try {
JTextField jTextField = new JTextField(string, 35); JPanel jPanel = new JPanel();
jPanel.add(new JLabel(String.valueOf(vectorArrayList.size())), BorderLayout.WEST);
jPanel.add(jTextField);
centerPanel.add(jPanel);
vectorArrayList.add(jTextField); } catch (Exception e) {
JOptionPane.showMessageDialog(null, "Ошибка создания вектора", "Ошибка", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
clearVectorPanel();
}
mainPanel.validate();
mainPanel.repaint();
}
//Метод очистки панели с векторами private void clearVectorPanel() {
centerPanel.removeAll();
vectorArrayList.clear();
mainPanel.validate();
mainPanel.repaint();
}
//Метод получения двух векторов по указанным в Editor's индексам private Array[] getTwoVectors() {
int arrayListLen = vectorArrayList.size(), firstIndex, secondIndex;
try { firstIndex =
Integer.parseInt(firstVectorIndexEdit.getValue().toString()); secondIndex =
Integer.parseInt(secondVectorIndexEdit.getValue().toString()); } catch (Exception e) {
JOptionPane.showMessageDialog(null, "Первый и/или второй индекс указан(ы) неверно", "Ошибка", JOptionPane.ERROR_MESSAGE);
return new Array[]{null, null};
}
if (!(0 <= firstIndex && firstIndex < arrayListLen)) { JOptionPane.showMessageDialog(null, "Индекс первого вектора
выходит за пределы", "Ошибка", JOptionPane.ERROR_MESSAGE); return new Array[]{null, null};
}
if (!(0 <= secondIndex && secondIndex < arrayListLen)) { JOptionPane.showMessageDialog(null, "Индекс второго вектора
выходит за пределы", "Ошибка", JOptionPane.ERROR_MESSAGE); return new Array[]{null, null};
}
String[] firstVectorStringArray = vectorArrayList.get(firstIndex).getText().split("[,;\\s]+");
String[] secondVectorStringArray = vectorArrayList.get(secondIndex).getText().split("[,;\\s]+");
int vectorSize = firstVectorStringArray.length, vectorSize2 =
6
secondVectorStringArray.length; if (vectorSize == 0) {
JOptionPane.showMessageDialog(null, "Нулевой размер у первого вектора", "Ошибка", JOptionPane.ERROR_MESSAGE);
return new Array[]{null, null};
}
if (vectorSize2 == 0) {
JOptionPane.showMessageDialog(null, "Нулевой размер у второго вектора", "Ошибка", JOptionPane.ERROR_MESSAGE);
return new Array[]{null, null};
}
if (vectorSize != vectorSize2) {
JOptionPane.showMessageDialog(null, "Векторы неравны по размеру", "Ошибка", JOptionPane.ERROR_MESSAGE);
return new Array[]{null, null};
}
try {
Array firstArray = new Array(vectorSize), secondArray = new Array(vectorSize);
for (int i = 0; i < vectorSize; ++i) { firstArray.set(i,
Double.parseDouble(firstVectorStringArray[i]));
secondArray.set(i,
Double.parseDouble(secondVectorStringArray[i]));
}
return new Array[]{firstArray, secondArray};
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Ошибка работы с векторами", "Ошибка", JOptionPane.ERROR_MESSAGE);
return new Array[]{null, null};
}
}
}
Результат компиляции и запуска представлен на рис. 1.
Рисунок 1 — Результат компиляции и запуска Task8.java
Векторы добавляются при помощи кнопки «Добавить вектор» и могут
быть отредактированы в процессе работы без затруднений (рис. 2-4). 7
Рисунок 2 — Результат добавления шести векторов
Рисунок 3 — Результат добавления ещё трех векторов
Рисунок 4 — Семь примеров корректных векторов 8
На рис. 4 были приведены примеры корректных с точки зрения программы векторов. В качестве разделителя чисел могут использоваться либо пробелы, либо точки с запятыми, либо запятые, либо любые их сочетания и перестановки. Точка используется в качестве десятичного разделителя (целая и дробная части).
Все векторы можно удалить при помощи кнопки «Удалить все векторы» (рис. 5).
Рисунок 5 — Результат удаления всех векторов Поле ввода размера вектора на самом деле сделано для удобства — оно
влияет на число генерируемых элементов-нулей создаваемого вектора (т. е. если указано 5, то вектор в программе по умолчанию будет значиться как «0 0 0 0 0»).
Теперь рассмотрим функцию скалярного произведения, предварительно добавив несколько векторов (рис. 6). В полях-индексах записываются индексы векторов-операндов. В нашем случае — это 1 и 2. Нетрудно посчитать, что 3×1.5 + 2×2 + 1.5×3 = 4.5 + 4 + 4.5 = 13.
9
Рисунок 6 — Результат скалярного произведения второго (1) и третьего (2) векторов
Теперь рассмотрим функцию суммы векторов (рис. 7). Индексы векторов те же. Нетрудно посчитать, что 3 + 1.5 = 4.5, 2 + 2 = 4, 1.5 + 3 = 4.5.
Рисунок 7 — Результат суммы второго (1) и третьего (2) векторов Если векторы отличаются по размеру, то возникает ошибка (рис. 8).
Рисунок 8 — Ошибка неравенства размеров двух векторов Если индекс одного из векторов выходит за пределы, то возникает
ошибка (рис. 9, 10).
10