Инструкция программиста - Кодирование информации

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

Учебная программа состоит из множества файлов.

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

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

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

Для его запуска необходимо кликнуть кнопку Пуск, выбрать в пункте Все программы Microsoft Visual Studio. NET 2003Microsoft 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 являлась нечетным числом.

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

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

В самом начале программы задаются поля: 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 [] []. После этого запускается цикл с постусловием, в котором проверяется какая команда должна выполняться в данный момент и запускается соответствующий метод. Во время выполнения команды останова - цикл завершается и выводится результат работы программы.

Похожие статьи




Инструкция программиста - Кодирование информации

Предыдущая | Следующая