Результат компиляции и запуска представлен на рис. 2.
Рисунок 2 — Компиляция и запуск Task3.java с Array и Vectors Задание №3.
Получившиеся классы Array и Vectors разобьем на два файла с соответствующими именами, также объявим их как public. Создадим пакет vectors и добавим эти два класса туда, после чего добавим в начало соответствующих файлов принадлежность пакету package vectors; (рис. 3).
В файле Task3.java импортируем эти два файла import vectors.*;.
Рисунок 3 — Просмотр первых трех строк каждого java-файла, компиляция и запуск Task3.java
Задание №4.
В пакете 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
head = new Node(0, null); Node temp = head;
for (int i = 1; i < n; ++i) {
temp = (temp.next = new Node(0, null));
}
this.size = n; } else {
this.head = null; this.size = 0;
}
}
//Получение элемента по индексу public double get(int i) {
if (i >= 0 && i < size) { Node temp = head;
for (int j = 0; j < i; ++j) { temp = temp.next;
}
return temp.value;
}
return 0;
}
//Изменение значения элемента по индексу public void set(int i, double value) {
if (i >= 0 && i < size) { Node temp = head;
for (int j = 0; j < i; ++j) { temp = temp.next;
}
temp.value = value;
}
}
//Получение длины списка
public int size() { return size;
}
// Добавление элемента в список public void add(int i, double elem) {
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;
}
}
// Удаление элемента из списка public void remove(int i) {
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;
11
} else {
head = head.next;
}
--size;
}
}
//Нахождение нормы Евклида 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();
}
// Класс "Узел"
protected static class Node {
public Node(double value, Node next) { this.value = value;
this.next = next;
}
public double value; public Node next;
}
private Node head; private int size;
}
Таблица 9 — Код ForwardListTest.java
import vectors.ForwardList;
import vectors.VectorIndexOutOfBoundsException;
public class ForwardListTest {
public static void main(String[] args) throws VectorIndexOutOfBoundsException {
ForwardList list = new ForwardList(10); System.out.println("Source list"); list.print();
System.out.println("list.set(0, 1) and list.set(list.size() - 1,
10)!");
list.set(0, 1); list.set(list.size() - 1, 10); list.print();
System.out.println("list.get(0) = " + list.get(0)); System.out.println("list.get(list.size() - 1) = " +
list.get(list.size() - 1));
12