
Тюттерин_Яков_Z1411_Lab4
.pdf
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ
ОЦЕНКА
ПРЕПОДАВАТЕЛЬ
Доцент |
|
|
|
Чернышев С. А. |
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ЛАБОРАТОРНАЯ РАБОТА №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);
}