Организацияцикловfor, foreach, do-whileиwhile
Цикл с предусловием while
Формат оператора прост:
While ( выражение ) оператор
Выражение должно быть логического типа Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равен true, выполняется простой или составной оператор (блок). Эти действия повторяются до того момента, пока результатом выражения не станет значение false.
После окончания цикла управление передается на следующий за ним оператор.
Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение равно false, цикл не выполнится ни разу.
Пример легко описать самостоятельно.
Цикл с постусловием do
Имеет вид
do оператор while выражение;
Сначала выполняется простой или составной оператор, образующий тело цикла, а затем вычисляется выражение (оно должно иметь тип bool). Если выражение истинно, тело цикла выполняется еще раз и проверка повторяется. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.
Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз, например, если в цикле вводятся данные и выполняется их проверка. Если же такой необходимости нет, предпочтительнее пользоваться циклом с предусловием.
Пример самостоятельно.
Цикл с параметром for
Цикл с параметром имеет следующий формат:
for ( инициализация; выражение; модификации ) оператор;
Инициализация служит для объявления величин, используемых в цикле, и присвоения им начальных значений. В этой части можно записать несколько операторов, разделенных запятой, например:
for ( int i - 0, j - 20; ...
int k, m;
for ( k - 1. m - 0: ...
Областью действия переменных, объявленных в части инициализации цикла, является цикл. Инициализация выполняется один раз в начале исполнения цикла. Выражение типа bool определяет условие выполнения цикла: если его результатравен true, цикл выполняется. Цикл с параметром реализован как цикл с предусловием. Модификации выполняются после каждой итерации цикла и служат обычно для
изменения параметров цикла.
Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!).
Пример самостоятельно.
Оператор foreach
Оператор foreach применяется для перебора элементов вспециальным образом организованной группе данных. Массив является именно такой группой. Удобство этого вида цикла заключается в том, что нам не требуется определять количество элементов в группе и выполнять их перебор по индексу: мы просто указываем на необходимость перебрать все элементы группы. Синтаксис оператора:
foreach ( тип имя in выражение ) тело_цикла
Имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива выражение (в качестве выражения чаще всего применяется имя массива или другой группы данных). В простом или составном операторе, представляющем собой тело цикла, выполняются действия с переменной цикла. Тип переменной должен соответствовать типу элемента массива.
Ограничением оператора foreach является то, что с его помощью можно толькопросматривать значения в группе данных, но не изменять их.
Пример самостоятельно.
Наследованиеклассов, понятие базового класса и класса-наследника
Класс в С# может иметь произвольное количество потомков и только одногопредка. При описании класса имя его предка записывается в заголовке классапосле двоеточия. Если имя предка не указано, предком считается базовый класс всей иерархии System.Object:
[ атрибуты ] [ спецификаторы ] class инякласса [ : предки ]
Тело класса
Обратите внимание на то, что слово «предки» присутствует в описании класса во множественном числе, хотя класс может иметь только одного предка. Причина в том, что класс наряду с единственным предком может наследовать от интерфейсов — специального вида классов, не имеющих реализации.
Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы. Порядок вызова конструкторов определяется приведенными далее правилами:
· Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса без параметров.
· Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются, начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса. Таким образом, каждый конструктор инициализирует свою часть объекта.
· Если конструктор базового класса требует указания параметров, он должен быть явным образом вызван в конструкторе производного класса в списке инициализации. Вызов выполняется с помощью ключевого слова base. Вызывается та версия конструктора, список параметров которой соответствует списку аргументов, указанных после слова base.
Поля, методы и свойства класса наследуются, поэтому при желании заменить элемент базового класса новым элементом следует явным образом указать компилятору свое намерение с помощью ключевого слова new.
Возможность доступа к методу базового класса из метода производного
класса сохраняется. Для этого перед вызовом метода указывается все то же волшебное слово base.
Элементы базового класса, определенные как private, в производном классе недоступны. Другое решение заключается в том, чтобы определить эти поля со спецификатором protected, в этом случае они будут доступны методам всех классов, производных отданного.
Во многих случаях удобно оперировать объектами одной иерархии единообразно, то есть использовать один и тот же программныйкод дляработы с экземплярами разных классов. Желательно иметь возможность описать:
• объект, в который во время выполнения программы заносятся ссылки на объекты разных классов иерархии;
• контейнер, в котором хранятся объекты разных классов, относящиеся кодной иерархии;
• метод, в который могут передаваться объекты разных классов иерархии;
• метод, из которого в зависимости от типа вызвавшего его объекта вызываются соответствующие методы.
Все это возможно благодаря тому, что объекту базового класса можно присвоить объект производного класса.
Ключевое слово sealedв заголовке класса запрещает наследовать его.
7. Описать операторы ветвления с примерами их применения
Условный оператор if
Условный оператор i f используется для разветвления процесса вычислений на два направления.
Формат оператора:
i f ( логическое_выражение ) оператор_1; [ else оператор_2: ]
Сначала вычисляется логическое выражение. Если оно имеет значение true, выполняется первый оператор, иначе — второй. После этого управление передается на оператор, следующий за условным. Ветвь else может отсутствовать.
Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы (но не может состоять из одних описаний). Необходимо учитывать, что переменная, описанная в блоке, вне блока не существует.
Примеры условных операторов:
if ( а < 0 ) b = 1; //1
i f ( а < b && ( а > d И а == 0 ) ) b++; else { b *= а: а = 0; }//2
i f ( a < b ) i f ( a < c ) m - a; elsem = c;
else if ( b <с ) m - b: else m = c; //3
i f ( b > a ) max = b; else max = a; //4
В примере 1 отсутствует ветвь else. Подобная конструкция реализует пропуск Оператора, поскольку присваивание либо выполняется, либо пропускается в зависимости от выполнения условия.
Если требуется проверить несколько условий, их объединяют знаками логических условных операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие а < b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом —ИЛИ.
Оператор в примере 3 вычисляет наибольшее значение из трех переменных. Обратите внимание на то, что компилятор относит часть else к ближайшему ключевому слову if.
Конструкции, подобные оператору в примере 4 (вычисляется наибольшее значение из двух переменных), проще и нагляднее записывать в виде условной операции, в данном случае следующей:
max = b > а ? b : a;
Следует избегать проверки вещественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом.
Оператор выбора switch
Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений.
.
|
Формат оператора:
switch ( выражение ){
case константное_выражение_1: [ список_операторов_1 ]
case константное_выражение_2: [ список_операторов_2 ]
case константное_выражение_п: [ списокоператоровп ]
[ default: операторы ]
}
Выполнение оператора начинается с вычисления выражения. Тип выражения
чаще всего целочисленный (включая char) или строковый1. Затем управление передается первому оператору из списка, помеченному константным выражением, значение которого совпало с вычисленным.
Все константные выражения должны быть неявно приводимы к типу выражения в скобках. Если совпадения не произошло, выполняются операторы, расположенные после слова default (а при его отсутствии управление передается следующему за switch оператору).
Каждая ветвь переключателя должна заканчиваться явным оператором перехода, а именно оператором break, goto или return:
• оператор break выполняет выход из самого внутреннего из объемлющих его операторов switch, for, while и do;
• оператор goto выполняет переход на указанную после него метку, обычно это метка case одной из нижележащих ветвей оператора switch;
• оператор return выполняет выход из функции, в теле которой он записан.
Оператор goto обычно используют для последовательного выполнения нескольких ветвей переключателя, однако поскольку это нарушает читабельность программы, такого решения следует избегать.
Хотя наличие ветви default и не обязательно, рекомендуется всегда обрабатыватьслучай, когда значение выражения не совпадает ни с одной из констант. Это облегчает поиск ошибок при отладке программы.
Оператор switch предпочтительнее оператора i f в тех случаях, когда в программе требуется разветвить вычисления на количество направлений большее двух и выражение, по значению которого производится переход на ту или иную ветвь, не является вещественным. Часто это справедливо даже для двух ветвей, поскольку повышает наглядность программы.