Курсовая работа: Использование классических алгоритмов обработки данных при создании приложения

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

4.3 Описание классов

Основным классом является Student. В нем описаны все атрибуты для сущности «студент». Студент имеет номер зачетной книжки, имя, фамилию, отчество и дату рождения. Все атрибуты имеют тип данных строка, кроме даты рождения. Дата рождения определена как объект стандартного класса java.time.LocalDate. Этот класс предоставляет удобный интерфейс для работы с датами, включая получение дня, месяца, года, сравнение, преобразование в строку с нужным форматированием.

Исходя из предположения, что все данные (номер зачетной книжки, ФИО и дата рождения) являются обязательными для внесения студентов в список, создаем в классе один конструктор Конструктор в контексте языка Java - это специальный метод, который позволяет создавать новый экземпляр класса, т. е. объект с типом данных класса, содержащего такой конструктор. Конструкторы могут иметь разный набор параметров и разную логику создания объекта в зависимости от нужд реализации., который позволит нам создавать нового студента с указанием всех четырех атрибутов.

Для нашего класса переопределяем метод equals(), который будем в дальнейшем использовать в операциях доступа к элементам и операциях поиска. Обращаю внимание, что в качестве параметра для метода используем элемент типа java.lang.Object, а не типа Student. Это является правильной практикой всегда по причине того, что целый ряд методов во фреймворке коллекций Java используют в своей реализации метод equals() из класса java.lang.Object, и необходимо переопределять именно его. В нашем же случае, причины несколько другие, а именно:

- для исполнения заявленной нами ранее цели расширяемости приложения, т. к. использование метода equals() с параметром типа Object делает классы и интерфейсы более универсальными и «правильными»;

- в Java присутствует полиморфизм со связыванием времени исполнения, что значит, что мы потенциально можем получать доступ к методу equals() из класса Student через переменные других типов, например, типа Object.

Обычно вместе с методом equals() рекомендуется переопределять метод hashCode(). Однако, в нашем случае такой необходимости нет, так как мы не планируем использовать объекты класса Student в стандартных реализациях коллекций типа Set (например, hashMap).

Наконец, переопределяем метод toString(), который возвращает строковую репрезентацию объекта типа Student в удобочитаемом виде. Этот метод используется для тестирования и отладки приложения.

Класс StudentList является реализацией интерфейса StudentListInterface и содержит все методы работы со списком.

Метод add(Student e) обрабатывает нужные нам исключения NullPointerException() и IllegalArgumentException() на случай, если в него передается пустой или неверный параметр. Затем он вызывает метод добавления элемента в конец двусвязного списка addLast(Student e), который в точности воспроизводит ранее описанный в настоящем отчет алгоритм добавления элемента (см. раздел «1.3 Вставка элемента в двусвязный список»).

Метод remove(Object o) также обрабатывает исключения. Затем итерирует каждый элемент и проверяет его на равенство аргументу. Если натолкнулись на искомый элемент, следует удалить его. Это делается вызовом метода unlink(Node x), который реализует удаление текущего элемента из двусвязного списка, как описано в разделе «1.4 Удаление элемента из двусвязного списка».

Метод find(StudentChecks sc) реализует основной алгоритм поиска в двусвязном списке из раздела «1.2 Поиск элемента в двусвязном списке». При этом поиск осуществляется через метод test(Student s) из функционального интерфейса StudentChecks. Это значит, что в программе мы можем использовать любые алгоритмы проверки элемента, например, искать по номеру зачетной книжки, или по совпадению даты рождения. Возвращает значение типа список студентов StudentList. Там мы будем получать отфильтрованные списки для нашего приложения.

Имеются дополнительный метод clear(). Он специфичен для выбранного языка программирования Java. В нем производятся следующие действия:

- обнуляются все ссылки для каждого узла;

- обнуляются ссылки на первый и последний узлы списка;

- размер списка size устанавливается в значение 0.

Это позволяет полностью освободить ресурсы приложения и сделать неиспользуемые объекты списка доступными для автоматического сборщика мусора виртуальной машины Java.

Класс StudentListApp является главным классом приложения, содержит точку входа в приложение (метод main). В этом классе создаются все элементы пользовательского интерфейса посредством использования библиотеки Swing. Также для целей демонстрации в этом классе создается примерный предварительно заполненный список студентов. После запуска приложения над ним можно проводить все предусмотренные манипуляции.

Остальные не описанные выше методы и классы приложения являются вспомогательными и не заслуживают внимания, так как находятся вне предмета рассмотрения настоящей работы.

5. Тестирование программного средства

Программа упакована в исполняемый exe-файл «StudentListApp.exe» для демонстрации работы в ОС Windows.

Главное окно приложения приведено на рисунке 10. Оно содержит сразу короткий демонстрационный список студентов. Все кнопки имеют всплывающие подсказки.

Рисунок 10 - Главное окно приложения «Student List App»

При нажатии на кнопку «Добавить» получаем предложение заполнить данные для добавляемого студента, как показано на рисунке 11 ниже

Рисунок 11 - Попытка добавления пустой записи

После заполнения данных студента как на рисунке 12 ниже, его можно добавить с список. На рисунке 13 показан результат успешного добавления.

Рисунок 12 - Заполненный данные студента

Рисунок 13 - Результат добавления студента в список

После добавления можно найти студента в списке. Для примера осуществим поиск студента по номеру зачетной книжки, как показано на рисунке ниже.

Рисунок 14 - Результат поиска студента по кнопке «Найти»

Если пользователь желает вывести весь список, нужно нажать кнопку «Показать все». После этого будет отображен весь список.

Можно выделить нужного студента (при необходимости можно предварительно осуществить поиск нужного студента) и удалить его из списка нажатием кнопки «Удалить». Продемонстрировано на рисунке 15. Удалим студента с номером зачетной книжки «666114» KorablevaNatalia. На экран приложения выводится информация о факте удаления студента из списка.

Рисунок 15 - Результат удаления студента из списка

Закончив работу со списком, можно экспортировать его в файл по кнопке «Экспорт». Нужно выбрать место сохранения для файла списка (рисунок 16).

Рисунок 16 - Выбор файла для сохранения списка

В результате CSV-файл сохранен на диске D. На рисунке 17 показано место сохранения файла, на рисунке 18 - содержимое файла списка студентов.

Рисунок 17 - Место сохранения файла на компьютере

Рисунок 18 - Содержимое экспортированного списка студентов

При необходимости можно удалить всех студентов из списка, нажав на кнопку «Очистить список», как показано на рисунке 19.

Рисунок 19 - Удаление всех студентов из списка

Созданный ранее файл можно использовать для загрузки из него списка студентов. Продемонстрируем результат импорта списка студентов из файла на рисунках 20 и 21 ниже. Если файл не в формате CSV или формат данных неверный, то данные загрузить не получится.

Рисунок 20 - Окно выбора файла для импорта списка

Рисунок 21 - Успешная загрузка списка студентов из файла

Для пользователя также выводится информационное сообщение об успешной загрузке файла.

Вывод: программа позволяет решить все основные задачи ведения списка студентов, позволяет создать его и экспортировать в файл. Также данные списка можно загрузить из файла.

Заключение

В процессе выполнения курсовой работы проведен анализ структур данных и алгоритмов для цели практической реализации приложения для работы со списком студентов, которое позволило бы создавать список, добавлять и удалять записи, а также сохранять результат работы в файл и считывать файл для загрузки списка студентов в программу.

Для разработки такой программы были изучены и реализованы следующие алгоритмы:

- добавление, удаление элементов сущности;

- поиск в списке сущностей;

- добавление элементов в список (и загрузка элементов из файла);

- вывод элементов (или сохранение в файл).

Вышеназванные алгоритмы для программного средства реализованы на языке Java, который выбран после анализа альтернатив в виде языков C и C#. Язык С не подходит в полной мере для программирования в рамках парадигмы ООП, которая максимально подходит для реализации списка одинаковых сущностей. Язык C# не имеет свободных бесплатных инструментов, а также не поддерживает кросс-платформенное программирование, которое позволит демонстрировать программы на любой операционной системе. Язык Java не имеет таких ограничений, имеет простые и удобные стандартные инструменты создания графического интерфейса. Дополнительно, автор работы имеет практический интерес в изучении языка Java и обладает набором компетенций, которые позволят реализовать дополнительный функционал приложения и сосредоточится на разработке алгоритмов работы с двусвязным списком.

В качестве реализации списка выбран двусвязный список, так как обладает возможностями для расширения и оптимизации функционала приложения. Например, в случае необходимости ускорения поиска в сортированном списке можно итерировать не только с начала, но и с конце списка, т.к. двусвязный список хранит в себе информацию как о своем первом узле, так и о последнем. В остальном выбор связности списка имеет случайный характер, так как односвязные списки не предоставляют никаких преимуществ по сравнению с двусвязными, кроме сокращенного объема хранения. Но как мы раньше указывали, требования в реализации программы не предполагают оптимизацию объема хранения в связи с тем, что список не будет большим (нет персистентности и весь список целиком хранится в оперативной памяти).

Сложность разработанных алгоритмов тривиальна и понятна даже на интуитивном уровне. Сложность основных алгоритмов работы с двусвязным списком оценена в О-нотации в главе «1 Анализ структуры данных связный список и алгоритмов его обработки».

Таким образом, поставленные инженерные задачи выполнены, цель курсовой работы достигнута.

Список использованных источников

алгоритм программирование язык данные

1 Керниган, Брайан У., Пайк, Роб. Практика программирования.: Пер. с англ. - М.: Издательский дом "Вильяме", 2004. - 288 с.

2 Payne, Bryson. Learn Java the easy way: a hands-on introduction to programming. - San Francisco : No Starch Press, Inc., 2018. - 288 c.

3 ВикипедиЯ Свободная энциклопедия [Электронный ресурс] - Режим доступа: https://ru.wikipedia.org/wiki/Абстрактный_тип_данных. - 22.04.2020

4 Скиена С. Алгоритмы. Руководство по разработке. - 2-е изд.: Пер. с англ. - СПб.: БВХ-Петербург, 2011. - 720 с.: ил.

5 Курносов М.Г., Берлизов Д.М. Алгоритмы и структуры обработки информации. - Новосибирск: Параллель, 2019. - 211 с.

Приложение (обязательное)

Программный код

Файл «Student.java»

import java.time.LocalDate;

import java.time.format.DateTimeFormatter;

import java.time.format.FormatStyle;

import java.lang.Object;

class Student {

public Student(int gradeBook, String surname, String firstName, String secondName, LocalDate birthDate) {

super();

this.gradeBook = gradeBook;

this.surname = surname;

this.firstName = firstName;

this.secondName = secondName;

this.birthDate = birthDate;

}

private int gradeBook;

private String surname;

private String firstName;

private String secondName;

private LocalDate birthDate;

public int getGradeBook() {

return gradeBook;

}

public String getSurname() {

return surname;

}

public String getFirstName() {

return firstName;

}

public String getSecondName() {

return secondName;

}

public LocalDate getBirthDate() {

return birthDate;

}

/**

* Так как номер зачетной книжки в реализации списка является уникальным,

* считаем объекты равными при равенстве номеров зачетной книжки

*/

@Override

public boolean equals(Object obj) {

if (obj instanceof Student) {

Student st = (Student) obj;

return (getGradeBook() == st.getGradeBook());

} else {

return false;

}

}

@Override

public String toString() {

return getGradeBook() + ";" + getSurname() + ";" + firstName + ";" + secondName + ";" + birthDate;

}

public static Student parseString(String str) {

String[] data = str.split(";");

LocalDate bd = LocalDate.parse(data[4]);

return new Student(Integer.parseInt(data[0]), data[1], data[2], data[3], bd);

}

public String[] getColumnsArray() {

String[] colArr = new String[5];

colArr[0] = Integer.toString(gradeBook);

colArr[1] = surname;

colArr[2] = firstName;

colArr[3] = secondName;

colArr[4] = birthDate.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT));

return colArr;

}

}

Файл «StudentChecks.java»

@FunctionalInterface

public interface StudentChecks {

boolean test(Student s);

}

Файл «StudentList.java»

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

class StudentList implements StudentListInterface {

int size = 0;

/**

* Указатель на первый узел.

*/

Node first;

/**

* Указатель на последний узел.

*/

Node last;

Источник: https://otherreferats.allbest.ru/download/1261417/