Реферат по предмету "Информатика, программирование"


Программа–конструктор для построения МП–транслятора по его параметрам с последующей проверкой задаваемых пользователем цепочек

СОДЕРЖАНИЕ
Задание
Реферат
Введение
1 Теоретические и практические основы разрабатываемойтемы
1.1 Теорияконечных автоматов
1.2 Областиприкладного применения теории конечных автоматов
2 Разработка программного продукта
2.1 Современные требования к программнымпродуктам
2.2 Предполагаемая структураразрабатываемого ПП
2.3 Обоснование выбора средств реализации
2.4 Функциональная схема ( блок-схема )
2.5 Алгоритм реализации основной функции ПП
2.6Иерархия экранных форм
2.7 Систему контроля неквалифицированныхдействий пользователя
3 Руководство пользователя, инструкция поинсталляции
3.1 Требования к аппаратным средствам
Выводы
Список литературы
Приложение А
 

РЕФЕРАТ
Курсовая работа по дисциплине «Основы дискретной математики» натему: « Программа – конструктор для построения МП – транслятора по егопараметрам с последующей проверкой задаваемых пользователем цепочек»
В работерассмотрен вопрос построения автоматов-трансляторов с магазинной памятью, проверкойзадаваемых цепочек. Программу можно использовать в учебных целях, дляпостроения автоматов с последующим использованием созданных файлов в другихприложениях, создаваемых с помощью среды программирования Delphi.Работа посвящена изучению такого разделадискретной математики, как автоматы-трансляторы с магазинной памятью. На основеполученных знаний разработан программный продукт, реализующий построение МП-трансляторапутем задания управляющей таблицы.При работе приложение позволяет пользователюпостроить транслятор. Затем пользователь может выполнить проверку цепочки. Еслипользователь изучит теоретический материал, то работа не вызовет большогозатруднения. Теоретический материал излагается ниже в записке, а также вреализованной справочной службы программы. Работа программного продуктареализована достаточно наглядно, что делает его пригодным для использования егов целях более качественного обучения студентов по указанному выше разделудискретной математики.
Ключевыеслова:
дискретнаяматематика, МП-транслятор, управляющая таблица, входная цепочка, выходнаяцепочка.
Введение
 
В настоящее времякомпьютеры все чаще используются не только для обработки данных и уточненияпараметров моделей, но и для постановки компьютерного эксперимента, во многихслучаях призванного заменить дорогостоящий натурный эксперимент. Поэтомудальнейшее развитие математического моделирования связано с применениемсовременных средств компьютерной математики как инструмента подготовкивысококвалифицированных специалистов, построения содержательных моделей,накопления и хранения информации, полученной в результате исследования этихмоделей, т.е. с разработкой новых информационных технологий для образования инаучных исследований.
Развитиенаучно-технического прогресса ведет к росту потребности в технических,математических и иных расчетах, в соответствующих программных продуктах. Непоследнее место в научных исследованиях занимает математическое моделирование сприменением информационных технологий. В электротехнике и электронике широкоиспользуют MathCAD для проектирования всевозможные процессов, импульсов, сигналов.
         Такжематематическое моделирование используется в металлургических направлениях. Вчастности в ДГМА производится математическое моделирование горячей и холоднойпрокатки на языке PASCAL. Производится математическое моделирование процессапереворачивания сталеразливочных ковшей, расчет механических свойств разныхметаллов и сплавов в условиях холодной деформации, анализ влияния выходныхпараметров процесса холодной прокатки на величину основных энергосиловыхпараметров.
В связи с широкимраспространением быстродействующих электронно-вычислительных машин главнойзадачей математического моделирования стала задача обеспечения интерактивностивзаимодействия исследователя с моделируемым объектом, в том числе, в реальномвремени. В научных исследованиях это сводится к определению архитектуры исостава программно аппаратных средств интерфейса пользователя, предварительнойобработке исходных данных с учетом их амплитуды, частотных и временныххарактеристик, идентификации, прогнозированию и управлению, исследуемымобъектом. Научные достижения включают методики разработки инструментальныхсредств и ряд алгоритмов для обеспечения человеко-машинного интерфейса,предварительной обработки данных и идентификации нелинейных динамическихсистем, визуализации полученных результатов.
 

Реферат
Дискретнаяматематика–раздел математики, занимающийся изучением свойств объектов конечного характера.
Дискретнаяматематика включает в себя такие разделы как множества, алгебра высказываний, теорияконечных автоматов, теория графов.
Вэтой курсовой работе будет предпринята попытка раскрыть как можно шире понятие автоматов-трансляторовс магазинной памятью.
Delphi является одним из наиболее быстрых средств для реализациипоставленной задачи (написание кода программы и визуальное создание вида программызанимают очень короткий промежуток времени по сравнению с другими языками).
Однако основнаяценность приложения – алгоритмическая поддержка. С одной стороны разработкакачественного интерфейса заметно облегчается при использовании сред визуальногопрограммирования, а с другой стороны для разработки завершенных корректныхприложений необходима теоретическая база.
Приразработке программного продукта использовалась интегрированная среда Delphi 6.

1 Теоретические и практические основыразрабатываемой темы
 
1.1  Теория конечных автоматов
 
Конечный автомат(вдальнейшем КА) — абстрактное вычислительное устройство с фиксированным иконечным объемом памяти, которое на входе читает цепочки(последовательностисимволов некоторого алфавита), а на выходе сообщает об их принадлежности к некоторомумножеству, для распознания которого он построен.
По сути КА работает какфильтр, который пропускает «правильные» цепочки. Другая трактовка КА- компактный алгоритм распознания регулярных, в том числе и бесконечных множеств,который строит программист перед началом кодирования (реализацией алгоритма наконкретном языке).
Далеко не для всех регулярныхмножеств можно построить
КА-распознаватель, так какКА не имеет возможности сосчитать и запомнить количество символовобрабатываемой цепочки. Для этой цели используется специальное устройство — магазин, в который можно помещать символы или удалять их, запоминая или сравниваяколичество символов входной цепочки. Такой автомат называется автоматомраспознавателем с магазинной памятью (сокращенно – МП-распознавателем).
Но в ряде случаев при обработке регулярного множества необходимоего преобразование в другое множество. Такие действия может выполнятьМП-транслятор, на выходе которого будет формироваться выходная цепочка.
МП-транслятор задается :
1.Конечным множествомвходных символов (включая символ конца цепочки "¶").
2.Конечным множеством выходных символов.
3.Конечным множествоммагазинных символов (включая маркер дна магазина — '¤').
4.Конечным множествомсостояний.
5.Упpавляющей таблицей,котоpая каждой комбинации трех параметров: входной символ, магазинныйсимвол(верхний символ магазина), состояние — ставит в соответствие четырепараметра: действие с магазином, входным символом,/> состоянием и выходнымсимволом.
5.Hачальной конфигурацией(начальное состояние и начальное содеpжимое магазина).
6.Множеством допускающих конфигураций(комбинаций — состояние МП-транслятора и верхний символ магазина в момент,когда приходит символ «конец цепочки»).
Допускаемые операции надвходом:
1.Держать входной символ(Д).
2.Перейти к очередномусимволу (П).
Примечание: запрещенозапрашивать входной символ после прихода символа "¶"(«конеццепочки»).
Допускаемые операции надмагазином
1.Втолкнуть в магазинмагазинный символ, к примеру А (Вт.А).
2.Вытолкнуть из магазинаверхний символ, к примеру А (Выт.А).
3.Оставить магазин безизменений (О).
Ряд ячеек управляющейтаблицы может без деления на поля заполняться символом Е (состояние ошибки). ЕслиМП-транслятор попал в такое состояние, то обработка цепочки прекращается и такаяцепочка отвергается.
Результатом работы для МП-трансляторабудет сообщение «допустить» или «отвергнуть» и цепочкаполучаемая на выходе. Входная цепочка допускается МП-транслятором, если подвоздействием этой цепочки автомат, начавший работу в начальной конфигурации ( вначальном состоянии и с начальным содержимым магазина) приходит к допускающей конфигурациипосле поступления символа «конец цепочки», иначе цепочка отвергается.
Рассмотрим строение ячейки втаблице переходов МП-транслятора.
/>

Рис. 1 – вид ячейкиМП-транслятора
 
Построение МП-транслятора для распознания заданного множества цепочек- процесс творческий и неоднозначный. Теоретически для распознания одного итого же множества цепочек можно построить бесконечное множество КА. Описанныйвыше принцип распознания применим далеко не ко всякому регулярному множеству.
1.2  Области прикладного применения теории конечных автоматов
Принцип работы конечныхавтоматов различных уровней широко применяется в вычислительных устройствах,как на аппаратном, так и на программном уровнях: это компиляторы, трансляторыпрограмм, различные кодировщики, антивирусные программы и т.п. В принципеработу любой программы можно представить как работу цепочки конечных автоматовразличной сложности.

2         Разработка программного продукта
2.1Современные требования к программным продуктам
К современным программнымпродуктам (далее ПП) предъявляется ряд требований. Современные ПП должныобладать дружественным интерфейсом, позволяющим пользователю просто работать сприложением, а не теряться в догадках о назначении той или иной кнопки илидругого элемента управления. В идеале приложение должно очень корректно ипоследовательно “проводить” пользователя от этапа ввода данных до полученияконкретного результата. Приложение должно обладать развитой системой поддержкипользователя, а именно справочной подсистемой, грамотно изложенным руководствомпользователя и так далее. Для обеспечения этих и других требований используетсястандартизованный интуитивно понятный интерфейс, принятый во многих графическихоперационных системах, что позволяет пользователю начинать работу с приложениемне с изучения назначений его элементов управления, а непосредственно с изученияпредметной области, в которой функционирует приложение, с тем, чтобы сразупосле этого приступить к работе с приложением.
2.2Предполагаемая структура разрабатываемого ПППрежде, чем приступать к реализации приложения,необходимо спроектировать структуру разрабатываемого программного продукта.
Выбранная средаразработки основана на объектно-ориентированном языке (Object Pascal), что предполагаетпроектирование ПП в рамках объектно-ориентированной технологии.
В программе реализованыследующие объекты:
TMyStack – инкапсулирует свойстваи методы для организации и функционирования стека.
TMPrasp – инкапсулирует свойстваи методы для организации и функционирования МП-транслятора.
Остальные объекты,реализующие функциональность программы, созданы (с применением автоматизации) спомощью среды разработчика (IDE Delphi).
Модули :
DMKurs – главный модульорганизующий работу ПП (отрисовку, загрузку, сохранение, обработка введенныхданных)
Mpunit – создание объектаМП-транслятора и его функционирование.
AddUn – добавление различныхэлементов МП-транслятора
EditUn – редактирование ячейки.
Остальныеобъекты, реализующие функциональность программы, созданы (с применениемавтоматизации) с помощью среды разработчика (IDE Delphi). Структура ПП, реализованногосогласно выданного в рамках курсовой представлена на рисунке 2./>
/> /> /> /> /> /> /> />
Рис.2 –Структура программного продукта
 
После начала работы приложения пользователю предлагаетсядобавлять, а также изменять параметры МП-транслятора; редактировать ячейки;разбор цепочек с получением результата (предусмотрен пошаговый и автоматическийразбор, при пошаговом текущее состояние автомата отображается отдельно).При выборе средств разработки ПП необходимоучитывать изложенные выше требования. Сегодня приложения, работающие спользователем в диалоговом режиме, никого не удовлетворяют, так как они неимеют достаточной наглядности. Поэтому выбор средств разработки необходимо осуществлятьс точки зрения возможностей визуализации и обеспечения наглядности приложений,предоставляемых тем или иным средством разработки.
 
2.3 Обоснование выбора средств реализации
 
Длярешения поставленной задачи мною выбрано средство разработки Delphi версии 6.0 [4].Это средство использует технологию визуального программирования, что облегчаети ускоряет разработку графического пользовательского интерфейса и обеспечиваетвозможность сосредоточить при программировании усилия на реализации алгоритмаобработки данных и вычислений. Таким образом, выбранное средство разработкивыгодно отличается от различных диалектов алгоритмических языков высокогоуровня класса Pascal 6.0-7.0, С 3.0 и т.д.
Средисовременных средств визуального программирования (Visual Basic, Visual C++ и т.д.) Delphi выгодно отличается тем,что позволяет быстро создавать высокопроизводительные и мощные приложения. ХотяVisual Basic нашел широкий спрос ипомог открыть мир программирования для непрофессионалов, он не лишен многихпроблем. Основные из них – низкая производительность разрабатываемых приложенийпри их выполнении, недостаточная строгость языка. Т.к. Delphi была разработана позже Visual Basic, многие недостаткипоследнего средства разработки были устранены.
Поэтому, намой взгляд, Delphi является оптимальным выбором для создания мощных профессиональныхприложений.
 
2.4 Функциональная схема ( блок-схема )Функциональная схема разработанногопрограммного продукта приведена на рисунке 3./> /> /> /> /> /> /> />

/>                                                             нет
/>

                  
/>

                             да                                                                      
/>

Рис. 3 – Функциональнаясхема программного продукта
2.5Алгоритм реализации основнойфункции ПП
 
Основной функцией ППявляется функция CheckChain, находящаяся в модуле Mpunit, которая выдает результат разбора цепочки («Допуск», «Нетдопуска»).
Цепочка допускается если поприходу символа «конец цепочки» пара
«Состояние – магазинныйсимвол» находится в множестве допустимых состояний.
В функцию передается цепочкаалфавитных символов, подлежащая разбору, организовывается цикл в которомосуществляется переход между состояниями автомата по параметрам считываемым измассива ячеек. В случае если автомат переходит в состояние ошибки или достигаетсямаксимальное число итераций(50000) цикл прекращается и выдается сообщение о недопуске цепочки, цикл продолжается пока входным символом не будет символ концацепочки, если цикл был завершен нормально то организуется проверка, находитсяли состояние в котором закончил работу автомат среди допустимых, и выдаетсясоответствующее сообщение. Для реализации магазина создается объект типа TmyStack, который дает возможностьвталкивать цепочку магазинных символов, выталкивать верхний символ, заменятьверхний символ на цепочку, выдавать верхний символ.

2.6      Иерархия экранных форм
 
Главное окно
/>
Для создания нового МП-транслятора необходимо выбрать из меню файлНовый. Добавить символы, состояния, магазинные символы с помощью кнопкиДобавить.
/> />
В результате этих действий получим заготовку управляющей таблицы.Потом следует заполнить ячейки, для этого необходимо щелкнуть левой кнопкоймыши по ячейке. После этого появится окно редактирования ячейки.
Окно редактирования ячейки
/>
Заполнив таблицу, пользователь может проверить цепочку напринадлежность данному множеству для которого построен МП- транслятор. Дляэтого нужно щелкнуть на кнопке РАЗБОР ЦЕПОЧКИ и в окно РАЗБОР ввести разбираемуюцепочку. Вводимая цепочка должна содержать символы, используемые при построениитранслятора, иначе будет выведено сообщение
/>
Если не возникнет ошибка вводимых данных, будет получен результ:
цепочка допущена или нет и цепочка на выход.
/> />

2.7 Система контролянеквалифицированных действий пользователя
Для ввода данных в ПП в большинстве случаев организовывается выборвводимых данных из возможных. На экран выводится форма содержание которойзависит от вводимых ею данных, она имеет выпадающий список, содержащий данные,перед занесением этих данных в распознаватель организуется предпроцессоркоторый определяет возможен ли ввод. Таким способом осуществляется ввод новыхсимволов, магазинных символов(они добавляются если не содержатся в автомате),начального состояния автомата(символы вводимые пользователем должны содержатьсяв автомате). В случае разбора цепочек, также организовывается предпроцессор вкотором происходит проверка принадлежности вводимых данных алфавиту входныхсимволов. Во всех случаях возникновения ошибок появляется окно содержащеесообщение об ошибке.
 

3      Руководство пользователя, инструкция поинсталляции
 
3.1     Требования к аппаратным средствам
Для эффективной работыспроектированного программного комплекса необходимо выполнение следующихтребований к аппаратному и программному обеспечению:
·         CPU не ниже Pentium-133
·         8 Mb оперативной памяти(желательно 32 Mb)
·         минимум1Mb свободного дисковогопространства
·         1 Mb видеопамяти
·         операционнаясистема Windows 95/98/2000/NT.
·         Манипулятормышь.
Приложениебыло тестировано на следующих конфигурациях:
·        IntelCeleron 400, 32 Mb RAM, Windows 98
·        IntelPentium || Celeron 266, 64 Mb RAM, Windows 98
·        AMDK6 || 333, 64 Mb RAM, Windows NT 4.0
·        IntelPentium 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;
procedureFormClose(Sender: TObject; var Action: TCloseAction);
proceduretsAddShow(Sender: TObject);
proceduretsEditShow(Sender: TObject);
procedurebuStartAddClick(Sender: TObject);
procedurebuStartDelClick(Sender: TObject);
procedurealCreateNewExecute(Sender: TObject);
procedurecbStartingStChange(Sender: TObject);
procedurebuCellEditClick(Sender: TObject);
proceduresgGoodSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect:Boolean);
procedurebuSymbAddClick(Sender: TObject);
procedurebuDelSymbClick(Sender: TObject);
procedurebuClearClick(Sender: TObject);
procedurebuCheckClick(Sender: TObject);
procedurePaintMP;
procedureChangeGood(i,j:integer);
proceduredgMPDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect;State: TGridDrawState);
procedurealRepaintExecute(Sender: TObject);
procedure dgMPTopLeftChanged(Sender:TObject);
proceduredgMPSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect:Boolean);
procedurealSaveExecute(Sender: TObject);
procedurealLoadExecute(Sender: TObject);
procedureFormCreate(Sender: TObject);
procedurebuStopTraceClick(Sender: TObject);
procedureFormResize(Sender: TObject);
procedureStep;
procedureSetTrace;
procedurebuNextStepClick(Sender: TObject);
procedurealExitExecute(Sender: TObject);
procedurealHelpExecute(Sender: TObject);
procedureN5Click(Sender: TObject);
procedureButton1Click(Sender: TObject);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
var
MainPr:TMainPr;
MP:TMPRasp;
Color1:Integer=clRed;
Color2:Integer=clWhite;
Color3:Integer=clYellow;
Color4:Integer=clFuchsia;
implementation
uses EditUn,AboutUn;
constCellSize=60;
LineEnd='¶';
drx=4;
dry=4;
Ready:boolean=false;
StepOver:boolean=false;
Num1=4;
TracePar:array[1..Num1] of String=
('Номер символа в строке: ',
'Символ: ',
'Текущее состояние: ',
'Верхний символ магазина: ');
SaveDir='Save';
PicturesDir='Pictures';
varDrawSt,DrawMg,DrawSmb:boolean;
tmp:TBitmap;
TempParams:TSaveMP;
initialdir:string;
St,tt,ss:word;
TraceResult:boolean;
SymbI:integer;
Chain:string;
{$R *.DFM}
procedureTMainPr.FormClose(Sender: TObject; var Action: TCloseAction);
varMDR:integer;
begin
if Ready thenbegin
MDR:=MessageDlg('Сохранитьтекущий МП-транслятор?',mtConfirmation,[mbYes,mbNo,mbCancel],0);
ifMDRMrCancel then begin
if MDR=mrYesthen alSaveExecute(Sender);
Mp.Del;
Mp.Free;
TMP.free;
Ready:=false;
end
elseAction:=caNone;
end;
end;
procedureTMainPr.tsAddShow(Sender: TObject);
var i,j:byte;
begin
if Ready thenbegin
with mp.paramsdo begin
sgGood.ColCount:=MagSymbNum+1;
sgGood.RowCount:=StateNum+1;
for j:=1 toStateNum do
sgGood.cells[0,j]:='S'+inttostr(j);
for i:=1 toMagSymbNum do begin
sgGood.cells[i,0]:=MagSymbols[i];
for j:=1 toStateNum do begin
ifMP.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 tomp.Params.MagSymbNum do begin
sgMagList.Cells[i-1,0]:=mp.Params.MagSymbols[i];
end;
ifMp.Params.SymbNum=0 then sgSymbList.Cells[0,0]:=LineEnd
else
for i:=1 tomp.Params.SymbNum do begin
sgSymbList.Cells[i,0]:=mp.Params.Symbols[i];
end;
for i:=1 toLength(mp.Params.StartingMagState) do begin
sgMagStart.Cells[i-1,0]:=mp.Params.StartingMagState[i];
end;
end;
end;
procedureTMainPr.tsEditShow(Sender: TObject);
var i:byte;
begin
if Ready thenbegin
With MP.Paramsdo begin
sgStartMag.ColCount:=length(StartingMagState);
for i:=1 toLength(StartingMagState) do begin
sgStartMag.Cells[i-1,0]:=StartingMagState[i];
end;
if DrawSt thenbegin
cbStartingSt.items.clear;
for i:=1 toStateNum 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 toStateNum do begin
cbStEd.items.add('S'+inttostr(i));
end;
cbStEd.ItemIndex:=StartingState-1;
cbStEd.text:=cbStEd.items[cbStEd.ItemIndex];
end;
if DrawMg thenbegin
cbMagStEd.items.clear;
for i:=1 toMagSymbNum do begin
cbMagStEd.items.add(MagSymbols[i]);
end;
cbMagStEd.text:=cbMagStEd.items[0];
end;
if DrawSmbthen begin
cbSymbEd.items.clear;
for i:=1 toSymbNum do begin
cbSymbEd.items.add(Symbols[i]);
end;
cbSymbEd.text:=cbSymbEd.items[0];
end;
end;
DrawSt:=false;
DrawMg:=false;
DrawSmb:=false;
end;
end;
procedureTMainPr.buStartAddClick(Sender: TObject);
var MR:word;
begin
if ready thenbegin
WhatAdd:=MgA;
Send:=copy(Mp.Params.MagSymbols,2,Length(Mp.Params.MagSymbols));
MR:=Adding.ShowModal;
if MR=100 thenbegin
MP.Params.StartingMagState:=Mp.Params.StartingMagState+res;
end;
tsEdit.Hide;
tsEdit.Show;
end;
end;
procedureTMainPr.buStartDelClick(Sender: TObject);
begin
if ready thenbegin
iflength(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;
procedureTMainPr.alCreateNewExecute(Sender: TObject);
label 1;
var c:word;
begin
if not readythen 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;
procedureTMainPr.cbStartingStChange(Sender: TObject);
begin
if ready thenbegin
ifcbStartingSt.ItemIndex-1 then
Mp.Params.StartingState:=cbStartingSt.ItemIndex+1;
end;
end;
procedureTMainPr.buCellEditClick(Sender: TObject);
varMR:integer;
begin
if ready thenbegin
ii:=cbStEd.ItemIndex+1;
iflength(trim(cbMagStEd.text))=1 then
jj:=mp.MagSymbPos(cbMagStEd.text[1]);
iflength(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 thenbegin
PaintMP;
mp.cell[ii,jj,kk]:=temp;
end;
end
else
MessageDlg('Неверноопределена ячейка!'
,mtWarning,[mbOk],0);
end;
end;
procedureTMainPr.sgGoodSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect:Boolean);
begin
ChangeGood(ARow,ACol);
sgGood.Hide;
sgGood.Show;
end;
procedureTMainPr.buSymbAddClick(Sender: TObject);
varMR:Integer;
begin
if ready thenbegin
WhatAdd:=SmbA;
Send:=copy(Mp.Params.Symbols,1,Length(Mp.Params.Symbols));
MR:=Adding.ShowModal;
if MR=100 thenbegin
plChain.Text:=plChain.Text+res;
lbResult.Caption:='';
end;
tsCheck.Hide;
tsCheck.Show;
end;
end;
procedureTMainPr.buDelSymbClick(Sender: TObject);
begin
plChain.Text:=copy(plChain.Text,1,Length(plChain.Text)-1);
lbResult.Caption:='';
end;
procedureTMainPr.buClearClick(Sender: TObject);
begin
plChain.Text:='';
lbResult.Caption:='';
end;
procedureTMainPr.buCheckClick(Sender: TObject);
var s:string;
i:integer;
ok:boolean;
begin
if Ready thenbegin
s:=plChain.Text;
if Length(s)=0then begin
MessageDlg('Невведена цепочка',mtWarning,[mbOk],0);
plChain.SetFocus;
end
else begin
ok:=true;
for i:=1 tolength(s) do begin
ifpos(s[i],MP.Params.Symbols)=0 then ok:=false;
end;
if ok thenbegin
casergCheck.ItemIndex of
0: begin
ifMp.CheckChain(s) then
s:='ДОПУСК '
else
s:='НЕТ ДОПУСКА';
MessageDlg(s+'цепочки',mtinformation,[mbOk],0);
lbResult.Caption:=S;
end;
1: begin
ifplChain.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 dobegin
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;
procedureTMainPr.PaintMP;
begin
if Ready then
with MP.Paramsdo begin
dgMP.ColCount:=SymbNum+3;
dgMp.RowCount:=StateNum*MagSymbNum+1;
dgMP.hide;
dgMP.Show;
end;
end;
procedureTMainPr.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 thenbegin
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.paramsdo begin
if y modMagSymbNum = 0 then
y1:=y divMagSymbNum
else y1:=(ydiv MagSymbNum)+1;
if y modMagSymbNum = 0 then
y2:=MagSymbNum
else y2:=y modMagSymbNum;
withtmp.canvas do begin
if (Acol
Brush.Color:=Color1
else
if(x=Symbnum+1) then
Brush.Color:=Color4
else
Brush.Color:=Color2;
Rectangle(a);
if StepOverand ( ((y1=st) and (y2=tt) and (x=ss) and (x>0))
or ((y1=st)and (y2=tt) and (ss=0) and (x=Length(Symbols)+1) ))
then begin
Brush.Color:=Color3;
Rectangle(a);
end;
if (Arow=0)and (acol>1) then begin
if(x
TextOut((tmp.Width-TextWidth(Symbols[x]))div 2,
(tmp.Height-TextHeight(Symbols[x]))div 2,Symbols[x])
elseTextOut((tmp.Width-TextWidth(LineEnd)) div 2,
(tmp.Height-TextHeight(LineEnd))div 2, LineEnd);
end;
if (Acol=0)and (arow>0) then begin
TextOut((tmp.Width-TextWidth('S'+inttostr(y1)))div 2,
(tmp.Height-TextHeight('S'))div 2,'S'+inttostr(y1));
end;
if (Acol=1)and (arow>0) then begin
TextOut((tmp.Width-TextWidth(MagSymbols[y2]))div 2,
(tmp.Height-TextHeight(MagSymbols[y2]))div 2,MagSymbols[y2]);
end;
if (Acol>1)and (arow>0) then begin
if(x>SymbNum) then begin
ifMP.Good[y1,y2] then s:='Доп.'
elses:='Отв.';
TextOut((tmp.Width-TextWidth(s))div 2,
(tmp.Height-TextHeight(s))div 2,s);
end
else begin
TC:=MP.Cell[y1,y2,x];
iftc.NextState=Err then begin
s:='Ошибка';
TextOut((tmp.Width-TextWidth(s))div 2,
(tmp.Height-TextHeight(s))div 2,s);
end
else begin
MoveTo(0,tmp.heightdiv 3);
Lineto(tmp.widthdiv 2,2*tmp.height div 3);
LineTo(tmp.width,tmp.heightdiv 3);
Moveto(tmp.widthdiv 2,2*tmp.height div 3);
Lineto(tmp.widthdiv 2,tmp.height-14);
Moveto(0,tmp.height-14);
Lineto(tmp.width,tmp.height-14);
ifMP.Cell[y1,y2,x].WithSymb then s:='П'
else s:='Д';
TextOut(tmp.Width-(TextWidth(s)+drx),
tmp.Height-(TextHeight(s)+dry)-14,s);
s:='S'+inttostr(TC.NextState);
TextOut(drx,tmp.Height-(TextHeight(s)+dry)-12,s);
s:=editing.cbWhatDo.Items[tc.mag];
iflength(s)>1 then s:=copy(editing.cbWhatDo.Items[tc.mag],1,3)+'.';
TextOut((tmp.Width-(TextWidth(s)))div2,dry+TextHeight(s),s);
s:=tc.Pushing;
TextOut((tmp.Width-(TextWidth(s)))div2,dry,s);
D:=tc.Vihod;
TextOut((tmp.Width-TextWidth(D))div 2 ,tmp.Height-14,D);
end;
end;
end;
end;
end;
dgMp.canvas.CopyRect(Rect,tmp.canvas,a);
end;
end;
procedureTMainPr.alRepaintExecute(Sender: TObject);
begin
if ready thenbegin
dgMP.Hide;
dgMp.Show;
end;
end;
procedureTMainPr.dgMPTopLeftChanged(Sender: TObject);
begin
PaintMP;
end;
procedureTMainPr.dgMPSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect:Boolean);
varx,y,y1,y2:word;
Mr:integer;
begin
if notStepOver and Ready then begin
x:=Acol-1;
y:=ARow;
with mp.paramsdo begin
if y modMagSymbNum = 0 then
y1:=y div MagSymbNum
else y1:=(ydiv MagSymbNum)+1;
if y modMagSymbNum = 0 then
y2:=MagSymbNum
else y2:=y modMagSymbNum;
if (x>0)and (x0) then begin
ii:=y1;
jj:=y2;
kk:=x;
cbStEd.ItemIndex:=y1;
cbMagStEd.ItemIndex:=y2;
cbSymbEd.ItemIndex:=x;
cbStEd.text:=cbStEd.items[y1];
cbMagStEd.text:=cbMagStEd.items[y2];
cbSymbEd.text:=cbSymbEd.items[x];
Mr:=Editing.ShowModal;
if mr=111 thenbegin
mp.cell[ii,jj,kk]:=Result;
PaintMP;
end;
end
else
if (y>0)and (x=SymbNum+1) then begin
changeGood(y1,y2);
if pc1.ActivePageIndex=0then begin
tsAdd.Hide;
tsAdd.Show;
end;
end;
end;
end;
end;
procedureTMainPr.ChangeGood(i, j: integer);
begin
ifMessageDlg('Выдействительно хотите изменить состояниеячейки',mtConfirmation,[mbOk,mbCancel],0)=mrOk
thenmp.SetGood(i,j);
PaintMP;
end;
procedureTMainPr.alSaveExecute(Sender: TObject);
vartmp:Shortstring;
begin
if ready thenbegin
TMP :=mmNotes.text;
sd1.initialdir:=initialdir+SaveDir;
if sd1.executethen begin
mp.savetofile(tmp,sd1.filename);
end;
end;
end;
procedureTMainPr.alLoadExecute(Sender: TObject);
label 1;
var c:integer;
note:string;
begin
od1.initialdir:=initialdir+savedir;
if ready thenbegin
c:=MessageDlg('Сохранитьтекущий МП-транслятор?',mtConfirmation,[mbYes,mbNo,mbCancel],0);
case c of
mrYes: begin
alSaveExecute(Sender);
end;
mrNo: begin
;
end;
mrCancel:begin
goto 1;
end;
end;
end;
if od1.Executethen begin
pc1.Enabled:=true;
Ready:=true;
MP:=TMPRasp.Create;
MP.LoadFromFile(od1.FileName,note);
mmNotes.text:=note;
plChain.Text:='';
tsAdd.Hide;
tsAdd.show;
tsEdit.Hide;
tsEdit.show;
tsCheck.hide;
tsCheck.show;
DrawSt:=true;
DrawMg:=true;
DrawSmb:=true;
TMP:=TBitmap.create;
dgMP.DefaultColWidth:=CellSize;
dgMP.DefaultRowHeight:=CellSize;
paintMP;
end;
1: end;
procedureTMainPr.FormCreate(Sender: TObject);
var s:string;
i:integer;
begin
Application.Title:='ОДМ.МП-транслятор';
s:=paramstr(0);
i:=length(s);
whiles[i]'\' do
i:=i-1;
initialdir:=copy(s,1,i);
end;
procedureTMainPr.buStopTraceClick(Sender: TObject);
begin
if ready thenbegin
tsEdit.enabled:=true;
bucheck.Enabled:=true;
buSymbAdd.Enabled:=true;
buDelSymb.Enabled:=true;
buClear.Enabled:=true;
buNextStep.Enabled:=False;
buStopTrace.Enabled:=False;
plChain.enabled:=true;
StepOver:=False;
MP.Params:=TempParams.Params;
MP.Good:=TempParams.Good;
MP.cell:=TempParams.Cell;
if TraceResultthen lbResult.caption:='ДОПУСК'
elselbResult.caption:='НЕТ ДОПУСКА';
PaintMP;
end;
end;
procedureTMainPr.FormResize(Sender: TObject);
begin
PaintMp;
end;
procedureTMainPr.SetTrace;
var i:integer;
s:string;
begin
plStData.caption:=MP.Stack.Data;
lbStep.Items.clear;
for i:=1 toNum1 do begin
case i of
1: begin
s:=inttostr(SymbI);
end;
2: begin
ifSymbI>Length(Chain) then s:=LineEnd
elses:=Mp.Params.Symbols[ss];
end;
3: begin
s:='S'+inttostr(St);
end;
4: begin
s:=MP.Stack.Top;
end;
end;
lbStep.Items.Add(TracePar[i]+s);
end;
end;
procedureTMainPr.Step;
begin
With mp dobegin
if(StateErr) and (SymbI
Ss:=SymbPos(Chain[SymbI]);
if Ss>0then begin
tt:=MagSymbPos(Stack.Top);
St:=State;
WithCell[St,Tt,Ss] do begin
SetMag(Mag,Pushing);
State:=NextState;
if WithSymbthen SymbI:=SymbI+1;
end;
Ss:=SymbPos(Chain[SymbI]);
tt:=MagSymbPos(Stack.Top);
St:=State;
end
ElseState:=Err;
end;
If(StateErr) and (SymbI=Length(Chain)+1) then begin
tt:=MagSymbPos(Stack.Top);
TraceResult:=Good[State,tt];
buNextStep.Enabled:=False;
end
else ifState=Err then begin
lbResult.caption:='НЕТДОПУСКА';
buNextStep.Enabled:=False;
end;
end;
end;
procedureTMainPr.buNextStepClick(Sender: TObject);
var s:string;
begin
Step;
SetTrace;
PaintMp;
ifbuNextStep.Enabled=False then begin
if TraceResultthen
s:='ДОПУСК '
else
s:='НЕТДОПУСКА';
MessageDlg(s+'цепочки',mtinformation,[mbOk],0);
lbResult.Caption:=S;
end;
end;
procedureTMainPr.alExitExecute(Sender: TObject);
begin
MainPr.Close;
end;
procedureTMainPr.alHelpExecute(Sender: TObject);
begin
Application.HelpCommand(HELP_finder,0);
end;
procedureTMainPr.N5Click(Sender: TObject);
begin
About.ShowModal;
end;
procedureTMainPr.Button1Click(Sender: TObject);
var MR:word;
begin
if ready thenbegin
with rgWhatAdddo begin
case ItemIndexof
0: beginWhatAdd:=St; Send:=''; end;
1: beginWhatAdd:=MgS; Send:=Mp.Params.MagSymbols; end;
2: beginWhatAdd:=Smb; Send:=Mp.Params.Symbols; end;
end;
end;
MR:=Adding.ShowModal;
if MR=100 thenbegin
with rgWhatAdddo begin
case ItemIndexof
0: begin
if notmp.AddState
then MessageDlg('Невозможно добавитьновое состояние!'
,mtWarning,[mbOk],0);
DrawSt:=True;
end;
1: begin
if notmp.AddMagState(res)
then MessageDlg('Невозможно добавитьновый магазинный символ!'
,mtWarning,[mbOk],0);
DrawMg:=True;
end;
2: begin
if notmp.AddSymb(res)
then MessageDlg('Невозможно добавитьновый символ!'
,mtWarning,[mbOk],0);
DrawSmb:=True;
end;
end;
PaintMp;
end;
end;
tsEdit.Hide;
tsEdit.Show;
end;
end;
end.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.