Курсовая работа по предмету Теория автоматов и формальных языков Теория автоматов Адыгейский государственный университет (АГУ) 23 pag. Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Министерство науки и высшего образования Российской Федерации ФГБОУ ВО «Кубанский государственный технологический университет» (ФГБОУ ВО «КубГТУ») Институт компьютерных систем и информационной безопасности Кафедра информационных систем и программирования Направление подготовки 09.03.03 Прикладная информатика Профиль беспрофильный КУРСОВАЯ РАБОТА по дисциплине на тему Теория автоматов и формальных языков Конечные автоматы. Автоматизированный практикум Выполнил студент 3 курса группы 16-КБ-ПИ1 М.В Авджян Допущен к защите_____________________________________________ Руководители работы: ______________д-р техн. наук, проф. В.И. Ключко ______________ст. преп. Н.В. Кушнир Нормоконтролер Защищен _____________________ ст. преп. Н.В. Кушнир Оценка Члены комиссии: канд.тех.наук, ст. преп. К.Е. Тотухов ст. преп. Ю.С. Носова Краснодар 2019 г. Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Министерство науки и высшего образования Российской Федерации ФГБОУ ВО «Кубанский государственный технологический университет» (ФГБОУ ВО «КубГТУ») Институт компьютерных систем и информационной безопасности Кафедра информационных систем и программирования Направление подготовки 09.03.03 Прикладная информатика Профиль беспрофильный УТВЕРЖДАЮ Заведующая кафедрой ИСП _____________ М.В. Янаева «12» февраля 2019 г. ЗАДАНИЕ на курсовую работу Студенту М.В Авджян 3 курса группы 16-КБ-ПИ1 Тема работы: Конечные автоматы. Автоматизированный практикум (утверждена указанием директора института №_____от _____2019 г.) План работы:_____________________________________________ 1._______________________________________________________________ 2.______________________________________________________________ 3.______________________________________________________________ Объем работы: а) пояснительная записка ___ с. б) иллюстрированная часть ___лист(-ов) Рекомендуемая литература: 1. Ключко В.И., Власенко А.В., Кушнир Н.В., Кушнир А.В. Теория автоматов и формальных языков: учеб. пособие / Кубан. гос. технол. ун-т. Краснодар: Изд. ФГБОУ ВПО «КубГТУ», 2012.-151 с. Срок выполнения работы: Срок защиты: Дата выдачи задания: Дата сдачи работы на кафедру: с «12» февраля по «31» мая 2019 г. «___»______________2019 г. «12» февраля 2019 г. «___»_____________2019 г. Руководители работы: ______________ д-р техн. наук, проф. В.И Ключко ______________ ст. преп. Н.В.Кушнир Задание принял студент «12» февраля 2019 г._________ М.В Авджян 2 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Министерство науки и высшего образования Российской Федерации ФГБОУ ВО «Кубанский государственный технологический университет» (ФГБОУ ВО «КубГТУ») РЕФЕРАТ Стр. 23, рис. 2, табл. 3, библ. 5 КОНЕЧНЫЙ АВТОМАТ, ОТНОШЕНИЯ, ОПЕРАЦИИ НАД ОТНОШЕНИЯМИ, ЛОГИЧЕСКИЕ ОПЕРАТОРЫ Объектом исследования являются отношения и операции над ними Цель работы состоит в реализации отношений на языке C# К полученным результатам относится программа, реализованная на языке C# 3 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Содержание Введение...............................................................................................................4 1 Теоретическая часть...................................................................................6 1.1 Конечный автомат....................................................................................6 1.2 Операторы: присваивания языка программирования c#................7 1.3 Условный оператор if языка программирования c#.........................9 1.4 Логические операции.............................................................................11 2. Практическая часть.....................................................................................15 2.1 Создание и тестирование программы....................................................15 Заключение........................................................................................................17 Список используемой литературы................................................................18 Приложение А – Программа, демонстрирующая операции над отношениями........................................................................................................19 Приложение Б – Скриншот проверки текста курсовой работы в системе antiplagiat.ru.........................................................................................................22 Приложение В – Скриншот проверки программы курсовой работы в системе antiplagiat.ru..........................................................................................23 4 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Введение В современное время очень заметен информационный рывок. Нас стал окружать огромный объем информации. Информация для человека играет немаловажную роль, поэтому основной из задач человечества является передача информации. Для того чтобы обеспечить такую обработку и передачу информации, были придуманы конечные автоматы, которые в своём синтаксисе способны описывать и моделировать определённые процессы. В данном случае мы затронем операции отношений, с которыми сталкиваемся по всем дисциплинам, связанных с информационными системами. Данная работа позволила нам более подробно рассмотреть такой объект, как конечный автомат. Основным моментом проведённого исследования является рассмотрение отношений и операций над ними. Ведь эти операции используются во всех технических сферах, связанных с компьютерами, начиная с математики, заканчивая сложными алгоритмами информатики и прочих дисциплин. 5 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) 1 Теоретическая часть 1.1Конечный автомат Следует понять, что такое конечный автомат. Конечный автомат – это абстрактное вычислительное устройство, которое на входе принимает цепочки, а на выходе сообщает о их принадлежности к определенному множеству символов. Программисты очень часто сталкиваются с проблемой разделения строк на некоторые осмысленные части, проверки правильности ввода значений и т.д. В принципе, так как очень часто пользователем является человек, то самым естественным для него путем передачи информации будет человеческая речь. Тем не менее, задача выделения смысла из человеческой речи до сих пор не решена, поэтому для подобных случаев используется формальные описания некоторых структур - формальные грамматики. Конечные автоматы применяются для простейших грамматик. Обычно КА применятся для того, что называется лексическим анализом, т.е. для разбиения исходной строки на набор некоторых лексических единиц (например, выделение из текста слов и чисел). Простейший детерминированый КА работает следующим образом: в нем находится внутренний регистр для хранения текущего состояния и таблица правил вида "символ-состояние => состояние" позволяющая по текущему символу на ленте и текущему состоянию перейти в другое состояние (со сдвигом по ленте). Цепочка символов допустима, если КА завершил свою работу в одном из "разрешенных" состояний и не допустима в обратном случае [1]. 6 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) 1.2Операторы: присваивания языка программирования c# Оператор присваивания обозначается одиночным знаком равенства (=). В С# оператор присваивания действует таким же образом, как и в других языках программирования. Ниже приведена его общая форма: имя_переменной = выражение Здесь имя_переменной должно быть совместимо с типом выражения. У оператора присваивания имеется одна интересная особенность, о которой вам будет полезно знать: он позволяет создавать цепочку операций присваивания. Рассмотрим следующий фрагмент кода: 1 int x, у, z; 2 x = у = z = 10; // присвоить значение 10 переменным x, у и z [1] В приведенном выше фрагменте кода одно и то же значение 10 задается для переменных х, у и z с помощью единственного оператора присваивания. Это значение присваивается сначала переменной z, затем переменной у и, наконец, переменной х. Такой способ присваивания "по цепочке" удобен для задания общего значения целой группе переменных. Составные операторы присваивания В С# предусмотрены специальные составные операторы присваивания, упрощающие программирование некоторых операций Обратимся сначала к простому примеру: x = x + 1; // Можно переписать следующим образом x += 1; 7 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) присваивания. Пара операторов += указывает компилятору на то, что переменной х должно быть присвоено ее первоначальное значение, увеличенное на 1. Для многих двоичных операции, т.е. операции, требующих наличия двух операндов, существуют отдельные составные операторы присваивания. Общая форма всех этих операторов имеет следующий вид: имя переменной op = выражение где op -- арифметический или логический оператор, применяемый вместе с оператором присваивания. Ниже перечислены составные присваивания для арифметических и логических операций: Таблица 1- Составные операторы присваивания Операто р Аналог (выражение из вышеуказанного примера) += x = x + 1; -= x = x - 1; *= x = x*1; /= x = x/1; %= x = x%1; |= x = x | 1; ^= x = x^1; 8 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) операторы Составные операторы присваивания записываются более кратко, чем их несоставные эквиваленты. Поэтому их иногда еще называют укороченными операторами присваивания [2]. У составных операторов присваивания имеются два главных преимущества. Во-первых, они более компактны, чем их "несокращенные" эквиваленты. И во-вторых, они дают более эффективный исполняемый код, поскольку левый операнд этих операторов вычисляется только один раз. 1.3Условный оператор if языка программирования c# Высокоуровневый язык программирования определяет программную абстракцию: программист выражает алгоритм с использованием языка, а компилятор транслирует программу в целевой язык [4]. Условные операторы позволяют управлять потоком выполнения программы, чтобы не выполнялась каждая строка кода, как она следует в программе. Давайте рассмотрим все условные операторы языка C#: Для организации условного ветвления язык C# унаследовал от С и С++ конструкцию if...else. Ее синтаксис должен быть интуитивно понятен для любого, кто программировал на процедурных языках: if (условие) оператор (операторы) 9 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) else оператор (операторы) Если по каждому из условий нужно выполнить более одного оператора, эти операторы должны быть объединены в блок с помощью фигурных скобок {...}. (Это также касается других конструкций C#, в которых операторы могут быть объединены в блок -- таких как циклы for и while.) Стоит обратить внимание, что в отличие от языков С и С++, в C# условный оператор if может работать только с булевскими выражениями, но не с произвольными значениями вроде -1 и 0. В операторе if могут применяться сложные выражения, и он может содержать операторы else, обеспечивая выполнение более сложных проверок. Когда язык С создавался в середине 1970-х годов, считалось необходимым позволить программисту определять, какие переменные должны размещаться в регистрах. Однако после разработки эффективных методов распространения регистров такое управление стало излишним, и большинство из языков не используют эту возможность [4]. Синтаксис объявления переменных и операторов похож на применяемый в аналогичных ситуациях в языках С (С++) и Java. При построении сложных выражений в C# используется вполне ожидаемый набор логических операторов. Количество else if, добавляемых к единственному if, не ограничено. Один момент, который следует отметить касательно if: фигурные скобки применять не обязательно, если в условной ветви присутствует только один оператор, как показано в исходном примере. 10 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) 1.4Логические операции В обозначениях оператор отношения и логический оператор термин отношения означает взаимосвязь, которая может существовать между двумя значениями, а термин логический -- взаимосвязь между логическими значениями "истина" и "ложь". И поскольку операторы отношения дают истинные или ложные результаты, то они нередко применяются вместе с логическими операторами. Именно по этой причине они и рассматриваются совместно. Ниже перечислены операторы отношения: Таблица 2 - Операторы отношения C# Оператор Значение == Равно != Не равно > Больше < Меньше >= Больше или равно <= Меньше или равно К числу логических относятся операторы, приведенные ниже: 11 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Таблица 3 - Логические операторы C# Оператор Значение & И | ИЛИ ^ Исключающее ИЛИ && Укороченное И || Укороченное ИЛИ ! НЕ Результатом выполнения оператора отношения или логического оператора является логическое значение типа bool. В целом, объекты можно сравнивать на равенство или неравенство, используя операторы отношения == и !=. А операторы сравнения <, >, <= или >= могут применяться только к тем типам данных, которые поддерживают отношение порядка. Следовательно, операторы отношения можно применять ко всем числовым типам данных. Но значения типа bool могут сравниваться только на равенство или неравенство, поскольку истинные (true) и ложные (false) значения не упорядочиваются. Например, сравнение true > false в C# не имеет смысла. 12 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Логические операторы в C# выполняют наиболее распространенные логические операции. Тем не менее, существует ряд операций, выполняемых по правилам формальной логики. Эти логические операции могут быть построены с помощью логических операторов, поддерживаемых в C#. Следовательно, в C# предусмотрен такой набор логических операторов, которого достаточно для построения практически любой логической операции, в том числе импликации. Импликация -- это двоичная операция, результатом которой является ложное значение только в том случае, если левый ее операнд имеет истинное значение, а правый -- ложное. (Операция импликации отражает следующий принцип: истина не может подразумевать ложь.) Операция импликации может быть построена на основе комбинации логических операторов ! и |: !p | q Укороченные логические операторы В C# предусмотрены также специальные, укороченные, варианты логических операторов И и ИЛИ, предназначенные для получения более эффективного кода. Поясним это на следующих примерах логических операций. Если первый операнд логической операции И имеет ложное значение (false), то ее результат будет иметь ложное значение независимо от значения второго операнда. Если же первый операнд логической операции ИЛИ имеет истинное значение (true), то ее результат будет иметь истинное значение независимо от значения второго операнда. Благодаря тому, что значение второго операнда в этих операциях вычислять не нужно, экономится время и повышается эффективность кода [3]. 13 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Укороченная логическая операция И выполняется с помощью оператора &&, а укороченная логическая операция ИЛИ -- с помощью оператора ||. Этим укороченным логическим операторам соответствуют обычные логические операторы & и |. Единственное отличие укороченного логического оператора от обычного заключается в том, что второй его операнд вычисляется только по мере необходимости. Укороченные логические операторы иногда оказываются более эффективными, чем их обычные аналоги. Так зачем же нужны обычные логические операторы И и ИЛИ? Дело в том, что в некоторых случаях требуется вычислять оба операнда логической операции И либо ИЛИ из-за возникающих побочных эффектов [3]. 14 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) 2. Практическая часть 2.1 Создание и тестирование программы Поскольку у нас нет конкретной цели написать определенную программу, а показать, как работают отношения, то достаточно будет создать консольное приложение. На рисунке 1 представлен скриншот фрагмента разработанной программы, демонстрирующей применение операторов отношения и логических операторов: Рисунок 1 – Пример работы первой программы На рисунке 2 представлен скриншот фрагмента разработанной программы, но код вызвал в MS Visual studio 2017 следующее сообщение: 15 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Рисунок 2 – Окно исключительной ситуации в работе второй программы 16 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Заключение В заключении хотелось бы отметить важность существования и исследования конечных автоматов, которые позволили нам рассмотреть процесс моделирования различных информационных систем, например, машины Тьюринга. Мной разработана программа, демонстрирующая наглядно работу отношений и логических операции, с которыми мы сталкивались ранее в таких дисциплинах, как «Информатика и программирование», «Алгоритмы и структуры данных», «Теория информации сигналов», «Информационные системы и технологии», «Программная инжерения», «Проектирование информационных систем». Данная программа может быть внедрена в учебный процесс, как практическая реализации в выше указанных дисциплинах. 17 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Список используемой литературы Основная: 1. Ключко В.И., Власенко А.В., Кушнир Н.В. Теория автоматов и формальных языков: учеб. пособие/Кубан. гос. технол. ун-т.- Краснодар: Изд. ФГБОУ ВПО «КубГТУ», 2012.- 151 с. 2. Теория автоматов и формальных языков. Методические указания к курсовому проекту для студентов всех форм обучения направлений 23100062 – Программная инженерия, 23070062 – Прикладная информатика / Сост.: А.В.Власенко, В.И.Ключко, Н.В.Кушнир; Кубан. гос. технол. ун-т. Каф. вычислительной техники и АСУ. - Краснодар: Изд. КубГТУ, 2012. - 23 с. 3. Теория автоматов и формальных языков: метод. указания по выполнению лабораторных работ для студентов всех форм обучения по направлениям 231000.62 Программная инженерия, 230700.62 Прикладная информатика / Сост.: В.И. Ключко, А.В. Власенко, Н.В. Кушнир; Кубан. гос. технол. ун-т. Каф. вычислительной техники и АСУ. – Краснодар.: Изд. ФГБОУ ВПО «КубГТУ», 2012. - 44 с. Дополнительная: 4. Ахо, Альфред В., Лам, Моника С., Сети, Рави, Ульман, Джеффи Д. Компиляторы: принципы, технологии и инструментарий, 2-е изд: Пер. с англ: ООО «И.Д Вильямс», 2008. – 1184 с. : ил. – Парал. Тит. Англ. ISBN 978-58459-1349-4 (РУС.) Интернет-ресурсы: 5. https://revolution.allbest.ru/programming/00569472_0.html 18 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Приложение А – Программа, демонстрирующая операции над отношениями. Код первой прогаммы [4]: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { short d = 10, f = 12; bool var1 = true, var2 = false; if (d < f) Console.WriteLine("d < f"); if (d <= f) Console.WriteLine("d <= f"); if (d != f) Console.WriteLine("d != f"); // Следующее условие не выполнится if (d > f) Console.WriteLine("d > f"); // Сравниванием переменные var1 и var2 if (var1 & var2) Console.WriteLine("Данный текст не выведется"); if (!(var1 & var2)) Console.WriteLine("!(var1 & var2) = true"); if (var1 | var2) Console.WriteLine("var1 | var2 = true"); if (var1 ^ var2) Console.WriteLine("var1 ^ var2 = true"); Console.ReadLine(); } 19 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) } } Код второй программы: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { short d = 12, f = 0, i = 0; bool b = true; // В данном случае используется укороченный оператор // и операции сравнения выполнится в нормальном потоке if (f != 0 && (d % f) == 0) Console.WriteLine("{0} делится нацело на {1}", d, f); // В этом случае так же используется укороченный оператор // но при этом возникнет исключительная ситуация // т.к. первый оператор сравнения содержит деление на 0 if ((d % f) == 0 && f != 0) Console.WriteLine("{0} делится нацело на {1}", d, f); // При использовании целостного оператора в любом // случае возникнет исключительная ситуация if (f != 0 & (d % f) == 0) Console.WriteLine("{0} делится нацело на {1}", d, f); //*** Практический пример использования обычных операторов ***// // При использовании обычного оператора, в данной конструкции // i будет инкреминироваться if (b | (++i < 10)) Console.WriteLine("i равно {0}", i); // i = 1 i = 0; 20 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) // При использовании укороченного оператора // значение i останется прежним if (b || (++i < 10)) Console.WriteLine("i равно {0}", i); // i = 0 Console.ReadLine(); } } } 21 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Приложение Б – Скриншот проверки текста курсовой работы в системе antiplagiat.ru 22 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected]) Приложение В – Скриншот проверки программы курсовой работы в системе antiplagiat.ru 23 Document shared on www.docsity.com Downloaded by: golovanoff2020 ([email protected])