Лабораторная работа по дисциплине: “АПВС”
Цель работы:
Разработать программный модуль, реализующую преобразование двоичной информации на входе (число переменных, число функций, число интервалов, матрицу интервалов, матрицу функции) в соответствующую текстовую информацию для ПЛМ с заданными параметрами.
Описание программы:
Программа состоит из нескольких процедур основными из которых являются:
Tform1.zapis – процедура считывающая исходные данные из файла и записывающая их во внутреннюю память программы, представленную массивом записей.
TForm1.obrabotka – процедура обрабатывающая строки матрицы интервалов, представленные парой шестнадцатибитовых векторов, и строки матрицы функций.
Обработка происходит следующим образом: выделяем по 1 бит в соответствующих векторах и записываем в выходной файл соответствующее значение Х: 11 –, 10 - 1,01 - 0 , если комбинация битов недопустима – 00 то выводится сообщение о неправильном формате входных данных.
В программе используется следующие структуры:
str=record
int:array [1..2] of word;
func:word;
end;
Запись, которая представляет собой строку матрицы интервалов (int:array [1..2] of word;) – пара 16 битных векторов, и соответствующую ее строку матрицы функций func - 16 битный вектор.
Data=array of str - массив записей представляет собой матрицу интервалов и функций.
Входные данные должны находиться в файле c:\input. dat при неправильных несоответствии входных данных программа выдаст ошибку при загрузке. Параметры ПЛМ вводятся в форму, при невозможности построить на ПЛМ с заданными параметрами программа выдает ошибку и завершает свою работу.
Выходными данными является текстовый файл c:\output. txt
Тестовый пример:
Шестнадцатиричный файл
03 00 05 00 05 00 00 78 00 98 00 В8 00 48 00 F0 00 C8 00 68 00 B0 00 68 00 98 00 80 00 40 00 80 00 20 00 60
X1 |
X2 |
X3 |
X4 |
X5 |
Y1 |
Y2 |
Y3 |
|
0 |
1 |
1 |
1 |
1 |
1 |
|||
1 |
0 |
0 |
1 |
1 |
||||
1 |
0 |
1 |
1 |
1 |
1 |
|||
0 |
1 |
0 |
0 |
1 |
||||
1 |
1 |
1 |
1 |
0 |
1 |
|||
1 |
1 |
0 |
0 |
1 |
||||
0 |
1 |
1 |
0 |
1 |
1 |
|||
1 |
0 |
1 |
1 |
0 |
||||
0 |
1 |
1 |
0 |
1 |
1 |
1 |
||
1 |
0 |
0 |
1 |
1 |
Результат работы программы:
Число функций 3
Число переменных 5
Число интервалов 5
X1 |
X2 |
X3 |
X4 |
X5 |
Y1 |
Y2 |
Y3 |
1 |
0 |
0 |
- |
- |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
- |
0 |
1 |
0 |
- |
- |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
- |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
- |
0 |
1 |
1 |
Вывод: в ходе выполнения лабораторной работы была разработана программа реализующая двоичной информации на входе (число переменных, число функций, число интервалов, матрицу интервалов, матрицу функции) в соответствующую текстовую информацию для ПЛМ с заданными параметрами.
Текст программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
procedure edit1KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
procedure zapis;
procedure obrabotka;
{ Public declarations }
end;
var
Form1: TForm1;
chf, chp, chi, buf:word;
size, s,num:integer;
f: file of word;
f1: TextFile;
type
str=record
int:array [1..2] of word;
func:word;
end;
Data=array of str;
implementation
var
d:data;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
assignFile(f,'c:\input. dat');
reset(f);
size:=FileSize(f);
Read(f, buf);
chf:=buf;
Read(f, buf);
chp:=buf;
Read(f, buf);
chi:=buf;
s:=3*chi+3;
if s<>size then begin
showMessage('Неверные входные данные');
exit;
end;
zapis;
ShowMessage ('Файл загружен');
end;
procedure Tform1.zapis;
var
i, j:integer;
begin
SetLength(D, chi);
for i:=0 to chi-1 do
begin
for j:=1 to 2 do
begin
Read(f, buf);
D[i].int[j]:=buf;
end;
end;
for i:=0 to chi-1 do
begin
read(f, buf);
D[i].func:=buf;
end;
end;
procedure TForm1.obrabotka;
var
d1,d2,d11,d22,func1,func2:word;
i, j,k:integer;
buf1:string;
begin
assignFile(f1,'c:\output. txt');
rewrite(f1);
writeln(f1,'Число функций ',chf);
writeln(f1,'Число переменных ',chp);
writeln(f1,'Число интервалов ',chi);
for i:=1 to chp do write (f1,' X',i,' ');
for i:=1 to chf do write (f1,' Y',i,' ');
writeln(f1,'');
for i:=0 to chi-1 do
begin
d1:=D[i].int[1];
d2:=d[i].int[2];
for j:=1 to chp do
begin
d11:=(d1 and 32768);
d11:=d11 shr 15;
d22:=(d2 and 32768);
d22:=d22 shr 15;
d1:=d1 shl 1;
d2:=d2 shl 1;
if d22=0 then
begin
if d11=1 then write (f1,' 0 ') else
begin
Showmessage('Неправильная кодировка');
exit;
end;
end else
begin
if d11=0 then write (f1,' 1 ') else write (f1,' - ');
end;
end;
func1:=D[i].func;
for k:=1 to chf do
begin
func2:=(func1 and 32768);
func2:=func2 shr 15;
func1:=func1 shl 1;
if func2=0 then write (f1,' 0 ') else write (f1,' 1 ');
end;
writeln(f1,'');
end;
CloseFile(f1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a, n,m, q:integer;
begin
a:=0;
n:=StrtoInt(edit1.text);
m:=StrToInt(Edit2.Text);
q:=StrToInt(Edit3.Text);
if n<chp then
begin
ShowMessage('Количество входов должно быть не меньше '+IntToStr(chp));
a:=1;
end;
if m<chf then
begin
ShowMessage('Количество выходов должно быть не меньше '+IntToStr(chf));
a:=1;
end;
if q<chi then
begin
ShowMessage('Количество внутренних переменных должно быть не меньше '+IntToStr(chi));
a:=1;
end;
if a<>0 then exit;
obrabotka;
end;
procedure TForm1.edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (not(((key>48)and(key<58))or((key>96)and(key<106))or(key=8))) then
ShowMessage('Введите цифры от 1 до 9 ');
end;
end.