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

ОТЧЕТ по лабораторной работе №2 "Разработка модуля САПР для системы проектирования ПЛМ"

Цель:

Научиться разрабатывать элементы программных САПР.

Задание:

Разработать исполняемый модуль, реализующий формирование системы функций.

Входными данными является текстовый файл, в строках которого заданы булевы функции в формате (список функций):

Fx=1..0+0..0+1..1, где

х – номер булевой функции (1-16),

1..0 – набор переменных, описывающих единичное или неопределенное значение функции. В наборе должно присутствовать столько переменных, сколькими описывается функция (1-16).

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

Выходными данными является двоичный файл, в котором записана система функций, представленная структурой:

Tarw=array of longword;

funcsys=record

cf:byte; - количество функций;

cv:byte; - количество переменных;

c1:word; - количество единичных наборов;

cx:word; - количество неопределенных наборов;

nabor1:Tarw; - множество единичных наборов;

naborx:Tarw; - множество единичных наборов;

end;

В программе осуществляется проверка корректности входных данных. Кроме того, есть возможность вводить исходные данные прямо в поле ввода программы.

Представим спецификацию двух функций, осуществляющих проверку корректности входных данных и перевод списка функций в систему функций:

function TForm1.VerifS(var a:integer; var b:integer):integer;

Функция возвращает 0 если ошибок во входных данных нет, или число от 1 до 7 – код ошибки. В передаваемых параметрах a и b возвращается дополнительная иныормация об ошибке. Коды ошибок:

1 – введены не все функции, или неправильные номера функций (превышающие необходимые);

2 – строка начинается не с функции;

3 – неврный номер функции;

4 – повтор функции;

5 – неверное количество переменных;

6 – неверные значения переменных;

7 – неверный разделитель.

function TForm1.Convert:integer;

Осуществляет непосредственно перевод. Возвращает 0 если не было ошибок, и1 – если назначено одно и то же значение для 1 и х.

Листинг программы приведен в приложении.

Контрольный пример:

f1=000+010+110

f2=000

f3=101

x

f2=101+010

f3=010

3 3

После работы программы получаем:

Вывод: В данной лабораторной работе мы научились разрабатывать элементы программных комплексов. Полученная программа выдала ожидаемые результаты на всех контрольных примерах, значит она работает корректно.

Приложение.

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

Tarw=array of longword;

funcsys=record

cf:byte;

cv:byte;

c1:word;

cx:word;

nabor1:Tarw;

naborx:Tarw;

end;

var

Form1: TForm1;

Systemf:funcsys;

implementation

procedure TForm1.N2Click(Sender: TObject);

var s:string;

begin

if OpenDialog1.Execute then

begin

Memo1.Lines. LoadFromFile(OpenDialog1.FileName);

s:=Memo1.Lines. Strings[Memo1.Lines. Count-1];

SpinEdit1.Value:=StrToInt(Copy(s,1,pos(' ',s)-1));

Delete(s,1,pos(' ',s));

SpinEdit2.Value:=StrToInt(s);

Memo1.Lines. Delete(Memo1.Lines. Count-1);

end;

end;

function Prov:boolean;

var s:string;

a, b:integer;

begin

case Form1.VerifS(a, b) of

0:s:='';

1:s:='Слишком мало функций';

2:s:='Строка должна начинаться с функции. Строка '+IntToStr(a+1);

3:s:='Неверный номер функции. Строка '+IntToStr(a+1);

4:s:='Повтор функции. Строка '+IntToStr(a+1)+'. Номер функции '+IntToStr(b);

5:s:='Неверное количество переменных. Строка '+IntToStr(a+1)+'. Номер функции '+IntToStr(b);

6:s:='Координаты точки должны задаваться 0 и 1. Строка '+IntToStr(a+1)+'. Номер функции '+IntToStr(b);

7:s:='Неверный разделитель. Строка '+IntToStr(a+1)+'. Номер функции '+IntToStr(b);

end;

if s<>'' then begin ShowMessage(s);Result:=false;end

else Result:=true;

end;

procedure TForm1.Button1Click(Sender: TObject);

var f:file;

i:integer;

begin

if not Prov then exit;

if Convert=1 then

begin

ShowMessage('Ошибка исходных данных. Наборы для х и 1 должны различаться');

if Systemf. nabor1<>nil then Systemf. nabor1:=nil;

if Systemf. naborx<>nil then Systemf. naborx:=nil;

exit;

end;

SaveDialog1.FileName:='default. fs';

SaveDialog1.Filter:='Системы функций|*.fs|Все файлы|*.*';

if SaveDialog1.Execute then

begin

AssignFile(f, SaveDialog1.FileName);

Rewrite(f,1);

BlockWrite(f, Systemf. cf, 1);

BlockWrite(f, Systemf. cv, 1);

BlockWrite(f, Systemf. c1, 2);

BlockWrite(f, Systemf. cx, 2);

for i:=Low(Systemf. nabor1) to High(Systemf. nabor1) do

BlockWrite(f, Systemf. nabor1[i], 4);

if Systemf. cx>0 then

for i:=Low(Systemf. naborx) to High(Systemf. naborx) do

BlockWrite(f, Systemf. naborx[i], 4);

CloseFile(f);

end;

SaveDialog1.FileName:='default. fl';

SaveDialog1.Filter:='Списки функций|*.fl|Все файлы|*.*';

end;

function TForm1.VerifS(var a:integer; var b:integer):integer;

const dig:set of char=['0'..'9'];

var s, d:string;

i, j,res, n:integer;

nov:byte; //number of vars

uf, hmf:word; //used func, how many func was used

begin

res:=0;

with Memo1 do

begin

i:=0;

nov:=SpinEdit2.Value;

uf:=0;

hmf:=(1 shl SpinEdit1.Value)-1;

while i<Lines. Count do

if Lines. Strings[i]='' then Lines. Delete(i) else inc(i);

if Lines. Count<SpinEdit1.Value then begin Result:=1;exit;end; //too little func

for i:=0 to Lines. Count-1 do

begin

s:=Lines. Strings[i];

a:=i;

for j:=1 to length(s) do s[j]:=UpCase(s[j]);

if s[1]='X' then begin uf:=0;continue;end;

if s[1]<>'F' then

begin res:=2;break;end; //not function

if not (s[2] in dig) then

begin res:=3;break;end; //wrong number

b:=Ord(s[2])-48;

j:=5;

if (s[3] in dig) then b:=b*10+Ord(s[3])-48

else if s[3]<>'=' then

begin res:=3;break;end //wrong number

else j:=4;

if ( (b>SpinEdit1.Value)or (b=0) ) then begin res:=3;break;end; //wrong number

if (uf and (1 shl (b-1)))>0 then begin res:=4;break;end; //duplicate func

uf:=uf or (1 shl (b-1));

hmf:=hmf and not(1 shl (b-1));

while j<=length(s) do

begin

d:=copy(s, j,nov);

if length(d)<nov then begin res:=5;break;end; //wrong point

for n:=1 to nov do

if not (d[n] in ['0','1']) then begin res:=6;break;end; //wrong coord

inc(j, nov);

if ( (s[j]<>'+')and(j<length(s)) ) then begin res:=7;break;end; //wrong parser (+)

inc(j);

end;

if res<>0 then break;

end;//for

end;//with

if res=0 then

if hmf>0 then res:=1;

Result:=res;

end;

function TForm1.Convert:integer;

var i, n,j, ac:integer; //n - #func, ac - # in A

s, d:string;

dd:word; // coord

a:Tarw;

existflag, wasx:boolean; //была ли уже эта точка, есть ли X

begin

Systemf. cf:=SpinEdit1.Value;

Systemf. cv:=SpinEdit2.Value;

a:=nil;

s:='';i:=0;ac:=1;wasx:=false;

while i<Memo1.Lines. Count do

begin

s:=Memo1.Lines. Strings[i];

inc(i);

if UpCase(s[1])='X' then

begin

Systemf. nabor1:=a;

Systemf. c1:=Length(a);

a:=nil;

ac:=1;

wasx:=true;

continue;

end;

n:=Ord(s[2])-48;

if s[3]<>'=' then n:=n*10+Ord(s[3])-48;

d:=copy(s, pos('=',s)+1,Systemf. cv);

dd:=0;

for j:=1 to length(d) do

dd:=(dd shl 1)+Ord(d[j])-48;

existflag:=false;

if a<>nil then

for j:=Low(a) to High(a) do

if ( a[j] and ((1 shl Systemf. cv)-1) )=dd

then begin a[j]:=a[j] or (1 shl Systemf. cv+n-1); existflag:=true;end;

if not existflag then

begin

SetLength(a, ac);

a[ac-1]:=0;

a[ac-1]:=dd;

a[ac-1]:=a[ac-1] or (1 shl (Systemf. cv+n-1));

inc(ac);

end;

end;

if wasx then

begin

Systemf. naborx:=a;

Systemf. cx:=Length(a);

a:=nil;

end

else

begin

Systemf. nabor1:=a;

Systemf. c1:=Length(a);

a:=nil;

Systemf. naborx:=nil;

Systemf. cx:=0;

end;

with Systemf do

if ( (c1>0)and(cx>0) ) then

begin

for i:=0 to c1-1 do

for j:=0 to cx-1 do

if (nabor1[i] and ((1 shl cv)-1) )=(naborx[j] and ((1 shl cv)-1) )

then

if (nabor1[i] and (not ((1 shl cv)-1) ) )=(naborx[j] and (not ((1 shl cv)-1) ) )

then begin Result:=1;exit;end;

end;

Result:=0;

end;

procedure TForm1.N8Click(Sender: TObject);

begin

if Prov then ShowMessage('Все правильно :)');

end;

procedure TForm1.N9Click(Sender: TObject);

begin

Button1Click(Button1);

end;

procedure TForm1.N3Click(Sender: TObject);

begin

if SaveDialog1.Execute then

begin

Memo1.Lines. Add(IntToStr(SpinEdit1.Value)+' '+IntToStr(SpinEdit2.Value));

Memo1.Lines. SaveToFile(SaveDialog1.FileName);

Memo1.Lines. Delete(Memo1.Lines. Count-1);

end;

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

if Systemf. nabor1<>nil then Systemf. nabor1:=nil;

if Systemf. naborx<>nil then Systemf. naborx:=nil;

end;

end.

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


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

По темам:

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

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

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

Информатика

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

Статистика

География

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

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

Генетика

Разное

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

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

Филология

Философия

Химия

Экология

Социология

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

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

Педагогика

История

Психология

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

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

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

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

Маркетинг

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

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

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

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

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

Творчество

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