Программа "электронная сваха" для службы знакомств

Исследование основных процедур разрабатываемой программы "электронной свахи". Обоснование использования динамических списков. Алгоритм поиска элемента по соответствующему полю. Блок-схема процедуры подбора пар. Особенности тестирования программы.

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

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

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

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

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

Используя динамические списки разработать программу "электронная сваха" для службы знакомств.

Входные данные:

Типизированный файл со списком невест, типизированный файл со списком женихов.

При работе программы данные из файлов загружаются в два списка: список женихов и список невест. В каждом списке кандидат (жених или невеста) характеризуется записью вида

Type

ZAP = Record

Nom : Integer;

MyData : record

Vz, Rst, Vs : Integer;

end;

Critery : record

VzMin, VzMax : Integer;

RstMin, RstMax : Integer;

VzMin, VzMax : Integer;

end;

end;

где Nom - порядковый номер кандидата;

MyData - данные о кандидате (возраст, рост, вес);

Critery - аналогичная запись, содержащая требования к партнеру (в виде диапазона : Min - Max).

Требуется объединить эти списки в список пар (без повторения женихов и невест) с учетом требований кандидатов.

Выходные данные:

Типизированный файл со списком пар, файл со списком невест, файл со списком женихов.

В программе должны присутствовать следующие процедуры:

1. Формирование динамических списков женихов и невест;

2. Вывод списков на экран;

3. Подбор пар и вывод на экран;

4. Добавление кандидата в список;

5. Удаление кандидата из списка;

6. Поиск элемента списка по соответствующему полю;

7. Сортировка по алфавиту;

8. Запись в файл и загрузка из файла.

Элемент списка имеет следующую структуру:

Type

POffice=^Office;

Office = Record

Nom : Integer;

MyData : record

Vz, Rst, Vs : Integer;

end;

Critery : record

VzMin, VzMax : Integer;

RstMin, RstMax : Integer;

VzMin, VzMax : Integer;

end;

Next : POffice;

end;

где Next - указатель на следующий элемент списка.

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

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

Введение

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

Цель этой работы именно в создании подобного программного обеспечения, реализованного с помощью динамических списков. Динамические цепочки являются аналогами строк текущей длины. В строке каждый следующий элемент занимает ячейку памяти со следующим по порядку адресом. Элементы строки можно размещать в памяти произвольно, если каждый элемент снабдить явным указанием места, где находится следующий за ним элемент. В этом случае каждый элемент строки должен состоять из двух полей: в одном поле (Element) - символ сроки, в другом (Adrcled) - ссылка на следующий элемент строки (адрес следующего элемента). Каждая такая пара называется звеном. Ссылки сцепляют звенья в одну цепочку. Такой способ представления упорядоченной последовательности элементов называется сцеплением. Сцепление применяется для представления любых сложных динамических структур данных - строк, списков, деревьев и так далее. В этом случае звено всегда состоит из двух частей - тела звена (элемента последовательности) и справочной части (ссылки на другие элементы структуры).

1. Основной текст

1.1 Обзор литературы

«Основы программирования» С.Окулов 2002г

Рассмотрены основные управляющие конструкции системы программирования Турбо Паскаль, процедуры и функции, строковый, вещественный и файловый типы данных. Приведен материал для изучения массивов, методов сортировки и поиска, динамических структур данных. Рассмотрены следующие структуры данных: списки, стеки, очереди, двоичные деревья, АВЛ-деревья и Б-деревья. В материалах для чтения обсуждаются практически все вопросы, входящие в школьный минимум знаний по информатике.

Книга является достаточно полным учебником по программированию, реализующим сложную задачу -- формирование у читателя структурного стиля мышления. Учебный материал -- система программирования Турбо Паскаль, а также большое число задач, включая задачи на алгоритмы сортировки и поиска.

Достаточно подробно рассмотрена работа с динамическими структурами данных.

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

К. Йенсен, Н.Вирт «Паскаль Руководство для пользователя» -Книга англ. авторов содержит полное описание современной версии алгоритмического языка Паскаль, одного из самых популярных языков программирования. Новое издание расширено и переработано в соответствии с принятым стандартом ИСО. Книга может быть использована и как учебник для изучающих Паскаль, и как справочное руководство программиста. Для специалистов в области информатики.

С. Н. Лукин «Turbo Pascal 7.0. Самоучитель для начинающих» В книге изложены основы языка Турбо Паскаль. Основная отличительная черта книги - направленность на самостоятельное изучение материала. Книга знакомит читателя с основными понятиями программирования и компьютерной техники. в ней изложены основные элементыТурбо Паскаля, необходимые для составления программ на основе процедурного подхода и работе с различными типами данных. Книга ориентирована на школьников, студентов и всех тех, кто не имеет или почти не имеет опыта программирования.

Никита Культин «Программирование в Turbo Pascal 7.0 и Delphi» Книга позволяет научиться программированию на языке Pascal в среде Turbo Pascal. Рассмотрен весь процесс создания программы: от разработки алгоритма до получения результата - готовой программы. Приведено описание языка программирования и среды разработки; рассмотрены основные типы данных и алгоритмические структуры. Уделено внимание обработке символьной информации, использованию динамических структур данных, работе с файлами, выводу данных на печать, программированию графики. Описана среда визуального программирования Delphi и показаны основы разработки в ней Windows-приложений.

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

Ю. Л. Кетков, А. Ю. Кетков «Свободное программное обеспечение. FREE PASCAL для студентов и школьников» Подробно разобраны основы программирования на языке Free Pascal: история создания и развития языка Pascal, простые типы данных, строковые данные, структурированные типы данных - массивы. Рассматриваются вопросы организации типовых блоков обработки данных - процедур и функций, работа с файлами. Показаны работа с системными библиотеками и создание собственных библиотечных модулей. Книга включает информацию о возможностях двух графических систем, входящих поставку FP IDE: модуль Graph, использующий традиционный подход, характерны для графических библиотек версий Turbo Pascal, и современный пакет OpenGL. Beсь излагаемый материал ориентирован на учебный процесс, представлено большое количество примеров и программ.

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

2. Разработка алгоритма

Для решения поставленной задачи используем двунаправленные списки. В качестве звена используем запись следующего вида:

PointerKandidat=^ZAP; {Указатель на элемент типа ZAP}

ZAP = Record {Запись для женихов и невест}

NomPP:Integer; {Номер по порядку}

FirstName:String[15]; {Фамилия}

Name:String[15]; {Имя}

Pol:Char; {Пол}

FlagVib: Boolean; {Признак выбора}

MyData:record {Запись - данные о кандидате}

Vz,Rst,Vs:Integer;

end;

Critery:record {Запись - критерии к партнеру}

VzMin,VzMax:Integer;

RstMin,RstMax:Integer;

VsMin,VsMax:Integer;

end;

PredKond,SledKond:PointerKandidat; {Указатели на следующего и предыдущего кандидата}

end;

Для формирования списков женихов и невест используем указатели:

ZhenihList, NevestaList: PointerKandidat;

Для создания списков используем процедуру вставки.

Вставка элемента

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

Порождение нового звена (при этом полям PredKond,SledKond присваиваем значение nil).

Занесение вставляемого элемента в информационное поле порожденного звена (заполнение анкетной формы кандидата).

Проверка, на наличие элементов в списке. Если список пуст, то мы присваиваем ему значение вставляемого элемента.

Вставка элемента в список (продвигаемся по списку, сравнивая значение поля «Фамилия» нового элемента с элементами в списке (пока больше)):

4.1) Если элемент вставляется на первое место:

в поле SledKond порожденного звена заносим ссылку на первое звено списка;

в поле PredKond первого звена заносим ссылку на порожденное звено;

указателю на начало списка присваиваем значение порожденного звена.

4.2) Если элемент вставляется в конец списка:

в поле PredKond порожденного звена заносим ссылку на последнее звено списка;

в поле SledKond последнего звена списка заносим ссылку на порожденное звено;

4.3) Если элемент вставляется в середину списка:

в поле SledKond порожденного звена заносим ссылку на текущее звено списка;

в поле SledKond предыдущего звена списка заносим ссылку на порожденное звено;

в поле PredKond порожденного звена заносим ссылку на предыдущее звено списка;

в поле PredKond текущего звена заносим ссылку на порожденное звено.

Ниже приведена процедура вставки звена в список кандидатов (выбран список женихов т.к. процедура вставки в список невест аналогична) Номера 1) - 4) соответствуют номерам этапов алгоритма вставки.

{Процедура вставки жениха}

procedure IncludeZhenih(PZhenih:PointerKandidat);

Var VPointer:PointerKandidat;

begin

{3}if ZhenihList=nil then ZhenihList:=PZhenih {Если список пуст}

else

begin

VPointer:=ZhenihList;

{Добавление осуществляем по значению поля "Фамилия"}

{Продвигаемся пока значение вставляемого элемента больше}

{4} While(VPointer^.FirstName<PZHenih^.FirstName) AND (VPointer^.SledKond<>nil) do

VPointer:=VPointer^.SledKond;

{Если вставляем на первое место}

{4.1}if (Pointer^.PredKond=nil) AND (VPointer^.FirstName>=PZhenih^.FirstName) then

begin

PZhenih^.SledKond:=VPointer;

VPointer^.PredKond:=PZhenih;

ZhenihList:=PZhenih;

end

else

{Если вставляем в конец списка}

{4.2}if(VPointer^.SledKond=nil) AND (VPointer^.FirstName<=PZhenih^.FirstName) then

begin

PZhenih^.PredKond:=VPointer;

VPointer^.SledKond:=PZhenih;

end

else

{Если вставляем в середину списка}

{4.3}begin

PZhenih^.SledKond:=VPointer;

VPointer^.PredKond^.SledKond:=PZhenih;

PZhenih^.PredKond:=VPointer^.PredKond;

VPointer^.PredKond:=PZhenih;

end

end;

Writeln('--Zhenih dobavlen--');

end;

{Процедура добавления кандидата}

procedure AddKondidat;

Var PKond:PointerKandidat;

begin

ClrScr;

Writeln('Dobovlenie kandidata.');

{1}new(PKond); {Выделение памяти для нового звена}

{2}FormKondidat(1,2,PKond);

PKond^.PredKond:=nil;

PKond^.SledKond:=nil;

if (PKond^.pol='m') then IncludeZhenih(PKond)

else IncludeNevesta(PKond);

end;

Подбор пар и вывод на экран.

Алгоритм подбора пар:

Обнуление признаков выбора кандидата (FlagVib:=false), каждого элемента списка женихов и невест.

Для каждого элемента из списка женихов происходит подбор элемента из списка невест (продвигаясь по списку невест). При этом элемент считается подходящим, если критерии предъявляемые к партнеру соответствуют, личным данным (MyData) элемента из списка невест, а так же критерии элемента из списка невест, предъявляемые к партнеру, соответствуют личным данным элемента из списка женихов для которого осуществляется подбор. Признаки выбора обоих элементов должны быть установлены в false.

Если элемент найден:

устанавливаем признаки выбора кандидата в true;

выводим на экран полученную пару;

переходим к следующему элементу в списке женихов.

Если элемент не найден:

переходим к следующему элементу в списке женихов.

Печать элементов для которых не подобрана пара:

продвигаемся по спискам женихов и невест;

если признак выбора элемента равен false, выводим на экран.

Ниже приведена процедура подбора пар из списков кандидатов. Номера 1) - 3) соответствуют номерам этапов алгоритма подбора пар.

{Процедура подбора пар}

procedure PodborPar;

Var ZhenPointer,NevPointer:PointerKandidat;

x,y,counter:Byte; {Координаты и переменная для подсчета пар}

begin

ZhenPointer:=ZhenihList;

NevPointer:=NevestaList;

counter:=1;

x:=1;

y:=6;

{1} {Сброс флагов совпадения}

While (ZhenPointer<>nil) do

begin

ZhenPointer^.FlagVib:=false;

ZhenPointer:=ZhenPointer^.SledKond

end;

While (NevPointer<>nil) do

begin

NevPointer^.FlagVib:=false;

NevPointer:=NevPointer^.SledKond

end;

ZhenPointer:=ZhenihList;

{2} {Цикл подбора пар}

While (ZhenPointer<>nil) do

begin

NevPointer:=NevestaList;

While ((NevPointer<>nil) AND {Продвигаемся по списку пока критерии не будут соответствовать}

( ( ( ( (ZhenPointer^.Critery.VzMin>NevPointer^.MyData.Vz) OR

(ZhenPointer^.Critery.VzMax<NevPointer^.MyData.Vz) ) OR

( (ZhenPointer^.Critery.RstMin>NevPointer^.MyData.Rst) OR

(ZhenPointer^.Critery.RstMax<NevPointer^.MyData.Rst) ) OR

( (ZhenPointer^.Critery.VsMin>NevPointer^.MyData.Vs) OR

(ZhenPointer^.Critery.VsMax<NevPointer^.MyData.Vs) ) ) OR

( ( (NevPointer^.Critery.VzMin>ZhenPointer^.MyData.Vz) OR

(NevPointer^.Critery.VzMax<ZhenPointer^.MyData.Vz) ) OR

( (NevPointer^.Critery.RstMin>ZhenPointer^.MyData.Rst) OR

(NevPointer^.Critery.RstMax<ZhenPointer^.MyData.Rst) ) OR

( (NevPointer^.Critery.VsMin>ZhenPointer^.MyData.Vs) OR

(NevPointer^.Critery.VsMax<ZhenPointer^.MyData.Vs) ) ) ) OR

( (NevPointer^.FlagVib = true) OR (ZhenPointer^.FlagVib = true) ) ) )

do

NevPointer:=NevPointer^.SledKond;

if (NevPointer<>nil) then

begin

{2.1} NevPointer^.FlagVib:= true; {Установка флага совпадения}

ZhenPointer^.FlagVib:= true;

VivodPar(x,y,counter,ZhenPointer,NevPointer); {Вызов процедуры печати пар}

counter:=counter+1;

y:=y+3;

end;

{2.2} ZhenPointer:=ZhenPointer^.SledKond;

end;

{3} {Распечатка женихов и невест без пары}

ZhenPointer:=ZhenihList;

NevPointer:=NevestaList;

{Распечатка женихов}

Writeln('Zhenihi bez pari');

While (ZhenPointer<>nil)do

begin

if (ZhenPointer^.FlagVib=false) then

Writeln(ZhenPointer^.FirstName,' ',ZhenPointer^.Name[1],'.');

ZhenPointer:=ZhenPointer^.SledKond;

end;

{Распечатка невест}

Writeln('Nevesti bez pari');

While (NevPointer<>nil)do

begin

if (NevPointer^.FlagVib=false) then

Writeln(NevPointer^.FirstName,' ',NevPointer^.Name[1],'.');

NevPointer:=NevPointer^.SledKond;

end;

end;

Удаление элемента из списка.

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

Ввод порядкового номера удаляемого элемента.

Переход к данному элементу.

Удаление элемента:

3.1) Если элемент первый в списке:

заносим в поле PredKond следующего за удаляемым звена nil;

присваиваем указателю на начало списка значение звена следующего за удаляемым;

уничтожаем удаляемое звено.

3.2) Если элемент последний в списке либо в середине списка:

заносим в поле PredKond следующего за удаляемым звена ссылку на предшествующее удаляемому звено;

заносим в поле SledKond предшествующего удаляемому звена ссылку на следующее за удаляемым звено;

уничтожаем удаляемое звено.

4) Печать полученного списка.

Ниже приведена процедура удаления звена из списка кандидатов. Номера 1) - 4) соответствуют номерам этапов алгоритма удаления.

{Процедура удаления}

procedure RemoveKand;

Var key:Char;

nom:Integer;{Переменная для хранения порядкового номера уд. эл.}

VPointer,VProm:PointerKandidat;

begin

ClrScr;

Writeln('Dlya udaleniya kandidata iz spiska zhenihov nazhmite "1", nevest "2".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

key:=ReadKey;

if(key = '1') OR (key = '2') then

begin

if (key = '1') then

VPointer:=ZhenihList;

if (key = '2') then

VPointer:=NevestaList;

ClrScr;

Writeln;

Show(VPointer);

Write('Dlya udaleniya vvedite poryadkovii nomer udalyaemogo elementa:');

{1}Readln(nom);{Считываем порядковый номер}

{Переходим на элемент с данным номером}

{2}While (VPointer^.NomPP < nom)AND(VPointer^.SledKond<>nil) do

VPointer:=VPointer^.SledKond;

{Удаляем кандидата}

if(VPointer^.NomPP = nom) then

begin

{3.1} if(nom = 1) then {Если элемент первый в списке}

begin

VPointer^.SledKond^.PredKond:=nil;

if(key = '1') then

ZhenihList := VPointer^.SledKond

else

NevestaList := VPointer^.SledKond;

Dispose(VPointer); {Освобождаем память}

end

{3.2} else

begin {Если элемент в середине или в конце}

VPointer^.SledKond^.PredKond:=VPointer^.PredKond;

VPointer^.PredKond^.SledKond:=VPointer^.SledKond;

Dispose(VPointer); {Освобождаем память}

end;

{4} {Печать результирующего списка}

ClrScr;

Writeln;

if(key = '1') then

begin

VPointer:=ZhenihList;

Show(VPointer);

end

else

begin

VPointer:=NevestaList;

Show(VPointer);

end;

end

end

else

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor, dlya povtora nazhmite "4"');

end;

end;

Поиск элемента по соответствующему полю

Алгоритм поиска элемента по соответствующему полю:

Выбор списка для поиска.

Выбор поля для поиска.

Ввод критериев для поиска.

Поиск элемента:

продвигаемся по списку пока значение введенных критериев не будет соответствовать значению соответствующего поля звена в списке;

выводим на экран найденный элемент.

Ниже приведена процедура поиска по соответствующему полю (выбрана процедура поиска по полю “Возраст”, т.к. процедуры поиска по другим полям аналогичны) Номера 1) - 4) соответствуют номерам этапов алгоритма поиска.

{Процедура поиска по полю “Возраст”}

procedure PoiskVozrast(VPointer:PointerKandidat);

Var x,y,nom:Integer;

VzMin, VzMax:Integer;

begin

ClrScr;

nom:=1;

x:=1;

y:=8;

Writeln('Vvedite diapazon poiska:');

Write('Minimalnii vozrast:');

{3}Readln(VzMin);

Write('Maximalnii vozrast:');

Readln(VzMax);

{4}While (VPointer<>nil) do

begin

if(VPointer^.MyData.Vz >= VzMin) AND (VPointer^.MyData.Vz <= VzMax)then

begin

if(nom=1)then WriteShapka;

VPointer^.NomPP:=nom;

WriteKond(x,y,VPointer);

nom:=nom+1;

y:=y+2;

end;

VPointer:=VPointer^.SledKond;

end;

if (nom = 1) then Writeln('K sogelenij nichego ne naideno.');

end;

{Процедура поиска}

procedure Poisk;

Var key:Char;

VPointer:PointerKandidat;

begin

ClrScr;

Writeln('Dlya poiska iz spiska zhenihov nazhmite "1", nevest "2".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

key:=ReadKey;

{1}if(key = '1') OR (key = '2') then

begin

if (key = '1') then

VPointer:=ZhenihList;

if (key = '2') then

VPointer:=NevestaList;

ClrScr;

Writeln('Viberite pole dlya poiska.');

Writeln('1. Famoliya.');

Writeln('2. Vozrast.');

Writeln('3. Rost.');

Writeln('4. Ves.');

key:=ReadKey;

{ispolzuem case dlya vibora polya}

{2}case key of

'1':PoiskFamiliya(VPointer); {Поиск по полю “Фамилия”}

'2':PoiskVozrast(VPointer); {Поиск по полю “Возраст”}

'3':PoiskRost(VPointer); {Поиск по полю “Рост”}

'4':PoiskVes(VPointer); {Поиск по полю “Вес”}

else

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor, dlya povtora nazhmite "5".');

end;

end;

end

end;

Сортировка по алфавиту.

Сортировка по алфавиту осуществляется при добавлении нового элемента в список.

Запись списков в файл и загрузка списков из файла.

Для записи и загрузки списков используются типизированные файлы zhenihi.dbz, nevesti.dbn. При этом при загрузке из файла, в имеющийся список добавляются элементы из файла, а при сохранении в файл элементы которые, находились в файле, теряются.

Очистка списков.

Алгоритм очистки списков:

Выбор списка для очистки.

Очистка списка:

присваиваем временному указателю указатель на начало списка;

указателю на начало списка присваиваем значение SledKond данного звена;

уничтожаем первый элемент;

повторяем данную операцию пока не достигнем конца списка.

Ниже приведена процедура очистки списков Номера 1) - 2) соответствуют номерам этапов алгоритма очитски.

{Процедура очистки списков}

procedure Clear;

Var key:Char;

VPointer:PointerKandidat;

begin

ClrScr;

Writeln('Dlya ochistki spiska zhenihov nazhmite "1", nevest "2", oboih "3".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

Writeln('3. Oba spiska.');

key:=ReadKey;

{1} if(key = '1') OR (key = '2') OR (key = '3') then

begin

if (key = '1') OR (key = '3') then

begin

{2}While(ZhenihList<>nil)do

begin

VPointer:=ZhenihList;

ZhenihList:=ZhenihList^.SledKond;

Dispose(VPointer);

end;

ClrScr;

Writeln('Spisok zhenihov ochishen.');

end;

if (key = '2') OR (key = '3') then

begin

While(NevestaList<>nil)do

begin

VPointer:=NevestaList;

NevestaList:=NevestaList^.SledKond;

Dispose(VPointer);

end;

ClrScr;

if (key = '3') then

Writeln('Spisok zhenihov ochishen.');

Writeln('Spisok nevest ochishen.');

end;

end;

end;

3. Структура программы

Ниже представлены блок-схемы основных процедур в соответствии с ГОСТ 19.701-90:

Блок-схема процедуры вставки элемента в список:

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

Примечание: так как процедуры вставки элемента в список женихов и невест аналогичны, представлена блок-схема процедуры вставки элемента в список женихов.

Общая блок-схема программы:

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

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

Массив обеспечит выполнение операций:

- редактирования данных;

- сортировки;

- поиска,

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

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

4. Тестирование программы

Тестирование программы осуществлялось на ноутбуке с тактовой частотой процессора 1733 MHz, ОС Windows XP 3 SP.

Для тестирования выбраны два произвольных списка, список невест, список женихов по 5 человек в каждом.

Добавление кандидата:

Вывод списков на экран:

Ниже представлены результаты вывода списков на экран:

Подбор пар и вывод на экран:

Ниже представлены результаты работы процедуры подбора пар и вывода на экран:

Удаление кандидата из списка:

Удаление осуществляется в соответствии с алгоритмом удаления

Поиск кандидата по соответствующему полю:

Поиск осуществляется в соответствии с алгоритмом поиска

5. Запись в файл и загрузка из файла

Запись и загрузка списков женихов и невест осуществляется из файлов zhenihi.dbz, nevesti.zfn. При этом при загрузке из файла, в имеющийся список добавляются элементы из файла, а при сохранении в файл элементы которые, находились в файле, «теряются».

Очистка списков:

Очистка осуществляется в соответствии с алгоритмом очистки

6. Инструкция пользователю

Программа «Электронная сваха» для службы знакомств, предназначена для ведения учета, и подбора пар (мужчина + женщина) для кандидатов, изъявивших желание найти партнера.

Основные функции программы:

Ведение учета кандидатов «женихов» и «невест».

Добавление кандидатов, а также их удаление из списков.

Подбор пар для кандидатов, при этом в соответствии с критериями, предъявляемыми к партнеру, для каждого кандидата можно подобрать только одного партнера.

Поиск кандидата из списков по соответствующему критерию.

Запись списков кандидатов в файлы, а так же загрузка их из файлов.

Начало работы осуществляется с вывода главного меню на экран дисплея. Представлены следующие пункты главного меню:

1. Добавление кандидата (предназначен для добавления кандидата в список женихов либо невест).

2. Просмотр списков кандидатов (предназначен для вывода на экран списков женихов либо невест).

3. Подбор пар (предназначен для подбора пары для каждого кандидата).

4. Удаление кандидата (предназначен для удаления кандидата из списка женихов либо невест).

5. Поиск (предназначен для поиска кандидата из списка женихов или невест по заданному критерию).

6. Запись в файл (предназначен для записи в файл имеющихся списков кандидатов).

7. Загрузка из файла (предназначен для загрузки из файла списков женихов или невест).

8. Очистка списков (предназначен для очистки списков женихов или невест).

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

При вводе «1» на экран будет выведена форма для заполнения данных о кандидате и критериев предъявляемых кандидатом к будущему партнеру. Если при заполнении пункта «пол» вы указали «м» кандидат помещается в список женихов, «z» в список невест.

При вводе «2» на экран будет выведено предложение, выбрать список для просмотра (список женихов, список невест), для выбора необходимо ввести номер соответствующего списка. При вводе «1» будет выведен список женихов, «2» список невест. Если выводимый список не содержит кандидатов, будет выведено сообщение, что список пуст.

При вводе «3» будет осуществлен подбор пар для имеющихся кандидатов. На экран дисплея будет выведен список пар подходящих друг другу в соответствии с заданными критериями. Ниже будет выведен список кандидатов, для которых партнер не найден.

При вводе «4» на экран будет выведено предложение, выбрать список из которого необходимо удалить элемент (список женихов, список невест), для выбора необходимо ввести номер соответствующего списка. После чего на экран дисплея будет выведен выбранный список. Затем необходимо ввести номер кандидата, который подлежит удалению. На экран будет выведен результирующий список (без удаленного кандидата).

При вводе «5» на экран будет выведено предложение, выбрать список в котором будет осуществляться поиск (список женихов, список невест), для выбора необходимо ввести номер соответствующего списка. Затем на экран будет выведено подменю с предложением о выборе поля для поиска («фамилия», «возраст», «рост», «вес»). Для выбора необходимо ввести номер соответствующего поля. После чего необходимо ввести данные для поиска кандидатов (фамилию, критерии возраста, критерии роста, критерии веса). На экран будет выведен список кандидатов у которых соответствуют личные данные с введенными для поиска критериями.

При вводе «6» на экран будет выведено предложение, выбрать список для сохранения в файл (список женихов, список невест, оба списка), для выбора необходимо ввести номер соответствующего списка. После чего выбранный список будет сохранен, на экране появится сообщение о сохранении и имя файла.

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

При вводе «8» на экран будет выведено предложение, выбрать список для очистки (список женихов, список невест, оба списка), для выбора необходимо ввести номер соответствующего списка. После чего выбранный список будет полностью очищен от кандидатов.

Для завершения работы программы необходимо нажать «Alt-X».

Заключение

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

По итогам работы можно сделать следующие выводы:

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

Использование языка Pascal в наши дни связано с определенными проблемами (несовместимости различных сред с некоторыми ОС и друг с другом).

Литература

1. «Основы программирования» С.Окулов 2002г

2. К. Йенсен, Н.Вирт «Паскаль Руководство для пользователя»

3. С. Н. Лукин «Turbo Pascal 7.0. Самоучитель для начинающих»

4. Никита Культин «Программирование в Turbo Pascal 7.0 и Delphi»

5. Ю. Л. Кетков, А. Ю. Кетков «Свободное программное обеспечение. FREE PASCAL для студентов и школьников»

6. Культин Н. Основы программирования в Delphi 7

Приложение 1

Листинг программы

program KRES;

Uses CRT, graph; {подключаем модуль CRT для работы с экраном, и граф для работы с графикой}

Type

PointerKandidat=^ZAP;

ZAP = Record {Запись для формирования списков женихов и невест}

NomPP:Integer; {Номер по порядку}

FirstName:String[15]; {Фамилия}

Name:String[15]; {Имя}

Pol:Char; {Пол}

FlagVib: Boolean; {Признак, что кандидат выбран}

MyData:record {Запись о данных кандидата}

Vz,Rst,Vs:Integer; {Возраст, рост, вес}

end;

Critery:record {Запись - требования к партнеру}

VzMin,VzMax:Integer;

RstMin,RstMax:Integer;

VsMin,VsMax:Integer;

end;

PredKond,SledKond:PointerKandidat; {Указатели на пердыдущий и следующий эл.}

end;

Var

ZhenihList,NevestaList:PointerKandidat; {Указатели на первые элементы списков}

{Процедура заполнения формы кандидата}

procedure FormKondidat(x,y:Integer;PKond:PointerKandidat);

Var x1,y1:integer;

begin

x1:=x;

y1:=y;

{Выводим построчно форму для заполнения}

GotoXY(x1,y1);

Write('---Dannie o kondidate---');

Inc(y1);

GotoXY(x1,y1);

Write('Pol (m - muzh, z - zhen):');

Inc(y1);

GotoXY(x1,y1);

Write('Familiya :');

Inc(y1);

GotoXY(x1,y1);

Write('Imya :');

Inc(y1);

GotoXY(x1,y1);

Write('Vozrast :');

Inc(y1);

GotoXY(x1,y1);

Write('Rost :');

Inc(y1);

GotoXY(x1,y1);

Write('Ves :');

{Напротив каждой строки формы считываем значения}

y:=y+1;

x:=x+25;

repeat {Цикл ввод пола}

GotoXY(x,y);

ClrEol; {Очистка строки от позиции курсора}

Readln(PKond^.pol);

if (PKond^.pol<>'m') AND (PKond^.pol<>'z') then

begin

GotoXY(x,y);

Write('Nevernoe znachenie! Press anykey.');

ReadKey;

end;

Until (PKond^.pol='m') OR (PKond^.pol='z');

Inc(y);

GotoXY(x,y);

Readln(PKond^.FirstName);

Inc(y);

GotoXY(x,y);

Readln(PKond^.Name);

Inc(y);

GotoXY(x,y);

Readln(PKond^.MyData.Vz);

Inc(y);

GotoXY(x,y);

Readln(PKond^.MyData.Rst);

Inc(y);

GotoXY(x,y);

Readln(PKond^.MyData.Vs);

Inc(y);

{Продолжение заполнения формы}

Inc(y1);

Inc(y1);

GotoXY(x1,y1);

Write('Dlya prodolgeniya nazhmite lubuj klavishu.');

GotoXY(x1,y1);

ReadKey;

ClrEol;{Очистка строки от позиции курсора}

Inc(y1);

GotoXY(x1,y1);

{Вывод формы для заполнения требований к партнеру}

Write('-Trebovaniya k partneru-');

Inc(y1);

GotoXY(x1,y1);

Write('Minimalnij vozrast :');

Inc(y1);

GotoXY(x1,y1);

Write('Maximalnij vozrast :');

Inc(y1);

GotoXY(x1,y1);

Write('Minimalnij rost :');

Inc(y1);

GotoXY(x1,y1);

Write('Maximalnij rost :');

Inc(y1);

GotoXY(x1,y1);

Write('Minimalnij ves :');

Inc(y1);

GotoXY(x1,y1);

Write('Maximalnij ves :');

{Считываем требования к партнеру}

y:=y+3;

GotoXY(x,y);

Readln(PKond^.Critery.VzMin);

Inc(y);

GotoXY(x,y);

Readln(PKond^.Critery.VzMax);

Inc(y);

GotoXY(x,y);

Readln(PKond^.Critery.RstMin);

Inc(y);

GotoXY(x,y);

Readln(PKond^.Critery.RstMax);

Inc(y);

GotoXY(x,y);

Readln(PKond^.Critery.VsMin);

Inc(y);

GotoXY(x,y);

Readln(PKond^.Critery.VsMax);

Inc(y);

end;

{Процедура добовления элемента в список женихов}

procedure IncludeZhenih(PZhenih:PointerKandidat);

Var VPointer:PointerKandidat;

begin

if ZhenihList=nil then ZhenihList:=PZhenih {Если список женихов пустой}

else

begin

VPointer:=ZhenihList;

{Добовление осуществляем по значению поля "Фамилия"}

{Продвигаемся вперд пока значение фамилии доб. эл. больше}

While(VPointer^.FirstName<PZHenih^.FirstName) AND (VPointer^.SledKond<>nil) do

VPointer:=VPointer^.SledKond;

{Если вставляем на первое место}

if(VPointer^.PredKond=nil) AND (VPointer^.FirstName>=PZhenih^.FirstName) then

begin

PZhenih^.SledKond:=VPointer;

VPointer^.PredKond:=PZhenih;

ZhenihList:=PZhenih;

end

else

{Если вставляем в конец списка}

if(VPointer^.SledKond=nil) AND (VPointer^.FirstName<=PZhenih^.FirstName) then

begin

PZhenih^.PredKond:=VPointer;

VPointer^.SledKond:=PZhenih;

end

else

{Если вставляем в середину списка}

begin

PZhenih^.SledKond:=VPointer;

VPointer^.PredKond^.SledKond:=PZhenih;

PZhenih^.PredKond:=VPointer^.PredKond;

VPointer^.PredKond:=PZhenih;

end

end;

Writeln('--Zhenih dobavlen--');

end;

{Процедура добовления элемента в список невест}

procedure IncludeNevesta(PNevesta:PointerKandidat);

Var VPointer:PointerKandidat;

begin

if NevestaList=nil then NevestaList:=PNevesta {Если список женихов пустой}

else

begin

VPointer:=NevestaList;

{Добовление осуществляем по значению поля "Фамилия"}

{Продвигаемся вперд пока значение фамилии доб. эл. больше}

While(VPointer^.FirstName<=PNevesta^.FirstName) AND (VPointer^.SledKond<>nil) do

VPointer:=VPointer^.SledKond;

{Если вставляем на первое место}

if(VPointer^.PredKond=nil) AND (VPointer^.FirstName>=PNevesta^.FirstName) then

begin

PNevesta^.SledKond:=VPointer;

VPointer^.PredKond:=PNevesta;

NevestaList:=PNevesta;

end

else

{Если вставляем в конец списка}

if(VPointer^.SledKond=nil) AND (VPointer^.FirstName<PNevesta^.FirstName) then

begin

PNevesta^.PredKond:=VPointer;

VPointer^.SledKond:=PNevesta;

end

else

{Если вставляем в середину списка}

begin

PNevesta^.SledKond:=VPointer;

VPointer^.PredKond^.SledKond:=PNevesta;

PNevesta^.PredKond:=VPointer^.PredKond;

VPointer^.PredKond:=PNevesta;

end

end;

Writeln('--Nevesta dobavlena--');

end;

{Процедура добавления кандидата}

procedure AddKondidat;

Var PKond:PointerKandidat;

begin

ClrScr;

Writeln('Dobovlenie kondidata.');

new(PKond);{Выделяем помять под новый элемент}

FormKondidat(1,2,PKond); {Вызываем процедуру заполнения формы кандидата}

PKond^.PredKond:=nil;

PKond^.SledKond:=nil;

{По значению поля "пол" выбираем процедуру вствки в соответсвующий список}

if (PKond^.pol='m') then IncludeZhenih(PKond)

else IncludeNevesta(PKond);

Writeln('Dlya dobavleniya ocherednogo elementa nagmite "1",');

Write('dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура вывод на экран информации о кандидате}

procedure WriteKond(x,y:Integer; PKond:PointerKandidat);

begin

with PKond^do

begin

GotoXY(x,y);

Write('|',NomPP);

GotoXY(x+4,y);

Write('|',FirstName);

GotoXY(x+19,y);

Write('|',Name);

GotoXY(x+34,y);

Write('|',MyData.Vz);

Write('(',Critery.VzMin,'/',Critery.VzMax,')');

GotoXY(x+47,y);

Write('|',MyData.Rst);

Write('(',Critery.RstMin,'/',Critery.RstMax,')');

GotoXY(x+60,y);

Write('|',MyData.Vs);

Write('(',Critery.VsMin,'/',Critery.VsMax,')');

GotoXY(x+73,y);

Writeln('|');

Writeln('--------------------------------------------------------------------------');

end;

end;

procedure WriteShapka;

begin

Writeln('--------------------------------------------------------------------------');

Writeln('| N | Familiya | Imya | Vozrast | Rost | Ves |');

Writeln('|p/p| | | | sm | kg |');

Writeln('--------------------------------------------------------------------------');

end;

{Процедура вывода списка на экран}

procedure Show(PList:PointerKandidat);

Var x,y,nom:Integer;

begin

if(PList=nil)then Writeln('Spisok pust!')

else

begin

x:=1;{Задаем координаты для установки курсора}

y:=6;

nom:=1;{Присваеваем начальное значение переменной для получения порядкового номера}

WriteShapka;

{Цикл вывода списка}

repeat

PList^.NomPP:=nom;

WriteKond(x,y,PList);

PList:=PList^.SledKond;

y:=y+2;

x:=1;

if ((nom mod 10) = 0) then

begin

Write('Dlya prodolzheniya nazhmite lubuj klavishu:');

ReadKey;

ClrScr;

WriteShapka;

x:=1;

y:=6;

end;

nom:=nom+1;

until PList=nil;

end;

end;

{Процедура просмотра списков}

procedure ShowList;

Var VPointer:PointerKandidat;

key:char;

begin

ClrScr;

Writeln('Viberite spisok dlya prosmotra.');

Writeln('1. Spisok zhenihov.');

Writeln('2. Spisok nevest.');

key:=ReadKey;

if (key='1') then {Выбор списка для просмотра}

begin

ClrScr;

Writeln('Zenihi');

VPointer:=ZhenihList;

Show(VPointer);

end;

if (key='2') then

begin

ClrScr;

Writeln('Nevesti');

VPointer:=NevestaList;

Show(VPointer);

end;

if (key<>'1') AND (key<>'2') then

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor! Dlya povtora nazhmite "1".');

end;

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура вывода на экран пар}

procedure VivodPar(x,y,counter:Byte;PZhenih,PNevesta:PointerKandidat);

begin

if (counter=1) OR (((counter-1) mod 10) = 0)then

begin

ClrScr;

Writeln('------------------------------------------------------------------------');

Writeln('| | |_Critery(Trebovaniya k partnery)__|');

Writeln('| N | Para | Vozrast | Rost(sm) | Ves (kg) |');

Writeln('|p/p| |(min/max)| (min/max) | (min/max) |');

Writeln('------------------------------------------------------------------------');

end;

{Вывод жениха}

GotoXY(x,y);

Write('|',counter);

GotoXY(x+4,y);

Write('|Zhenih: ',PZhenih^.FirstName,' ',PZhenih^.Name[1],'.');

GotoXY(x+36,y);

Write('|',PZhenih^.MyData.Vz);

{kriterii}

GotoXY(x+39,y);

Write('(',PZhenih^.Critery.VzMin,'/',PZhenih^.Critery.VzMax,')');

GotoXY(x+46,y);

Write('|',PZhenih^.MyData.Rst);

{kriterii}

GotoXY(x+50,y);

Write('(',PZhenih^.Critery.RstMin,'/',PZhenih^.Critery.RstMax,')');

GotoXY(x+59,y);

Write('|',PZhenih^.MyData.Vs);

{kriterii}

GotoXY(x+62,y);

Write('(',PZhenih^.Critery.VsMin,'/',PZhenih^.Critery.VsMax,')');

GotoXY(x+71,y);

Write('|');

{Вывод невесты}

Inc(y);

GotoXY(x,y);

Write('|');

GotoXY(x+4,y);

Write('|Nevesta: ',PNevesta^.FirstName,' ',PNevesta^.Name[1],'.');

GotoXY(x+36,y);

Write('|',PNevesta^.MyData.Vz);

{kritery}

GotoXY(x+39,y);

Write('(',PNevesta^.Critery.VzMin,'/',PNevesta^.Critery.VzMax,')');

GotoXY(x+46,y);

Write('|',PNevesta^.MyData.Rst);

{kriyery}

GotoXY(x+50,y);

Write('(',PNevesta^.Critery.RstMin,'/',PNevesta^.Critery.RstMax,')');

GotoXY(x+59,y);

Write('|',PNevesta^.MyData.Vs);

{kritery}

GotoXY(x+62,y);

Write('(',PNevesta^.Critery.VsMin,'/',PNevesta^.Critery.VsMax,')');

GotoXY(x+71,y);

Writeln('|');

Writeln('------------------------------------------------------------------------');

end;

{Процедура подбора пар}

procedure PodborPar;

Var ZhenPointer,NevPointer:PointerKandidat;

x,y,counter:Byte; {Координаты и переменная для подсчета пар}

begin

ZhenPointer:=ZhenihList;

NevPointer:=NevestaList;

counter:=1;

x:=1;

y:=6;

{Присваеваем false переменным признака выбора кандидата}

While (ZhenPointer<>nil) do

begin

ZhenPointer^.FlagVib:=false;

ZhenPointer:=ZhenPointer^.SledKond

end;

While (NevPointer<>nil) do

begin

NevPointer^.FlagVib:=false;

NevPointer:=NevPointer^.SledKond

end;

ZhenPointer:=ZhenihList;

{Цикл подбора пар. Для каждого элемента из списка женихов происходит подбор элемента из списка невест (продвигаясь по списку невест). При этом элемент считается подходящим, если критерии предъявляемые к партнеру соответствуют, личным данным (MyData) элемента из списка невест, а так же критерии элемента из списка невест, предъявляемые к партнеру, соответствуют личным данным элемента из списка женихов для которого осуществляется подбор. Признаки выбора обоих элементов должны быть установлены в false}

While (ZhenPointer<>nil) do

begin

NevPointer:=NevestaList;

While ((NevPointer<>nil) AND

( ( ( ( (ZhenPointer^.Critery.VzMin>NevPointer^.MyData.Vz) OR

(ZhenPointer^.Critery.VzMax<NevPointer^.MyData.Vz) ) OR

( (ZhenPointer^.Critery.RstMin>NevPointer^.MyData.Rst) OR

(ZhenPointer^.Critery.RstMax<NevPointer^.MyData.Rst) ) OR

( (ZhenPointer^.Critery.VsMin>NevPointer^.MyData.Vs) OR

(ZhenPointer^.Critery.VsMax<NevPointer^.MyData.Vs) ) ) OR

( ( (NevPointer^.Critery.VzMin>ZhenPointer^.MyData.Vz) OR

(NevPointer^.Critery.VzMax<ZhenPointer^.MyData.Vz) ) OR

( (NevPointer^.Critery.RstMin>ZhenPointer^.MyData.Rst) OR

(NevPointer^.Critery.RstMax<ZhenPointer^.MyData.Rst) ) OR

( (NevPointer^.Critery.VsMin>ZhenPointer^.MyData.Vs) OR

(NevPointer^.Critery.VsMax<ZhenPointer^.MyData.Vs) ) ) ) OR

( (NevPointer^.FlagVib = true) OR (ZhenPointer^.FlagVib = true) ) ) )

do NevPointer:=NevPointer^.SledKond;

if (NevPointer<>nil) then

begin

NevPointer^.FlagVib:= true; {Установка признаков выбора элемента}

ZhenPointer^.FlagVib:= true;

VivodPar(x,y,counter,ZhenPointer,NevPointer); {Вызов процедуры печати пар}

y:=y+3;

if (counter mod 10) = 0 then

begin

Write('Dlya prodolzheniya nazhmite lubuj klavishu:');

ReadKey;

ClrScr;

x:=1;

y:=6;

end;

counter:=counter+1;

end;

ZhenPointer:=ZhenPointer^.SledKond;

end;

if counter=1 then ClrScr

{Вывод на экран женихов и невест без пары}

else

begin

Write('Dlya prodolzheniya nazhmite vvod:');

ReadKey;

ClrScr;

ZhenPointer:=ZhenihList;

NevPointer:=NevestaList;

{raspechatka zhenihov}

Writeln('Zhenihi bez pari');

Writeln;

While (ZhenPointer<>nil)do

begin

if (ZhenPointer^.FlagVib=false) then

Writeln(ZhenPointer^.FirstName,' ',ZhenPointer^.Name[1],'.');

ZhenPointer:=ZhenPointer^.SledKond;

end;

{raspechatka nevest}

Writeln;

Writeln('Nevesti bez pari');

Writeln;

While (NevPointer<>nil)do

begin

if (NevPointer^.FlagVib=false) then

Writeln(NevPointer^.FirstName,' ',NevPointer^.Name[1],'.');

NevPointer:=NevPointer^.SledKond;

end;

Writeln;

end;

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура записи в файл}

procedure Save;

Var f:file of ZAP; {Задаем типизированную файловую переменную}

key:Char;

VPointer:PointerKandidat;

begin

ClrScr;

Writeln('Dlya sohraneniya zhenihov nazhmite "1", nevest "2".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

Writeln('3. Oba spiska.');

key:=ReadKey; {Выбираем список для сохранения}

if(key = '1') OR (key = '2') OR (key= '3') then

begin

if(key = '1') OR (key = '3') then

begin

Assign(f,'zhenihi.dbz'); {Связываем переменную с файлом}

Rewrite(f);{Создаем и открываем файл}

VPointer:=ZhenihList;

While(VPointer<>nil)do

begin

Write(f,VPointer^); {Записываем женихов в файл}

VPointer:=Vpointer^.SledKond;

end;

Close(f);

ClrScr;

Writeln('Spisok zhenihov sohranen v faile "zhenihi.dbz"');

end;

if(key = '2') OR (key = '3') then

begin

Assign(f,'nevesti.zfn'); {Связываем переменную с файлом}

Rewrite(f);{Создаем и открываем файл}

VPointer:=NevestaList;

While(VPointer<>nil)do

begin

Write(f,VPointer^); {Записываем невест в файл}

VPointer:=Vpointer^.SledKond;

end;

Close(f);

ClrScr;

if (key = '3') then

Writeln('Spisok zhenihov sohranen v faile "zhenihi.dbz"');

Writeln('Spisok nevest sohranen v faile "nevesti.zfn"');

end;

end

else

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor, dlya povtora nazhmite "F2"');

end;

end;

{Процедура загрузки из файла}

procedure Load;

Var f:file of ZAP;

key:Char;

VPointer:PointerKandidat;

begin

ClrScr;

Writeln('Dlya zagruzki zhenihov nazhmite "1", nevest "2".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

Writeln('3. Oba spiska.');

key:=ReadKey;

if(key = '1') OR (key = '2') OR (key= '3') then {Выбираем файл для загрузки}

begin

if(key = '1') OR (key = '3') then

begin

Assign(f,'zhenihi.dbz'); {Связываем переменную с файлом}

Reset(f); {Открываем файл}

While (not eof(f)) do

begin

New(VPointer);

Read(f,VPointer^); {Считываем элемент}

VPointer^.PredKond:=nil;

VPointer^.SledKond:=nil;

if (ZhenihList = nil) then ZhenihList:=VPointer

else IncludeZhenih(VPointer);

end;

Close(f);

ClrScr;

Writeln('Spisok zhenihov zagruzhen iz faila "zhenihi.dbz"');

end;

if(key = '2') OR (key = '3') then

begin

Assign(f,'nevesti.zfn'); {Связываем переменную с файлом}

Reset(f);{Открываем файл}

While (not eof(f)) do

begin

New(VPointer);

Read(f,VPointer^);{Считываем элемент}

VPointer^.PredKond:=nil;

VPointer^.SledKond:=nil;

if (NevestaList = nil) then NevestaList:=VPointer

else IncludeNevesta(VPointer);

end;

Close(f);

ClrScr;

if (key = '3') then

Writeln('Spisok zhenihov zagruzhen iz faila "zhenihi.dbz"');

Writeln('Spisok nevest zagruzhen iz faila "nevesti.zfn"');

end;

end

else

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor, dlya povtora nazhmite "F2"');

end;

ReadKey;

end;

{Процедура удаления}

procedure RemoveKand;

Var key:Char;

nom:Integer;{Переменная для хранения порядкового номера}

VPointer,VProm:PointerKandidat;

begin

ClrScr;

Writeln('Dlya udaleniya kandidata iz spiska zhenihov nazhmite "1", nevest "2".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

key:=ReadKey;

if(key = '1') OR (key = '2') then {Выбираем список для удаления элемента}

begin

if (key = '1') then

VPointer:=ZhenihList;

if (key = '2') then

VPointer:=NevestaList;

ClrScr;

Writeln;

Show(VPointer);

Write('Dlya udaleniya vvedite poryadkovii nomer udalyaemogo elementa:');

Readln(nom);{Считываем порядковый номер удалемого элемента}

{Переходим до введенного номера}

While (VPointer^.NomPP < nom)AND(VPointer^.SledKond<>nil) do

VPointer:=VPointer^.SledKond;

{Удаляем элемент}

if(VPointer^.NomPP = nom) then

begin

if(nom = 1) then {Если элемент первый в списке}

begin

VPointer^.SledKond^.PredKond:=nil;

if(key = '1') then

ZhenihList := VPointer^.SledKond

else

NevestaList := VPointer^.SledKond;

Dispose(VPointer);

end

else

begin {Если элемент в середине или в конце}

VPointer^.SledKond^.PredKond:=VPointer^.PredKond;

VPointer^.PredKond^.SledKond:=VPointer^.SledKond;

Dispose(VPointer);

end;

{Печатаем полученный список}

ClrScr;

Writeln;

if(key = '1') then

begin

VPointer:=ZhenihList;

Show(VPointer);

end

else

begin

VPointer:=NevestaList;

Show(VPointer);

end;

end

end

else

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor, dlya povtora nazhmite "4"');

end;

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура поиска по полю "Вес"}

procedure PoiskVes(VPointer:PointerKandidat);

Var x,y,nom:Integer;

VsMin, VsMax:Integer; {Переменные для хранения критериев поиска}

begin

ClrScr;

nom:=1;

x:=1;

y:=8;

{Считываем критерии поиска}

Writeln('Vvedite diapazon poiska:');

Write('Minimalnii ves:');

Readln(VsMin);

Write('Maximalnii ves:');

Readln(VsMax);

While (VPointer<>nil) do {Двигаемся по списку пока критерии не совпадут}

begin

{Если критерии совпали выводим найденный элемент на экран}

if(VPointer^.MyData.Vs >= VsMin) AND (VPointer^.MyData.Vs <= VsMax) then

begin

if(nom=1)then WriteShapka;

VPointer^.NomPP:=nom;

WriteKond(x,y,VPointer);

nom:=nom+1;

y:=y+2;

end;

VPointer:=VPointer^.SledKond;

end;

if (nom = 1) then Writeln('K sogelenij nichego ne naideno.');

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура поиска по полю "рост"}

procedure PoiskRost(VPointer:PointerKandidat);

Var x,y,nom:Integer;

RstMin, RstMax:Integer;

begin

ClrScr;

nom:=1;

x:=1;

y:=8;

Writeln('Vvedite diapazon poiska:');

Write('Minimalnii rost:');

Readln(RstMin);

Write('Maximalnii rost:');

Readln(RstMax);

While (VPointer<>nil) do

begin

if(VPointer^.MyData.Rst >= RstMin) AND (VPointer^.MyData.Vz <= RstMax)then

begin

if(nom=1)then WriteShapka;

VPointer^.NomPP:=nom;

WriteKond(x,y,VPointer);

nom:=nom+1;

y:=y+2;

end;

VPointer:=VPointer^.SledKond;

end;

if (nom = 1) then Writeln('K sogelenij nichego ne naideno.');

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура поиска по полю "возраст"}

procedure PoiskVozrast(VPointer:PointerKandidat);

Var x,y,nom:Integer;

VzMin, VzMax:Integer;

begin

ClrScr;

nom:=1;

x:=1;

y:=8;

Writeln('Vvedite diapazon poiska:');

Write('Minimalnii vozrast:');

Readln(VzMin);

Write('Maximalnii vozrast:');

Readln(VzMax);

While (VPointer<>nil) do

begin

if(VPointer^.MyData.Vz >= VzMin) AND (VPointer^.MyData.Vz <= VzMax)then

begin

if(nom=1)then WriteShapka;

VPointer^.NomPP:=nom;

WriteKond(x,y,VPointer);

nom:=nom+1;

y:=y+2;

end;

VPointer:=VPointer^.SledKond;

end;

if (nom = 1) then Writeln('K sogelenij nichego ne naideno.');

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура поиска по полю "Фамилия"}

procedure PoiskFamiliya(VPointer:PointerKandidat);

Var x,y,nom:Integer;

familiya:String[15];

begin

ClrScr;

nom:=1;

x:=1;

y:=6;

Write('Vvedite familij:');

Readln(familiya);

While (VPointer<>nil) do

begin

if(VPointer^.FirstName=familiya)then

begin

if(nom=1)then WriteShapka;

VPointer^.NomPP:=nom;

WriteKond(x,y,VPointer);

nom:=nom+1;

y:=y+2;

end;

VPointer:=VPointer^.SledKond;

end;

if (nom = 1) then Writeln('K sogelenij nichego ne naideno.');

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

{Процедура поиска}

procedure Poisk;

Var key:Char;

VPointer:PointerKandidat;

begin

ClrScr;

Writeln('Dlya poiska iz spiska zhenihov nazhmite "1", nevest "2".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

key:=ReadKey;

{Выбираем список для поиска}

if(key = '1') OR (key = '2') then

begin

if (key = '1') then

VPointer:=ZhenihList;

if (key = '2') then

VPointer:=NevestaList;

ClrScr;

Writeln('Viberite pole dlya poiska.');

Writeln('1. Famoliya.');

Writeln('2. Vozrast.');

Writeln('3. Rost.');

Writeln('4. Ves.');

key:=ReadKey;

{Выбираем поле для поиска}

case key of

'1':PoiskFamiliya(VPointer);

'2':PoiskVozrast(VPointer);

'3':PoiskRost(VPointer);

'4':PoiskVes(VPointer);

else

begin

ClrScr;

Writeln('Vi sdelali ne pravilnii vibor, dlya povtora nazhmite "5".');

end;

end; {konec case}

end

end;

{Процедура очистки списков}

procedure Clear;

Var key:Char;

VPointer:PointerKandidat;

begin

ClrScr;

Writeln('Dlya ochistki spiska zhenihov nazhmite "1", nevest "2", oboih "3".');

Writeln('1. Zhenihi.');

Writeln('2. Nevesti.');

Writeln('3. Oba spiska.');

key:=ReadKey;

{Выбираем список для очистки}

if(key = '1') OR (key = '2') OR (key = '3') then

begin

if (key = '1') OR (key = '3') then

begin

While(ZhenihList<>nil)do {Удалем последовательно один за другим эл. в списке}

begin

VPointer:=ZhenihList;

ZhenihList:=ZhenihList^.SledKond;

Dispose(VPointer);

end;

ClrScr;

Writeln('Spisok zhenihov ochishen.');

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

if (key = '2') OR (key = '3') then

begin

While(NevestaList<>nil)do

begin

VPointer:=NevestaList;

NevestaList:=NevestaList^.SledKond;

Dispose(VPointer);

end;

ClrScr;

if (key = '3') then

Writeln('Spisok zhenihov ochishen.');

Writeln('Spisok nevest ochishen.');

Write('Dlya vihoda v glavnoe menu nazhmite vvod:');

end;

end;

end;

{Процедура анализа нажатой клавиши}

procedure StartWork;

var key:char;

spec,stop:boolean;

begin

repeat

stop:=false;

key:=ReadKey;

case key of

chr(0):spec:=true;{Определяем специальную клавишу}

chr(45):begin if(spec=true) then stop:=true end;{Alt-X - выход}

'1':begin if (spec=false) then AddKondidat; end; {Вызов процедуры добавления кандидатов}

'2':begin if (spec=false) then RemoveKand; end; {Вызов процедуры удаления кандидатов}

'3':begin if (spec=false) then ShowList; end; {Вызов процедуры просмотра списков}

'4':begin if (spec=false) then Clear; end; {Вызов процедуры очистки списков}

'5':begin if (spec=false) then PodborPar; end; {Вызов процедуры подбора пар}

'6':begin if (spec=false) then Poisk; end; {Вызов процедуры поиска}

'7':begin if (spec=false) then Save; end; {Вызов процедуры записи в файл}

'8':begin if (spec=false) then Load; end; {Вызов процедуры загрузки из файла}

else

begin

spec:=false;

ClrScr;

Write('Dlya vibora punkta menu vvedite ego nomer:');

end;

end;{end case}

until (stop=true); {Условие выхода из цикла}

end;

{Процедура графики}

procedure graf;

var gdriver, {переменная определяющая тип драйвера}

gmode {переменная задающая режим работы графического драйвера}

: integer;

begin

ClrScr;

gdriver :=detect; {автоопределение драйвера}

initgraph(gdriver, gmode,''); {инициализация графического режима}

{ Writeln('x=',getmaxx(),'y=',getmaxy())};

setcolor(6);

SetFillStyle(11,15); {задаем параметры графического изображения}

FloodFill(271,350,7);

Circle(420,350,80);

Circle(420,350,70);

SetFillStyle(11,14);

FloodFill(499,350,6);

Circle(300,350,80);

Circle(300,350,70);

SetFillStyle(11,14);

FloodFill(221,350,6);

SetFillStyle(11,14);

FloodFi...


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

  • Математическая постановка задачи для алгоритмизации, рекуррентная зависимость. Алгоритм решения задачи, блок-схема программы. Тестовые данные для тестирования программы. Результаты, соответствующие для первых вводимых данных и листинг программы.

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

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

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

  • Разработана программа решения двух задач на языке программирования Turbo Pascal. Спецификация задания. Описание входных и выходных данных. Математическая постановка задачи. Алгоритм ее решения. Описание и блок-схема программы. Результаты тестирования.

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

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

    реферат [63,5 K], добавлен 24.05.2013

  • Методы обработки информации при решении прикладных задач. Математическая модель задачи. Блок-схема алгоритма программы. Компоненты, которые используются для работы в программе: элементы интерфейса; процедуры; операторы. Текст программы с пояснениями.

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

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

    курсовая работа [1,7 M], добавлен 15.04.2015

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

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

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

    курсовая работа [506,5 K], добавлен 21.02.2011

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

    контрольная работа [111,1 K], добавлен 27.08.2012

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

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

  • Написание программы на языке Delphi - создание электронной записной книжки. Описание типов "запись", полей и массива, составление процедур. Создание приветствия и редактирование записи. Создание команды для вызова справки. Принцип работы программы.

    контрольная работа [17,9 K], добавлен 23.09.2010

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

    курсовая работа [175,9 K], добавлен 10.05.2010

  • Исторические предпосылки разработки тестирования. Виды электронных тестов и их роль в программировании. Этапы разработки программы для решения задачи быстрой сортировки. Пользовательский интерфейс, отладка, алгоритм программы. Файл теста в формате XML.

    курсовая работа [1,5 M], добавлен 27.01.2014

  • Обеспечение универсальности функций тестирования при разработке программы для тестирования студентов. Бесплатное программное обеспечение. Анализ выбора среды программирования. Особенности среды Delphi и СУБД MySQL. Описание алгоритма и блок-схемы.

    курсовая работа [1,6 M], добавлен 01.02.2013

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

    курсовая работа [1,4 M], добавлен 16.03.2012

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

    реферат [281,3 K], добавлен 17.10.2013

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

    курсовая работа [687,2 K], добавлен 03.10.2013

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

    курсовая работа [22,9 K], добавлен 19.10.2010

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

    курсовая работа [721,4 K], добавлен 10.11.2010

  • Блок-схема модулей программы. Главная цель бизнеса ООО "Регион". Протокол тестирования продукта. Руководство пользователя программы. Расчет цены предложения и минимального количества копий тиражирования. Образец отчета "Книга продаж", листинг программы.

    дипломная работа [1,0 M], добавлен 18.09.2014

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