Класс, предоставляющий возможности отбработки алгоритмов в форме таблиц решений

Федеральное государственное бюджетное образовательное  учреждение высшего профессионального образования

Сибирская государственная  автомобильно-дорожная академия “СибАДИ”

 

 

Факультет   Информационные системы в управлении

Специальность  090105 Комплексное обеспечение ИБ АС

Кафедра   Информационная безопасность

 

 

 

 

Курсовая  работа

по дисциплине: «Методы программирования»

 

 

 

 

 

Выполнил: студент гр. БИ-10И1

Шупенько  К.А.

Руководитель: доцент кафедры ИБ

Чегодаев  В.Н.

 

 

 

 

 

 

Омск – 2012

Федеральное государственное бюджетное образовательное  учреждение высшего

профессионального образования «Сибирская государственная автомобильно-дорожная академия (СибАДИ)»

Кафедра Информационная безопасность Утверждаю:

Зав. Кафедрой                      Семенова З.В.

Дата                                             19.09.2012

 

ЗАДАНИЕ № 25

НА КУРСОВУЮ РАБОТУ ПО ДИСЦИПЛИНЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ

 

Студент                                            Шупенько Константин Анатольевич                                               .

 

1. Тема курсовой работы

Реализовать класс, предоставляющий возможности отработки алгоритмов в форме таблиц решениий                                                                                                                                                       .

 

 

 

2. Срок сдачи студентом законченной курсовой работы

Декабрь 2012 г.                                                                                                                                              .

 

 

 

3. Исходные данные

Таблица решений                                                                                                                                          .

                                                                                                                                                                             .

 

4. Содержание расчетно-пояснительной  записки 

(перечень подлежащих разработке  вопросов)

          1. Введение                                                                                                                                          .

          2. Теоретическая часть                                                                                                                       .

          3. Проектная часть                                                                                                                              .

          4. Описание программы                                                                                                                      .

          5. Руководство пользователя                                                                                                              .

          6. Заключение                                                                                                                                      .

          7. Список литературы                                                                                                                        .

 

 

 

 

 

 

Руководитель                                                                                                                          Чегодаев В.Н.

Задание принял к исполнению                                                                                           Шупенько К.А.

 

Введение

Задание:

Реализовать класс, предоставляющий возможности  отработки алгоритмов в форме  таблиц решений.

 

Подробная постановка задачи:

  1. Реализовать класс, содержащий в себе n количество переменных;
  2. Разработать графическое приложение;
  3. С помощью прогонного метода произвести проверку правильности отработки алгоритма;

Цели:

  • Совершенствование навыков ООП (C#);
  • Повторение математической логики;
  • Изучение классов;
  • Получение навыков по организации тестов (опросов).

Методы решения:

  • Microsoft Visual Studio

 

Таблицы решений

Таблица принятия решений (таблица решений) — способ компактного представления модели со сложной логикой. Аналогично условным операторам в языках программирования, они устанавливают связь между условиями и действиями. Но, в отличие от традиционных языков программирования, таблицы решений в простой форме могут представлять связь между множеством независимых условий и действий.

Таблицы принятия решений, как правило, разделяются  на четыре квадранта, как показано на рисунке 1.

Условия

Варианты выполнения условий

Действия

Необходимость действий


Рис.1

В простейшем случае здесь «условия» — список возможных условий, «варианты» выполнения условий — комбинация из выполнения или невыполнения условий из этого списка. «Действия» — список возможных действий, «Необходимость действий» — указание на то, надо или не надо выполнять соответствующее действие для каждой из комбинаций условий. Например для ситуации «свет погас» (Рис.2)

Свет в соседней комнате горит

Да

Нет

Нет

Свет у соседей горит

-

Да

Нет

Поменять лампочку

Х

   

Проверить пробки

 

Х

 

Позвонить электрику

 

Х

Х

Позвонить диспетчеру

   

Х


Рис.2

Вариантов выполнения условия может быть не два: да или  нет, а несколько, например цвет может  быть красным, оранжевым, синим. В более  сложных таблицах может применяться нечёткая логика.

Действия могут  быть элементарными или ссылаться  на другие таблицы принятия решений. Необходимость выполнения действий может быть неупорядоченной, как в данном примере, или упорядоченной. В последнем случае если при определённой комбинации выполнения условий возможно выполнение нескольких действий, то в таблице решений указывается их приоритет.

Алгоритмы

Понятие алгоритма — одно из основных в программировании и информатике. Это последовательность команд, предназначенная исполнителю, в результате выполнения которой он должен решить поставленную задачу. Алгоритм должен описываться на формальном языке, исключающем неоднозначность толкования. Исполнитель может быть человеком или машиной. Исполнитель должен уметь выполнять все команды, составляющие алгоритм. Множество возможных команд конечно и изначально строго задано. Действия, выполняемые по этим командам, называются элементарными.

Запись  алгоритма на формальном языке называется программой. Иногда само понятие алгоритма отождествляется с его записью, так что слова «алгоритм» и «программа» — почти синонимы. Небольшое различие заключается в том, что под алгоритмом, как правило, понимают основную идею его построения. Программа же всегда связана с записью алгоритма на конкретном формальном языке.

Алгоритмы обладают свойством детерминированности (определённости): каждый шаг и переход от шага к шагу должны быть точно определены так, чтобы его мог выполнить любой другой человек или механическое устройство.

Кроме детерминированности, алгоритмы также должны обладать свойством конечности и массовости:

Конечность:

- Алгоритм всегда  должен заканчиваться за конечное  число шагов, но это число  не ограничено сверху;

Массовость:

- Алгоритм применяется  к некоторому классу входных  данных (чисел, пар чисел, набору  букв и тому подобному). Не имеет  смысла строить алгоритм нахождения  наибольшего общего делителя  только для одной пары чисел  10 и 15;

Исполнителем алгоритма может быть как человек (кулинарные рецепты, различные инструкции, алгоритмы математических вычислений), так и техническое устройство. Различные машины (компьютеры, промышленные роботы, современная бытовая техника) являются формальными исполнителями алгоритмов. От формального исполнителя не требуется понимание сущности решаемой задачи, но требуется точное выполнение последовательности команд.   

Для создания алгоритма (программы) необходимо знать:

  • полный набор исходных данных задачи (начальное состояние объекта);
  • цель создания алгоритма (конечное состояние объекта);
  • систему команд исполнителя (то есть набор команд, которые исполнитель   понимает и может выполнить).

 

 Полученный алгоритм  (программа) должен обладать следующим набором свойств:

  • дискретность (алгоритм разбит на отдельные шаги - команды);
  • однозначность (каждая команда определяет единственно возможное действие исполнителя);
  • понятность (все команды алгоритма входят в систему команд исполнителя);
  • результативность (исполнитель должен решить задачу за конечное число шагов).

Язык программирования C# (C Sharp)

C# Sharp — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

C# относится к  семье языков с C-подобным синтаксисом,  из них его синтаксис наиболее  близок к C++ и Java. Язык имеет  статическую типизацию, поддерживает  полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

Статическая типизация — приём, широко используемый в языках программирования, при котором переменная, параметр подпрограммы, возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменён позже (переменная или параметр будут принимать, а функция — возвращать значения только этого типа).

Полиморфизм (от греч. πολὺ- — много, и μορφή — форма) в языках программирования — возможность объектов с одинаковой спецификацией иметь различную реализацию.

Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут  иметь различную реализацию —  например, реализация класса может  быть изменена в процессе наследования.

Перегрузка операторов — в программировании — один из способов реализации полиморфизма, заключающийся в возможности  одновременного существования в  одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.

Переняв многое от своих предшественников — языков C++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает  некоторые модели, зарекомендовавшие  себя как проблематичные при разработке программных систем, например, C# в  отличие от C++ не поддерживает множественное  наследование классов (между тем  допускается множественное наследование интерфейсов).

Особенности языка С#

C# разрабатывался  как язык программирования прикладного  уровня для CLR и, как таковой,  зависит, прежде всего, от возможностей  самой CLR. Это касается, прежде  всего, системы типов C#, которая  отражает BCL. Присутствие или отсутствие  тех или иных выразительных  особенностей языка диктуется  тем, может ли конкретная языковая  особенность быть транслирована  в соответствующие конструкции  CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился  и сам C#; подобного взаимодействия  следует ожидать и в дальнейшем. (Однако эта закономерность была  нарушена с выходом C# 3.0, представляющего  собой расширения языка, не  опирающиеся на расширения платформы  .NET.) CLR предоставляет C#, как и всем  другим .NET-ориентированным языкам, многие возможности, которых лишены  «классические» языки программирования. Например, сборка мусора не реализована  в самом C#, а производится CLR для  программ, написанных на C# точно  так же, как это делается для  программ на VB.NET, J# и др.

Версии C#

На протяжении разработки языка C# было выпущено несколько  его версий:

Версия 1.0

Проект C# был  начат в декабре 1998 и получил  кодовое название COOL (C-style Object Oriented Language). Версия 1.0 была анонсирована вместе с  платформой .NET в июне 2000 года, тогда  же появилась и первая общедоступная  бета-версия; C# 1.0 окончательно вышел  вместе с Microsoft Visual Studio .NET в феврале 2002 года.

Первая версия C# напоминала по своим возможностям Java 1.4, несколько их расширяя: так, в C# имелись свойства (выглядящие в  коде как поля объекта, но на деле вызывающие при обращении к ним методы класса), индексаторы (подобные свойствам, но принимающие параметр как индекс массива), события, делегаты, циклы foreach, структуры, передаваемые по значению, автоматическое преобразование встроенных типов в объекты при необходимости (boxing), атрибуты, встроенные средства взаимодействия с неуправляемым кодом (DLL, COM) и  прочее.

Кроме того, в C# решено было перенести некоторые возможности C++, отсутствовавшие в Java: беззнаковые  типы, перегрузку операторов (с некоторыми ограничениями, в отличие от C++), передача параметров в метод по ссылке, методы с переменным числом параметров, оператор goto (с ограничениями). Также в C# оставили ограниченную возможность работы с  указателями — в местах кода, специально обозначенных словом unsafe и  при указании специальной опции  компилятору.

Версия 2.0

Проект спецификации C# 2.0 впервые был опубликован Microsoft в октябре 2003 года; в 2004 году выходили бета-версии (проект с кодовым названием Whidbey), C# 2.0 окончательно вышел 7 ноября 2005 года вместе с Visual Studio 2005 и .NET 2.0.

Новые возможности  в версии 2.0:

1) Частичные типы (разделение реализации класса более чем на один файл).

2) Обобщённые, или параметризованные типы (generics). В отличие от шаблонов C++, они поддерживают некоторые дополнительные возможности и работают на уровне виртуальной машины. Вместе с тем, параметрами обобщённого типа не могут быть выражения, они не могут быть полностью или частично специализированы, не поддерживают шаблонных параметров по умолчанию, от шаблонного параметра нельзя наследоваться, и т. д.[12]

3)Новая форма итератора, позволяющая создавать сопрограммы с помощью ключевого слова yield, подобно Python и Ruby.

4) Анонимные методы, обеспечивающие функциональность замыкания.

5) Обнуляемые ('nullable') типы-значения (обозначаемые вопросительным знаком, например, int? i = null;), представляющие собой те же самые типы-значения, способные принимать также значение null. Такие типы позволяют улучшить взаимодействие с базами данных через язык SQL.

6) Возможность создавать хранимые процедуры, триггеры и даже типы данных на .Net языках (в том числе и на C#).

7) Поддержка 64-разрядных вычислений, что кроме всего прочего, позволяет увеличить адресное пространство и использовать 64-разрядные примитивные типы данных.

Версия 3.0

В июне 2004 года Андерс Хейлсберг впервые рассказал  на сайте Microsoft о планируемых расширениях  языка в C#3.0.[13] В сентябре 2005 года вышли проект спецификации C# 3.0 и  бета-версия C# 3.0, устанавливаемая в  виде дополнения к существующим Visual Studio 2005 и .NET 2.0. Окончательно эта версия языка вошла в Visual Studio 2008 и .NET 3.5.

Новые возможности  в версии 3.0:

1) Ключевые слова select, from, where, позволяющие делать запросы из SQL, XML, коллекций и т. п. (запрос, интегрированный в язык, Language Integrated Query, или LINQ)

2) Инициализация объекта вместе с его свойствами

3) Вывод типов локальной переменной: var x = "hello"; вместо string x = "hello";

4) Безымянные типы: var x = new { Name = "James" };

5) Методы-расширения — добавление метода в существующий класс с помощью ключевого слова this при первом параметре статической функции.

6) Автоматические свойства: компилятор сгенерирует закрытое (private) поле и соответствующие аксессор и мутатор для кода вида:

public string Name { get; private set; }

C# 3.0 совместим  с C# 2.0 по генерируемому MSIL-коду; улучшения в языке — чисто  синтаксические и реализуются  на этапе компиляции. Например, многие  из интегрированных запросов LINQ можно осуществить, используя  безымянные делегаты в сочетании  с предикатными методами над  контейнерами наподобие List.FindAll и  List.RemoveAll.

Версия 4.0

Превью C# 4.0 было представлено в конце 2008 года, вместе с CTP-версией Visual Studio 2010.

Visual Basic 10.0 и C# 4.0 были выпущены в апреле 2010 года, одновременно с выпуском Visual Studio 2010.

Новые возможности в версии 4.0:

1) Возможность использования позднего связывания

2) Именованные и опциональные параметры

3) Новые возможности COM interop

4) Ковариантность и контрвариантность

5) Контракты в коде (Code Contracts)

Понятие класса, классы в языке  C#

Класс в программировании — набор методов и функций. Наряду с понятием «объекта» класс является ключевым понятием в ООП.

На практике объектно-ориентированное программирование сводится к созданию некоторого набора классов, включая интерфейс и реализацию, и последующему их использованию. Графическое представление набора классов и связей между ними называется диаграммой классов. Объектно-ориентированный подход за время своего развития накопил множество рекомендаций (паттернов) по созданию классов и иерархий классов.

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

Как и структуры, классы могут задавать поля — то есть переменные, принадлежащие либо непосредственно самому классу (статические), либо экземплярам класса (обычные). Статические поля существуют в одном экземпляре на всю программу (или, в более сложном варианте, — в одном экземпляре на процесс или на поток/нить). Обычные поля создаются по одной копии для каждого конкретного объекта — экземпляра класса. Например, общее количество строк текста, созданных в программе за время её работы, будет являться статическим полем класса «строка текста». А конкретный массив символов строки будет являться обычным полем экземпляра класса «строка текста», так же как переменная «фамилия», имеющая тип «строка текста», будет являться обычным полем каждого конкретного экземпляра класса «человек».

Как и поля, код в виде методов/функций/процедур, принадлежащих классу, может быть отнесен либо к самому классу, либо к экземплярам класса. Метод, принадлежащий  классу и соотнесенный с классом (статический метод) может быть вызван сам по себе и имеет доступ к  статическим переменным класса. Метод, соотнесенный с экземпляром класса (обычный метод), может быть вызван только у самого объекта, и имеет  доступ как к статическим полям  класса, так и к обычным полям  конкретного объекта (при вызове этот объект передастся скрытым параметром метода). Например, общее количество созданных строк можно узнать из любого места программы, но длину  конкретной строки можно узнать только указав, тем или иным образом, длину  какой строки будем мерить.

Объявление класса в языке C#

Классы объявляются  с помощью ключевого слова class, как показано в следующем примере: public class Customer

Ключевому слову class предшествует уровень доступа. Поскольку в  данном случае используется public, любой  может создавать объекты из этого  класса. Имя класса указывается после  ключевого слова class. Оставшаяся часть  определения является телом класса, в котором задаются данные и поведение. Поля, свойства, методы и события  в классе обозначаются термином члены  класса.

Создание объектов в классе

Класс и объект — это  разные вещи, хотя в некоторых случаях  они взаимозаменяемы. Класс определяет тип объекта, но не сам объект. Объект — это конкретная сущность, основанная на классе и иногда называемая экземпляром  класса.

Объекты можно создавать  с помощью ключевого слова new, за которым следует имя класса, на котором будет основан объект:

 

Customer object1 = new Customer();

 

При создании экземпляра класса ссылка на этот объект передается программисту. В предыдущем примере object1 является ссылкой на объект, основанный на Customer. Эта ссылка указывает на новый  объект, но не содержит данные этого  объекта. Фактически, можно создать  ссылку на объект без создания самого объекта:

 

Customer object2;

 

Создание таких ссылок, которые не указывают на объект, не рекомендуется, так как попытка  доступа к объекту по такой  ссылке приведет к сбою во время  выполнения. Однако такую ссылку можно  сделать указывающей на объект, создав новый объект или назначив ее существующему  объекту:

 

Customer object3 = new Customer();

Customer object4 = object3;

 

В данном коде создаются  две ссылки на объекты, которые указывают  на один объект. Поэтому любые изменения  объекта, выполненные посредством object3, будут видны при последующем  использовании object4. Поскольку на объекты, основанные на классах, указывают ссылки, классы называют ссылочными типами.

 

Наследование  классов

 

Наследование выполняется  с помощью образования производных, то есть класс объявляется с помощью  базового класса, от которого он наследует  данные и поведение. Базовый класс  задается добавлением после имени  производного класса двоеточия и  имени базового класса:

 

public class Manager : Employee {}

 

Когда класс объявляет  базовый тип, он наследует все  члены базового класса, за исключением  конструкторов.

В отличие от C++, класс  в C# может только напрямую наследовать  от одного базового класса. Однако, поскольку  базовый класс может сам наследовать  от другого класса, класс может  косвенно наследовать несколько  базовых классов. Кроме того, класс  может напрямую реализовать несколько  интерфейсов. Дополнительные сведения см. в разделе Интерфейсы (Руководство  по программированию в C#).

Класс может быть объявлен абстрактным. Абстрактный класс  содержит абстрактные методы, которые  имеют определение сигнатуры, но не имеют реализации. Создавать абстрактные  классы нельзя. Они могут использоваться только посредством производных  классов, реализующих абстрактные  методы. И наоборот, запечатанный класс  не позволяет другим классам быть от него производными.

Описание класса, используемого  в программе

Название класса: class algoritm

Поля класса:

        • private string[] states - приватное поле класса, представляющее собой одномерный строковый массив условий
    • private string[] acts - приватное поле класса, представляющее собой одномерный строковый массив действий
    • private char[] table - приватное поле класса, представляющее собой двумерный массив символов, описывающих таблицу истинности

Конструктор класса:

public algoritm(string[] s1, string[] s2, string[] s3) - конструктор класса, принимающий в качестве аргументов 3 строковых одномерных массива: массив условий, массив действий, таблицу истинности

Метод класса:

public string MakeDecision(bool[] s) - публичный метод класса, в качестве аргументов принимает  одномерный   массив   bool-переменных,   характеризующий,   какие   условия

выполняются в данной ситуации и возвращающий строку требуемых  действий.

Свойства класса:

public int StatesCount - публичное свойство класса, доступное только для чтения. Возвращает количество условий в текущем алгоритме.

public string[] state - публичное свойство класса, доступное только для чтения. Возвращает строковый массив условий текущего алгоритма.

Исходный код класса algoritm

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace TableOfDecision

{

    class algoritm

    {

        private string[] states;

        private string[] acts;

        private char[,] table;

        public algoritm(string[] s1, string[] s2, string[] s3)

        {

                states = new string[s1.Length];

                for (int i = 0; i < s1.Length; i++) states[i] = s1[i];

                acts = new string[s2.Length];

                for (int i = 0; i < s2.Length; i++) acts[i] = s2[i];

                table = new char[s2.Length, s1.Length];

Класс, предоставляющий возможности отбработки алгоритмов в форме таблиц решений