Академический Документы
Профессиональный Документы
Культура Документы
КУРСОВАЯ РАБОТА
Выполнили: обучающийся
группы 05-057-23-17
Қарсұлтанов Төрегелді
Бауржанұлы
(подпись преподавателя)
Астана 2023
НАО «Казахский агротехнический исследовательский университет им.
С. Сейфуллина»
Факультет «Компьютерные системы и профессиональное обучение»
Кафедра «Информационные системы»
Образовательная программа 6B06101 - «Программная инженерия»
ЗАДАНИЕ
на курсовую работу
обучающийся Қарсұлтанов Төрегелді Бауржанұлы
Литература:
1. Томас Х. Кормен "Алгоритмы: построение и анализ". (Электронный
вариант) Доступно по ссылке: http://www.r-5.org/files/books/computers/algo-
list/common/Cormen_Leiserson_Rivest_Stein-Introduction_to_Algorithms-
RU.pdf
2. "Introduction to Algorithms" (Том Кормен, Чарльз Лейзерсон, Рональд
Ривест, Клиффорд Штайн) Доступно по ссылке:
https://e-maxx.ru/bookz/files/cormen.pdf
3. "Algorithms" (Роберт Седжвик, Кевин Уэйн) Доступно по ссылке:
https://algs4.cs.princeton.edu/home/
4."The Algorithm Design Manual" (Стивен Скиена) Доступно по ссылке:
https://balka-book.com/files/2018/02_02/10_50/u_files_store_3_658271.pdf
5."Data Structures and Algorithms in Python" (Майкл Т. Гудрич, Роберт
Лафоре)Доступно по ссылке: https://pythonz.net/books/31/
2
Дата выдачи задания: 25.10.2023 г.
Дата защиты работы:
Руководитель работы: старший преподаватель, PhD доктор Бельдеубаева Ж. Т.
Задание приняли к исполнению Қарсұлтанов Төрегелді Бауржанұлы
ВВЕДЕНИЕ ……………………………………………………………… 5
3
1 ТЕОРЕТИЧЕСКИЕ ОСНОВЫ АЛГОРИТМИЗАЦИИ И
ПРОГРАММИРОВАНИЯ………………………………………………... 5
1.1 Алгоритмы………………………………………………………………… 6
1.2 Линейные структуры……………………………………………………... 7
1.3 Развлетвления…………………………………………………………….. 7
1.4 Циклы……………………………………………………………………... 8
1.5 Одномерные массивы……………………………………………………. 8
1.6 Двумерные массивы……………………………………………………… 9
ЗАКЛЮЧЕНИЕ…………………………………………………………... 11
ПРАКТИЧЕСКАЯ ЧАСТЬ………………………………………………. 13
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И
ЛИТЕРАТУРЫ…………………………………………………………… 31
ВВЕДЕНИЕ
4
Курс "Алгоритмы, структуры данных и программирование" имеет
важное значение в обучении обучающийся 1 курса факультета программной
инженерии, специализирующихся в области информационных технологий.
Данный курс служит введением в такие понятия, как сортировка, поиск,
различные структуры данных (массивы, связанные списки, деревья, хэш-
таблицы), а также основные принципы алгоритмизации, такие как жадные
алгоритмы и динамическое программирование.
Понимание сложности и оптимизации алгоритмов становится
краеугольным камнем учебной программы по разработке программного
обеспечения. Этот курс дает студентам теоретические знания, а также
основные практические навыки, необходимые для разработки
высокопроизводительных и эффективных программ.
Работая над проектами, студенты не только применяют полученные
знания, но и развивают свои аналитические и творческие навыки. Такой опыт
помогает студентам развить не только понимание алгоритмов, но и
способность находить инновационные решения реальных проблем, что
является ключом к успеху в области информационных технологий.
Студенты, окончившие этот курс, выходят на рынок труда с глубоким
пониманием алгоритмов и способностью эффективно применять их при
создании программного обеспечения. Эти навыки сделают их
востребованными ИТ-специалистами, которые не только способны решать
сложные задачи, но и являются источником инновационных технологических
решений.
Конечно, мы также обсудим вопросы, связанные с образованием и
технологиями.
Технологии играют важную роль в современном образовании,
трансформируя процесс обучения и расширяя границы знаний. Интеграция
технологий в учебную программу не только улучшает процесс обучения, но
и обогащает его.
Интерактивные учебные платформы, онлайн-курсы и виртуальные
лаборатории обеспечивают доступ к информации из любой точки мира, делая
образование более глобальным и доступным. Технологии помогают
персонализировать обучение, учитывая индивидуальные потребности
студентов и создавая комфортную учебную среду.
Помимо обучения использованию технологий, важно также развивать
навыки критического мышления, чтобы адаптировать информацию из разных
источников. Это помогает студентам быть гибкими и компетентными в мире,
где технологии играют важную роль во всех аспектах жизни.
Курс готовит студентов к работе в динамичной ИТ-среде и
воспитывает профессионалов, способных творчески подходить к решению
проблем, выявлять новые возможности и вносить значительный вклад в
развитие информационных технологий.
Кроме того, курс также затрагивает вопросы, связанные с образованием
и технологиями. Технологии играют значительную роль в современном
5
образовании, трансформируя процессы обучения и расширяя границы
знаний.
Интеграция технологий в учебную программу не только улучшает
процесс обучения, но и обогащает его. Интерактивные учебные платформы,
онлайн-курсы и виртуальные лаборатории обеспечивают доступ к
информации из любой точки мира, делая образование более глобальным и
доступным. Технологии помогают персонализировать обучение, учитывая
индивидуальные потребности студентов и создавая комфортную учебную
среду.
Помимо обучения использованию технологий, важно также развивать
навыки критического мышления для адаптации информации из различных
источников. Это помогает студентам быть гибкими и компетентными в мире,
где технологии играют важную роль во всех аспектах жизни.
1.1 Алгоритмы
Алгоритм (algorithm) – это формально описанная вычислительная
процедура, получающая исходные данные (input), называемые также входом
алгоритма или его аргументом, и выдающая результат вычислений на выход
(output).
Алгоритмы строятся для решения тех или иных вычислительных задач
(computational problems). Формулировка задач описывает, каким требованием
должно удовлетворять решение задачи, а алгоритм, решающий эту задачу,
находит объект, этим требованием удовлетворяющий [1].
"Многие проблемы в информатике можно представить в терминах
структур данных и алгоритмов. Принятие решения о том, какой алгоритм или
структуру данных следует использовать в конкретной ситуации, может быть
сложной задачей, требующей глубокого понимания контекста проблемы и
потенциальных пространств решений" .
Алгоритмы представляют собой последовательность шагов,
разработанных для решения определенной проблемы или выполнения
определенной задачи [3].
Алгоритмы как последовательность шагов или инструкций,
предназначенных для решения конкретной задачи [4].
Алгоритмы могут быть представлены в виде логически упорядоченных
действий, которые оперируют с данными, и приводят к желаемому
результату или решению задачи. Выделяются важность понимания, как
алгоритмы работают и какие задачи они могут решать в рамках
компьютерной науки и программирования [4].
6
"Лучший алгоритм - это тот, который может решить вашу проблему
эффективно и результативно" это общее принятая цитата используется
большинства программистов.
1.3 Разветвления
Ветвящийся алгоритм представляет собой вычислительную процедуру,
в рамках которой предусмотрена возможность ветвления или отклонения.
Эта характеристика позволяет осуществлять различные последовательности
операций в зависимости от условий и входных данных. Такие алгоритмы
обеспечивают разнообразные маршруты выполнения и способны
адаптироваться к различным сценариям в соответствии с логическими
условиями. В качестве условия в разветвляющемся алгоритме может быть
использовано любое понятное исполнителю утверждение, которое может
соблюдаться (быть истинным) или не соблюдаться (быть ложным). Такое
утверждение может быть выражено как словами, так и формулой. Обычно
различают два вида условий простые и составные. Простым условием
называется выражение, составленное из двух арифметических выражений
или двух текстовых величин, связанных одним из знаков <( меньше), < =
( меньше или равно),>( больше),> = ( больше или равно), = ( равно),<>( не
равно). Составные условия состоят из двух или более простых, связанных
логическими операциями И, ИЛИ, НЕ. [3]
Cоздание качественного программного обеспечения требует времени и
усилий.
Тщательная разработка высококачественного программного продукта
требует времени, подобно тому, как вино требует времени для созревания.
7
Подход к разработке программного продукта, аналогичный процессу
создания качественного вина, подразумевает, что для достижения
оптимальных результатов нужно уделить время и тщательность.
Как и в случае выращивания винограда и создания вина, труд и
терпение также играют важную роль в создании качественного
программного обеспечения. Только через постоянную работу, усердие и
время можно достичь оптимальных результатов. Это утверждение
подчеркивает, что важно не только написать код, но и уделить время для его
разработки, тестирования и улучшения, чтобы создать программу, которая
будет успешно работать и в долгосрочной перспективе оставаться
актуальной и эффективной.
Хорошее программное обеспечение должно скрывать сложность для
пользователя, предоставляя простой и интуитивно понятный интерфейс,
несмотря на сложность внутренней реализации.
1.4 Циклы
Существует циклический алгоритм для эффективной обработки
повторяющихся задач, при котором необходимо выполнять одну и ту же
инструкцию снова и снова. Цикл алгоритма обеспечивает механизм для
повторения блока транзакций до тех пор, пока выполняются логические
условия, определенные до начала цикла. Большинство реально
существующих алгоритмов являются хешированными, то есть имеют
линейные сегменты, ветви, известное количество итераций и итерационных
циклов. В связи с этим трудно сразу скомпилировать алгоритм в полной
форме. Поэтому для составления сложных алгоритмов рекомендуется
использовать суть нисходящего проектирования программ (метод пошаговой
доработки, метод последовательной доработки): сначала без детального
изучения отдельных частей решается общая структура алгоритма. Затем
создаются отдельные блоки, которые не были подробно описаны на
предыдущем шаге. Поэтому на каждом этапе разработки уточняется
реализация частей алгоритма, то есть решаются более простые задачи [4].
Использование циклов таким образом, чтобы код был легко читаемым
и поддерживаемым, что способствует более эффективной разработке и
управлению проектами. Преждевременная оптимизация может привести к
созданию неэффективного и сложного кода. Циклы как к одной из составных
частей программирования, eё широкие аспекты разработки ПО и общие
принципы эффективного и реального программирования [11].
9
Матрицы и алгоритмы: Важность двумерных массивов хорошо видна в
алгоритмах, связанных с матрицами. Умножение матриц, транспонирование,
поиск путей в графах и многие другие алгоритмы важно реализовать с
помощью двумерных массивов.
Двумерные массивы играют важную роль в программировании,
предоставляя удобный способ организации и манипулирования данными с
двумерной структурой, что делает их важным инструментом в самых разных
областях, где требуется работать с двумерными данными [20].
10
ЗАКЛЮЧЕНИЕ
12
2 ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ РАЗРАБОТКИ
АЛГОРИТМОВ
13
Рисунок 1 – Блок-схема
14
x
4 1+ ⅇ 2 485165196.4097903
5 |1+ ⅇ 2 | 485165196.4097903
x
6 √|1+ⅇ | 22008.24935220888
x
2 x
7 x+2*x -30
8 |x +2 ⋅ x| 30
9 √3 |x +2⋅ x| 3.1072325059538586
2
10 2⋅sin ( x ) +2 ⋅ x 0.07689446876383138
√|1+ⅇ | 2x
2
11 2⋅sin ( x ) +2 ⋅ x 3.18412697471769
√3 | x+2 ⋅ x|
√|1+ⅇ | 2x
Задание №2
Второе задание курсовой работы представляет работу с разветвленным
алгоритмом.
Само определение разветвляющимся называется такой алгоритм, в
котором выбирается один из нескольких возможных вариантов
вычислительного процесса. Каждый подобный путь называется ветвью
алгоритма.
Признаком разветвляющегося алгоритма является наличие операций
проверки условия. Различают два вида условий - простые и составные.
Простым условием (отношением) называется выражение, составленное
из двух арифметических выражений или двух текстовых величин (иначе их
еще называют операндами), связанных одним из знаков:
16
- < - меньше, чем...
- >- больше, чем...
- <= - меньше, чем... или равно
- >= - больше, чем... или равно
- <> - не равно
- = - равно [8]
Вычислить значение функции F, используя значения аргумента X, где a
и b - это константы, описывающие функцию.
17
Рисунок 2 - Блок-схема разветвленного алгоритма
18
Была разработана трассировка для правильного выполнения задачи.
Эта трассировка представлена в виде таблицы, которая позволяет понять
последовательность вычислений и этапы, необходимые для решения данного
выражения.
,
где x=2a+1, в зависимости от самой x
19
1. import math: Эта строка импортирует модуль `math`, который
предоставляет математические функции для работы с числами.
20
Задание№3
где
x j +1=x j +0.25
m, z, x 1−¿ввести с клавиатуры, была создана блок-схема, эта блок-
схема показывает как работает циклический алгоритм и какая идет
последовательность работы алгоритма.
Сама блок-схема циклического алгоритма показана на (рис.3)
НАЧАЛО
21
Ввести m , z , x 1
J=3
j>m НЕТ
Да
2 x j+z
x j +1=x j +0.25
Конец
Итераций xj 2x j + z P
22
3 2.5 6 6
4 2.75 6.5 39
5 3.0 7 273
6 3.25 7.5 1911
23
Таким образом, каждый этап цикла вносит свой вклад в общее дело.
Задание №4
Одномерный массив, иногда также называемый списком или вектором,
представляет собой структуру данных, которая хранит элементы одного типа
данных последовательно в одной линии. Он является основным и наиболее
простым типом массива.
Одномерный массив обычно представлен в виде упорядоченной
коллекции элементов, каждый из которых имеет свой индекс. Индексация
массива начинается с нуля для первого элемента, затем 1 для второго и так
далее. Каждый элемент можно обратиться по его индексу.
Итерационные алгоритмы являются важной частью разработки
программного кода, особенно при обработке одномерных массивов. Они
позволяют эффективно выполнять повторяющиеся операции над данными в
массивах без необходимости многократного написания кода.
Необходимо создать массив R, содержащий 20 случайных чисел в
пределах от -110 до 150. После этого требуется вычислить количество
отрицательных (ko) и положительных (kp) элементов в этом массиве. Если
количество отрицательных элементов (ko) превышает количество
положительных элементов (kp), то значения элементов массива следует
удвоить. В случае, если количество отрицательных элементов (ko) не
превышает количество положительных элементов (kp), значения элементов
массива необходимо умножить на -2.
Для решения задачи обработки одномерных массивов требуется
реализовать три типа циклов: циклы с параметрами, циклы с предусловием и
циклы с постусловием. Это позволяет эффективно решать повторяющиеся
задачи в программировании и обрабатывать массивы данных различных
размеров.
Преимущества одномерных массивов включают быстрый доступ к
элементам по индексу, эффективное управление большим объемом данных и
возможность использования различных операций над массивами, таких как
сортировка, фильтрация и преобразование элементов.
Далее для решение данной задачи: Создать массив R(20) случайных
чисел в диапазоне (-110;150). Вычислить количество отрицательных (ko) и
положительных (kp) элементов массива. Если ko>kp, то значения элементов
массива удвоить, если kokp, то значения элементов массива умножить на -2.
была создана блок-схема
Сама блок-схема циклического алгоритма показана на (рис.4)
Начало
24
Инициализация массива
R(20) случайными числами
(-110;150)
Подсчет отрицательных
(ko) и положительных
(kp) элементов в
массиве
Да Нет
ko > kp
Умножить значения
Удвоить значения
элементов массива R
элементов массива R
на -2
Конец
Рисунок.4
Итераций R ko kp
1 числа значение_1 значение_2
2 числа значение_3 значение_4
…… числа …….. ……
20 числа значение_39 значение_40
26
- `ko = sum(1 for num in R if num < 0)`: `ko` - это количество отрицательных
чисел в массиве `R`. Он использует генератор списка для подсчета
количества элементов, удовлетворяющих условию `num < 0`.
- `kp = sum(1 for num in R if num > 0)`: `kp` - это количество положительных
чисел в массиве `R`. Он также использует генератор списка для подсчета
числа элементов, которые больше нуля.
4. Изменение значений элементов в массиве:
- `if ko > kp: R = [num * 2 for num in R]`: Если количество отрицательных
чисел (`ko`) больше количества положительных (`kp`), каждый элемент
массива `R` удваивается.
- `else: R = [num * -2 for num in R]`: В противном случае, если количество
отрицательных чисел меньше или равно количеству положительных, каждый
элемент массива `R` умножается на -2.
5.Вывод измененного массива и количества отрицательных и положительных
чисел:
- `print("Массив R после изменений:", R)`: Эта строка выводит измененный
массив `R`.
- `print("Количество отрицательных элементов (ko):", ko)`: Это выводит
количество отрицательных элементов в исходном массиве.
- `print("Количество положительных элементов (kp):", kp)`: А это выводит
количество положительных элементов в исходном массиве.
Задание №5
Двумерные массивы - это структуры данных, представляющие собой
таблицу из элементов, упорядоченных по двум индексам (обычно строкам и
столбцам). Они являются расширением понятия одномерных массивов, где
элементы упорядочены в строках и столбцах, позволяя хранить данные в
виде таблицы или сетки.
Каждый элемент двумерного массива имеет два индекса: первый
указывает на строку, а второй - на столбец. Например, чтобы обратиться к
элементу на позиции (i, j) в массиве, используют индексы i и j.
Двумерные массивы часто используются для хранения матриц,
изображений, таблиц данных и других структур, где данные организованы в
форме сетки или сетки.
Отличительные черты двумерных массивов:
Структура сетки: Элементы хранятся в форме таблицы с рядами и
столбцами.
Двойной индекс: Для доступа к элементам необходимо использовать два
индекса: один для строки, другой для столбца.
27
Далее была создана блок-схема для решения поставленной задачи. Эта блок-
схема показывает, как работает циклический алгоритм и каков порядок
действия алгоритма.
Начало
Создание
двумерного
массива Z(8,5)
Нахождение строки с
максимальным
элементом
Нахождение максимального
элемента в найденной
строке
Замена элементов
строки на найденный
максимум
Конец
28
Далее для правильного решения, был проведен процесс трассировки в
виде таблицы
Вот представлен сам процесс трассировки таблицы [7].
Шаг Действие Переменные/Данные
1 Создание массива Z из случайных чисел от 0 Z = [[34, 77, 12, 55, 90],
до 100 [18, 45, 67, 23, 88],
[92, 41, 30, 5, 20],
[75, 11, 64, 7, 35],
[50, 76, 83, 81, 3]
[46, 98, 72, 38, 85]
[79, 24, 14, 27, 99]
[93, 43, 22, 89, 2]]
2 Поиск строки с максимальным элементом max_row_index = 6
3 Нахождение максимального элемента в max_element = 99
строке с максимальным элементом
4 Замена всех элементов найденной строки на Z[6] = [99, 99, 99, 99, 99]
максимальный элемент
5 Вывод полученного массива "Двумерный массив Z после
замены:"
[[34, 77, 12, 55, 90],
[18, 45, 67, 23, 88],
[92, 41, 30, 5, 20],
[75, 11, 64, 7, 35],
[50, 76, 83, 81, 3],
[46, 98, 72, 38, 85],
[99, 99, 99, 99, 99],
[93, 43, 22, 89, 2]]
29
1. Создание двумерного массива:
- Используя генератор списков, создается двумерный массив `Z` размером
8x5, заполненный случайными числами от 0 до 100.
2. Нахождение строки с максимальным элементом:
- `max_row_index` находит индекс строки с максимальным значением в
массиве `Z`. Для этого используется функция `max()`, которая находит
максимальный элемент в каждой строке и выбирает индекс строки с самым
большим элементом.
3. Нахождение максимального элемента в найденной строке:
- `max_element` находит максимальный элемент в строке, полученной на
предыдущем шаге (`max_row_index`). Это делается с помощью функции
`max()`.
4. Замена всех элементов найденной строки на максимальный элемент:
- `Z[max_row_index] = [max_element] * len(Z[max_row_index])` заменяет все
элементы найденной строки (с индексом `max_row_index`) на максимальный
элемент этой строки.
5. Вывод полученного двумерного массива:
- `print("Двумерный массив Z после замены:", Z)` выводит измененный
массив `Z`.
Итак, в результате выполнения кода, элементы строки с максимальным
значением в массиве `Z` будут заменены на максимальный элемент этой
строки.
Теперь ниже приведён вывод данного кода:
30
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
__________________________
(подпись обучающегося, ФИО)
32
ПРИЛОЖЕНИЯ
33