Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тюттерин_Яков_Z1411_Lab4

.pdf
Скачиваний:
1
Добавлен:
07.01.2025
Размер:
495.77 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

Доцент

 

 

 

Чернышев С. А.

 

 

 

 

 

должность, уч. степень, звание

 

подпись, дата

 

инициалы, фамилия

ЛАБОРАТОРНАЯ РАБОТА №4

по дисциплине: Технологии программирования

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ гр.

Z1411

 

Тюттерин Я. Н.

 

 

 

 

 

подпись, дата

 

инициалы, фамилия

Санкт-Петербург,2023

Лабораторная работа № 4. Работа с файлами Вариант 2

1)Имеется файл с целочисленными значениями, разделенные пробелами. Найдите их сумму, среднеарифметическое, максимальное и минимальное значение.

Код проекта:

import java.util.List;

public interface FileReader { List<Integer> read();

}

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List;

public class FileReaderImpl implements FileReader {

private final String path;

public FileReaderImpl(String path) { this.path = path;

}

@Override

public List<Integer> read() { try {

final List<String> lines = Files.readAllLines(Path.of(path)); final List<Integer> result = new ArrayList<>();

for (String line : lines) {

result.addAll(Arrays.stream(line.split("\s+")).map(Integer::parseInt).toList());

}

return result;

} catch (IOException e) {

throw new FileReaderException(e.getMessage(), e);

}

}

}

public class FileReaderException extends RuntimeException {

public FileReaderException(String message) { super(message);

}

public FileReaderException(String message, Throwable cause) { super(message, cause);

}

}

public interface FileParser { long sum();

long avg(); long min(); long max();

}

import java.util.List;

public class FileParserImpl implements FileParser {

private final List<Integer> nums;

public FileParserImpl(String path) {

this.nums = new FileReaderImpl(path).read();

}

@Override

public long sum() {

return nums.stream().mapToLong(v -> v).sum();

}

@Override

public long avg() {

return (long)nums.stream().mapToLong(v -> v).average().orElseThrow(() -> new FileReaderException("Файл пуст"));

}

@Override

public long min() {

return nums.stream().min(Long::compare).orElseThrow(() -> new FileReaderException("Файл пуст"));

}

@Override

public long max() {

return nums.stream().max(Long::compare).orElseThrow(() -> new FileReaderException("Файл пуст"));

}

}

Тесты:

import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows;

public class FileParserImplTest {

private FileParserImpl fileParser;

@BeforeEach

public void init() {

fileParser = new FileParserImpl("test/resources/test.txt");

}

@Test

public void checkSumFileNumsTest() { assertEquals(496, fileParser.sum());

}

@Test

public void checkAvgFileNumsTest() { assertEquals(6, fileParser.avg());

}

@Test

public void checkMinFileNumsTest() { assertEquals(1, fileParser.min());

}

@Test

public void checkMaxFileNumsTest() { assertEquals(122, fileParser.max());

}

@Test

public void checkFileEmptyWithThrow() {

fileParser = new FileParserImpl("test/resources/empty.txt"); assertThrows(FileReaderException.class, () -> fileParser.max()); assertThrows(FileReaderException.class, () -> fileParser.min()); assertThrows(FileReaderException.class, () -> fileParser.avg());

}

}

Результат выполнения тестов:

2) Реализовать класс «Портфель инвестора» куда могут добавляться экземпляры классов акций и облигаций компаний (Сбербанк, Газпром, Лукойл) различного количества. Портфель инвестора должен иметь возможность возвращать количество и полную суммарную стоимость всех активов в задаваемой валюте (рубль, китайский юань, доллар США) акций и облигаций с учётом количества в портфеле, действующей котировки, и курса заданной валюты. Требуется реализовать возможность вывода текущих состояний объектов в терминал и функционал для записи текущего состояния экземпляра класса «Портфель инвестора» в json-файл и txt-файл, а также восстановления состояния из файла. Используйте концепцию работы через интерфейс, чтобы абстрагироваться от реализации сохранения и загрузки данных.

Код проекта:

package ru.guap.investor.model;

import java.util.Objects;

public class Bond {

private String company; private double cost; //rub

protected Bond() {

}

public Bond(String company, double cost) { this.company = company;

this.cost = cost;

}

public double getCost() { return cost;

}

public String getCompany() { return company;

}

@Override

public boolean equals(Object o) { if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false; Bond bond = (Bond) o;

return Double.compare(cost, bond.cost) == 0 && Objects.equals(company, bond.company);

}

@Override

public int hashCode() {

return Objects.hash(company, cost);

}

}

package ru.guap.investor.model;

public enum Currency {

RUBLES(0, " "), DOLLAR(89.69, "$"), YUAN(12.58, "¥");

private final double course; //from rubles private final String val;

Currency(double course, String val) { this.course = course;

this.val = val;

}

public double getCourse() { return course;

}

public String getVal() { return val;

}

}

package ru.guap.investor.model;

public enum FileType {

JSON, TXT

}

package ru.guap.investor.model;

import java.util.ArrayList; import java.util.List; import java.util.Objects;

public class InvestorPortfolio {

private List<Bond> bonds; private List<Stock> stocks; private String path;

private FileType fileType;

protected InvestorPortfolio() {

}

public InvestorPortfolio(List<Bond> bonds, List<Stock> stocks, String path, FileType fileType) {

this.bonds = bonds; this.stocks = stocks; this.path = path; this.fileType = fileType;

}

public InvestorPortfolio(FileType fileType, String path) { this.fileType = fileType;

this.path = path;

this.stocks = new ArrayList<>(); this.bonds = new ArrayList<>();

}

public void addStock(Stock stock) { stocks.add(stock);

}

public void addBound(Bond bond) { bonds.add(bond);

}

public Pair sumBonds() {

return new Pair(bonds.size(), bonds.stream().mapToDouble(Bond::getCost).sum());

}

public Pair sumStocks() {

return new Pair(stocks.size(), stocks.stream().mapToDouble(Stock::getCost).sum());

}

public FileType getFileType() { return fileType;

}

public String getPath() { return path;

}

public List<Bond> getBonds() { return new ArrayList<>(bonds);

}