Управляющие конструкции
Управляющие конструкции - это то средство, которое позволяет вам создавать алгоритмы. Стандартными управляющими конструкциями являются 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, и реальный параметр в этом случае может быть только переменной.
Для контроля правильности передачи информации, а также как средство шифрования информации используются различные коды. Коды, использующие для передачи информации два различных элементарных сигнала, называются двоичными. Эти сигналы удобно обозначать символами 0 и 1. Тогда кодовое слово будет состоять из последовательности нулей и единиц.
При выполнении арифметических операций в цифровом автомате правильный результат будет получен только в случае, если машина работает без нарушений. При возникновении какой-либо ошибки в двоичном коде результат операции будет неверным, однако пользователь об этом не узнает, если не будут предусмотрены меры, сигнализирующие о появлении ошибки. То есть должна быть разработана определенная система контроля работы цифрового автомата. Для этой цели и служат различные методы кодирования двоичной информации.
Систематический код – это код, содержащий в себе информационные и контрольные разряды. В контрольные разряды записывается некоторая информация об исходном числе, поэтому систематический код обладает избыточностью.
При этом абсолютная избыточность будет выражаться количеством контрольных разрядов – k, а относительная избыточность –
, где m – количество информационных разрядов.Понятие корректирующей способности кода связывают с возможностью обнаружения и исправления ошибки. Количественно корректирующая способность кода определяется вероятностью обнаружения или исправления ошибки[4].
Одной из простейших форм проверки ошибок является контроль на четность. В чем же заключается смысл кодирования по методу четности / нечетности? Его суть заключается в том, что каждой кодовой комбинации добавляется один разряд, в который записывается единица, если число единиц в кодовой комбинации нечетное, или ноль, если четное. При декодировании подсчитывается количество единиц в кодовой комбинации. Если оно оказывается четным, то поступившая информация считается правильной, если нет, то ошибочной.
Кроме проверки по горизонтали контроль на четность и нечетность может проводиться и по вертикали.
Преимущества контроля на четность заключается в минимальном значении коэффициента избыточности (для пятиэлементного кода К =0,17) и в простоте его технической реализации, а недостаток - в том, что обнаруживаются ошибки, имеющие только нечетную кратность.
Однако такая методика проверки не может обнаружить ошибки в случае двойного переброса (например, две единицы перебросились в ноль), что может привести к высокому уровню ошибок в некоторых передачах. Многоуровневая модуляция (когда проверка сигнала осуществляется по двум или трем битам) требует более сложной техники.
Проверка на четность/нечетность по одному биту также является неприемлемой и для многих аналоговых линий речевого диапазона из-за группирования ошибок, которое обычно происходит в линиях связи такого типа.
Двойная проверка на четность/нечетность является усовершенствованием одинарной проверки. В этой методике вместо бита четности в каждом символе определяется четность или нечетность целого блока символов. Проверка блока позволяет обнаруживать ошибки как внутри символа, так и между символами. Эта проверка называется также двумерным кодом проверки на четность. Она имеет значительное преимущество по сравнению с одинарной. С помощью такой перекрестной проверки может быть существенно улучшена надежность работы обычной телефонной линии, вероятность появления ошибки в которой составляет 10 . Однако, как ординарная, так и двойная проверка на четность означают увеличение накладных расходов и относительное уменьшение выхода информации для пользователя.