Файл: Операции, производимые с данными (Типы структур данных и предметная область).pdf
Добавлен: 30.03.2023
Просмотров: 364
Скачиваний: 2
СОДЕРЖАНИЕ
1.1 Типы структур данных и предметная область
1.2 Линейный односвязный список
1.3 Алгоритмы для производимых операций
2. Программная реализация информационно-справочной системы для работы с данными
2.1 Инструменты для разработки
2.3 Руководство пользователя и тестирование программы
Если по условиям поиска не было найдено ни одного вклада, появляется окно с соответствующим сообщением (рисунок 22).
Рисунок 20 – Окно программы после поиска вклада по названию тарифа
Рисунок 21 – Окно программы после поиска вклада по дате открытия
Рисунок 22 – Информационное окно после неудачного поиска
При нажатии на кнопку «Считать данные из файла» в левой части окна выводятся все сохраненные в файле вклады (рисунок 23). Предварительно все добавленные вклады должны быть сохранены в файле. Сохранение происходит после нажатия на кнопку «Сохранить в файл». Вид файла с вкладами приведен на рисунке 24.
Рисунок 23 – Чтение вкладов из файла
Рисунок 24 – Файл «Вклады.txt», содержащий информацию о считываемых вкладах
Пользователь имеет возможность получить все данные, содержащиеся в системе. Для этого необходимо нажать на кнопку «Получить информацию о данных». Подробные данные находятся в файле «Вклады.txt»; пользователь, считав данные из этого файла (кнопка «Считать данные из файла») и нажав на кнопку «Получить информацию о данных», может узнать количество добавленных вкладов (рисунок 25).
Таким образом, был разработан удобный и интуитивно понятный для пользователя интерфейс.
Рисунок 25 – Окно программы с информацией о данных
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсовой работы была изучена и проанализирована учебно-методическая документация, учебная литература и интернет по выбранной теме.
Были найдены всевозможные способы достижения поставленной цели, анализ которых позволил выбрать наиболее оптимальный способ, для достижения которого был разработан необходимый набор универсальных функций.
В теоретической части работы было получено представление о понятиях структур данных, а также об основных операциях, производимых с данными. Выявлены ключевые особенности проектирования классов, позволяющие вводить информацию, хранить её в файле, а также осуществлять модификацию данных.
В практической части работы выполнено проектирование приложения, предназначенного для автоматизации решения задач по хранению, обработке и выдачи информации о банковских вкладах. На основании результатов проектирования разработано приложение, обладающее заданной функциональностью. Проведено тестирование приложения, по результатам которого в приложении устранены выявленные ошибки. Разработаны контрольные примеры, которые можно использовать как для освоения приемов работы с приложением, так и для контроля работоспособности приложения при его установке. Применение структур данных (в частности, линейных односвязных списков) и широкие возможности языка Python позволяет создавать программы, имеющие требуемую функциональность.
Программа имеет понятный графический интерфейс, выводит все необходимые пояснения и подсказки, является законченной и удобной для использования. Таким образом, цель курсовой работы достигнута в полном объеме.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Лутц М. Изучаем Python, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 1280 с.
- Златопольский Д.М. Основы программирования на языке Python. – М.: ДМК Пресс, 2017. – 284 с.
- Лутц М. Программирование на Python, том I, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 992 с.
- Лутц М. Программирование на Python, том II, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 992 с.
- Гэддис Т. Начинаем программировать на Python. – 4-е изд.: Пер. с англ. – СПб.: БХВ-Петербург, 2019. – 768 с.
- Лучано Рамальо Python. К вершинам мастерства. – М.: ДМК Пресс, 2016. – 768 с.
- Свейгарт, Эл. Автоматизация рутиных задач с помощью Python: практическое руководство для начинающих. Пер. с англ. – М.: Вильямc, 2016. – 592 с.
- Рейтц К., Шлюссер Т. Автостопом по Python. – СПб.: Питер, 2017. – 336 с.: ил. – (Серия «Бестселлеры O’Reilly»).
- Любанович Билл Простой Python. Современный стиль программирования. – СПб.: Питер, 2016. – 480 с.: – (Серия «Бестсепперы O’Reilly»).
- Федоров, Д. Ю. Программирование на языке высокого уровня Python : учебное пособие для прикладного бакалавриата / Д. Ю. Федоров. – 2-е изд., перераб. и доп. – Москва : Издательство Юрайт, 2019. – 161 с. – (Бакалавр. Прикладной курс). – ISBN 978-5-534-10971-9. – Текст: электронный // ЭБС Юрайт [сайт]. – URL: https://urait.ru/bcode/437489 (дата обращения: 13.06.2020).
- Шелудько, В. М. Основы программирования на языке высокого уровня Python: учебное пособие / В. М. Шелудько. – Ростов-на-Дону, Таганрог: Издательство Южного федерального университета, 2017. – 146 c. – ISBN 978-5-9275-2649-9. – Текст: электронный // Электронно-библиотечная система IPR BOOKS: [сайт]. – URL: http://www.iprbookshop.ru/87461.html (дата обращения: 13.06.2020). – Режим доступа: для авторизир. пользователей
- Шелудько, В. М. Язык программирования высокого уровня Python. Функции, структуры данных, дополнительные модули: учебное пособие / В. М. Шелудько. – Ростов-на-Дону, Таганрог: Издательство Южного федерального университета, 2017. – 107 c. – ISBN 978-5-9275-2648-2. – Текст: электронный // Электронно-библиотечная система IPR BOOKS: [сайт]. – URL: http://www.iprbookshop.ru/87530.html (дата обращения: 13.06.2020). – Режим доступа: для авторизир. пользователей
- Доусон М. Программируем на Python. – СПб.: Питер, 2014. – 416 с.
- Прохоренок Н.А. Python 3 и PyQt. Разработка приложений. – СПб.: БХВ-Петербург, 2012. – 704 с.
- Пилгрим Марк. Погружение в Python 3 (Dive into Python 3 на русском)
- Прохоренок Н.А. Самое необходимое. – СПб.: БХВ-Петербург, 2011. – 416 с.
- Основные структуры данных [Электронный ресурс] / URL: https://habr.com/ru/post/422259 (Дата обращения: 20.06.2020)
- Словари [Электронный ресурс] / URL: https://devpractice.ru/python-lesson-9-dict Словари (Дата обращения: 22.06.2020)
- Списки, кортежи и словари [Электронный ресурс] / URL: https://pythonru.com/osnovy/2-python-dlja-data-science-struktury-dannyh Списки, кортежи и словари (Дата обращения: 24.06.2020)
- Стиль кода в языке Python [Электронный ресурс] / URL: https://pep8.ru/doc/pep8 (Дата обращения: 27.06.2020)
- Our Documentation | Python.org [Электронный ресурс] / URL: https://www.python.org/doc/ (Дата обращения: 25.06.2020)
- The Python Tutorial [Электронный ресурс] / URL: https://docs.python.org/3/tutorial/ (Дата обращения: 26.06.2020)
ПРИЛОЖЕНИЯ
ИСХОДНЫЙ КОД ПРОГРАММЫ
LinkedList.py
class ListNode: # класс для узла односвязного списка
def __init__(self, data): # конструктор класса
self.data = data # хранимые данные
self.next = None # указатель на следующий элемент
return
def has_value(self, value): # метод для сравнения переданного значения с хранимыми данными
if self.data == value:
return True
else:
return False
def show(self): # метод для вывода данных в строковом виде
return str(self.data)
class LinkedList: # класс односвязного списка
def __init__(self): # конструктор класса
self.head = None # голова списка (верхний элемент)
self.tail = None # хвост списка (оставшаяся часть списка)
return
def append(self, data): # метод добавления в конец списка
if not isinstance(data, ListNode): # если тип добавляемого элемента не соответствует узлу списка
data = ListNode(data) # создать новый узел на основе этого элемента
if self.head is None: # если список пуст
self.head = data # добавить элемент как голову списка
else:
self.tail.next = data # иначе добавить его следующим за последним элементом хвоста
self.tail = data
#print(self.head.data)
return
def append_asc_order(self, data): # метод добавления в конец списка (с упорядочиванием по возрастанию)
new_node = ListNode(data) # новый узел с переданными данными
if self.head is None: # если список пуст, то добавить в голову
self.head = new_node
return
temp = self.head # взять голову списка как текущий узел
if temp.data > data: # если элемент текущего узла больше переданного
# разместить переданный узел в голову списка
new_node.next = temp
self.head = new_node
return
# пока не достигнут конец списка
while temp.next:
if temp.next.data > data: # если элемент следующего узла больше переданного, прервать цикл
break
temp = temp.next # двигаться далее по списку
# поменять местами добавленный узел с последним просмотренным для упорядочения
new_node.next = temp.next
temp.next = new_node
def length(self): # метод, возвращающий длину списка
count = 0
current_node = self.head
while current_node is not None: # проход по списку до конца с увеличением длины после каждого просмотренного элемента
count = count + 1
current_node = current_node.next
return count
def __iter__(self): # реализация итератора списка (для обхода в цикле for)
current = self.head
while current is not None:
yield current # возврат генератора при обходе списка
current = current.next
def search(self, equal, x): # метод поиска значения, сравнимого с x при помощи функции equal
info = '' # строка, содержащая представления всех найденных значений
current = self.head
while current != None:
if equal(current.data, x):
info += str(current.data) + '\n'
current = current.next
return info
def delete(self, data_id): # метод удаления элемента из списка по номеру
current_id = 0 # текущий номер узла
current_node = self.head # текущий узел
previous_node = None # предыдущий узел
while current_node is not None:
if current_id == data_id: # если найден узел с заданным номером
if previous_node is not None: # и это не первый узел (голова)
previous_node.next = current_node.next # переназначить ссылку на следующий элемент за текущим предыдущему
else:
self.head = current_node.next # иначе удалить голову (переназначить ссылку на следующий элемент за текущим голове)
return
# следующая итерация:
previous_node = current_node # сделать предыдущим текущий
current_node = current_node.next # текущим - следующим
current_id = current_id + 1 # увеличить номер узла
return
main.py
from tkinter import *
from tkinter import messagebox
import datetime as d
from LinkedList import *
# класс, описывающий банковский вклад
class Deposit:
bank_name = '' # название банка
tariff_name = '' # название тарифа
currency = '' # валюта
deposit_date = d.date(2019, 1, 1) # дата открытия вклада по умолчанию - 01.01.2019
time = 0 # срок вклада
percent = 0 # процентная ставка
conditions = '' # условия вклада
def __init__(self, n, a, cur, y, t, p, c): # параметризованный конструктор класса, присваивает полям переданные значения аргументов
self.bank_name = n
self.tariff_name = a
self.currency = cur
self.deposit_date = y
self.time = t
self.percent = p
self.conditions = c
def __str__(self): # строковое представление класса
return '{0}; {1}; {2}; {3}; {4}; {5}; {6}\
'.format(self.bank_name,self.tariff_name,self.currency,self.deposit_date,self.time,self.percent,self.conditions)
def show(self): # метод для вывода на список формы
return 'Название банка: {0}, название тарифа: {1}, валюта: {2}, дата открытия \
вклада: {3}, срок вклада: {4} г., процентная ставка: {5}%, условия вклада: {6}\
'.format(self.bank_name,self.tariff_name,self.currency,self.deposit_date,self.time,self.percent,self.conditions)
def tar_eq(self, n): # функция для проверки соответствия названия тарифа переданному значению
return self.tariff_name == n
def date_eq(self, date): # функция для проверки соответствия даты открытия вклада переданному значению
return self.deposit_date == date
# функции для сравнения вкладов (по названию банка):
def __lt__(self, fl):
return self.bank_name < fl.bank_name
def __gt__(self, fl):
return self.bank_name > fl.bank_name
# класс, описывающий информацию о вкладах
class Bank:
catalogue = LinkedList() # список вкладов
filename = 'Вклады.txt' # имя файла
# конструктор класса - создает односвязный список вкладов
def __init__(self):
catalogue = LinkedList()
# метод, который формирует строку, содержащую информацию о данных
def __str__(self):
return 'Данные расположены в файле {0}. Всего добавлено {1} вкладов'.format(self.filename, self.catalogue.length())
# метод, который выводит данные в новый файл
def show(self, filename):
with open(filename, 'w', encoding = 'utf-8') as f:
for b in self.catalogue:
f.writelines(b.show() + '\n')
f.close()
# метод для нахождения вкладов по названию тарифа или дате открытия
def getDepositsOf(self, a):
info = '' # строка с информацией обо всех найденных вкладах
if var.get() == 1: # если выбран пункт "по дате открытия"
numberstr = ''.join(a.split('.')) # сконвертировать введенную строку с датой в формате ДД.ММ.ГГГГ в строку с датой в формате ДДММГГГ
deposit_date = d.datetime.strptime(numberstr, "%d%m%Y").date() # конвертация строки с датой в тип даты
Deposits = self.catalogue.search(Deposit.date_eq, deposit_date) # поиск по дате в каталоге
elif var.get() == 0: # если выбран пункт "по названию тарифа"
Deposits = self.catalogue.search(Deposit.tar_eq, a) # поиск по названию тарифа в каталоге
if Deposits is not None: # если вклады были найдены
info += Deposits + '\n' # дописать их в конец строки с результатом
else:
info = '' # иначе строка с результатом пуста
return info
# создание объекта класса базы вкладов
Bank = Bank()
# функция добавления в список
def addItem():
# получение параметров из списка элементов:
bank_name = ents['Название банка']
tariff_name = ents['Название тарифа']
currency = ents['Валюта']
deposit_date = d.date(int(ents['Год открытия вклада'].get()), int(ents['Месяц'].get()), int(ents['День'].get()))
time = int(ents['Срок вклада'].get())
percent = int(ents['Процентная ставка'].get())
conditions = ents['Условия вклада']
# создание и добавление объекта класса для вклада в односвязный список:
b = Deposit(bank_name.get(), tariff_name.get(), currency.get(), deposit_date, time, percent, conditions.get())
#Bank.catalogue.append(b)
Bank.catalogue.append_asc_order(b)
# вставка элементов односвязного списка в список на форме:
lbox.delete(0, END)
for b in Bank.catalogue:
lbox.insert(END, b.show())
# очистка полей ввода:
bank_name.delete(0, END)
tariff_name.delete(0, END)
currency.delete(0, END)
conditions.delete(0, END)
# функция удаления из списка
def deleteItem():
select = list(lbox.curselection()) # получить выделенный элемент
if select: # если было что-то выделено, то удалить все выделенные элементы из односвязного списка и из списка на форме
select.reverse()
for i in select:
print('Удален элемент списка с индексом ', i)
lbox.delete(i)
Bank.catalogue.delete(i)
else: # иначе сообщить об ошибке
messagebox.showinfo('Ошибка!', 'Выберите вклад из списка!')
# функция вывода информации о данных
def printInfo():
messagebox.showinfo('Информация о данных', Bank)
# функция вывода информации о вкладах по введенным данным
def printDepositsByInput():
catalogue = Bank.getDepositsOf(ent.get())
if catalogue.strip() != '':
messagebox.showinfo('Найденные вклады: ', Bank.getDepositsOf(ent.get()))
else:
messagebox.showinfo('Ошибка!', 'Вкладов не найдено!')
# функция сохранения в файл
def saveInFile():
f = open('Вклады.txt', 'w', encoding = 'utf-8') # открыть файл на запись