- •Міністерство освіти і науки, молоді та спорту України
- •1. Щоденник проходження практики
- •2. Аналіз завдання та початкових умов
- •2.1. Постановка задачі
- •2.2. Призначення програми
- •2.3. Вимоги до програми
- •Математична модель рішення задачі
- •Модульна структура програми
- •Специфікація програми
- •Структура інтерфейсу користувача
- •Інструкція користувача
- •Контрольні приклади
- •Код програмних модулів
- •Список літератури
Структура інтерфейсу користувача
Поля вводу даних
Мал.3
Інструкція користувача
Дана програма призначена для автоматичного пошуку найкоротшого шляху між населеними пунктами. Програма коректно працюватиме, коли будуть введені точки (назви населених пунктів), між якими необхідно знайти відстань. Якщо ж клацнути по кнопці “Пошук” не ввівши даних, то програма видасть повідомлення про необхідність введення даних.
Щоб запустити програму, необхідно двічі клацнути лівою кнопкою миші по файлу Page_Add.exe. Після завантаження програми на екрані зявиться головна форма програми. Після вводу початкової і кінцевої точок пошуку потрібно клацнути по кнопці “Пошук” або ж вибрати аналогічний пункт у меню “Файл”. Після цього на екран буде виведено всі маршрути та їхні довжини. Найкоротший маршрут буде виведений самим останнім.
Якщо вам потрібно ввести інші дані на карту доріг, то клацніть по кнопці “Очистка” або виберіть аналогічний пункт у меню “Файл” головного меню.
Щоб вийти з програми необхідно клацнути по кнопці “Вихід”, вибрати відповідний пункт у меню “Файл” головного меню або клацнути по хрестику у правому верхньому кутку форми.
Якщо дізнатись дещо про програму та ї призначення зазирніть до меню “Довідка” головного меню.
Для нормальної роботи програми необхідно дотримуватись таких вимог: операційна система Windows 95, об’єм оперативної пам’яті 8 Мбайт, вільного місця на диску 420 Кбайт.
Контрольні приклади
Програма видасть повідомлення про помилку лише у тому випадку, коли не будуть введені початкова і кінцева точки при натисненні на кнопку “Пошук” (Мал.4).
Мал.4
При дотриманні всіх вимог програма працюватиме коректно (Мал.5).
Мал. 5
Додаток 1
Код програмних модулів
unit Additional1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ComCtrls, Grids, ExtCtrls, Mask, Menus;
type
TForm1 = class(TForm)
StaticText1: TStaticText;
StringGrid1: TStringGrid;
StaticText2: TStaticText;
StaticText3: TStaticText;
MaskEdit1: TMaskEdit;
MaskEdit2: TMaskEdit;
Poisk: TBitBtn;
Label1: TLabel;
Bevel1: TBevel;
Exit: TBitBtn;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
Clear: TBitBtn;
Bevel2: TBevel;
N10: TMenuItem;
procedure PoiskClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure MaskEdit1KeyPress(Sender: TObject; var Key: Char);
procedure MaskEdit2KeyPress(Sender: TObject; var Key: Char);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure N2Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure ClearClick(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
const
N=15;//размерность массива
var
Form1: TForm1;
i,j:Integer;
implementation
uses Help, About;
{$R *.DFM}
procedure TForm1.PoiskClick(Sender: TObject);
var
map: array[1..N,1..N] of Integer;//Карта
road: array[1..N] of Integer;//Дорога
incl:array[1..N] of Boolean;//элемент массива равен true, если точка включена в маршрут
start, finish:Integer;//Начальная и конечная точки пути
found:Boolean;
len:Integer;//длина найденого мин маршрута
c_len:Integer;//длина текущего маршрута
//выбор очередной точки
procedure step(s,f,p:Integer);
var
c:Integer;//номер точки, в которую делаем очередной шаг
i:Integer;
begin
if s=f then
begin
//Точки совпали
found:=true;
len:=c_len;//сохриняем длину найденного маршрута
//вывод найденного маршрута
for i:=1 to p-1 do
Label1.Caption:=Label1.Caption+' '+IntToStr(road[i]);
Label1.Caption:=Label1.Caption+', довжина: '+IntToStr(len)+#13;
end
else
//выбор очередной точки
for c:=1 to N do
if (map[s,c]<>0) and (NOT incl[c])
and ((len=0) or (c_len+map[s,c]<len))
then begin
//точка соединена с текущей, но не включена в маршрут
road[p]:=c; //добавим вершину в путь
incl[c]:=true;
c_len:=c_len+map[s,c];
step(c,f,p+1);
incl[c]:=false;
road[p]:=0;
c_len:=c_len-map[s,c];
end;
end;
begin
if (MaskEdit1.Text='') or (MaskEdit2.Text='') then
ShowMessage('Введіть точки!')
else
begin
Label1.Caption:='';
//инициализация массивов
for i:=1 to N do road[i]:=0;
for i:=1 to N do incl[i]:=false;
//ввод описания карты из StringGrid.Cells
for i:=1 to N do
for j:=1 to N do
if StringGrid1.Cells[i,j]<>''
then map[i,j]:=StrToInt(StringGrid1.Cells[i,j])
else map[i,j]:=0;
len:=0;//длина найденного маршрута
c_len:=0;//длина текущего маршрута
start:=StrToInt(MaskEdit1.text);
finish:=StrToInt(MaskEdit2.text);
road[1]:=start;//внесём точку в маршрут
incl[start]:=true;//пометим её как включенную
step(start,finish,2);//ищем вторую точку маршрута
//проверим, найден ли хотя бы один путь
if not found then Label1.Caption:='Вказані точки не сполучені!';
end;
end;
//Процедура очистки
procedure TForm1.ClearClick(Sender: TObject);
begin
for i:=1 to N do
for j:=1 to N do
StringGrid1.Cells[i,j]:='';
Label1.Caption:='';
MaskEdit1.Text:='';
MaskEdit2.Text:='';
Poisk.Enabled:=false;
end;
//Автоматическое заполнение массива при запуске программы
procedure TForm1.FormActivate(Sender: TObject);
begin
for i:=1 to 14 do
StringGrid1.Cells[0,i]:=IntToStr(i);
for i:=1 to 14 do
StringGrid1.Cells[i,0]:=IntToStr(i);
StringGrid1.Cells[1,2]:='7';
StringGrid1.Cells[2,1]:='7';
StringGrid1.Cells[1,3]:='2';
StringGrid1.Cells[3,1]:='2';
StringGrid1.Cells[1,14]:='4';
StringGrid1.Cells[14,1]:='4';
StringGrid1.Cells[3,2]:='8';
StringGrid1.Cells[2,3]:='8';
StringGrid1.Cells[2,7]:='6';
StringGrid1.Cells[7,2]:='6';
StringGrid1.Cells[3,5]:='10';
StringGrid1.Cells[5,3]:='10';
StringGrid1.Cells[3,6]:='9';
StringGrid1.Cells[6,3]:='9';
StringGrid1.Cells[5,6]:='12';
StringGrid1.Cells[6,5]:='12';
StringGrid1.Cells[4,9]:='3';
StringGrid1.Cells[9,4]:='3';
StringGrid1.Cells[5,10]:='3';
StringGrid1.Cells[10,5]:='3';
StringGrid1.Cells[5,11]:='7';
StringGrid1.Cells[11,5]:='7';
StringGrid1.Cells[6,7]:='2';
StringGrid1.Cells[7,6]:='2';
StringGrid1.Cells[6,10]:='3';
StringGrid1.Cells[10,6]:='3';
StringGrid1.Cells[7,11]:='3';
StringGrid1.Cells[11,7]:='3';
StringGrid1.Cells[7,12]:='3';
StringGrid1.Cells[12,7]:='3';
StringGrid1.Cells[7,14]:='8';
StringGrid1.Cells[14,7]:='8';
StringGrid1.Cells[8,10]:='5';
StringGrid1.Cells[10,8]:='5';
StringGrid1.Cells[8,11]:='2';
StringGrid1.Cells[11,8]:='2';
StringGrid1.Cells[8,12]:='1';
StringGrid1.Cells[12,8]:='1';
StringGrid1.Cells[8,13]:='7';
StringGrid1.Cells[13,8]:='7';
StringGrid1.Cells[9,13]:='7';
StringGrid1.Cells[13,9]:='7';
StringGrid1.Cells[9,14]:='6';
StringGrid1.Cells[14,9]:='6';
StringGrid1.Cells[10,11]:='6';
StringGrid1.Cells[11,10]:='6';
StringGrid1.Cells[10,12]:='4';
StringGrid1.Cells[12,10]:='4';
StringGrid1.Cells[12,13]:='7';
StringGrid1.Cells[13,12]:='7';
StringGrid1.Cells[13,14]:='8';
StringGrid1.Cells[14,13]:='8';
end;
//Защита вводимых значений
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;{цифры и <BackSpace>}
else Key := Chr(0);{другие символы не отображать}
end;
end;
//Защита вводимых значений
procedure TForm1.MaskEdit2KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;{цифры и <BackSpace>}
else Key := Chr(0);{другие символы не отображать}
end;
end;
//Защита вводимых значений
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',Chr(8):;{цифры и <BackSpace>}
else Key := Chr(0);{другие символы не отображать}
end;
end;
//Выход из программы
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=MessageDlg('Ви дійсно бажаєте вийти?',
mtConfirmation,
[mbYes, mbNo],0)=IDYES;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Poisk.Click();
end;
procedure TForm1.N6Click(Sender: TObject);
begin
Exit.Click();
end;
procedure TForm1.N4Click(Sender: TObject);
begin
Clear.Click();
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
Poisk.Enabled:=true;
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Form2.show;
Form2.Memo1.Lines.LoadFromFile('Help.txt');
end;
procedure TForm1.N9Click(Sender: TObject);
begin
AboutBox.Show;
end;
end.
unit Help;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm2 = class(TForm)
Memo1: TMemo;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
Form2.Close;
end;
end.
unit About;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TAboutBox = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
OKButton: TButton;
PoiskPyti: TLabel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure OKButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutBox: TAboutBox;
implementation
{$R *.DFM}
procedure TAboutBox.OKButtonClick(Sender: TObject);
begin
AboutBox.Close;
end;
end.