
апсос-лабы-готовые / 1 / LR3
.docЛАБОРАТОРНАЯ РАБОТА №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..
Вывод: в ходе лабораторной работы мы научились разрабатывать сценарий развития объекта, выделять варианты его конструктивного исполнения, на основе которых строить и программно реализовывать И-ИЛИ дерево технических решений.