Главная страница
Навигация по странице:

  • Текст программы

  • Разработка web-приложения. Задача. Загрузить в оперативную память компьютера и построить дерево поиска заданного типа для решения задачи по поиску записей


    Скачать 23.87 Kb.
    НазваниеЗагрузить в оперативную память компьютера и построить дерево поиска заданного типа для решения задачи по поиску записей
    АнкорРазработка web-приложения
    Дата24.12.2022
    Размер23.87 Kb.
    Формат файлаdocx
    Имя файлаЗадача.docx
    ТипЗадача
    #862315

    Задача: Хранящуюся в файле базу данных, состоящую из 4000 записей (формат базы данных определяется вариантом) загрузить в оперативную память компьютера и построить дерево поиска заданного типа для решения задачи по поиску записей (задача определяется вариантом). Из найденных записей организовать список (очередь) и вывести их на экран.

    --- (файл base4.dat)

         База данных "Населенный пункт"

         Стpуктуpа записи:

            ФИО гражданина: текстовое поле 32 символа

                            фоpмат <Фамилия>_<Имя>_<Отчество>

            Название улицы: текстовое поле 20 символов

            Номер дома:     целое число

            Номер квартиры: целое число

            Дата поселения: текстовое поле 8 символов

                            фоpмат дд-мм-гг

         Пpимеp записи из БД:

            Петpов_Иван_Федоpович___________

            Ленина______________

            10

            67

            29-02-65

    ---Вывести на экран количество и названия всех улиц из базы данных

    Вывести упорядоченный (по полю ФИО гражданина) список граждан проживающих на заданной улице не ранее, чем  заданная дата поселения

    Название улицы и дату поселения вводить с клавиатуры

    ----Дерево поиска: Двоичное Б-дерево

    Текст программы:

    #define _CRT_SECURE_NO_WARNINGS

    #include

    #include

    #include

    #include
    int numb; //номер пункта меню

    char s_street[21]; // заданное название улицы для сортировки

    char s_date[8]; // заданная дата для сортировки
    // Структура с данными "Населенный пункт"

    struct Data

    {

    char name[32]; // ФИО гражданина

    char street[20]; // название улицы

    short house; // номер дома

    short apartment; // номер квартиры

    char date[8]; // дата поселения

    };
    Data records[4000]; // 4000 записей в ОЗУ
    //Структура содержащая элементы очереди

    struct List

    {

    Data* pData; // указатель на структуру с данными

    List* pNext; // указатель на следующий элемент в очереди

    };

    List* pFirst; // указатель на 1-ый элемент в очереди

    List* pLast; // указатель на последний элемент в очереди
    //Вершины ДБ-дерева

    struct Vertex

    {

    Data* pData;

    Vertex* pLeft; //левый и правый "потомки" в дереве

    Vertex* pRight;

    int Balance; // параметр баланса

    };

    Vertex* pRoot; // указатель на корень ДБ-дерева
    //Сравнение данных при добавлении вершин в ДБ-дерево

    int Compare(struct Vertex* pVert1, struct Vertex* pVert2)

    {

    //сравнение названий улиц

    if (strncmp(pVert1->pData->street, pVert2->pData->street, 20) < 0)

    {

    return 1;

    }

    if (strncmp(pVert1->pData->street, pVert2->pData->street, 20) > 0)

    {

    return 0;

    }

    //сравнение номера у домов

    if (pVert1->pData->house < pVert2->pData->house)

    {

    return 1;

    }

    if (pVert1->pData->house > pVert2->pData->house)

    {

    return 0;

    }

    //сравнение ФИО граждан

    if (strncmp(pVert1->pData->name, pVert2->pData->name, 32) < 0)

    {

    return 1;

    }

    if (strncmp(pVert1->pData->name, pVert2->pData->name, 32) > 0)

    {

    return 0;

    }

    //сравнение номеров квартир

    if (pVert1->pData->apartment < pVert2->pData->apartment)

    {

    return 1;

    }

    if (pVert1->pData->apartment > pVert2->pData->apartment)

    {

    return 0;

    }

    //сравнение дат

    if (strncmp(pVert1->pData->date, pVert2->pData->date, 8) < 0)

    {

    return 1;

    }

    if (strncmp(pVert1->pData->date, pVert2->pData->date, 8) > 0)

    {

    return 0;

    }

    }
    // Добавление новой вершины в Б-дерево

    void B_Tree(Vertex*& p, Vertex* pNew, int& VR, int& HR) // VR/HR-переменные, опр-щие вериткальный/горизонтальный рост дерева

    {

    if (p == NULL)

    {

    p = pNew;

    VR = 1;

    return;

    }

    if (Compare(pNew, p) == 1)

    {

    B_Tree(p->pLeft, pNew, VR, HR);

    if (VR)

    {

    if (p->Balance == 0)

    {

    Vertex* q = p->pLeft;

    p->pLeft = q->pRight;

    q->pRight = p;

    p = q;

    q->Balance = 1;

    VR = 0;

    HR = 1;

    }

    else

    {

    p->Balance = 0;

    HR = 1;

    }

    }

    else

    {

    HR = 0;

    }

    }

    else

    {

    B_Tree(p->pRight, pNew, VR, HR);

    if (VR)

    {

    p->Balance = 1;

    VR = 0;

    HR = 1;

    }

    else

    {

    if (HR)

    {

    if (p->Balance > 0)

    {

    Vertex* q = p->pRight;

    p->pRight = q->pLeft;

    p->Balance = 0;

    q->Balance = 0;

    q->pLeft = p;

    p = q;

    VR = 1;

    HR = 0;

    }

    else

    {

    HR = 0;

    }

    }

    }

    }

    }
    // Создание дерева

    void Create()

    {

    pRoot = NULL;

    Data* p = records;

    int VR, HR;

    for (int i = 0; i < 4000; i++)

    {

    VR = 1;

    HR = 1;

    Vertex* pNew = new Vertex;

    pNew->pData = p;

    pNew->pLeft = NULL;

    pNew->pRight = NULL;

    pNew->Balance = 0;

    B_Tree(pRoot, pNew, VR, HR);

    p++;

    }

    }
    // Добавление элемента в очередь

    void PushQueue(struct Data* pData)

    {

    struct List* p = new List;

    p->pData = pData;

    if (pFirst == NULL)

    {

    pFirst = p;

    }

    else

    {

    pLast->pNext = p;

    }

    pLast = p;

    pLast->pNext = NULL;

    }
    // Подсчет кол-ва элементов в очереди

    int Count_Queue()

    {

    int s = 0;

    for (List* p = pFirst; p != NULL; s++)

    {

    p = p->pNext;

    }

    return s;

    }
    // Сброс очереди

    void Reset_Queue()

    {

    List* p = pFirst;

    List* pNext2;

    for (; p != NULL; p = pNext2)

    {

    pNext2 = p->pNext;

    delete p;

    }

    pFirst = NULL;

    pLast = NULL;

    }
    // Отбор названий улиц

    void Selection_Street(struct Vertex *p)

    {

    if (p == NULL)

    {

    return;

    }

    Selection_Street(p->pLeft);

    if ((pLast == NULL) || (strncmp(pLast->pData->street, p->pData->street, 20) != 0))

    {

    PushQueue(p->pData);

    }

    Selection_Street(p->pRight);

    }
    // Вывод на экран (построчно)

    void Print(int page)

    {

    List* p = pFirst;

    int i = 1, j;

    while (p != NULL)

    {

    j = i + page;

    if (j > Count_Queue())

    {

    j = Count_Queue();

    }

    printf("\n Всего записей: %i \n Записи с %i по %i", Count_Queue(), i, j);

    for (; (i <= j) && (p != NULL); i++)

    {

    printf("%.32s ул. %.20s д. %2i кв. %3i %.8s \n", p->pData->name, p->pData->street, p->pData->house, p->pData->apartment, p->pData->date);

    p = p->pNext;

    }

    rewind(stdin);

    system("pause");

    break;

    }

    }
    // Чтение записей из файла в ОЗУ

    bool Read_to_RAM(char* name)

    {

    FILE* file = fopen(name, "rb");

    if (file == NULL)

    {

    return false;

    }

    fread(records, sizeof(records), 1, file);

    fclose(file);

    return true;

    }
    //Основная функция

    int main()

    {

    setlocale(LC_ALL, "Russian"); // для вывода кириллицы в консоль

    Create();

    pFirst = NULL;

    pLast = NULL;

    FILE* file;

    if ((file=fopen("BASE4.DAT", "rb"))==NULL)

    {

    printf("\n Ошибка! Файл base4.dat не найден.");

    system("pause");

    return 0;

    }

    do

    {

    printf("\n---МЕНЮ---"); //организация меню

    printf("\n 1. Вывести названия улиц и подсчитать их количество.");

    printf("\n 2. Вывести упорядоченный список граждан проживающих на заданной улице не ранее, чем заданная дата поселения.");

    printf("\n 3. Выход.");

    printf("\n Введите номер выбранного пункта меню: ");

    scanf("%d", &numb);

    switch (numb)

    {

    case 1:

    {

    Reset_Queue();

    Selection_Street(pRoot);

    printf("\n В ДБ-дереве найдена информация о %i улиц.\n", Count_Queue());

    for (List* p = pFirst; p != NULL; p = p->pNext)

    {

    printf("ул. %.20s\n", p->pData->street);

    }

    system("pause");

    break;

    }

    case 2:

    {

    printf("\n Введите название улицы: ");

    scanf("%s", s_street);

    printf("\n Введите дату поселения: ");

    scanf("%s", s_date);

    /*

    if (pFirst != NULL)

    {

    Print();

    }

    else

    {

    printf("\n Ошибка. Не удалось найти информацию, соответствующую данным условиям.");

    system("pause");

    }*/

    break;

    }

    default:

    printf("\n Неверно выбран пункт меню.\n");

    }

    } while (numb != 3);

    return 0;

    }


    написать администратору сайта