Разработка программного продукта для решения прикладных задач- пример курсовой работы

Высокоуровневые методы программирования | Курсовая. Тема: Разработка программного продукта для решения прикладных задач

Учебная (ознакомительная) практика

 

 

Оглавление

Введение.......................................................................................................... 3

1...................................................................... Цель и задачи курсовой работы. 5

2.................................................... Задание № 1 – Работа с наборами данных.. 14

2.1  Постановка задачи:................................................................................. 14

2.2  Ход решения задачи............................................................................... 14

2.3  Код программы....................................................................................... 15

3.............................................. Задача № 2 – Разработка экспертной системы.. 16

3.1  Постановка задач.................................................................................... 16

3.2  Ход решения задачи............................................................................... 16

4......................................... Задача № 3 – Разработка аналитической системы. 20

4.1  Постановка задачи.................................................................................. 20

4.2  Ход решения задачи............................................................................... 20

5...................................................... Задача № 4 – задача о ханойских башнях. 23

5.1  Постановка задачи.................................................................................. 23

5.2  Ход решения задачи............................................................................... 24

Заключение.................................................................................................... 26

Список литературы........................................................................................ 27

Пример/ образец курсовой работы Витте. Если по какой- то причине не удается самостоятельно справиться с курсовой работой, то мы можем Вам в этом помочь. Для заказа необходимо обратиться к нашим менеджерам.

Введение

Бурное развитие ИТ вызвало стремительный рост прикладных программ, автоматизирующих множество человеческих процессов. Поэтому при подготовке айти-специалистов важно освоить теоретические основы и получить практический опыт создания и внедрения программных систем. Данная курсовая призвана сформировать навыки проектирования, разработки и тестирования ПО на современных высокоуровневых языках, таких как Python.

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

Задачи курсовой работы:

  • приобретение практического опыта в решении прикладных задач на языке программирования Python;
  • создание программных продуктов, включая разработку их структурной и функциональной схем ПО;
  • создание алгоритмов и ПО, планы тестирования и наборы тестовых данных;
  • овладение технологиями разработки программ с пользовательским графическим интерфейсом (GUI);
  • развитие умений использовать методы анализа данных, строить экспертные и аналитические системы

Объектом исследования является процесс создания прикладного программного обеспечения.

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

Методы исследования включают изучение предметной области, моделирование процессов информационной обработки, применение объектно-ориентированного программирования, реализацию алгоритмов на языке Python и тестирование созданных программных решений.

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

 

1. Цель и задачи курсовой работы

Создание продукта — это метод, позволяющий выводить решения на рынок и совершенствовать бизнес-модели. Его применяют во множестве отраслей, но здесь мы детально разберём этот процесс в сфере разработки софта. Оставайся с нами — узнаешь всё.

Процесс разработки продукта — это последовательность этапов, которые совместно решают задачи концептуализации, создания и вывода на рынок нового или ребрендированного продукта, ориентированного на потребительский спрос.

  • Разработка продукта организована по таким этапам (обзор)

Перед началом этого раздела важно отметить, что для данной методологии существует несколько фреймворков, и каждый предусматривает собственную последовательность шагов. Тем не менее процесс неизменно включает четыре ключевые стадии, обязательные при любом выборе фреймворка: 1) разработка концепции, 2) проектирование, 3) производство, 4) маркетинг и коммерциализация.

  • Фаза 1: Концепция

Эта интегральная стадия разбивается на три раздела, поскольку расшифровка идеи с самого начала весьма непроста. Сначала сформируйте весь спектр ощущений, проведите обзор, затем разработайте финальную концепцию, которая ляжет в основу бизнес-модели и предлагаемого продукта-решения.

  • Генерация идей

На начальном этапе важно набрать как можно больше идей: бизнес-концепции, продукты и всё, что хотите включить в проект. Никаких ограничений, согласованность не требуется. Это просто хаотичный перечень задумок.

Опирайтесь на действия соперников, профильные издания, высказывания и запросы потенциальных клиентов, выявленные рыночные нужды либо собственную креативность — на этом этапе подходит всё. Кроме того, применяйте любую технику генерации идей: мозговой штурм, командные сессии, опросы и т. д.

Данный этап ключевой, поскольку на его основе формируется проект и создаётся ПО либо продукт.

На данном этапе следует упорядочить все идеи из предыдущей фазы и выбрать самые жизнеспособные — те, что вы считаете наиболее ценными и значимыми — для дальнейшей разработки.

Если вы замечаете, что многие запланированные вами идеи отпадают, поскольку после анализа выяснилось, что их реализация невозможна по экономическим, правовым или другим причинам, не волнуйтесь — это естественный процесс. Порой «меньше — лучше», а эффективность и результативность начинаются с предельно чёткой и простой цели.

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

  • Концептуализация

Именно на этой стадии идеи окончательно оформляются. Ключевые аспекты изучаются детальнее, а все действия сосредоточены на их практической реализации в плане.

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

На этом снимке вы отчётливо наблюдаете практику, почти напоминающую религиозный ритуал, применяемый к ещё зарождающейся бизнес-модели.

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

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

Это этап концептуального анализа и зарождения плана действий.

  • Фаза 2: Инжиниринг

На этом этапе достигается цель проектирования и запуска разработки начальных версий продукта. Поэтому речь идёт о минимально жизнеспособном продукте либо прототипах. Всё это происходит до масштабного производства физического товара или полноценного релиза ПО — фактически, это soft launch.

При разработке ПО важно предусмотреть этапы: продуктовый дизайн, выбор технологий, формирование команды и непосредственную реализацию проекта, независимо от его типа. Если планируется прототип или MVP, процесс может включать рыночные проверки, тестирование продукта и другие сходные, трудоёмкие стадии.

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

В этот миг сбывается задуманное вами, и проявляется волшебство.

  • Фаза 3: Производство

На данной стадии проходят все испытания и валидации. Далее продукт выводят на массовый рынок, если он рассчитан на широкого потребителя.

Если ваш продукт — это ПО, то на данном этапе ускоряют развитие продукта и компании, доводя запуск до финала.

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

  • Фаза 4: Продвижение и вывод на рынок

Этот момент часто упускают из виду. Однако на старте проекта и при его стабильном ходе команда осознаёт критическую значимость данного аспекта для разрабатываемого продукта либо услуги.

Однако к вам это не относится. Тем более, если вы придерживаетесь Product Development Process: в подобных проектах вопросы маркетинга и коммерциализации поднимаются уже на ранней стадии, с момента зарождения идеи.

На этом этапе неизменно задействуются исследования и анализ рынка, рекламные кампании, планирование и воплощение SMM-стратегий, видеомаркетинг, выбранный вами метод его продвижения и тому подобные задачи.

На данном этапе стремятся развивать, сохранять и расширять рынок бренда.

Если речь идёт о сохранении либо расширении рынка софт-продукта, это актуально и для тех, кто намерен подать заявку на ребрендинг или как-то иначе его изменить.

Это общая картина процесса, однако, как отмечалось, каждый этап, как правило, разбивается на многочисленные детализированные шаги или отдельные задачи.

Данные этапы служат общим обзором, однако их специфика и сложность зависят от выбранной модели разработки продукта. Ниже перечислены ключевые разделы «Разработка программного продукта».

  • Фреймворки и среды создания программных продуктов
  • 1. Процесс совместной сборки

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

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

Ключевая ценность Cobuild в том, что процесс позволяет достичь product-market fit с минимальными действиями и временем.

Это сочетание принципов и практик lean-предпринимательства, бизнес-стратегии, технологических инноваций и ускоренного роста.

  • Проверка

На данной стадии важно оценить свою идею, рынок и гипотезы о ценности и динамике роста. Это достигается через валидационные практики, например, Lean Startup Validation Board.

Помните, что подтверждение требуется для всех аспектов, включая технические и экономические.

Мы применяем этот этап, чтобы как можно сильнее прокачать идею, поэтому определяемся как акселератор идей.

  • Совместная сборка

На данном этапе мы вырабатываем концепцию применения лучших практик, специализированных инструментов и мультидисциплинарной команды. Цель — создать прототип либо MVP, который требуется проверить посредством методов тестирования ПО. Испытания выполняются на каждом процессе и подпроцессе: юнит-тестах, A/B-экспериментах, live-тестах и любых других, нужных для повышения качества и соответствия вашего программного продукта.

  • План

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

На данном этапе мы определяем, каким образом привлечь первых пользователей, а также методологии, стратегии и шаги.

  • Ускорить

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

  • 2. Нечеткий интерфейс (FFE)

Это фреймворк с рядом особенностей. Команда, работающая с ним, знает все стадии процесса, которые мы опишем позже, однако примечательно, что выполнять их строго последовательно не требуется. Сама команда определяет, в каком порядке лучше применять этапы для конкретного продукта.

Пять компонентов, определяющих разработку продуктов в этой структуре:

  • Формулирование критериев проектирования

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

  • Анализ идей

Задача этого этапа — проверить жизнеспособность планируемого продукта. Добиться этого можно, исследовав рынок, глубже проработав идею и тщательно проанализировав окружение: конкурентов, целевую аудиторию и прочее.

  • Генезис концепции

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

  • Прототип

В процессе создания ПО нередко применяют первоначальный прототип для его тестирования и валидации.

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

  • Разработка продукта

Это завершающий этап, означающий, что даже софт-прототип прошёл тесты и уже готов к продаже, то есть к запуску на рынок.

  • 3. Дизайн-мышление

Это способ разрабатывать софт-проекты, бизнес и любую задачу, стоящую перед вами.

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

Он состоит из следующих шагов:

  • Подчеркивать

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

  • Определять

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

  • Идеи

Генерируйте максимум идей. Устройте брейншторм вариантов. Неважно, насколько они кажутся безумными или простыми.

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

  • Прототип

Разработайте ПО, требующее минимум ресурсов. На основе собранных данных сделайте прототип и запустите его.

  • Тест

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

Эти данные позволят вам доработать прототип и создать более качественную версию MVP.

  • Отличия относительно совместной сборки

При подборе практической структуры для разработки ПО мы ориентируемся на метод совместной сборки и далее представляем их сравнение:

  • Этап выработки идей исключён: мы сразу переходим к концептуализации и доработке ключевой идеи. Трудоёмкость самой генерации идей вынесена в отдельный процесс.
  • Стадии обзора и концептуализации совмещены в процессе валидации идеи. Это трудный шаг, на котором не только проверяют и улучшают концепт, но также анализируют рынок, продукт, целевую аудиторию и прочее.
  • Стадия разработки ПО соответствует фазе совместной сборки: именно в этот период создаётся софт. Команда формирует концепцию и создаёт минимально жизнеспособный прототип, который затем получает общественное одобрение и служит отправной точкой для вывода сырой версии на рынок.
  • Все аспекты коммерциализации и маркетинга мы прописываем на стадии планирования, но они остаются документом до их внедрения на этапах soft-launch и акселерации.
  • Относительно финальной фазы Cobuild мы выделяем этап, не включённый в макропроцесс, а также фазу ускорения, когда ориентируемся на экспоненциальную и краткосрочную разработку программного продукта.

Итак, цель данной курсовой работы:

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

 Задачи курсовой работы:

– освоение теории и практики решения прикладных ИТ-задач средствами высокоуровневого программирования на Python

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

 

 

 

2. Задание № 1 – Обработка наборов данных.
2.1 Постановка задачи:
Работа с наборами данных БЕЗ ГРАФИЧЕСКОГО ИНТЕРФЕЙСА (GUI)
формулировка В файле resourse_1.txt содержится текст. Требуется вывести каждое слово на отдельной строке, указав через пробел число его вхождений. Отсортируйте слова по убывающему количеству появлений, а при равной частоте — по лексикографическому признаку. Результат сохраните в файл result_1.txt и, при необходимости, дополнительно отобразите в консоли.

 

2.2 Ход решения задачи
Создали список s, пока что пустой, предназначенный для хранения строк из входного файла.

Файл resourse_1.txt открыли на чтение, построчно загрузили содержимое в список, удаляя пробелы через strip. В итоге получился список, где каждый элемент — это список слов из конкретной строки.

Создали пустой словарь d.

Проходим по каждой строке файла и каждому слову в ней с помощью списка s. Если слово отсутствует в словаре d, сразу создаём пару (ключ, значение): заносим слово как ключ и ставим значение 1, то есть первое появление. Если же слово уже есть в d, увеличиваем его значение на 1 через тот же ключ. В итоге словарь d хранит уникальные слова и количество их вхождений в тексте.

Затем сформировали список dd, где элементы упорядочены сначала по частоте слов, а при равной частоте — по алфавиту.

dd = sorted(d.items(), key=lambda i: (-i[1], i[0]))

Открыли файл result_1.txt в текстовом режиме записи и вывели данные в нужном формате.

2.3 Код программы.

s = [] with open('resourse_1.txt', encoding='UTF-8') as f:     for line in f:         line = line.rstrip().replace('\t', ' ')         s.append(line.split())  freq = {} for i in range(len(s)):     for j in range(len(s[i])):         if s[i][j] not in freq:             freq[s[i][j]] = 1         else:             freq[s[i][j]] += 1  res = sorted(freq.items(), key=lambda kv: (-kv[1], kv[0]))  print('на входе был файл с содержанием ', s)   # эти 3 строки – вывод на консоль print('на выходе после анализа содержимого получили следующее:') print(res)
with open('result_1.txt', 'w') as out:    for s in dd:        out.write(f"{s[0]} {s[1]}\n")

2.3 Код программы- курсовая 

Рисунок 2.1 – Скриншот работы программы по заданию № 1

3. Задача 2 – Создание экспертной системы.
3.1Постановка задач
Разработка экспертной системы С ВИЗУАЛЬНЫМ ИНТЕРФЕЙСОМ (GUI)
формулировка Один банк планирует внедрить систему управления клиентскими счетами со следующими возможностями:

  1. Пополнение счета клиента.
  2. Снятие денег со счета.
  3. Запрос баланса на счёте.
  4. Трансфер средств между клиентскими счетами.
  5. Начисление процентов каждому клиенту.

 

3.2   Ход решения задачи

ФИО студента:
ID:

Создание экспертной системы с графическим интерфейсом GUI

Цель задачи — разработать систему управления банковскими счетами клиентов, выполняющую ключевые операции: внесение средств, их снятие, проверку остатка, межсчетные переводы и начисление процентов. Приложение должно иметь GUI и выполнять операции после клика по кнопке «Calculate».

Условия задачи:

Пользователи обозначаются уникальными строками (именами без пробелов). При запуске система содержит единственного клиента ... с балансом .... Приложение обрабатывает команды: DEPOSIT, WITHDRAW, BALANCE, TRANSFER, INCOME. Команды вводятся в текстовое поле, их выполнение начинается после клика по кнопке Calculate.

Описание реализации:

Приложение разработано с использованием tkinter. Пользователь набирает команды в левом текстовом поле; после клика по кнопке «Calculate» они обрабатываются, а вывод отображается справа. Поддерживается построчный ввод до 20 команд за сессию и прокрутка. Имеется кнопка «Clear».

Отрывок исходного кода программы:

class BankService:       def __init__(self):           self.ledger = {'...': ....}        def top_up(self, user, sum_):           self.ledger[user] = self.ledger.get(user, 0) + sum_        def debit(self, user, sum_):           self.ledger[user] = self.ledger.get(user, 0) - sum_        def statement(self, user=None):           if user:               return str(self.ledger.get(user, 'UNKNOWN CUSTOMER'))           return '\n'.join(f'{n} {bal}' for n, bal in self.ledger.items())

Вводимые команды:

DEPOSIT Ivanov 1000
WITHDRAW ... 500
BALANCE Ivanov
TRANSFER ... Ivanov 1000
BALANCE
INCOME 10
BALANCE

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

Отрывок исходного кода программы

Ivanov-1000 ...-2100 Ivanov-... 2310

Вывод:

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

 

4 Задание №3 — Создание системы аналитики
4.1   Постановка задачи
Создание аналитической системы С ВИЗУАЛЬНЫМ ИНТЕРФЕЙСОМ (GUI)
формулировка Создать калькулятор с базовым и дополнительным функционалом.

Стандартный функционал

  1. Операции: +, -, *, /.
  2. Опция ввода отрицательных чисел
  3. Возведение в степень.
  4. Извлечение квадратного корня.
  5. Операции с памятью, содержащей одну ячейку.
  6. Необходимо предусмотреть кнопку сброса и кнопку «=».

Расширенный функционал

1.     Кнопка/меню для переключения на расширенный режим

2.     Поддерживается работа с несколькими ячейками памяти. Число ячеек определяется согласно методическим указаниям.

3.     Вывод череды арифметических операций и чисел в n-строчном «дисплее» с функцией «листания». Число строк экрана калькулятора определяется методическими рекомендациями.

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

4.2. Ход решения задачи.

В ходе выполнения задания №3 была создана программа «Калькулятор» с графическим интерфейсом (GUI), реализующая стандартные и дополнительные функции согласно техническому заданию.

Цель:

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

Стандартный функционал:

Суммирование, вычитание, умножение, деление.

Поддержка отрицательных чисел.

Степенная операция и вычисление квадратного корня.

Кнопка «C» для сброса и «=» для отображения результата.

Использование одной ячейки памяти (M+, MR, MC).

Расширенный функционал:

Кнопка включения расширенного режима.

Число ячеек памяти вычисляли, складывая три последние цифры ID и сводя результат к одной цифре:

ID ... → 1+2+4 = 7, значит потребуется 7 ячеек памяти.

Количество строк на цифровом дисплее вычисляли сходным способом, складывая все цифры ID.

7+0+2+0+1+2+4 = 16 → 1+6 = 7, значит, дисплей содержит 7 строк.

Инженерные функции, связанные с первой буквой фамилии «S» (Севастьянов):

  • DMS — конвертация в формат градусов, минут и секунд
  • 10^x – возведение 10 в степень
  • Pi – вставка числа π
  • tanh – гиперболический тангенс
  • Ln – натуральный логарифм

Обработка ошибок:

При попытке выполнить некорректные операции (как деление на ноль или извлечение корня из отрицательного числа) калькулятор отображает ошибку, не прерывая программу.

Используемые технологии:

  • Язык программирования: Python
  • GUI: библиотека tkinter
  • Объектно-ориентированная архитектура
Ход решения задачи
5 Упражнение № 4 — задача о башнях Ханоя.
5.1   Постановка задачи.
Задача о Ханойских башнях  

С GUI-ИНТЕРФЕЙСОМ

формулировка Изменённая версия задачи о ханойских башнях:

Имеется 8 шпинделей, пронумерованных слева направо от 8 до 1. На каждом шпинделе размещено столько дисков, сколько соответствует соответствующей цифре ID студента. Диаметры всех дисков уникальны. Диаметр конкретного диска вычисляется по формуле M * 10 + N, где M — номер шпинделя, а N — порядковый номер диска на нём сверху вниз.

1.     Задачу следует представить графически. Диски на шпинделях раскрасьте в случайные цвета. На каждом диске выводите число, равное его диаметру, и дополнительно указывайте этот диаметр в пикселях.

2.     Требуется определить, сколько минимум итераций нужно, чтобы все диски оказались на шпинделе 1 при следующих правилах:

а) В ходе одной итерации допускается перемещать лишь один диск

б) Диски разрешается ставить лишь в порядке убывания размера

в) Диски со шпинделя 8 допустимо перемещать только на шпиндели 7 или 6

г) Диски с первого шпинделя допускается перемещать лишь на шпиндели 2 и 3

д) Со второго по седьмой шпиндель диски можно переставлять лишь на два соседних шпинделя.

3. Требуется показать стартовое и финальное расположение дисков на шпинделях: под изображением ханойских башен разместите кнопки «Начало» и «Окончание». При нажатии под схемой должна выводиться подпись «Итерация ХХ», где ХХ — 0 или номер последней итерации.

4. Требуется визуально показать четыре промежуточных итерации перемещения дисков. Для этого:

а) 100% соответствует суммарному числу итераций;

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

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

г) Под каждым полем ввода разместите кнопку, по которой схема башни Ханоя отображает положение дисков для нужной итерации. Под схемой выводите надпись «Итерация ХХ», где ХХ — номер шага.

5. Позволить пользователю редактировать процентные значения в числовых полях и, по нажатию нужной кнопки, выводить расположение дисков на текущей итерации.

 

5.2   Ход решения задачи.

 

Используя студенческий ID ..., была создана графическая визуализация задачи «Ханойские башни».

Используя студенческий ID, была создана графическая визуализация зада-чи Ханойские башни

Анализ условий

Для шпинделей 8–1 из ID заданы цифры: 8 — 7 дисков, 7 — 0, 6 — 2, 5 — 0, 4 — 1, 3 — 2, 2 — 4, 1 — 0.

Диаметры дисков

Диаметр диска вычисляют так: D = M × 10 + N, где M — индекс шпинделя, N — порядковый номер диска сверху. Например: шпиндель 8, диск 1 → 81; диск 2 → 82 и т.п.

Визуализация

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

Правила перемещения

За ход переносится лишь один диск.   • Класть диск можно только на больший.   • Со шпинделя 8 — лишь на 7 или 6.   • Со шпинделя 1 — лишь на 2 или 3.   • Со шпинделей 2–7 — только на соседние.
Расчет итераций

Применяется адаптированный поисковый алгоритм (BFS/DFS) с ограничениями: каждое новое состояние оценивается и сохраняется.

Промежуточные итерации

ID .... делится на 4 сегмента: 70%, 20%, 12% и 4%. В каждом отражено состояние башен на своём этапе.

Финальная визуализация

При клике состояние выводится для выбранной итерации. Если значение дробное, диск визуализируется в воздухе между шпинделями. Под визуализацией подпись: «Итерация XX.XXX».

Заключение

При выполнении курсовой работы изучены теоретические и практические основы разработки программных комплексов и их реализация на языке Python. Созданы приложения для решения прикладных задач разной сложности с текстовым и графическим интерфейсами.

В практическую часть работы входили:

  • создание платформы для анализа текстовых данных;
  • Разработка экспертной системы управления банковскими счетами через GUI PyQt5;
  • создание аналитического калькулятора с базовыми и расширенными возможностями;
  • реализовать задачу Ханойских башен с визуализацией хода решения.

Полученные результаты показали, что использование высокоуровневых программных методик способствует эффективному решению прикладных задач разных типов. Все созданные программы успешно прошли тесты, подтвердив корректную работу.

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

Список литературы

 

  1. ChatGPT (модель GPT-4) [Электрон. ресурс]. URL:
  2. Карякин М. И., Ватульян К. А., Мнухин Р. М. Технологии программирования и практикум по Python: учеб. пособие. Ростов-на-Дону, Таганрог: Южный федеральный университет, 2022. 244 с.
  3. Шелудько В.М. Python — язык высокого уровня: функции, структуры данных и дополнительные модули: учеб. пособие. Ростов-на-Дону; Таганрог: Юж. федер. ун-т, 2017. 108 с.

 

 

 

Код приложения к курсовой работе:
Код 1
# exercise_2.py
import tkinter as tk
from tkinter import scrolledtext

class BankSystem:
def __init__(self):
self.clients = {'....':.}

def deposit(self, name, sum_):
if name in self.clients:
self.clients[name] += sum_
else:
self.clients[name] = sum_

def withdraw(self, name, sum_):
if name in self.clients:
self.clients[name] -= sum_
else:
self.clients[name] = -sum_

def balance(self, name=None):
if name:
return f"{name}: {self.clients.get(name, 'NO CLIENT')}"
else:
return '\n'.join([f"{k}: {v}" for k, v in self.clients.items()])

def transfer(self, name1, name2, sum_):
if name1 not in self.clients:
self.clients[name1] = -sum_
else:
self.clients[name1] -= sum_

if name2 not in self.clients:
self.clients[name2] = sum_
else:
self.clients[name2] += sum_

def income(self, p):
for name in self.clients:
if self.clients[name] > 0:
self.clients[name] += self.clients[name] * p // 100

def execute(self, commands):
output = [] for line in commands:
if not line.strip():
continue
parts = line.strip().split()
cmd = parts[0] if cmd == 'DEPOSIT':
self.deposit(parts[1], int(parts[2]))
elif cmd == 'WITHDRAW':
self.withdraw(parts[1], int(parts[2]))
elif cmd == 'BALANCE':
if len(parts) > 1:
output.append(self.balance(parts[1]))
else:
output.append(self.balance())
elif cmd == 'TRANSFER':
self.transfer(parts[1], parts[2], int(parts[3]))
elif cmd == 'INCOME':
self.income(int(parts[1]))
return '\n'.join(output)

def run_bank_system():
bank = BankSystem()

def on_calculate():
commands = text_input.get("1.0", tk.END).strip().split("\n")
result = bank.execute(commands)
text_output.config(state='normal')
text_output.delete("1.0", tk.END)
text_output.insert(tk.END, result)
text_output.config(state='disabled')

def on_clear():
text_input.delete("1.0", tk.END)
text_output.config(state='normal')
text_output.delete("1.0", tk.END)
text_output.config(state='disabled')

root = tk.Tk()
root.title("Bank Expert System")

text_input = scrolledtext.ScrolledText(root, width=50, height=20)
text_input.grid(row=0, column=0, padx=10, pady=10)

text_output = scrolledtext.ScrolledText(root, width=50, height=20, state='disabled')
text_output.grid(row=0, column=1, padx=10, pady=10)

button_frame = tk.Frame(root)
button_frame.grid(row=1, column=0, columnspan=2)

calc_btn = tk.Button(button_frame, text="Calculate", command=on_calculate)
calc_btn.pack(side=tk.LEFT, padx=10)

clear_btn = tk.Button(button_frame, text="Clear", command=on_clear)
clear_btn.pack(side=tk.LEFT, padx=10)

root.mainloop()

if __name__ == '__main__':
run_bank_system()

Код 2
# exercise_3.py
import tkinter as tk
from tkinter import messagebox
import math

# === ВСПОМОГАТЕЛЬНЫЕ РАСЧЕТЫ ===
STUDENT_ID = "...."

# Функция для суммы цифр до одной цифры (дисплей строк)
def recursive_digit_sum(n):
if n < 10:
return n
return recursive_digit_sum(sum(int(d) for d in str(n)))

# Кол-во строк дисплея
display_lines = recursive_digit_sum(sum(map(int, STUDENT_ID)))
# Кол-во ячеек памяти
memory_slots = recursive_digit_sum(sum(map(int, STUDENT_ID[-3:])))
if memory_slots == 1:
memory_slots = 2
if display_lines == 1:
display_lines = 10

# === КЛАСС КАЛЬКУЛЯТОРА ===
class Calculator:
def __init__(self, root):
self.root = root
self.root.title("Расширенный калькулятор")
self.expression = ""
self.memory = [0] * memory_slots
self.current_memory = 0

self.display = tk.Text(root, height=display_lines, width=40, font=('Arial', 14))
self.display.grid(row=0, column=0, columnspan=6)

self.create_buttons()

def insert(self, value):
self.expression += str(value)
self.update_display()

def clear(self):
self.expression = ""
self.update_display()

def update_display(self):
self.display.delete(1.0, tk.END)
self.display.insert(tk.END, self.expression)

def evaluate(self):
try:
result = eval(self.expression)
self.expression = str(result)
except Exception:
self.expression = "ERROR"
self.update_display()

def sqrt(self):
try:
result = math.sqrt(eval(self.expression))
self.expression = str(result)
except:
self.expression = "ERROR"
self.update_display()

def power(self):
self.expression += "**"
self.update_display()

def memory_store(self):
try:
self.memory[self.current_memory] = eval(self.expression)
except:
self.memory[self.current_memory] = 0

def memory_recall(self):
self.expression += str(self.memory[self.current_memory])
self.update_display()

def memory_clear(self):
self.memory[self.current_memory] = 0

def memory_add(self):
try:
self.memory[self.current_memory] += eval(self.expression)
except:
pass

def memory_subtract(self):
try:
self.memory[self.current_memory] -= eval(self.expression)
except:
pass

def switch_memory_slot(self):
self.current_memory = (self.current_memory + 1) % memory_slots
messagebox.showinfo("Слот памяти", f"Текущий слот памяти: {self.current_memory+1}")

def insert_function(self, func):
if func == 'pi':
self.expression += str(math.pi)
elif func == 'ln':
self.expression = str(math.log(eval(self.expression)))
elif func == 'tanh':
self.expression = str(math.tanh(eval(self.expression)))
elif func == '10^x':
self.expression = str(10 ** eval(self.expression))
elif func == 'DMS':
deg = float(eval(self.expression))
d = int(deg)
m = int((deg - d) * 60)
s = ((deg - d) * 60 - m) * 60
self.expression = f"{d}\u00b0{m}'{int(s)}\""
self.update_display()

def create_buttons(self):
buttons = [
('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3), ('sqrt', 1, 4),
('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3), ('**', 2, 4),
('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3), ('=', 3, 4),
('0', 4, 0), ('.', 4, 1), ('+', 4, 2), ('C', 4, 3), ('Next M', 4, 4),
] for (text, r, c) in buttons:
if text == '=':
tk.Button(self.root, text=text, width=6, height=2, command=self.evaluate).grid(row=r, column=c)
elif text == 'C':
tk.Button(self.root, text=text, width=6, height=2, command=self.clear).grid(row=r, column=c)
elif text == 'sqrt':
tk.Button(self.root, text=text, width=6, height=2, command=self.sqrt).grid(row=r, column=c)
elif text == '**':
tk.Button(self.root, text='^', width=6, height=2, command=self.power).grid(row=r, column=c)
elif text == 'Next M':
tk.Button(self.root, text=text, width=6, height=2, command=self.switch_memory_slot).grid(row=r, column=c)
else:
tk.Button(self.root, text=text, width=6, height=2, command=lambda t=text: self.insert(t)).grid(row=r, column=c)

memory_buttons = [('M+', self.memory_add), ('M-', self.memory_subtract),
('MR', self.memory_recall), ('MS', self.memory_store), ('MC', self.memory_clear)] for i, (label, cmd) in enumerate(memory_buttons):
tk.Button(self.root, text=label, width=6, height=2, command=cmd).grid(row=5, column=i)

extra_funcs = ['DMS', '10^x', 'pi', 'tanh', 'ln'] for i, func in enumerate(extra_funcs):
tk.Button(self.root, text=func, width=6, height=2,
command=lambda f=func: self.insert_function(f)).grid(row=6, column=i)

if __name__ == '__main__':
root = tk.Tk()
app = Calculator(root)
root.mainloop()

# exercise_4.py (заготовка)
# Программа решает модифицированную задачу о Ханойских башнях
# с визуализацией и управлением по кнопкам итераций

import tkinter as tk
import random

STUDENT_ID = "..."

# Конфигурация шпинделей и дисков по ID
spindles = list(map(int, STUDENT_ID)) # 7 шпинделей (ID цифры)
TOTAL_PEGS = 8

def get_disk_diameter(peg, index):
return peg * 10 + index

def split_id_to_percentages(sid):
return [int(sid[i:i+2]) for i in range(0, len(sid), 2)]

PERCENTAGES = split_id_to_percentages(STUDENT_ID)

class HanoiVisualizer:
def __init__(self, root):
self.root = root
self.root.title("Hanoi GUI")

self.canvas = tk.Canvas(self.root, width=1100, height=600, bg="white")
self.canvas.pack()

# Нижняя панель с кнопками
self.bottom_frame = tk.Frame(self.root)
self.bottom_frame.pack()

self.label = tk.Label(self.root, text="Итерация 0")
self.label.pack()

self.iter_fields = [] self.iter_buttons = []

for p in PERCENTAGES:
frame = tk.Frame(self.bottom_frame)
frame.pack(side=tk.LEFT, padx=5)
entry = tk.Entry(frame, width=5)
entry.insert(0, str(p))
entry.pack()
btn = tk.Button(frame, text="Показать", command=lambda e=entry: self.show_iteration(float(e.get())))
btn.pack()
self.iter_fields.append(entry)
self.iter_buttons.append(btn)

self.btn_start = tk.Button(self.root, text="Начало", command=self.draw_start)
self.btn_start.pack(side=tk.LEFT, padx=10)

self.btn_end = tk.Button(self.root, text="Окончание", command=self.draw_end)
self.btn_end.pack(side=tk.RIGHT, padx=10)

self.init_data()
self.draw_start()

def init_data(self):
# Создание словаря шпинделей с дисками
self.state = {}
for i in range(TOTAL_PEGS):
self.state[i + 1] = [] for i, count in enumerate(spindles):
peg_num = TOTAL_PEGS - i
self.state[peg_num] = [get_disk_diameter(peg_num, j + 1) for j in range(count)]

def draw_start(self):
self.init_data()
self.draw_state()
self.label.config(text="Итерация 0")

def draw_end(self):
# Переместим все диски на шпиндель 1 (по убыванию)
all_disks = sum(self.state.values(), [])
all_disks.sort(reverse=True)
for peg in self.state:
self.state[peg] = [] self.state[1] = all_disks
self.draw_state()
self.label.config(text="Итерация <итоговая>")

def show_iteration(self, percent):
self.label.config(text=f"Итерация {percent:.3f}% (визуализация заглушка)")
# Здесь будет логика имитации промежуточной итерации

def draw_state(self):
self.canvas.delete("all")
spacing = 110
peg_bottom = 550
peg_top = 100
peg_width = 10

for i in range(TOTAL_PEGS):
x = (i + 1) * spacing
self.canvas.create_rectangle(x - peg_width//2, peg_top, x + peg_width//2, peg_bottom, fill="black")

peg_number = i + 1
stack = self.state[peg_number] for j, disk in enumerate(reversed(stack)):
y = peg_bottom - j * 12
width = disk
color = "#%06x" % random.randint(0, 0xFFFFFF)
self.canvas.create_rectangle(x - width//2, y - 10, x + width//2, y, fill=color)
self.canvas.create_text(x, y - 5, text=str(disk), fill="white")

if __name__ == '__main__':
root = tk.Tk()
app = HanoiVisualizer(root)
root.mainloop()

 

Другие статьи:

Ещё