Реферат по предмету "Информатика, программирование"


Информационная система начальника жилищно-эксплуатационной службы

/> 

КУРСОВОЙ ПРОЕКТ
по курсу «Структуры иорганизация данных в ЭВМ»
на тему
«Информационная система начальникажилищно-эксплуатационнойслужбы»

/>/>Введение
Тема данногокурсового проекта – «Информационная система начальника жилищно-эксплуатационнойслужбы». При этом по заданию к курсовому проекту необходимо использоватьструктуру данных типа вектор и сортировку QuickSort.
Дляразработки приложения была выбрана среда программирования Delphi.
Среда визуальногообъектно-ориентированного проектирования Delphi позволяет:
1.        Создаватьзаконченные приложения для Windows самой различной направленности.
2.        Быстросоздавать профессионально выглядящий оконный интерфейс для любых приложений;интерфейс удовлетворяет всем требованиям Windows и автоматическинастраивается на ту систему, которая установлена, поскольку использует функции,процедуры и библиотеки Windows.
3.        Создаватьсвои динамически присоединяемые библиотеки компонентов, форм, функций, которыепотом можно использовать из других языков программирования.
4.        Создаватьмощные системы работы с базами данных любых типов.
5.        Формироватьи печатать сложные отчеты, включающие таблицы, графики и т.п.
6.        Создаватьсправочные системы, как для своих приложений, так и для любых других.
7.        Создаватьпрофессиональные программы установки для приложений Windows, учитывающие всюспецифику и все требования операционной системы.
Delphi – быстро развивающаясясистема. Первая версия Delphi была выпущена в феврале 1995 года, в 1996 годувышла вторая версия, 1997 – третья, 1998 – четвертая, 1999 – пятая, 2001 –шестая. Все версии, начиная с Delphi 2.0, рассчитаны на разработку 32-разрядныхприложений, т.е. приложений для операционных систем Windows 95/98, NT и т.д. В 2002 году вышласедьмая версия, основным нововведением в которой были Интернет-технологии.
Проект даннойкурсовой работы представляет собой инструмент для управления информационнойсистемой начальника жилищно-эксплуатационной службы.
1.        СоставDELPHI-проекта
1.1 Составпроекта
 
Данныйпроект состоит из двух форм: InputForm и ReportForm:
Наформе InputForm расположены следующие компоненты (см. рис1):
– компонентAddBtn – верхняя кнопка кнопкав правой части формы для добавления записей данных.
– компонентCopyBtn – кнопка для копированиязаписей данных.
– компонентDelBtn – кнопка для удаления записейданных.
– компонентSortBtn – кнопка для сортировкивыделенного столбца в таблице данных.
– компонентFindBtn – кнопка для поиска определенногопользователем значения в столбце данных.
– компонентSaveBtn – кнопка для сохранениявсех табличных данных на форме в текстовых файл.
– компонентLoadBtn – кнопка для загрузкивсех табличных данных на форме из текстового файла.
– компонентSaveBtn – кнопка для сохранениявсех табличных данных на форме в текстовых файл.
– компонентFBtn – кнопка для отображенияформы ReportForm и формирования отчета Ф5.
– компонентBitBtn1 – кнопка для закрытияприложения.
– компонентMSpinEdit – поле ввода для заданияколичества этажей M.
– компонентKSpinEdit – поле ввода для заданияколичества подъездов К.
Наформе также находятся компоненты Label1, Label2 для отображения подсказок для ввода информациии невизуальные компоненты OpenDialog1, SaveDialog1 для вызова стандартных окон открытия исохранения файлов.
– компонентPageControl1 – содержит вкладки TabSheet 1–5 на которых отраженыданные (соответственно «Квартиры», «СХЕМА», «ГК (Р)», «Жители члены семей ГК(А)», и «Атрибуты квартир (С)»).
КомпонентыTabSheet 1–5 содержат в себеэлементы таблиц StringGrid 1–5, которые связаны с векторами данных, соответственно«Kvart», «Scheme», «GK», «People», «FlatAtr»).
/>
Рис. 1– Главная форма программы
Наформе ReportForm расположены следующие компоненты (см. рис 2):
– компонентыPanel1, Panel2 – панели на форме дляразделения формы на отчет и панель кнопок.
– компонентOkBtn – кнопка для закрытияформы.
– компонентListBox1 – список дляотображения отчета.

/>
Рис. 2– форма для формирования отчета Ф5.
 
1.2 Основныемодули и процедуры, входящие в состав программного комплекса
Список модулей:
Программасодержит следующие модули:
Unit1 – модуль главной формы проекта.
Unit2– модуль отчетной формы проекта.
MyTypes – модуль с описаниями классов данных.
Список основных процедур, входящих в составпрограммного комплекса:
– procedure LoadButtonClick – процедура загрузкиданных из файла в векторы.
– procedure SaveButtonClick – процедура сохранения данныхв файл.
– procedure FillStringGrid – процедура инициализациитаблиц и заполнения их в соответствии с массивами.
– procedure PageControl1Change – процедура выборанеобходимой страницы с данными и вызова перезаполнения соответствующей таблицы.
– procedure SGDblClick – процедура ввода /редактирования данных в текущей ячейки таблицы данных.
– procedure AddBtnClick – процедура добавлениястроки в текущую таблицу данных и вектор данных.
– procedure DelBtnClick – процедура для удалениязаписей данных.
– procedure SortBtnClick – процедура длясортировки выделенного столбца в таблице данных.
– procedure KSpinEditChange – процедура для изменениязначения количества подъездов К в соответствии с полем ввода.
– procedure MSpinEditChange – процедура дляизменения значения количества этажей M в соответствии с полем ввода.
– procedure CopyBtnClick – процедура ввода новойстроки данных копированием текущей строки.
– procedure FindBtnClick – процедура для поискаопределенного пользователем значения в столбце данных.
– procedure SortBtn – кнопка для сортировкивыделенного столбца в таблице данных.
– procedure FButtonClick – процедура дляотображения формы ReportForm и формирования отчета Ф5.
– procedure ReadVec – процедура чтениявектора данных из текстового файла.
– procedure WriteVec – процедура записивектора данных из текстового файла.
2.        Данныепрограммы
В программедля хранения данных был спроектирован класс TVector в котором для храненияданных использовался вектор векторов FArr. Для хранения имен колонок использовалсявектор FNames,описанный как array [1..100] of string. В программе были созданы 5 объектовкласса TVector:
Kvart: TVector;
Scheme: TVector;
Gk: TVector;
People: TVector;
FlatAtr: TVector;Имя массива Тип Размер в байтах
Kvart TVector 100*100*16+10100+8=170108
Scheme TVector 170108
Gk TVector 170108
People TVector 170108
FlatAtr TVector 170108
Кроме того, впрограмме для временных нужд объявляются переменные:
KPod, M, i, j, k, x, типа integer (каждая по 4 байта);
FileNameT типа string (200 байт);
Ft типа TextFile (460байт);
FSGVector– вектор ссылок типа TStringGrid (40байт).
3.        Логическиеструктуры данных
Базовой структуройданного проекта является класс TVector в котором для хранения данныхиспользовался вектор векторов FArr и организованы свойства и методы для доступа и обработкиданных класса.
Объявление вектора FArr выглядит следующимобразом:
FArr: array [1..100]of TVarMas, где TVarMas =array [1..MaxN] of Variant;
Вектор (array) – это линейная структураданных (список) с элементами одинакового размера в которой адрес элементаоднозначно определяется его номером.
Длялогического определения вектора ему необходимо присвоить имя, указать паруограниченных значений индекса, а также указать тип элементов. Элементамивекторов также могут являются векторы.
Логическаясхема структуры вектора векторов FArr:
 
1
2

100
1
 
 
 
 
 
2
 
 
 
 
 
3
 
 
 
 
 

 
 
 
 
 
100
 
 
 
 
 
Каждыйэлемент одного вектора занимает 16 байт памяти. Соответственно FArr будет занимать (100*100)*16=160000байт.
Логическаясхема структуры вектора имен FNames:
 
1
2

101
1
 
 
 
 
 
2
 
 
 
 
 
3
 
 
 
 
 

 
 
 
 
 
100
 
 
 
 
 
Каждыйэлемент вектора занимает 101 байт памяти. Соответственно вектор FNamesбудет занимать 100*101 =10100 байт.
4.        Алгоритмыобработки основных структур
Основнойоперацией обработки структуры в данном программном обеспечении являетсясортировка QuickSort (по заданию на курсовое проектирование).
Быстраясортировка(quicksort), часто называемая qsortпо имени реализации в стандартной библиотеке языка Си – широко известныйалгоритм сортировки, разработанный английским Информатиком Чарльзом Хоаром.Один из быстрых известных универсальных алгоритмов сортировки массивов (всреднем О (n log n) обменов при упорядочении nэлементов), хотя и имеющий ряд недостатков.
Алгоритм
/>
Быстраясортировка использует стратегию «разделяй и властвуй». Шаги алгоритма таковы:
1.        Выбираемв массиве некоторый элемент, который будем называть опорным элементом. Сточки зрения корректности алгоритма выбор опорного элемента безразличен. Сточки зрения повышения эффективности алгоритма выбираться должна медиана, нобез дополнительных сведений о сортируемых данных её обычно невозможно получить.Известные стратегии: выбирать постоянно один и тот же элемент, например,средний или последний по положению; выбирать элемент со случайно выбранныминдексом.
2.        Операцияразделения массива: реорганизуем массив таким образом, чтобы всеэлементы, меньшие или равные опорному элементу, оказались слева от него, а всеэлементы, большие опорного – справа от него. Обычный алгоритм операции:
1.        Дваиндекса – l и r, приравниваются к минимальному и максимальному индексуразделяемого массива соответственно.
2.        Вычисляетсяиндекс опорного элемента m.
3.        Индексl последовательно увеличивается до m до тех пор, пока l-й элемент не превыситопорный.
4.        Индексr последовательно уменьшается до m до тех пор, пока r-й элемент не окажетсяменьше опорного.
5.        Еслиr = l – найдена середина массива – операция разделения закончена, оба индексауказывают на опорный элемент.
6.        Еслиl
3.        Рекурсивноупорядочиваем подмассивы, лежащие слева и справа от опорного элемента.
4.        Базойрекурсии являются наборы, состоящие из одного или двух элементов. Первыйвозвращается в исходном виде, во втором, при необходимости, сортировка сводитсяк перестановке двух элементов. Все такие отрезки уже упорядочены в процессеразделения.
Посколькув каждой итерации (на каждом следующем уровне рекурсии) длина обрабатываемогоотрезка массива уменьшается, по меньшей мере, на единицу, терминальная ветвьрекурсии будет достигнута всегда и обработка гарантированно завершится.
Этот алгоритм в применении к нашему вектору FArr реализован следующиметодом класса TVector:
 // Процедура сортировки вектора по индексу SortId с режимом xMode
 // xMode = 1 – по возрастанию
 // xMode = 2 – по убыванию
 // xMode = 0-использовать текущий режим SortMode и затемпоменять его
procedure TVector. Sort (xMode: integer = 0);
procedure QSort (l, r: Integer);
function Less (var x, y: Variant): boolean;
begin
if (X
then Less:=true
else Less:=false;
end;
var
i, j, x: integer;
y: TVarMas; //Variant;
begin
i:= l; j:= r; x:= (l+r) DIV 2;
repeat
while Less (FArr[i] [SortId], FArr[x] [SortId]) do i:= i + 1;
while Less (FArr[x] [SortId], FArr[j] [SortId]) do j:= j – 1;
if i
begin
y:= FArr[i];
FArr[i]:= FArr[j];
FArr[j]:= y;
i:= i + 1; j:= j – 1;
end;
until i > j;
if l
if i
end;
begin {QuickSort};
if xMode0
then SortMode:= xMode;
QSort (1, Size);
if xMode=0 then // Поменяем режим сортировки
begin
if SortMode = 1
then SortMode:=2 else SortMode:=1;
end;
end;
Оценка эффективности
QuickSortявляется существенно улучшенным вариантом алгоритма сортировки с помощьюпрямого обмена (его варианты известны как «Пузырьковая сортировка»),известного, в том числе, своей низкой эффективностью. Принципиальное отличиесостоит в том, что в первую очередь меняются местами наиболее удалённые друг отдруга элементы массива.
·          Лучшийслучай.Для этого алгоритма самый лучший случай – если в каждой итерации каждый изподмассивов делился бы на два равных по величине массива. В результатеколичество сравнений, делаемых быстрой сортировкой, было бы равно значениюрекурсивного выражения CN = 2CN/2+N. Это дало бынаименьшее время сортировки.
·          Среднее. Даёт в среднем O (n log n)обменов при упорядочении n элементов. В реальности именно такая ситуацияобычно имеет место при случайном порядке элементов и выборе опорного элементаиз середины массива либо случайно.
·          2CN/2покрывает расходы по сортировке двух полученных подмассивов; N – это стоимостьобработки каждого элемента, используя один или другой указатель. Известнотакже, что примерное значение этого выражения равно CN = N lg N.
·          Худшийслучай.Худшим случаем, очевидно, будет такой, при котором на каждом этапе массив будетразделяться на вырожденный подмассив из одного опорного элемента и на подмассивиз всех остальных элементов. Такое может произойти, если в качестве опорного накаждом этапе будет выбран элемент либо наименьший, либо наибольший из всехобрабатываемых.
·          Худшийслучай даёт O (n²) обменов, но количество обменов и,соответственно, время работы – это не самый большой его недостаток. Хуже то,что в таком случае глубина рекурсии при выполнении алгоритма достигнет n, чтобудет означать n-кратное сохранение адреса возврата и локальных переменныхпроцедуры разделения массивов. 

Да   />/>5. Руководствопользователя
Данноепрограммное обеспечение имеет интуитивно понятный интерфейс и использует всевозможности среды Delphi.
Программаимеет пять вкладок. При первоначальном запуске активируется первая – вкладка «Квартиры»(см. рис. 3).
/>
Рис. 3– Вкладка таблицы квартир
Накаждой вкладке с элементами таблицы можно выполнить операции добавления новойстроки, удаление существующей, изменение значения ячеек, а также сортировкитекущего столбца и поиска заданного значения в текущем столбце. Сортировкавыполняется методом быстрой сортировки QuickSort. При выполнении сортировкивначале выполняется сортировка по возрастанию, при следующем нажатии кнопки«Сортировка» выполняется сортировка по убыванию и т.д.
Навкладке «Квартиры» можно изменить только колонки: «Номер квартиры», «Стоимостьквартиры», «Признак приват.». Остальные колонки рассчитываются по таблицам«Атрибуты квартир (С)» и «СХЕМА» следующим образом:
Трипервых колонки определяются исходя из данных таблицы «СХЕМА». Колонка «Жилаяплощадь» = сумма площадей всех комнат, взятых из таблицы С.
Колонка«Общая площадь» =атр. 4 + атрибуты 7–9 из таблицы С.
Одновременнопосле ввода / изменения номера квартиры выдается информационное сообщение(см. рис. 4)
/>
Рис. 4– Информационное сообщение
Вслучае попытки редактирования колонок №№2–5 выдается следующее сообщение(см. рис. 5).
/>
Рис. 5– Сообщение о невозможности редактирования ячейки
Припереходе на вкладку «СХЕМА» отображается следующее окно (см. рис. 6)
/>
Рис. 6– Вкладка схемы квартир «СХЕМА»
Здесь также можно редактировать значения, удалять их идобавлять новые, сортировать и искать определенные значения.
Третьявкладка «ГК (Р)» содержит атрибуты таблицы главных квартиросъемщиков квартир(см. рис. 7).
/>
Рис. 7– Вкладка таблицы главных квартиросъемщиков ГК(Р)
Вданной вкладке как и в прдедыдущих можно радактировать атрибуты, удалять их,добавлять новые, сортировать и искать определенные значения.
Вчетвертой вкладке находится таблица жителей квартир – членов семей главныхквартиросъемщиков (А). (см. рис. 8)
/>
Рис. 8– Вкладка таблицы жителей квартир – членов семей главных квартиросъемщиков (А)

Напятой вкладке находится таблица (С) с атрибутами квартир (С). (см. рис. 9)
/>
Рис. 9– Вкладка таблицы (С) с атрибутами квартир
Извсех вкладок доступны кнопки «Сохранить в файл» и «Загрузить из файла» спомощью которых можно сохранить данные всех вкладок в текстовый файл *.dat изагрузить данные из файла.
Дляформирования отчета формы Ф5 необходимо нажать на кнопку «Отчет Ф5», при этомоткрывается новое окно с отчетными данными (см. рис. 10). Закрытьокно можно нажав на кнопку «ОК».
/>
Рис. 9– Вкладка таблицы (С) с атрибутами квартир

Заключение
Впроцессе разработки данного курсового проекта были изучены и закреплены знанияпо физическим размещениям структур данных и методам их обработки (сортировки).В среде Delphi была разработана информационная система начальникажилищно-эксплуатационной службы. При создании программы не использовалиськомпоненты баз данных данной среды Delphi.
Тестированиеданного продукта показало полноту реализованных функций и отсутствие ошибок инедочётов в программе. Были изучены базовая структура данных типа вектор иметод быстрой сортировки QuickSort.

Литература1 Структуры и организация данных в компьютере. Учебное пособие / Лакин В.И., Романов А.В. – Мн.: БНТУ, 2004 – 176 с. 2 Архангельский А.Я. Delphi 6. Справочное пособие. — М.: ЗАО «Издательсво БИНОМ», 2001. — 1024 с. 3 Вирт Н. Алгоритмы и структуры данных. — СПб: Невский диалект, 2001. – 352 с. 4 Ананий В. Левитин Глава 4. Метод декомпозиции: Быстрая сортировка // Алгоритмы: введение в разработку и анализ = Introduction to The Design and Analysis of Algorithms. – М.: «Вильямс», 2006. – С. 174–179. 5 Кнут Д.Э. Искусство программирования, том 1. Основные алгоритмы. — М.: Издательский дом «Вильямс», 2002. -720 с. 6 Кнут Д.Э. Искусство программирования, том 3. Сортировка и поиск. — М.: Издательский дом «Вильямс», 2001. - 832 с. 7 Гофман В.Э., Хомоненко А.Д. Delphi. Быстрый старт. – СПб: БХВ-Петербург, 2003. – 288 с.: ил  
Приложение 1Листинги программы
unit Unit1;
interface
uses
Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,ExtCtrls, math, Grids, Buttons, Mask, Calendar, ComCtrls,
Spin,MyTypes, Unit2;
Type
TInputForm= class(TForm)
BitBtn1:TBitBtn;
OpenDialog1:TOpenDialog;
SaveDialog1:TSaveDialog;
LoadButton:TButton;
SaveButton:TButton;
PageControl1:TPageControl;
TabSheet1:TTabSheet;
TabSheet2:TTabSheet;
TabSheet3:TTabSheet;
StringGrid1:TStringGrid;
DelBtn:TBitBtn;
AddBtn:TBitBtn;
StringGrid2:TStringGrid;
SortBtn:TBitBtn;
TabSheet4:TTabSheet;
TabSheet5:TTabSheet;
StringGrid3:TStringGrid;
StringGrid4:TStringGrid;
StringGrid5:TStringGrid;
Label1:TLabel;
KSpinEdit:TSpinEdit;
Label2:TLabel;
MSpinEdit:TSpinEdit;
FindBtn:TBitBtn;
CopyBtn:TBitBtn;
FButton:TButton;
procedureFormCreate (Sender: TObject);
procedureLoadButtonClick (Sender: TObject);
procedureSaveButtonClick (Sender: TObject);
procedurePageControl1Change (Sender: TObject);
procedureAddBtnClick (Sender: TObject);
procedureSGDblClick (Sender: TObject);
procedureDelBtnClick (Sender: TObject);
procedureSortBtnClick (Sender: TObject);
procedureKSpinEditChange (Sender: TObject);
procedureMSpinEditChange (Sender: TObject);
procedureSGKeyPress (Sender: TObject; var Key: Char);
procedureFormDestroy (Sender: TObject);
procedureCopyBtnClick (Sender: TObject);
procedureFindBtnClick (Sender: TObject);
procedureFButtonClick (Sender: TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
 //Fz:file of TVector; // Файл типа запись
KPod, M: integer; // Количествоподъездов и этажей
People: TVector; // Вектор – членысемей ГК
GK: TVector; // Вектор – главныеквартиросъемщики
Scheme: TVector; // Вектор – СХЕМА
FlatAtr: TVector; // Вектор – Атрибутыквартир
KVART: TVector; // Вектор – КВАРТ
Ft:TextFile; // Текстовой файл
FileNameT:string[200]; // Имя файла
FSGVector:array [1..10] of TStringGrid;
procedureFillStringGrid (SG: TStringGrid; Vec: TVector);
functionGetVec: TVector;
procedureReadVec (var Vec: TVector);
procedureWriteVec (Vec: TVector); // Запись вектора в файл
end;
var
InputForm:TInputForm;
Implementation
{$R*.DFM}
procedureTInputForm. FormCreate (Sender: TObject);
begin
KPod:=2;M:= 3;
 //–
Kvart:=TVector. Create;
Kvart.Cols:= 7;
Kvart.Names[1]:= 'Номер квартиры';
Kvart.Names[2]:= 'число комнат';
Kvart.Names[3]:= 'номер этажа';
Kvart. Names[4]:= 'жилая площадь (кв.м.)';
Kvart. Names[5]:= 'общая площадь (кв.м.)';
Kvart. Names[6]:= 'стоимостьквартиры';
Kvart. Names[7]:= 'Приват.';
 //–
Scheme:=TVector. Create;
Scheme.Cols:= 4;
Scheme.Names[1]:= 'Кв. 1';
Scheme.Names[2]:= 'Кв. 2';
Scheme.Names[3]:= 'Кв. 3';
Scheme.Names[4]:= 'Кв. 4';
 //–
GK:=TVector. Create;
GK.Cols:= 8;
GK.Names[1]:= 'Номер Квартиры';
GK.Names[2]:= 'Фамилия';
GK.Names[3]:= 'Имя';
GK.Names[4]:= 'Отчество';
GK. Names[5]:= 'Год рождения';
GK. Names[6]:= 'Место работы';
GK. Names[7]:= 'Льготы';
GK. Names[8]:= 'Долг (тыс. руб.)';
 // –
 // 1.5.         ТаблицаА содержит список жильцов – членов семей главных квартиросъемщиков:
 // 1)  фамилия,
 // 2)  родственноеотношение к ГК (мать / отец/муж/жена / дочь/сын),
 // 3)  номерквартиры,
 // 4) признак«пенсионер / учащийся / работает / дошкольник».
People:=TVector. Create;
People.Cols:= 4;
People.Names[1]:= 'Фамилия';
People.Names[2]:= 'Родств.отн-ние';
People.Names[3]:= 'Номер квартиры';
People.Names[4]:= 'Признак';
People.Names[5]:= 'Место работы';
People.Names[6]:= 'Льготы';
People.Names[7]:= 'Долг (тыс. руб.)';
 // –
 // 1.6.         ТаблицаС содержит следующие атрибуты квартир (в соответствии с числом комнат):
 // 1) числокомнат,
 // 2) месячнаяквартплата,
 // 3) площадьпервой комнаты (кв. м.),
 // 4) площадьвторой комнаты (если она есть),
 // 5) площадьтретьей комнаты,
 // 6) площадьчетвертой комнаты,
 // 7) площадькоридора,
 // 8) площадькухни,
 // 9) общаяплощадь туалета и ванной комнаты.
FlatAtr:=TVector. Create;
FlatAtr.Cols:= 9;
FlatAtr.Names[1]:= 'Число комн.';
FlatAtr.Names[2]:= 'Квартплата';
FlatAtr.Names[3]:= 'Пл.ком. №1';
FlatAtr.Names[4]:= 'Пл.ком. №2';
FlatAtr.Names[5]:= 'Пл.ком. №3';
FlatAtr.Names[6]:= 'Пл.ком. №4';
FlatAtr.Names[7]:= 'Пл.коридора';
FlatAtr.Names[8]:= 'Пл.кухни';
FlatAtr.Names[9]:= 'Пл.туалета';
 //–
PageControl1Change(Sender);
FSGVector[1]:=StringGrid1;
FSGVector[2]:=StringGrid2;
FSGVector[3]:=StringGrid3;
FSGVector[4]:=StringGrid4;
FSGVector[5]:=StringGrid5;
end;
procedureTInputForm. ReadVec (var Vec: TVector);
var
x,i, j: integer;
St:String;
begin
Readln(Ft, x); Vec. Cols:= x;
fori:=1 to Vec. Cols do
beginReadln (Ft, St); Vec. Names[i]:= St; end;
Readln(Ft, x); Vec. Size:= x;
fori:=1 to Vec. Size do
begin
forj:=1 to Vec. Cols do
beginReadln (Ft, St); Vec.X [i, j]:= St; end;
end;
Vec.SortId:= 1;
Vec.SortMode:= 1;
end;
procedureTInputForm. WriteVec (Vec: TVector);
vari, j: integer;
begin
Writeln(Ft, Vec. Cols);
fori:=1 to Vec. Cols do
Writeln(Ft, Vec. Names[i]);
Writeln(Ft, Vec. Size);
fori:=1 to Vec. Size do
begin
forj:=1 to Vec. Cols do
Writeln(Ft, Vec.X [i, j]);
end;
end;
 // Чтениеданных из файла
procedureTInputForm. LoadButtonClick (Sender: TObject);
begin
OpenDialog1. Title:= 'Открыть из файла'; //Изменение заголовка окна диалога
ifnot OpenDialog1. Execute then exit;
 // Выполнениестандартного диалога выбора имени файла
FileNameT:= OpenDialog1. FileName; // Возвращениеимени дискового файла
AssignFile (Ft, FileNameT); // Связываниефайловой переменной Fz с именем файла
Reset(Ft); // Открытиесуществующего файла
ReadVec(Kvart); // Чтение вектораиз файла
ReadVec(Scheme);
ReadVec(GK);
ReadVec(People);
ReadVec(FlatAtr);
PageControl1Change(Sender);
CloseFile(Ft);
end;
procedureTInputForm. SaveButtonClick (Sender: TObject);
 // Сохраниение данных вфайле
begin
if not SaveDialog1. Execute then exit;
 // Выполнениестандартного диалога выбора имени файла
begin
FileNameT:= SaveDialog1. FileName; // Возвращениеимени дискового файла
AssignFile (Ft, FileNameT); // Связываниефайловой переменной Fz с именем файла
{$I-}
Rewrite(Ft); // Открытиенового файла
{$I+}
ifnot((IOResult = 0) and (FileNameT «)) then
begin
Application.MessageBox ('Не возможно открыть файл!', 'Ошибка', MB_OK);
exit;
end;
end;
WriteVec(Kvart); //Запись в файл
WriteVec(Scheme);
WriteVec(GK);
WriteVec(People);
WriteVec(FlatAtr);
CloseFile(Ft); //Закрытие файла
end;
 // Процедуразаполнения объекта StringGrid данными из Вектора Vec
procedureTInputForm. FillStringGrid (SG: TStringGrid; Vec: TVector);
vari, j: integer;
begin
Sg.ColCount:= Vec. Cols+1;
ifVec. Size=0
thenSg. RowCount:=2
elseSg. RowCount:=Vec. Size+1;
fori:=1 to Vec. Cols do
Sg.Cells [i, 0]:= Vec. Names[i];
fori:=1 to Vec. Size do
begin
Sg.Cells [0, i]:= IntToStr(i);
forj:=1 to Vec. Cols do
Sg.Cells [j, i]:= Vec.X [i, j];
end;
Sg.ColWidths[0]:= 25;
end;
procedureTInputForm. PageControl1Change (Sender: TObject);
begin
casePageControl1. ActivePageIndex of
0:FillStringGrid (StringGrid1, Kvart);
1:FillStringGrid (StringGrid2, Scheme);
2:FillStringGrid (StringGrid3, GK);
3:FillStringGrid (StringGrid4, People);
4:FillStringGrid (StringGrid5, FlatAtr);
end;
end;
procedureTInputForm. AddBtnClick (Sender: TObject);
var
SG:TStringGrid;
Vec:TVector;
begin
Sg:=FSGVector [PageControl1. ActivePageIndex+1];
Vec:=GetVec;
Vec.Add;
FillStringGrid(SG, Vec);
end;
procedureTInputForm.SGDblClick (Sender: TObject);
var
NRooms,NKv, NKvart, NPod, NFloor: integer;
porch:array [0..MaxN] of integer;
SG:TStringGrid;
Vec:TVector;
i,j, x, k, l: integer;
InputString:String;
begin
Sg:=TStringGrid(Sender);
i:=Sg. Selection. Left;
j:=Sg. Selection. Top;
Vec:=GetVec;
if(i
 // Установим особыепараметры для таблицы КВАРТ – StringGrid1
if(Sg. Name = 'StringGrid1') and (i in [2,3,4,5]) then
begin
Application. MessageBox (
'Это полезаполняется автоматически по номеру квартиры и не редактируется!'
'Ошибка',MB_OK);
exit;
end;
InputString:=InputBox ('', 'Введите значение', Vec.X [j, i]);
ifInputString=''
thenexit;
SG.Cells [i, j]:= InputString;
Vec.X[j, i]:= InputString;

 // Заполним принеобходимости остальные поля для таблицы КВАРТ – StringGrid1
if(Sg. Name = 'StringGrid1') and (i = 1) then
begin
NKvart:=Vec.X [j, i];
porch[0]:=0; x:= 0;
fori:=1 to Scheme. Size do
begin
porch[i]:=2;
ifScheme.X [i, 3]=''
thenporch[i]:= 2
elseif Scheme.X [i, 4]=''
thenporch[i]:= 3 else porch[i]:=4;
ifNKvart
begin
NPod:= i; // Определилиномер подъезда
NFloor:= (NKvart-x) div M +1; // Определилиномер этажа
NKv:= (NKvart-x) mod M; // Определилиномер кв. на этаже
ifNKv=0
thenNKv:= M;
NRooms:= Scheme.X [i, NKv]; // Определиликол-во комнат
 // Запишемколичество комнат в квартире
SG. Cells [2, j]:= IntToStr(NRooms); Vec.X [j, 2]:= NRooms;
 // Запишемномер этажа
SG. Cells [3, j]:= IntToStr(NFloor); Vec.X [j, 3]:= NFloor;

fork:=1 to FlatAtr. Size do
begin
ifFlatAtr.X [i, 1]= NRooms then // совпадает количество комнат
begin
 //x – атр. 4 = сумма площадейвсех комнат, взятых из таблицы С,
x:=0;
forl:=1 to NRooms do
try
x:=x + StrToInt (FlatAtr.X [k, 2+l]);
except
end;
 //Запишем жилую площадь
Vec.X[j, 4]:= x; SG. Cells [4, j]:= Vec.X [j, 4];
x:=x + StrToInt (FlatAtr.X [i, 7])+StrToInt (FlatAtr.X [i, 8])+
StrToInt(FlatAtr.X [i, 9]);
 //Запишем общую площадь
SG.Cells [5, j]:= IntToStr(x); Vec.X [j, 5]:= x;
break;
end;
end;
InputString:='Квартира №'+IntToStr(NKvart)+
' находится вподъезде №'+IntToStr(NPod)+
' на этаже№'+IntToStr(NFloor)+
' ('+IntToStr(NRooms)+' комната(ы)).';
Application.MessageBox (PChar(InputString), '', MB_OK);
exit;
end;
x:=x + porch[i]*M;
end;
Application. MessageBox ('Указанная квартира ненайдена по схеме дома',
'Ошибка', MB_OK);
SG. Cells [2, j]:= «; Vec.X [j, 2]:= «;
SG.Cells [3, j]:= «; Vec.X [j, 3]:= «;
end;
if (j>Vec. Size) then // Кликнули запределами области данных
begin
Vec.Add; FillStringGrid (SG, Vec);
end;
end;
functionTInputForm. GetVec: TVector;
begin
casePageControl1. ActivePageIndex of
0:result:= Kvart;
1:result:= Scheme;
2:result:= GK;
3:result:= People;
4:result:= FlatAtr;
elseresult:= Kvart;
end;
end;
procedureTInputForm. DelBtnClick (Sender: TObject);
var
SG:TStringGrid;
Vec:TVector;
i:integer;
begin
Sg:=FSGVector [PageControl1. ActivePageIndex+1];
i:=Sg. Selection. Top; // удаляемая строка
Vec:=GetVec;
Vec.Delete(i);
FillStringGrid(SG, Vec);
end;
procedureTInputForm. SortBtnClick (Sender: TObject);
var
SG:TStringGrid;
Vec:TVector;
i:integer;
begin
Sg:=FSGVector [PageControl1. ActivePageIndex+1];
i:=Sg. Selection. Left; // Будем сортировать этот столбец
Vec:=GetVec;
if (i
Vec. SortId:= i; // установимсортируемый столбец
Vec.Sort;
FillStringGrid(SG, Vec);
end;
procedureTInputForm.KSpinEditChange (Sender: TObject);
begin
KPod:=KSpinEdit. Value;
end;
procedureTInputForm.MSpinEditChange (Sender: TObject);
begin
M:=MSpinEdit. Value;
end;
procedureTInputForm.SGKeyPress (Sender: TObject; var Key: Char);
begin
ifKey =#13 then // Если нажата клавиша Enter то…
SGDblClick(Sender);
end;
procedureTInputForm. FormDestroy (Sender: TObject);
begin
People.Destroy;
GK.Destroy;
Scheme.Destroy;
FlatAtr.Destroy;
Kvart.Destroy;
end;
procedureTInputForm. CopyBtnClick (Sender: TObject);
var
SG:TStringGrid;
Vec:TVector;
i:integer;
begin
Sg:=FSGVector [PageControl1. ActivePageIndex+1];
i:=Sg. Selection.top; // Будем копировать эту строку
Vec:=GetVec;
Vec.AddCopy(i);
FillStringGrid(SG, Vec);
end;
procedureTInputForm. FindBtnClick (Sender: TObject);
var
SG:TStringGrid;
Vec:TVector;
res,
Row,Col: integer;
InputString:String;
begin
Sg:=FSGVector [PageControl1. ActivePageIndex+1];
Col:=Sg. Selection. Left;
Row:=Sg. Selection. Top;
Vec:=GetVec;
if (Col
InputString:= InputBox ('', 'Введите значениедля поиска', «);
ifInputString=''
thenexit;
res:=Vec. Find (Col, Row, InputString);
ifres=0 then
begin
Application.MessageBox('Указанное значение не найдено!', 'Ошибка', MB_OK);
exit;
end;
Sg.Row:= res;
end;
procedureTInputForm.FButtonClick (Sender: TObject);
var
NKvart,NPod: integer;
fl,i, k, x, p: integer;
St,FIO: String;
begin
 //
ReportForm.ListBox1. Items. Clear;
ReportForm.ListBox1. Items. Add (
' Cписок всех жильцов дома,проживающих в квартирах, '+
'в которых ГКимеет льготы по квартплате');
fork:=1 to People. Size do
begin
NKvart:=People.x [k, 3]; // Номер квартиры
fl:=0;
fori:=1 to GK. Size do
begin
ifGk.X [i, 1]=NKvart then
beginfl:= 1; break; end;
end;
if(fl=0) or ((fl=1) and (Gk.X [i, 7]'да'))
thencontinue; // У ГК нет льгот;
FIO:=People.X [k, 1];

x:=0; NPod:= 0;
fori:=1 to Scheme. Size do
begin
ifScheme.X [i, 3]=''
thenp:= 2
elseif Scheme.X [i, 4]=''
thenp:= 3 else p:=4;
ifNKvart
beginNPod:= i; break; end;
end;
fori:=1 to Kvart. Size do
ifKvart.X [i, 1]= NKvart then
begin // получили искомуюстроку квартиры
St:= FIO+' кв. №'+IntToStr(NKvart)+' подъезд №'+IntToStr(NPod)+' – '+
IntToStr(Kvart.X [i, 2])+' комн. ';
ifKvart.X [i, 7]='да'
then St:= St + ' – кв-раприватизирована '
else St:= St + ' – кв-ра неприватизирована ';
 // списка:Фамилия жильца, номер квартиры, подъезд, число комнат, признак
 // приватизации.
ReportForm.ListBox1. Items. Add(St);
end;
end;
ReportForm.ShowModal;
end;
end.

unitUnit2;
interface
usesWindows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons,ComCtrls, ExtCtrls;
type
TReportForm= class(TForm)
Panel1:TPanel;
Panel2:TPanel;
OKBtn:TButton;
CancelBtn:TButton;
ListBox1:TListBox;
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
ReportForm:TReportForm;
implementation
{$R*.DFM}
end.

unitMyTypes;
interface
usesSysutils, Contnrs;
constMaxN = 100;
type
TVarType= Variant; //TVarRec;
TVarMas= array [1..MaxN] of TVarType;
TVector= class (TInterfacedObject)
private
{Privatedeclarations}
FArr:array [1..MaxN] of TVarMas; //source data
FNum:integer; //number of items
FCols:integer; //number of columns
FNames:array [1..MaxN] of String[MaxN]; //names of columns
functionGetSize: Integer;
procedureSetSize (value: Integer);
functionGetCols: Integer;
procedureSetCols (value: Integer);
procedureSetX (Index1, Index2: integer; value: TVarType);
functionGetX (Index1, Index2: integer):   TVarType;
procedureSetName (Index: integer; value: String);
functionGetName (Index: integer):  String;
public
SortId:integer; // Текущий сортируемый столбец
SortMode:integer; // Текущий режим сортировки
constructorCreate;
propertyX [Index1, Index2: Integer]: TVarType        read GetX   write SetX;
propertyNames [Index: Integer]: String   read GetName      write SetName;
propertySize: Integer   read GetSize write SetSize;
propertyCols: Integer   read GetCols write SetCols;
procedureSort (xMode: integer = 0);
procedureAdd();
procedureAddCopy (Index: integer);
procedureDelete (Index: integer);
functionFind (Col, Row: integer; Value: Variant): integer;
end;
implementation
constructorTVector. Create;
begin
FNum:=0; SortId:= 0; SortMode:= 1;
end;
functionTVector. GetSize: Integer;
beginresult:= FNum; end;
procedureTVector. SetSize (value: Integer);
beginFNum:= value; end;
functionTVector. GetCols: Integer;
beginresult:= FCols; end;
procedureTVector. SetCols (value: Integer);
beginFCols:= value; end;
procedureTVector. SetX (Index1, Index2: integer; value: TVarType);
begin
FArr[Index1][Index2]:= value;
end;
functionTVector. GetX (Index1, Index2: integer):       TVarType;
begin
result:=FArr[Index1] [Index2];
end;
functionTVector. GetName (Index: integer): String;
begin
result:=FNames[Index];
end;
procedureTVector. SetName (Index: integer; value: String);
begin
FNames[Index]:=Value;
end;
procedureTVector. Add();
begin
FNum:=FNum + 1;
end;

procedureTVector. AddCopy (Index: integer);
begin
FNum:=FNum + 1;
FArr[FNum]:=FArr[Index];
end;
procedureTVector. Delete (Index: integer);
vari: integer;
begin
ifFNum=0 then exit; // Вроде как нечего удалять
fori:=Index+1 to FNum do // Перенесем строки
FArr [I-1]:=FArr[I];
FNum:= FNum-1; // уменьшаем количество
end;
 //Процедура сортировки вектора данных по индексу SortId с режимом xMode
 // xMode= 1 – по возрастанию
 // xMode= 2 – по убыванию
 // xMode= 0 – использовать текущий режим SortMode и затем поменять его
procedureTVector. Sort (xMode: integer = 0);
procedureQSort (l, r: Integer);
functionLess (var x, y: Variant): boolean;
begin
if(X
thenLess:=true
elseLess:=false;
end;
var
i,j, x: integer;
y:TVarMas; //Variant;
begin
i:=l; j:= r; x:= (l+r) DIV 2;
repeat
whileLess (FArr[i] [SortId], FArr[x] [SortId]) do i:= i + 1;
whileLess (FArr[x] [SortId], FArr[j] [SortId]) do j:= j – 1;
ifi
begin
y:=FArr[i];
FArr[i]:=FArr[j];
FArr[j]:=y;
i:=i + 1; j:= j – 1;
end;
untili > j;
ifl
ifi
end;
begin{QuickSort};
ifxMode0
thenSortMode:= xMode;
QSort(1, Size);
if xMode=0then // Поменяем режим сортировки
begin
ifSortMode = 1
thenSortMode:=2 else SortMode:=1;
end;
end;
 //Процедура поиска значения Value в столбце Col с позиции Row
 //возвращает индекс найденой строки или 0 если ничего не найдено
functionTVector. Find (Col, Row: integer; Value: Variant): integer;
vari: integer;
begin
result:=0;
fori:=Row to FNum do
ifFArr[I] [Col] = Value then
beginresult:= i; exit; end;
end;
end.


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.