Задача Прима - Краскала

Автор работы: Пользователь скрыл имя, 14 Апреля 2013 в 19:03, курсовая работа

Описание работы

Персональные компьютеры сейчас в основном используются в четырёх областях:
• обработка текстов и компьютерная вёрстка;
• хранение баз данных с возможностью их быстрой обработки;
• управление производственными процессами;
• анализ сложных процессов

Содержание работы

Введение………………………………………………………………………………………..4
Раздел 1. Теоретические аспекты……………………………………………………………..5
Постановка задачи…………………………………………...……………………….….5
Выбор языка программирования………………………………………………………..8
Раздел 2. Программная реализация………………………………………………………….12
Описание программы…………………………………………………………………..12
Тестирование программы………………………………………………………………14
Листинг программы…………………………………………………………………….15
Заключение……………………………………………………………………………………24
Литература…………………………………………………………………………………….25
Магнитный носитель…………………………………………………………………………26

Файлы: 1 файл

Na pechat.doc

— 294.50 Кб (Скачать файл)

При установленном в True свойстве AutoMerge ссылка на присоединенное меню будет сохраняться в специальном поле компонента, и отсоединяться в нужных случаях автоматически (например, при закрытии формы, которой оно принадлежит).

Объединение меню происходит по специальным  правилам, в основе которых лежит использование группового индекса (свойства Group Index) каждого объекта TMenuItem.

У пунктов меню одного уровня, в  частности всех подменю верхнего уровня в главном меню, свойство GroupIndex является неубывающим, т. е. у последующего пункта групповой индекс больше либо равен индексу предыдущего. Это требование отслеживается как на этапе разработки, так и на этапе исполнения. Например, пусть пункты меню имеют индексы 0, 3, 4, 5, 6. Если включить пункт меню с индексом 5 между пунктами с индексами 0 и 3, то 3 и 4 будут изменены на 5. А вот изменить большее значение Х на меньшее Y, если впереди есть пункты с индексом, большим Y, невозможно. Если в этом примере попытаться изменить индекс 6 на 4, то это приведет к возникновению исключительной ситуации EMenuError.

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

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

К окнам интерфейса MDI все сказанное относится только при запуске приложения. Если в формах приложения со стилем fsMDIChild есть свои главные меню, то в этот момент они автоматически сольются с главным меню формы fsMDIForm независимо от состояния AutoMerge.

На уровне работы с серверами  OLE предусмотрены дополнительные возможности по объединению меню. Если в компонент TOLEContainer загружен объект OLE, то в конец подменю Edit обычно добавляется подменю, из которого можно вызвать функции открытия и редактирования этого объекта. После активизации сервера он может не только вставлять свои подменю в главное, но и добавлять новые пункты к уже существующим подменю.

1.2.1.2 Компонент TLabel


TLabel служит для отображения текста на экране. Можно изменить шрифт и цвет метки, если дважды щелкнуть на свойство Font в Инспекторе Объектов. Видно, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.

Этот компонент доступен из модуля STDCTRLS, и находится на странице Палитры компонентов Standard.

Компонент представляет собой статический  текст. С помощью этого компонента на рабочей поверхности формы можно отобразить информацию, сделать пояснения и показать названия других компонентов. Но он имеет и другую важную функцию — если в составе текста TLabel есть символы-акселераторы, информация об их нажатии может передаваться от TLabel другому элементу управления.

        1. Компонент TEdit

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

 

 

Раздел 2. Программная реализация

 

2.1 Описание программы


Главная форма программы  выглядит следующим образом:

 

 

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

Так же на форме присутствует пункт  меню. Структура которого такова:

  1. Файл

- Открыть

- Сохранить

- Выход

2.   Пример

3.   О программе

 

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

 


      Затем заполняем таблицу, и нажимаем «Вычислить». Внизу формы выводится наикратчайший путь и минимальные расходы.

 

 

         По кнопке “Открыть” открывается стандартное диалоговое окно Windows открытия файла, где вы можете открыть ранее сохраненный проект.

Кнопкой “Сохранить” вы можете сохранить введенные вами данные, для последующего удобного открытия. Это позволяет ускорить процесс ввода данных в программу, особенно если вам приходится вводить большие объемы информации.


Ну и по последней  кнопке в этой вкладке “Выход” приложение закрывается.

Если Вас интересует автор программы, или для чего предназначена программа, просто нажмите на кнопку “О программе”.

        Чтобы очистить все введенные данные, просто нужно нажать кнопку «Очистить».

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

 

 

 

 

 

 

 

 

 

 

 

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

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

     A   B    C   D

A  0    10  11  12

B  10   0  13  14

C  11   13   0  15

D  12   14 15  0

 

Из пункта А минимальное расстояние в данном примере до пункта B. Из пункта В минимальное расстояние до пункта С. И из пункта С соответственно до  пункта D. Просуммировав данные результаты, мы получим: 10+13+15=38.

Кратчайший путь соответственно будет  A-B-C-D.

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

 

 

 


 

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

 

 

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

 

unit proga;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Grids, Menus;

type

  TForm1 = class(TForm)

    StringGrid1: TStringGrid;

    Edit1: TEdit;

    Button1: TButton;

    Button2: TButton;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Button3: TButton;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    SaveDialog1: TSaveDialog;

    OpenDialog1: TOpenDialog;

    N5: TMenuItem;

    N6: TMenuItem;


    Label5: TLabel;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);

    procedure N3Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N4Click(Sender: TObject);

 

    procedure N2Click(Sender: TObject);

    procedure Edit1KeyPress(Sender: TObject; var Key: Char);

    procedure N6Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  f: text;

  i,j,N:integer;

  a:array [1..50,1..50] of real;

implementation

uses Unit1;

{$R *.dfm}

 

 

// Кнопка «Заполнить»

procedure TForm1.Button1Click(Sender: TObject);

begin

 

StringGrid1.ColCount:=strtoint(edit1.Text)+1;

StringGrid1.RowCount:=strtoint(edit1.Text)+1;

N:=strtoint(edit1.Text)+1;

for i:=0 to n-2 do begin


stringgrid1.Cells[0,i+1]:=Chr(Byte('A')+i); буквы по алфавиту


stringgrid1.Cells[i+1,0]:=Chr(Byte('A')+i);

end;

for i:=1 to n-1 do

stringgrid1.Cells[i,i]:='0';

end;

 

 

 

// Кнопка «Вычислить»

procedure TForm1.Button2Click(Sender: TObject);

Var

res:array [1..50,1..2] of integer;

col:array [1..50] of integer;

k,m,i1,j1,q,z:integer;

min,L:real;

flag:boolean;

begin

label4.Caption:='A';

for i:=1 to N-1 do

for j:=1 to N-1 do

a[i,j]:=strtoint(stringgrid1.Cells[j,i]);                      запись чисел из таблицы в массив

k:=1;

L:=0;

q:=1;

while K<N-1 do begin

label4.Caption:=label4.Caption+'-';

i:=q;

z:=1;

j:=1;

flag:=false;

while flag=false do begin

if a[i,j]=0 then


j:=j+1

else begin

min:=a[i,j];

i1:=i;

j1:=j;


flag:=true; Нахождение минимального элемента

end;                       в каждой строке

end;

for j:=1 to N-1 do

if (a[i,j]<>0) and (a[i,j]<min) then begin

min:=a[i,j];

 

i1:=i;

j1:=j;

end;

L:=L+min;

label4.Caption:=label4.Caption+stringgrid1.Cells[0,j1];

for z:=1 to n do begin

a[i1,z]:=0;

a[z,i1]:=0;

end;

q:=j1;

K:=k+1;

end;

Label3.Caption:=floattostr(L);                             Вывод результатов

end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);


begin

case key of

#15,'0'..'9': begin

j:=stringgrid1.col;

i:=stringgrid1.row;    Ограничение ввода в StringGrid

stringgrid1.cells[i,j]:=stringgrid1.cells[i,j]+key;

end;

#13: if (stringgrid1.Col<stringgrid1.colcount-1) then

 

stringgrid1.Col:=stringgrid1.Col+1;

else

key:=chr(0);

end;

end;


// Кнопка «Сохранить»

procedure TForm1.N3Click(Sender: TObject);

var i,l: integer;

begin

if savedialog1.Execute then begin

 

assignfile(f,savedialog1.FileName);

rewrite(f);

writeln(f,edit1.text);

for i:=0 to N-1 do

for j:=0 to N-1 do

writeln(f,stringgrid1.cells[j,i]);                              запись из таблицы в файл

closefile(f);

end;

end;

 

// Кнопка «Очистить»

procedure TForm1.Button3Click(Sender: TObject);

begin

for i:=0 to 99 do

for j:=0 to 99 do

stringgrid1.Cells[j,i]:='';

label3.Caption:='';

label4.Caption:='';

edit1.Text:='';

stringgrid1.ColCount:=2;

stringgrid1.RowCount:=2;

stringgrid1.FixedCols:=1;

stringgrid1.FixedRows:=1;

end;

 

// Кнопка «Пример»

procedure TForm1.N5Click(Sender: TObject);


Var

res:array [1..50,1..2] of integer;

col:array [1..50] of integer;

k,m,i1,j1,q,z:integer;

min,L:real;

flag:boolean;

begin

N:=5;

 

edit1.Text:=inttostr(n-1);

StringGrid1.ColCount:=strtoint(edit1.Text)+1;

StringGrid1.RowCount:=strtoint(edit1.Text)+1;

for i:=0 to n-2 do begin

stringgrid1.Cells[0,i+1]:=Chr(Byte('A')+i);

stringgrid1.Cells[i+1,0]:=Chr(Byte('A')+i);

end;

stringgrid1.Cells[1,1]:='0';

stringgrid1.Cells[2,1]:='10';

stringgrid1.Cells[3,1]:='11';

stringgrid1.Cells[4,1]:='12';

stringgrid1.Cells[1,2]:='10';

stringgrid1.Cells[2,2]:='0';

stringgrid1.Cells[3,2]:='13';

stringgrid1.Cells[4,2]:='14';

stringgrid1.Cells[1,3]:='11';

stringgrid1.Cells[2,3]:='13';

stringgrid1.Cells[3,3]:='0';

stringgrid1.Cells[4,3]:='15';

stringgrid1.Cells[1,4]:='12';

stringgrid1.Cells[2,4]:='14';

stringgrid1.Cells[3,4]:='15';

stringgrid1.Cells[4,4]:='0';

label4.Caption:='A';

for i:=1 to N-1 do

 

for j:=1 to N-1 do

a[i,j]:=strtoint(stringgrid1.Cells[j,i]);


k:=1;

L:=0;

q:=1;

while K<N-1 do begin

label4.Caption:=label4.Caption+'-';

i:=q;

z:=1;

 

j:=1;

flag:=false;

while flag=false do begin

if a[i,j]=0 then

j:=j+1

else begin

min:=a[i,j];

i1:=i;

j1:=j;

flag:=true;

end;

end;

for j:=1 to N-1 do

Информация о работе Задача Прима - Краскала