3 Руководство пользователя, инструкция по инсталляции
3.1 Требования к аппаратным средствам
Для эффективной работы спроектированного программного комплекса необходимо выполнение следующих требований к аппаратному и программному обеспечению:
· CPU не ниже Pentium-133
· 8 Mb оперативной памяти (желательно 32 Mb)
· минимум 1Mb свободного дискового пространства
· 1 Mb видеопамяти
· операционная система Windows 95/98/2000/NT.
· Манипулятор мышь.
Приложение было тестировано на следующих конфигурациях:
· Intel Celeron 400, 32 Mb RAM, Windows 98
· Intel Pentium || Celeron 266, 64 Mb RAM, Windows 98
· AMD K6 || 333, 64 Mb RAM, Windows NT 4.0
· Intel Pentium 166, 16 Mb RAM, Windows 95
Вывод
В ходе разработки курсового проекта я ближе ознакомился с теорией МП- трансляторов, научился писать программы - конструкторы для построения МП – транслятора по его параметрам с последующей проверкой задаваемых цепочек, закрепил знания по системному программированию. Разрабатывая программу, я научился применять знания дискретной математике, что облегчает работу программиста.
В дальнейшем хотелось бы улучшить программный продукт -улучшить интерфейс.
Листингпрограммы:
unit DmKurs;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MPunit, ComCtrls, ToolWin, Menus, StdCtrls, ExtCtrls, Grids,Addun,
ActnList, ImgList, ExtDlgs, Buttons, ButtonComps, RunText;
type
TMainPr = class(TForm)
StatusBar1: TStatusBar;
MainMenu1: TMainMenu;
pc1: TPageControl;
File1: TMenuItem;
Help1: TMenuItem;
New1: TMenuItem;
Save1: TMenuItem;
Load1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
tsEdit: TTabSheet;
ActionList1: TActionList;
alCreateNew: TAction;
ImageList1: TImageList;
tsCheck: TTabSheet;
dgMP: TDrawGrid;
alRepaint: TAction;
ToolBar1: TToolBar;
tbNew: TToolButton;
alSave: TAction;
sd1: TSaveDialog;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
alLoad: TAction;
od1: TOpenDialog;
pm: TPopupMenu;
New2: TMenuItem;
Save2: TMenuItem;
Load2: TMenuItem;
N2: TMenuItem;
Exit2: TMenuItem;
spd1: TSavePictureDialog;
tsAdd: TTabSheet;
alExit: TAction;
tlSavePicture: TToolButton;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
alHelp: TAction;
ToolButton3: TToolButton;
N6: TMenuItem;
N7: TMenuItem;
GroupBox2: TGroupBox;
buSymbAdd: TButton;
buDelSymb: TButton;
buClear: TButton;
Panel6: TPanel;
Label15: TLabel;
buNextStep: TButton;
lbStep: TListBox;
rgCheck: TRadioGroup;
buCheck: TButton;
plStData: TPanel;
buStopTrace: TBitBtn;
Panel1: TPanel;
lbResult: TLabel;
plChain: TEdit;
GroupBox1: TGroupBox;
mmNotes: TMemo;
Panel3: TPanel;
Label9: TLabel;
sgStartMag: TStringGrid;
buStartAdd: TButton;
buStartDel: TButton;
Panel4: TPanel;
Label10: TLabel;
cbStartingSt: TComboBox;
Panel5: TPanel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
cbStEd: TComboBox;
cbMagStEd: TComboBox;
cbSymbEd: TComboBox;
buCellEdit: TButton;
Panel2: TPanel;
Panel7: TPanel;
Label1: TLabel;
Label4: TLabel;
Label6: TLabel;
Label8: TLabel;
lbStNum: TLabel;
lbFirstSt: TLabel;
Label7: TLabel;
sgMagList: TStringGrid;
sgSymbList: TStringGrid;
sgMagStart: TStringGrid;
Panel8: TPanel;
sgGood: TStringGrid;
Label5: TLabel;
rgWhatAdd: TRadioGroup;
Panel9: TPanel;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tsAddShow(Sender: TObject);
procedure tsEditShow(Sender: TObject);
procedure buStartAddClick(Sender: TObject);
procedure buStartDelClick(Sender: TObject);
procedure alCreateNewExecute(Sender: TObject);
procedure cbStartingStChange(Sender: TObject);
procedure buCellEditClick(Sender: TObject);
procedure sgGoodSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure buSymbAddClick(Sender: TObject);
procedure buDelSymbClick(Sender: TObject);
procedure buClearClick(Sender: TObject);
procedure buCheckClick(Sender: TObject);
procedure PaintMP;
procedure ChangeGood(i,j:integer);
procedure dgMPDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure alRepaintExecute(Sender: TObject);
procedure dgMPTopLeftChanged(Sender: TObject);
procedure dgMPSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure alSaveExecute(Sender: TObject);
procedure alLoadExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure buStopTraceClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Step;
procedure SetTrace;
procedure buNextStepClick(Sender: TObject);
procedure alExitExecute(Sender: TObject);
procedure alHelpExecute(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainPr: TMainPr;
MP:TMPRasp;
Color1:Integer=clRed;
Color2:Integer=clWhite;
Color3:Integer=clYellow;
Color4:Integer=clFuchsia;
implementation
uses EditUn, AboutUn;
const CellSize=60;
LineEnd='¶';
drx=4;
dry=4;
Ready:boolean=false;
StepOver:boolean=false;
Num1=4;
TracePar:array [1..Num1] of String=
('Номер символа в строке : ',
'Символ : ',
'Текущее состояние : ',
'Верхний символ магазина : ');
SaveDir='Save';
PicturesDir='Pictures';
var DrawSt,DrawMg,DrawSmb:boolean;
tmp:TBitmap;
TempParams:TSaveMP;
initialdir:string;
St,tt,ss:word;
TraceResult:boolean;
SymbI:integer;
Chain:string;
{$R *.DFM}
procedure TMainPr.FormClose(Sender: TObject; var Action: TCloseAction);
var MDR:integer;
begin
if Ready then begin
MDR:=MessageDlg('Сохранить текущий МП-транслятор?',mtConfirmation,[mbYes,mbNo,mbCancel],0);
if MDR<>MrCancel then begin
if MDR=mrYes then alSaveExecute(Sender);
Mp.Del;
Mp.Free;
TMP.free;
Ready:=false;
end
else Action:=caNone;
end;
end;
procedure TMainPr.tsAddShow(Sender: TObject);
var i,j:byte;
begin
if Ready then begin
with mp.params do begin
sgGood.ColCount:=MagSymbNum+1;
sgGood.RowCount:=StateNum+1;
for j:=1 to StateNum do
sgGood.cells[0,j]:='S'+inttostr(j);
for i:=1 to MagSymbNum do begin
sgGood.cells[i,0]:=MagSymbols[i];
for j:=1 to StateNum do begin
if MP.Good[j,i] then
sgGood.Cells[i,j]:='Доп.'
else
sgGood.Cells[i,j]:='Отв.'
end;
end;
end;
lbStNum.caption:=inttostr(Mp.Params.StateNum);
lbFirstSt.caption:=inttostr(Mp.Params.StartingState);
sgMagList.colcount:=mp.Params.MagSymbNum;
sgSymbList.colcount:=mp.Params.SymbNum+1;
sgMagStart.ColCount:=length(mp.params.StartingMagState);
for i:=1 to mp.Params.MagSymbNum do begin
sgMagList.Cells[i-1,0]:=mp.Params.MagSymbols[i];
end;
if Mp.Params.SymbNum=0 then sgSymbList.Cells[0,0]:=LineEnd
else
for i:=1 to mp.Params.SymbNum do begin
sgSymbList.Cells[i,0]:=mp.Params.Symbols[i];
end;
for i:=1 to Length(mp.Params.StartingMagState) do begin
sgMagStart.Cells[i-1,0]:=mp.Params.StartingMagState[i];
end;
end;
end;
procedure TMainPr.tsEditShow(Sender: TObject);
var i:byte;
begin
if Ready then begin
With MP.Params do begin
sgStartMag.ColCount:=length(StartingMagState);
for i:=1 to Length(StartingMagState) do begin
sgStartMag.Cells[i-1,0]:=StartingMagState[i];
end;
if DrawSt then begin
cbStartingSt.items.clear;
for i:=1 to StateNum do begin
cbStartingst.items.add('S'+inttostr(i));
end;
cbStEd.items.clear;
cbStartingst.ItemIndex:=StartingState-1;
cbStartingst.text:=cbStartingst.items[cbStartingst.ItemIndex];
for i:=1 to StateNum do begin
cbStEd.items.add('S'+inttostr(i));
end;
cbStEd.ItemIndex:=StartingState-1;
cbStEd.text:=cbStEd.items[cbStEd.ItemIndex];
end;
if DrawMg then begin
cbMagStEd.items.clear;
for i:=1 to MagSymbNum do begin
cbMagStEd.items.add(MagSymbols[i]);
end;
cbMagStEd.text:=cbMagStEd.items[0];
end;
if DrawSmb then begin
cbSymbEd.items.clear;
for i:=1 to SymbNum do begin
cbSymbEd.items.add(Symbols[i]);
end;
cbSymbEd.text:=cbSymbEd.items[0];
end;
end;
DrawSt:=false;
DrawMg:=false;
DrawSmb:=false;
end;
end;
procedure TMainPr.buStartAddClick(Sender: TObject);
var MR:word;
begin
if ready then begin
WhatAdd:=MgA;
Send:=copy(Mp.Params.MagSymbols,2,Length(Mp.Params.MagSymbols));
MR:=Adding.ShowModal;
if MR=100 then begin
MP.Params.StartingMagState:=Mp.Params.StartingMagState+res;
end;
tsEdit.Hide;
tsEdit.Show;
end;
end;
procedure TMainPr.buStartDelClick(Sender: TObject);
begin
if ready then begin
if length(Mp.Params.StartingMagState)>1 then begin
Mp.Params.StartingMagState:=
copy(Mp.Params.StartingMagState,1,Length(Mp.Params.StartingMagState)-1);
end;
tsEdit.Hide;
tsEdit.Show;
end;
end;
procedure TMainPr.alCreateNewExecute(Sender: TObject);
label 1;
var c:word;
begin
if not ready then begin
Ready:=true;
1: MP:=TMPRasp.Create;
lbResult.Caption:='';
mmNotes.Clear;
Mp.Init;
tsAdd.Hide;
tsAdd.show;
DrawSt:=true;
DrawMg:=true;
DrawSmb:=true;
TMP:=TBitmap.create;
mmNotes.text :='';
plChain.Text:='';
dgMP.DefaultColWidth:=CellSize;
dgMP.DefaultRowHeight:=CellSize;
paintMP;
end
else begin
c:=MessageDlg('Сохранить файл?',mtConfirmation,[mbYes,mbNo,mbCancel],0);
case c of
mrYes : begin
alSaveExecute(Sender);
goto 1;
end;
mrNo : begin
goto 1;
end;
mrCancel : begin
;
end;
end;
end;
end;
procedure TMainPr.cbStartingStChange(Sender: TObject);
begin
if ready then begin
if cbStartingSt.ItemIndex<>-1 then
Mp.Params.StartingState:=cbStartingSt.ItemIndex+1;
end;
end;
procedure TMainPr.buCellEditClick(Sender: TObject);
var MR:integer;
begin
if ready then begin
ii:=cbStEd.ItemIndex+1;
if length(trim(cbMagStEd.text))=1 then
jj:=mp.MagSymbPos(cbMagStEd.text[1]);
if length(trim(cbSymbEd.text))=1 then
kk:=mp.SymbPos(cbSymbEd.text[1]);
if (ii>0) and (jj>0) and (kk>0) then begin
Mr:=Editing.ShowModal;
if mr=111 then begin
PaintMP;
mp.cell[ii,jj,kk]:=temp;
end;
end
else
MessageDlg('Неверно определена ячейка!'
,mtWarning,[mbOk],0);
end;
end;
procedure TMainPr.sgGoodSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
ChangeGood(ARow,ACol);
sgGood.Hide;
sgGood.Show;
end;
procedure TMainPr.buSymbAddClick(Sender: TObject);
var MR:Integer;
begin
if ready then begin
WhatAdd:=SmbA;
Send:=copy(Mp.Params.Symbols,1,Length(Mp.Params.Symbols));
MR:=Adding.ShowModal;
if MR=100 then begin
plChain.Text:=plChain.Text+res;
lbResult.Caption:='';
end;
tsCheck.Hide;
tsCheck.Show;
end;
end;
procedure TMainPr.buDelSymbClick(Sender: TObject);
begin
plChain.Text:=copy(plChain.Text,1,Length(plChain.Text)-1);
lbResult.Caption:='';
end;
procedure TMainPr.buClearClick(Sender: TObject);
begin
plChain.Text:='';
lbResult.Caption:='';
end;
procedure TMainPr.buCheckClick(Sender: TObject);
var s:string;
i:integer;
ok:boolean;
begin
if Ready then begin
s:=plChain.Text;
if Length(s)=0 then begin
MessageDlg('Не введена цепочка',mtWarning,[mbOk],0);
plChain.SetFocus;
end
else begin
ok:=true;
for i:=1 to length(s) do begin
if pos(s[i],MP.Params.Symbols)=0 then ok:=false;
end;
if ok then begin
case rgCheck.ItemIndex of
0: begin
if Mp.CheckChain(s) then
s:='ДОПУСК '
else
s:='НЕТ ДОПУСКА';
MessageDlg(s+' цепочки',mtinformation,[mbOk],0);
lbResult.Caption:=S;
end;
1: begin
if plChain.Text<>'' then begin
tsEdit.enabled:=false;
bucheck.Enabled:=false;
buSymbAdd.Enabled:=false;
buDelSymb.Enabled:=false;
buClear.Enabled:=false;
buNextStep.Enabled:=True;
buStopTrace.Enabled:=True;
plChain.enabled:=false;
StepOver:=True;
plStData.Caption:='';
TempParams.Params:=Mp.Params;
TempParams.Good:=Mp.Good;
TempParams.cell:=Mp.Cell;
lbStep.Items.Clear;
With MP do begin
SymbI:=1;
TraceResult:=false;
State:=Params.StartingState;
Chain:=plChain.Text;
Stack.Init(Params.StartingMagState);
Ss:=SymbPos(Chain[SymbI]);
tt:=MagSymbPos(Stack.Top);
St:=State;
end;
SetTrace;
PaintMP;
end;
end;
end;
end
else begin
MessageDlg('Некоторые символы строки не соответствуют алфавиту',mtWarning,[mbOk],0);
plChain.SetFocus;
end;
end;
end;
end;
procedure TMainPr.PaintMP;
begin
if Ready then
with MP.Params do begin
dgMP.ColCount:=SymbNum+3;
dgMp.RowCount:=StateNum*MagSymbNum+1;
dgMP.hide;
dgMP.Show;
end;
end;
procedure TMainPr.dgMPDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var a:trect;
x,y,y1,y2:word;
s,D:string;
TC:TMPCell;
begin
if ready then begin
a.Left:=1;
a.Top:=1;
a.Right:=CellSize;
a.Bottom:=CellSize;
tmp.Height:=Cellsize;
tmp.width:=Cellsize;
x:=Acol-1;
y:=ARow;
with mp.params do begin
if y mod MagSymbNum = 0 then
y1:=y div MagSymbNum
else y1:=(y div MagSymbNum)+1;
if y mod MagSymbNum = 0 then
y2:=MagSymbNum