Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра программной инженерии и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №3
по дисциплине «Разработка Java-приложений управления телекоммуникациями»
Выполнил: студент 3-го курса дневного отделения группы ИКПИ-85
Коваленко Леонид Александрович Преподаватель:
доцент кафедры ПИиВТ Белая Татьяна Иоанновна
Санкт-Петербург
2020
Цель работы
Ознакомиться с механизмом исключений в Java и концепцией интерфейсов.
Ход работы
Задание №1.
Изменим класс Vector (из прошлой работы), оставив в нем следующие методы:
—методы доступа к элементам вектора (получение и изменение);
—метод получения размера вектора (числа элементов);
—метод нахождения нормы Евклида;
—метод вывода вектора на экран.
Само название класса изменим на Array. Результат изменения кода приведен в табл. 1.
Таблица 1 — Код Task3.java с классом Array
public class Task3 { // Точка входа
public static void main(String[] args) { 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());
}
}
class Array {
//Конструктор public Array(int n) {
data = new double[n];
}
//Получение элемента по индексу public double get(int i) {
return data[i];
}
//Установка значения элемента по индексу
2
public void set(int i, double value) { data[i] = value;
}
//Получение размера вектора 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;
}
Результат компиляции и запуска приведен на рис. 1.
Рисунок 1 — Компиляция и запуск Task3.java с Array Задание №2.
Создадим отдельный класс Vectors, который будет содержать статические методы работы с векторами1:
—метод умножения вектора на скаляр;
—метод сложения двух векторов;
—метод нахождения скалярного произведения двух векторов. Код приведен в табл. 2.
1 Здесь под вектором понимается любой упорядоченный контейнер данных (будь то массив или список), который позволяет получить число элементов и обратиться к любому из них по индексу.
3
Таблица 2 — Код Task3.java с классами Array и Vectors
public class Task3 { // Точка входа
public static void main(String[] args) { 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, b): " + Vectors.mul(a, b)); System.out.println("Vectors.mul(b, a): " + Vectors.mul(b, a)); System.out.println("Vectors.mul(a, a): " + Vectors.mul(a, a)); System.out.print("a * 2.5: ");
Vectors.mul(a, 2.5).print(); System.out.print("a + b: "); Vectors.add(a, b).print(); System.out.print("b + a: "); Vectors.add(b, a).print(); System.out.print("a + a: "); Vectors.add(a, a).print();
}
}
class Array {
//Конструктор public Array(int n) {
data = new double[n];
}
//Получение элемента по индексу public double get(int i) {
return data[i];
}
//Установка значения элемента по индексу public void set(int i, double value) {
data[i] = value;
}
//Получение размера вектора
public int size() { return data.length;
}
// Нахождение нормы Евклида public double normEuclidean() {
double r = 0;
for (double x : data) { r += x * x;
}
return Math.sqrt(r);
4
}
//Вывод вектора на экран 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;
}
class Vectors {
// Умножение вектора на число
public static Array mul(Array array, double number) { int size = array.size();
Array r = new Array(size);
for (int i = 0; i < size; ++i) { r.set(i, array.get(i) * number);
}
return r;
}
// Сложение двух векторов
public static Array add(Array array, Array arg) { Array minSizeArr = array, maxSizeArr = arg; if (minSizeArr.size() > maxSizeArr.size()) {
Array t = minSizeArr; minSizeArr = maxSizeArr; maxSizeArr = t;
}
Array r = new Array(maxSizeArr.size());
for (int i = 0, len = maxSizeArr.size(); i < len; ++i) { r.set(i, maxSizeArr.get(i));
}
for (int i = 0, len = minSizeArr.size(); i < len; ++i) { r.set(i, r.get(i) + minSizeArr.get(i));
}
return r;
}
// Скалярное произведение двух векторов
public static double mul(Array array, Array arg) { int len = Math.min(array.size(), arg.size()); double r = 0;
for (int i = 0; i < len; ++i) {
r += array.get(i) * arg.get(i);
}
return r;
}
}
5