Разработка программы, моделирующей алгоритм работы машины Тьюринга
Основы объектно-ориентированного программирования. Методы применения готовых компонентов для решения практических задач. Создание программы, реализующей процесс поиска и отслеживания положения экстремума простейших унимодальных функций с течением времени.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.06.2016 |
Размер файла | 602,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Введение
Экстремальное управление является одной из важнейших и главных задач в современном мире. Поиск экстремальных значений каких-либо объектов играет огромную роль в науке и технике.
С точки зрения особенностей объекта задачу экстремального управления обычно подразделяют две - задачу оптимизации и задачу экстремального регулирования.
Задача оптимизации является задачей однократного достижения экстремальной цели. Она возникает в том случае, когда объект управления и среда, в которой он работает, не меняют своих свойств. Примерами задач такого рода являются задачи математического программирования.
Однако если свойства объекта изменяются во времени, то однократная оптимизация не может решить задачи экстремального управления. В этом случае необходимо ещё организовать процесс слежения за эктремальной целью, которая изменяет своё положение с течением времени. Такие процессы экстремального управления, решающие данную задачу называют процессами экстремального регулирования.
Задача слежения как задача экстремального управления несколько отличается от задачи оптимизации. Её целью является поддержание объекта в экстремальном состоянии, вне зависимости от возмущающих факторов, воздействующих на объект и изменяющих его состояние.
В зависимости от скорости дрейфа объекта процесс слежения может производиться специализированным автоматом (при большой скорости) или без него. В первом случае автомат, производящий процедуру отслеживания, называют экстремальным регулятором. Если скорость дрейфа мала, то применение экстремального регулятора нецелесообразно и отслеживание экстремальной цели может производиться с использованием методов эволюционного планирования, которые составляют ветвь планирования экстремальных экспериментов.
1. Постановка задачи
программирование поиск экстремум функция
Необходимо создать программу, реализующую процесс поиска и отслеживания положения экстремума простейших унимодальных функций с течением времени.
Программа должна выдавать положение экстремума и значение целевой функции в данном положении в любой момент времени. Поиск осуществить различными методами.
Необходимо визуализировать процесс поиска и «сопровождения» экстремума данной целевой функции: график самой функции, её дрейф, выполнение алгоритма поиска экстремума.
Также должна быть возможность построения графика функции и исследовании её дрейфа по табличным значениям.
2. Задачи экстремального регулирования
Как уже отмечалось выше объект экстремального управления изменяет свои свойства во времени и однократное определение положения экстремума, т.е. режим оптимизации, теряет смысл. В этом случае экстремальная точка каким-то неизвестным, но определённым образом изменяет своё расположение, т.е. блуждает
Такое блуждание может происходить в результате каких-либо изменений в объекте. Но со стороны наблюдателя, который не располагает необходимой информацией об объекте, блуждание цели имеет случайный характер. Поэтому в первом приближении является случайной функцией времени. Основной задачей экстремального управления в этом случае является отслеживание блуждающего экстремума, т.е. решение задачи
где индексом t обозначена зависимость целевой функции от времени.
Таким образом, зависимость значения целевой функции (показатель качества) Q от времени и динамики объекта (динамики его переходных процессов) существенно оказывает влияние на способ решения задачи экстремального регулирования. В этом и состоит различие между оптимизацией и экстремальным регулированием.
Решение задачи оптимизации может быть выполнено большим количеством методов: метод дихотомии, метод Кифера, метод Золотого сечения и т.п. Каждый из этих методов рано или поздно решит поставленную задачу оптимизации экстремального объекта. Один метод сделает это раньше, другой-позже.
Однако для экстремального регулирования эти методы обладают тремя недостатками: 1) они сложны для аппаратурной реализации; 2) не работают в обстановке помех; 3) не предполагают дрейфа экстремума, т.е. рассчитаны на однократное определение положения экстремума.
Данные недостатки значительно сужают область применения этих методов и не дают возможность их использования в качестве алгоритмов экстремального управления. Как раз в этом случае и применяются алгоритмы шагового поиска, которые рассматриваются ниже. Они просты в аппаратурной реализации и способны находить и отслеживать блуждающий экстремум функции качества.
3. Требования к программному средству
Проанализировав данную задачу и оценив результат выполнения программы можно сформулировать основные требования и ограничения к данной работе.
Итак, основные требования к программе следующие:
§ должно иметься поле для построения и отслеживания графика исследуемой функции;
§ программа должна визуально показывать шаги выполнения каждого алгоритма поиска;
§ необходимо обеспечить возможность изменения скорости дрейфа экстремума, параметров исследуемых функций;
§ одним из важных требований является возможность ввода настроек: первоначальное положение на ленте, заполнение данными, изменение длины ленты, величина задержки выполнения каждой команды;
§ должна быть возможность как сохранять набранные команды, замечания, первоначальные настройки, так и загружать их при необходимости;
§ обязательным является присутствие справочной системы, поясняющей правила работы с программой.
Основные ограничения:
§ длина ленты не должна превышать 65536 ячеек;
§ команды вводятся по одной в каждой строке;
§ необходимо в случае неправильного ввода данных(цифр), данных не удовлетворяющих синтаксису и в случае выхода за границу длины ленты, соответствующим образом выдавать сообщение об ошибке.
Приведём также список команд, котырыми осуществляются основные действия над лентой, и их значения:
§ Lt - сдвиг влево;
§ RT - сдвиг вправо;
§ Lt(n) - сбвиг на n полей влево;
§ Rt(n) - сдвиг на n полей вправо;
§ write - записать из памяти;
§ write1 - записать `1';
§ write0 - записать `0';
§ read - считать в память;
§ del - удалить.
4. Выбор метода решения поставленной задачи
Исходя из требований и ограничений к данной программе определим метод решения поставленной задачи.
Прежде всего необходимо наметить общий ход решения. Он будет выглядеть следующим образом:
1) Пользователь ввёл команды и запустил программу, нажав на кнопку. Теперь необходимо считывать по одной команде и тут же реализовывать действие, предписанное данной команде. И так продолжать до тех пор, пока текущая строка не окажется пустой. При этом одному нажатию кнопки соответствует одна выполненная команда. И чтобы обеспечить выполнение всех команд при однократном клике используется таймер, с заданным интервалом активирующий кнопку;
2) Каждой команде должно соответствовать определённое действие:
§ заполнение и удаление ячейки производится путём занесения в данную ячейку соответствующего символа;
§ сдвиг реализуется путём смены положения указателя на n влево или вправо в зависимости от команды.
§ вся лента представляет собой одномерный массив символов, а её видимая в данный момент часть в виде таблицы с одной строкой и фиксированным количеством столбцов. Но так как лента предполагается бесконечной, то для того, чтобы обеспечить видимость всех происходящих на ней процессов, данная таблица будет синхронно перезаписываться данными, расположенными вблизи ползунка;
3) А для возможности просмотра ленты имеются две кнопки, при нажатии на которые происходит перезапись таблицы следующей частью содержимого ячеек ленты;
4) Создана отдельно форма для возможности ввода настроек: положение управляющего устройства (ползунка), заполнение ячеек, длина ленты. При выполнении условий настроек все данные вводятся в массив символов; при изменении длины ленты также меняется длина массива; а таблица перезаписывается относительно установленного положения управляющего устройства.
5. Программная реализация
5.1 Выбор среды разработки
Данную задачу можно решить в различных средах с использованием различных языков программирования, таких как:
§ Borland Delphi 7.0;
§ Borland C++ Builder;
§ Pascal ABC.Net;
§ Turbo Pascal 7.0;
§ Visual Basic.
Рассмотрев их отдельные достоинства и недостатки, именно среда Delphi 7.0 была выбрана так как:
1) синтаксис во многом приближен к PascalABC.NET;
2) лёгок для самостоятельного изучения;
3) существуют все средства для создания удобного интерфейса;
4) много встроенных функций и процедур, упрощающих разработку программы;
5) часть текста прописывается автоматически;
6) по своим возможностям вполне подходит для качественной разработки данного проекта;
Так же можно отметить несколько недочетов в других средах программирования:
1) сложность создания удобного интерфейса;
2) синтаксис не идентичен Pascal;
3) сложны для самостоятельного изучения.
5.2 Описание общей структуры программы
Для более лучшего понимания структуры программы опишем её основные связи между компонентами.
Таким образом в наиболее общем виде программу можно представить так:
§ ввод команд;
§ запуск программы выполнения данных команд;
§ выполнение и одновременная визуализация процесса выполнения введённых команд;
Теперь рассмотрим более детально структуру данной программы.
Процесс ввода команд может сопровождаться внесением каких-либо дополнительных данных, условий, ограничений в ленте. Таким образом повышается эффективность разработки различных алгоритмов, реализующихся на данной программе.
Далее после запуска программы происходит поэтапное выполнение всех введённых команд, сопровождающееся визуализацией данного процесса. На данном этапе также возможно внесение определённых настроек, таких как: пошаговый режим (при запуске программы выполняется ровно одна команда), обычный режим (в случае корректного ввода данных все команды выполнятся при однократном запуске).
На завершающем этапе работы с программой имеется возможность сохранить все введённые команды и настройки, с тем чтобы вновь использовать их при открытии.
Таким образом в детализированном виде общая структура программы будет следующей:
1) Ввод команд:
§ ввод команд;
§ ввод настроек;
2) Запуск выполнения данных команд:
§ выбор режима выполнения;
3) Выполнение и одновременная визуализация процесса выполнения введённых команд;
4) Сохранение данных.
5.3 Описание глобальных структур, типов данных, переменных
Для полноценной реализации данной программы были использованы следующие глобальные типы данных и переменные:
i, prib, len, c: Integer;
buf: char;
poss: integer;
mas: array of char;
dirr: string;
flag_reg: Boolean;
Объясним необходимость использования каждой из переменных и типов данных.
§ i: integer. Данная переменная является текущим номером в введённом списке команд в процессе работы программы. Она указывает на выполняемую команду. Всякий раз при выполнении очередной команды её значение увеличивается на единицу. При выполнении некоторого условия (конец списка введённых команд) её значение обнуляется, т.е. указатель смещается в начало списка.
§ prib: Integer. Данная переменная служит для сохранения текущей позиции ползунка при пролистывании (просмотре) ленты при помощи специально предназначенных для этого боковых кнопок. При каждом нажатии данных кнопок её значение увеличивается или уменьшается (в зависимости от того в какую сторону идёт просмотр ленты) на величину, равную длине видимой части ленты (таблицы). Исключения составляют случаи, возникающие на границах ленты, когда позиция ползунка автоматически перемещается в конец/начало ленты.
§ buf: char. В этой переменной сохраняется значение из считанной ячейки.
§ len: integer. Хранит текущую длину ленты.
§ c: Integer. Задержка (в млc.) между выполнениями команд.
§ poss: integer. Является носителем номера позиции управляющего устройства (ползунка). Используется во всех операциях программы.
§ mas: array of char. Представляет собой, собственно говоря, саму ленту. В данном массиве сохраняются все значения, которые имеются на ленте. Длина массива отражает реальную длину ленты. Предназначен прежде всего для хранения данных ячеек на ленте, не попавших в диапазон видимой её части. Символьный тип элементов массива выбран потому, что данные которые могут хранится в ячейке, представляют собой всего лишь один символ.
§ dirr: string. В данной переменной при открытии программы сохраняется текущий каталог. Предназначена для формирования пути к открытию справки.
§ flag_reg: Boolean. Признак переключения режима действия программы (обычный и пошаговый, в котором при однократном запуске программы выполняется ровно одна команда). Меняет своё значение при каждом нажатии кнопки-переключателя.
5.4 Описание основных подпрограмм
Перейдём к описанию основных подпрограмм.
Начнём с описания процедуры, реализующей действия, возникающие при запуске программы. Она имеет стандартный заголовок:
«procedure TForm1.FormCreate(Sender: TObject)».
Данная подпрограмма реализует следующие действия: устанавливает текущую дату, день недели, формирует начальные значения основных компонентов: положение ползунка устанавливается в середине таблицы; строится видимая часть ленты (таблица); задаётся начальная длина ленты и другие начальные установки. В качестве параметра передана переменная объектового типа, позволяющая использование в данной процедуре объектов (компонентов).
Блоксхема данной подпрограммы:
Рис.1. Блоксхема процедуры TForm1.FormCreate
Следующая подпрограмма имеет следующий заголовок:
«procedure TForm1.btn2Click(Sender: TObject)».
В данной процедуре реализуется самая главная часть всей программы. Она обрабатывает строку команды и реализует действие, предписанное данной команде. Вызывается данная процедура при нажатии на кнопку btn2 («Пуск»).
Блоксхема данной подпрограммы:
Рис. 2. Блоксхема процедуры TForm1.btn2Click
Рассмотрим следующие две процедуры:
«procedure TForm1.btn1Click(Sender: TObject)» и
«procedure TForm1.btn3Click(Sender: TObject)».
Они предназначены для пролистывания (просмотра) ленты. Одна - вправо, другая - влево. Принцип действия таков: при нажатии на одну из них происходит перезапись видимой части ленты следующей частью, данные которой хранятся в массиве.
Блоксхема:
Рис. 3. Блоксхема процедуры TForm1.btn1Click
Аналогичную структуру имеет и вторая процедура, за исключением некоторых отличий.
Следующая подпрограмма имеет заголовок:
«procedure TForm1.lv3SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String)».
Она предназначена для предоставления возможности изменения данных на ленте непосредственно с клавиатуры.
Блоксхема:
Рис 4. Блоксхема процедуры TForm1.lv3SetEditText
Теперь разберём процедуру, предназначенную для ввода, удаления данных, и используемую в такой важной части программы, как «Настройки». В качестве первого параметра ей передаётся строка, представляющая собой набор номеров ячеек (возможно диапазонов), в которые необходимо занести данные, хранящиеся во втором параметре типа char. Она имеет следующий заголовок:
«procedure TForm2.zapoln(st: string; o_i: char)».
Блоксхема данной подпрограммы:
Рис. 5. Блоксхема процедуры TForm2.zapoln
6. Тестирование и отладка программного средства
6.1 Тестирование и верификация
Отладка и верификация программы представляют собой очень важную часть процесса разработки программы. Отладка заключается в устранении ошибок программирования, ошибок перевода алгоритма на язык программирования. Отладка - это деятельность, направленная на обнаружение и исправление ошибок в программе с использованием процессов выполнения его программ. Тестирование программы - это процесс выполнения его программ на некотором наборе данных, для которого заранее известен результат применения или известны правила поведения этих программ. Указанный набор данных называется тестовым или просто тестом. Таким образом, отладку можно представить в виде многократного повторения трех процессов: тестирования, в результате которого может быть констатировано наличие в ПС ошибки, поиска места ошибки в программах и документации ПС и редактирования программ и документации с целью устранения обнаруженной ошибки. Другими словами:
Отладка = Тестирование + Поиск ошибок + Редактирование.
Верификация - это доказательство того, что программа работает «правильно», дает правильный результат. Для этого разрабатывается система тестов, которые могут представлять собой специально подобранные наборы параметров, для которых задача может быть решена точно. Это могут быть, например, какие-нибудь предельные случаи. Если результат, полученный с помощью программы, совпадает (с учетом погрешности машинного кода) с ожидаемым, есть основание полагать, что программа работает правильно.
Перейдём к доказательству правильности работы программного средства. Для этого придумаем некоторые команды, вычислим точный результат и сравним с полученным на программе.
Тест №1. Из положения, установленного по умолчанию (начальное положение - 25) выполним следующие команды:
§ Rt(10)
§ write1
§ Lt(35)
Ясно, что в результате выполнения данных команд в ячейке №35 должен содержаться символ «1», а конечное положение ползунка должно быть на ячейке №0.
Результат выполнения программы:
Рис. 6. Результат теста №1
Тест №2. Перейдём к более сложному алгоритму:
§ Rt(98)
§ write
§ Lt(99)
§ read
§ Rt(100)
§ write
§ Lt(101)
§ read
§ Rt(102)
§ write
§ Lt(103)
§ read
§ Rt(104)
§ write
§ Lt(105)
§ read
§ Rt(106)
§ write
§ Lt(107)
§ read
§ Rt(108)
§ write
Начальные условия следующие:
Рис. 7. Начальные условия теста №2
Данный алгоритм перезаписывает в обратном порядке данные первых семи ячеек в ячейки с номерами, начиная от 102 до 108. Конечное положение ползунка должно быть на ячейке с №108.
Результат работы программы:
Рис. 8. Результат теста №2
Как видно из примера программа верно выполнила данный алгоритм.
Тест №3. Выясним поведение программы при неккоректном задании команд. Рассмотрим случай, связанный с выходом за границы ленты (при установленной длине в 250 ячеек). Из начального положения (ячейка №25) зададим следующие команды:
§ Rt(224)
§ write0
§ del
§ Rt
§ write1
Посмотрим результат выполнения программы:
Рис.9. Результат теста №3
Программа выдаёт сообщение об ошибке, выделяя команду, вызвавшую ошибку, тем самым давая возможность исправить код и продолжить работу с места прерывания.
В процессе тестирования были выявлены и устранены различные неточности работы программы на границах ленты и проблемы, связанные с визуализацией процесса выполнения. Например, при перезаписи видимой части ленты, данными ячеек следующей части, последняя ячейка, имеющая какой-либо символ перезаписывалась с некоторым запозданием.
6.2 Показатели качества программы
Разработанное программное средство позволяет выполнять определенные функции, следуя целям поставленной задачи. Однако хорошее программное средство должно обладать еще целым рядом свойств, позволяющим успешно его использовать в течение длительного периода, т.е. обладать определенным качеством. Качество программного средства (ПС)- это совокупность его черт и характеристик, которые влияют на его способность удовлетворять заданные потребности пользователей.
В настоящее время критериями качества ПС принято считать:
§ функциональность;
§ надежность;
§ легкость применения;
§ эффективность;
§ сопровождаемость;
§ мобильность.
Функциональность - это пособность ПС выполнять набор функций, удовлетворяющих заданным или подразумеваемым потребностям пользователя.
Легкость применения включает в себя возможность использования данной программы, не зная курса информатики. Так же большую помощь при использовании данного ПС оказывает справка, в которой написано подробное руководство по применению и разобран алгоритм решения на нескольких примерах.
Сопровождаемость - это характеристики ПС, которые позволяют минимизировать усилия по внесению изменений для устранения в нем ошибок и по его модификации в соответствии с изменяющимися потребностями пользователей.
Мобильность ПС подразумевает возможность переноса данной программы с одного компьютера на другой, использование ПС в любой ОС Windows, а так же не требовательность к ресурсам компьютера.
Функциональность и надежность являются обязательными критериями качества ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с требованиями к ПС.
Обеспечение сопровождаемости ПС сводится к обеспечению изучаемости ПС и к обеспечению его модифицируемости.
Изучаемость (подкритерий качества) ПС определяется составом и качеством документации по сопровождению ПС и выражается через такие примитивы качества ПС как информативность, понятность, структурированность и удобочитаемость. Последние два примитива качества и, в значительной степени, понятность связаны с текстами программных модулей.
Для обеспечения изучаемости ПС и его модифицируемости, при окончательном оформлении текста программного продукта применялись следующие решения:
§ использование в тексте программы комментариев, проясняющих особенности принимаемых решений;
§ использование подпрограмм для удобочитаемости и оптимизации программного кода;
§ название основных переменных согласно их назначению в программе;
§ составление инструкции для пользования данным программным средством.
Заключение
В результате данной работы была разработана программа, моделирующая алгоритм работы машины Тьюринга.
Данное программное средство удовлетворяет всем необходимым требованиям:
§ Во первых, реализует все элементарные операции, присущие машине Тьюринга;
§ Во вторых, визуализирует ход выполнения всех заданных команд;
§ В третьих, предоставляет возможность изначально и во время работы программы настраивать в соответствии с потребностями данное программное обеспечение;
§ В четвёртых, обеспечивает соответствующее информирование при некорректно заданных командах.
Для решения данной задачи потребовалось использование следующих компонентов: StringGrid (лента); BitBtn; RichEdit; Edit; Label; TrackBar (ползунок).
В ходе разработки данного программного средства были изучены основы объектно-ориентированного программирования, способы применения готовых основных данных (компонентов) для решения практических задач, получены навыки работы со средой программирования Delphi. Всё вышеперечисленное пригодится в профессиональной деятельности.
Список используемой литературы
1) Фаронов В.В. Учебный курс/В.В. Фаронов - М.:Издатель Молгачева С.В., 2001. - 672 с.;
2) Фленов М.Е. Библия Delphi/М.Е. Фленов - СПб.: БХВ-Петербург, 2004. - 880 с;
3) Машина Тьюринга, [Электронный ресурс]. - Режим доступа: http://ru.wikipedia.org/wiki/Машина_Тьюринга.
Приложение 1
Текст программы
unit Unit1; //Лента(осн. программа)
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Grids, ValEdit, StdCtrls, ExtCtrls, CheckLst, DB,
DBTables, Buttons, Menus, ImgList;
type
TForm1 = class(TForm)
grp1: TGroupBox;
lbl1: TLabel;
lbl2: TLabel;
trckbr1: TTrackBar;
tmr1: TTimer;
btn2: TBitBtn;
redt1: TRichEdit;
btn1: TBitBtn;
btn3: TBitBtn;
mm1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
dlgOpen1: TOpenDialog;
dlgSave1: TSaveDialog;
lbl3: TLabel;
redt2: TRichEdit;
lbl4: TLabel;
redt3: TRichEdit;
stat1: TStatusBar;
tmr2: TTimer;
il1: TImageList;
pm1: TPopupMenu;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
btn4: TBitBtn;
lv3: TStringGrid;
N13: TMenuItem;
btn5: TBitBtn;
btn6: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
procedure btn2Click(Sender: TObject); //Пуск
procedure btn1Click(Sender: TObject); //Просмотр влево
procedure btn3Click(Sender: TObject); //Просмотр вправо
procedure N3Click(Sender: TObject); //Настройки
procedure N6Click(Sender: TObject); //Выход
procedure N4Click(Sender: TObject); //Примеры
procedure N5Click(Sender: TObject); //Сохранение
procedure N7Click(Sender: TObject); //Справка
procedure N8Click(Sender: TObject); //О разработчике
procedure tmr2Timer(Sender: TObject); //Текущее время
procedure btn4Click(Sender: TObject); //Пауза
procedure lv3SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String); //Ввод значений в ячейку
procedure N13Click(Sender: TObject);
procedure btn5Click(Sender: TObject); //Пошаговый режим
procedure btn6Click(Sender: TObject); //Reset
private
{ Private declarations } //Выделение команды
procedure format_l(var redt: TRichEdit; n: Integer; col: COLORREF);
public
{ Public declarations }
procedure perezap_R(ch: Integer); //Сдвиг ленты на 25 ячеек вправо
end;
var
Form1: TForm1;
i, prib, len, c: Integer;
buf: char;
poss: integer; //тек. позиция
mas: array of char; //лента
dirr: string; //тек. каталог
flag_reg: Boolean;
implementation
uses Unit2, ShellApi, Unit6;
{$R *.dfm}
///Действия при открытии программы
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
stat1.Panels[1].Text := DateToStr(date());
case DayOfWeek(date()) of
1: stat1.Panels[2].Text:= 'Воскресенье';
2: stat1.Panels[2].Text:= 'Понедельник';
3: stat1.Panels[2].Text:= 'Вторник';
4: stat1.Panels[2].Text:= 'Среда' ;
5: stat1.Panels[2].Text:= 'Четверг';
6: stat1.Panels[2].Text:= 'Пятница';
7: stat1.Panels[2].Text:= 'Суббота';
end;
buf:= ' '; dirr:= GetCurrentDir;
tmr1.enabled:= false;
trckbr1.Position:= trckbr1.Max div 2; //устанавливаем ползунок в середину
poss:= trckbr1.Position; //текущая позиция
for i:= 0 to 50 do //Формируем ленту
begin
lv3.ColWidths[i]:= 17;
lv3.Cells[i, 0]:= ' '; lv3.Cells[i, 1]:= IntToStr(i);
end;
lv3.RowHeights[0]:= 17; lv3.RowHeights[1]:= 17;
prib:=0; //Переменнная для перелистывания
SetLength(mas, 250); len:= Length(mas);
btn4.Enabled:= False; c:= 1000;
flag_reg:= False; //Пошаговый режим отключён
end;
///Таймер
procedure TForm1.tmr1Timer(Sender: TObject);
begin
btn2.Click; //Пуск
end;
///Пуск
procedure TForm1.btn2Click(Sender: TObject);
var
t, k, n, ost, chast: Integer;
s: string;
flag1: Boolean; //Признак правильности ввода очередной команды
///Запись эл-та ch в ячейку
procedure zap(ch: char);
begin
flag1:= True; //Признак правильного ввода очередной команды
lv3.Cells[trckbr1.Position, 0]:= ch;
mas[poss]:= ch
end;
///перевод значения шага из строки в целое число
procedure form_prov(var s: string; var t,k: Integer);
var
n: integer;
begin
t:= 4;
while (redt1.Lines[i][t]<>')')and(t<=Length(redt1.Lines[i])) do
begin
s:= s+redt1.Lines[i][t]; Inc(t);
end;
Val(s, n, k);
end;
///Сдвиг ленты на 25 ячеек влево
procedure perezap_L;
var t: Integer;
begin
Sleep(c);
if chast < 0 then //chast-№ первой ячейки
begin
n:= 100; chast:= 0;
end else n:= 99;
//n - признак признак выхода за границу сдвига
for t:=0 to 50 do
begin
lv3.Cells[t, 0]:= mas[chast+t];
lv3.Cells[t, 1]:= IntToStr(chast+t);
Application.ProcessMessages;
end;
trckbr1.Position:= trckbr1.Max div 2;
Sleep(c);
end;
begin
if i>0 then format_l(redt1, i-1, clBlack); //Снятие выделения со строки
tmr1.Enabled:= false; flag1:= False; btn4.Enabled:= True;
t:= i+1;
redt1.SelStart :=redt1.Perform(EM_LINEINDEX, t, 0);
redt1.SelLength:= Length(redt1.Lines[t]);
if redt1.SelAttributes.Color = clred then //если выделено более одной
begin //строки
while redt1.SelAttributes.Color = clred do
begin //тогда снять с них выделение
format_l(redt1, t, clBlack); Inc(t);
redt1.SelStart :=redt1.Perform(EM_LINEINDEX, t, 0);
redt1.SelLength:= Length(redt1.Lines[t]);
end;
end;
if (redt1.Lines[i] = '')and(i<>0) then i:=0 //если код стёрт, то перейти в начало
else if redt1.Lines[i] = '' then //если кода нет, то стоп
begin tmr1.Enabled:= False; Exit; end;
format_l(redt1, i, clRed); //выделение выполняемой команды
Application.ProcessMessages;
poss:= poss+prib; prib:= 0;
if redt1.Lines[i] = 'Lt' then
begin flag1:= True;
if trckbr1.Position=0 then //если ползунок в начале таблицы
begin
if poss <= 0 then //если тек. позиция <= 0, то стоп
begin
Showmessage('Выход за границы ленты! Измените параметры команды.');
Exit;
end;
chast:= Poss - trckbr1.Position-25; //chast-№ первой ячейки
for t:=0 to 50 do //Сдвиг
begin
lv3.Cells[t, 0]:= mas[chast+t];
lv3.Cells[t, 1]:= IntToStr(chast+t);
Application.ProcessMessages;
end;
trckbr1.Position:= trckbr1.Max div 2;
Sleep(c);
trckbr1.Position:= trckbr1.Position-1;
end
else trckbr1.Position:= trckbr1.Position-1;
poss:= poss-1; //позиция после выполнения команды
end
else
if redt1.Lines[i] = 'Rt' then
begin flag1:= True;
if poss>=len-1 then //Если выход за границы ленты, то стоп
begin
Showmessage('Выход за границы ленты! Измените параметры команды.');
Exit;
end;
if trckbr1.Position=trckbr1.Max then //если ползунок в конце таблицы
begin
chast:= Poss - trckbr1.Position+25;
perezap_R(chast); //Сдвиг(перезапись на следующую часть) вправо
trckbr1.Position:= trckbr1.Max div 2;
Sleep(c);
trckbr1.Position:= trckbr1.Position +1;
end
else trckbr1.Position:= trckbr1.Position+1;
poss:= poss+1; //позиция после выполнения команды
end
else
if redt1.Lines[i][3] = '(' then
if redt1.Lines[i][1]+redt1.Lines[i][2] = 'Lt' then
begin flag1:= True;
form_prov(s, t, k); //считывание в s кол-во шагов
//защита от неверного ввода
if (t<>Length(redt1.Lines[i]))or(k<>0) then
begin
Showmessage('Неверный синтаксис команды! Проверьте правильность набора и повторите ввод.');
exit
end;
if poss-strtoint(s)<0 then
begin
Showmessage('Выход за границы ленты! Измените параметры команды.');
Exit;
end;
if trckbr1.Position-strtoint(s)< 0 then //Если выход за границы табл.
begin
chast:= Poss - trckbr1.Position-25;
{ost-оставшееся кол-во ячеек после перехода ползунка
на границу таблицы}
ost:= (strtoint(s)-trckbr1.Position);
trckbr1.Position:= 0;
perezap_L; //Сдвиг(перезапись на следующую часть) влево
if (ost mod trckbr1.Position)=0 then t:=2
else t:= 1;
{(ost div trckbr1.Position) - кол-во
сдвигов(перезаписей на следующую часть) в таблице}
for t:= t to ost div trckbr1.Position do
begin //очередной сдвиг
Dec(chast, 25);
trckbr1.Position:= 0;
perezap_L;
end;
poss:= poss-strtoint(s);
if ost mod 25 = 0 then trckbr1.Position:= 0
else
if n<>100 then
trckbr1.Position:= trckbr1.Position-(ost mod (trckbr1.Max-(trckbr1.Max div 2)))
else trckbr1.Position:= 0;
end
else
begin
trckbr1.Position:= trckbr1.Position-strtoint(s);
poss:= poss-strtoint(s);
end;
end
else if redt1.Lines[i][1]+redt1.Lines[i][2] = 'Rt' then
begin flag1:= True;
form_prov(s, t, k);
if (t<>Length(redt1.Lines[i]))or(k<>0) then
begin
Showmessage('Неверный синтаксис команды! Проверьте правильность набора и повторите ввод.');
exit
end;
if poss+strtoint(s)>len-1 then
begin
Showmessage('Выход за границы ленты! Измените параметры команды.');
Exit;
end;
//если текущая позиция ползунка на табл.+шаг > размерности таблицы
if trckbr1.Position+strtoint(s)> trckbr1.Max then
begin
chast:= Poss - trckbr1.Position+25;
ost:= (strtoint(s)-(trckbr1.Max-trckbr1.Position));
trckbr1.Position:= trckbr1.Max;
Sleep(c);
perezap_R(chast); //Сдвиг(перезапись на следующую часть) вправо
trckbr1.Position:= trckbr1.Max div 2;
Sleep(c);
if (ost mod trckbr1.Position)=0 then t:=2
else t:= 1;
for t:= t to ost div(trckbr1.Max-(trckbr1.Max div 2)) do
begin
Inc(chast, 25);
trckbr1.Position:= trckbr1.Max;
Sleep(c);
perezap_R(chast);
trckbr1.Position:= trckbr1.Max div 2;
Sleep(c);
end;
poss:= poss+strtoint(s);
if ost mod 25 = 0 then trckbr1.Position:= 50
else
trckbr1.Position:= trckbr1.Position+(ost mod (trckbr1.Max-(trckbr1.Max div 2)));
end
else
begin
trckbr1.Position:= trckbr1.Position+strtoint(s);
poss:= poss+strtoint(s);
end;
end
else else
if redt1.Lines[i] = 'write' then
zap(buf) //запись соответствующего эл-та в ячейку
else
if redt1.Lines[i] = 'write1' then
zap('1')
else
if redt1.Lines[i] = 'write0' then
zap('0')
else
if redt1.Lines[i] = 'read' then
begin flag1:= True;
buf:= mas[poss]; //Запоминание в буффер
end
else
if redt1.Lines[i] = 'del' then
zap(' ');
redt1.Perform(EM_ScrollCaret,0,0); //автоскролл в тексте кода
Inc(i); Sleep(c);
if not flag1 then
begin //если не совпала ни одна команда, то стоп
Showmessage('Неверный синтаксис команды! Проверьте правильность набора и повторите ввод.');
Dec(i); exit
end;
tmr1.Enabled:= true;
if {Form2.chk2.Checked}flag_reg then //Если включён пошаговый режим
tmr1.Enabled:= False;
if redt1.Lines[i] = '' then
begin //если конец кода, то стоп и переход в начало кода
format_l(redt1, i-1, clBlack);
tmr1.Enabled:= False; i:= 0;
end;
s:= '';
end;
///Просмотр ленты влево
procedure TForm1.btn1Click(Sender: TObject);
var
chast, t: Integer;
begin
chast:= (Poss+prib) - trckbr1.Position-51; //№ первой записываемой
if (chast<0)and(chast>-51) then //ячейки
begin //если перезап. часть меньше размерности таблицы
chast:= 0; Inc(prib,51-(poss+prib-trckbr1.Position));
end;
if chast >= 0 then
begin
for t:=0 to 50 do //перезапись
begin
lv3.Cells[t, 0]:= mas[chast+t];
lv3.Cells[t, 1]:= IntToStr(chast+t);
Application.ProcessMessages;
end;
Dec(prib, 51); //prib - изменение позиции ползунка при просмотре
end;
format_l(redt1, i, clBlack);
i:=0; Form2.edt1.Text:= IntToStr(poss+prib); //текущая поз. ползунка
end;
///Просмотр ленты вправо
procedure TForm1.btn3Click(Sender: TObject);
var
chast, t: Integer;
n: integer;
begin
chast:= (Poss+prib) - trckbr1.Position+51;
if chast > len-1-51 then n:= len-1-chast
else n:= 50;
for t:=0 to n do //Перезапись
begin
lv3.Cells[t, 0]:= mas[chast+t];
lv3.Cells[t, 1]:= IntToStr(chast+t);
Application.ProcessMessages;
end;
if (n<50)and(chast<=len-1) then
for t:= 0 to 49-n do
begin
lv3.Cells[t+n+1, 0]:= ' ';
lv3.Cells[t+n+1, 1]:= ' ';
Application.ProcessMessages;
end;
if chast<=len-1 then
Inc(prib, 51);
if poss+prib>len-1 then
begin //если перезап. часть больше размерности таблицы
trckbr1.Position:= trckbr1.Position-(poss+prib-len+1);
poss:= len-1; prib:= 0;
end;
format_l(redt1, i, clBlack);
i:=0; Form2.edt1.Text:= IntToStr(poss+prib);
end;
///Настройки
procedure TForm1.N3Click(Sender: TObject);
begin
form2.show;
end;
///Выход
procedure TForm1.N6Click(Sender: TObject);
begin
Close;
end;
///Примеры
procedure TForm1.N4Click(Sender: TObject);
var
t: integer;
///Занесение данных в соответствующий объект redt
procedure open(redt: TRichEdit; s: string);
begin Inc(t); //пока не очередная строка не s
// и пока не выход за границу данных
while (redt3.Lines[t]<>s)and(t<=redt3.Lines.Count) do
begin
redt.Lines.Add(redt3.Lines[t]); Inc(t);
end;
end;
begin
format_l(redt1, i, clBlack); i:= 0; t:=-1;
redt3.Lines.Clear;
if dlgOpen1.Execute then
begin
redt1.Lines.Clear;
redt2.Lines.Clear;
form2.redt1.Lines.Clear; form2.redt2.Lines.Clear;
form2.redt3.Lines.Clear; form2.edt2.Clear;
redt3.Lines.LoadFromFile(dlgOpen1.FileName);
open(redt1, 'Примечание');
open(redt2, 'Яч0'); open(form2.redt1, 'Яч1');
open(form2.redt2, 'del'); open(form2.redt3, '');
end;
end;
///Сохранение
procedure TForm1.N5Click(Sender: TObject);
///Занесение данных из redt в буфер
procedure sohran(var redt: TRichEdit; s: string);
var n: Integer;
begin n:= 0;
redt3.Lines.Add(s);
repeat
redt3.Lines.Add(redt.Lines[n]); Inc(n);
until redt.Lines[n]='';
end;
begin
redt3.Lines.Clear;
format_l(redt1, i, clBlack); i:= 0;
redt3.Lines:= redt1.Lines;
sohran(redt2, 'Примечание');
sohran(form2.redt1, 'Яч0');
sohran(form2.redt2, 'Яч1');
sohran(form2.redt3, 'del');
if dlgSave1.Execute then //Сохранение данных из буфера в файл
redt3.Lines.savetofile(dlgSave1.FileName);
end;
///Справка
procedure TForm1.N7Click(Sender: TObject);
var
dir: string;
begin
dir:= dirr+'\Справка\Справка.chm'; //dirr - текущий каталог
ShellExecute(self.Handle,'open', PChar(dir), nil, nil, SW_SHOWNORMAL);
end;
///Выделение/снятие выделения строки команды
procedure TForm1.format_l(var redt: TRichEdit; n: Integer; col: COLORREF);
begin
redt.SelStart:= redt.Perform(EM_LINEINDEX, n, 0); //Нач. поз. выделения
redt.SelLength:= Length(redt.Lines[n]); //Кол-во выделяемых символов
if col=clred then
redt.SelAttributes.style:= [fsbold]
else redt.SelAttributes.Style:= redt.DefAttributes.Style;
redt.SelAttributes.Color := col;
end;
///О разработчике
procedure TForm1.N8Click(Sender: TObject);
begin
form6.show;
end;
///Сдвиг ленты на 25 ячеек вправо
procedure TForm1.perezap_R(ch: Integer);
var n, k: Integer;
begin
if ch + 50 >len-1 then //ch - № 1-ой ячейки перезап. части
n:= len-1-ch //если выход за границы ленты
else n:= 50;
for k:=0 to n do
begin
lv3.Cells[k, 0]:= mas[ch+k];
lv3.Cells[k, 1]:= IntToStr(ch+k);
Application.ProcessMessages;
end;
for k:= n+1 to 50 do
begin
lv3.Cells[k, 0]:= ' ';
lv3.Cells[k, 1]:= ' ';
Application.ProcessMessages;
end;
end;
///Текущее время
procedure TForm1.tmr2Timer(Sender: TObject);
begin
stat1.Panels[3].Text:= timeToStr(GetTime);
end;
///Пауза
procedure TForm1.btn4Click(Sender: TObject);
begin
tmr1.Enabled:= false;
end;
///Изменение данных непосредственно на ленте
procedure TForm1.lv3SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
var k, n: Integer;
s: string;
begin
s:= Trim(lv3.cells[lv3.Col, 0]); //Введённые данные
if s<>'' then //Если строка не пуста
begin
Val(s, n, k);
if k=0 then //Если данные-число
if n=0 then
mas[poss+prib-trckbr1.Position+lv3.Col]:= '0'
else if n=1 then mas[poss+prib-trckbr1.Position+lv3.Col]:= '1'
else //Если данные - не '1' и не '0'
begin
ShowMessage('Введены недопустимые значения! Повторите ввод.');
lv3.Cells[lv3.Col, 0]:= ' ';
end
else begin //Если данные - не число
ShowMessage('Введены недопустимые значения! Повторите ввод.');
lv3.Cells[lv3.Col, 0]:= ' ';
end
end else begin //Если строка пуста
mas[poss+prib-trckbr1.Position+lv3.Col]:= ' ';
lv3.Cells[lv3.Col, 0]:= ' ';
end;
end;
procedure TForm1.N13Click(Sender: TObject);
begin
close
end;
///Вкл/выкл. пошагового режима
procedure TForm1.btn5Click(Sender: TObject);
begin
flag_reg:= not flag_reg;
if flag_reg then
btn5.Caption:= 'Выключить пошаговый режим'
else btn5.Caption:= 'Включить пошаговый режим';
end;
///Reset
procedure TForm1.btn6Click(Sender: TObject);
var
k: Word;
begin
buf:= ' ';
tmr1.enabled:= false;
trckbr1.Position:= trckbr1.Max div 2; //устанавливаем ползунок в середину
poss:= trckbr1.Position; //текущая позиция
for k:= 0 to 50 do //Формируем ленту
begin
lv3.Cells[k, 0]:= ' '; lv3.Cells[k, 1]:= IntToStr(k);
end;
prib:=0; //Переменнная для перелистывания
SetLength(mas, 0); //Удаление содержимого массива
btn4.Enabled:= False; c:= 1000;
flag_reg:= False; btn5.Caption:='Включить пошаговый режим';
i:= 0; //Сдвиг в начало кода
SetLength(mas, 250); len:= Length(mas); //Создание пустого массива
redt1.Lines.Clear; redt2.Lines.Clear; //Стирание старого содержимого
Form2.chk1.Checked:= False; //Длина ленты не изменяется
Form2.redt1.Lines.Clear; Form2.redt2.Lines.Clear; Form2.redt3.Lines.Clear;
Form2.edt1.Text:= IntToStr(poss+prib); //тек. позиция
Form2.edt3.Text:= IntToStr(c); //Пауза между командами
Form2.edt2.Text:= IntToStr(len); //длина ленты
end;
end.
unit Unit2; //Настройки
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls;
type
TForm2 = class(TForm)
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
redt1: TRichEdit;
redt2: TRichEdit;
edt1: TEdit;
btn1: TBitBtn;
btn2: TBitBtn;
redt3: TRichEdit;
lbl4: TLabel;
edt2: TEdit;
chk1: TCheckBox;
edt3: TEdit;
lbl5: TLabel;
procedure btn1Click(Sender: TObject); // Применить
procedure FormCreate(Sender: TObject);
procedure chk1Click(Sender: TObject); //Возможность изменения длины ленты
procedure btn2Click(Sender: TObject); //Отмена
procedure FormActivate(Sender: TObject); //Обновление данных
private
procedure zapoln(st: string; o_i: char); //Заполнение ленты
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
flag: boolean;
implementation
uses Unit1;
{$R *.dfm}
/// Применить
procedure TForm2.btn1Click(Sender: TObject);
var
i, t, k: Integer;
s, str: string;
begin
flag:= false; //Признак корректного ввода значений
if edt2.Enabled then //Если изменена длина ленты
begin
Val(edt2.Text, t, k);
if k<>0 then //Если неправ. Команда
begin
k:= 0; Showmessage('Неверный синтаксис команды! Проверьте правильность набора и повторите ввод.');
exit
end;
len:= StrToInt(edt2.Text);
SetLength(mas, len);
end;
t:= 0;
while redt1.Lines[t] <> '' do //пока не конец данных заполнять ленту 0
begin
zapoln(redt1.Lines[t], '0'); Inc(t);
end;
t:= 0;
while redt2.Lines[t] <> '' do //пока не конец данных заполнять ленту 1
begin
zapoln(redt2.Lines[t], '1'); Inc(t);
end;
t:= 0;
...Подобные документы
Создание программы на языке объектно-ориентированного программирования С++, реализующей построчный перевод текста (по словам) с английского на русский. Описание алгоритма решения задачи. Основные функции программы, примеры результатов ее работы.
отчет по практике [527,5 K], добавлен 10.04.2016Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.
курсовая работа [639,0 K], добавлен 16.03.2012Принципы работы и основы программирования машины Тьюринга, а также перечень правил написания алгоритмов на ее эмуляторе. Особенности решения задачи по сложению нескольких чисел в двоичной системе путем реализации ее алгоритма на эмуляторе машины Тьюринга.
контрольная работа [82,4 K], добавлен 05.12.2010Разработка прикладной программы для операций создания и уничтожения объектов в системе визуального объектно-ориентированного программирования C++Builder. Алгоритм работы программы, набор функций и операторов, компонент и модулей, кнопки событий.
дипломная работа [672,5 K], добавлен 16.08.2012Создание блок-схемы алгоритма и реализующей его программы, снабженных пояснениями, для решения задач. Реализация программы в среде Delphi как проекта консольного приложения. Основные алгоритмические структуры, соответствующие операторы для их реализации.
контрольная работа [447,4 K], добавлен 08.10.2012Инфологическое проектирование базы данных "Читальный зал" в среде СУБД MS Access. Расширение теоретических и практических знаний по использованию готовых и созданию собственных БД, применяя систему объектно-ориентированного программирования Delphi.
курсовая работа [3,8 M], добавлен 10.12.2013Разработка игры "Экзамен" с применением объектно-ориентированного программирования и языка Java (в среде Eclipse Helios). Структура программы и алгоритм решения задачи. Описание методов и переменных. Экспериментальное тестирование и оценка программы.
курсовая работа [122,5 K], добавлен 19.05.2011Создание программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С# средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Определение математического аппарата, применение его в задаче.
курсовая работа [500,4 K], добавлен 13.01.2015Характеристика основных принципов объектно-ориентированного программирования. Этапы разработки программы на языке C++, реализующей игру "Морской бой". Выбор языка программирования. Характеристика необходимых классов, наследований, виртуальных методов.
курсовая работа [657,6 K], добавлен 17.06.2012Особенности объектно-ориентированного программирования. Основные возможности языка программирования Java, классификация платформ. Создание программы, обеспечивающей вычисление арифметических выражений. Руководство пользователя и характеристика функций.
курсовая работа [1,2 M], добавлен 07.07.2012Теоретические основы объектно-ориентированного языка программирования Delphi, изучение среды визуального проектирования приложений. Определение 40-го числа Фибоначчи, составление листинга и блок-схемы программы, тестирование ее на работоспособность.
курсовая работа [261,1 K], добавлен 25.03.2015Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Характеристика структурированного языка программирования С, его основных структурных компонентов, области памяти, библиотеки. Методы поиска в массивах данных. Описание программы, функции сортировки и меню выбора, последовательного и бинарного поиска.
курсовая работа [1,7 M], добавлен 19.05.2014Разработка приложения "Калькулятор с переходом в строковый калькулятор" с применением объектно-ориентированного программирования. Концепция и понятия объектно-ориентированного программирования. Язык программирования Java. Листинг программы "Калькулятор".
курсовая работа [966,9 K], добавлен 11.02.2016Определение назначения и описание функций дискового кэша как промежуточного буфера с быстрым доступом к информации. Процесс кэширования внешних накопителей. Построение алгоритма, описание интерфейса и разработка программы для работы с двусвязным списком.
курсовая работа [2,1 M], добавлен 21.01.2014Разработка программы для рисования различных правильных многоугольников с помощью объектно-ориентированного языка программирования. Использование для разработки среды C++ Builder 6 и библиотеки VCL. Разработка интерфейса приложения и алгоритма его работы.
курсовая работа [616,4 K], добавлен 18.10.2010Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.
курсовая работа [1,7 M], добавлен 15.04.2015Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.
курсовая работа [1,2 M], добавлен 22.01.2012Изучение методик языка Javascript по формализации и решению поставленной задачи, технологических приемов разработки программ на языке Javascript, HTML, CSS. Формально определение машины Тьюринга, распознающую язык. Ее программная модель, протоколы работы.
курсовая работа [220,7 K], добавлен 03.03.2015Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014