Смекни!
smekni.com

Обучающая программа по информатике (стр. 2 из 11)

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

Управляющие конструкции - это то средство, которое позволяет вам создавать алгоритмы. Стандартными управляющими конструкциями являются 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)

return command.Parameters["RETURN_VALUE"].Value;

else

return null;

Цикл for

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

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

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)

{

case 0:

//Операторы, выполняющиеся если 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 int fPassenger;

public float fSpeed;

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

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

{

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

}

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

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

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

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

{

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

}

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

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

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

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

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

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

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

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

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

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

, где m – количество информационных разрядов.

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

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

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

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

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

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

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