Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Готовые отчеты (2020) / Java. Лабораторная работа 3.pdf
Скачиваний:
79
Добавлен:
29.01.2021
Размер:
960.64 Кб
Скачать

Результат компиляции и запуска представлен на рис. 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