Заключение.
Программа "электронная сваха" для службы знакомств
Uses CRT, graph; {подключаем модуль CRT для работы с экраном, и граф для работы с графикой}. Nom:=1;{Присваеваем начальное значение переменной для получения порядкового номера}. По значению поля «пол» выбираем процедуру вствки в соответсвующий список}. Writeln ('—————————————————————————————————————'); Writeln ('—————————————————————————————————————'); Writeln… Читать ещё >
Заключение. Программа "электронная сваха" для службы знакомств (реферат, курсовая, диплом, контрольная)
В процессе разработки данного программного обеспечения были получены навыки по работе с динамическими списками.
По итогам работы можно сделать следующие выводы:
При необходимости выделения и уничтожения ячеек памяти под данные в процессе выполнения программы целесообразно использование динамических списков.
Использование языка 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.
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^.SledKondnil) 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.
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 (ZhenPointernil) do.
begin.
ZhenPointer^.FlagVib:=false;
ZhenPointer:=ZhenPointer^.SledKond.
end;
While (NevPointernil) do.
begin.
NevPointer^.FlagVib:=false;
NevPointer:=NevPointer^.SledKond.
end;
ZhenPointer:=ZhenihList;
{Цикл подбора пар. Для каждого элемента из списка женихов происходит подбор элемента из списка невест (продвигаясь по списку невест). При этом элемент считается подходящим, если критерии предъявляемые к партнеру соответствуют, личным данным (MyData) элемента из списка невест, а так же критерии элемента из списка невест, предъявляемые к партнеру, соответствуют личным данным элемента из списка женихов для которого осуществляется подбор. Признаки выбора обоих элементов должны быть установлены в false}.
While (ZhenPointernil) do.
begin.
NevPointer:=NevestaList;
While ((NevPointernil) AND.
- (((((ZhenPointer^.Critery.VzMin>NevPointer^.MyData.Vz) OR
- (ZhenPointer^.Critery.VzMax
- ((ZhenPointer^.Critery.RstMin>NevPointer^.MyData.Rst) OR
- (ZhenPointer^.Critery.RstMax
- ((ZhenPointer^.Critery.VsMin>NevPointer^.MyData.Vs) OR
- (ZhenPointer^.Critery.VsMax
- (((NevPointer^.Critery.VzMin>ZhenPointer^.MyData.Vz) OR
- (NevPointer^.Critery.VzMax
- ((NevPointer^.Critery.RstMin>ZhenPointer^.MyData.Rst) OR
- (NevPointer^.Critery.RstMax
- ((NevPointer^.Critery.VsMin>ZhenPointer^.MyData.Vs) OR
- (NevPointer^.Critery.VsMax
- ((NevPointer^.FlagVib = true) OR (ZhenPointer^.FlagVib = true))))
do NevPointer:=NevPointer^.SledKond;
if (NevPointernil) 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 (ZhenPointernil)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…
begin.
ClrScr;
TextBackground (1);
{Window (1,1,80,2); {Задаем текстовое поле для вывода меню}.
ClrScr;
{Write ('F1 — Help; Alt+X — vihod iz programmi.');
TextBackground (1);}.
Window (1,1,80,5); {Задаем текстовое поле для вывода меню }.
ClrScr;
Writeln ('1. Dobavlenie novogo kandidata. 2. Udalenie kandidata.');
Writeln ('3. Prosmotr spiskov kandidatov. 4. Ochistka spiskov.');
Writeln ('5. Podbor par. 6. Poisk.');
Writeln ('7. Zapis v fail. 8. Zagruzka iz faila.');
TextBackground (3);
Window (1,5,80,50);{Задаем размеры окна}.
ClrScr;
Window (1,5,79,49);{Область вывода текста}.
Write ('Dlya nachala raboty nazhmite vvod, dlya zaversheniya Alt-X:');
end;
{Main procedure}.
Begin.
TextMode (3+256);
ClrScr;
graf; {Вызов Процедуры графики}.
MainMenu; {Вызов процедуры главного меню}.
StartWork;{Вызов процедуры анализа нажатой клавиши}.
End.