Материал: Java. Лабораторная работа 8

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

} 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