Реферат: Обучающая программа по информатике

Содержание

Введение

Глава 1. Исследовательская часть

1.1 Целесообразность выбора языкапрограммирования

1.2. Основные структуры языкапрограммирования C#

1.3. Кодирование по методу четности /нечетности

1.4. Кодирование по методу Хэмминга

1.5. Машина Поста

Глава 2. Инструкция программиста

Глава 3. Инструкция пользователя

3.1 Использование программыStudyProgram для усвоения учебного материала по кодированию информации методомчетности и методом Хэмминга

3.2 Использование обучающей программыStudyProgram для овладения навыками составления программ для машины Поста

Заключение

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

Приложение


Введение

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

Цель работы: улучшить ирасширить навыки работы на языке программирования C#.

Основные функции обучающейпрограммы: изучение данных методов кодирования двоичных чисел ипрограммирование машины Поста. Курсовой проект состоит из обучающей программы сразбиением по разделам.

Для создания курсового проектаиспользовался C# – новый язык программирования компанииMicrosoft, входящий в Visual Studio .Net(v.7).


Глава1. Исследовательская часть 1.1 Целесообразность выбора языка программирования

Вкурсовом проекте была поставлена задача, реализация которой может бытьпроизведена с помощью различных языков программирования. Но мы выбрали язык С#,входящий в Visual Studio .Net (v.7), так как он имеет ряд преимуществ, которые упрощаютпроцесс создания приложений. Немаловажную роль в выборе языка сыграло то, что C# — лучший .NET-язык, так как он был специально спроектирован для .NETFramework.

C# создавался Microsoft, как основной язык для .NETFramework. Microsoft спроектировала C# таким образом, что бы С, С++ иJava-программисты смогли легко перейти на него. C# имеет корни в языках С, С++и Java, поэтому такой переход не должен вызвать затруднений.

Синтаксис у C# не такой сложный как у С++, поэтому егоизучение намного легче. Большинство операций, которые вы можете делать на С++,можно сделать и на C#, за исключением операций доступа к низкоуровневымфункциям (это все-таки можно сделать с помощью неуправляемого кода).

С# — первый язык, поддерживаемый версиями .NETFramework для других платформ.

Язык, который использует библиотеку классов .NETFramework (FCL) и управляется общеязыковой средой исполнения (CLR) является.NET-совместимым языком (язык, который поддерживает платформа .NET). Средитаких языков: Microsoft Visual Basic .NET (VB .NET), Microsoft Visual C++ .NET, а также COBOL, Eiffel, Jscript, RPG и другие. Как мы говорили ранее, C# былспроектирован специально для .NET Framework и содержит некоторуюфункциональность, которую вы не найдете в других языках.

Программист,привыкший к платформе Майкрософт, может представить себе C# как промежуточныйвариант между C++ и Visual Basic, если рассматривать сложность языковыхконструкций и возможности языка.

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

Присоздании языка в основу дизайна легла легкость использования, доминирующая надмощностью языка и скоростью выполнения. [7] Отсюда и сборщик мусора суправляемыми объектными ссылками, который автоматически освобождает за Васпамять, отбирая при этом процессорное время. Вы также получаете безопасностьработы с типами, а это, по мнению многих, является вторым важнейшим факторомизбежания ошибок.
C# объектно-ориентированный язык, как и вся платформа .NET[7].

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

ВC# представлена концепция пространств имен, аналогичная пакетам в Java. Этопозволяет иерархически структурировать Вашу систему типов, делая код намногоболее понятным и позволяя избежать проблем с именованием. Вы можете рассматриватьпространства имен как директории, а языковые типы как файлы в этих директориях.

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

Ввидуочень удобного объектно-ориентированного дизайна, C# является хорошим выборомдля быстрого конструирования различных компонентов — от высокоуровневой бизнеслогики до системных приложений, использующих низкоуровневый код[6]. Такжеследует отметить, что C# является и Web ориентированным — используя простыевстроенные конструкции языка ваши компоненты могут быть легко превращены в Webсервисы, к которым можно будет обращаться из Internet посредством любого языкана любой операционной системе. Дополнительные возможности и преимущества переддругими языками приносит в C# использование передовых Web технологий, такихкак: XML (Extensible Markup Language) и SOAP (Simple Object Access Protocol).Среда разработки Web сервисов позволяет программисту смотреть на существующиесегодня Web приложения, как на родные C# объекты, что дает возможностьразработчикам соотнести имеющиеся Web сервисы с их познаниями вобъектно-ориентированном программировании[6].

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

1.2. Основные структуры языкапрограммирования C#

 

Классы

Классы — сердце каждогообъектно-ориентированного языка. Как вы помните, класс представляет собойинкапсуляцию данных и методов их обработки. Это справедливо для любогообъектно-ориентированного языка и отличаются они в этом плане лишь типами техданных, которые можно хранить в виде членов, а также возможностями классов. В том,что касается классов и многих функций языка, С# кое-что заимствует из C++ иJava, и привносит немного изобретательности, помогающей найти элегантныерешения старых проблем.

Синтаксис определенияклассов на С#, прост, особенно если вы программируете на C++ или Java. Поместивперед именем вашего класса ключевое слово class, вы вставляете члены класса,заключенные в фигурные скобки, например:

class Employee

{

private longemployeeld;

}

Как видите, этотпростейший класс с именем Employee содержит единственный член — employeeld. Заметьте:имени члена предшествует ключевое слово private — это модификатор доступа (accessmodifier).

Членыкласса

Типы, определенные в CIS(Common Type System) поддерживаются как члены классов С# и бывают следующихвидов.

·  Поле. Так называется член-переменная, содержащий некотороезначение. В ООП поля иногда называют данными объекта. К полю можно применятьнесколько модификаторов в зависимости от того, как вы собираетесь это полеиспользовать. В число модификаторов входят static, readonly и const.

·  Метод. Это реальный код, воздействующий на данные объекта(или поля).

·  Свойства. Их иногда называют «разумными»полями (smart fields), так как они на самом деле являются методами, которыеклиенты класса воспринимают как поля. Это обеспечивает клиентам большую степеньабстрагирования за счет того, что им не нужно знать, обращаются ли они к полюнапрямую или через вызов метода-аксессора.

·  Константы. Как можно предположить, исходя изимени, константа — это поле, значение которого изменить нельзя.

·  Индексаторы. Если свойства — это«разумные» поля, то индексаторы — это «разумные» массивы,так как они позволяют индексировать объекты методами-аксессорами get и set. Спомощью индексатора легко проиндексировать объект для установки или получениязначений.

·  События. Событие вызывает исполнениенекоторого фрагмента кода. События — неотъемлемая часть программирования дляMicrosoft Windows. Например, события возникают при движении мыши, щелчке илиизменении размеров окна. События С# используют ту же стандартную модельпубликации/подписки (publish/subscribe), что и в MSMQ (Microsoft MessageQueuing) и асинхронной модели событий СОМ+, которая дает приложению средстваасинхронной обработки событий. Но в С# это базовая концепция, встроенная в язык.

·  Операторы. Используя перегрузку операторов С#,можно добавлять к классу стандартные математические операторы, которыепозволяют писать более интуитивно понятный код.

Массивы

Массивы в C# очень простыи похожи на массивы в C++. В C# имеется три основных типа массивов: одномерные,многомерные и неровные(jagged):
С одномерными массивами все как обычно:

Инициализация.

Инициализируются онитакже как в C++:

int[] array =new int[10];

int[] array ={1, 2, 3, 4, 5};

Доступ

Доступ к элементампроизводится с помощью оператора []:

int element = array[0];

Элементы нумеруютсяиндексами от 0 до N — 1, где N — размер массива.
Многомерные массивы представляют собой многомерные кубы значений. Элементытаких массивов идентифицируются набором индексов — «координат» вмногомерном пространстве. Каждое измерение имеет свою размерность, не зависящуюот других. Отметим, что многомерные массивы являются важным отличием от другихподобных языков (Java), ибо по сравнению с неровными массивами, обеспечиваютгораздо большую производительность.


Инициализация

При инициализацииразмерности измерений указываются через запятую:

int[,] array =new int[10, 20];

int[,] array ={{1, 2}, {3, 4}};

Доступ

Доступ к элементампроизводится с помощью оператора [], в котором индексы также указываются череззапятую:

int element = array[0,2];

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

Управляющиеконструкции

Управляющие конструкции — это то средство, которое позволяет вам создавать алгоритмы. Стандартнымиуправляющими конструкциями являются if, for, while goto. К тому же в C# естьмного дополнительных конструкций: switch, do и foreach.

if..else

Блок if..else, какследует из названия, позволяет выполнять код при выполнении определенногоусловия.

if (a > b)

{

 Console.WriteLine(«a> b»);

}

else

{

 Console.WriteLine(«a<= b»);

}

Логическое выражение вскобках должно иметь тип bool (в отличие от C/C++, где выражение было целым).Если оно истинно, выполнится первый блок команд, если ложно — второй. При этомесли какой-либо блок команд состоит лишь из одной команды, обрамляющие фигурныескобки можно опустить[8]:

if(serverObject != null)

 serverObject.Initialize();

Покажем несколькопримеров:

// Идет проверка, чтобыизбежать деления на 0

if (x != 0)

{

 d /= x;

}

else

 return;

// Проверяем, вернула липроцедура значение и, если нет, возвращаем null

if(command.Parameters[«RETURN_VALUE»].Value != Convert.DBNull)

 returncommand.Parameters[«RETURN_VALUE»].Value;

else

 return null;

Цикл for

Цикл for представляетцикл с инициализирующей командой, условием окончания и командой перехода.

ArrayList items = newArrayList(); // Инициализируем список некоторым образом

CreateArray(items); //Выводим все его элементы по очереди

for (int i =0; i < items.Count; i++)

{

Console.WriteLine(«i[{0}]= {1}», i, items[i]);

}

Логика выполнения цикласледующая: сначала выполняется инициализирующая команда, далее идет шаг цикла:проверяется условие окончания, если оно ложно, то цикл прекращается иуправление переходит на следующую за циклом команду, иначе выполняется телоцикла, а после него — команда перехода.

В простейшем случае циклfor оформлен следующим образом:

// Складываем всеэлементы массива

for (int i = 0; i <10; i++)

sum += array[i];

Такая форма цикла используется,если вам нужно проитерироваться с целым параметром, указывающим номер итерацииили если просто нужно выполнить действие некоторое количество (в нашем примере10) раз.

while

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

// Задаем число

int num = 678;

// Число разрядов — 0

int len = 0;

// считаем сколькоразрядов в числе

while (num> 0)

{

 len++;

 num /= 10;

}

Console.WriteLine(len);

Семантика очень проста:проверяем условие перехода. Если оно истинно, то переходим к телу цикла и затемснова к проверке условия, иначе — прекращаем выполнение цикла.

switch

Оператор switch являетсярасширенным оператором ветвления, который позволяет в зависимости от значениявыражения перейти к выполнению определенного кода. По сути, он эквивалентеннабору блоков if, но гораздо более оптимален.

Наиболее распространеннымсинтаксисом switch является следующий:

int a = 1;

switch (a)

{

         case0:

                   //Операторы, выполняющиеся если a = 0

                   Console.WriteLine(«A= 0»);

                   break;

         case 1:

                   //Операторы,выполняющиеся если a = 1

                   Console.WriteLine(«A= 1»);

                  break;

         default:

                   //Операторы, выполняющиеся, если ниодин из явных случаев не подошел

                   Console.WriteLine(«A<> 0 и A <> 1»);

                   break;

}

Блок case x выполняется,если выражение, указанное в скобках после switch равно x. Блок default — еслини одно из case-выражений не выполнилось. Удобно switch использовать дляобработки выражений перечислимых типов.

Для переходов междублоками можно использовать команды goto case и goto default.

do

Оператор do реализуетцикл с постусловием. Суть этого цикла аналогична while, но условие выходапроверяется не до итерации, а после. Это иногда бывает удобным.

string s = «A, B, C, D»;

do

{

 s =s.Substring(s.IndexOf(",") + 1);

} while (s.Length >0);

Обычно его используют,когда проверку нужно выполнить после того, как прошла хотя бы одна итерация.

Поля и методы

Объявление полейаналогично объявлению переменных и имеет вид:

<модификатор_доступности><тип> <идент_поля>;

Существует несколькоразличных модификаторов доступа. Мы будем использовать только один – public. В качестве типа можетиспользоваться любой из стандартных или пользовательских. Идентификатор принятоначинать с буквы f с указанием,какое свойство реального объекта отражает это поле, например, fSpeed.

Если имя поля состоит изнескольких слов, то используется верблюжья нотация fMaxFloor. Например, объявление полей классовможет иметь вид:

public int fLevel;

public intfPassenger;

public floatfSpeed;

При объявлении методовиспользуется конструкция вида:

<модиф_дост><тип_возвр_знач><идент_метода>(<формальн_парам>opt)

{

 <тело_метода>

}

Метод в процессе своейработы может не только изменять поля объекта, но и вычислять некоторыедополнительные значения. Тип возвращаемого методом значения и указываетсявместо <тип_возвр_знач>.

Если возвращать значенияне нужно, то в качестве типа возвращаемого значения указывается void.

Параметры методов бываютформальные и реальные. Формальные параметры используются при объявлении методав круглых скобках, идущих за идентификатором метода. Реальные параметрыпередаются в метод при обращении к нему в круглых скобках. В случае если уметода есть параметры, его объявление будет иметь вид:

<модиф_дост><тип_возвр_знач><идент_перем> (<список_форм_пар>)

{

         <тело_цикла>

}

<список_формальных_параметров>::=<тип><идент>,<тип><идент>opt ..

Например, public void Move (bytelevel)

В качестве реальногопараметра в метод может передаваться константа, переменная, результатвыполнения операции, значение возвращаемой функции и т.д. Единственноеограничение – тип реального параметра должен совпадать с типом формальногопараметра[9].

В случае использованияпростых типов для объявления формальных параметров значения передаются в метод,и даже если их в методе изменять, реальный параметр не изменится.

В случае, когда методутребуется вернуть более 1 значения, для 2, 3 и т.д. возвращаемого значенияперед типом формального параметра, используемого для возвращения значения,ставится ключевое слово ref. Вслучае вызова такого метода перед реальным параметром также указываетсяключевое слово ref, и реальныйпараметр в этом случае может быть только переменной.

1.3. Кодирование по методу четности /нечетности

Для контроля правильностипередачи информации, а также как средство шифрования информации используютсяразличные коды. Коды, использующие для передачи информации два различныхэлементарных сигнала, называются двоичными. Эти сигналы удобно обозначатьсимволами 0 и 1. Тогда кодовое слово будет состоять из последовательности нулейи единиц.

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

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

При этом абсолютнаяизбыточность будет выражаться количеством контрольных разрядов – k, а относительная избыточность – />, где m – количество информационныхразрядов.

Понятие корректирующейспособности кода связывают с возможностью обнаружения и исправления ошибки.Количественно корректирующая способность кода определяется вероятностьюобнаружения или исправления ошибки[4].

Одной из простейших формпроверки ошибок является контроль на четность. В чем же заключается смыслкодирования по методу четности / нечетности? Его суть заключается в том, чтокаждой кодовой комбинации добавляется один разряд, в который записываетсяединица, если число единиц в кодовой комбинации нечетное, или ноль, есличетное. При декодировании подсчитывается количество единиц в кодовойкомбинации. Если оно оказывается четным, то поступившая информация считаетсяправильной, если нет, то ошибочной.

Кроме проверки погоризонтали контроль на четность и нечетность может проводиться и по вертикали.

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

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

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

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

 Рассмотрим подробно способ нахожденияодной ошибки. Если в математическом коде выделен один контрольный разряд, то ккаждому двоичному числу добавляется один избыточный разряд. В этот разрядзаписывается 1 или 0 с таким условием, чтобы сумма цифр по модулю 2 была равна0 для случая четности или 1 для случая нечетности. Появление ошибки вкодировании обнаруживается по нарушению четности / нечетности. При такомкодировании допускается, что может возникнуть только одна ошибка.

Пример реализации методачетности:

Число Контрольный разряд Проверка 10101011 1 11001010 10010001 1 11001011 1 – ошибка

Можно представить инесколько видоизмененный способ контроля по методу четности / нечетности.Длинное слово разбивается на группы, каждая из которых содержит n разрядов. Контрольные разряды – k, выделяются всем группам по строками столбцам согласно следующей схеме:

/>

Увеличение избыточностиприводит к тому, что появляется возможность не только обнаружить ошибку, но иисправить ее.

Например: число1000111011010101110010101 представим по указанной выше схеме, получим:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Теперь, если при передаче былополучено число:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

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


1.4. Кодирование по методу Хэмминга

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

Предложенные Хэммингомрегулярные методы построения кодов, корректирующих ошибки, имеютфундаментальное значение. Они демонстрируют инженерам практическую возможностьдостижения пределов, на которую указывали законы теории информации. Эти кодынашли практическое применение при создании компьютерных систем. Работа Хэммингапривела к решению проблемы более плотной упаковки для конечных полей. Он ввел внаучный обиход важнейшие понятия теории кодирования – расстояние Хэмминга междукодовыми комбинациями в векторном пространстве, определяемом для двоичных кодовкак количество позиций этих комбинаций с различными символами, и границы Хэммингадля исправляющей способности блочных корректирующих кодов. Граница Хэмминга длядвоичных кодов рассчитывается по следующей формуле:

/>

В этом выражении числоошибок e может быть исправленокорректирующим блочным кодом длиной N,имеющим М кодовых комбинаций (CjN – биномиальный коэффициент)[3].

Работа Хэмминга сыгралаключевую роль в последующем развитии теории кодирования и стимулировалаобширные исследования, выполненные в последующие годы.

Коды Хэмминга позволяютне только обнаружить наличие ошибки, но и место ее нахождения и, следовательно,дают возможность ее исправить. Однако коды Хэмминга обладают меньшейизбыточностью (по сравнению с кодированием по методу четности-нечетности), т.е.количеством дополнительных контрольных разрядов.

При передаче кода можетбыть искажен или не искажен любой символ. Если длина кода – n символов, то />– полное количество комбинаций кода. По методикеХэмминга можно определить число информационных символов кода, обнаруживающего икорректирующего одиночную ошибку следующим образом:

/>

/>, где

/>      – число информационных символов в коде;

/>      – число контрольных символов;

/> – длина кода Хемминга.

Соотношение n, />и /> для кода Хэмминга можно представитьв виде таблицы:

Таблица 2.2.a

 n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

/>

1 1 2 3 4 4 5 6 7 8 9 10 11 11

/>

1 2 2 3 3 3 3 4 4 4 4 4 4 4 4 5

Предположим, что имеетсякод, содержащий m информационных и k контрольных разрядов. Все разряды, включаяконтрольные, разбиваются на k групп по определенным правилам, о которых будетсказано ниже. Каждая группа, содержащая один контрольный разряд, проверяется начетность. Пусть были проведены все k проверок. Если результат данной проверкисвидетельствует об отсутствии ошибки, то записывается 0, если есть ошибка, тозаписывается 1. В результате получается последовательность, состоящая из kнулей и единиц. При отсутствии ошибки в коде получается последовательностьнулей. Полученное k-разрядное двоичное число может содержать 2k различныхкомбинаций нулей и единиц. С помощью этой информации нужно определить ошибочныйразряд в коде, содержащем m+kразрядов. Для того чтобы это было возможно должно выполняться неравенство:

2k  (m+k+1)

Определить максимальноезначение m для данного k можно из следующей таблицы.

n 1,2,3,4… 8,…,15 16,…31 … m 0,0,1,1… 4,…11 11,…26 … k 1,2,2,3 4…4 5…5 …

Из таблицы видно, для16-ти разрядного числа требуется 5 контрольных разрядов. В качестве сравнения,в случае модифицированного метода четности потребовалось бы 8 контрольныхразрядов. Позиции контрольных разрядов в методе Хэмминга определены заранее,это разряды 1,2,4,8,… Разряды, входящие в каждую группу проверки представлены вследующей таблице (1-й разряд в каждой группе является контрольным).

номер группы проверки проверяемые разряды 1 1,3,5,7,9,11,13,15,… 2 2,3,6,7,10,11,14,15,18,19,22,23,… 3 4,5,6,7,12,13,14,15,20,21,22,23,… 4 8,9,10,11,12,13,14,15,24,…

Из таблицы видно, чтоесли, например код Хэмминга содержит 9 разрядов, включая контрольные, то 1-ягруппа проверки содержит 1,3,5,7,9 разряды. 2-я группа проверки содержит2,3,6,7 разряды. 3-группа проверки содержит 4,5,6,7 разряды и 4-я группа – 8,9разряды. Каждой группе проверки приписывается 1, если проверка на четностьобнаруживает ошибку и 0, если ошибки нет. Полученное двоичное число дает номерошибочного разряда.

Код Хэмминга имеетсущественный недостаток: при обнаружении любого числа ошибок он исправляет лишьодиночные ошибки. Например, избыточность семиэлементного кода Хэмминга равна0,43. При увеличении значности кодовых комбинаций увеличивается число проверок,но уменьшается избыточность кода. К тому же код Хэмминга не позволяетобнаружить групповые ошибки. Длина пакета ошибок представляет собой увеличеннуюна единицу разность между именами старшего и младшего ошибочных элементов.

Рассмотрим в качествепримера 5-ти разрядное двоичное число 10011. В этом случае, как следует извышеприведенной таблицы, 1-я группа проверки состоит из 1,3, и 5-го разрядов.2-я группа проверки состоит из 2 и 3-го разряда. 3-я группа проверки состоит из4 и 5-го разрядов. Результат проверки на четность 1-й группы дает 0 (101),проверка 2-й группы дает 0 (00), проверка 3-й группы дает 0 (11).

k1 = 1 + 0 + 1 = 0 – нет ошибки;

k2 = 0 + 0 =0 – нет ошибки;

k3 = 1 + 1 = 0 – нет ошибки.

Таким образом, данноечисло не содержит ошибки. Искусственно введем ошибку, заменив, например, 4-йразряд на 0. В этом случае 1, 2 и 3-я проверки дадут соответственно 0, 0, 1.

k1 = 1 + 0 + 1 = 0 – нет ошибки;

k2 = 0 + 0 =0 – нет ошибки;

k3 = 0 + 1 = 1 – ошибка.

Полученное двоичное число100 дает номер ошибочного разряда, т.е. 4.


1.5. Машина Поста

«Внешний вид» машины Поста

Машина Поста не естьреально существующее, сделанное кем-то устройство; поэтому слова «внешний вид» ивзяты в кавычки. Машина Поста, как и ее близкий родствен­ник — машина Тьюринга,- представляет собой мысленную конструкцию, существующую лишь в нашемвоображении<sup/>(хотя ее в принципе и можно было бы изготовить «вметалле»). Именно это имеют в виду, когда говорят о машинах Поста и Тьюринга,что они суть «абстрактные» вычислительные машины. И подобно тому, как можновыучиться считать на счетах или на логарифмической линейке, не имея перед собойэтих приборов, а, пользуясь лишь их описаниями и представляя их себе мысленно,так же и мы научимся вычислять на машине Поста.

Машина Поста состоит из лентыи каретки (назы­ваемой также считывающей и записывающей головкой).

Лента бесконечна иразделена на секции одинакового размера: для наглядности ленту будем считатьрасположенной горизонтально (рис. 13).

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

Порядок, в которомрасположены секции ленты, подобен порядку, в котором расположены все целыечисла. Поэтому естественно ввести на ленте «целочисленную систему координат», занумеровав секции целыми числами ...,-3,-2,-1,0,1, 2,3,… (рис. 14).

Мы будем считать, чтосистема координат жестко сопоставлена с лентой, и получим, таким образом, воз­можностьуказывать какую-либо секцию ленты, называя ее порядковый номер, или координату.(Иногда, впрочем, бывает удобно наряду с основной, «постоянной» системойкоординат, ввести еще вспомогательную, «временную», сдвинутую по отношению кпервоначальной)

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

Информация о том, какиесекции пусты, а какие отмечены, образует состояние ленты. Иными словами, со­стояниеленты — это распределение меток по ее сек­циям. Как мы далее увидим, состояниеленты ме­няется в процессе работы машины.

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

Информация о том, какиесекции пусты, а какие отмечены и где стоит каретка, образует состояние машиныПоста.

Таким образом, состояниемашины слагается из состояния ленты и указания номера той секции, которуюобозревает каретка. За единицу времени (которую мы будем называть шагом) кареткаможет сдвинуться на одну секцию влево или вправо. Кроме того, каретка можетпоставить (напечатать) или уничтожить (стереть) метку на той секции, противкоторой она стоит, а также распознать, стоит или нет метка в обозреваемой еюсекцией[2].

 

Программамашины Поста

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

Каждая программа машиныПоста состоит из команд. Командой машины Поста будем называть выражение,имеющее один из следующих шести видов (буквы i, j, j1, j2 означают всюду натуральные числа 1, 2, 3, 4, 5, …):

Первый вид. Командыдвижения вправо.

/>

Второй вид. Командыдвижения влево.

/>

Третий вид. Командыпечатания метки.

/>

Четвертый вид. Командыстирания метки.

/>

Пятый вид. Командыпередачи управления.

/>

Шестой вид. Командыостановки.

/>

Например,

 />

является командойдвижения вправо,

/>

— командой передачиуправления, а

/>

-командой остановки.

Число i, стоящее в начале команды,называется номером команды. Так, у приведенных только что команд номерасоответственно 137, 25 и 6386. Число j, стоящее в конце команды (а у команд передачи управления — каждое из чиселj1, и j2), будем называть отсылкой (при этомв команде передачи управления j1—верхней, а j2 — нижней отсылкой). У команд остановки нет отсылки. Так, уприведенных только что команд отсылками служат числа 1, 32, 25, причем 32—верхняя отсылка, а 25 — нижняя отсылка.

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

1) На первом месте в этомсписке стоит команда с номером 1, на втором месте (если оно есть) – команда сномером 2 и т. д.; вообще на k-м месте стоит команда с номером k.

2) Отсылка любой изкоманд списка совпадает с номером некоторой (другой или той же самой) команды списка(более точно: для каждой отсылки каждой команды списка найдется в.списке такаякоманда, номер которой равен рассматриваемой отсылке).

Например, следующийсписок будет программой машины Поста:

А эти два списка не будутпрограммами машины Поста,<sub/>хотя и составлены из команд машины Поста:

Для наглядности программымашины Поста мы будем записывать столбиком. Число команд программы называется длинойпрограммы[1].

Работамашины Поста

Чтобы машина Поста началаработать, надо задать, во-первых, некоторую программу, а во-вторых, некотороеее (машины) состояние, т. е. как-то расставить метки по секциям ленты (вчастности, можно все секции оставить пустыми) и поставить каретку против однойиз секций. Как правило, мы будем предполагать, что в начальном (т.е. взадаваемом вначале) состоянии машины каретка ставится всегда против секции сномером (координатой) нуль. При таком соглашении начальное состояние машиныполностью определено состоянием ленты.

Как уже говорилось,программа является той инструкцией, на основании которой работает машина.Работа машины на основании заданной программы (и при заданном начальномсостоянии) происходит следующим образом. Машина приводится в начальноесостояние и приступает к выполнению первой команды программы. Эта командавыполняется за один шаг, после чего машина приступает к выполнению той команды,номер которой (назовем его а) равен отсылке (одной из отсылок, если их две)первой команды. Эта команда также выполняется за один шаг, после чегоначинается выполнение команды, номер которой равен отсылке команды с номером а.Вообще каждая команда выполняется за один шаг, а переход от выполнения однойкоманды к выполнению другой происходит по следую­щему правилу: пусть на k-м шаге выполнялась команда с номеромi, тогда, если эта команда имеетединственную отсылку j, тона k+1-м шаге выполняется команда сномером j; если эта команда имеет две отсылки j1 и j2, то на k+1-м шаге выполняется одна из двух команд – с номером j1 или с номером; если, наконец, выполняющаяся на k-м шаге команда вовсе не имеетотсылки, то на k + 1-м шаге и на всех последующихшагах не выполняется никакая команда: машина останавливается. Осталосьобъяснить, что значит выполнить команду и какая из отсылок — при наличии двух — выбирается в качестве номера следующей команды.

Выполнение командыдвижения вправо состоит а том, что каретка сдвигается на одну секцию вправо.Выполнение команды движения влево состоит в том, что каретка сдвигается на однусекцию влево. Выполнение команды печатания метки состоит в том, что кареткаставит метку на обозреваемой секции; выполнение этой команды возможно лишь втом случае, если обозреваемая перед началом выполнения команды секция пуста;если же на обозреваемой секции уже стоит метка, команда считается невыполнимой.Выполнение команды стирания метки состоит в том, что каретка уничтожает метку вобозреваемой секции; выполнение этой команды воз­можно лишь в том случае, еслиобозреваемая секция отмечена; если же на обозреваемой секции и так нет метки,команда считается невыполнимой. Выполнение команды передачи управления сверхней отсылкой j1 и нижней отсылкой j2 никак неизменяет состояния машины: ни одна из меток не уничтожается и не ставится, икаретка также остается неподвижной (машина делает, так сказать, «шаг наместе»); однако если секция, обозреваемая перед началом выполнения этойкоманды, была пуста, то следующей должна выполняться команда с номером j1, если же эта секция была отмечена, следующей должнавыполняться команда с номером j2 (роль команды передачи управления сводится, следовательно, ктому, что каретка во время выполнения этой команды как бы «распознает», стоитли перед ней метка). Выполнение команды остановки тоже никак не меняетсостояния машины и состоит в том, что машина останавливается.

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

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

2) В ходе выполненияпрограммы машина дойдет до выполнения команды остановки; программа в этом случаесчитается выполненной, машина останавливается; происходит так называемая результативнаяостановка.

3) В ходе выполненияпрограммы машина не дойдет до выполнения ни одной из команд, указанных в первыхдвух вариантах; выполнение программы при этом никогда не прекращается, машинаникогда не останавливается; процесс работы машины происходит бесконечно[5].


Глава 2. Инструкция программиста

Данная учебная программадолжна запускаться на IBM исовместимых компьютерах. Минимальные системные требования: процессор Pentium и выше, объем оперативной памяти 16MB, видеокарта с расширением 800x600, 256 цветов, операционная системасемейства Windows 95 и выше, на компьютере такжедолжен быть установлен .NET Framework.

Основную ценностьпредставляют файлы расширением *.cs (вних содержится весь код программы).

Опишем основные файлы,содержащиеся в этой папке:

·    Even_ueven.cs – файл, в которомсодержится код, отвечающий за работу алгоритма «Кодирование по методучетности\нечетности»;

·    Even_ueven.resx –файл, в котором содержится информация о графическом представлении формы«Кодирование по методу четности\нечетности»;

·    Hemming.cs — файл, в котором содержится код, отвечающий за работу алгоритма«Кодирование по методу Хэмминга»;

·    Hemming.resx – файл, в котором содержится информация о графическомпредставлении формы «Кодирование по методу Хэмминга»;

·    Post.cs — файл, в котором содержится код, отвечающий за работуалгоритма «Программированиемашины Поста»;

·    Post.resx – файл, в котором содержится информация о графическомпредставлении формы «Программированиемашины Поста»;

·    Error.cs — файл, в котором содержится код, отвечающий за работу формыError;

·    Error.resx – файл, в котором содержится информация о графическомпредставлении формы Error;

·    Help.cs — файл, в котором содержится код, отвечающий за работу формыСправка;

·    Help.resx – файл, в котором содержится информация о графическомпредставлении формы Справка;

·    Start.cs — файл, в котором содержится код, отвечающий за работу формыStart;

·    Start.resx – файл, в котором содержится информация о графическомпредставлении формы Start;

·    AssemblyInfo.cs — файл, в котором содержится информация о версии файла, внутреннем и исходномимени файла, производителе;

·    StudyProgram.exe — закомпилированный файл программы, находящийся впапке debug, которая находится в папке bin.

Для изменения программынеобходимо изменить ее исходный код. Это можно сделать, используя любойтекстовый редактор. Пример кода представлен на Рис.2.

Изменение кода при помощитекстового редактора не очень удобно, для этого лучше использовать Visual Studio .Net,специально для этого разработанный.

На Рис.3 можно увидеть внешнийоблик Visual Studio .Net.Для его запуска необходимо кликнуть кнопку Пуск, выбрать в пункте Все программы\Microsoft Visual Studio .NET 2003\Microsoft Visual Studio .NET 2003. Далее в запустившемсяприложении кликнуть кнопку Open Project ииспользуя проводник, выбрать файл Study_Programs.sln. Программа откроет приложение. Для изменения внешнеговида программы необходимо воспользоваться ярлыком Design. Можно добавить новые элементы формы, перетащив их извыезжающего окна Toolbox. Исходныйкод программы см. в Приложении.

В самом начале программызадаются поля, так называемые член- переменные, содержащие некоторое значение: int Prav; int ch; int ChVoprosov=1 (в ООП поляиногда называют данными объекта).Где Prav-это количество правильных ответов, ch – это сумма всех разрядовгенерируемого числа и контрольного разряда, а ChVoprosov-число вопросовзаданных пользователю (нумерация начинается с 1) Перед идентификаторами полейуказываются их типы.

При запуске формы Even_ueven во время работы программы сразу срабатывает метод Generation();.Суть данного метода состоит в том, чтобысгенерировать произвольноесемизначное двоичное число, которое появится в окне textBox1 и контрольный разряд(которыйтакже является двоичным числом), который появится в окне textBox2. Для этогосоздается генератор случайных чисел, который записывает в переменную d либо 0, либо 1( d=r.Next(0,2); ),данная операция повторяется 7 раз с помощью цикла с параметром for( for (int i=0; i<7; i++) ). В результате, последовательно добавив каждую изсгенерированных цифр, мы получаем требуемое семизначное число. Контрольныйразряд создается тоже с помощью генератора случайных чисел ( g=r.Next(0,2); ).Такжев этом методе сразу подсчитывается сумма всех разрядов генерируемого числа и контрольногоразряда ch: сначаласкладываются разряды числа все в том же цикле for (ch+=d; — 7 раз), а затем прибавляетсяконтрольный разряд g (ch+=g;).

При нажатии кнопки button1 (Код числа правильный) вначалезапускается метод ChangeChVoposov();который увеличивает номер вопроса на одну единицу в окне textBox3. Затем в полеPrav(количество правильных ответов)считывается значение из окна textBox4(при первом запуске оно равняется 0), Далее с помощью управляющей конструкции if (ch==0 || ch==2|| ch==4 || ch==6) определяется правильно ли пользователь ответил: ch — сумма всех разрядовгенерируемого числа и контрольного разряда должна быть четной или равной 0. Вслучае верного выбора количество правильных ответов увеличивается на 1 ( Prav++; ). Затем запускается метод ChangePrav();, который устанавливает числоправильных ответов в окне textBox4. После чего ch обнуляется ( ch=0;), и запускается метод Generation();.

При нажатии кнопки button2 (Код числа неправильный) алгоритмпрограммы является практически аналогичным за исключением того, что вуправляющей конструкции if (ch==1 || ch==3 || ch==5 || ch==7) правильностьответа пользователя заключается в том, чтобы сумма ch являлась нечетным числом.

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

Кодирование по методу Хэмминга

В самом начале программызадаются поля: intChVoprosov=1,

int X; int Nomer; int [] x=new int[10].Где X – это переменная значение которой не позволяет вопределенных случаях нажиманием на одну и ту же кнопку увеличивать числоправильных ответов, Nomer– это получаемый номер разряда, который подлежит замене на противоположный, int [] x=new int[10] – это массив,состоящий из значений, которые являются разрядами генерируемого двоичногочисла, аChVoprosov-число вопросов заданных пользователю (нумерация начинается с 1).Перед идентификаторами полей указываются их типы.

При запуске формы Hemming во время работы программы сразусрабатывает метод Generation(); и метод Number();.Сутьпервого метода состоит в том, чтобы сгенерировать произвольное девятизначное двоичноечисло, которое появится в окне textBox1. Суть второго метода заключается в том, чтобы подсчитать номерразряда, в котором есть ошибка (если конечно такова вообще имеется). Следуетучесть, что номер подсчитывается в двоичном виде.

Для формирования произвольного девятизначного двоичногочисла создаетсягенератор случайных чисел, который записывает в переменную d либо 0, либо 1( d=r.Next(0,2); ),данная операция повторяется 9 раз с помощью цикла с параметром for( for (int i=1; i<10; i++) ). В результате, последовательно добавив каждую изсгенерированных цифр, мы получаем требуемое девятизначное число. Также на каждом шаге цикла с параметром считываются значения вмассив int [] x ( x[i]=d; ), т.е. получается, что каждый элемент массива равенсоответствующему по номеру разряду сгенерированного числа. В данном методепеременная X приравнивается к 1, что означает,что число только что сгенерированно и пользователь еще не пробовал дать свойответ.

В методе Number() подсчитываютсясуммы контрольныхразрядов сгенерируемого по числа, соответствующие определенным группампроверки. В нашем случае количество групп проверки для девятизначного числаравно 4, следовательно, мы получаем четыре суммы x1, x2, x3, x4.

Затем подсчитываетсяномер ошибочного разряда (Nomer=x4*1000+x3*100+x2*10+x1;)

При нажатии кнопки button1 (Ошибки нет) в начале исчезает всето, что пользователь успел ввести в окно «Исправленный вариант»(textBox2.Text="";), т.к. нажав эту кнопку пользователь показываетто, что он уже не находит ошибок в числе. Потом с помощью управляющейконструкции if проверяется не записан ли уже ответ в окне «Правильный ответ»(if(textBox1.Text.Length!=textBox3.Text.Length) ели не записан, то тогда X приравнивается к единице: X=1;)Затем с помощью управляющей конструкции if проверяется, равен ли X единице (if (X==1) – если этовыполнено, то значит, что пользователь еще не пробовал дать свой ответ).Дальнейшее выполнение действий возможно только если X=1. Затем, используя снова if, Nomer сравниваетсяс нулем (if (Nomer==0)). В случае выполнения данного условия (т.е. номерошибочного разряда равняется нулю, что означает отсутствие ошибки) числоправильных ответов увеличивается на одну единицу ( Prav++; ), и запускается метод Otvet();. Данный метод записывает в окно textBox3(Правильный ответ) ответ, получаемый путем записи всех элементов массива int []x в порядке возрастания:

textBox3.Text=x[1]+""+x[2]+""+x[3]+""+x[4]+""+x[5]+""+[6]+""+x[7]+""+x[8]+""+x[9];

В данном случае ошибка отсутствуети все элементы запишутся без изменения, т.е. в окне textBox3 появится число,аналогичное тому, которое находится в окне textBox1 (Число, возможно содержащееошибку).

Если Nomer не равняется нулю, то тогдазапускается метод Sravnenie();. Этот метод вначале проверяет не дали ли вы ужесвой окончательный ответ (не равно ли уже X нулю) и только в случае равенства X единице (if (X==1)) выполняется вся остальная часть метода:переменную i приравнивают т к нулю (int i=0;).Затем происходит сравнение числа Nomerс двоичными цифрами, которые при переводе в десятичную систему счислениясоответствуют числам от 0 до 9 (например: if (Nomer == 101) – число Nomer сравнивается с двоичным числом 101,которому в десятичной системе счисления соответствует 5). Если Nomer равняется какому-то из предложенныхдвоичных чисел, то тогда переменной i присваивается значение соответствующего десятичного числа (Например вслучае равенства номера числу 101, переменной i присвоится значение 5 (i = 5;)). Если переменная i меняет свое значение с нуля накакое-то от 1 до 9, то тогда выполняется условие следующей за этим управляющейконструкции if (i!=0) (iотлично от нуля) и осуществляется следующие операции: x[i] сравнивается с0, если это выполняется, то тогда x[i] меняет свое значение напротивоположное, т.е. на 1, и затем запускается уже упомянутый выше метод Otvet(); (только теперь в окне textBox3появится число, аналогичное тому, которое находится в окне textBox1 (Число,возможно содержащее ошибку), но уже с замененным на противоположный разрядом,номер которого равен i.).Если x[i] не равняется 0(следовательно равняется 1), то тогдавыполняется ветка else саналогичными действиями, только для x [i] противоположным значением будетявляться 0.

Если в ходе выполненияметода Sravnenie(); не было произведено никаких замен (не выполнялся метод Otvet();), то это означает, что числу Nomer соответствует какое-то двоичноечисло, которое при переводе в десятичную систему счисления дает цифру большую9. Это означает, что в сгенерированном девятиразрядном числе отсутствуютошибки. Тогда с помощью сравнения длины строки в окне textBox3 с нулем (if(textBox3.Text.Length==0)) мы получаем вслучае выполнения данного условия, что ошибки отсутствуют. Следовательно, мыможем увеличить число правильных ответов на 1 и запустить метод Otvet();, который запишет в окно textBox3 число, равное тому, котороенаходится в окне textBox1 (Число, возможно содержащее ошибку).

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

При нажатии кнопки button2 (Ошибка есть) в начале запускаетсяметод Proverka();. Смысл этого метода заключается в том, чтобы проверить ввелли пользователь достаточное количество разрядов в окно «Исправленный вариант» иявляются ли они двоичными числами (0 и 1). Вначале с помощью управляющейконструкции if проверяется, записал ли пользователь строку в окно «Исправленныйвариант» требуемой длины и нет ли уже появившегося ответа в окне textBox3 (Правильный ответ):if(textBox2.Text.Length! =textBox1.Text.Length && textBox1.Text.Length! = textBox3.Text.Length)

Если это условиевыполняется, то это означает, что пользователь ввел в окно «Исправленныйвариант» строку меньшую по своей длине 9 или то, что уже был получен ответ и,следовательно, выполняется действие, заключенное в фигурных скобках: запускформы об ошибке, содержащее пояснение того, в чем заключается ошибка ввода (A5=newError(«Исправленный вариант должен содержать 9-ти разрядное число»);A5.ShowDialog(); )

Если это условие невыполняется, то работа алгоритма программы продолжается по ветке else. Вначале снова проверяетсяотсутствие ответа if(textBox1.Text.Length!=textBox3.Text.Length) и только когдаэто условие выполнено запускается цикл с параметром (for(int i=0;i<textBox2.Text.Length; i++)), который сравнивает все разряды введенного пользователемчисла с 0 или 1.Для этого используется заложенный в языке C# метод работы со строкамиSubstring(i,1) (string d=textBox2.Text.Substring(i,1); — в строку d записывается один символ введенногопользователем числа, начиная с i-ойпозиции (а i меняется от 0 до длины введеннойстроки, т.е. до 9 )). В ходе работы цикла d 9 раз сравнивается с 0 или 1 (if(d!=b && d!=a)), ипри первом же случая, когда d неявляется 1 или 0 появляется форма ошибки, содержащее пояснение того, в чемзаключается ошибка ввода (A5=newError(«Исправленный вариант должен содержать 9-ти разрядное двоичное число»);A5.ShowDialog(); ), а цикл прекращается, т.к. переменной i присваивается значение равноеtextBox2.Text.Length. Также в случае появления ошибки переменная X приравнивается к 0. В случаеотсутствии ошибки ввода переменная X приравнивается к 1.На этом метод Proverka(); заканчивается. Если X=1, то возможны дальнейшие операциизаключенные в фигурных скобках условия if (X==1). Используя условную конструкцию if, Nomer сравнивается с нулем (if (Nomer==0)). Еслиданное условие выполняется (т.е. номер ошибочного разряда равняется нулю, чтоозначает отсутствие ошибки), то пользователь ответил неправильно, невернопредположив, что содержится ошибка. Затем запускается метод Otvet(), который выведет число в окнеtextBox3, равное сгенерированному числу.

После этого запускаетсяметод Sravnenie(); (егозапуск требуется, если не выполняется условие Nomer==0). Если Nomer не равен нулю и метод Sravnenie(); не дает правильного ответа в окне textBox3,, то, следовательно, Nomer при переводе в десятичную системусчисления дает число, большее, чем 9. Это означает, что сгенерированное числоне содержит неправильных разрядов и в окно textBox3 нужно записать заданноечисло без изменений. Для этого используется условная конструкция, котораяпроверяет, записан ли ответ в textBox3: if (textBox3.Text.Length==0) Otvet();. Затем в переменную Moe считывается число, котороепользователь ввел в окно textBox2,а в переменную Pravilnoeсчитывается ответ из textBox3.После чего эти две переменные сравниваются между собой и в случае равенстваколичество правильных ответов увеличивается на 1: if (Moe==Pravilnoe) Prav++;. Затемпеременная X приравнивается к нулю, что означает,что пользователь уже сделал свой окончательный выбор.

Кнопка button3 служит длятого чтобы сгенерировать следующее число, когда работа с предыдущим закончена.При нажатии кнопки button3 (Следующее число) число вопросов увеличивается наединицу, а также запускаются методы: Generation() и Number();

МашинаПоста

Для того чтобы лучшепонять, как изменить программу, подробнее разберем ее код (см. Приложение).

private voidbutton2_Click(object sender, System.EventArgs e) – метод, вызывающийся принажатии кнопки «Вернуться к выбору темы».

private void help_Click(object sender, System.EventArgs e) — метод, вызывающийся при нажатии кнопки «Справка».

private voidbutton3_Click(object sender, System.EventArgs e) — метод, вызывающийся при нажатиикнопки «GO».

public static byte first() – метод, который запускается при выполнении командытипа «Движение головки на одну клетку вправо и переход к команде m1».

public static byte second() – метод, который запускается при выполнении командытипа «Движение головки на одну клетку влево и переход к команде m1».

public static bytethird() – метод, который запускается при выполнении команды типа «Нанесениеметки в ячейку и переход к команде m1.».

public static bytefourth() – метод, который запускается при выполнении команды типа «Стираниеметки в ячейке и переход к команде m1.».

public void fifth() –метод, который запускается при выполнении команды типа «Проверка наличия меткив клетке, над которой находится головка. Если метка отсутствует, то управлениепередается с номером m1,если метка есть, то с номером m2.».

bool check_string(string str) метод, вызываемый для проверки командной строки.

Разберем подробно работу программы.

Задаются два массива типаchar input[] и command[][]. При нажатиикнопки «GO» формируется массив из входнойстроки и записывается в input[]. Далее этот массив проверяется, если в немсодержатся символы, отличные от 0 и 1, то выдается ошибка. Затем проверяетсясписок команд в методе check_string(string str), если он не соответствуетзаданному шаблону, то выдается ошибка, в противном случае он записывается вмассив command[][]. После этого запускается цикл с постусловием, в которомпроверяется какая команда должна выполняться в данный момент и запускаетсясоответствующий метод. Во время выполнения команды останова – цикл завершаетсяи выводится результат работы программы.


Глава 3. Инструкция пользователя

ПрограммаStudyProgram должна запускаться на IBM и совместимых компьютерах.Минимальные системные требования: процессор Pentium и выше, объем оперативной памяти 16MB, видеокарта с расширением 800x600, 256 цветов, операционная системасемейства Windows 95 и выше, на компьютере такжедолжен быть установлен .NET Framework.

3.1 Использование программы StudyProgram для усвоения учебного материала по кодированию информацииметодом четности и методом Хэмминга

Программа StudyProgram предоставляет возможность выполнитьупражнения по кодированию информации методом четности и методом Хэмминга. Длязапуска программы сделайте двойной щелчок по ярлыку программы. После запуска программы на экранепоявляется окно «StudyProgram»,представленное на Рис.4.:

Пункт меню StudyProgram содержит следующие разделы:

«Программирование машиныПоста»

«Кодирование по методучетности\нечетности»

«Кодирование по методуХэмминга»

При выборе пункта меню «Кодирование по методучетности\нечетности» появляетсядиалоговое окно.

В данном диалоговом окне предлагаютсявопросы по теме «Кодирование по методучетности\нечетности». Число вопросов неограниченно. После каждого ответапоказывается номер задаваемого вопроса и количество правильных ответов.

Диалоговое окно содержиттри кнопки: «Код числа правильный», «Код числа неправильный», «Справка» и«Вернуться к выбору темы». Вверху расположено текстовое поле «Цифровыеразряды», в котором заданослучайное семизначное двоичное число. Чуть ниже расположено текстовое поле «Контрольного разряд», в котором задан контрольный разряд, с помощьюкоторого происходит кодирование случайного семизначного двоичного числа пометоду четности. Нужно определить присутствует или не присутствует ошибка взаписи числа. Если число записано правильно, нужно щелкнуть по кнопке «Код числа правильный». Если число содержит ошибку, нужнощелкнуть кнопку «Кодчисла неправильный». Еслиответ был правильным, счетчик правильных ответов увеличивается на единицу. Переходк следующему заданию происходит автоматически при нажатии на любую из двухкнопок: «Код числаправильный», «Код числа неправильный», при этом счетчик заданных вопросов увеличивается на единицу.Число заданий неограниченно. Чтобы прервать работу с диалоговым окном, нужнощелкнуть по кнопке «Вернутьсяк выбору темы» при этомсчетчик правильных ответов обнуляется и при следующем запуске раздела«Кодирование по методу четности\нечетности» количество верных ответов сноваравно нулю. Если пользователю требуется помощь по теории, то тогда можнощелкнуть по кнопке «Справка», и тогда появится диалоговое окно Help(см. Рис.6)

Диалоговое окно, котороепоявляется при выборе пункта меню «Кодирование по методу Хэмминга» имеет вид.

В данном диалоговом окнепредлагается найти и исправить одну ошибку (если она имеется) в 9-ти разрядномдвоичном числе, закодированном по методу Хэмминга. В диалоговом окне«Кодирование по методу Хэмминга» имеется 5 кнопок: «Ошибки нет», «Ошибка есть»,«Следующее число», «Справка», «Вернуться к выбору темы». Вверху расположены текстовые поля:«Число, возможно содержащее ошибку», «Исправленный вариант», «Правильный ответ». Если пользовательсчитает, что число появившееся в текстовом поле «Число, возможно содержащее ошибку» не содержитошибочных разрядов, то следует щелкнуть по кнопке «Ошибки нет». После чего в текстовом поле «Правильный ответ» записываетсяверный ответ. Если пользователь отвечает правильно, то число правильных ответовувеличивается на 1. Если пользователь считает, что число появившееся втекстовом поле «Число,возможно содержащее ошибку» содержит ошибку в одном из разрядов числа, то тогда результат корректировкинужно записать в текстовое поле «Исправленный вариант», после чего нажатькнопку «Ошибка есть». Пользователь должен учесть, что вводимое им число втекстовое поле «Исправленный вариант» должно быть двоичным и содержать 9разрядов. В случае неправильного ввода на экран выведется сообщение об ошибке,см. Рис.8:

Если ответ правильный,счетчик правильных ответов увеличивается на единицу, при этом на экранепоявляется правильный вариант ответа. После того, как пользователь дал свойответ нужно нажать кнопку «Следующее число», и тогда программа сгенерируетновое число, возможно содержащее ошибку. Работа с диалоговым окном завершаетсянажатием кнопки «Вернуться к выбору темы» при этом счетчик правильных ответовобнуляется. При работе с данным разделом пользователь может просмотретьинформацию по кодированию по методу Хэмминга, нажав кнопку «Справка».

3.2 Использование обучающей программыStudyProgram для овладения навыками составленияпрограмм для машины Поста

 

Программа StudyProgram предназначена для того, чтобы помочьв усвоении приемов составления программ для машины Поста. Работа с программойосуществляется следующим образом. После запуска программы на экране появляетсяокно «StudyProgram», представленное на Рис.4. В нем имеется3 раздела. Выберите 1-й раздел «Программирование машины Поста».

При выборе данного пунктаменю появляется диалоговое окно.

Диалоговое окно содержит трикнопки: «GO», «Справка» и «Вернуться к выборутемы». Вверху расположено текстовое поле «Входная строка машины Поста». Сюдавводится входная строка машины Поста. Каждый символ строки соответствует однойячейке ленты, 0 — отсутствие метки, 1 – наличие метки. Предполагается, чтоголовка ленты находится над 1-й слева ячейкой. В окно, расположенное под даннымокном вводится набор команд, выполняющий поставленную задачу. Каждая командадолжна состоять из 4-х целых положительных чисел. 1-е число – это порядковыйномер команды, 2-е число – тип команды, 3-е число – номер следующей команды прибезусловном переходе и 4-е число – номер следующей команды при условномпереходе. Если команда не является командой условного перехода, то 4-е числоможет быть любым. Числа в команде должны отделяться друг от друга запятой, акаждая команда заканчиваться точкой с запятой.

Порядок записи ивыполнения программы следующий:

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

2) В нижележащее окновведите в соответствии с выше перечисленными правилами набор команд, решающихпоставленную задачу.

3) Нажмите кнопку «GO», после чего записанные командыбудут выполнены и в поле «Выходная строка» появится результат работы машиныПоста в виде выходной строки символов, состоящей из нулей и единиц.

В общем виде отдельная командамашины Поста имеет следующий вид: n,K,m1,m2; где n – порядковый номер команды, К – типкоманды, m1, m2 – порядковые номера следующих команд. Имеется шесть типовкоманд машины Поста, которым для удобства можно дать номера от 1 до 6. Нижедано описание команд машины Поста.

Тип команды Действие команды 1 Движение головки на одну клетку вправо и переход к команде m1 2 Движение головки на одну клетку влево и переход к команде m1 3 Нанесение метки в ячейку и переход к команде m1 4 Стирание метки в ячейке и переход к команде m1 5 Проверка наличия метки в клетке, над которой находится головка. Если метка отсутствует, то управление передается команде с номером m1, если метка есть, то с номером m2 6 Остановка машины

Пример команды машиныПоста: 1,1,2,0;. Данная команда имеет порядковый номер 1, тип команды – 1(движение головки на одну клетку вправо). После выполнения команды управлениепередается команде, имеющей порядковый номер 2.

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

·         1, 5, 2, 4;    1-якоманда

·         2, 1, 3, 0;    2-якоманда

·         3, 5, 2, 4;    3-якоманда

·         4, 4, 5, 0;    4-якоманда

·         5, 6, 0, 0;    5-якоманда

Разберем работупрограммы. 1-я команда – это команда типа 5, т.е. условный переход. Если ячейкапустая, то управление передается команде 2, в противном случае – 4-й команде.2-я команда – это сдвиг головки на одну ячейку вправо и передача управления 3-йкоманде. 3-я команда – это опять условный переход. Если метка отсутствует, товозврат ко второй команде и переход на 4-ю в противном случае. 4-я командастирает метку (очевидно, она там есть, т.к. мы попадаем на 4-ю команду толькопри наличии метки) и передает управление 5-й команде, которая является командойостановки машины.

При нажатии кнопки«Справка» выводится окно со справочным материалом по данной теме.

При нажатии кнопки«Вернуться к выбору темы» Вы возвращаетесь на стартовое окно программы.

Если входная строкавведена неправильно, то выведется сообщение об ошибке Рис.11.

Если список команд несоответствует заданному шаблону, то выведется сообщение об ошибке.

 
Заключение

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

Разработанная курсоваяработа содержит следующие разделы:

·         Исследовательскаячасть, содержащая разделы, посвященные целесообразности выбора языка, основным структурам языкапрограммирования C#,кодированию по методу четности/ нечетности, кодированиюпо методу Хэмминга, а также программированию машины Поста.

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

·         Инструкцияпользователя, включающая в себя подразделы: использование программы StudyProgram для усвоения учебного материала покодированию информации методом четности и методом Хэмминга; использование обучающей программы StudyProgram для овладения навыками составленияпрограмм для машины Поста.

 Задание курсовой работывыполнено полностью в соответствии с заданием.


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

1.        Акулов О.А.,Медведев Н.В. «Информатика базовый курс». Москва, Омега-Л, 2005

2.        Успенский В.А. «МашинаПоста». Москва, Наука, 1988

3.        http://computer-museum.ru

4.        http://pascalstudy.narod.ru

5.        http://de.uspu.ru

6.        http://c-sharp.ru

7.        http://dotsite.spb.ru

8.        http://i-u.ru

9.        http://mf.grsu.by

10.     Троелсен Э. «С# иплатформа .NET. Библиотека программиста»


Приложение

Start

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace Study_Programs

{

         public class Start: System.Windows.Forms.Form

         {

                   private System.Windows.Forms.Label label1;

                   private System.Windows.Forms.GroupBox groupBox1;

                   private System.ComponentModel.Container components =null;

                   Post A1;

                   Even_uneven A2;

                   Hemming A3;

                   private System.Windows.Forms.Buttoneven_uneven_button;

                   private System.Windows.Forms.Button hemming_button;

                   private System.Windows.Forms.Button exit_button;

                   private System.Windows.Forms.Button post_button;

                   public Start(){InitializeComponent();}

                   protected override void Dispose( bool disposing )

                   {

                            if(disposing) if (components != null)components.Dispose();

                            base.Dispose( disposing );

                   }

                   #region Windows Form Designer generated code

                   private void InitializeComponent()

                   {

                            this.label1 = newSystem.Windows.Forms.Label();

                            this.groupBox1 = newSystem.Windows.Forms.GroupBox();

                            this.hemming_button = newSystem.Windows.Forms.Button();

                            this.post_button = newSystem.Windows.Forms.Button();

                            this.even_uneven_button = newSystem.Windows.Forms.Button();

                            this.exit_button = newSystem.Windows.Forms.Button();

                            this.groupBox1.SuspendLayout();

                            this.SuspendLayout();

                            //

                            // label1

                            //

                            this.label1.Dock =System.Windows.Forms.DockStyle.Top;

                            this.label1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.label1.Location = newSystem.Drawing.Point(0, 0);

                            this.label1.Name = «label1»;

                            this.label1.Size = newSystem.Drawing.Size(306, 48);

                            this.label1.TabIndex = 0;

                            this.label1.Text= «Приветствуем Вас в обучающей программе по информатике.»;

                            this.label1.TextAlign =System.Drawing.ContentAlignment.MiddleCenter;

                            //

                            // groupBox1

                            //

                            this.groupBox1.Controls.Add(this.hemming_button);

                            this.groupBox1.Controls.Add(this.post_button);

                            this.groupBox1.Controls.Add(this.even_uneven_button);

                            this.groupBox1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.groupBox1.Location = newSystem.Drawing.Point(8, 48);

                            this.groupBox1.Name = «groupBox1»;

                            this.groupBox1.Size = newSystem.Drawing.Size(296, 120);

                            this.groupBox1.TabIndex = 1;

                            this.groupBox1.TabStop = false;

                            this.groupBox1.Text = «Выберите раздел»;

                            //

                            // hemming_button

                            //

                            this.hemming_button.Anchor =((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |System.Windows.Forms.AnchorStyles.Bottom)

                                      |System.Windows.Forms.AnchorStyles.Left)

                                      |System.Windows.Forms.AnchorStyles.Right)));

                            this.hemming_button.Cursor =System.Windows.Forms.Cursors.Hand;

                            this.hemming_button.Location = newSystem.Drawing.Point(8, 89);

                            this.hemming_button.Name =«hemming_button»;

                            this.hemming_button.Size = newSystem.Drawing.Size(280, 22);

                            this.hemming_button.TabIndex = 2;

                            this.hemming_button.Text = «Кодирование по методу Хэмминга»;

                            this.hemming_button.Click += newSystem.EventHandler(this.hemming_button_Click);

                            //

                            // post_button

                            //

                            this.post_button.Anchor =((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |System.Windows.Forms.AnchorStyles.Bottom)

                                      |System.Windows.Forms.AnchorStyles.Left)

                                      |System.Windows.Forms.AnchorStyles.Right)));

                            this.post_button.Cursor =System.Windows.Forms.Cursors.Hand;

                            this.post_button.Location = newSystem.Drawing.Point(8, 25);

                            this.post_button.Name =«post_button»;

                            this.post_button.Size = newSystem.Drawing.Size(280, 22);

                            this.post_button.TabIndex = 0;

                            this.post_button.Text = «Программирование машиныПоста»;

                            this.post_button.Click += newSystem.EventHandler(this.post_button_Click);

                            //

                            // even_uneven_button

                            //

                            this.even_uneven_button.Anchor =((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |System.Windows.Forms.AnchorStyles.Bottom)

                                      |System.Windows.Forms.AnchorStyles.Left)

                                      |System.Windows.Forms.AnchorStyles.Right)));

                            this.even_uneven_button.Cursor =System.Windows.Forms.Cursors.Hand;

                            this.even_uneven_button.Location = newSystem.Drawing.Point(8, 56);

                            this.even_uneven_button.Name =«even_uneven_button»;

                            this.even_uneven_button.Size = newSystem.Drawing.Size(280, 22);

                            this.even_uneven_button.TabIndex = 1;

                            this.even_uneven_button.Text = «Кодирование по методучетности\\нечетности»;

                            this.even_uneven_button.Click+= new System.EventHandler(this.even_uneven_button_Click);

                            //

                            // exit_button

                            //

                            this.exit_button.Cursor =System.Windows.Forms.Cursors.Hand;

                            this.exit_button.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.exit_button.Location = newSystem.Drawing.Point(112, 176);

                            this.exit_button.Name =«exit_button»;

                            this.exit_button.Size = newSystem.Drawing.Size(72, 24);

                            this.exit_button.TabIndex = 2;

                            this.exit_button.Text = «Выход»;

                            this.exit_button.Click += newSystem.EventHandler(this.exit_button_Click);

                            //

                            // Start

                            //

                            this.AutoScale = false;

                            this.AutoScaleBaseSize = newSystem.Drawing.Size(5, 13);

                            this.BackColor =System.Drawing.SystemColors.InactiveBorder;

                            this.ClientSize = newSystem.Drawing.Size(306, 206);

                            this.ControlBox = false;

                            this.Controls.Add(this.exit_button);

                            this.Controls.Add(this.groupBox1);

                            this.Controls.Add(this.label1);

                            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;

                            this.MaximizeBox = false;

                            this.MinimizeBox = false;

                            this.Name = «Start»;

                            this.ShowInTaskbar = false;

                            this.StartPosition =System.Windows.Forms.FormStartPosition.CenterScreen;

                            this.Text = «Study Programs»;

                            this.TopMost = true;

                            this.groupBox1.ResumeLayout(false);

                            this.ResumeLayout(false);

                   }

                   #endregion

                   [STAThread]

                   static void Main() {Application.Run(new Start());}

                   private void exit_button_Click(object sender,System.EventArgs e){this.Close();}

                   private void post_button_Click(object sender,System.EventArgs e)

                   {

                            A1 = new Post();

                            A1.ShowDialog();

                   }

                   private void even_uneven_button_Click(object sender,System.EventArgs e)

                   {

                            A2 = new Even_uneven();

                            A2.ShowDialog();

                   }

                   private void hemming_button_Click(object sender,System.EventArgs e)

                   {

                            A3 = new Hemming();

                            A3.ShowDialog();

                   }

         }

}

Post

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace Study_Programs

{

         public class Post: System.Windows.Forms.Form

         {

                   private System.Windows.Forms.Label label1;

                   private System.Windows.Forms.TextBox textBox1;

                   private System.Windows.Forms.Label label2;

                   private System.Windows.Forms.TextBox textBox2;

                   private System.Windows.Forms.Label label3;

                   private System.Windows.Forms.TextBox textBox3;

                   private System.Windows.Forms.Button button2;

                   private System.Windows.Forms.Button button3;

                   private System.ComponentModel.Container components =null;

                   private System.Windows.Forms.Button help;

                   Help A4;Error A5;

                   static char []input;

                   static char [][] command;

                   static byte l,finish,k;

                   static sbyte position;

                   static bool chk=true;

                   public Post(){InitializeComponent();}

                   protected override void Dispose(bool disposing)

                   {

                            if( disposing )if(components != null)components.Dispose();

                            base.Dispose(disposing);

                   }

                   #region Windows Form Designer generated code

                   private void InitializeComponent()

                   {

                            this.label1 = newSystem.Windows.Forms.Label();

                            this.textBox1 = newSystem.Windows.Forms.TextBox();

                            this.label2 = new System.Windows.Forms.Label();

                            this.textBox2 = newSystem.Windows.Forms.TextBox();

                            this.label3 = newSystem.Windows.Forms.Label();

                            this.textBox3 = newSystem.Windows.Forms.TextBox();

                            this.help = newSystem.Windows.Forms.Button();

                            this.button2 = newSystem.Windows.Forms.Button();

                            this.button3 = newSystem.Windows.Forms.Button();

                            this.SuspendLayout();

                            //

                            // label1

                            //

                            this.label1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.label1.Location = newSystem.Drawing.Point(8, 8);

                            this.label1.Name = «label1»;

                            this.label1.Size = newSystem.Drawing.Size(192, 16);

                            this.label1.TabIndex = 0;

                            this.label1.Text = «Входная строка машины Поста»;

                            //

                            // textBox1

                            //

                            this.textBox1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.textBox1.Location = newSystem.Drawing.Point(8, 24);

                            this.textBox1.Name = «textBox1»;

                            this.textBox1.Size = newSystem.Drawing.Size(224, 21);

                            this.textBox1.TabIndex = 1;

                            this.textBox1.Text = «Введите строку,состоящую из 0 и 1»;

                            //

                            // label2

                            //

                            this.label2.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.label2.Location = newSystem.Drawing.Point(8, 56);

                            this.label2.Name = «label2»;

                            this.label2.Size = newSystem.Drawing.Size(216, 16);

                            this.label2.TabIndex = 2;

                            this.label2.Text = «Список команд»;

                            //

                            // textBox2

                            //

                            this.textBox2.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.textBox2.Location = newSystem.Drawing.Point(8, 72);

                            this.textBox2.Name = «textBox2»;

                            this.textBox2.Size = newSystem.Drawing.Size(224, 21);

                            this.textBox2.TabIndex = 3;

                            this.textBox2.Text = «Введите список команд»;

                            //

                            // label3

                            //

                            this.label3.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.label3.Location = newSystem.Drawing.Point(8, 104);

                            this.label3.Name = «label3»;

                            this.label3.Size = newSystem.Drawing.Size(112, 16);

                            this.label3.TabIndex = 4;

                            this.label3.Text = «Выходная строка»;

                            //

                            // textBox3

                            //

                            this.textBox3.BorderStyle =System.Windows.Forms.BorderStyle.None;

                            this.textBox3.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.textBox3.Location = newSystem.Drawing.Point(8, 120);

                            this.textBox3.Name = «textBox3»;

                            this.textBox3.ReadOnly = true;

                            this.textBox3.Size = newSystem.Drawing.Size(224, 14);

                            this.textBox3.TabIndex = 5;

                            this.textBox3.Text = "";

                            //

                            // help

                            //

                            this.help.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.help.Location = newSystem.Drawing.Point(136, 144);

                            this.help.Name = «help»;

                            this.help.Size = new System.Drawing.Size(72,24);

                            this.help.TabIndex = 8;

                            this.help.Text = «Справка»;

                            this.help.Click += newSystem.EventHandler(this.help_Click);

                            //

                            // button2

                            //

                            this.button2.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.button2.Location = newSystem.Drawing.Point(40, 176);

                            this.button2.Name = «button2»;

                            this.button2.Size = newSystem.Drawing.Size(168, 24);

                            this.button2.TabIndex = 9;

                            this.button2.Text = «Вернуться к выбору темы»;

                            this.button2.Click += newSystem.EventHandler(this.button2_Click);

                            //

                            // button3

                            //

                            this.button3.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.button3.Location = newSystem.Drawing.Point(40, 144);

                            this.button3.Name = «button3»;

                            this.button3.Size = newSystem.Drawing.Size(72, 24);

                            this.button3.TabIndex = 10;

                            this.button3.Text = «GO»;

                            this.button3.Click += new System.EventHandler(this.button3_Click);

                            //

                            // Post

                            //

                            this.AutoScaleBaseSize = newSystem.Drawing.Size(5, 13);

                            this.BackColor =System.Drawing.SystemColors.InactiveBorder;

                            this.ClientSize = newSystem.Drawing.Size(242, 208);

                            this.ControlBox = false;

                            this.Controls.Add(this.button3);

                            this.Controls.Add(this.button2);

                            this.Controls.Add(this.help);

                            this.Controls.Add(this.textBox3);

                            this.Controls.Add(this.label3);

                            this.Controls.Add(this.textBox2);

                            this.Controls.Add(this.label2);

                            this.Controls.Add(this.textBox1);

                            this.Controls.Add(this.label1);

                            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;

                            this.MaximizeBox = false;

                            this.Name = «Post»;

                            this.StartPosition =System.Windows.Forms.FormStartPosition.CenterScreen;

                            this.Text = «Post»;

                            this.TopMost = true;

                            this.ResumeLayout(false);

                   }

                   #endregion

                   public static byte first()

                   {

                            position++;

                            return(k=Convert.ToByte(char.GetNumericValue(command[k][2])-1));

                   }

                   public static byte second()

                   {

                            position--;

                            return(k=Convert.ToByte(char.GetNumericValue(command[k][2])-1));

                   }

                   public static byte third()

                   {

                            input[position]='1';

                            return(k=Convert.ToByte(char.GetNumericValue(command[k][2])-1));

                   }

                   public static byte fourth()

                   {

                            input[position]='0';

                            return(k=Convert.ToByte(char.GetNumericValue(command[k][2])-1));

                   }

                   public void fifth()

                   {

                            if(position<input.Length)

                            {

                                      if (input[position]=='0')k=Convert.ToByte(char.GetNumericValue(command[k][2])-1);

                                      elsek=Convert.ToByte(char.GetNumericValue(command[k][3])-1);

                            }

                            else

                            {

                                      A5=newError(«Выход за границы входной строки»);

                                      A5.ShowDialog();

                                      finish=1;chk=false;

                            }

                   }

                   bool check_string(string str)

                   {

                            int i,s=0,cnt=0;

                            for (i=0;i<str.Length;i++)if(str[i]==';')cnt++;

                            for (i=0;i<cnt;i++)

                            {

                                      if(!char.IsDigit(str[s])||str[s]=='0') return(false);

                                      s++;

                                      if (str[s]!=',') return(false);

                                      s++;

                                      if(char.GetNumericValue(str[s])>6||char.GetNumericValue(str[s])<1)return(false);

                                      s++;

                                      if (str[s]!=',') return(false);

                                      s++;

                                      if (!char.IsDigit(str[s])) return(false);

                                      s++;

                                      if (str[s]!=',') return(false);

                                      s++;

                                     if (!char.IsDigit(str[s]))return(false);

                                      s++;

                                      if (str[s]!=';') return(false);

                                      s++;

                            }

                            if(s!=str.Length) return(false);

                            return(true);

                   }

                   private void button2_Click(object sender,System.EventArgs e){this.Close();}

                   private void help_Click(object sender,System.EventArgs e)

                   {

                            A4 = new Help(0);

                            A4.ShowDialog();

                   }

                   private void button3_Click(object sender,System.EventArgs e)

                   {

                            l=1;k=0;position=0;finish=0;textBox3.Text="";chk=true;

                            int i,j;

                            //массивиз входной строки

                            input = new char[textBox1.Text.Length];

                            command = new char[textBox2.Text.Length/8][];

                            for (i=0;i<textBox1.Text.Length;i++)

                            {

                                      if (textBox1.Text[i]!='0'&& textBox1.Text[i]!='1')

                                      {

                                               A5= new Error(«Неправильный формат входной строки»);

                                               A5.ShowDialog();

                                               i=textBox1.Text.Length;

                                               chk=false;

                                      }

                                      else input[i]=textBox1.Text[i];

                            }

                            //массивиз спискакомманд

                            if (check_string(textBox2.Text))

                            {

                                      for(i=0;i<textBox2.Text.Length/8;i++)

                                      {

                                               command [i]=new char[4];

                                               for (j=0;j<4;j++)command[i][j]=textBox2.Text[i*8+j*2];

                                      }

                            }

                            else

                            {

                                      A5 = new Error(«Некорректный форматкоманды»);

                                      A5.ShowDialog();

                                      chk=false;

                            }

                            if (chk)

                            {

                                      do

                                      {

                                               switch(command[k][l])

                                               {

                                                        case('1'):

                                                        {

                                                                  first();

                                                                  break;

                                                        }

                                                        case('2'):

                                                        {

                                                                  second();

                                                                  break;

                                                        }

                                                        case('3'):

                                                        {

                                                                  third();

                                                                  break;

                                                        }

                                                        case('4'):

                                                        {

                                                                  fourth();

                                                                  break;

                                                        }

                                                        case('5'):

                                                        {

                                                                  fifth();

                                                                  break;

                                                        }

                                                        case('6'):

                                                        {

                                                                  finish=1;

                                                                  break;

                                                        }

                                               }

                                      }while (finish!=1);

                            }

                            if(chk) for(i=0;i<input.Length;i++)textBox3.Text+=input[i];

                   }

         }

}

Hemming

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace Study_Programs

{

         public class Hemming: System.Windows.Forms.Form

         {

                   int ChVoprosov=1;

                   int X=0;              

                   int Nomer=0;

                   int [] x=new int[10];

                   Help A4; Error A5;

                   private System.Windows.Forms.TextBox textBox1;

                   private System.Windows.Forms.TextBox textBox2;

                   private System.Windows.Forms.TextBox textBox3;

                   private System.Windows.Forms.TextBox textBox4;

                   private System.Windows.Forms.TextBox textBox5;

                   private System.Windows.Forms.Button button1;

                   private System.Windows.Forms.Button button2;

                   private System.Windows.Forms.Button button3;

                   private System.Windows.Forms.Button button4;

                   private System.Windows.Forms.Button button5;

                   private System.Windows.Forms.Label label3;

                   private System.Windows.Forms.Label label4;

                   private System.Windows.Forms.Label label1;

                   private System.Windows.Forms.Label label2;

                   private System.Windows.Forms.Label label5;

                   private System.Windows.Forms.GroupBox groupBox1;

                   private System.Windows.Forms.ToolTip toolTip1;

                   private System.ComponentModel.IContainer components;

                   public Hemming(){InitializeComponent();}

                   protected override void Dispose( bool disposing )

                   {

                            if(disposing) if(components != null)components.Dispose();

                            base.Dispose(disposing);

                   }

                   public void Generation()

                   {

                            X=1;

                            textBox1.Text="";

                            Random r=new System.Random();

                            int d;

                            for (int i=1; i<10; i++)

                            {

                                      d=r.Next(0,2);

                                      textBox1.Text+=d;

                                      x[i]=d;

                            }

                   }

                   public void Number()

                   {

                            int x1=0;int x2=0;int x3=0;int x4=0;

                            x1=x[1]+x[3]+x[5]+x[7]+x[9];

                            if (x1==0 || x1==2 || x1==4) x1=0; else x1=1;

                            x2=x[2]+x[3]+x[6]+x[7];

                            if (x2==0 || x2==2 || x2==4) x2=0; else x2=1;            

                            x3=x[4]+x[5]+x[6]+x[7];

                            if (x3==0 || x3==2 || x3==4) x3=0; else x3=1;

                            x4=x[8]+x[9];

                            if (x4==0 || x4==2) x4=0;else x4=1;

                            Nomer=x4*1000+x3*100+x2*10+x1;

                   }

                   public void Otvet(){textBox3.Text = x[1] +"" + x[2] + "" + x[3] + "" + x[4] + ""+ x[5] + "" + x[6] + "" + x[7] + "" + x[8] +"" + x[9];}           

                   public void Sravnenie()

                   {

                            if (X==1)

                            {

                                      int i=0;

                                      if (Nomer == 1) i = 1;

                                      if (Nomer == 10) i = 2;

                                      if (Nomer == 11) i = 3;

                                      if (Nomer == 100) i = 4;

                                      if (Nomer == 101) i = 5;

                                      if (Nomer == 110) i = 6;

                                      if (Nomer == 111) i = 7;

                                      if (Nomer == 1000) i = 8;

                                      if (Nomer == 1001) i = 9;

                                      if (i!=0)

                                      {

                                               if (x[i] == 0)

                                               {

                                                        x[i] = 1;Otvet();

                                               }

                                               else

                                               {

                                                        x[i] = 0;Otvet();

                                               }

                                      }

                            }

                   }

                   public void Proverka()

                   {

                            if(textBox2.Text.Length!=textBox1.Text.Length&& textBox1.Text.Length!=textBox3.Text.Length)

                            {

                                      A5=newError(«Исправленный вариант должен содержать 9-ти разрядное двоичноечисло»);

                                      A5.ShowDialog();

                                      X=0;

                            }

                            else

                            {

                                      if(textBox1.Text.Length!=textBox3.Text.Length)

                                      {

                                               for(int i=0;i<textBox2.Text.Length; i++)

                                               {

                                                        stringa=«1»;

                                                        stringb=«0»;

                                                        stringd=textBox2.Text.Substring(i,1);

                                                        if(d!=b && d!=a)

                                                        {

                                                                  A5=newError(«Исправленный вариант должен содержать 9-ти разрядное двоичноечисло»);

                                                                  A5.ShowDialog();

                                                                  X=0;

                                                                  i=textBox2.Text.Length;

                                                        }

                                     

                                                        else X=1;

                                               }

                                      }

                            }

                   }       

                   #region Windows Form Designer generated code

                   private void InitializeComponent()

                   {

                            this.components = newSystem.ComponentModel.Container();

                            System.ComponentModel.ComponentResourceManagerresources = newSystem.ComponentModel.ComponentResourceManager(typeof(Hemming));

                            this.textBox1 = new System.Windows.Forms.TextBox();

                            this.textBox2 = newSystem.Windows.Forms.TextBox();

                            this.textBox3 = newSystem.Windows.Forms.TextBox();

                            this.textBox4 = newSystem.Windows.Forms.TextBox();

                            this.textBox5 = newSystem.Windows.Forms.TextBox();

                            this.button1 = newSystem.Windows.Forms.Button();

                            this.button2 = newSystem.Windows.Forms.Button();

                            this.button3 = newSystem.Windows.Forms.Button();

                            this.button4 = newSystem.Windows.Forms.Button();

                            this.button5 = newSystem.Windows.Forms.Button();

                            this.label3 = newSystem.Windows.Forms.Label();

                            this.label4 = newSystem.Windows.Forms.Label();

                            this.label1 = newSystem.Windows.Forms.Label();

                            this.label2 = newSystem.Windows.Forms.Label();

                            this.label5 = newSystem.Windows.Forms.Label();

                            this.groupBox1 = newSystem.Windows.Forms.GroupBox();

                            this.toolTip1 = newSystem.Windows.Forms.ToolTip(this.components);

                            this.groupBox1.SuspendLayout();

                            this.SuspendLayout();

                            //

                            // textBox1

                            //

                            this.textBox1.Location = newSystem.Drawing.Point(216, 16);

                            this.textBox1.Name = «textBox1»;

                            this.textBox1.ReadOnly = true;

                            this.textBox1.Size = newSystem.Drawing.Size(88, 20);

                            this.textBox1.TabIndex = 0;

                            this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // textBox2

                            //

                            this.textBox2.Location = newSystem.Drawing.Point(216, 40);

                            this.textBox2.MaxLength = 9;

                            this.textBox2.Name = «textBox2»;

                            this.textBox2.Size = newSystem.Drawing.Size(88, 20);

                            this.textBox2.TabIndex = 1;

                            this.textBox2.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // textBox3

                            //

                            this.textBox3.Location = newSystem.Drawing.Point(216, 64);

                            this.textBox3.Name = «textBox3»;

                            this.textBox3.ReadOnly = true;

                            this.textBox3.Size = newSystem.Drawing.Size(88, 20);

                            this.textBox3.TabIndex = 2;

                            this.textBox3.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // textBox4

                            //

                            this.textBox4.Location = newSystem.Drawing.Point(104, 136);

                            this.textBox4.Name = «textBox4»;

                            this.textBox4.ReadOnly = true;

                            this.textBox4.Size = newSystem.Drawing.Size(40, 20);

                            this.textBox4.TabIndex = 3;

                            this.textBox4.Text = «1»;

                            this.textBox4.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // textBox5

                            //

                            this.textBox5.Location = newSystem.Drawing.Point(272, 136);

                            this.textBox5.Name = «textBox5»;

                            this.textBox5.ReadOnly = true;

                            this.textBox5.Size = newSystem.Drawing.Size(40, 20);

                            this.textBox5.TabIndex = 4;

                            this.textBox5.Text = «0»;

                            this.textBox5.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // button1

                            //

                            this.button1.Location = newSystem.Drawing.Point(8, 102);

                            this.button1.Name = «button1»;

                            this.button1.Size = newSystem.Drawing.Size(88, 24);

                            this.button1.TabIndex = 5;

                            this.button1.Text = «Ошибки нет»;

                            this.button1.Click += newSystem.EventHandler(this.button1_Click);

                            //

                            // button2

                            //

                            this.button2.Location = newSystem.Drawing.Point(108, 102);

                            this.button2.Name = «button2»;

                            this.button2.Size = newSystem.Drawing.Size(88, 24);

                            this.button2.TabIndex = 6;

                            this.button2.Text = «Ошибка есть»;

                            this.button2.Click += new System.EventHandler(this.button2_Click);

                            //

                            // button3

                            //

                            this.button3.Location = newSystem.Drawing.Point(206, 101);

                            this.button3.Name = «button3»;

                            this.button3.Size = newSystem.Drawing.Size(112, 24);

                            this.button3.TabIndex = 7;

                            this.button3.Text = «Следующее число»;

                            this.button3.Click += newSystem.EventHandler(this.button3_Click);

                            //

                            // button4

                            //

                            this.button4.Font = newSystem.Drawing.Font(«Microsoft Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((byte)(204)));

                            this.button4.Location = newSystem.Drawing.Point(128, 160);

                            this.button4.Name = «button4»;

                            this.button4.Size = newSystem.Drawing.Size(72, 24);

                            this.button4.TabIndex = 11;

                            this.button4.Text = «Справка»;

                            this.button4.Click += newSystem.EventHandler(this.button4_Click);

                            //

                            // button5

                            //

                            this.button5.Font = newSystem.Drawing.Font(«Microsoft Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));

                            this.button5.Location = newSystem.Drawing.Point(80, 192);

                            this.button5.Name = «button5»;

                            this.button5.Size = newSystem.Drawing.Size(168, 24);

                            this.button5.TabIndex = 12;

                            this.button5.Text = «Вернуться к выбору темы»;

                            this.button5.Click += newSystem.EventHandler(this.button5_Click);

                            //

                            // label3

                            //

                            this.label3.Location = newSystem.Drawing.Point(8, 136);

                            this.label3.Name = «label3»;

                            this.label3.Size = newSystem.Drawing.Size(96, 24);

                            this.label3.TabIndex = 13;

                            this.label3.Text = «Номер вопроса:»;

                            //

                            // label4

                            //

                            this.label4.Location = newSystem.Drawing.Point(152, 136);

                            this.label4.Name = «label4»;

                            this.label4.Size = newSystem.Drawing.Size(120, 24);

                            this.label4.TabIndex = 14;

                            this.label4.Text = «Правильных ответов:»;

                            //

                            // label1

                            //

                            this.label1.Location = newSystem.Drawing.Point(8, 16);

                            this.label1.Name = «label1»;

                            this.label1.Size = newSystem.Drawing.Size(216, 16);

                            this.label1.TabIndex = 15;

                            this.label1.Text = «Число, возможно содержащее ошибку»;

                            //

                            // label2

                            //

                            this.label2.Location = newSystem.Drawing.Point(8, 40);

                            this.label2.Name = «label2»;

                            this.label2.Size = newSystem.Drawing.Size(128, 16);

                            this.label2.TabIndex = 16;

                            this.label2.Text = «Исправленный вариант»;

                            //

                            // label5

                            //

                            this.label5.Location = newSystem.Drawing.Point(8, 64);

                            this.label5.Name = «label5»;

                            this.label5.Size = newSystem.Drawing.Size(112, 16);

                            this.label5.TabIndex = 17;

                            this.label5.Text = «Правильный ответ»;

                            //

                            // groupBox1

                            //

                            this.groupBox1.Controls.Add(this.label2);

                            this.groupBox1.Controls.Add(this.textBox3);

                            this.groupBox1.Controls.Add(this.label5);

                            this.groupBox1.Controls.Add(this.textBox1);

                            this.groupBox1.Controls.Add(this.textBox2);

                            this.groupBox1.Controls.Add(this.label1);

                            this.groupBox1.Location = newSystem.Drawing.Point(6, -1);

                            this.groupBox1.Name = «groupBox1»;

                            this.groupBox1.Size = newSystem.Drawing.Size(312, 96);

                            this.groupBox1.TabIndex = 19;

                            this.groupBox1.TabStop = false;

                            this.toolTip1.SetToolTip(this.groupBox1,@«9-ти разрядное двоичное число, закодированно по методу Хэмминга.В одном изразрядов»+"\n"+«возможно присутствует ошибка. Если онаесть, необходимо её исправить и записатьправильный»+"\n"+«вариант в соответствующее окно, послеэтого нажмите кнопку «Ошибка есть».Еслиошибка»+"\n"+«отсутствует, то в окно Исправленный вариантничего писать не нужно и следуетнажать»+"\n"+«кнопку«Ошибки нет». Далее нужно нажать кнопку «Cледующее число»»);

                            //

                            //toolTip1

                            //

                            this.toolTip1.AutomaticDelay= 10;

                            this.toolTip1.AutoPopDelay= 100000;

                            this.toolTip1.InitialDelay = 10;

                            this.toolTip1.ReshowDelay = 2;

                            this.toolTip1.ShowAlways = true;

                            //

                            // Hemming

                            //

                            this.AutoScaleBaseSize = newSystem.Drawing.Size(5, 13);

                            this.BackColor =System.Drawing.SystemColors.InactiveBorder;

                            this.ClientSize = newSystem.Drawing.Size(322, 224);

                            this.ControlBox = false;

                            this.Controls.Add(this.groupBox1);

                            this.Controls.Add(this.label4);

                            this.Controls.Add(this.label3);

                            this.Controls.Add(this.button5);

                            this.Controls.Add(this.button4);

                            this.Controls.Add(this.button3);

                            this.Controls.Add(this.button2);

                            this.Controls.Add(this.button1);

                            this.Controls.Add(this.textBox5);

                            this.Controls.Add(this.textBox4);

                            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;

                            this.MaximizeBox = false;

                            this.Name = «Hemming»;

                            this.StartPosition =System.Windows.Forms.FormStartPosition.CenterScreen;

                            this.Text = «Hemming»;

                            this.TopMost = true;

                            this.Load += newSystem.EventHandler(this.Hemming_Load);

                            this.groupBox1.ResumeLayout(false);

                            this.groupBox1.PerformLayout();

                            this.ResumeLayout(false);

                            this.PerformLayout();

                   }

                   #endregion

                   private void Hemming_Load(object sender,System.EventArgs e)

                   {

                            Generation();

                            Number();                    

                   }

                   private void button1_Click(object sender,System.EventArgs e)

                   {

                            textBox2.Text="";

                            if(textBox1.Text.Length!=textBox3.Text.Length)X=1;

                            if (X==1)textBox3.Text="";

                            int Prav=Convert.ToInt32(textBox5.Text);

                            if (X==1)

                            {

                                      if (Nomer==0)

                                      {       

                                               Prav++;      Otvet();

                                      }

                                      Sravnenie();

                                      if (textBox3.Text.Length==0)

                                      {

                                               Prav++;      Otvet();

                                      }

                                      textBox5.Text="";textBox5.Text+=Prav;

                            }

                            X=0;

                   }

                   private void button2_Click(object sender,System.EventArgs e)

                   {

                            Proverka();

                            if(X==1)textBox3.Text="";

                            int Prav=Convert.ToInt32(textBox5.Text);

                            if (X==1)

                            {

                                      if (Nomer==0) Otvet();

                                      Sravnenie();

                                      if (textBox3.Text.Length==0)Otvet();

                                      intMoe=Convert.ToInt32(textBox2.Text);

                                      intPravilnoe=Convert.ToInt32(textBox3.Text);

                                      if (Moe==Pravilnoe) Prav++;

                                      textBox5.Text="";

                                      textBox5.Text+=Prav;

                            }

                            X=0;

                   }

                   private void button4_Click(object sender,System.EventArgs e)

                   {

                            A4 = new Help(2);

                            A4.ShowDialog();

                   }

                   private void button5_Click(object sender,System.EventArgs e){this.Close();}

                   private void button3_Click(object sender,System.EventArgs e)

                   {

                            ChVoprosov++;

                            textBox2.Text="";

                            textBox3.Text="";

                            textBox4.Text="";

                            textBox4.Text+=ChVoprosov;

                            Generation();

                            Number();

                   }

         }

}

Even_ueven

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace Study_Programs

{

         public class Even_uneven: System.Windows.Forms.Form

         {

                   int Prav;

                   int ch;

                   int ChVoprosov=1;

                   Help A4;

                   private System.Windows.Forms.TextBox textBox1;

                   private System.Windows.Forms.Button button1;

                   private System.Windows.Forms.TextBox textBox2;

                   private System.Windows.Forms.Button button2;

                   private System.Windows.Forms.TextBox textBox3;

                   private System.Windows.Forms.TextBox textBox4;

                   private System.Windows.Forms.Label label1;

                   private System.Windows.Forms.Label label2;

                   private System.Windows.Forms.Label label3;

                   private System.Windows.Forms.Label label4;

                   private System.Windows.Forms.Button button3;

                   private System.Windows.Forms.Button button4;

                   private System.Windows.Forms.Label label6;

                   private System.Windows.Forms.GroupBox groupBox1;

                   private System.ComponentModel.Container components =null;

                   public Even_uneven(){InitializeComponent();}

                   protected override void Dispose( bool disposing )

                   {

                            if( disposing ) if(components != null)components.Dispose();

                            base.Dispose( disposing );

                   }

                   public void Generation()

                   {

                            textBox1.Text="";

                            Random r=new System.Random();

                            int d;

                            for (int i=0; i<7; i++)

                            {

                                      d=r.Next(0,2);

                                      textBox1.Text+=d;

                                      ch+=d;

                            }

                            textBox2.Text="";

                            int g=r.Next(0,2);

                            textBox2.Text+=g;

                            ch+=g;

                   }

                   public void ChangeChVoprosov()

                   {

                                      ChVoprosov++;

                            textBox3.Text="";

                            textBox3.Text+=ChVoprosov;

                   }

                   public void ChangePrav()

                   {

                            textBox4.Text="";

                            textBox4.Text+=Prav; 

                   }

                   #region Windows Form Designer generated code

                   private void InitializeComponent()

                   {

                            this.textBox1 = newSystem.Windows.Forms.TextBox();

                            this.button1 = new System.Windows.Forms.Button();

                            this.textBox2 = newSystem.Windows.Forms.TextBox();

                            this.button2 = newSystem.Windows.Forms.Button();

                            this.textBox3 = newSystem.Windows.Forms.TextBox();

                            this.textBox4 = newSystem.Windows.Forms.TextBox();

                            this.label1 = newSystem.Windows.Forms.Label();

                            this.label2 = newSystem.Windows.Forms.Label();

                            this.label3 = newSystem.Windows.Forms.Label();

                            this.label4 = newSystem.Windows.Forms.Label();

                            this.button3 = newSystem.Windows.Forms.Button();

                            this.button4 = newSystem.Windows.Forms.Button();

                            this.label6 = newSystem.Windows.Forms.Label();

                            this.groupBox1 = newSystem.Windows.Forms.GroupBox();

                            this.groupBox1.SuspendLayout();

                            this.SuspendLayout();

                            //

                            // textBox1

                            //

                            this.textBox1.Location = newSystem.Drawing.Point(192, 15);

                            this.textBox1.Name = «textBox1»;

                            this.textBox1.ReadOnly = true;

                            this.textBox1.Size = newSystem.Drawing.Size(88, 20);

                            this.textBox1.TabIndex = 0;

                            this.textBox1.Text = "";

                            this.textBox1.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // button1

                            //

                            this.button1.Location = newSystem.Drawing.Point(7, 156);

                            this.button1.Name = «button1»;

                            this.button1.Size = newSystem.Drawing.Size(140, 22);

                            this.button1.TabIndex = 1;

                            this.button1.Text = «Код числа правильный»;

                            this.button1.Click += newSystem.EventHandler(this.button1_Click);

                            //

                            // textBox2

                            //

                            this.textBox2.Location = newSystem.Drawing.Point(192, 45);

                            this.textBox2.Name = «textBox2»;

                            this.textBox2.ReadOnly = true;

                            this.textBox2.Size = newSystem.Drawing.Size(88, 20);

                            this.textBox2.TabIndex = 2;

                            this.textBox2.Text = «0»;

                            this.textBox2.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // button2

                            //

                            this.button2.Location = newSystem.Drawing.Point(153, 156);

                            this.button2.Name = «button2»;

                            this.button2.Size = newSystem.Drawing.Size(140, 21);

                            this.button2.TabIndex = 3;

                            this.button2.Text = «Код числа неправильный»;

                            this.button2.Click += newSystem.EventHandler(this.button2_Click);

                            //

                            // textBox3

                            //

                            this.textBox3.Location = newSystem.Drawing.Point(103, 186);

                            this.textBox3.Name = «textBox3»;

                            this.textBox3.ReadOnly = true;

                            this.textBox3.Size = newSystem.Drawing.Size(34, 20);

                            this.textBox3.TabIndex = 4;

                            this.textBox3.Text = «1»;

                            this.textBox3.TextAlign =System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // textBox4

                            //

                            this.textBox4.Location = new System.Drawing.Point(260,186);

                            this.textBox4.Name = «textBox4»;

                            this.textBox4.ReadOnly = true;

                            this.textBox4.Size = newSystem.Drawing.Size(33, 20);

                            this.textBox4.TabIndex = 5;

                            this.textBox4.Text = «0»;

                            this.textBox4.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;

                            //

                            // label1

                            //

                            this.label1.Location = newSystem.Drawing.Point(7, 16);

                            this.label1.Name = «label1»;

                            this.label1.Size = newSystem.Drawing.Size(113, 22);

                            this.label1.TabIndex = 6;

                            this.label1.Text = «Цифровые разряды:»;

                            //

                            // label2

                            //

                            this.label2.Location = newSystem.Drawing.Point(7, 45);

                            this.label2.Name = «label2»;

                            this.label2.Size = newSystem.Drawing.Size(120, 22);

                            this.label2.TabIndex = 7;

                            this.label2.Text = «Контрольный разряд:»;

                            //

                            // label3

                            //

                            this.label3.Location = newSystem.Drawing.Point(12, 189);

                            this.label3.Name = «label3»;

                            this.label3.Size = newSystem.Drawing.Size(86, 15);

                            this.label3.TabIndex = 8;

                            this.label3.Text = «Номер вопроса:»;

                            //

                            // label4

                            //

                            this.label4.Location = newSystem.Drawing.Point(146, 186);

                            this.label4.Name = «label4»;

                            this.label4.Size = newSystem.Drawing.Size(114, 14);

                            this.label4.TabIndex = 9;

                            this.label4.Text = «Правильных ответов:»;

                            //

                            // button3

                            //

                            this.button3.Font = newSystem.Drawing.Font(«Microsoft Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.button3.Location = newSystem.Drawing.Point(120, 208);

                            this.button3.Name = «button3»;

                            this.button3.Size = newSystem.Drawing.Size(60, 22);

                            this.button3.TabIndex = 10;

                            this.button3.Text = «Справка»;

                            this.button3.Click += newSystem.EventHandler(this.button3_Click);

                            //

                            // button4

                            //

                            this.button4.Font = newSystem.Drawing.Font(«Microsoft Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.button4.Location = newSystem.Drawing.Point(80, 238);

                            this.button4.Name = «button4»;

                            this.button4.Size = newSystem.Drawing.Size(140, 22);

                            this.button4.TabIndex = 11;

                            this.button4.Text = «Вернуться к выбору темы»;

                            this.button4.Click += newSystem.EventHandler(this.button4_Click);

                            //

                            // label6

                            //

                            this.label6.Location = newSystem.Drawing.Point(8, 88);

                            this.label6.Name = «label6»;

                            this.label6.Size = newSystem.Drawing.Size(288, 64);

                            this.label6.TabIndex = 13;

                            this.label6.Text= «Нужно определить присутствует или не присутствует ошибка в записичисла.Если числ» +

                                      «озаписано правильно, нужно щелкнуть по кнопке «Код числа правильный». Есличис» +

                                      «лосодержит ошибку, нужно щелкнуть кнопку «Код числа неправильный». »;

                            this.label6.TextAlign =System.Drawing.ContentAlignment.BottomLeft;

                            //

                            // groupBox1

                            //

                            this.groupBox1.Controls.Add(this.label1);

                            this.groupBox1.Controls.Add(this.textBox1);

                            this.groupBox1.Controls.Add(this.label2);

                            this.groupBox1.Controls.Add(this.textBox2);

                            this.groupBox1.Location = newSystem.Drawing.Point(7, 7);

                            this.groupBox1.Name = «groupBox1»;

                            this.groupBox1.Size = newSystem.Drawing.Size(286, 75);

                            this.groupBox1.TabIndex = 14;

                            this.groupBox1.TabStop = false;

                            this.groupBox1.Text = «Задано случайное число:»;

                            //

                            // Even_uneven

                            //

                            this.AutoScaleBaseSize = newSystem.Drawing.Size(5, 13);

                            this.BackColor =System.Drawing.SystemColors.InactiveBorder;

                            this.ClientSize = newSystem.Drawing.Size(301, 272);

                            this.ControlBox = false;

                            this.Controls.Add(this.groupBox1);

                            this.Controls.Add(this.label6);

                            this.Controls.Add(this.button4);

                            this.Controls.Add(this.button3);

                            this.Controls.Add(this.label4);

                            this.Controls.Add(this.label3);

                            this.Controls.Add(this.textBox4);

                            this.Controls.Add(this.textBox3);

                            this.Controls.Add(this.button2);

                            this.Controls.Add(this.button1);

                            this.Font = newSystem.Drawing.Font(«Microsoft Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;

                            this.Name = «Even_uneven»;

                            this.ShowInTaskbar = false;

                            this.StartPosition =System.Windows.Forms.FormStartPosition.CenterScreen;

                            this.Text = «Even_uneven»;

                            this.TopMost = true;

                            this.Load += newSystem.EventHandler(this.Form1_Load);

                            this.groupBox1.ResumeLayout(false);

                            this.ResumeLayout(false);

                   }

                   #endregion          

                   private void Form1_Load(object sender,System.EventArgs e)

                   {                

                            Generation();

                   }

                   private void button1_Click(object sender,System.EventArgs e)

                   {       

                            ChangeChVoprosov();

                            Prav=Convert.ToInt32(textBox4.Text);

                            if (ch==0 || ch==2 || ch==4 || ch==6) Prav++;

                            ChangePrav();

                            ch=0;

                            Generation();

                   }

                  private void button2_Click(object sender,System.EventArgs e)

                   {

                            ChangeChVoprosov();

                            Prav=Convert.ToInt32(textBox4.Text);

                            if (ch==1 || ch==3 || ch==5 || ch==7) Prav++;

                            ChangePrav();

                            ch=0;

                            Generation();

                   }

                   private void button4_Click(object sender,System.EventArgs e){this.Close();}

                   private void button3_Click(object sender,System.EventArgs e)

                   {

                            A4 = new Help(1); A4.ShowDialog();

                   }

         }

}

Help

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace Study_Programs

{

         public class Help: System.Windows.Forms.Form

         {

                   private System.Windows.Forms.Label label1;

                   private System.Windows.Forms.ComboBox comboBox1;

                   private System.Windows.Forms.RichTextBox richTextBox1;

                   private System.Windows.Forms.Button button1;

                   private System.ComponentModel.Container components =null;

                   public Help(byte n)

                   {

                            InitializeComponent();

                            comboBox1.SelectedIndex=n;

                   }

                   protected override void Dispose( bool disposing )

                   {

                            if(disposing) if(components !=null)components.Dispose();

                            base.Dispose( disposing );

                   }

                   #region Windows Form Designer generated code

                   private void InitializeComponent()

                   {

                            this.label1 = new System.Windows.Forms.Label();

                            this.comboBox1 = newSystem.Windows.Forms.ComboBox();

                            this.richTextBox1 = newSystem.Windows.Forms.RichTextBox();

                            this.button1 = newSystem.Windows.Forms.Button();

                            this.SuspendLayout();

                            //

                            // label1

                            //

                            this.label1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.label1.Location = newSystem.Drawing.Point(56, 0);

                            this.label1.Name = «label1»;

                            this.label1.Size = newSystem.Drawing.Size(280, 24);

                            this.label1.TabIndex = 0;

                            this.label1.Text = «Выберите интересующий Вас раздел»;

                            this.label1.TextAlign =System.Drawing.ContentAlignment.MiddleCenter;

                            //

                            // comboBox1

                            //

                            this.comboBox1.DropDownStyle =System.Windows.Forms.ComboBoxStyle.DropDownList;

                            this.comboBox1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(204)));

                            this.comboBox1.Items.AddRange(new object[] {

                                                                                                                                     «Программирование машиныПоста»,

                                                                                                                                     «Кодированиепо методу четности\\нечетности»,

                                                                                                                                     «Кодированиепо методу Хэмминга»});

                            this.comboBox1.Location= new System.Drawing.Point(8, 24);

                            this.comboBox1.Name =«comboBox1»;

                            this.comboBox1.Size = newSystem.Drawing.Size(376, 23);

                            this.comboBox1.TabIndex = 1;

                            this.comboBox1.SelectedIndexChanged += newSystem.EventHandler(this.comboBox1_SelectedIndexChanged);

                            //

                            // richTextBox1

                            //

                            this.richTextBox1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.richTextBox1.Location = newSystem.Drawing.Point(8, 56);

                            this.richTextBox1.Name =«richTextBox1»;

                            this.richTextBox1.ReadOnly = true;

                            this.richTextBox1.Size = newSystem.Drawing.Size(376, 184);

                            this.richTextBox1.TabIndex = 2;

                            this.richTextBox1.Text = "";

                            //

                            // button1

                            //

                            this.button1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.button1.Location = newSystem.Drawing.Point(160, 248);

                            this.button1.Name = «button1»;

                            this.button1.Size = newSystem.Drawing.Size(80, 24);

                            this.button1.TabIndex = 3;

                            this.button1.Text = «Выход»;

                            this.button1.Click += newSystem.EventHandler(this.button1_Click);

                            //

                            // Help

                            //

                            this.AutoScaleBaseSize = newSystem.Drawing.Size(5, 13);

                            this.BackColor =System.Drawing.SystemColors.InactiveBorder;

                            this.ClientSize = newSystem.Drawing.Size(394, 280);

                            this.ControlBox = false;

                            this.Controls.Add(this.button1);

                            this.Controls.Add(this.richTextBox1);

                            this.Controls.Add(this.comboBox1);

                            this.Controls.Add(this.label1);

                            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;

                            this.MaximizeBox = false;

                            this.Name = «Help»;

                            this.StartPosition =System.Windows.Forms.FormStartPosition.CenterScreen;

                            this.Text = «Help»;

                            this.TopMost = true;

                            this.ResumeLayout(false);

                   }

                   #endregion

                   private void button1_Click(object sender,System.EventArgs e){this.Close();}

                   private void comboBox1_SelectedIndexChanged(objectsender, System.EventArgs e)

                   {

                            string temp;

                            switch(comboBox1.SelectedIndex)

                            {

                                      case(0):

                                      {

                                               richTextBox1.Text="";

                                               temp=«МашинаПоста (как и машина Тьюринга) является одним из способов формализации понятияалгоритма. Машина Поста является абстрактной машиной, предназначенной длядоказательства различных утверждений о свойствах программ для них. Машина Постаявляется полностью детерминированной машиной, читающей начальные данные и,после выполнения программы, выдающей результат. На содержательном уровне машинаПоста представляет собой бесконечную ленту, разделенную на одинаковые клетки,каждая из которых может быть либо пустой либо заполненной меткой, вдоль которойможет перемещаться головка. За один такт или за одну команду головка можетпереместиться на одну клетку вправо или влево (или остаться на месте). Крометого головка может записать в клетку, над которой она находится, метку (если еетам не было) или стереть метку (если она там была). В результате работы машинаПоста перерабатывает содержимое ленты в соответствие с заданной программой.Вобщем виде отдельная команда машины Поста имеет следующий вид: n,K,m1,m2; где n– порядковый номер команды, К – тип команды, m1, m2 – порядковые номераследующих команды. Имеется шесть типов команд машины Поста, которым дляудобства можно дать номера от 1 до 6. Ниже дано описание команд машиныПоста.\n1 — Движение головки на одну клетку вправо и переход к команде m1.\n2 — Движение головки на одну клетку влево и переход к команде m1.\n3 — Нанесениеметки в ячейку и переход к команде m1.\n4 — Стирание метки в ячейке и переход ккоманде m1.\n5 — Проверка наличия метки в клетке, над которой находитсяголовка. Если метка отсутствует, то управление передается с номером m1, еслиметка есть, то с номером m2.\n6 — Остановка машины.\nПример команды машиныПоста: 1,1,2,0;. Данная команда имеет порядковый номер 1, тип команды – 1(движение головки на одну клетку вправо). После выполнения команды управлениепередается команде, имеющей порядковый номер 2.\nРассмотрим пример простойпрограммы, которая стирает первую метку, записанную на ленте. Предположим,»;

richTextBox1.Text= temp + «что в начале работы головка находится над крайне левой ячейкойленты. Поставленная задача может быть выполнена с помощью следующего наборакоманд.\n• 1,5,2,4; 1-я команда.\n• 2,1,3,0; 2-я команда.\n• 3,5,2,4; 3-якоманда.\n• 4,4,5,0; 4-я команда.\n• 5,6,0,0; 5-я команда.\nРазберем работупрограммы.\n1-я команда – это команда типа 5, т.е. условный переход. Еслиячейка пустая, то управление передается команде 2, в противном случае – 4-йкоманде.\n2-я команда – это сдвиг головки на одну ячейку вправо и передачауправления 3-й команде.\n3-я команда – это опять условный переход. Если меткаотсутствует, то возврат ко второй команде и переход на 4-ю в противномслучае.\n4-я команда стирает метку (очевидно, она там есть, т.к. мы попадаем на4-ю команду только при наличии метки) и передает управление 5-й команде,которая является командой остановки машины.\nПорядок записи и выполненияпрограммы следующий:\n1.В окно «Входная строка машины Поста» введитепроизвольную строку, состоящую из нулей и единиц, для которой поставленнаязадача имеет смысл. Например, если задача состоит в стирании 1-й метки, то, чтобыпроверить правильность работы программы, во входной строке должнаприсутствовать хотя бы одна метка, т.е. единица.\n2.В нижележащее окно введитев соответствии с выше перечисленными правилами набор команд, решающихпоставленную задачу.\n3.Нажмите кнопку «GO», после чего записанные командыбудут выполнены и в окне «Выходная строка» появится результат работы машиныПоста в виде выходной строки символов, состоящей из нулей и единиц.\nВ качествеупражнения задайте произвольную входную строку и введите рассмотренную вышепрограмму, стирающую 1-ю метку. Запустите программу на выполнение. Результатработы программы покажите преподавателю.»;

                                               break;

                                      }

                                      case(1):

                                      {

                                               richTextBox1.Text="";

                                               temp=«Понятиедвоичного кода.\nДля контроля правильности передачи информации, а также каксредство шифрования информации используются различные коды. Коды, использующиедля передачи информации два различных элементарных сигнала, называютсядвоичными. Эти сигналы удобно обозначать символами 0 и 1. Тогда кодовое словобудет состоять из последовательности нулей и единиц.\nПри выполненииарифметических операций в цифровом автомате правильный результат будет получентолько в случае, если машина работает без нарушений. При возникновениикакой-либо ошибки в двоичном коде результат операции будет неверным, однакопользователь об этом не узнает, если не будут предусмотрены меры,сигнализирующие о появлении ошибки. То есть должна быть разработанаопределенная система контроля работы цифрового автомата. Для этой цели и служатразличные методы кодирования двоичной информации. Кодирование по методучетности-нечетности. В случае кодирования по методу четности-нечетности ккаждому двоичному числу добавляется один избыточный разряд и в негозаписывается 1 или 0 с таким условием, чтобы сумма цифр в числе была по модулю2 равна 0 в случае кодирования по методу четности и 1 – по методу нечетности.Другими словами число единиц в двоичном числе (вместе с контрольным разрядом)должно быть четным числом в случае четности и нечетным – в случае нечетности.Появление ошибки в двоичном коде обнаружится по нарушению этого правила.Например, число 10011011 будет ошибочным в случае кодирования по четности, таккак число единиц в числе нечетно и равно 5. При таком кодировании допускается,что может возникнуть только одна ошибка. Очевидно, что если число содержит двеошибки (или вообще четное число ошибок) то его код по методу четности будетправильным. То же самое можно сказать и о кодировании по методу нечетности.Пример реализации метода четности:\nI.Цифровой разряд — 1011101\nКонтрольныйразряд — 1\nПризнак правильности числа — 0\n\nII.Цифровой разряд — 1110100\nКонтрольный разряд — 0\nПризнак правильности числа — 0\n\nIII.Ц»;

richTextBox1.Text= temp + «ифровой разряд — 1000011\nКонтрольный разряд — 0\nПризнакправильности числа — 1\n\nIV.Цифровой разряд — 1110111\nКонтрольный разряд — 1\nПризнак правильности числа — 1.\nПризнак правильности равный 0 означает, чтокод числа правильный и 1 — неправильный. Такое кодирование не позволяет в случаепоявления ошибки определить какой именно разряд является ошибочным.Избыточность информации при таком кодировании минимальна и равна одному биту(один дополнительный разряд). Можно представить видоизмененный метод контроляпо методу четности. Цифровые разряды двоичного числа разбиваются на группы,каждая из которых содержит одинаковое количество разрядов. Контрольные разрядыдобавляются к каждой группе по строкам и по столбцам. Увеличение избыточностиинформации (вместо одного дополнительного разряда для 9 разрядного числа мыимеем 6 дополнительных разрядов) приводит к тому, что появляется возможность нетолько обнаружить наличие ошибки, но и место ее возникновения.»;

                                               break;

                                      }

                                      case(2):

                                      {

                                               richTextBox1.Text="";

                                               temp=«Каки в последнем варианте метода четности, коды Хэмминга позволяют не толькообнаружить наличие ошибки, но и место ее нахождения и следовательно даютвозможность ее исправить. Однако, в отличие от предыдущего методы, кодыХэмминга обладают меньшей избыточностью, т.е. количеством дополнительныхконтрольных разрядов. Предположим, что имеется код, содержащий m информационныхи k контрольных разрядов. Все разряды, включая контрольные, разбиваются на kгрупп по определенным правилам, о которых будет сказано ниже. Каждая группа,содержащая один контрольный разряд, проверяется на четность. Пусть былипроведены все k проверок. Если результат данной проверки свидетельствует оботсутствии ошибки, то записывается 0, если есть ошибка, то записывается 1. Врезультате получается последовательность, состоящая из k нулей и единиц. Приотсутствии ошибки в коде получается последовательность нулей. Полученноеk-разрядное двоичное число может содержать 2k различных комбинаций нулей иединиц. С помощью этой информации нужно определить ошибочный разряд в коде,содержащем m+k разрядов. Для того, чтобы это было возможно должно выполнятьсянеравенство:2^k=>(m+k+1)\nОпределить максимальное значение m для данного kможно из следующей таблицы.\n n|1,2,3,4…|8,…,15|16,…,31|…|\nm|0,0,1,1…|4,…,11|11,…,26|…|\nk| 1,2,2,3 | 4,…,4 | 5,…,5 |…|\nИз таблицы видно, для 16-ти разрядного числатребуется 5 контрольных разрядов. В качестве сравнения, в случаемодифицированного метода четности потребовалось бы 8 контрольных разрядов.Позиции контрольных разрядов в методе Хэмминга определены заранее, это разряды1,2,4,8,… Разряды, входящие в каждую группу проверки представлены в следующейтаблице (1-й разряд в каждой группе является контрольным).\n\nНомер группыпроверки — 1.\nПроверяемые разряды — 1,3,5,7,9,11,13,15,…\n\nНомер группыпроверки — 2.\nПроверяемые разряды — 2,3,6,7,10,11,14,15,18,19,22,23,…\n\nНомергруппы проверки — 3.\nПроверяемые разряды — 4,5,6,7,12,13,14,15,20,21,22,23,…\n\nНомер группы проверки — 4.\n»;

richTextBox1.Text= temp + «Проверяемые разряды — 8,9,10,11,12,13,14,15,24,…\nИз таблицывидно, что если например код Хэмминга содержит 9 разрядов, включая контрольные,то 1-я группа проверки содержит 1,3,5,7,9 разряды. 2-я группа проверки содержит2,3,6,7 разряды. 3-группа проверки содержит 4,5,6,7 разряды и 4-я группа – 8,9разряды. Каждой группе проверки приписывается 1, если проверка на четностьобнаруживает ошибку и 0, если ошибки нет. Полученное двоичное число дает номерошибочного разряда. Рассмотрим в качестве примера 5-ти разрядное двоичное число10011. В этом случае, как следует из вышеприведенной таблицы, 1-я группапроверки состоит из 1,3, и 5-го разрядов. 2-я группа проверки состоит из 2 и3-го разряда. 3-я группа проверки состоит из 4 и 5-го разрядов. Результатпроверки на четность 1-й группы дает 0 (101), проверка 2-й группы дает 0 (00),проверка 3-й группы дает 0 (11). Таким образом, данное число не содержитошибки. Искусственно введем ошибку, заменив, например, 4-й разряд на 0. В этомслучае 1, 2 и 3-я проверки дадут соответственно 0, 0, 1. Полученное двоичноечисло 100 дает номер ошибочного разряда, т.е. 4.»;

                                               break;

                                      }

                            }

                   }

         }

}

Error

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace Study_Programs

{

         public class Error: System.Windows.Forms.Form

         {

                   private System.Windows.Forms.Button button1;

                   private System.Windows.Forms.Label label1;

                   private System.Windows.Forms.PictureBox pictureBox1;

                   private System.ComponentModel.Container components =null;

                   public Error(string error)

                   {

                            InitializeComponent();

                            label1.Text=error;

                   }

                   protected override void Dispose( bool disposing )

                   {

                            if(disposing) if(components != null)components.Dispose();

                            base.Dispose( disposing );

                   }

                   #region Windows Form Designer generated code

                   private void InitializeComponent()

                   {

                            System.Resources.ResourceManager resources =new System.Resources.ResourceManager(typeof(Error));

                            this.button1 = new System.Windows.Forms.Button();

                            this.label1 = newSystem.Windows.Forms.Label();

                            this.pictureBox1 = newSystem.Windows.Forms.PictureBox();

                            this.SuspendLayout();

                            //

                            // button1

                            //

                            this.button1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F, System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point, ((System.Byte)(204)));

                            this.button1.Location = newSystem.Drawing.Point(136, 56);

                            this.button1.Name = «button1»;

                            this.button1.Size = newSystem.Drawing.Size(72, 24);

                            this.button1.TabIndex = 0;

                            this.button1.Text = «OK»;

                            this.button1.Click += newSystem.EventHandler(this.button1_Click);

                            //

                            // label1

                            //

                            this.label1.Font = newSystem.Drawing.Font(«MS Reference Sans Serif», 8.25F,System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point,((System.Byte)(204)));

                            this.label1.Location = newSystem.Drawing.Point(48, 8);

                            this.label1.Name = «label1»;

                            this.label1.Size = newSystem.Drawing.Size(272, 40);

                            this.label1.TabIndex = 1;

                            this.label1.Text = «label1»;

                            this.label1.TextAlign =System.Drawing.ContentAlignment.MiddleCenter;

                            //

                            // pictureBox1

                            //

                            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject(«pictureBox1.Image»)));

                            this.pictureBox1.Location = newSystem.Drawing.Point(8, 16);

                            this.pictureBox1.Name =«pictureBox1»;

                            this.pictureBox1.Size = newSystem.Drawing.Size(32, 32);

                            this.pictureBox1.TabIndex = 2;

                            this.pictureBox1.TabStop = false;

                            //

                            // Error

                            //

                            this.AutoScaleBaseSize = newSystem.Drawing.Size(5, 13);

                            this.BackColor =System.Drawing.SystemColors.InactiveBorder;

                            this.ClientSize = newSystem.Drawing.Size(338, 88);

                            this.ControlBox = false;

                            this.Controls.Add(this.pictureBox1);

                            this.Controls.Add(this.label1);

                            this.Controls.Add(this.button1);

                            this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;

                            this.Name = «Error»;

                            this.StartPosition =System.Windows.Forms.FormStartPosition.CenterScreen;

                            this.Text = «Error»;

                            this.TopMost = true;

                            this.ResumeLayout(false);

                   }

                   #endregion

                   private void button1_Click(object sender,System.EventArgs e){this.Close();}

         }

}

еще рефераты
Еще работы по информатике, программированию