Работа с системой управления проектом
Для удобства совместной разработки был использован сервис Yougile. Определили задачи проекта, разделили роли.
Рисунок 2 – Определение задач
Корректировали статус задач по мере выполнения.
Рисунок 3 – Работа с задачами
Рисунок 4 – Выполненные задачи
Приложение № 3
проект студентов первого курса бакалавриата группы 22ВвВ1
КОрнилов в.м. Самофалова а.в. и перкина п.о.
Введение
Сортировка данных на сегодняшний день при современном развитии компьютерных технологий является одним из наиболее распространенных процессов современной обработки данных. Задачи на сортировку данных встречаются очень часто в различных профессиональных сферах деятельности.
Алгоритмы сортировки очень широко распространяются практически во всех задачах обработки информации. При этом они настолько тесно связаны друг с другом, что образуют отдельный класс алгоритмов. Алгоритмы сортировки, как правило, применяются с целью осуществления последующего более быстрого поиска. Например, трудно пользоваться словарями, если бы слова в них не были бы упорядочены по алфавиту.
Важность сортировки основана на том факте, что на ее примере можно показать многие основные фундаментальные приемы и методы построения алгоритмов. Сортировка является хорошим примером огромного разнообразия алгоритмов, которые выполняют одну и ту же задачу. Кроме того, многие из них имеют определенные преимущества друг перед другом. За счет усложнения алгоритма можно добиться существенного увеличения эффективности и быстродействия алгоритма по сравнению с более простыми методами. Как правило, термин сортировка понимают, как процесс перестановки объектов некоторого множества в определенном порядке. Цель сортировки - облегчить последующий поиск элементов в отсортированном множестве.
Сортировка слиянием основана на декомпозиции - массив разбивается на две примерно равные части, и после их рекурсивной сортировки выполняется операция слияния. Операция слияния двух отсортированных частей в одну состоит в том, что из каждой части выбирается по одному элементу, и меньший из них помещается в результирующий массив. Так продолжается до тех пор, пока не будет исчерпана одна из частей - в этом случае оставшаяся часть просто переносится в конец результирующего массива.
Постановка задачи
Необходимо реализовать и продемонстрировать работу алгоритма сортировки слиянием. Программа должна реализовывать алгоритм сортировки, выполнять считывание входных данных из файла и запись результатов в файл и отображать все данные в графическом интерфейсе.
Программа должна обрабатывать данные, предоставленные в корректно сформированных входных файлах.
Конечная программа не должна использовать реализацию алгоритмов сортировки, предоставляемые стандартными библиотеками, включая системные.
Решение задачи сортировки слиянием разделяется на три этапа:
· Сортируемый массив разбивается на две части примерно одинакового размера;
· Каждая из получившихся частей сортируется отдельно, например — тем же самым алгоритмом;
· Два упорядоченных массива половинного размера соединяются в один.
Достоинства алгоритма
- Работает даже на структурах данных последовательного доступа.
- Хорошо сочетается с подкачкой и кэшированием памяти.
- Неплохо работает в параллельном варианте: легко разбить задачи между процессорами поровну, но трудно сделать так, чтобы другие процессоры взяли на себя работу, в случае если один процессор задержится.
- Не имеет «трудных» входных данных.
- Устойчивая - сохраняет порядок равных элементов (принадлежащих одному классу эквивалентности по сравнению).
Недостатки алгоритма
- На «почти отсортированных» массивах работает столь же долго, как на хаотичных. Существует вариант сортировки слиянием, который работает быстрее на частично отсортированных данных, но он требует дополнительной памяти, в дополнении ко временному буферу, который используется непосредственно для сортировки.
- Требует дополнительной памяти по размеру исходного массива.
Типичные сценарии применения
Сортировка слиянием обычно реализуется таким образом, что она осуществляет последовательный доступ к данным. Поэтому данный метод сортировки применяется к структурам данных, доступ к элементам которых может осуществляться только последовательно, например, к спискам, потокам и так далее.
· По тем же причинам слияние часто используется в качестве основы для сортировки на специализированных и высокопроизводительных машинах, поскольку именно последовательный доступ в подобного рода системах обработки данных является самым быстрым.
3. Выбор решения
Для написания программы был выбран язык программирования C. Язык C — это универсальный язык программирования, для которого характерны экономичность выражения, современный поток управления и структуры данных, богатый набор операторов. Язык C не является ни языком "очень высокого уровня", ни "большим" языком, и не предназначается для некоторой специальной области применения, но отсутствие ограничений и общность языка делают его более удобным и эффективным для многих задач, чем языки, предположительно более мощные.
В качестве среды разработки была выбрана программа Microsoft Visual Studio 2022. Microsoft Visual Studio — это программная среда по разработке приложений для ОС Windows, как консольных, так и с графическим интерфейсом. Данная среда разработки удобна для написания, редактирования, отладки и сборки кода, а затем для развертывания приложения. Помимо редактирования и отладки кода, Visual Studio включает компиляторы, средства завершения кода, систему управления версиями, расширения и многие другие функции для улучшения каждого этапа процесса разработки программного обеспечения.
Исходный массив будет динамическим для того, чтобы можно было можно было изменить его размер.
Сортировка будет осуществлена методом нисходящего слияния. Исходная последовательность рекурсивно разбивается на половины, пока не получим подпоследовательности по 1 элементу. Из полученных последовательностей формируем упорядоченные пары методом слияния, затем - упорядоченные четверки и так далее.
Программа состоит из двух частей: файлов исходного кода и заголовочного файла. Заголовочный файл «all.h» был разработан специально для данной программы и содержит в себе следующие элементы: подключение всех нужных библиотек, объявление функций и переменных,
Данный файл необходим для связывания всех модулей программы воедино, для ускорения вызова функций и работы программы в целом, для избежания многократного объявления переменных в разных модулях программы, что могло привести к ошибке в работе программы. Также благодаря нему не требуется в каждом модуле программы каждый раз подключать все требуемые библиотеки, достаточно подключить лишь «all.h».
Функции исходного кода разделены по разным модулям. Это нужно для того, чтобы в случае ошибки можно было легко найти строку, содержащую ошибку, а затем устранить её.
Описание программы
Программа «Сортировка слиянием» основана на основе консольного меню и включает в себя следующие возможности:
- Начать сортировку заданного массива и запись отсортированных данных в текстовый файл.
- Выбор размера массива позволяет задавать произвольный размер массива, а затем ,заполняя его случайными числами 0 до 10000, записывает его в отдельный текстовый файл.
При запуске программы появляется заставка(см. приложение Б), которая знакомит пользователя с самой программой и её авторами. Посимвольный вывод текстовых массивов осуществляется с помощью цикла for, а задержка текста на экране с помощью команды sleep.
for (int j = 0; j < length; j++)
{
printf("\033[91m""%c""\033[m", title[j]);
Sleep(60); //промежуток вывода каждого символа
}
Sleep(500);
Для вывода текста в центре экрана была написана функция centerprintf(), которая задает размер консоли и делает смещение до середины.
void centerprintf(const char* str) { //функция определения центра консоли
int width = 120; //высота
int len = strlen(str); //длинна
int startPos = (width - len) / 2; //определение центра
for (int i = 0; i < startPos; i++) { //смещение до центра
putchar(' ');
}
printf("%s", str);
}
Далее открывается основное меню программы(см. приложение Б),
centerprintf("=============================\n");
centerprintf(" =""\033[91m"" Сортировка""\033[m"" Слиянием =\n");
centerprintf("=============================\n");
centerprintf("| |\n");
centerprintf("| 1. Сортировка |\n");
centerprintf("| |\n");
centerprintf(" |""\033[91m"" 2. Размер Массива ""\033[m""|\n");
centerprintf("| |\n");
centerprintf(" |""\033[31m"" 3. Выход ""\033[m""|\n");
centerprintf("| |\n");
centerprintf("=============================\n");
Главное меню состоит из трёх пунктов:
1) Сортировка. После выбора данного пункта запускается процесс сортировки массива методом слияния, если задан корректный размер массива
case '1': //если пользователь ввел 1
system("cls"); //очистка конслоли
if (size <= 0) { //если размер массива не задан
printf("Размер массива не был введен\n");
return show_menu(); //возврат в меню
}
else {
mergeSortFunction(size); //функция сортировки
return show_menu(); //возврат в меню
}
break;
2) Размер массива. При выборе данного пункта пользователю выводится текущий размер массива и предлагается его поменять или оставить без изменений.
system("cls"); //очистка консоли
printf("\033[93m""Текущая размерность массива: %d""\033[m", size);
printf("\033[33m""\nХотите поменять? (Y/N): ""\033[m");
getchar(); //задержка
scanf("%c", &vibor); //считывание в переменную
vibor = toupper(vibor); //определение заглавных и строчных букв
2.1) При выборе смены размера массива пользователь вводит число, которое в дальнейшем будет служить размером массива и использоваться при его заполнении.
if (vibor == 'Y') //если выбор да
{
printf("Введите размер массива больше одного: ");
scanf("%d", &size); //запись размера массива
printf("Размер массива успешно введен\n");
return show_menu(); //возврат в меню
}
else if (vibor == 'N') //если выбор нет
{
system("cls"); //очистка консоли
return show_menu(); //возврат в меню
}
3) Выход. Программа завершает отладку.
case '3': //если пользователь ввел 3
exit(0); //выход
break;
Навигация в меню осуществляется с помощью клавиатуры, вводом цифр от 1 до 3 и нажатием клавиши Enter. Нажатие иных клавиш, не указанных в меню, приводит к сообщению об ошибке.
char choice; //переменная для выбора
printf("Ваш выбор: ");
scanf(" %c", &choice); // запись выбора в переменную
Описание состояний программы выполнено в таблице ниже.
Таблица 1 – Работа функции меню
Клавиши, вызывающее событие | Действие пользователя | Действие программы |
1, Enter | Выбран пункт «Сортировка» | Запускается сортировка заданного массива(см. таблицу 2.) или вывод сообщения о не заданном размере массива |
2, Enter | Выбран пункт «Размер Массива» | На экран выводится текущий размер массива и предлагается его поменять (см. Таблица 2.) |
3, Enter | Выбран пункт «Выход» | Выполняется вывод конечной заставки и закрытие программы |
Таблица 2 – Работа функции sizee()
Клавиши, вызывающее событие | Действие пользователя | Действие программы |
Y/y | Выбран пункт «Изменить размер массива» | Считывание размера, введенного пользователем и его запись в переменную size |
N/n | Отказ от пункта выше | Возврат в главное меню |
Схемы программы
Блок-схема программы:
Рисунок 1 – Схема функции main()
Рисунок 2 – Схема функции main()
Блок-схема алгоритма:
Рисунок 3 – Блок-схема алгоритма
Тестирование программы
Тестовый набор данных представлен в таблице 3. Результаты тестирования приведены в Приложении Б.
Таблица 3 – Тестовый набор данных
№ теста | Размер массива size | Время выполнения сортировки в секундах |
1 | 10000 | 0.006 |
2 | 20000 | 0.014 |
3 | 30000 | 0.02 |
4 | 40000 | 0.023 |
5 | 50000 | 0.024 |
6 | 60000 | 0.027 |
7 | 70000 | 0.029 |
8 | 80000 | 0.032 |
9 | 90000 | 0.037 |
10 | 100000 | 0.04 |
11 | 110000 | 0.044 |
Рисунок 4 – Результаты тестирования
Отладка
В качестве среды разработки была выбрана программа Microsoft Visual Studio 2022. Программа обладает всеми средствами необходимыми при разработке и отладке программы. Для отладки использовалось несколько возможностей Visual Studio: точка останова, трассировка, анализ содержимого переменных.
Для отладки нужно запустить приложение с отладчиком, подключенным к процессу приложения. Это можно сделать с помощью клавиши F5 или кнопки Начать отладку на панели инструментов отладки.
Точка останова указывает, где следует приостановить выполнение кода, чтобы проверить значения переменных или поведение памяти либо выполнение ветви кода. Точку останова можно задать, щелкнув в поле слева от строки кода.
С помощью клавиши F11 можно выполнить шаг с заходом при выполнении отладки. При запуске приложения с помощью клавиши F11 отладчик останавливается на первом выполняемом операторе, чтобы мы могли проверить содержимое переменных. Если оператор содержит вызов функции, то при шаге с заходом программа приостанавливает работу на первой строчке этой функции.
Клавиша F10 выполняет шаг без захода и позволяет выполнять отладку без захода в функции в коде.
Проверка содержимого переменных при проведении отладки осуществлялась с помощью окна “Видимые”, в котором отображаются переменные, используемые вокруг текущей точки останова, и окна «Локальные», где показываются переменные, которые находятся в текущей области видимости.
Заключение
В ходе выполнения данной практической работы были улучшены базовые знания программирования на языке С. Улучшены навыки отладки, тестирования программ и работы со сложными типами данных.
Данная практическая работа была выполнена в соответствии поставленной задачи, в среде Microsoft Visual Studio 2022. Было проведено исследование компонентов программной среды Microsoft Visual Studio 2022, которые использовались при создании программы, также использовалось множество функций.
В дальнейшем программу можно улучшить путем добавления восходящей сортировки слиянием, а также добавлением графического интерфейса.