Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснювальна записка.docx
Скачиваний:
5
Добавлен:
30.08.2019
Размер:
366.14 Кб
Скачать

Додаток б

Лістинг програми

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, AdvEdit, Grids, AdvObj, BaseGrid, AdvGrid, ValEdit, Buttons,

Menus, ToolWin, ActnMan, ActnCtrls, ImgList, ComCtrls, AdvTrackBar,

DBAdvTrackBar, ExtDlgs, AdvGlowButton, AdvGlassButton, AdvSmoothTrackBar,Unit2;

type

TForm1 = class(TForm)

Tape: TAdvStringGrid;

StringGrid: TAdvStringGrid;

TapePopupMenu: TPopupMenu;

N1: TMenuItem;

N2: TMenuItem;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

Alphabet: TAdvEdit;

StartState: TAdvEdit;

StatusBar1: TStatusBar;

GroupBox3: TGroupBox;

TrackBar: TTrackBar;

Label1: TLabel;

FinalState: TAdvEdit;

StringGrigPopupMenu: TPopupMenu;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

OpenTextFileDialog1: TOpenTextFileDialog;

ClearNSteps: TAdvGlowButton;

ChangeCurrent2: TAdvGlowButton;

ChangeCurrent1: TAdvGlowButton;

AddCommand: TAdvGlowButton;

RemoveCommand: TAdvGlowButton;

CrearStringGrigButton: TAdvGlowButton;

ReadFile: TAdvGlowButton;

CrearTapeButton: TAdvGlowButton;

ChangePosButton: TAdvGlowButton;

StartMT: TAdvGlowButton;

StepButton: TAdvGlowButton;

StopMT: TAdvGlowButton;

AdvEdit1: TAdvEdit;

AdvGlowButton1: TAdvGlowButton;

Button1: TButton;

AdvGlowButton2: TAdvGlowButton;

Memo1: TMemo;

AdvEdit2: TAdvEdit;

Memo2: TMemo;

procedure FormCreate(Sender: TObject);

procedure TapeKeyPress(Sender: TObject; var Key: Char);

procedure ChangeCurrPos(NewPos:integer);

procedure TapeClipboardBeforePasteCell(Sender: TObject; ACol, ARow: Integer;

var Value: string; var Allow: Boolean);

procedure StringGridClipboardBeforePasteCell(Sender: TObject; ACol,

ARow: Integer; var Value: string; var Allow: Boolean);

procedure N1Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure ClearTape();

procedure ClearStringGrid();

procedure StartMTClick(Sender: TObject);

procedure DisableControls();

procedure StopMTClick(Sender: TObject);

procedure ChangePosButtonClick(Sender: TObject);

procedure Work(n:integer);

function InString(c:char;s:string):boolean;

procedure StepButtonClick(Sender: TObject);

procedure StringGridKeyPress(Sender: TObject; var Key: Char);

function GetWord(Str, Smb: string; WordNmbr: Byte): string;

procedure N4Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure ChangeCurrent2Click(Sender: TObject);

procedure ChangeCurrent1Click(Sender: TObject);

procedure AddCommandClick(Sender: TObject);

procedure RemoveCommandClick(Sender: TObject);

procedure CrearStringGrigButtonClick(Sender: TObject);

procedure ReadFileClick(Sender: TObject);

procedure ClearNStepsClick(Sender: TObject);

procedure AdvGlowButton1Click(Sender: TObject);

procedure CrearTapeButtonClick(Sender: TObject);

procedure AdvGlowButton2Click(Sender: TObject);

procedure ArrangementRep(Nabor: string; Place: Integer);

function itoabc(i: Integer):string;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

CurrPos,nsteps,M: integer;

CurrState: string;

stop,stopgen:boolean;

List : Array[1..20] of string;

implementation

{$R *.dfm}

procedure TForm1.TapeClipboardBeforePasteCell(Sender: TObject; ACol,

ARow: Integer; var Value: string; var Allow: Boolean);

begin

if InString(Value[1],Alphabet.Text) then

Value:=Value[1]

else

allow:=false;

end;

procedure TForm1.TapeKeyPress(Sender: TObject; var Key: Char);

begin

if InString(Key,Alphabet.Text) then

Tape.CurrentCell:=Key

else

if Key=#8 then

Tape.CurrentCell:='';

Tape.Select;

end;

function TForm1.GetWord(Str, Smb: string; WordNmbr: Byte): string;

var

SWord: string;

StrLen, N: Byte;

begin

StrLen := SizeOf(Str);

N:=1;

while ((WordNmbr>=N) and (StrLen<>0)) do

begin

StrLen:=Pos(Smb,str);

if StrLen<>0 then

begin

SWord:=Copy(Str,1,StrLen-1);

Delete(Str,1,StrLen);

Inc(N);

end

else

SWord:=Str;

end;

if WordNmbr<=N then

Result:=SWord

else

Result:='';

end;

procedure TForm1.Work(n:integer);

var finded:boolean;

i: integer;

sss:string;

begin

stop:=false;

Memo2.Clear;

sss:='q'+CurrState+' ';

for i:=0 to 2999 do

begin

if (Tape.Cells[i,0]<>'') and (Tape.Cells[i,0]<>' ') then

if i<>currpos then

sss:=sss+Tape.Cells[i,0]

else

sss:=sss+'['+Tape.Cells[i,0]+']';

end;

Memo2.Lines.Add(sss);

if n>0 then

StatusBar1.Panels.Items[0].Text:='Машина Тьюринга работает';

while (CurrState<>FinalState.Text) and (stop<>true) do

begin

if (n>0) and (TrackBar.Position>0) then

begin

sleep(TrackBar.Position);

Application.ProcessMessages;

end

else

if n=-1 then

stop:=true;

finded:=false;

for i:=1 to StringGrid.RowCount-1 do

begin

if (StringGrid.Cells[0,i]<>'') and (StringGrid.Cells[2,i]<>'') and (StringGrid.Cells[4,i]<>'') then

if (CurrState=StringGrid.Cells[0,i]) and (Tape.Cells[CurrPos,0]=StringGrid.Cells[1,i]) then

begin

Tape.Cells[CurrPos,0]:=StringGrid.Cells[3,i];

if (StringGrid.Cells[4,i]='l') or (StringGrid.Cells[4,i]='L') then

ChangeCurrPos(CurrPos-1)

else

if (StringGrid.Cells[4,i]='r') or (StringGrid.Cells[4,i]='R') then

ChangeCurrPos(CurrPos+1);

CurrState:=StringGrid.Cells[2,i];

StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;

inc(nsteps);

StatusBar1.Panels.Items[2].Text:='Сделано шагов: '+inttostr(nsteps);

finded:=true;

break;

end;

end;

sss:='q'+CurrState+' ';

for i:=0 to 2999 do

begin

if (Tape.Cells[i,0]<>'') and (Tape.Cells[i,0]<>' ') then

if i<>currpos then

sss:=sss+Tape.Cells[i,0]

else

sss:=sss+'['+Tape.Cells[i,0]+']';

end;

Memo2.Lines.Add(sss);

if not finded then

begin

ShowMessage('Ошибка! Не найдена команда!');

stop:=true;

end;

if (CurrPos<0) or (CurrPos>2999) then

begin

ShowMessage('Ошибка! Лента хоть и бесконечная, но закончилась :)');

stop:=true;

end;

Tape.Refresh;

end;

StatusBar1.Panels.Items[0].Text:='Машина Тьюринга готова к запуску';

Memo2.Lines.SaveToFile('_sss.txt');

end;

procedure TForm1.StartMTClick(Sender: TObject);

begin

DisableControls();

Work(1);

DisableControls();

end;

function TForm1.InString(c:char;s:string):boolean;

var i:integer;

begin

Result:=false;

for i:=1 to length(s) do

begin

if c=s[i] then

begin

Result:=True;

break;

end;

end;

end;

procedure TForm1.StepButtonClick(Sender: TObject);

begin

Work(-1);

end;

procedure TForm1.StopMTClick(Sender: TObject);

begin

stop:=true;

end;

procedure TForm1.ChangePosButtonClick(Sender: TObject);

begin

ChangeCurrPos(Tape.Selection.Left);

end;

procedure TForm1.AddCommandClick(Sender: TObject);

begin

StringGrid.InsertRows(StringGrid.Selection.Top+1,1);

StringGrid.SelectCells(0,StringGrid.Selection.Top+1,0,StringGrid.Selection.Top+1);

StringGrid.ScrollInView(0,StringGrid.Selection.Top);

StringGrid.Refresh;

end;

procedure TForm1.RemoveCommandClick(Sender: TObject);

begin

StringGrid.RemoveSelectedRows;

end;

procedure TForm1.CrearStringGrigButtonClick(Sender: TObject);

begin

ClearStringGrid();

end;

procedure TForm1.CrearTapeButtonClick(Sender: TObject);

begin

ClearTape();

end;

procedure TForm1.ReadFileClick(Sender: TObject);

var

myFile : TextFile;

str1,word : string;

i: byte;

begin

if OpenTextFileDialog1.Execute then

begin

ClearStringGrid();

AssignFile(myFile,OpenTextFileDialog1.FileName);

ReSet(myFile);

ReadLn(myFile, str1);

Alphabet.Text:=str1;

while not Eof(myFile) do

begin

ReadLn(myFile, str1);

for i:=0 to 4 do

begin

word:=GetWord(str1,' ',i+1);

if i in [0,2] then

StringGrid.Cells[i,StringGrid.RowCount-1]:=word

else

if ((i in [1,3]) and (word='[space]')) or ((i=4) and not InString(word[1],'lreLRE')) then

StringGrid.Cells[i,StringGrid.RowCount-1]:=''

else

StringGrid.Cells[i,StringGrid.RowCount-1]:=word[1];

end;

StringGrid.AddRow;

end;

CloseFile(myFile);

StringGrid.RemoveRows(StringGrid.RowCount-1,1);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.Top:=Form1.Top;

Form2.Left:=Form1.Left+Form1.Width+15;

if Form2.Visible then

Form2.Hide

else

Form2.Show;

end;

procedure TForm1.ArrangementRep(Nabor: string; Place: Integer);

var

i: Integer;

begin

if Place > M then

begin

Memo1.Lines.Add(Nabor);

end

else

for i := 1 to length(AdvEdit1.Text) do

begin

Application.ProcessMessages();

ArrangementRep(Nabor + itoabc(i), Place + 1);

end;

end;

function TForm1.itoabc(i: Integer):string;

var abc:string;

begin

abc:=AdvEdit1.Text;

Result:=abc[i];

end;

procedure TForm1.AdvGlowButton1Click(Sender: TObject);

var t:int64;

i,j,nmax:integer;

abc:string;

//t:TDateTime;

begin

DisableControls();

AdvGlowButton1.Enabled:=not AdvGlowButton1.Enabled;

AdvGlowButton2.Enabled:=not AdvGlowButton2.Enabled;

AdvEdit1.Enabled:=not AdvEdit1.Enabled;

AdvEdit2.Enabled:=not AdvEdit2.Enabled;

StopMT.Enabled:=not StopMT.Enabled;

stopgen:=false;

t:=GEtTIckCount;

M:=0;

Form2.EasyGraph1.Series[0].Clear;

Form2.EasyGraph1.Series[1].Clear;

while ((GetTickCount-t)<(strtofloat(AdvEdit2.Text)*60000)) and (stopgen=false) do

begin

Memo1.Clear;

ArrangementRep('', 1);

nmax:=0;

i:=0;

while (i<Memo1.Lines.Count) and ((GetTickCount-t)<(strtofloat(AdvEdit2.Text)*60000)) and (stopgen=false) do

begin

Application.ProcessMessages();

ClearNStepsClick(Sender);

ChangeCurrent1Click(Sender);

ClearTape();

abc:=Memo1.Lines[i];

for j:=1 to length(abc) do

begin

Tape.Cells[CurrPos+j-1,0]:=abc[j];

end;

Work(1);

if nsteps>nmax then

nmax:=nsteps;

if stopgen=true then

break;

inc(i);

end;

Form2.EasyGraph1.Series[0].Add(M,nmax);

inc(M);

end;

AdvGlowButton1.Enabled:=not AdvGlowButton1.Enabled;

AdvGlowButton2.Enabled:=not AdvGlowButton2.Enabled;

AdvEdit1.Enabled:=not AdvEdit1.Enabled;

StopMT.Enabled:=not StopMT.Enabled;

AdvEdit2.Enabled:=not AdvEdit2.Enabled;

DisableControls();

end;

procedure TForm1.AdvGlowButton2Click(Sender: TObject);

begin

stopgen:=true;

end;

procedure TForm1.ChangeCurrent1Click(Sender: TObject);

begin

CurrState:=StartState.Text;

StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;

end;

procedure TForm1.ChangeCurrent2Click(Sender: TObject);

begin

CurrState:=FinalState.Text;

StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;

end;

procedure TForm1.ChangeCurrPos(NewPos:integer);

begin

Tape.ColorsTo[CurrPos,0]:=clNone;

CurrPos:=NewPos;

Tape.ColorsTo[CurrPos,0]:=clGray;

end;

procedure TForm1.ClearTape();

begin

Tape.Clear;

CurrPos:=1500;

Tape.ScrollInView(CurrPos,0);

Tape.ColorsTo[CurrPos,0]:=clGray;

end;

procedure TForm1.ClearNStepsClick(Sender: TObject);

begin

nsteps:=0;

StatusBar1.Panels.Items[2].Text:='Сделано шагов: '+inttostr(nsteps);

end;

procedure TForm1.ClearStringGrid();

begin

StringGrid.RemoveRows(2,StringGrid.RowCount-2);

StringGrid.ClearRows(1,1);

end;

procedure TForm1.DisableControls();

begin

AddCommand.Enabled:=not AddCommand.Enabled;

RemoveCommand.Enabled:=not RemoveCommand.Enabled;

ReadFile.Enabled:=not ReadFile.Enabled;

Tape.Enabled:=not Tape.Enabled;

StringGrid.Enabled:=not StringGrid.Enabled;

StartMT.Enabled:=not StartMT.Enabled;

StartState.Enabled:=not StartState.Enabled;

FinalState.Enabled:=not FinalState.Enabled;

StopMT.Enabled:=not StopMT.Enabled;

ChangePosButton.Enabled:=not ChangePosButton.Enabled;

CrearTapeButton.Enabled:=not CrearTapeButton.Enabled;

StepButton.Enabled:=not StepButton.Enabled;

TrackBar.Enabled:=not TrackBar.Enabled;

TrackBar.Enabled:=not TrackBar.Enabled;

ChangeCurrent1.Enabled:=not ChangeCurrent1.Enabled;

ChangeCurrent2.Enabled:=not ChangeCurrent2.Enabled;

CrearStringGrigButton.Enabled:=not CrearStringGrigButton.Enabled;

ClearNSteps.Enabled:=not ClearNSteps.Enabled;

Alphabet.Enabled:=not Alphabet.Enabled;

end;

procedure TForm1.StringGridClipboardBeforePasteCell(Sender: TObject; ACol,

ARow: Integer; var Value: string; var Allow: Boolean);

begin

if ((StringGrid.Selection.Left in [1,3]) and (InString(Value[1],Alphabet.Text))) or ((StringGrid.Selection.Left in [4]) and (InString(Value[1],'lreLRE'))) or (StringGrid.Selection.Left in [0,2]) then

Value:=Value[1]

else

allow:=false;

end;

procedure TForm1.StringGridKeyPress(Sender: TObject; var Key: Char);

begin

if ((StringGrid.Selection.Left in [1,3,4]) and (length(StringGrid.CurrentCell)>0)) or ((StringGrid.Selection.Left in [1,3]) and not InString(Key,Alphabet.Text)) or ((StringGrid.Selection.Left in [4]) and not (InString(Key,'lreLRE'))) then

if (Key<>#8) and (Key<>#3) and (Key<>#22) then

Key:=#0;

Tape.Select;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

ClearTape();

StringGrid.Cells[0,0]:='q';

StringGrid.Cells[1,0]:='a';

StringGrid.Cells[2,0]:='q''';

StringGrid.Cells[3,0]:='a''';

StringGrid.Cells[4,0]:='V';

CurrState:=StartState.Text;;

StatusBar1.Panels.Items[1].Text:='Текущее состояние: '+CurrState;

nsteps:=0;

StatusBar1.Panels.Items[2].Text:='Сделано шагов: '+inttostr(nsteps);

end;

procedure TForm1.N1Click(Sender: TObject);

begin

ChangeCurrPos(Tape.Selection.Left);

end;

procedure TForm1.N2Click(Sender: TObject);

begin

ClearTape();

end;

procedure TForm1.N3Click(Sender: TObject);

begin

RemoveCommandClick(Sender);

end;

procedure TForm1.N4Click(Sender: TObject);

begin

AddCommandClick(Sender);

end;

procedure TForm1.N5Click(Sender: TObject);

begin

ClearStringGrid();

end;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, EasyGraph, StdCtrls;

type

TForm2 = class(TForm)

EasyGraph1: TEasyGraph;

Button1: TButton;

Edit1: TEdit;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);

begin

EasyGraph1.Series[1].Func:=Edit1.Text;

end;

procedure TForm2.FormCreate(Sender: TObject);

begin

EasyGraph1.VisRect:=Rect2D (-1,-1,9,60);

Form2.EasyGraph1.Series.Add;

Form2.EasyGraph1.Series.Add;

Form2.EasyGraph1.Series[1].Color:=clBlue;

end;

end.

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСІТЕТ

КАФЕДРА КОМП’ЮТЕРНИХ СИСТЕМ МОНІТОРИНГУ

ПОЯСНЮВАЛЬНА ЗАПИСКА ДО КУРСОВОГО ПРОЕКТУ

ПО КУРСУ «ТЕОРІЯ АЛГОРИТМІВ І ФОРМАЛЬНИХ МОВ»