Отчеты по лабораторным работам
  • Регистрация
1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голоса)

ОТЧЕТ по лабораторной работе №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.

Добавить комментарий


Защитный код
Обновить

По темам:

История Украины

Культурология

Высшая математика

Информатика

Охотоведение

Статистика

География

Военная наука

Английский язык

Генетика

Разное

Технологиеские темы

Украинский язык

Филология

Философия

Химия

Экология

Социология

Физическое воспитание

Растениевосдство

Педагогика

История

Психология

Религиоведение

Плодоводство

Экономические темы

Бухгалтерские темы

Маркетинг

Иностранные языки

Ветеринарная медицина

Технические темы

Землеустройство

Медицинские темы

Творчество

Лесное и парковое хозяйство