Лабораторные Армашев 3 семестр. Список оргтехники предприятия / лаба 6-7
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
КАФЕДРА РАПС
отчет
по лабораторным работам №(6-7)
по дисциплине «Программирование и основы алгоритмизации»
Студент группы 4404 |
________________ |
Комарницкий М.С. |
Преподаватель |
|
Армашев А.А. |
Санкт-Петербург
2025
Ход работы
Сортировка:
1) Установил в качестве данных для сортировки встроенный текстовый массив из 8-ми элементов. Проверил правильность работы программы для 5-ти алгоритмов.
Прямое включение: Число сравнений: 20; Число перестановок: 20;
Прямой выбор: Число сравнений: 28; Число перестановок: 5;
Прямой обмен: Число сравнений: 28; Число перестановок: 15;
Шейкерная сортировка: Число сравнений: 22; Число перестановок: 15;
Быстрая сортировка: Число сравнений: 22; Число перестановок: 5;
2) Самостоятельно сформировать массив данных для сортировки в виде текстового файла из 10 элементов:
69 Капибары 60.90
52 Выдры 52.52
67 Слоны 11.00
812 Собаки 46.99
12 Кошки 46.98
324 Кролики 75.01
12 Суслики 75.50
53 Хорьки 89.89
77 Нутрии 27.40
45 Киты 81.00
Прямое включение: Число сравнений: 32; Число перестановок: 33;
Прямой выбор: Число сравнений: 45; Число перестановок: 9;
Прямой обмен: Число сравнений: 45; Число перестановок: 25;
Шейкерная сортировка: Число сравнений: 39; Число перестановок: 25;
Быстрая сортировка: Число сравнений: 49; Число перестановок: 8;
3) Получил данные об эффективности работы 5-ти алгоритмов сортировки. Для каждого метода провёл сортировку неупорядоченного массива для разного количества элементов.
25000:
Прямое включение: Время: 1.062; Число сравнений: 156588564; Число перестановок: 156563577;
Прямой выбор: Время: 1.922; Число сравнений: 312487500; Число перестановок: 24981;
Прямой обмен: Время: 2.015; Число сравнений: 312487500; Число перестановок: 156127014;
Шейкерная сортировка: Время: 1.406; Число сравнений: 208198523; Число перестановок: 156295221;
Быстрая сортировка: Время: ; Число сравнений: 505965; Число перестановок: 84407;
50000:
Прямое включение: Время: 4.110; Число сравнений: 625105737; Число перестановок: 625055747;
Прямой выбор: Время: 7.610; Число сравнений: 1249975000; Число перестановок: 49991;
Прямой обмен: Время: 8.047; Число сравнений: 1249975000; Число перестановок: 627723780;
Шейкерная сортировка: Время: 5.688; Число сравнений: 831303568; Число перестановок: 624126469;
Быстрая сортировка: Время: ; Число сравнений: 1054240; Число перестановок: 181134;
75000:
Прямое включение: Время: 9.000; Число сравнений: 1408362486; Число перестановок: 1408287497;
Прямой выбор: Время: 16.922; Число сравнений: 2812462500; Число перестановок: 74988;
Прямой обмен: Время: 18.094; Число сравнений: 2812462500; Число перестановок: 1398973192;
Шейкерная сортировка: Время: 12.797; Число сравнений: 1869970193; Число перестановок: 1403014805;
Быстрая сортировка: Время: ; Число сравнений: 1668601; Число перестановок: 280469;
100000:
Прямое включение: Время: 15.906 Число сравнений: 2501672125; Число перестановок: 2501572139;
Прямой выбор: Время: 31.578; Число сравнений: 4999950000; Число перестановок: 99987;
Прямой обмен: Время: 32.297; Число сравнений: 4999950000; Число перестановок: 2501701288;
Шейкерная сортировка: Время: 22.625; Число сравнений: 3326093711; Число перестановок: 2495590006;
Быстрая сортировка: Время: ; Число сравнений: 2336433; Число перестановок: 380716;
4) Получил данные о времени работы 5-ти алгоритмов сортировки для трех вариантов входных данных – неупорядоченный массив, уже упорядоченный по возрастанию, упорядоченный по убыванию. Использовал массив размерностью в 100000 элементов
Неупорядоченный:
Прямое включение: Время: 15.906 Число сравнений: 2501672125; Число перестановок: 2501572139;
Прямой выбор: Время: 31.578; Число сравнений: 4999950000; Число перестановок: 99987;
Прямой обмен: Время: 32.297; Число сравнений: 4999950000; Число перестановок: 2501701288;
Шейкерная сортировка: Время: 22.625; Число сравнений: 3326093711; Число перестановок: 2495590006;
Быстрая сортировка: Время: ; Число сравнений: 2336433; Число перестановок: 380716;
Упорядоченный по возрастанию:
Прямое включение: Время: 0.000; Число сравнений: 99999; Число перестановок: 0;
Прямой выбор: Время: 30.062; Число сравнений: 4999950000; Число перестановок: 0;
Прямой обмен: Время: 30.141; Число сравнений: 4999950000; Число перестановок: 0;
Шейкерная сортировка: Время: 0.016; Число сравнений: 99999; Число перестановок: 0;
Быстрая сортировка: Время: 0.015; Число сравнений: 1602533; Число перестановок:0;
Упорядоченный по убыванию:
Прямое включение: Время: 32.047; Число сравнений: 4999949861; Число перестановок: 4999945084;
Прямой выбор: Время: 30.047; Число сравнений: 4999950000; Число перестановок: 52244;
Прямой обмен: Время: 33.282; Число сравнений: 4999950000; Число перестановок: 4999945083;
Шейкерная сортировка: Время: 39.360; Число сравнений: 4999949999; Число перестановок: 4999944925;
Быстрая сортировка: Время: 0.032; Число сравнений: 1602719; Число перестановок: 50000;
5) Реализовал быструю сортировку в своём курсовом проекте.
int TFormControlListTech::PartitionByPrice(int left, int right, bool ascending)
{
float pivot = devices[right].price;
int i = left - 1;
for (int j = left; j <= right - 1; j++) {
if (ascending) {
// По возрастанию
if (devices[j].price <= pivot) {
i++;
SwapDevices(i, j);
}
} else {
// По убыванию
if (devices[j].price >= pivot) {
i++;
SwapDevices(i, j);
}
}
}
SwapDevices(i + 1, right);
return i + 1;
}
void TFormControlListTech::QuickSortByPrice(int left, int right, bool ascending)
{
if (left < right) {
int pi = PartitionByPrice(left, right, ascending);
QuickSortByPrice(left, pi - 1, ascending);
QuickSortByPrice(pi + 1, right, ascending);
}
}
// ========== РАЗБИЕНИЕ ДЛЯ СОРТИРОВКИ ПО ДАТЕ ==========
// Вспомогательная функция для сравнения дат
int CompareDates(const char* date1, const char* date2)
{
// Дата в формате DD.MM.YYYY
int day1, month1, year1;
int day2, month2, year2;
sscanf(date1, "%d.%d.%d", &day1, &month1, &year1);
sscanf(date2, "%d.%d.%d", &day2, &month2, &year2);
if (year1 != year2) return year1 - year2;
if (month1 != month2) return month1 - month2;
return day1 - day2;
}
int TFormControlListTech::PartitionByDate(int left, int right, bool ascending)
{
char* pivot = devices[right].purchaseDate;
int i = left - 1;
for (int j = left; j <= right - 1; j++) {
int compareResult = CompareDates(devices[j].purchaseDate, pivot);
if (ascending) {
// По возрастанию (старые -> новые)
if (compareResult <= 0) {
i++;
SwapDevices(i, j);
}
} else {
// По убыванию (новые -> старые)
if (compareResult >= 0) {
i++;
SwapDevices(i, j);
}
}
}
SwapDevices(i + 1, right);
return i + 1;
}
void TFormControlListTech::QuickSortByDate(int left, int right, bool ascending)
{
if (left < right) {
int pi = PartitionByDate(left, right, ascending);
QuickSortByDate(left, pi - 1, ascending);
QuickSortByDate(pi + 1, right, ascending);
}
}
// ========== МЕТОДЫ ДЛЯ ВЫЗОВА СОРТИРОВКИ ==========
void TFormControlListTech::SortByPrice(bool ascending)
{
if (deviceCount == 0) {
ShowMessage("Нет данных для сортировки. Загрузите файл сначала.");
return;
}
DWORD startTime = GetTickCount();
QuickSortByPrice(0, deviceCount - 1, ascending);
DWORD endTime = GetTickCount();
UpdateMainListView();
String order = ascending ? "по возрастанию" : "по убыванию";
ShowMessage("Сортировка по стоимости " + order + " выполнена!\n" +
"Время: " + IntToStr((int)(endTime - startTime)) + " мс\n" +
"Элементов: " + IntToStr((int)deviceCount));
}
void TFormControlListTech::SortByDate(bool ascending)
{
if (deviceCount == 0) {
ShowMessage("Нет данных для сортировки. Загрузите файл сначала.");
return;
}
DWORD startTime = GetTickCount();
QuickSortByDate(0, deviceCount - 1, ascending);
DWORD endTime = GetTickCount();
UpdateMainListView();
String order = ascending ? "по возрастанию (старые->новые)" : "по убыванию (новые->старые)";
ShowMessage("Сортировка по дате закупки " + order + " выполнена!\n" +
"Время: " + IntToStr((int)(endTime - startTime)) + " мс\n" +
"Элементов: " + IntToStr((int)deviceCount));
}
// ========== ОБРАБОТЧИКИ КНОПОК СОРТИРОВКИ ==========
void __fastcall TFormControlListTech::BtnSortPriceAscClick(TObject *Sender)
{
SortByPrice(true); // По цене по возрастанию
}
void __fastcall TFormControlListTech::BtnSortPriceDescClick(TObject *Sender)
{
SortByPrice(false); // По цене по убыванию
}
void __fastcall TFormControlListTech::BtnSortDateAscClick(TObject *Sender)
{
SortByDate(true); // По дате по возрастанию
}
void __fastcall TFormControlListTech::BtnSortDateDescClick(TObject *Sender)
{
SortByDate(false); // По дате по убыванию
}
Поиск:
1) Проверил правильность работы программы для 3-х алгоритмов:
Линейный поиск:
Ключ поиска: 18
Результаты поиска: Виноград
Число шагов: 5
Двоичный поиск:
Ключ поиска: 18
Результаты поиска: Виноград
Число шагов: 4
Интерполяционный поиск:
Ключ поиска: 18
Результаты поиска: Виноград
Число шагов: 3
2) Самостоятельно сформировал массив упорядоченных данных для поиска в виде текстового файла. Исследовал работу алгоритмов двоичного и интерполяционного поиска
Двоичный поиск:
Ключ поиска: 19
Результаты поиска: Утконос
Число шагов: 4
Интерполяционный поиск:
Ключ поиска: 19
Результаты поиска: Утконос
Число шагов: 1
3) Получил данные об эффективности работы 3-х алгоритмов поиска. Для каждого метода провёл поиск в упорядоченном массиве размерностью в 25000, 50000, 75000 и 100000 элементов по заданному ключу.
25000:
Линейный поиск:
Ключ: 8977
Число шагов: 222
Двоичный поиск:
Ключ: 8977
Число шагов: 15
Интерполяционный поиск:
Ключ: 8977
Число шагов: 2
50000:
Линейный поиск:
Ключ: 8993
Число шагов: 459
Двоичный поиск:
Ключ: 8977
Число шагов: 13
Интерполяционный поиск:
Ключ: 8977
Число шагов: 3
75000:
Линейный поиск:
Ключ: 8973
Число шагов: 653
Двоичный поиск:
Ключ: 8973
Число шагов: 16
Интерполяционный поиск:
Ключ: 8973
Число шагов: 3
100000:
Линейный поиск:
Ключ: 8992
Число шагов: 913
Двоичный поиск:
Ключ: 8992
Число шагов: 16
Интерполяционный поиск:
Ключ: 8992
Число шагов: 7
Добавил поиск в курсовой проект:
void TFormControlListTech::UpdateMainListViewWithFilter(const char* filterText)
{
ListView1->Items->Clear();
char filterUpper[256];
strcpy(filterUpper, filterText);
// Переводим в верхний регистр для поиска
for(int i = 0; filterUpper[i]; i++) {
filterUpper[i] = toupper(filterUpper[i]);
}
int foundCount = 0;
for(int i = 0; i < deviceCount; i++) {
char modelUpper[100];
char categoryUpper[50];
char additionalInfoUpper[200];
// Копируем и переводим в верхний регистр
strcpy(modelUpper, devices[i].model);
strcpy(categoryUpper, devices[i].category);
strcpy(additionalInfoUpper, devices[i].additionalInfo);
for(int j = 0; modelUpper[j]; j++) modelUpper[j] = toupper(modelUpper[j]);
for(int j = 0; categoryUpper[j]; j++) categoryUpper[j] = toupper(categoryUpper[j]);
for(int j = 0; additionalInfoUpper[j]; j++) additionalInfoUpper[j] = toupper(additionalInfoUpper[j]);
// Проверяем совпадение
bool matches = (strlen(filterText) == 0) ||
(strstr(modelUpper, filterUpper) != NULL) ||
(strstr(categoryUpper, filterUpper) != NULL) ||
(strstr(additionalInfoUpper, filterUpper) != NULL);
if (matches) {
TListItem *item = ListView1->Items->Add();
item->Caption = IntToStr(devices[i].id);
item->SubItems->Add(devices[i].category);
item->SubItems->Add(devices[i].model);
item->SubItems->Add(devices[i].purchaseDate);
item->SubItems->Add(IntToStr(devices[i].warrantyMonths));
item->SubItems->Add(FloatToStrF(devices[i].price, ffFixed, 8, 2));
item->SubItems->Add(devices[i].additionalInfo);
item->SubItems->Add(devices[i].IsWarrantyValid() ? "Действует" : "Истекла");
item->SubItems->Add(FloatToStrF(devices[i].CurrentValue(), ffFixed, 8, 2));
item->SubItems->Add(IntToStr(devices[i].coordX) + "," + IntToStr(devices[i].coordY));
foundCount++;
}
}
// Сообщение если ничего не найдено
if (strlen(filterText) > 0 && foundCount == 0) {
char message[300];
sprintf(message, "По запросу '%s' ничего не найдено.", filterText);
ShowMessage(message);
}
