ОТЧЕТ по лабораторной работе №3 "Разработка программных средств реализации систем булевых функций на ПЛМ"
Цель: Изучить методы реализации систем булевых функций на ПЛМ.
Задание:
Разработать исполняемый модуль, реализующий метод параллельной декомпозиции.
Входными данными является система булевых функций, задаваемая пользователем на интерфейсной форме, и представляющая собой матрицу типа В.
Выходными данными является таблица прошивки ПЛМ, представляющая собой набор множеств. Каждое множество – это набор номеров строк из исходной таблицы, составляющих конкретную ПЛМ.
В программе осуществляется проверка корректности входных данных. Проверяется возможность использования метода параллельной декомпозиции и удаляются пустые строки из исходной матрицы.
Вывод: В данной лабораторной работе мы научились разрабатывать элементы программных комплексов. Полученная программа выдала ожидаемые результаты на всех контрольных примерах, значит она работает корректно.
Приложение.
Листинг программы:
type
TForm1 = class(TForm)
…
private
{ Private declarations }
public
{ Public declarations }
procedure ReadMat;
procedure ResizeSet;
function verif:boolean;
Function CalcRang:boolean;
function MakeSet:string;
procedure DelEmp;
end;
var
Form1: TForm1;
Matr:array of integer; //исходные данные
Sets:integer; //множество
Rang:array of byte;
HowM, Sel:integer; //сколько в тек. мн-ве, какие уже выбраны
Vh, Vyh, m,n:integer; //m - Vh, n - Vyh
implementation
procedure TForm1.FormCreate(Sender: TObject);
var i, j:integer;
begin
with StringGrid1 do
begin
for i:=1 to RowCount do Cells[0,i]:=IntToStr(i);
for i:=1 to ColCount do Cells[i,0]:=IntToStr(i);
for i:=1 to RowCount do
for j:=1 to ColCount do Cells[j, i]:='0';
end;
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
var i, j:integer;
begin
StringGrid1.ColCount:=SpinEdit1.Value+1;
for i:=1 to StringGrid1.ColCount do
StringGrid1.Cells[i,0]:=IntToStr(i);
for i:=1 to StringGrid1.ColCount do
for j:=1 to StringGrid1.RowCount do
if StringGrid1.Cells[i, j]='' then StringGrid1.Cells[i, j]:='0';
end;
procedure TForm1.SpinEdit2Change(Sender: TObject);
var i, j:integer;
begin
StringGrid1.RowCount:=SpinEdit2.Value+1;
for i:=1 to StringGrid1.RowCount do
StringGrid1.Cells[0,i]:=IntToStr(i);
for i:=1 to StringGrid1.ColCount do
for j:=1 to StringGrid1.RowCount do
if StringGrid1.Cells[i, j]='' then StringGrid1.Cells[i, j]:='0';
end;
procedure TForm1.ReadMat;
var i, j:integer;
begin
for i:=1 to StringGrid1.RowCount-1 do
for j:=1 to StringGrid1.ColCount-1 do
begin
if StringGrid1.Cells[j, i]='1' then
Matr[i-1]:=Matr[i-1] or (1 shl (j-1));
procedure TForm1.ResizeSet;
var i:integer;
begin
Vh:=SpinEdit1.Value;
Vyh:=SpinEdit2.Value;
m:=SpinEdit3.Value;
n:=SpinEdit4.Value;
SetLength(Matr, Vyh);
for i:=0 to High(Matr) do Matr[i]:=0;
SetLength(Rang, Vyh);
Sel:=0;
HowM:=0;
end;
function TForm1.verif:boolean;
begin
if ( (Vh<=m)and(Vyh<=n) ) then Result:=true else Result:=false;
end;
function TForm1.CalcRang:boolean;
var i, j,vvv:integer;
begin
Result:=true;
for i:=0 to Vyh-1 do
begin
Rang[i]:=0;
vvv:=Matr[i];
while vvv>0 do
begin
if ( vvv and 1 )>0 then inc(Rang[i]);
vvv:=vvv shr 1;
end;
if Rang[i]>m then begin Result:=false;exit;end;
end;
for i:=0 to High(Rang)-1 do
for j:=i+1 to High(Rang) do
if Rang[i]<Rang[j] then
begin vvv:=Rang[i];Rang[i]:=Rang[j];Rang[j]:=vvv; end;
end;
function Razn(a, b:integer):integer;
var i:integer;
begin
Result:=0;
for i:=0 to 15 do
if ( (a and (1 shl i))<>0 )and( (b and (1 shl i))=0 ) then Result:=Result+1;
end;
function TForm1.MakeSet:string;
var i, j,k:integer;
otl, sovp, uzhe, new:integer;
begin
i:=0;Sets:=0;Result:='';
while ( Sel and (1 shl i) )>0 do inc(i);
if i>High(Matr) then exit;
HowM:=1;
Sel:=Sel or (1 shl i);
Sets:=Matr[i];
Result:=IntToStr(i+1);
uzhe:=Rang[i];
new:=-1;
inc(i);
while HowM<n do
begin
otl:=20;
sovp:=-1;
for j:=i to High(Matr) do
begin
if ( (sel and (1 shl j))<>0 ) then continue;
k:=Razn(Matr[j],Sets);
if k+uzhe>m then continue;
if Rang[j]-k>sovp then begin new:=j;sovp:=Rang[j]-k;continue;end;
if ( (Rang[j]-k=sovp)and(k<otl) ) then begin new:=j;otl:=k;continue;end;
end;
if new=-1 then break;
inc(HowM);
Result:=Result+','+IntToStr(new+1);
Sets:=Sets or Matr[new];
j:=Sets;
uzhe:=0;
while j>0 do
begin
if ( j and 1 )>0 then inc(uzhe);
j:=j shr 1;
end;
Sel:=Sel or (1 shl new);
new:=-1;
end;
end;
procedure TForm1.DelEmp;
var i, j:integer;
fl:boolean;
begin
i:=1;
while i<StringGrid1.RowCount-1 do
begin
fl:=false;
for j:=1 to StringGrid1.ColCount-1 do
if StringGrid1.Cells[j, i]='1' then fl:=true;
if (not fl) then
begin
if StringGrid1.RowCount=3 then exit;
for j:=i to StringGrid1.RowCount-2 do
StringGrid1.Rows[j]:=StringGrid1.Rows[j+1];
SpinEdit2.Value:=SpinEdit2.Value-1;
dec(i);
end;
inc(i);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
s:string;
begin
DelEmp;
ListBox1.Clear;
ResizeSet;
ReadMat;
if verif then
begin
s:='';
for i:=1 to Vyh do s:=s+IntToStr(i)+',';
delete(s, length(s),1);
ListBox1.Items. Add(s);
exit;
end;
if not CalcRang then begin ShowMessage('Слишком большой ранг(и)');exit; end;
while ( Sel<((1 shl Vyh)-1) ) do
ListBox1.Items. Add(MakeSet);
end;
end;
end.