Результат компиляции и запуска представлен на рис. 2.
Получившиеся классы Array и Vectors разобьем на два файла с соответствующими именами, также объявим их как public. Создадим пакет vectors и добавим эти два класса туда, после чего добавим в начало соответствующих файлов принадлежность пакету package vectors; (рис. 3).
В файле Task3.java импортируем эти два файла import vectors.*;.
Рисунок 3 — Просмотр первых трех строк каждого java-файла, компиляция и запуск Task3.java
В пакете vectors опишем следующие классы исключений:
—IncompatibleVectorSizesException — при несоответствии длин
векторов;
6
— VectorIndexOutOfBoundsException — при выходе за границы вектора.
Добавим логику исключения в методе сложения и методе скалярного произведения двух векторов: происходит исключение
IncompatibleVectorSizesException, если векторы разного размера.
Также добавим логику исключения в методе получения и методе изменения значения элемента вектора: происходит исключение
VectorIndexOutOfBoundsException, если индекс выходит за границы.
Коды классов приведены в табл. 3, 4, 5, 6, 7. Таблица 3 — Код Task3.java
import vectors.*;
public class Task3 { // Точка входа
public static void main(String[] args) throws Exception { Array a = new Array(3), b = new Array(5);
a.set(0, 2); a.set(1, 1); a.set(2, 0); b.set(0, 5); b.set(1, 4); b.set(2, 3); b.set(3, 2); b.set(4, 1);
System.out.print("a: "); a.print(); System.out.print("b: "); b.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, a): " + Vectors.mul(a, a)); System.out.println("Vectors.mul(b, b): " + Vectors.mul(b, b)); System.out.print("a * 2.5: ");
Vectors.mul(a, 2.5).print(); System.out.print("a + a: "); Vectors.add(a, a).print(); System.out.print("b + b: "); Vectors.add(b, b).print();
}
}
Таблица 4 — Код vectors/Array.java package vectors;
public class Array {
//Конструктор public Array(int n) {
data = new double[n];
}
//Получение элемента по индексу
public double get(int i) throws VectorIndexOutOfBoundsException { if (i >= 0 && i < data.length) {
7
return data[i];
}
throw new VectorIndexOutOfBoundsException("VectorIndexOutOfBoundsException", i);
}
// Установка значения элемента по индексу public void set(int i, double value) throws
VectorIndexOutOfBoundsException {
if (i >= 0 && i < data.length) { data[i] = value;
return;
}
throw new VectorIndexOutOfBoundsException("VectorIndexOutOfBoundsException", i);
}
//Получение размера вектора public int size() {
return data.length;
}
//Нахождение нормы Евклида public double normEuclidean() {
double r = 0;
for (double x : data) { r += x * x;
}
return Math.sqrt(r);
}
//Вывод вектора на экран public void print() {
if (data.length > 0) { System.out.print(data[0]);
}
for (int i = 1; i < data.length; ++i) { System.out.print(" " + data[i]);
}
System.out.println();
}
//Данные
private final double[] data;
}
Таблица 5 — Код vectors/Vectors.java package vectors;
public class Vectors {
// Умножение вектора на число
public static Array mul(Array array, double number) { int size = array.size();
Array 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;
}
8
// Сложение двух векторов
public static Array add(Array array, Array arg) throws IncompatibleVectorSizesException {
int size = array.size(); if (size != arg.size()) {
throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());
}
Array 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(Array array, Array 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;
}
}
Таблица 6 — Код vectors/IncompatibleVectorSizesException.java package vectors;
public class IncompatibleVectorSizesException extends Exception {
public IncompatibleVectorSizesException(String message, int firstSize, int secondSize) {
super(message); this.firstSize = firstSize; this.secondSize = secondSize;
}
public int getFirstSize() { return firstSize;
}
public int getSecondSize() { return secondSize;
}
private int firstSize, secondSize;
}
9
Таблица 7 — Код vectors/VectorIndexOutOfBoundsException.java package vectors;
public class VectorIndexOutOfBoundsException extends Exception { public VectorIndexOutOfBoundsException(String message, int index) {
super(message); this.index = index;
}
public int getIndex() { return index;
}
private int index;
}
Результат компиляции и запуска приведен на рис. 4.
Рисунок 4 — Компиляция и запуск Task3.java (с механизмом исключений) Задание №5.
Создадим односвязный список ForwardList со следующими методами:
—методы получения и изменения значения элемента списка по
индексу;
—метод получения длины списка;
—метод вычисления нормы Евклида;
—метод добавления элемента;
—метод удаления элемента.
Основной ForwardList и тестирующий ForwardListTest файлы приведены в табл. 8, 9.
Таблица 8 — Код vectors/ForwardList.java package vectors;
public class ForwardList { // Конструктор
public ForwardList(int n) { if (n > 0) {
10