Синтез структур данных на основе анализа инфологической модели предметной области. лр 4. Отчет по лабораторной работе 4 по дисциплине Алгоритмы и структуры данных
Скачать 1.15 Mb.
|
МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Ижевский государственный технический университет имени М.Т. Калашникова» Кафедра «Программное обеспечение» ОТЧЕТ по лабораторной работе №4 по дисциплине «Алгоритмы и структуры данных» на тему «Синтез структур данных на основе анализа инфологической модели предметной области» Выполнил: студент группы Б20-191-1 Земцова М. В. Принял: д.т.н., профессор Сенилов М.А. Ижевск 2021 ЦЕЛЬ РАБОТЫ Приобретение навыков анализа, структурирования и формализации информационного пространства, ограниченного предметной областью; применения ER-моделей и методик их анализа для синтеза необходимых структур данных. Разработать информационную систему “Сеть спортивных магазинов”. Система должна содержать информацию о МАГАЗИНАХ, ПРОДАВЦАХ, КАТЕГОРИЯХ, ТОВАРАХ и ПОКУПАТЕЛЯХ. В данной системе обрабатываются следующие запросы: 1) Вывести все ТОВАРЫ данного МАГАЗИНА необходимой КАТЕГОРИИ. 2) Вывести количество ПРОДАВЦОВ заданного ТОВАРА. 3) Вывести всех ПОКУПАТЕЛЕЙ данного ТОВАРА. 4) Вывести количество ТОВАРОВ данной КАТЕГОРИИ. 5) Вывести количество ТОВАРОВ 42 размера в данном МАГАЗИНЕ. 6) Вывести всех ПРОДАВЦОВ, заданной КАТЕГОРИИ в данном МАГАЗИНЕ. 7) Вывести все КАТЕГОРИИ данного МАГАЗИНА. 8) Вывести все МАГАЗИНЫ, где есть заданный ТОВАР. ПОСТАНОВКА ЗАДАЧИ 2.1. Характеристика задачи Лабораторная работа посвящена разработке информационной системы «Сеть спортивных магазинов», назначением которой является создание и ведение базы, которая хранит информацию о магазинах, продавцах, покупателях, товарах и их категориях. 2.2. Требования к разрабатываемой информационной системе 2.2.1. Функциональные требования Функциональные требования к информационной системе заключаются в необходимости реализации процессов в предметной области, которые определяются запросами к информационной базе. Информационная система должна обеспечить реализацию следующих запросов: 1) Вывести все ТОВАРЫ данного МАГАЗИНА необходимой КАТЕГОРИИ. 2) Вывести количество ПРОДАВЦОВ заданного ТОВАРА. 3) Вывести всех ПОКУПАТЕЛЕЙ данного ТОВАРА. 4) Вывести количество ТОВАРОВ данной КАТЕГОРИИ. 5) Вывести количество ТОВАРОВ 42 размера в данном МАГАЗИНЕ. 6) Вывести всех ПРОДАВЦОВ, заданной КАТЕГОРИИ в данном МАГАЗИНЕ. 7) Вывести все КАТЕГОРИИ данного МАГАЗИНА. 8) Вывести все МАГАЗИНЫ, где есть заданный ТОВАР. 2.3. Входные данные Список МАГАЗИНОВ, ПРОДАВЦОВ, КАТЕГОРИЙ, ТОВАРОВ и ПОКУПАТЕЛЕЙ. 2.4. Выходные данные Для запросов: Список названий товаров Количество продавцов Список покупателей Количество товаров Количество товаров Список продавцов Список категорий Список магазинов РАЗРАБОТКА ИНФОЛОГИЧЕСКОЙ МОДЕЛИ ПРЕДМЕТНОЙ ОБЛАСТИ (МПО) 2.1. Описание классов предметной области Анализ предметной области позволяет выделить классы и их атрибуты. Для описания атрибутов объектов используются характеристики, описанные в таблице 2.1. Таблица 2.1 Характеристики атрибутов предметной области
2.2. Описание процессов предметной области Процессы предметной области определяются запросами к информационной базе: 1) Вывести все ТОВАРЫ данного МАГАЗИНА необходимой КАТЕГОРИИ. 2) Вывести количество ПРОДАВЦОВ заданного ТОВАРА. 3) Вывести всех ПОКУПАТЕЛЕЙ данного ТОВАРА. 4) Вывести количество ТОВАРОВ данной КАТЕГОРИИ. 5) Вывести количество ТОВАРОВ 42 размера в данном МАГАЗИНЕ. 6)Вывести всех ПРОДАВЦОВ, заданной КАТЕГОРИИ в данном МАГАЗИНЕ. 7) Вывести все КАТЕГОРИИ данного МАГАЗИНА. 8) Вывести все МАГАЗИНЫ, где есть заданный ТОВАР. 2.3. Установление функциональных связей и задание их характеристик Формализация запросов осуществляется путем их описания функциональными связями. Ниже представлены описания запросов функциональными связями и показано приведение их к каноническому виду: 1) Запрос представлен следующей многомерной ФС: 2) Запрос представлен следующей одномерной ФС: 3) Запрос представлен следующей одномерной ФС: 4) Запрос представлен следующей одномерной ФС: 5) Запрос представлен следующей одномерной ФС: 6) Запрос представлен следующей многомерной ФС: 7) Запрос представлен следующей одномерной ФС: 8) Запрос представлен следующей одномерной ФС: Установленные функциональные связи сведены в табл. 2.7: Таблица 2.7 Перечень ФС
2.4. Установление структурных связей и задание их характеристик. Проанализируем все ФС из табл. 2.7 и отобразим их в СС. 1) Анализируем ФС 1.1. Так как Т(МАГАЗИН,КАТЕГОРИЯ)=1:М, то отображение в СС выполняется по правилу 1. Устанавливается СС S1, где владелец – объект МАГАЗИН, подчинённый – КАТЕГОРИЯ, С1 = ВП. 2) Анализируем ФС 1.2. Так как Т(КАТЕГОРИЯ,ТОВАР)=1:М, то отображение в СС выполняется по правилу 1. Устанавливается СС S2, где владелец – объект КАТЕГОРИЯ, подчинённый – ТОВАР, С1 = ВП. 3) Анализируем ФС 2.1. Так как Т(ТОВАР,ПРОДАВЕЦ)= М:М, то отображение в СС выполняется по правилу 3. Выделяется объект-связка 1, экземпляром которого является БАЗА_1(список всех продавцов данного товара). Устанавливается СС S3, где владелец – объект ТОВАР, подчинённый – объект БАЗА_1, C1= ВП. Также устанавливается СС S4, где владелец – объект ПРОДАВЕЦ, подчинённый – объект БАЗА_1, C1=ПВ. 4) Анализируем ФС 3.1. Так как Т(ТОВАР,ПОКУПАТЕЛЬ)=М:М, то отображение в СС выполняется по правилу 3. Выделяется объект-связка 2, экземпляром которого является БАЗА_2(список всех покупателей данного товара). Устанавливается СС S5, где владелец – объект ТОВАР, подчинённый – объект БАЗА_2, C1= ВП. Также устанавливается СС S6, где владелец – объект ПОКУПАТЕЛЬ, подчинённый – объект БАЗА_2, C1=ПВ. 5) Анализируем ФС 4.1. Используем ранее полученную связь S2, где владелец – объект КАТЕГОРИЯ, подчинённый – ТОВАР, C1=ВП. 6) Анализируем ФС 5.1. Так как Т(ТОВАР,МАГАЗИН)=М:1, то отображение в СС выполняется по правилу 2. Устанавливается СС S7, где владелец – объект МАГАЗИН, подчинённый – ТОВАР, C1=ПВ. 7) Анализируем ФС 6.1. Корректируем связь S1, C1=ВПВ. 8) Анализируем ФС 6.2. Так как Т(МАГАЗИН,ПРОДАВЕЦ)=1:М, то отображение в СС выполняется по правилу 1. Устанавливается СС S8, где владелец – объект МАГАЗИН, подчинённый – ПРОДАВЕЦ, C1=ВП. 9) Анализируем ФС 7.1. Используем ранее полученную связь S1, C1=ВПВ. 10) Анализируем ФС 8.1. Корректируем связь S7, C1=ВПВ. Каждой СС присваивается уникальное имя и определяются ее характеристики. Значение этих характеристик определяется в результате анализа предметной области либо на основе характеристик ФС. Перечень характеристик СС приведен в табл. 2.8. Таблица 2.8 Характеристики структурных связей
Перечень структурных связей и их характеристики приведены в табл.2.9. Таблица 2.9 Перечень структурных связей
2.5. Инфологическая схема предметной области Инфологическая схема приведена на Рис.2.1. Рис. 2.1. Инфологическая схема 3. АБСТРАКТНЫЙ АНАЛИЗ И СИНТЕЗ МПО 3.1. Представление МПО при помощи абстрактных структур данных На основе инфологической схемы (рис. 2.1), а также перечней ФС и СС построен экземпляр инфологической схемы, достаточно полно отражающий информационные процессы и режимы работы информационной системы. Экземпляр инфологической схемы представлен на рис 3.1. Рис. 3.1. Экземпляр инфологической схемы 3.2. Предварительное преобразование структуры данных Исходными данными для выполнения алгоритмов являются таблицы: «Перечень функциональных связей» (табл.2.7) и «Перечень структурных связей» (табл.2.9). В перечне ФС (табл.2.7) установлены параметры выборки, поэтому все экземпляры связываем в прямую разомкнутую цепь. На основе перечня СС (табл.2.9) выполняются следующие преобразования: Структурные связи S2, S3, S5, S8 имеют характеристику C1=ВП. В данных СС каждый экземпляр объекта-владельца и соответствующие ему экземпляры подчиненного объекта связываются в прямую разомкнутую цепь. Экземпляры подчиненного объекта в такой цепи упорядочиваются по возрастанию или убыванию значений ключа; Структурные связи S1, S7 имеют характеристику C1=ВПВ. В данных СС каждый экземпляр объекта-владельца и соответствующие ему экземпляры подчиненного объекта связываются в двунаправленную разомкнутую цепь. Экземпляры подчиненного объекта в такой цепи упорядочиваются по возрастанию или убыванию значений ключа. После применения предварительных преобразований граф экземпляра инфологической схемы преобразуется в размеченный граф, показанный на рис. 3.2. Рис. 3.2. Преобразованная АСД 3.3. Декомпозиция структуры данных на более простые АСД Граф экземпляра инфологической схемы (рис. 3.2), являясь АСД типа «размеченный граф», подлежит декомпозиции с целью получения более простых АСД. Полученные АСД представлены на рис. 3.3 – 3.4. Рис. 3.3. АСД 1 Рис. 3.4. АСД 2 РАЗРАБОТКА ВНЕШНИХ СПЕЦИФИКАЦИЙ ПРОГРАММЫ 4.1. Разработка представления данных при помощи логических структур данных (ЛСД) Разработаем и проанализируем алгоритмы обработки структуры данных. АЛГОРИТМ товары категорий магазина ВХОДНЫЕ ДАННЫЕ: категории магазина ВЫХОДНЫЕ ДАННЫЕ: товары 1. Найти заданную категорию данного магазина. 2. Найти все товары найденной категории. 3. Вывести все товары магазина. КОНЕЦ товары категорий магазина АЛГОРИТМ количество продавцов ВХОДНЫЕ ДАННЫЕ: товары ВЫХОДНЫЕ ДАННЫЕ: продавцы 1. Найти заданный товар. 2. Вывести количество продавцов. КОНЕЦ количество продавцов АЛГОРИТМ имена покупателей ВХОДНЫЕ ДАННЫЕ: товар ВЫХОДНЫЕ ДАННЫЕ: покупатель 1. Найти заданный товар. 2. Вывести все имена покупателей. КОНЕЦ имена покупателей АЛГОРИТМ количество товаров ВХОДНЫЕ ДАННЫЕ: категории ВЫХОДНЫЕ ДАННЫЕ: товары 1. Найти заданную категорию. 2. Вывести количество товаров. КОНЕЦ количество товаров АЛГОРИТМ товары магазина ВХОДНЫЕ ДАННЫЕ: магазин ВЫХОДНЫЕ ДАННЫЕ: товары 1. Найти заданный магазин. 2. Вывести количество товаров 42 размера. КОНЕЦ товары магазина АЛГОРИТМ продавцы категорий магазина ВХОДНЫЕ ДАННЫЕ: категории магазина ВЫХОДНЫЕ ДАННЫЕ: продавцы 1. Найти заданную категорию данного магазина. 2. Найти всех продавцов найденной категории. 3. Вывести всех продавцов магазина. КОНЕЦ продавцы категорий магазина АЛГОРИТМ категории магазина ВХОДНЫЕ ДАННЫЕ: магазин ВЫХОДНЫЕ ДАННЫЕ: категории 1. Найти магазин. 2. Вывести названия всех категорий. КОНЕЦ категории магазина АЛГОРИТМ магазины товара ВХОДНЫЕ ДАННЫЕ: товар ВЫХОДНЫЕ ДАННЫЕ: магазины 1. Найти заданный товар. 2. Вывести все магазины, где есть заданный товар. КОНЕЦ магазины товара 6. СХЕМА ПРОГРАММЫ Логика основной программы представлена схемой на рис. 6.1. Рис. 6.1. Схема основной программы 7. ТЕКСТ ПРОГРАММЫ #include #include #include #include #include #include using namespace std; class Steam { public: int Ans1() { string nameG, nameCE, temp; cout << "Введите название категории: "; getline(cin, nameG); cout << "\nВведите название магазина: "; getline(cin, nameCE); ifstream al("Data\\Collections.txt"); int find = 0; while (!al.eof()) { getline(al, temp); if (temp.find(nameG) != -1 && temp.find(nameCE) != -1) { find = 1; break; } } al.close(); if (!find) { cout << "Магазин не найден!"; return 0; } find = 0; al.open("Data\\Games.txt"); while (!al.eof()) { getline(al, temp); if (temp.find(nameCE) != -1) break; } al.close(); temp.erase(temp.find(nameCE), nameCE.length()); for (int i = 0; i < temp.length(); i++) { if (temp[i] == ':') { temp.erase(i - 1, 3); i -= 1; } else if (temp[i] == ';') { temp.erase(i, 1); i -= 1; } else if (temp[i] == ',') { temp.erase(i - 1, 3); i -= 1; temp.insert(i, "\n"); } } cout << endl << "Названия товаров магазина " << nameCE << " категории " << nameG << ":" << endl << temp; } int Ans2() { string izdat, temp; cout << "Введите название товара: "; getline(cin, izdat); ifstream lab("Data\\Publishers.txt"); int find = 0; while (!lab.eof()) { getline(lab, temp); if (temp.find(izdat) != -1) { find = 1; break; } } lab.close(); if (!find) { cout << "Товар не найден!"; return 0; } cout << "\nКоличество продавцов товара " << izdat << ": "; int i = temp.find("("), j = temp.find(")"); if (j != i + 2) { cout << temp[i + 1] << temp[i + 2]; } else cout << temp[i + 1]; } int Ans3() { string developer, temp, result = ""; cout << "Введите название товара: "; getline(cin, developer); ifstream f("Data\\Players.txt"); int find = 0; while (!f.eof()) { getline(f, temp); if (temp.find(developer) != -1) { for (int i = 0; i < temp.find(":") - 1; i++) result += temp[i]; result += "\n"; find = 1; } } if (!find) { cout << "Товар не найден!"; return 0; } cout << "\nСписок покупателей товара " << developer << ":\n" << result; } int Ans4() { string izdat, temp; cout << "Введите название категории: "; getline(cin, izdat); ifstream lab("Data\\Publishers.txt"); int find = 0; while (!lab.eof()) { getline(lab, temp); if (temp.find(izdat) != -1) { find = 1; break; } } lab.close(); if (!find) { cout << "Категория не найдена!"; return 0; } cout << "\nКоличество товаров категории " << izdat << ": "; int i = temp.find("("), j = temp.find(")"); if (j != i + 2) { cout << temp[i + 1] << temp[i + 2]; } else cout << temp[i + 1]; } int Ans5() { string izdat, temp; cout << "Введите название магазина: "; getline(cin, izdat); ifstream lab("Data\\Publishers.txt"); int find = 0; while (!lab.eof()) { getline(lab, temp); if (temp.find(izdat) != -1) { find = 1; break; } } lab.close(); if (!find) { cout << "Магазин не найден!"; return 0; } cout << "\nКоличество товаров магазина " << izdat << ": "; int i = temp.find("("), j = temp.find(")"); if (j != i + 2) { cout << temp[i + 1] << temp[i + 2]; } else cout << temp[i + 1]; } int Ans6() { string nameG, nameCE, temp; cout << "Введите название категории: "; getline(cin, nameG); cout << "\nВведите название магазина: "; getline(cin, nameCE); ifstream al("Data\\Collections.txt"); int find = 0; while (!al.eof()) { getline(al, temp); if (temp.find(nameG) != -1 && temp.find(nameCE) != -1) { find = 1; break; } } al.close(); if (!find) { cout << "Магазин не найден!"; return 0; } find = 0; al.open("Data\\Games.txt"); while (!al.eof()) { getline(al, temp); if (temp.find(nameCE) != -1) break; } al.close(); temp.erase(temp.find(nameCE), nameCE.length()); for (int i = 0; i < temp.length(); i++) { if (temp[i] == ':') { temp.erase(i - 1, 3); i -= 1; } else if (temp[i] == ';') { temp.erase(i, 1); i -= 1; } else if (temp[i] == ',') { temp.erase(i - 1, 3); i -= 1; temp.insert(i, "\n"); } } cout << endl << "Имена продавцов магазина " << nameCE << " категории " << nameG << ":" << endl << temp; } int Ans7() { string dev, temp; cout << "Введите название магазина: "; getline(cin, dev); ifstream f("Data\\Collections.txt"); int find = 0; while (!f.eof()) { getline(f, temp); if (temp.find(dev) != -1) { find = 1; break; } } f.close(); if (!find) { cout << "\nМагазин не найден!"; return 0; } string album = ""; vector int i = dev.length() + 4; for (i; i < temp.length() - 1; i++) { album += temp[i]; if (temp[i + 2] == '(') { albums.push_back(album); album = ""; i += 11; } } string result = ""; f.open("Data\\Games.txt"); while (!f.eof()) { getline(f, temp); for (i = 0; i < albums.size(); i++) { if (temp.find(albums[i]) != -1) { for (int j = temp.find(albums[i]) + albums[i].length() + 3; j < temp.length() - 1; j++) { result += temp[j]; if (temp[j + 2] == ',' || temp[j + 2] == ';') { result += "\n"; j += 3; } } } } } cout << "\nВсе категории магазина " << dev << ":\n" << result; } int Ans8() { string developer, temp, result = ""; cout << "Введите название товара: "; getline(cin, developer); ifstream f("Data\\Players.txt"); int find = 0; while (!f.eof()) { getline(f, temp); if (temp.find(developer) != -1) { for (int i = 0; i < temp.find(":") - 1; i++) result += temp[i]; result += "\n"; find = 1; } } if (!find) { cout << "Товар не найден!"; return 0; } cout << "\nСписок магазинов, где есть товар " << developer << ":\n" << result; } }MS; int main() { setlocale(LC_ALL, "rus"); string k; while (1) { cout << "Меню программы:\n" << "1) Вывести все ТОВАРЫ данного МАГАЗИНА необходимой КАТЕГОРИИ\n" << "2) Вывести количество ПРОДАВЦОВ заданного ТОВАРА\n" << "3) Вывести всех ПОКУПАТЕЛЕЙ данного ТОВАРА\n" << "4) Вывести количество ТОВАРОВ данной КАТЕГОРИИ\n" << "5) Вывести количество ТОВАРОВ 42 размера в данном МАГАЗИНЕ\n" << "6) Вывести всех ПРОДАВЦОВ, заданной КАТЕГОРИИ в данном МАГАЗИНЕ\n" << "7) Вывести все КАТЕГОРИИ данного МАГАЗИНА\n" << "8) Вывести все МАГАЗИНЫ, где есть заданный ТОВАР\n" << "0) Выйти\n" << "Введите пункт меню: "; getline(cin, k); if (k == "10") k = 'a'; cout << endl; switch (k[0]) { case '1': MS.Ans1(); _getch(); break; case '2': MS.Ans2(); _getch(); break; case '3': MS.Ans3(); _getch(); break; case '4': MS.Ans4(); _getch(); break; case '5': MS.Ans5(); _getch(); break; case '6': MS.Ans6(); _getch(); break; case '7': MS.Ans7(); _getch(); break; case '8': MS.Ans8(); _getch(); break; case '0': return 0; default: cout << "Такого пункта меню не существует. Повторите попытку."; _getch(); } system("cls"); } } 8. РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ Проверим результаты работы программы, полученные по каждому из запросов (рис. 9.1 – 9.8) Рис. 9.1. Запрос 1 Рис. 9.2. Запрос 2 Рис. 9.3. Запрос 3 Рис. 9.4 Запрос 4 Рис. 9.5. Запрос 5 Рис. 9.6. Запрос 6 Рис. 9.7. Запрос 7 Рис. 17.8. Запрос 8 10. ВЫВОДЫ В ходе выполнения лабораторной работы получены навыки использования оптимальных алгоритмов и структур данных для работы с большими объемами данных, не требующие сложных вычислений. |