Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
07.06.2015
Размер:
108.03 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА №3

Построение и программная реализация И-ИЛИ дерева решений

Цель работы: научиться разрабатывать сценарий развития объекта, выделять варианты его конструктивного исполнения, на основе которых строить и программно реализовывать И-ИЛИ дерево технических решений.

Ход работы:

Принцип построения дерева решений.

Рассматривая каждый узел в отдельности можно представить привод как дерево элементов «И-ИЛИ», где каждой вершине «И» соответствует только одно возможное решение, а вершине «ИЛИ» несколько вариантов конструктивных решений.

редуктор

1ступ. редуктор

2ступ. редуктор

3ступ. редуктор

корпус

валы

передача

щуп

д/ масла

крышки

подшип-

ники

болты

Рисунок 1 – И/ИЛИ-дерево решений привода

Рисунок 3 – Окно программы

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

  • родительская вершина;

  • название новой вершины;

  • тип новой вершины (И/ИЛИ).

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

И/ИЛИ-дерево решений и мощность множества решений.

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

* - редуктор

* - 1ступенчатый

* - 2ступенчатый

o - корпус

* - вертик исполнение

* - горизонт исполнение

o - верхняя часть

o - основание корпуса

o - валы

o - передача

* - зубчатая передача

* - червячная передача

o - щуп д/масла

o - крышки

* - крышка сквозная

* - крышка глухая

o - подшипники

* - шар упорные

* - шар радиально-упорные

* - шар радиальные

* - шар сферические

* - рад конические

* - рад цилиндрические

o - болты

* - 3ступенчатый

o - вых передача

Мощность множества решений = 50.

Код программы:

unit UtMain;

interface

uses

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

Dialogs, ComCtrls, sTreeView, ExtCtrls, sPanel, sGroupBox, StdCtrls,

sEdit, sButtonControl, sCustomButton, sComboBoxes, Mask,

sCustomComboEdit, sTooledit, Menus, ImgList;

type

TFmMain = class(TForm)

sPanel1: TsPanel;

sPanel2: TsPanel;

TV: TsTreeView;

TB: TsToolBar;

TBNew: TsSpeedButton;

TBSave: TsSpeedButton;

sToolDivider1: TsSpeedButton;

sToolDivider2: TsSpeedButton;

TBOpen: TsSpeedButton;

sGroupBox1: TsGroupBox;

Et: TsEdit;

RGItem: TsRadioGroup;

GBOperration: TsGroupBox;

BBAdd: TsBitBtn;

BBDel: TsBitBtn;

BBPow: TsBitBtn;

OD: TOpenDialog;

SD: TSaveDialog;

PM: TPopupMenu;

Add: TMenuItem;

Del: TMenuItem;

sGroupBox2: TsGroupBox;

Label1: TLabel;

Label2: TLabel;

Image: TImageList;

procedure BBAddClick(Sender: TObject);

procedure BBDelClick(Sender: TObject);

procedure TBNewClick(Sender: TObject);

procedure TBSaveClick(Sender: TObject);

procedure TBOpenClick(Sender: TObject);

procedure AddClick(Sender: TObject);

procedure DelClick(Sender: TObject);

procedure BBPowClick(Sender: TObject);

procedure TVContextPopup(Sender: TObject; MousePos: TPoint;

var Handled: Boolean);

private

{ Private declarations }

public

{ Public declarations }

Procedure AddText(Block:string);

Function TreeItemSearch(TV1: TTreeView; SucheItem: string): TTreeNode;

function IsAnd(node: TTreeNode): Boolean;

function IsOr(node: TTreeNode): Boolean;

function GetPowerOfTree(node: TTreeNode): Integer;

end;

var

FmMain: TFmMain;

implementation

{$R *.dfm}

function TfmMain.IsAnd(node: TTreeNode): Boolean;

begin

if node.Text[1]='*'

then Result:=True

else Result:=False;

end;

function TfmMain.IsOr(node: TTreeNode): Boolean;

begin

if node.Text[1]='o'

then Result:=True

else Result:=False;

end;

function TfmMain.GetPowerOfTree(node: TTreeNode): Integer;

var child: TTreeNode;

i: Integer;

begin

if not(node.HasChildren)

then Result:=1

else begin

if IsOr(node)

then begin

child:=node.getFirstChild;

i:=GetPowerOfTree(child);

while (node.GetNextChild(child) <> nil) do

begin

child:=node.GetNextChild(child);

i:=i+GetPowerOfTree(child);

end;

Result:=i;

end;

if IsAnd(node)

then begin

child:=node.getFirstChild;

i:=GetPowerOfTree(child);

while (node.GetNextChild(child) <> nil) do

begin

child:=node.GetNextChild(child);

i:=i*GetPowerOfTree(child);

end;

Result:=i;

end;

end;

end;

Procedure TFmMain.AddText(Block:string);

var parent: TTreeNode;

begin

parent:=TV.Selected;

TV.Items.AddChild(parent,block);

end;

Function TFmMain.TreeItemSearch(TV1:TTreeView;SucheItem:string):TTreeNode;

var

i: Integer;

iItem: string;

begin

if (TV1 = nil) or (SucheItem = '') then Exit;

for i := 0 to TV1.Items.Count - 1 do

begin

iItem := TV1.Items[i].Text;

if SucheItem = iItem then

begin

Result := TV1.Items[i];

Exit;

end

else

begin

Result := nil;

end;

end;

end;

procedure TFmMain.BBAddClick(Sender: TObject);

var st: String;

parent: TTreeNode;

begin

st:='';

case RGItem.ItemIndex of

0: begin

AddText(Et.Text+' "И"');

// TV.Items.Item[TV.Items.Count-1].ImageIndex:=0;

// ShowMessage(IntToStr(TV.Items.Count-1));

end;

1: begin

AddText(Et.Text+'" ИЛИ"');

// TV.Items.Item[TV.Items.Count-1].ImageIndex:=1;

// ShowMessage(IntToStr(TV.Items.Count-1));

end;

end;

et.Clear;et.SetFocus;

end;

procedure TFmMain.BBDelClick(Sender: TObject);

var node: TTreeNode;

begin

node:=TV.Selected;

TV.Items.Delete(node);

end;

procedure TFmMain.TBNewClick(Sender: TObject);

begin

TV.Items.Clear;

end;

procedure TFmMain.TBSaveClick(Sender: TObject);

begin

if SD.Execute then

TV.SaveToFile(SD.FileName);

end;

procedure TFmMain.TBOpenClick(Sender: TObject);

begin

if OD.Execute then

begin

TV.LoadFromFile(OD.FileName);

TV.FullExpand;

end;

end;

procedure TFmMain.AddClick(Sender: TObject);

begin

BBAddClick(Sender);

end;

procedure TFmMain.DelClick(Sender: TObject);

begin

BBDelClick(Sender);

end;

procedure TFmMain.BBPowClick(Sender: TObject);

var node: TTreeNode;

begin

if (TV.Selected)<>nil

then begin

node:=TV.Selected;

ShowMessage('P = '+IntToStr(GetPowerOfTree(node)));

// lblPower.Caption:='P = '+IntToStr(GetPowerOfTree(node));

end

else MessageDlg('Выберите одну из вершин дерева!',mtError,[mbOk],0);

end;

procedure TFmMain.TVContextPopup(Sender: TObject; MousePos: TPoint;

var Handled: Boolean);

var tmpNode: TTreeNode;

begin

tmpNode := (Sender as TTreeView).GetNodeAt(MousePos.X, MousePos.Y);

if tmpNode <> nil then

TTreeView(Sender).Selected := tmpNode;

end;

end..

Вывод: в ходе лабораторной работы мы научились разрабатывать сценарий развития объекта, выделять варианты его конструктивного исполнения, на основе которых строить и программно реализовывать И-ИЛИ дерево технических решений.

Соседние файлы в папке 1