Файл: Операции, производимые с данными (Типы структур данных и предметная область).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 363

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Если по условиям поиска не было найдено ни одного вклада, появляется окно с соответствующим сообщением (рисунок 22).

Рисунок 20 – Окно программы после поиска вклада по названию тарифа

Рисунок 21 – Окно программы после поиска вклада по дате открытия

Рисунок 22 – Информационное окно после неудачного поиска

При нажатии на кнопку «Считать данные из файла» в левой части окна выводятся все сохраненные в файле вклады (рисунок 23). Предварительно все добавленные вклады должны быть сохранены в файле. Сохранение происходит после нажатия на кнопку «Сохранить в файл». Вид файла с вкладами приведен на рисунке 24.

Рисунок 23 – Чтение вкладов из файла

Рисунок 24 – Файл «Вклады.txt», содержащий информацию о считываемых вкладах

Пользователь имеет возможность получить все данные, содержащиеся в системе. Для этого необходимо нажать на кнопку «Получить информацию о данных». Подробные данные находятся в файле «Вклады.txt»; пользователь, считав данные из этого файла (кнопка «Считать данные из файла») и нажав на кнопку «Получить информацию о данных», может узнать количество добавленных вкладов (рисунок 25).

Таким образом, был разработан удобный и интуитивно понятный для пользователя интерфейс.

Рисунок 25 – Окно программы с информацией о данных

ЗАКЛЮЧЕНИЕ

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

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

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

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


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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Лутц М. Изучаем Python, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 1280 с.
  2. Златопольский Д.М. Основы программирования на языке Python. – М.: ДМК Пресс, 2017. – 284 с.
  3. Лутц М. Программирование на Python, том I, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 992 с.
  4. Лутц М. Программирование на Python, том II, 4-е издание. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 992 с.
  5. Гэддис Т. Начинаем программировать на Python. – 4-е изд.: Пер. с англ. – СПб.: БХВ-Петербург, 2019. – 768 с.
  6. Лучано Рамальо Python. К вершинам мастерства. – М.: ДМК Пресс, 2016. – 768 с.
  7. Свейгарт, Эл. Автоматизация рутиных задач с помощью Python: практическое руководство для начинающих. Пер. с англ. – М.: Вильямc, 2016. – 592 с.
  8. Рейтц К., Шлюссер Т. Автостопом по Python. – СПб.: Питер, 2017. – 336 с.: ил. – (Серия «Бестселлеры O’Reilly»).
  9. Любанович Билл Простой Python. Современный стиль программирования. – СПб.: Питер, 2016. – 480 с.: – (Серия «Бестсепперы O’Reilly»).
  10. Федоров, Д. Ю. Программирование на языке высокого уровня Python : учебное пособие для прикладного бакалавриата / Д. Ю. Федоров. – 2-е изд., перераб. и доп. – Москва : Издательство Юрайт, 2019. – 161 с. – (Бакалавр. Прикладной курс). – ISBN 978-5-534-10971-9. – Текст: электронный // ЭБС Юрайт [сайт]. – URL: https://urait.ru/bcode/437489 (дата обращения: 13.06.2020).
  11. Шелудько, В. М. Основы программирования на языке высокого уровня Python: учебное пособие / В. М. Шелудько. – Ростов-на-Дону, Таганрог: Издательство Южного федерального университета, 2017. – 146 c. – ISBN 978-5-9275-2649-9. – Текст: электронный // Электронно-библиотечная система IPR BOOKS: [сайт]. – URL: http://www.iprbookshop.ru/87461.html (дата обращения: 13.06.2020). – Режим доступа: для авторизир. пользователей
  12. Шелудько, В. М. Язык программирования высокого уровня Python. Функции, структуры данных, дополнительные модули: учебное пособие / В. М. Шелудько. – Ростов-на-Дону, Таганрог: Издательство Южного федерального университета, 2017. – 107 c. – ISBN 978-5-9275-2648-2. – Текст: электронный // Электронно-библиотечная система IPR BOOKS: [сайт]. – URL: http://www.iprbookshop.ru/87530.html (дата обращения: 13.06.2020). – Режим доступа: для авторизир. пользователей
  13. Доусон М. Программируем на Python. – СПб.: Питер, 2014. – 416 с.
  14. Прохоренок Н.А. Python 3 и PyQt. Разработка приложений. – СПб.: БХВ-Петербург, 2012. – 704 с.
  15. Пилгрим Марк. Погружение в Python 3 (Dive into Python 3 на русском)
  16. Прохоренок Н.А. Самое необходимое. – СПб.: БХВ-Петербург, 2011. – 416 с.
  17. Основные структуры данных [Электронный ресурс] / URL: https://habr.com/ru/post/422259 (Дата обращения: 20.06.2020)
  18. Словари [Электронный ресурс] / URL: https://devpractice.ru/python-lesson-9-dict Словари (Дата обращения: 22.06.2020)
  19. Списки, кортежи и словари [Электронный ресурс] / URL: https://pythonru.com/osnovy/2-python-dlja-data-science-struktury-dannyh Списки, кортежи и словари (Дата обращения: 24.06.2020)
  20. Стиль кода в языке Python [Электронный ресурс] / URL: https://pep8.ru/doc/pep8 (Дата обращения: 27.06.2020)
  21. Our Documentation | Python.org [Электронный ресурс] / URL: https://www.python.org/doc/ (Дата обращения: 25.06.2020)
  22. 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') # открыть файл на запись