public void add(int i, double elem) throws VectorIndexOutOfBoundsException {
if (i >= 0 && i <= size) { if (i != 0) {
Node temp = head;
for (int j = 1; j < i; ++j) { temp = temp.next;
}
temp.next = new Node(elem, temp.next); } else {
head = new Node(elem, head);
}
++size; return;
}
throw new VectorIndexOutOfBoundsException("VectorIndexOutOfBoundsException", i);
}
// Удаление элемента из списка
public void remove(int i) throws VectorIndexOutOfBoundsException { if (i >= 0 && i < size) {
if (i != 0) {
Node temp = head;
for (int j = 1; j < i; ++j) { temp = temp.next;
}
temp.next = temp.next.next; } else {
head = head.next;
}
--size; return;
}
throw new VectorIndexOutOfBoundsException("VectorIndexOutOfBoundsException", i);
}
//Нахождение нормы Евклида public double normEuclidean() {
double r = 0;
for (Node temp = head; temp != null; temp = temp.next) { r += temp.value * temp.value;
}
return Math.sqrt(r);
}
//Вывод всех элементов списка
public void print() { Node temp = head; if (temp != null) {
System.out.print(temp.value); temp = temp.next;
}
for (; temp != null; temp = temp.next) { System.out.print(" " + temp.value);
}
System.out.println();
}
// Класс "Узел"
public static class Node {
public Node(double value, Node next) { this.value = value;
this.next = next;
16
}
public double value; public Node next;
}
private Node head; private int size;
}
Результат компиляции и запуска приведен на рис. 6.
Изменим класс Vectors так, чтобы он работал с классами, реализующими интерфейс IVector, а также дополним примеры (табл. 13, 14). Таблица 13 — Измененный код vectors/Vectors.java
package vectors;
public class Vectors {
// Умножение вектора на число
public static IVector mul(IVector array, double number) { int size = array.size();
IVector r = new Array(size); try {
for (int i = 0; i < size; ++i) { r.set(i, array.get(i) * number);
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return r;
}
// Сложение двух векторов
public static IVector add(IVector array, IVector arg) throws IncompatibleVectorSizesException {
int size = array.size(); if (size != arg.size()) {
17
throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());
}
IVector r = new Array(size); try{
for (int i = 0; i < size; ++i) { r.set(i, array.get(i) + arg.get(i));
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return r;
}
// Скалярное произведение двух векторов
public static double mul(IVector array, IVector arg) throws IncompatibleVectorSizesException {
int size = array.size(); if (size != arg.size()) {
throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());
}
double r = 0; try {
for (int i = 0; i < size; ++i) {
r += array.get(i) * arg.get(i);
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return r;
}
}
Таблица 14 — Измененный код Task3.java
import vectors.*;
public class Task3 { // Точка входа
public static void main(String[] args) throws Exception { Array a = new Array(3), b = new Array(5);
ForwardList c = new ForwardList(3), d = new ForwardList(5); a.set(0, 2);
a.set(1, 1); a.set(2, 0); c.set(0, 2); c.set(1, 1); c.set(2, 0); b.set(0, 5); b.set(1, 4); b.set(2, 3); b.set(3, 2); b.set(4, 1); d.set(0, 5); d.set(1, 4); d.set(2, 3); d.set(3, 2); d.set(4, 1);
System.out.print("a: "); a.print();
18
System.out.print("b: "); b.print(); System.out.print("c: "); c.print(); System.out.print("d: "); d.print();
System.out.println("a.size(): " + a.size()); System.out.println("b.size(): " + b.size()); System.out.println("a.normEuclidean(): " + a.normEuclidean()); System.out.println("b.normEuclidean(): " + b.normEuclidean()); System.out.println("Vectors.mul(a, c): " + Vectors.mul(a, c)); System.out.println("Vectors.mul(b, d): " + Vectors.mul(b, d)); System.out.print("a * 2.5: ");
Vectors.mul(a, 2.5).print(); System.out.print("a + c: "); Vectors.add(a, c).print(); System.out.print("b + d: "); Vectors.add(b, d).print();
}
}
Результат компиляции и запуска приведен на рис. 7.
В результате выполнения лабораторной работы мы ознакомились с механизмом исключений и концепцией интерфейсов.
19