Кодирование по методу Хэмминга
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

В самом начале программы задаются поля: int ChVoprosov=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=new Error("Исправленный вариант должен содержать 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=new Error("Исправленный вариант должен содержать 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 void button2_Click(object sender, System.EventArgs e) – метод, вызывающийся при нажатии кнопки «Вернуться к выбору темы».

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

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

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

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

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

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

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

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

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

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



Дата: 2019-05-29, просмотров: 158.