Разработка программного продукта "Хроника моего рода" для операционной среды Windows
Характеристика требований к программному обеспечению комплекса. Выбор языка программирования. Разработка алгоритмов создания генеалогического дерева и способов работы с ним. Описание общего вида программного продукта и тестирование его надежности.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 01.10.2017 |
Размер файла | 469,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
1.3.3.4 Алгоритм объединения деревьев
Задача алгоритма заключается в объединении того дерева, с которым пользователь в данный момент работает с деревом, которое пользователь выберет из предложенного списка. Объединяются только те деревья, в которых есть общие люди. То есть если две персоны поженились и у них есть свои родословные, то их можно объединить.
Данный алгоритм показан на рис. 1.3.3.4 и осуществляется модулем программы Combine.pas.
Рассмотрю сам алгоритм.
На начальном этапе дерево, с которым мы работаем, находится в массиве PersonAr. В массив PersonAr1 считываем дерево, с которым будем объединять. Сравниваем два массива на предмет общих людей. Присваиваем флажку Id единичку, если общие люди есть. Затем делаем проверку на этот флажок, если не единица, то показываем форму fmSugest с предупреждением «В деревьях нет общих людей». Затем предлагается выбрать другое для объединения дерево или выйти из задачи объединения.
Общие люди в двух деревьях есть: дополняем массив PersonAr массивом PersonAr1, т.е. вторая половина массива PersonAr это массив PersonAr1. При записи меняем идентификаторы на соответствующие в массиве PersonAr. Получается, что в массиве два одинаковых элемента - в первой и второй половинах массива. В первой половине массива меняем ссылки общего человека на новые, те которые есть у этого человека во второй половине массива. Запись человека, который находится во второй половине массива, обнуляем. Все готово, чтобы начать рисование дерева.
Размещено на http://www.allbest.ru/
Рис.1.3.3.4 Схема алгоритма объединения деревьев
1.4 Рабочий проект
1.4.1 Общий вид программного продукта
Общий алгоритм программы отражает и структуру программы, и этапы работы с программой. Каждый шаг пользователя поддерживается соответствующим программным блоком (формой).
Общий алгоритм программного комплекса представлен на рис. 1.4.1.1.
Размещено на http://www.allbest.ru/
Рис. 1.4.1.1 Общий вид взаимодействия программных блоков.
Первая форма, с которой начинается работа с программой, fmBegin. Если же программа скопирована без лицензионных прав на это, будет сразу же выдано сообщение в окне fmProtection об отсутствии прав на пользование данной программой. В этом случае дальнейшая работа с программой окажется невозможной.
В форме fmBegin пользователю предоставляется выбор перейти на форму fmEnterfam, fmTree.
Форма fmEnterfam - пользователь начинает создавать новую родословную. Сначала вводится название родословной. После этого появляется форма fmMainInfo.
В последней форме fmMainInfo пользователю предоставляется возможность занести все данные, которые нужно, о конкретном человеке, а именно, его ФИО, дату, год и место рождения, какую-либо интересную информацию об этом человеке в текстовом виде, прикрепить аудио-видео файлы, фотографии, указать супруга, детей и родителей данной персоны. Из этой формы существуют различные варианты перехода в другие формы: fmChoice, FmHus, fmTree.
FmChoice: при указании супруга, родителей или детей рассматриваемой персоны появится эта форма. Здесь пользователь может выбрать из предложенного списка (если там есть) человека, являющегося супругом, родителем или ребенком рассматриваемого человека. Если в списке этого человека нет, то в этой же форме можно создать новую персону. Если указывается супруг, то автоматически появляется форма FmHus. Из рассматриваемой формы есть возможность вернуться обратно в форму fmMainInfo.
FmHus: форма, в которой задается вопрос «Являются ли два данных человека супругами?»
FmTree: в этой форме графически отображается генеалогическое дерево. Как видно на рис. В этой форме есть большой выбор перехода: fnEnterfam, fmMaininfo, fmCombine, fmRelation, fmSelectFam, fmHelp. Некоторые из них рассмотрены ранее, другие рассмотрены далее.
FmCombine: в этой форме можно выбрать то дерево, с которым вы хотите объединить просматриваемое в данный момент дерево. Обобщенное дерево показывается на форме fmTree. Если общих людей в этих деревьях нет, то выдается сообщение.
FmRelation: здесь пользователь выбирает двух людей, родственные отношения которых он хочет определить. После этого выдается ответ.
FmSelectFam: эта форма предоставляет возможность на дереве выделить другим цветом потомков выбранного человека.
FmHelp: справка по работе с программой.
Модули, разрабатываемые в данном дипломном проекте, выделены серым цветом.
Все формы реализуются модулями программы. Их взаимодействие представлено на рис. 1.4.1.2. Серым цветом выделены модули, сделанные в дипломном проекте.
Размещено на http://www.allbest.ru/
Рис. 1.4.1.2 Схема взаимодействия модулей программы.
1.4.2 Инсталляция программного комплекса
Для начала использования программного комплекса «Хроника моего рода» необходимо установить программу на компьютер. В процессе установки программа размещается либо на С\Program Files\Genealogia.exe (месторасположение по умолчанию), либо пользователь сам выбирает путь размещения программы и прописывает его вручную. В дальнейшем при работе с программой все создающиеся файлы, необходимые для работы с родословными, будут записываться в каталог, где находится программа Genealogia.exe.
Инсталляция программного продукта осуществляется с помощью специальной программы setup.exe. Данная программа входит в состав программного комплекса «Хроника моего рода». При запуске появляется окно приветствия, затем выбирается путь, куда устанавливается программа. Запрашивается серийный номер, который выдается с приобретением диска. Если пароль не введен, то установка прервется. При успешном вводе пароля произойдет копирование файлов, и программа успешно установится. Автоматически добавляется ее ярлык в меню «Пуск/Программы», то есть запускать программу теперь можно непосредственно оттуда. Все каталоги родословных, которые будут создаваться, будут храниться в том каталоге, куда, и установлена программа. Для того чтобы, удалить программу нужно запустить программу деинсталляции, которая размещена в том каталоге, куда установлена программа.
1.4.3 Защита программного продукта
В данной дипломной работе инсталляция приложения используется еще и как одно из средств защиты программного продукта от несанкционированного копирования. Если у пользователя есть только копия программы Genealogia.exe, то он не сможет работать с ней. В этом случае при начале работы с программой появиться следующее сообщение: «Вы не имеете прав на работу с программой. Приобретите лицензионную версию».
В случае, когда у пользователя есть полный диск с программным комплексом, на диске имеется файл установки программы setup.exe. К диску прилагается пароль, без которого не удастся провести установку. В процессе установки компьютер запрашивает путь, куда установить программу, и затем автоматически добавляет ее ярлык в меню «Пуск/Программы», то есть запускать ее теперь можно непосредственно оттуда. Для полного удаления программы следует запустить деинсталлятор программы, который размещается в том каталоге, куда установлена программа.
Способ защиты программы состоит в следующем. Установка программы настроена так, что автоматически в системном реестре создается в ключе HKEY_Local_Machine\Software субключ A Project\P1. В параметры данного субключа заносится некоторые значения. Конкретно, параметру `Файл' присваивается значение «Yes». В ходе запуска программы обрабатывается проверка системного реестра на это значение. Если все правильно пользователь продолжает работу с программой. Иначе, программа работать не будет. Процедура проверки, используемая при этом, находится в модуле genealogia_begin.pas.
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('\software\a projects\P1\',false) then
begin
if (Reg.ReadString('Файл')<>'Yes') then begin
fmProtection.ShowModal;
//fmBegin.Close;
end;
end
else begin
fmProtection.ShowModal;
end;
Для защиты программы еще используется и серийный номер программного продукта. Для каждого диска с программой выделяется свой серийный номер. Инсталлятор программы setup.exe (рис. 1.4.3) создавался с помощью специальной программы Install Master.
Рис. 1.4.3 Окно программы установки.
Это позволило в программе установки обрабатывать серийный номер по некой заданной маске. Следовательно, для каждого экземпляра не нужно создавать новый инсталлятор программы. Серийный номер состоит из 10 цифр. Разработана форма генерирования серийного номера по этой маске.
1.4.4 Разработка программы
Разработанные алгоритмы, приведенные в техническом проекте, реализовывались модулями программы. Модули создавались в среде Borland Delphi 5 [1]. Взаимодействие модулей программы рассмотрено на рис. 1.4.1.2. Ниже некоторые модули описаны подробнее.
Алгоритм ввода, сохранения и изменения информации, а также выдача информации по конкретному узлу генеалогического дерева реализован модулем info1.
1. Модуль info1 - это модуль информации по конкретным узлам.
Переменные, объявленные в модуле:
· FUpdating - идентификатор выбора стиля текста;
· miMinInfoCounter - идентификатор минимума вводимой информации;
· MotherChanged, FatherChanged, HusChanged, ChiChanged - идентификаторы нажатых кнопок;
· UrlCommaCounter - идентификатор ввода информации.
Процедуры и функции модуля (кроме процедур обработки нажатий кнопок):
· procedure ClearAll - очищает все поля формы fmMainInfo;
· procedure SaveInfo(Id: integer) - сохраняет информацию о персоне в массиве персон;
· function LoadFromArFoto(id: integer; name: string):string - загружает фото для просмотра, в соответствии с информацией из массива ArFoto;
· function LoadFromArVideo(id: integer; name: string):string - аналогично для видео;
· function LoadFromArAudio(id: integer; name: string):string - аналогично для аудио;
· procedure AddName(var list: TListBox;var KolMedia: integer; Name,path: string;var mas: array of TMedia) - сохраняет информацию в медиа массивы;
· procedure FindAllMedia - находит все медиа файлы, относящиеся к персоне;
· procedure httpConnect(Sender: TObject) - производит запуск Интернет-броузера;
· procedure changepic(path:string) - «подгоняет» фото под размеры окна;
· procedure ConvertData(data: string; live: integer) - инвертирует данные о дате в нужный формат.
2. Модуль Pr1 - модуль визуализации дерева. Также в этом модуле организована работа с мышью и масштабирование дерева.
Переменные, объявленные в модуле:
- Width1, Height1 - высота и ширина рисунка генеалогического дерева;
- Kol_u - количество поколений в родословной;
- sum: array [0..100] of integer - одномерный массив, в котором индекс соответствует номеру поколения, а элемент - это количество людей в этом поколении.
- u_max, u_min - максимальный и минимальный номер поколения. Той персоне, с которой начали строить родословную присваивается нулевое поколение, следующему поколению на единицу больше. Соответственно меньшие поколения на единицу меньше, то есть они будут с отрицательным знаком, напр., -1, -2.
- kx, ky - коэффициенты сжатия по оси Х и Y.
- SomeWife - идентификатор принимает значения true (у персоны один супруг) и false (у персоны есть не один заключенный брак или дети вне брака).
Процедуры и функции модуля (кроме процедур обработки нажатий кнопок):
В алгоритм рисования дерева входят две основные процедуры CreateMas и DrawTree, в них еще несколько подпроцедур.
Процедура CreateMas: сначала устанавливаются идентификаторы key и SomeWife. Второй идентификатор принимает значения true (у персоны один супруг) и false (у персоны есть не один заключенный брак или дети вне брака). В начале работы алгоритма этому идентификатору присваивается значение true. Далее вызывается функция max_z, которая подсчитывает общее количество поколений в родословной. Результат этой функции присваивается переменной Kol_u. Следующая процедура CreateArpok создает двумерный массив из одномерного массива PersonAr. В получившемся массиве элементами одной строки являются люди одного поколения. Сортировка массива осуществляется процедурой SortArpok. Муж и жена в одной строке расположены рядом. Процедура FormXY формирует координаты узлов генеалогического дерева. Размеры рисунка дерева рассчитываются процедурой SizePanel. Для того, чтобы дерево находилось не в одной части экрана, если его размеры меньше размеров экрана монитора, его координаты корректируются таким образом, чтобы оно располагалось посередине. После проведенных действий массив pArpok сформирован должным образом.
Функция max_z: рассчитывает общее количество поколений в родословной. Здесь использован простой алгоритм нахождения максимума и минимума, когда на первом этапе за минимум берется заведомо большое число min1:= 1000, за максимум соответственно - маленькое max1:= -1000. Поиск минимума: первый элемент PersonAr[k].pok сравнивается с min1. Если он меньше, то он становится min1, далее сравниваются остальные элементы. В итоге значение min1 и есть меньшее поколение. Максимум находится аналогично. Общее количество поколений в родословной max_z есть разность max1 и min1. Переменным u_min присваивается значение меньшего поколения, переменной u_max - значение старшего поколения.
Процедура CreateArpok: создает двумерный массив pArpok из одномерного массива PersonAr таким образом, чтобы в каждой строке массива pArpok находились люди одного поколения. В начале формируется одномерный массив sum: array [0..100] of integer. В нем индексу соответствует номер поколения, а значению элемента массива с этим индексом соответствует количество людей в этом поколении. Далее в цикле по j (номер поколения) сначала для нулевого поколения заполняем нулевую строку массива pArpok. Каждый элемент массива PersonAr[k].pok сравнивается с номером поколения j (сейчас равен 0). Те элементы, которые соответствуют этому поколению, заносятся на j-ую строку массива pArpok. Одновременно с этим подсчитывается количество элементов на этой строке, если оно превосходит соответствующий этому поколению элемент массива sum, то переходим к заполнению следующей строке-поколению.
procedure TfmTree.CreateArpok();
var s, i, j,k: integer;
begin
for j:=u_min to u_max do
begin
s:=0;
for i:=1 to Kol-1 do
if PersonAr[i].pok=j then формирование одномерного
begin массива sum
s:=s+1;
end;
sum[j-u_min]:=s;
end;
for j:=0 to Kol_U do
begin
s:=0;
for k:=1 to Kol do
begin заполнение
if PersonAr[k].pok=j+u_min then массива pArpok
begin
if (PersonAr[k].Fam<>'') or (PersonAr[k].Id<>0) then
begin
pArpok[j,s]:= PersonAr[k];
s:=s+1;
end;
if s=sum[j] then break;
end;
end;
end;
Процедура SortArpok: сортирует массив pArpok так, чтобы супруги в одном поколении размещались рядом. В этой процедуре так же используется массив sum, упоминавшийся в предыдущей процедуре. Проходимся по строкам массива pArpok. Сначала первый элемент запоминаем, как P, следующий, как P1. Если супруг P-го элемента есть P1, то ставим их вместе. (Перемещение элемента осуществляет процедура Change(lvl,p1,p2: integer)). Если нет, то P1 присваиваем значение следующего элемента и сравниваем снова. Достигнут конец строки, тогда P присваивается значение второго элемента, если замены не произошло и третьего элемента, если произошла замена, и продолжается сравнение.
Procedure SortArpok();
var j,i,m,a: integer;
P,P1: TPerson;
begin
for j:=0 to Kol_u do
begin
m:=0;
while m<sum[j] do
begin
P:=pArpok[j,m];
a:=0;
for i:=m+1 to sum[j]-1 do
begin
P1:=pArpok[j,i];
if P1.Husbend=p.Id then
begin
Change(j,m+1,i);
a:=a+1;
break;
end;
end;
if a>0 then m:=m+2
else m:=m+1;
end;
end;
end;
Procedure Change(lvl,p1,p2: integer);
var buf: TPerson;
begin
buf:=pArpok[lvl,p1];
pArpok[lvl,p1]:=pArpok[lvl,p2];
pArpok[lvl,p2]:=buf;
end;
На вход процедуры Change(lvl,p1,p2: integer) подается номер уровня lvl, расположение элемента на этой строке p1 и расположение второго элемента p2, который будет ставиться рядом.
Процедура FormXY: формирует координаты узлов генеалогического дерева. Присваиваются каждому человеку координаты x и y. (Именно на месте этих координат будет отображен данный человек.) Заметим, что ближайшие люди находятся на расстоянии 200 пикселей по оси X и 90 пикселей по оси Y. В этой же процедуре происходит выравнивание общего вида дерева.
Процедура DrawTree: осуществляет процесс визуализации генеалогического дерева. В начале заливается цветом фона прямоугольник размером с рисунок дерева, который рассчитывался ранее. На этом фоне рисуются узлы дерева кружочками (персона женского пола) или квадратиками (персона мужского пола). Для этого проходим по всем элементам массива данных и сравниваем поле записи элемента pArpok[j,i].pol со значением «жен» и «муж». Чтобы нарисовать линию, связывающую двух супругов, выполняются два цикла. Проходимся по строкам массива pArpok, запоминаем идентификатор супруга рассматриваемой персоны. Затем ищем супруга в данной строке и запоминаем индекс этого элемента. Теперь, узнав индексы требуемых элементов, рисуем соединяющую их линию при помощи процедуры LinkOneLayer(xn,y,xk: integer). Так проверяем каждый элемент. Если найденный супруг персоны уже проверялся, то проверяем следующие элементы.
for j:=0 to Kol_U do
begin
for i:=0 to sum[j]-1 do
begin
d:=pArpok[j,i].Husbend;
if PersonAr[d].pok <> pArpok[j,i].pok then goto l;
if ((d=0) or (d= pArpok[j,i-1].Id)) then goto l;
for k:=0 to sum[j]-1 do
if (pArpok[j,k].Id = d) then d1:= k;
LinkOneLayer(pArpok[j,i].xp, pArpok[j,i].yp,pArpok[j,d1].xp);
l: d:= -1;
end;
end;
Рисование линии-связи «родители-ребенок» осуществляется похожим образом, что и линия, связывающая супругов. Только здесь следует учитывать, что детей может быть несколько и ребенок имеет указатель на следующего ребенка. Рисование происходит с помощью процедуры LinkTwoLayer(xn,y, xk, xsb,yk: integer) .
for j:=1 to Kol_U do
begin
for i:=0 to sum[j]-1 do
begin
d:=pArpok[j,i].Husbend;
if ((d=0) or (d= pArpok[j,i-1].Id)) then goto m1;
for k:=0 to sum[j]-1 do
if (pArpok[j,k].Id = d) then d1:= k;
d2:= pArpok[j,i].Children;
if d2=0 then goto m1;
if d2<> PersonAr[d].Children then goto m1;
for k:=0 to sum[j-1]-1 do
if (pArpok[j-1,k].Id = d2) then d3:= k;
LinkTwoLayer(pArpok[j,i].xp, pArpok[j,i].yp,pArpok[j,d1].xp, pArpok[j-1,d3].xp, pArpok[j-1,d3].yp);
d4:= pArpok[j-1,d3]. Sist_Broth;
while d4<>0 do
begin
for k:=0 to sum[j-1]-1 do
if (pArpok[j-1,k].Id = d4) then d3:= k;
LinkTwoLayer(pArpok[j,i].xp, pArpok[j,i].yp,pArpok[j,d1].xp, pArpok[j-1,d3].xp, pArpok[j-1,d3].yp);
d4:= pArpok[j-1,d3]. Sist_Broth;
end;
m1: d:= -1;
end;
end;
В этой процедуре необходимо охватить все связи между людьми, например, разное количество браков или внебрачные дети. Для этого есть идентификатор SomeWife, принимает значение false в этом случае. Тогда, когда вызывается процедура LinkOneLayer(xn,y,xk: integer) происходит проверка на это идентификатор. В рассматриваемом случае эта линия будет рисоваться ниже и пунктиром.
Если известен только один родитель ребенка, то это тоже учитывается, при этом используется процедура Link(xn,yn, xk,yk: integer). Если супруги находятся на разных поколениях, то рисование линии, связывающей их, осуществляет процедура WrongLink(xn,yn, xk,yk: integer).
for i:=0 to Kol do
begin
m:= PersonAr[i].MotherId;
f:= PersonAr[i].FatherId;
if (((PersonAr[i].MotherId <> 0) and (PersonAr[i].FatherId = 0)) or ((PersonAr[i].MotherId = 0) and (PersonAr[i].FatherId <> 0))) then
begin
if PersonAr[i].MotherId <> 0 then Link(PersonAr[m].xp, PersonAr[m].yp,PersonAr[i].xp,PersonAr[i].yp)
else Link(PersonAr[f].xp, PersonAr[f].yp,PersonAr[i].xp,PersonAr[i].yp);
end;
end;
for i:=0 to Kol do
begin
h:= PersonAr[i].husbend;
if ((PersonAr[i].pok <> PersonAr[h].pok) and (h<>0)) then WrongLink(PersonAr[i].xp, PersonAr[i].yp, PersonAr[h].xp, PersonAr[h].yp);
end;
Процедура Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer): при движении мышки по узлу дерева данная процедура обеспечивает высвечивание подсказки с ФИО персоны этого узла. Сравниваются координаты мышки и узла дерева.
Процедура Image1MouseDown(Sender:TObject;Button:TMouseButton;
Shift:TShiftState; X, Y: Integer): при нажатии мышки на узел дерева появляется форма «Информация о конкретном узле дерева». Сама процедура аналогична Image1MouseMove.
Процедура N16Click: обеспечивает уменьшение размеров дерева до размеров экрана монитора. Рассчитываются коэффициенты сжатия по оси Х и Y, kx и ky.
kx:= fmTree.Width/Image1.Width;
ky:= (fmTree.Height-70)/Image1.Height;
Изменяются координаты всех дерева путем умножения на коэффициенты имееющихся координат.
Процедура N17Click: возвращает реальный размер дерева.
ПроцедурыPointM (x,y:integer;Image1:TImage;l:integer) и PointF(x,y:integer;Image1:TImage; l: integer): рисуют узлы дерева, кружочек - это женщина, квадратик - мужчина.
3. Модуль SelFam - этот модуль реализует алгоритм выделения отдельной ветви дерева, описанный ранее в техническом проекте.
Этот алгоритм основан на рекурсивной процедуре Potomok(Id, pos). В качестве входных параметров в процедуре Potomok(Id,pos) номер Id - тот, чьих потомков ищем, Pos - индекс в массиве Mas - место, куда записывается очередной найденный потомок. Цель процедуры сформировать массив Mas, в котором будут находиться только те, кто является потомком выбранного человека. На первое место массива Mas заносится тот самый выбранный человек. Если у человека нет детей и сестер/братьев, то выходим из алгоритма.
Если есть сестры/братья, то проверяем одни ли у них родители. Родители одни - записываем найденного человека в массив Mas. После этого вызываем рекурсивно процедуру Potomok(Id,pos) уже для найденного человека. Так будет продолжаться, пока у найденных сестер/братьев будут находиться дети или их сестры /братья. Если таковых нет, то в массив заносится ребенок выбранного нами человека и вызывается процедура уже для него. Таким образом, в массиве Mas окажутся все потомки выбранного пользователем человека. Можно рисовать. Но в рисовании есть тоже некоторые особенности, которые выполняет процедура DrawBranch.
function Potomok(id:integer; var pos:integer):boolean;
label l;
begin
if ((mas[pos].Children=0) and (mas[pos].Sist_Broth=0)) then
begin
roma:=true;
exit;
end;
while mas[pos].Sist_Broth<>0 do
begin
//if (((mas[pos].Husbend <> PersonAr[mas[pos].Sist_Broth].MotherId) and (mas[pos].Husbend = PersonAr[mas[pos].Sist_Broth].FatherId)) or ((mas[pos].Husbend = PersonAr[mas[pos].Sist_Broth].MotherId) and (mas[pos].Husbend <> PersonAr[mas[pos].Sist_Broth].FatherId)) or (mas[pos].Husbend=0)) then goto l;
if (((mas[pos].MotherId <> PersonAr[mas[pos].Sist_Broth].MotherId) and (mas[pos].FatherId = PersonAr[mas[pos].Sist_Broth].FatherId)) or ((mas[pos].MotherId = PersonAr[mas[pos].Sist_Broth].MotherId) and (mas[pos].FatherId <> PersonAr[mas[pos].Sist_Broth].FatherId)) {or (mas[pos].Husbend=0}) then goto l;
pos:=pos+1;
mas[pos]:=PersonAr[mas[pos-1].Sist_Broth];
Potomok(mas[pos].id,pos);
end;
l: pos:=pos+1;
mas[pos]:=PersonAr[PersonAr[id].Children];
Potomok(mas[pos].Id,pos);
end;
Процедура DrawBranch: осуществляет рисование ветви дерева в соответствии с массивом Mas. Процедура выполняется аналогично процедуре DrawTree.
4. Модуль Combine - модуль объединения деревьев. Модуль реализует алгоритм объединения деревьев, описанный в техническом проекте.
Главной процедурой этого модуля является процедура ReadFromFile (fname: string). На начальном этапе дерево, с которым мы работаем, находится в массиве PersonAr. В массив PersonAr1 считываем дерево, с которым будем объединять. Сравниваем два массива на предмет общих людей. Присваиваем флажку Id единичку, если общие люди есть. Затем делаем проверку на этот флажок, если не единица, то показываем форму fmSugest с предупреждением «В деревьях нет общих людей». Затем предлагается выбрать другое для объединения дерево или выйти из задачи объединения.
5. Модуль files - это модуль, где описаны функции работы с файлами.
6. Модуль prgenealogia_begin - это главный модуль программы.
7. Модуль enterfam - это модуль информации по конкретным узлам.
8. Модуль gedcom - это модуль чтения информации из GedCom файла.
9. Модуль gedcom1 - это модуль записи информации в GedCom файл.
10. Модуль people - это модуль выбора родственников. В нем предлагается выбрать нужного человека из предложенного списка, либо добавить нового человека. Выбрать можно супруга, мать, отца и детей. Эти действия реализуются процедурами ShowFather, ShowMother, ShowChildren, ShowHusbend. Процедуры аналогичны друг другу. Ниже приведена одна из этих процедур:
procedure TfmChoice.ShowHusbend;
var i: integer;
begin
if PersonAr[tecid].pol='жен' then
cmbPol.Text:='муж' else cmbPol.Text:='жен';
for i:=1 to Kol do
if ((PersonAr[i].Husbend=tecid) and (PersonAr[i].Id<>tecId)) then
lbPeople.Items.Add(IntToStr(PersonAr[i].id)+' '+PersonAr[i].Fam+' '+PersonAr[i].Name+' '+PersonAr[i].PatronName);
for i:=1 to Kol do
if PersonAr[i].Id<>tecId then
cmbChoice.Items.Add(IntToStr(PersonAr[i].id)+' '+PersonAr[i].Fam+' '+PersonAr[i].Name+' '+PersonAr[i].PatronName);
end;
11. Модуль warningdel- это модуль предупреждения об удалении.
12. Модуль name - это модуль ввода названия медиа объекта.
13. Модуль husbend - это модуль вопроса о браке родителей.
14. Модуль poisk - это модуль информации по конкретным узлам.
Всю информацию по модулю - см. в первой части работы.
15. Модуль poisk1 - это модуль вывода ответа на вопрос пользователя.
Всю информацию по модулю - см. в первой части работы.
16. Модуль statistic - это модуль статистики по текущей родословной.
Всю информацию по модулю - см. в первой части работы.
1.4.5 Тестирование надежности программного продукта
При тестировании надежности программного комплекса необходимо решить следующие проблемы: своевременно фиксировать изменения в базе данных и контролировать правильность вводимых данных.
Своевременную фиксацию изменений обеспечивает то, что все рабочие массивы держатся в оперативной памяти компьютера. Соответственно все изменения данных фиксируются в этих массивах, которые записываются в файл при завершении работы с данной родословной.
В разработанной программе контроль правильности вводимых данных осуществляется механизмом ограничений целостности.
Ограничения целостности делятся на следующие типы:
Ограничения пустого значения.
Разработчиком задаются поля, которые не могут быть пустыми. Например, при вводе новой персоны необходимо ввести фамилию, имя и пол.
Ограничения уникальности.
В указанное разработчиком поле не может быть введено двух одинаковых значений. Например, не может быть персон с одинаковыми номерами. Номера уникальны и присваиваются независимо от пользователя программы по принципу автоинкремента.
Ограничения ссылочного ключа.
Персона не может иметь ссылку на себя, на персоны - родители, уровень которых меньше уровня данной персоны, на персоны - дети, уровень которых больше уровня данной персоны.
Ссылочные ограничения
указывают, каким образом обрабатываются персоны, которые имеют ссылки на данную персону при попытке ее удаления или изменения. Возможные режимы работы:
Если у персоны есть дети, то запрещены операции удаления этой персоны до тех пор, пока персоны - дети не будут удалены.
При удалении персоны (если это возможно) происходит обработка персон, которые ссылаются на удаляемую персону:
- если персоны - родители ссылаются на данную персону, то эти ссылки удаляются и, если есть другие дети, записывается ссылка на ту персону, на которую ссылается удаляемая персона;
- если на персону ссылается другая персона по ссылке брат/сестра, то ссылка удаляется, если удаляемая персона не ссылается по аналогичной ссылке на другую персону, или записывается ссылка на ту персону, на которую ссылается удаляемая персона по данной ссылке.
- если персона ссылается на персону по ссылке супруг, то у персоны - супруга удаляется ссылка на удаляемую персону (если нет общих детей).
При попытке изменения персоны не происходит никаких изменений относящихся к другим персонам.
Таким образом, использование механизма ограничения целостности исключает появление в системе неверных данных.
Также в массиве используется контроль ввода данных на символьном уровне
· при вводе дат не допускается ввод никаких символов кроме цифр;
· при вводе месяцев допускается выбор только из представленных двенадцати значений;
· при вводе фамилии, имени и отчества не допускается ввод никаких символов кроме букв.
1.4.6 Зависимость размера файлов родословных и машинного времени построения генеалогического дерева от количества персон
В данном случае будет рассматриваться размер только самих файлов родословной: файл персон и файлы дополнительной информации. Те файлы, которые являются носителями информации - видео-, фото- и аудио файлы, могут иметь различные размеры, которые зависят от типа этих файлов. Тип этих файлов зависит от выбора пользователя.
Рассмотрим файл основной информации: он типизированный и его размер зависит от размера одной записи и от количества персон. Размер одной записи равен 612 Байт, соответственно размер файла пропорционален Х*612, где Х - количество персон. Аналогично вычисляется размер файлов дополнительной информации: Х*104, где размер одной записи в этих файлах равен 104 Байт, а Х - количество записей.
Зависимость машинного времени (T) построения генеалогического дерева от количества персон (N) в родословной отражена на графике рис. 4.7 (график сделан качественно). Чем больше персон в родословной, тем дольше идет процесс отображения дерева на экран.
Размещено на http://www.allbest.ru/
Выводы
В результате разработки дипломного проекта были получены следующие результаты:
1) Разработаны и отлажены модули программного комплекса как отдельно, так и совместно с другими модулями, разработанными в первой части проекта.
2) В результате выполнения разработанных модулей реализуются такие функции, как:
- ввод информации и отображение ее в форме «Информация о конкретной персоне»;
- представление вводимой информации по родословным в виде генеалогического дерева;
- возможность объединения двух деревьев;
- нахождение всех потомков выбранной персоны и выделение их на дереве.
3) Общий объем программы (файл .exe) составляет 799 Кб. Модули, разработанные в данном дипломном проекте, занимают 78 Кб, в операторах языка: 9000 штук.
Размещено на Allbest.ru
...Подобные документы
Разработка программного приложения, производящего проверку синтаксиса простой программы: выбор метода создания синтаксического анализатора, описание требований к программному обеспечению, написание алгоритмов решения и тестирование конечного продукта.
курсовая работа [579,7 K], добавлен 03.07.2011Требования к создаваемому программному модулю. Разработка необходимых алгоритмов и интерфейсов. Описание протокола SPA-BUS. Выбор языка программирования. Тестирование и документирование программного продукта. Оценка экономической эффективности программы.
дипломная работа [722,4 K], добавлен 06.07.2012Обоснование выбора языка программирования. Анализ входных и выходных документов. Логическая структура базы данных. Разработка алгоритма работы программы. Написание программного кода. Тестирование программного продукта. Стоимость программного продукта.
дипломная работа [1008,9 K], добавлен 13.10.2013Архитектура программного продукта и требования к платформе, обоснование выбора разработки. Закономерности и основные этапы алгоритмизации и программирования, а также отладка и тестирование продукта. Разработка и содержание руководства пользователя.
дипломная работа [2,3 M], добавлен 19.01.2017Анализ криптографических методов шифрования данных. Разработка криптосистемы, основанной на схеме Эль-Гамаля. Определение функциональных и нефункциональных требований. Выбор языка программирования и среды разработки. Тестирование программного продукта.
дипломная работа [1,6 M], добавлен 17.07.2016Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.
дипломная работа [1,5 M], добавлен 12.06.2009Этапы разработки и отладки приложения "Помощь почтальону". Составление сопроводительной документации. Выбор средств и методов программирования. Анализ проектных данных. Особенности создания базы данных, СУБД. Тестирование созданного программного продукта.
контрольная работа [2,5 M], добавлен 17.12.2014Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и оценка структур данных для ее хранения. Разработка основных алгоритмов решения и структурной схемы программного продукта. Проектирование интерфейса пользователя.
курсовая работа [449,8 K], добавлен 14.01.2011Разработка программного обеспечения, предназначенного для предоставления трех способов прохождения тестов для студентов. Построение модели потоков данных, физической базы данных. Выбор языка программирования. Условия эксплуатации, требования к надежности.
дипломная работа [2,7 M], добавлен 18.04.2014Разработка программного продукта для спирографического обследования. Структура базы данных программы "СпирографОтдел". Выбор программного продукта и руководство пользователя. Минимальные рекомендуемые требования к техническому и программному обеспечению.
дипломная работа [1,0 M], добавлен 13.04.2014Анализ требований к программному продукту. Требования к информационной и программной совместимости. Проектирование архитектуры программного продукта. Виды программ и программных документов. Общие сведения о С++. Технология разработки программного модуля.
дипломная работа [1,2 M], добавлен 05.08.2011Выбор инструментария программирования, технология создания электронного учебника. Установка программного продукта, инструкция пользователя по сопровождению. Набор тестов и тестирование, протокол ошибок. Расчёт цены и себестоимости программного продукта.
курсовая работа [1,9 M], добавлен 09.12.2010Теоретические сведения о возможностях Microsoft.NET. Разработка Windows-приложения на платформе Microst.NET: функциональное назначение, описание логической структуры, изучение требований по установке и техническому обеспечению программного продукта.
курсовая работа [3,8 M], добавлен 28.06.2011Возможности среды программирования delphi при разработке приложения с визуальным интерфейсом. Разработка спецификации программного обеспечения и на ее основе кода программного продукта. Отладка программы "трассировкой", ее тестирование и оптимизация.
курсовая работа [501,4 K], добавлен 07.12.2016Анализ методов реализации интеллектуальных игр в системе человек-робот. Разработка архитектуры программного комплекса, выбор языка программирования. Алгоритм преобразования данных. Тестирование программного комплекса, редактирование и исправление ошибок.
дипломная работа [2,6 M], добавлен 27.10.2017Создание прикладного программного обеспечения для реализации интерфейса терминала по приему платежей за услуги связи. Анализ требований к программному обеспечению. Выбор языка программирования. Разработка интерфейса пользователя и проектной документации.
дипломная работа [1,3 M], добавлен 18.06.2015Методы разработки автоматизированных систем. Характеристика языка программирования Delphi и операционной системы Windows. Назначение и область применение, принцип действия идентификаторов. Этапы разработки программного продукта, требования к нему.
курсовая работа [903,9 K], добавлен 14.02.2015Pascal - высокоуровневый язык программирования общего назначения и интегрированная среда разработки программного обеспечения для платформ DOS и Windows. Входная информация, требуемая для решения задачи и принятые обозначения; описание алгоритма.
курсовая работа [259,6 K], добавлен 18.01.2011Технологии разработки программного обеспечения. Процедура постановки задачи, определения требований. Последовательность действий логической, разветвленной и циклической структуры. Терминология программирования. Этапы создания программного продукта.
презентация [793,8 K], добавлен 15.11.2010Создание программного продукта, автоматизирующего деятельность сотрудника учебного заведения, занимающегося учетом проведения научно-практических конференций. Выбор языка, среды программирования, разработка алгоритмов, проектирование интерфейса программы.
курсовая работа [1,5 M], добавлен 06.12.2012