Информационно-справочная система "Управление городом"

Исследование существующих методов организации динамических структур данных. Методы реализации мультисписковых структур используя особенности языка C++. Физическая структура данных для сохранения в файл. Разработка алгоритмов и реализация основных функций.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.01.2015
Размер файла 504,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Содержание

Введение

1. Постановка задачи

2. Анализ решаемой задачи

3. Исследование существующих методов организации динамических структур данных

4. Определение путей и методов решения задачи

4.1 Построение мультисписковых структур

4.2 Методы реализации мультисписковых структур используя особенности языка C++

5. Проектирование информационно-справочной системы

5.1 Разработка структуры данных

5.2 Проектирование физической структуры

5.3 Физическая структура данных для сохранения в файл

5.4 Разработка типов данных

5.5 Разработка алгоритмов и реализация основных функций

5.5.1 Алгоритм инициализации массива

5.5.2 Алгоритм расширение массива

5.5.3 Алгоритм вставки нового элемента в массив

5.5.4 Алгоритм удаления элемента

5.6 Основные файлы программы

5.7 Разработка интерфейса пользователя

Выводы

Перечень источников

Приложения

Введение

Информационно-справочная система (в дальнейшем - ИСС) разрабатывается согласно заданию варианта дипломной работы. Основной целью данной работы является реализация мультисписка в динамической памяти, используя массив указателей на неопределенный тип.

Во всех современных программах широко используются динамические структуры данных - очереди, стеки, деревья. Из курса программирования известно, что все эти структуры реализуются через списки. Широкое применение списков и мультисписков является типовым приемом повышения производительности, а изучение методов их программирования и обработки является актуальным. Полученные при этом знания и умения можно отнести к базовым, которые найдут применение при изучении будущих дисциплин, связанных с программированием и базами данных.

Разработанная система позволяет полностью реализовать поставленные перед ней задачи. ИСС оснащена рядом диалоговых форм ввода-вывода, которые облегчают добавление и редактирование информации. Проект позволяет управлять подобной мультисписковой структурой.

Программа имеет стандартный графический интерфейс Windows, проста в освоении и эксплуатации. При создании программы, была использована среда разработки QT Creator 5.3.2 и язык программирования C++.

1. Постановка задачи

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

Территория города разбита на отдельные районы. Каждый район обслуживается соответствующими ЖЭК. Такой ЖЭК содержит информацию о перечне обслуживаемых улиц с номерами домов; по каждому дому известен список квартир и их характеристики; по каждой квартире - список жильцов с их атрибутами.

По каждому из этих объектов хранится следующая информация:

1. РАЙОН: название района, номер жека, площадь

УЛИЦА: название улицы, ее возраст;

ДОМ: номер, площадь;

КВАРТИРА: номер квартиры, количество комнат;

ЖИТЕЛЬ: ФИО жителя, возраст.

Реализовать мультисписковую структуру, которая обеспечивает хранение информации и позволяет осуществить:

- Ввод, замену или удаление сведений о районе, улице, доме и т.д.;

- По имени жителя города поиск его координат (возможны дубликаты);

- Вывод наименований всех улиц города в алфавитном порядке.

Мультисписковую структуру необходимо реализовать с использованием динамических структур данных в куче (оперативной памяти).

Взаимодействие с пользователем ИСС организовать с помощью системы меню и структурированных форм ввода.

2. Анализ решаемой задачи

Основная задача проекта заключается в реализации информационно-справочной системы, которая должна обеспечить над мультиспиской структурой такие операции как: добавление, удаление элементов всех уровней иерархии, сохранение/загрузку мультисписка из файла.

Для решения данной задачи необходимо организовать такую структуру данных, которая могла бы работать с заранее неизвестным количеством элементов. Для заданой структуры целесообразно её разместить в оперативной памяти. По сравнению с файлом такая реализация будет превосходить по скорости обработки, так как динамическая память позволяет осуществлять доступ существенно быстрее, по сравнению с жестким диском. Единственной проблемой использования данного решения, заключается в том что, не имеется возможности сохранения информации и ее повторного использования. Поэтому данную структуру также необходимо сохранять в файл, и восстанавливать из него.

При реализации информационно-справочной системы на базе массива указателей на неопределенный тип необходимо ознакомиться с механизмом расширения массива при его переполнении, что обеспечит возможность хранения большего числа элементов списка, чем заранее задано размером массива, при его создании.

3. Исследование существующих методов организации динамических структур данных

Статическое распределение памяти требует резервирования объёма памяти для статических данных в тексте программы ещё до её выполнения. Динамическое распределение памяти предполагает определение требуемого объёма памяти в процессе выполнения программы. Требуемое пространство памяти выбирается из свободного адресного пространства ОЗУ.

Указатели динамической памяти используются для адресации (ссылки) на отдельный динамический объект или совокупность определённым образом организованных однотипных динамических объектов (переменных). И в каждый конкретный момент позволяет обратиться только к одному объекту. Меняя значение указателя, мы можем обратиться к другому динамическому объекту того же типа.

При этом мы должны организовать определенную динамическую структуру данных, которая позволит нам без особых усилий осуществлять требуемые манипуляции с теми данными, которые вводит пользователь. Один из способов построения списков, получивших широкое распространение, состоит в том, что элементы списка непосредственно не связаны между собой, а вместо этого указатели на эти элементы группируются в некотором одномерном массиве, который отражает структуру списка. Последовательность расположения указателей в таком массиве определяет последовательность расположения элементов в списке. Соответственно, перемещение элементов в списке сводиться к перемещению указателей в массиве.

Следовательно, для размещения представленного таким образом списка в памяти, в ней должны располагаться как сами элементы списка, так и массив указателей на эти элементы. Массив указателей может иметь фиксированный размер и постоянное место размещения в памяти, или переменный размер, а вследствие этого, и динамически меняющееся его место в памяти. Соответственно, различаются статические и динамические массивы указателей.

Для размещения данных мультисписковой структуры более рационально использовать именно динамические массивы указателей, поскольку заранее неизвестно, сколько элементов списка будет размещено пользователем на том или ином уровне иерархии. Использование такой динамической структуры позволит по необходимости разместить в памяти массив большего размера, что позволит добавлять данные, даже после того, как первоначальный размер массива будет превышен.

В отличие от динамических, статические массивы имеют заранее заданный размер и не меняют его в ходе работы программы. Это является существенным недостатком, с которым нужно считаться при выборе структуры для хранения данных. Главная проблема состоит в том, что при размещении в памяти массива слишком малого размера, добавления новых элементов в массив будет невозможным. С другой стороны, при выделении массива слишком большого размера появляется вероятность нерационального использования системных ресурсов (оперативной памяти), поскольку не всегда будет использоваться хотя бы половина из выделенной памяти.

Проанализировав преимущества и недостатки каждого из методов, было принято решение о выборе динамического массива указателей в качестве структуры для хранения данных. Данный метод реализации мультисписка позволит производить ранее описанные операции по обработке иерархической структуры данных, заданной согласно варианту дипломного проекта.

4. Определение путей и решения задачи

4.1 Построение мультисписковых структур

Для обработки данной структуры, т.е. для реализации задачи ввода, удаления, добавления данных о каждом структурном элементе необходимы функции соответствующие данным операциям. Особенностями построения мультисписка будет то, что для обработки мультисписковой структуры используются инвариантные функции поиска элементов в иерархической структуре. Для этого необходимо в функцию поиска передавать указатель на функцию сравнения, которая будет возвращать признак равенства ключевых полей структур, которые находятся на одном уровне иерархии.

Особенностью построения мультисписковых структур является также то, что для нахождения какого-либо элемента, по его ключевому полю, в каком-либо уровне или подуровне не нужно выполнять просмотр всех элементов на этом уровне, поскольку каждый уровень мультисписковой структуры отсортирован, т.е. элементы в массиве расположены в алфавитном порядке.

4.2 Методы реализации мультисписковых структур используя особенности языка C++

Как уже было отмечено ранее, использование указателей на функции сравнения, для передачи их в качестве параметров функции позволяет реализовать инвариантные функции поиска (как методом перебора, так и методом бинарного (двоичного) поиска), т.е. такие, которые могут вызываться для обработки элементов разных уровней иерархии.

Преимуществами такой реализации является то, что для обеспечения поиска позиции вставки нового элемента в список или позиции уже добавленного необходима всего лишь одна функция, которая будет вызываться с разными параметрами, в том числе с указателем на разные функции сравнения. Это существенно уменьшает количество подпрограмм, которые необходимо реализовать для обработки мультисписковой структуры данных.

Таким образом, наличие в языке C++ аппарата переменных типа указатель на функцию предоставляет возможности по гибкому изменению.

Действительно, связывая такую переменную с конкретной функцией, мы получаем возможность в одной и той же точке программы, в зависимости от конкретных условий, обращаться к разным функциям.

Еще одной особенностью реализации можно назвать структуру массива указателей. Особенность состоит в том, что первые два элемента массива являются служебными. В которых содержаться значения размера массива и количества элементов в нем. Обращение к этим служебным элементам осуществляется по индексам -1 и -2, поскольку указатель на начало массива смещен на два элемента «вниз». Под понятием «вниз» следует понимать, что к адресу указателя прибавляется удвоенный размер указателя (4байт*2 = 8байт). Это можно осуществлять при помощь адресной арифметики языка C++ (например, чтобы выполнить ранее описанное действие достаточно написать list+=2, где list - это указатель на начало массива).

Таким образом, указатель на начало массива имеет индекс 0, но на самом деле является вторым элементом в нем. Первые два выделены как служебные, значения которых используются для организации цикла прохода по всему уровню или подуровню мультисписковой структуры. Например, в функции вывода содержимого списка в QTreeWidget или QTableWidget (дерево и таблицу соответственно).

5. Проектирование информационно-справочной системы

5.1 Разработка структуры данных

Для организации структуры данных нам потребуется главный указатель на массив указателей (это будет первый уровень иерархии) на список улиц. Каждая структура, кроме структур, используемых на нижнем уровне иерархии, должна иметь поле-указатель на массив указателей (void**). Так, например, каждая структура для улицы должна иметь указатель на массив, хранящий указатели на дома. Однако, для структуры, описывающей жителей, такие поля не нужны, поскольку у неё нет подуровней, и она образует последний четвертый уровень иерархии в данной мультисписковой структуре. Как уже было упомянуто ранее, каждый массив указателей должен в себе содержать два дополнительных поля, одно из них указывает на реальное количество элементов в массиве, а другое указывает на размер массива. Эти поля располагаются в начале массива на первой и второй позиции (однако, следует помнить о том, что указатель на начало массива был сдвинут, и обращаться к служебным полям следует по индексам -1 и -2).

5.2 Проектирование физической структуры

Для реализации поставленной задачи необходимо выбрать способы и структуры реализации списка и хранения данных. Выбор массива указателей имеет преимущества по скорости и простоте обработки перед обычной линейной структурой и по использованию памяти по сравнению со статическими структурами. Поскольку мультисписковая структура включает совокупность массивов указателей, то удобно ее изображать в виде иерархической структуры, определенным образом связанных между собой.

Рисунок 5.1 - Физическая структура ИИС

Логическую структуру можно описать следующим образом: 0-м уровнем является «Улица», связанная с «Домом», который, является 1-м уровнем иерархии. «Дом» в свою очередь связан со 2-м уровнем «Квартира», который в свою очередь связанный с 3-м уровнем - «Жители».

5.3 Физическая структура данных для сохранения в файл

В ходе проектирования было принято решение сохранять структуру в двоичный файл формата .cml. Это сделано для того, что бы исключить возможность загрузки файлов неподходящего содержимого. Операции сохранение списка в файл и восстановления списка из файла реализованы согласно задания обусловлено рядом причин, которые описаны ниже. В настоящее время формат XML (Extensible Markup Language, расширяемый язык разметки) -- одна из самых активно используемых технологий.

XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете.

С логической точки зрения, документ состоит из пролога и корневого элемента. Корневой элемент-- обязательная часть документа, пролог, вообще говоря, может отсутствовать.

Корневой элемент может включать (а может не включать) вложенные в него элементы и символьные данные, а также комментарии. Вложенные в корневой элемент элементы, в свою очередь, могут включать вложенные в них элементы, символьные данные и комментарии, и так далее.

Элементы документа должны быть правильно вложены: любой элемент, начинающийся внутри другого элемента (то есть любой элемент документа, кроме корневого), должен заканчиваться внутри элемента, в котором он начался.

Объявления, инструкции обработки и элементы могут иметь связанные с ними атрибуты. Атрибуты (англ. attribute) используются для связывания с логической единицей текста пар имя-значение.

Описать структуру в файле можно следующим образом. В качестве корневого тега будет размещен начальный тег <root>, которому соответствует конечный (закрывающийся) тег </root>.

Все теги для данных мультисписка будут располагаться между корневыми тегами в файле. Для каждого изделия, узла, компонента размещается тег <object>, имеющий свой конечный аналог </object>. Каждый такой тег имеет свои атрибуты, которые являются значениями информационных полей структуры, описывающей каждый из изделий.

5.4 Разработка типов данных

Ниже приводится описание типов данных, применяемых при конструировании необходимой мультисписковой структуры, заданной вариантом дипломного проекта.

struct Rayon{

QString name;

QString square;

QString number_zhek;

void **sublev;

};

struct street{

QString name;

QString year;

void **sublev;

};

struct house{

QString number;

QString square;

void **sublev;

};

struct flat{

QString number;

QString cnt_room;

void **sublev;

};

struct people{

QString name;

QString surname;

QString age;

};

Структура для улиц Tstreet содержит в себе информационные поля для хранения названия улицы и номера ЖЭКа - street и gek. В структуру так же включен указатель sublev типа void**. Это указатель на массив «безтиповых» указателей, использующихся для хранения домов, относящихся к данной улице.

Структура для домов Thouse содержит информационное поле houseNumber для номера дома, а также указатель на массив «безтиповых» указателей на квартиры - sublev.

Структура для квартир Tflat содержит информационные поля flatNumber, roomsCount, phone для номера квартиры, количества комнат и номера телефона соответственно, а также указатель на массив «безтиповых» указателей на жителей - sublev.

Структура для жителей Tperson содержит информационные поля name, age, work для ФИО, возраста и деятельности жителя соответсвенно.

Выбор типа для каждого поля структуры обоснован лишь их назначением и собственными предпочтениями, поскольку условием задания к дипломному проекту не указаны конкретные типы, которые необходимо использовать для реализации мультисписковой структуры.

5.5 Разработка алгоритмов и реализация основных функций

Для создания и реализации мультисписковой структуры необходимо обеспечить инициализацию массива, его расширение, а так же возможность добавления, удаления, поиска элементов.

5.5.1 Инициализация массива

Блок-схема алгоритма выполнения инициализации массива указателей имеет следующий вид (Рисунок 5.2).

Рисунок 5.2 - Блок-схема алгоритма инициализации массива

Первоначально нужно выделить память для хранения указателей. После, проинициализировать массив, путём сдвига указателя на массив на +2 единицы, записать в ячейку с индексом cellSize размер массива, а в ячейку cellCount записать 0.

5.5.2 Алгоритм расширения массива

Блок-схема алгоритма выполнения расширения массива указателей имеет следующий вид (Рисунок 5.3).

Рисунок 5.3 - Блок-схема алгоритма расширения массива указателей

Для начала нужно выделить память под новый массив указателей. Размер нового будет равен (размер старого + extBy + 2). Далее нам необходимо его инициализировать. Для этого в ячейку cellSize записываем размер нового массива, а в ячейку cellCount записываем количество уже существующих элементов. После, копируем данные из исходного массива в новый, осводождаем память исходного массива.

5.5.3 Алгоритм вставки элемента в массив

Блок-схема алгоритма выполнения вставки элемента в массив указателей имеет следующий вид (Рисунок 5.4).

Рисунок 5.4 - Блок-схема алгоритма вставки элемента в массив

5.5.4 Алгоритм удаления элемента

Функция удаления принимает в качестве параметров индекс удаляемого элемента и структуру.

Блок-схема алгоритма выполнения расширения массива имеет следующий вид (Рисунок 5.5).

Рисунок 5.5 - Блок-схема алгоритма удаления элемента в массиве

Написание функций удаления для элементов списка высшего уровня иерархии сводится к тому, что в теле функции необходимо вызвать еще и функцию удаления подуровня. По такому принципу и строятся функции удаления элементов для каждого из уровней при реализации дипломного проекта.

5.6 Основные файлы программы

Для разработки дипломного проекта использовались четыре основных типа файлов - заголовочный файл с расширением .h, файл реализации с расширением .срр, файл форм, который имеет расширение .ui и файл ресурсов с расширением .qrc. Список файлов, которые используются при реализации и компиляции дипломного проекта приведен ниже.

Файл types.hсодержит описание основных типов (структур и указателей на функции), а так же описание констант.

Файл prototypefunc.h содержит описание заголовков функций (инициализации, добавления, расширения, удаления и других).

Файл functions.cpp содержит реализацию функций, описанных в заголовочном файле functions.h .

Файл mainwindow.h содержит описание класса (методы, конструктор, деструктор, члены класса) главной формы проекта, вызывающейся при открытии ехе-модуля или запуске его из среды разработки.

Файл mainwindow.cpp содержит реализацию методов, описанных в заголовочном файле mainwindow.h.

5.7 Разработка интерфейса пользователя

Интерфейс ИСС составлен так, чтобы максимально упростить работу пользователя с ней. Он даёт возможность визуально представлять списковую структуру в виде дерева и просматривать поля всех элементов текущего подсписка в виде таблицы. Для достижения этой цели были использованы следующие компоненты:

Компонент MenuBar предназначен для реализации главного меню в приложении. В нем содержатся все возможные команды обработки мультисписка и команды управления приложением.

Компонент QPushButton предназначен для создания кнопок.

Компонент QLineEdit предназначен для ввода информации.

Компонент QLabel предназначен для отображения текста, используется для того, чтобы сделать надпись.

Компонент QComboBox предназначен для создания выпадающих меню.

Компонент QRadioButton предназначен для создания кнопок навигации.

Компонент QSpinBox предназначен для ввода числовых данных.

Компонент QTreeWidget предназначен для отображения иерархии мультисписка в виде дерева, а также для навигации по структуре.

Компонент QTableWidget предназначен для отображения подробной информации о каждом элементе мультисписке и его подуровней в табличном виде.

Выводы

Результатом выполнения дипломного проекта является работоспособная ИИС, которая может выполнять все функции, предусмотренные в техническом задании. То есть полностью реализована работа с «Данными по упавлению городом»: добавление, изменение и удаление элементов, сохранение и восстановление списка в/из файла. Использование таких компонентов, как QTreeWidget и QTableWidget позволило устроить удобную навигацию и визуализацию всех уровней мультисписковой структуры.

Таким образом, реализованная ИСС полностью соответствует требованиям технического задания дипломного проекта.

Перечень использованых источников

Структуры данных. Методические указания к самостоятельному изучению дисциплины "Программирование" для студентов Направления "Компьютерная инженерия". Составители В.И. Павловский, П.Г. Бивойно, Н.В. Демшевская, В.В. Соломаха. - Чернигов, ЧДТУ, 2001. 82 с.

Методические указания к дипломному проектированию по дисциплине "Структуры и алгоритмы обработки данных" для студентов направления подготовки 6.050102 - "Компьютерная инженерия.

Приложения

Обозначение

Наименование

Примечание

Документация

КИ 133311.005.012

Информационно-справочная

система «Управление городом»

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

КИ 133311.005.034

Информационно-справочная

система «Управление городом»

Руководство пользователя

Комплексы

Qt Creator 5.3.2

OC Windows 8

Приложение A

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

ТЕКСТ ФАЙЛА types.H

#ifndef TYPES_H

#define TYPES_H

#include <string>

#include <qstring.h>

#include <QString>

using namespace std;

#define DELTA 3

#define POS_CNT -1

#define POS_SZ -2

#define SIZE_AR_FIRST 5

typedef int (*cmp)(void *p, QString key);

struct Rayon{

QString name;

QString square;

QString number_zhek;

void **sublev;

};

struct street{

QString name;

QString year;

void **sublev;

};

struct house{

QString number;

QString square;

void **sublev;

};

struct flat{

QString number;

QString cnt_room;

void **sublev;

};

struct people{

QString name;

QString surname;

QString age;

};

struct ray_file{

char name[30];

char square[10];

char number_szhek[10];

int cnt_street;

};

struct street_file{

char name[15];

char year[5];

int cnt_house;

};

struct house_file{

char number[5];

char square[10];

int cnt_flat;

};

struct flat_file{

char number[5];

char cnt_room[5];

int cnt_people;

};

struct people_file{

char name[30];

char surname[30];

char age[5];

};

#endif // TYPES_H

ТЕКСТ ФАЙЛА prototypefunc.H

#ifndef PROTOTYPEFUNC_H

#define PROTOTYPEFUNC_H

#include "types.h"

#include "QString"

//сравнение для разных уровней мультиспискка

int cmpray(void*p, QString key);

int cmpstreet(void*p, QString key);

int cmphouse(void*p, QString key);

int cmpflat(void *p, QString key);

int cmppeople(void *p, QString key);

//конец

//

void**initarray();

void extend(void **&start);

//

//очистка

void clearpeople(void **&start);

void clearflat(void **&start);

void clearhouses(void **&start);

void clearstreets(void **&start);

void clearlist(void **&start);

//очистка

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

void findel(void **start, QString key, int &findpos, int &findok, cmp func);

//*****

//вставка

void push_order(void **&start, void *data, int &pos);

//******

//удаление елементов

void removeel(void **&start, int &posdel);

void removeflat(void **&start, int pos);

void removehouse(void **&start, int pos);

void removestreet(void **&start, int pos);

void removerayon(void **&start, int pos);

//*****

//доступ к елементу списка

void *getcurrent(void **start, int i);

//*****

//добавление

void add_rayon_tolist(void **&start, QString name, QString square, QString numberzhack);

void add_street_tolist(void **&start, QString nameray, QString namestr, QString year);

void add_house_tolist(void **&start, QString rayname, QString streetneme, QString number, QString square);

void add_flat_tolist(void **&start, QString rayname, QString streetname, QString numberhouse, QString number, QString cnt_room);

void add_people_tolist(void **&start, QString rayname, QString streetname, QString numberhouse, QString numberflat, QString name, QString surname, QString age);

//******

//удаление

void del_people(void **&start, QString rayname, QString streename, QString numberhouse, QString numberflat, QString namepeople);

void del_flat(void **&start, QString rayname, QString streetname, QString numberhouse, QString numberflat);

void del_house(void **&start, QString rayname, QString streetname, QString numberhouse);

void del_street(void **&start, QString rayname, QString streetname);

void del_rayon(void **&start, QString rayname);

//**********

//поиск

bool find_item_ray(void **start, QString ray_name);

bool find_item_street(void **start, QString rayname, QString streetname);

bool find_item_house(void **start, QString ray, QString streetname, QString housenumber);

bool find_item_flat(void **start, QString rayname, QString streetname, QString housenumber, QString flatname);

bool find_item_people(void **start, QString rayname, QString streetname, QString housenumber, QString flatnumber, QString peoplename);

void *findrayon(void **start, QString rayname);

void *findstreeet(void **start, QString rayname, QString streetname);

void *findhouse(void **start, QString rayname, QString streetname, QString housenum);

void *findflat(void **start, QString rayname, QString streetname, QString housenum, QString flatnum);

void *findpeople(void **start, QString rayname, QString streetname, QString housenum, QString flatnum, QString peoplename);

//работа с файлами

int savelist(char *filename, void **start);

int save_street(void **start ,FILE *f, int cnt_street);

int save_house(void **start, FILE *f, int cnt_house);

int save_flat(void **start, FILE *f, int cnt_flat);

int save_peopleslist(void **start, FILE *f, int cnt_people);

int loadlist(char *filename, void **&start);

int load_street(void **&start, FILE *f, int cnt_street);

int load_house(void **&start, FILE *f, int cnt_house);

int load_flat(void **&start, FILE *F, int cnt_flat);

int load_peoplelist(void **&start, FILE *f, int cnt_people);

//конец

#endif // PROTOTYPEFUNC_H

ТЕКСТ ФАЙЛА FUNCTIONS.CPP

#include "types.h"

#include <QString>

#include "qstring.h"

#include "prototypefunc.h"

#include <iostream>

using namespace std;

int cmppeople(void *p, QString key){

if(((people*)p)->name==key){

return 0;

}

if(((people*)p)->name>key){

return 1;

}

if(((people*)p)->name<key){

return -1;

}

int cmpflat(void *p, QString key){

if(((flat*)p)->number==key){

return 0;

}

if(((flat*)p)->number>key){

return 1;

}

if(((flat*)p)->number<key){

return -1;

}

int cmphouse(void *p, QString key){

if(((house*)p)->number==key){

return 0;

}

if(((house*)p)->number>key){

return 1;

}

if(((house*)p)->number<key){

return -1;

}

int cmpstreet(void *p, QString key){

if(((street*)p)->name==key){

return 0;

}

if(((street*)p)->name>key){

return 1;

}

if(((street*)p)->name<key){

return -1;

}

int cmpray(void *p, QString key){

if(((Rayon*)p)->name==key){

return 0;

}

if(((Rayon*)p)->name>key){

return 1;

}

if(((Rayon*)p)->name<key){

return -1;

}

void **initarray(){

void **p=new void*[SIZE_AR_FIRST+2];

p=p+2;

((int*)p)[POS_CNT]=0;

((int*)p)[POS_SZ]=SIZE_AR_FIRST;

return p;

}

void extend(void **&start){

int size=((int*)start)[POS_SZ];

int cnt=((int*)start)[POS_CNT];

size=size+DELTA;

void **p=new void*[size];

((int*)p)[POS_SZ]=size;

((int*)p)[POS_CNT]=cnt;

for(int i=0;i<(size-DELTA);i++){

p[i]=start[i];

}

start=p;

}

void findel(void **start, QString key, int &findpos, int &findok, cmp func){

int hi, low, middl;

int resultcmp;

findok=0;

if(((int*)start)[POS_CNT]==0){

findpos=0;

return;

}

low=0;

hi=((int*)start)[POS_CNT]-1;

while(low<=hi){

middl=(hi+low)/2;

resultcmp=func(start[middl], key);

if(resultcmp==0){

findpos=middl;

findok=1;

return;

}

if(resultcmp==1){

hi=middl-1;

}else{

low=middl+1;

}

findpos=low;

}

void removeel(void **&start, int &posdel){

int cnt=((int*)start)[POS_CNT];

void *wp=start[posdel];

for(int i=posdel;i<cnt;i++){

start[i]=start[i+1];

}

free(wp);

cnt--;

((int*)start)[POS_CNT]=cnt;

}

void clearpeople(void **&start){

int cnt=((int*)start)[POS_CNT];

int p=0;

for(int i=0;i<cnt;i++){

removeel(start, p);

}

void removeflat(void **&start, int pos){

clearpeople(((flat*)start[pos])->sublev);

removeel(start, pos);

}

void clearflat(void **&start){

int cnt=((int*)start)[POS_CNT];

int p=0;

for(int i=0;i<cnt;i++){

removeflat(start, p);

}

void removehouse(void **&start, int pos){

clearflat(((house*)start[pos])->sublev);

removeel(start, pos);

}

void clearhouses(void **&start){

int cnt=((int*)start)[POS_CNT];

int p=0;

for(int i=0;i<cnt;i++){

removehouse(start, p);

}

void removestreet(void **&start, int pos){

clearhouses(((street*)start[pos])->sublev);

removeel(start, pos);

}

void clearstreets(void **&start){

int cnt=((int*)start)[POS_CNT];

int p=0;

for(int i=0;i<cnt;i++){

removestreet(start, p);

}

void removerayon(void **&start, int pos){

clearstreets(((Rayon*)start[pos])->sublev);

removeel(start, pos);

}

void clearlist(void **&start){

int cnt=((int*)start)[POS_CNT];

int p=0;

for(int i=0;i<cnt;i++){

removerayon(start, p);

}

void push_order(void **&start, void *data, int &pos){

int cnt=((int*)start)[POS_CNT];

int sz=((int*)start)[POS_SZ];

if(cnt==sz){

extend(start);

}

if(pos==cnt){

start[pos]=data;

}else{

for(int i=cnt-1;i>=pos;i--){

start[i+1]=start[i];

}

start[pos]=data;

}

((int*)start)[POS_CNT]++;

}

void *getcurrent(void **start, int i){

return start[i];

}

int savelist(char *filename, void **start){

FILE *f=fopen(filename, "wb");

if(f==NULL){

return 0;

}

int cnt_ray;

int i;

ray_file _ray;

cnt_ray=((int*)start)[POS_CNT];

if(cnt_ray==0){

return 1;

}

fwrite(&cnt_ray, sizeof(cnt_ray), 1, f);

for(i=0;i<cnt_ray;i++){

QString name, square, numberzhack;

Rayon *wp=(Rayon*)getcurrent(start, i);

name=wp->name;

square=wp->square;

numberzhack=wp->number_zhek;

strcpy(_ray.name, name.toLatin1().data());

strcpy(_ray.square, square.toLatin1().data());

strcpy(_ray.number_szhek, numberzhack.toLatin1().data());

int cnt_street=((int*)wp->sublev)[POS_CNT];

_ray.cnt_street=cnt_street;

fwrite(&_ray, sizeof(_ray), 1, f);

if(cnt_street!=0){

save_street(wp->sublev, f, cnt_street);

}

fclose(f);

return 1;

}

int save_street(void **start, FILE *f, int cnt_street){

street_file streetf;

int i;

for(i=0;i<cnt_street;i++){

QString name, year;

street *emp=(street*)getcurrent(start, i);

name=emp->name;

year=emp->year;

strcpy(streetf.name, name.toLatin1().data());

strcpy(streetf.year, year.toLatin1().data());

int cnt_house=((int*)emp->sublev)[POS_CNT];

streetf.cnt_house=cnt_house;

fwrite(&streetf, sizeof(streetf), 1, f);

if(cnt_house!=0){

save_house(emp->sublev, f, cnt_house);

}

return 1;

}

int save_house(void **start, FILE *f, int cnt_house){

house_file housef;

int i;

for(i=0;i<cnt_house;i++){

QString number, square;

house *pointer=(house*)getcurrent(start, i);

number=pointer->number;

square=pointer->square;

strcpy(housef.number, number.toLatin1().data());

strcpy(housef.square, square.toLatin1().data());

int cnt_flat=((int*)pointer->sublev)[POS_CNT];

housef.cnt_flat=cnt_flat;

fwrite(&housef, sizeof(housef), 1, f);

if(cnt_flat!=0){

save_flat(pointer->sublev, f, cnt_flat);

}

return 1;

}

int save_flat(void **start, FILE *f, int cnt_flat){

flat_file flatf;

int i;

for(i=0;i<cnt_flat;i++){

QString number, cnt_room;

flat *pp=(flat*)getcurrent(start, i);

number=pp->number;

cnt_room=pp->cnt_room;

strcpy(flatf.number, number.toLatin1().data());

strcpy(flatf.cnt_room, cnt_room.toLatin1().data());

int cntpeople=((int*)pp->sublev)[POS_CNT];

flatf.cnt_people=cntpeople;

fwrite(&flatf, sizeof(flatf), 1, f);

if(cntpeople!=0){

save_peopleslist(pp->sublev, f, cntpeople);

}

return 1;

}

int save_peopleslist(void **start, FILE *f, int cnt_people){

people_file peoplw;

int i;

for(i=0;i<cnt_people;i++){

QString name, surname, age;

people *lp=(people*)getcurrent(start, i);

name=lp->name;

surname=lp->surname;

age=lp->age;

strcpy(peoplw.name, name.toLatin1().data());

strcpy(peoplw.surname, surname.toLatin1().data());

strcpy(peoplw.age, age.toLatin1().data());

fwrite(&peoplw, sizeof(peoplw), 1, f);

}

return 1;

}

int loadlist(char *filename, void **&start){

FILE *f=fopen(filename, "rb");

if(f==NULL){

return 0;

}

int countray;

ray_file s_ray;

void *read;

int i;

fread(&countray, sizeof(countray), 1, f);

if(countray==0){

return 1;

}

for(i=0;i<countray;i++){

fread(&s_ray, sizeof(s_ray), 1, f);

read=new Rayon;

((Rayon*)read)->name=s_ray.name;

((Rayon*)read)->number_zhek=s_ray.number_szhek;

((Rayon*)read)->square=s_ray.square;

((Rayon*)read)->sublev=initarray();

int posadd, loop;

findel(start, s_ray.name, posadd, loop, cmpray);

push_order(start, read, posadd);

int cnt_street=s_ray.cnt_street;

if(cnt_street!=0){

load_street(((Rayon*)read)->sublev, f, cnt_street);

}

fclose(f);

return 1;

}

int load_street(void **&start, FILE *f, int cnt_street){

street_file fstret;

void *val;

int i;

for(i=0;i<cnt_street;i++){

fread(&fstret, sizeof(fstret), 1, f);

val=new street;

((street*)val)->name=fstret.name;

((street*)val)->year=fstret.year;

((street*)val)->sublev=initarray();

int posadd, lop;

findel(start, fstret.name, posadd, lop, cmpstreet);

push_order(start, val, posadd);

int cnt_house=fstret.cnt_house;

if(cnt_house!=0){

load_house(((street*)val)->sublev, f, cnt_house);

}

return 1;

}

int load_house(void **&start, FILE *f, int cnt_house){

house_file fhouse;

void *readp;

int i;

for(i=0;i<cnt_house;i++){

fread(&fhouse, sizeof(fhouse), 1, f);

readp=new house;

((house*)readp)->number=fhouse.number;

((house*)readp)->square=fhouse.square;

((house*)readp)->sublev=initarray();

int posadd, zaloop;

findel(start, fhouse.number, posadd, zaloop, cmphouse);

push_order(start, readp, posadd);

int cntflat=fhouse.cnt_flat;

if(cntflat!=0){

load_flat(((house*)readp)->sublev, f, cntflat);

}

return 1;

}

int load_flat(void **&start, FILE *F, int cnt_flat){

flat_file flatf;

void *sread;

int i;

for(i=0;i<cnt_flat;i++){

fread(&flatf, sizeof(flatf), 1, F);

sread=new flat;

((flat*)sread)->number=flatf.number;

((flat*)sread)->cnt_room=flatf.cnt_room;

((flat*)sread)->sublev=initarray();

int posadd, lop;

findel(start, flatf.number, posadd, lop, cmpflat);

push_order(start, sread, posadd);

int cntpeople=flatf.cnt_people;

if(cntpeople!=0){

load_peoplelist(((flat*)sread)->sublev, F, cntpeople);

}

return 1;

}

int load_peoplelist(void **&start, FILE *f, int cnt_people){

people_file fpeop;

void *poin;

int i;

for(i=0;i<cnt_people;i++){

fread(&fpeop, sizeof(fpeop), 1, f);

poin=new people;

((people*)poin)->age=fpeop.age;

((people*)poin)->name=fpeop.name;

((people*)poin)->surname=fpeop.surname;

int posadd, lop;

findel(start, fpeop.name, posadd, lop, cmppeople);

push_order(start, poin, posadd);

}

return 1;

}

void add_rayon_tolist(void **&start, QString name, QString square, QString numberzhack){

int pos_ray, loop;

void *pnew=new Rayon;

((Rayon*)pnew)->name=name;

((Rayon*)pnew)->number_zhek=numberzhack;

((Rayon*)pnew)->square=square;

((Rayon*)pnew)->sublev=initarray();

findel(start, name, pos_ray, loop, cmpray);

push_order(start, pnew, pos_ray);

}

void add_street_tolist(void **&start, QString nameray, QString namestr, QString year){

int pos_ray=0, pos_street=0, loop=0;

findel(start, nameray, pos_ray, loop, cmpray);

if(loop==0){

return;

}

void *pnew=new street;

((street*)pnew)->name=namestr;

((street*)pnew)->year=year;

((street*)pnew)->sublev=initarray();

findel(((Rayon*)(start[pos_ray]))->sublev, namestr, pos_street, loop, cmpstreet);

push_order(((Rayon*)start[pos_ray])->sublev, pnew, pos_street);

}

void add_house_tolist(void **&start, QString rayname, QString streetneme, QString number, QString square){

int posray, posstreet, poshouse, looppos;

findel(start, rayname, posray, looppos, cmpray);

if(looppos==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streetneme, posstreet, looppos, cmpstreet);

if(looppos==0){

return;

}

void *pnew=new house;

((house*)pnew)->number=number;

((house*)pnew)->square=square;

((house*)pnew)->sublev=initarray();

findel(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, number, poshouse, looppos, cmphouse);

push_order(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, pnew, poshouse);

}

void add_flat_tolist(void **&start, QString rayname, QString streetname, QString numberhouse, QString number, QString cnt_room){

int posray, posstreet, poshouse, posflat, loop;

findel(start, rayname, posray, loop, cmpray);

if(loop==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstreet, loop, cmpstreet);

if(loop==0){

return;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, numberhouse, poshouse, loop, cmphouse);

if(loop==0){

return;

}

void *pnew=new flat;

((flat*)pnew)->number=number;

((flat*)pnew)->cnt_room=cnt_room;

((flat*)pnew)->sublev=initarray();

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev, number, posflat, loop, cmpflat);

push_order(((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev, pnew, posflat);

}

void add_people_tolist(void **&start, QString rayname, QString streetname, QString numberhouse, QString numberflat, QString name, QString surname, QString age){

int posray, posstreet, poshouse, posflat, pospeople, turn;

findel(start, rayname, posray, turn, cmpray);

if(turn==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstreet, turn, cmpstreet);

if(turn==0){

return;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, numberhouse, poshouse, turn, cmphouse);

if(turn==0){

return;

}

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev, numberflat, posflat, turn, cmpflat);

if(turn==0){

return;

}

void *pnew=new people;

((people*)pnew)->name=name;

((people*)pnew)->surname=surname;

((people*)pnew)->age=age;

findel(((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev[posflat])->sublev, name, pospeople, turn, cmppeople);

push_order(((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev[posflat])->sublev, pnew, pospeople);

}

void del_rayon(void **&start, QString rayname){

int delpos, turn;

findel(start, rayname, delpos, turn, cmpray);

if(turn==0){

return;

}

removerayon(start, delpos);

}

void del_street(void **&start, QString rayname, QString streetname){

int posray, posstreet, turn;

findel(start, rayname, posray, turn, cmpray);

if(turn==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstreet, turn, cmpstreet);

if(turn==0){

return;

}

removestreet(((Rayon*)start[posray])->sublev, posstreet);

}

void del_house(void **&start, QString rayname, QString streetname, QString numberhouse){

int posray, posstreet, poshouse, turn;

findel(start, rayname, posray, turn, cmpray);

if(turn==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstreet, turn, cmpstreet);

if(turn==0){

return;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, numberhouse, poshouse, turn, cmphouse);

if(turn==0){

return;

}

removehouse(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, poshouse);

}

void del_flat(void **&start, QString rayname, QString streetname, QString numberhouse, QString numberflat){

int posray, posstreet, poshouse, posflat, turn;

findel(start, rayname, posray, turn, cmpray);

if(turn==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstreet, turn, cmpstreet);

if(turn==0){

return;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, numberhouse, poshouse, turn, cmphouse);

if(turn==0){

return;

}

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev, numberflat, posflat, turn, cmpflat);

if(turn==0){

return;

}

removeflat(((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev, posflat);

}

void del_people(void **&start, QString rayname, QString streename, QString numberhouse, QString numberflat, QString namepeople){

int posray, posstreet, poshouse, posflat, pospeople, perekluchatel;

findel(start, rayname, posray, perekluchatel, cmpray);

if(perekluchatel==0){

return;

}

findel(((Rayon*)start[posray])->sublev, streename, posstreet, perekluchatel, cmpstreet);

if(perekluchatel==0){

return;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev, numberhouse, poshouse, perekluchatel, cmphouse);

if(perekluchatel==0){

return;

}

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev, numberflat, posflat, perekluchatel, cmpflat);

if(perekluchatel==0){

return;

}

findel(((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev[posflat])->sublev, namepeople, pospeople, perekluchatel, cmppeople);

if(perekluchatel==0){

return;

}

removeel(((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstreet])->sublev[poshouse])->sublev[posflat])->sublev, pospeople);

}

//**********************************************

bool find_item_ray(void **start, QString ray_name){

int pos_trig, pos_ray;

findel(start, ray_name, pos_ray, pos_trig, cmpray);

if(pos_trig==1){

return true;

}else{

return false;

}

void *findrayon(void **start, QString rayname){

int pos_trig, pos_ray;

findel(start, rayname, pos_ray, pos_trig, cmpray);

return start[pos_ray];

}

bool find_item_street(void **start, QString rayname, QString streetname){

int pos_trig, posray, posstr;

findel(start, rayname, posray, pos_trig, cmpray);

if(pos_trig==0){

return false;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstr, pos_trig, cmpstreet);

if(pos_trig==0){

return false;

}else{

return true;

}

void *findstreeet(void **start, QString rayname, QString streetname){

int pos_trig, posray, posstr;

findel(start, rayname, posray, pos_trig, cmpray);

findel(((Rayon*)start[posray])->sublev, streetname, posstr, pos_trig, cmpstreet);

return ((Rayon*)start[posray])->sublev[posstr];

}

bool find_item_house(void **start, QString ray, QString streetname, QString housenumber){

int pos_trig, posray, posstr, poshouse;

findel(start, ray, posray, pos_trig, cmpray);

if(pos_trig==0){

return false;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstr, pos_trig, cmpstreet);

if(pos_trig==0){

return false;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstr])->sublev, housenumber, poshouse, pos_trig, cmphouse);

if(pos_trig==0){

return false;

}else{

return true;

}

void *findhouse(void **start, QString rayname, QString streetname, QString housenum){

int pos_trig, posray, posstr, poshouse;

findel(start, rayname, posray, pos_trig, cmpray);

findel(((Rayon*)start[posray])->sublev, streetname, posstr, pos_trig, cmpstreet);

findel(((street*)((Rayon*)start[posray])->sublev[posstr])->sublev, housenum, poshouse, pos_trig, cmphouse);

return ((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse];

}

bool find_item_flat(void **start, QString rayname, QString streetname, QString housenumber, QString flatname){

int postrig, posray, posstr, poshouse, posflat;

findel(start, rayname, posray, postrig, cmpray);

if(postrig==0){

return false;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstr, postrig, cmpstreet);

if(postrig==0){

return false;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstr])->sublev, housenumber, poshouse, postrig, cmphouse);

if(postrig==0){

return false;

}

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev, flatname, posflat, postrig, cmpflat);

if(postrig==0){

return false;

}else{

return true;

}

void *findflat(void **start, QString rayname, QString streetname, QString housenum, QString flatnum){

int postrig, posray, posstr, poshouse, posflat;

findel(start, rayname, posray, postrig, cmpray);

findel(((Rayon*)start[posray])->sublev, streetname, posstr, postrig, cmpstreet);

findel(((street*)((Rayon*)start[posray])->sublev[posstr])->sublev, housenum, poshouse, postrig, cmphouse);

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev, flatnum, posflat, postrig, cmpflat);

return ((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev[posflat];

}

bool find_item_people(void **start, QString rayname, QString streetname, QString housenumber, QString flatnumber, QString peoplename){

int posray, posstr, poshouse, posflat, pospeople, postrig;

findel(start, rayname, posray, postrig, cmpray);

if(postrig==0){

return false;

}

findel(((Rayon*)start[posray])->sublev, streetname, posstr, postrig, cmpstreet);

if(postrig==0){

return false;

}

findel(((street*)((Rayon*)start[posray])->sublev[posstr])->sublev, housenumber, poshouse, postrig, cmphouse);

if(postrig==0){

return false;

}

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev, flatnumber, posflat, postrig, cmpflat);

if(postrig==0){

return false;

}

findel(((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev[posflat])->sublev, peoplename, pospeople, postrig, cmppeople);

if(postrig==0){

return false;

}else{

return true;

}

void *findpeople(void **start, QString rayname, QString streetname, QString housenum, QString flatnum, QString peoplename){

int posray, posstr, poshouse, posflat, pospeople, postrig;

findel(start, rayname, posray, postrig, cmpray);

findel(((Rayon*)start[posray])->sublev, streetname, posstr, postrig, cmpstreet);

findel(((street*)((Rayon*)start[posray])->sublev[posstr])->sublev, housenum, poshouse, postrig, cmphouse);

findel(((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev, flatnum, posflat, postrig, cmpflat);

findel(((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev[posflat])->sublev, peoplename, pospeople, postrig, cmppeople);

return ((flat*)((house*)((street*)((Rayon*)start[posray])->sublev[posstr])->sublev[poshouse])->sublev[posflat])->sublev[pospeople];

}

ТЕКСТ ФАЙЛА MAINWINDOW.H

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include "QMessageBox"

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private slots:

void on_call_manu_add_rayon_button_clicked();

void on_lineEdit_data_1_textChanged(const QString &arg1);

void on_pushButton_addrayon_clicked();

void on_call_menu_add_street_button_clicked();

void on_lineEdit_rayname_textChanged(const QString &arg1);

void on_pushButton_next_1_clicked();

void on_pushButton_addstreet_clicked();

void on_call_menu_add_house_button_clicked();

void on_lineEdit_streetname_textChanged(const QString &arg1);

void on_lineEdit_housenum_textChanged(const QString &arg1);

void on_lineEdit_flatnum_textChanged(const QString &arg1);

void on_lineEdit_peoplename_textChanged(const QString &arg1);

void on_pushButton_next_2_clicked();

void on_pushButton_addhouse_clicked();

void on_call_menu_add_flat_button_clicked();

void on_pushButton_next_3_clicked();

void on_pushButton_addflat_clicked();

void on_call_menu_add_people_button_clicked();

void on_pushButton_next_4_clicked();

void on_pushButton_addpeople_clicked();

void on_checkBox_clearlist_clicked();

void on_checkBox_removeel_clicked();

void on_call_remove_menu_button_clicked();

void on_pushButton_delrayon_clicked();

void on_pushButton_delstreet_clicked();

void on_pushButton_delhouse_clicked();

void on_pushButton_delflat_clicked();

void on_pushButton_delpeople_clicked();

void on_pushButton_clicked();

void on_pushButton_2_clicked();

void on_pushButton_cancelfind_clicked();

void on_pushButton_findray_clicked();

void on_lineEdit_findray_textChanged(const QString &arg1);

void on_lineEdit_findstreet_textChanged(const QString &arg1);

void on_lineEdit_findhouse_textChanged(const QString &arg1);

void on_lineEdit_findflat_textChanged(const QString &arg1);

void on_lineEdit_findpeople_textChanged(const QString &arg1);

void on_okbuttonrep_clicked();

void on_pushButton_repray_clicked();

void on_zamena1_textChanged(const QString &arg1);

void on_ray_zam_clicked();

void on_pushButton_finstreet_clicked();

void on_pushButton_replacestreet_clicked();

void on_streetzam_clicked();

void on_cancelrepname_clicked();

void on_pushButton_findhouse_clicked();

void on_pushButton_replacehouse_clicked();

void on_housezam_clicked();

void on_pushButton_findflat_clicked();

void on_pushButton_replaceflat_clicked();

void on_flatzam_clicked();

void on_pushButton_findpeople_clicked();

void on_pushButton_replacepeople_clicked();

void on_peoplezam_clicked();

void on_pushButton_save_clicked();

void on_pushButton_load_clicked();

private:

Ui::MainWindow *ui;

void **start;

QString p1, p2, p3, p4, p5, p6, p7, p8;

QMessageBox *val;

void shovtree();

};

ТЕКСТ ФАЙЛА MAINWINDOW.CPP

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include "prototypefunc.h"

MainWindow::MainWindow(QWidget *parent) ://конструктор

QMainWindow(parent),

ui(new Ui::MainWindow){

ui->setupUi(this);

this->start=initarray();

val=new QMessageBox;

ui->global_add_and_remove_menu->hide();

ui->global_input_data_menu->hide();

ui->findBox->hide();

ui->findBox->setTitle("окно поиска");

ui->replace_box->setTitle("меню замены");

ui->replace_box->hide();

ui->resultfind->hide();

ui->ray_zam->hide();

ui->streetzam->hide();

ui->housezam->hide();

ui->flatzam->hide();

ui->peoplezam->hide();

ui->tableWidget->setColumnCount(2);

ui->tableWidget->hide();

ui->treeWidget->setHeaderLabel("spisok");

}

MainWindow::~MainWindow()//деструктор

{


Подобные документы

  • Анализ характеристик объекта компьютеризации. Разработка структур данных, алгоритмов и программного обеспечения системы управления базой данных. Особенности синтеза структур данных. Разработка алгоритмов системы и оценка результатов тестирования.

    курсовая работа [37,0 K], добавлен 07.12.2010

  • Базы данных, их сущность, структура и системы управления. Организация данных во внутримашинной сфере. Поле, запись, файл как основные типы структур данных файловой модели, их характеристика и особенности. Работа с запросами и вывод их полей на экран.

    реферат [49,0 K], добавлен 12.11.2009

  • Основные свойства информационно-справочной системы для обработки результатов сдачи сессии, ее функциональное назначение и логическая структура. Выбор языка и среды программирования. Описание алгоритмов сортировки и поиска, входных и выходных данных.

    курсовая работа [742,8 K], добавлен 23.01.2014

  • Исследование методов и средств многопоточного взаимодействия, особенности использования блокирующей и неблокирующей синхронизации. Разработка, программная реализация и тестирование структуры данных и алгоритмов чтения, записи, освобождения памяти.

    дипломная работа [2,2 M], добавлен 24.06.2012

  • Изучение применяемых в программировании и информатике структур данных, их спецификации и реализации, алгоритмов обработки данных и анализ этих алгоритмов. Программа определения среднего значения для увеличивающегося количества чисел заданного типа.

    контрольная работа [16,0 K], добавлен 19.03.2015

  • Проблемы с организацией данных. Определение и классификация динамических структур данных. Линейные односвязные, двухсвязные, кольцевые списки. Очередь, стеки. Описание основных типов данных и функции для работы с ними. Листинг программы, пример ее работы.

    контрольная работа [290,6 K], добавлен 17.07.2012

  • Основные принципы концепции типа данных в языках программирования. Разновидности структур данных. Дискретные и непрерывные скалярные типы. Файл, последовательность, множество. Линейный список. Сложность алгоритмов. Построение рекурсивных подпрограмм.

    презентация [2,5 M], добавлен 14.10.2013

  • Краткая характеристика интегрированной среды Turbo Pascal. Принципы программирования разветвляющихся алгоритмов, циклических структур, задач обработки символьных данных, множеств. Правила записи данных в текстовый файл. Понятие явной и косвенной рекурсии.

    учебное пособие [1,5 M], добавлен 10.12.2010

  • Определение понятия структур данных. Рассмотрение информации и ее представления в памяти. Особенности непозиционных и позиционных систем счисления. Классификация структур данных, операции над ними. Структурность данных и технология программирования.

    презентация [359,3 K], добавлен 20.05.2015

  • Изучение условий поставленной задачи и используемых данных для разработки программы хранения информации о рейсах поезда. Описание разработанных функций, листинга, блок-схем алгоритмов и дерева функции. Рассмотрение сценария диалога данной программы.

    курсовая работа [532,7 K], добавлен 20.07.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.