Операторы ветвления
Операторы ветвления позволяют изменить порядок выполнения операторов в программе. К операторам ветвления относятся условный оператор if и оператор выбора switch.
Условный оператор if
Условный оператор if используется для разветвления процесса обработки данных на два направления. Он может иметь одну из форм: сокращенную или полную.
Форма сокращенного оператора if:
if (B) S;
где В – логическое или арифметическое выражение, истинность которого проверяется; S – оператор: простой или составной.
При выполнении сокращенной формы оператора if сначала вычисляется выражение B, затем проводится анализ его результата: если B истинно, то выполняется оператор S; если B ложно, то оператор S пропускается. Таким образом, с помощью сокращенной формы оператора if можно либо выполнить оператор S, либо пропустить его.
Форма полного оператора if:
if (B) S1; else S2;
где B – логическое или арифметическое выражение, истинность которого проверяется; S1, S2- оператор: простой или составной.
При выполнении полной формы оператора if сначала вычисляется выражение B, затем анализируется его результат: если B истинно, то выполняется оператор S1, а оператор S2 пропускается; если B ложно, то выполняется оператор S2, а S1 – пропускается. Таким образом, с помощью полной формы оператора if можно выбрать одно из двух альтернативных действий процесса обработки данных.
Рассмотрим несколько примеров записи условного оператора if:
if (a > 0) x=y; // Сокращенная форма c простым оператором
if (++i) {x=y; y=2*z;} // Сокращенная форма c составным оператором
if (a > 0 || b<0) x=y; else x=z; // Полная форма с простым оператором
if (i+j-1) { x= 0; y= 1;} else {x=1; y:=0;} // Полная форма с составными операторами
Рассмотрим пример использования условного оператора.
static void Main()
{
Console.Write("x= ");
float x = float.Parse(Console.ReadLine());
Console.Write("y=");
float y = float.Parse(Console.ReadLine());
if (x < y ) Console.WriteLine("min= "+x);
else Console.WriteLine("min= "+y);
}
Результат работы программы: x y min
0 0 0
1 -1 -1
-2 2 -2
Задание. Измените программу так, чтобы вычислялось наибольшее значение из х и у.
Операторы S1 и S2 могут также являться операторами if. Такие операторы называют вложенными. При этом ключевое слово else связывается с ближайшим предыдущим словом if, которое еще не связано ни с одним else. Рассмотрим пример программы, использующей вложенные условные операторы.
Пример: Дана мишень.
Подсчитать количество очков после выстрела по данной мишени.
static void Main()
{
int Ball=0;
Console.Write("x= ");
float x = float.Parse(Console.ReadLine());
Console.Write("y= ");
float y = float.Parse(Console.ReadLine());
if (x * x + y * y <=1) Ball = 10; //окружность с радиусом 1
else if (x * x + y * y <= 4) Ball = 5; //окружность с радиусом 2
Console.WriteLine("Ball= "+ Ball);
}
Результат работы программы: x y Ball
0 0 10
1 -1 5
-2 2 0
Задание.Измените программу так, чтобы подсчитывалось количество очков для мишени вида
Оператор выбора switch
Оператор выбора switch предназначен для разветвления процесса вычислений по нескольким направлениям. Формат оператора:
switch ( <выражение> )
{
case <константное_выражение_1>:
[<оператор 1>]; <оператор перехода>;
case <константное_выражение_2>:
[<оператор 2>]; <оператор перехода>;
...
case <константное_выражение_n>:
[<оператор n>]; <оператор перехода>;
[default: <оператор>; ]
}
Замечание. Выражение, записанное в квадратных скобках, является необязательным элементом в операторе switch. Если оно отсутствует, то может отсутствовать и оператор перехода.
Выражение, стоящее за ключевым словом switch, должно иметь арифметический, символьный, строковый тип или тип указатель. Все константные выражения должны иметь разные значения, но их тип должен совпадать с типом выражения, стоящим после switch или приводиться к нему. Ключевое слово case и расположенное после него константное выражение называют также меткой case.
Выполнение оператора начинается с вычисления выражения, расположенного за ключевым словом switch. Полученный результат сравнивается с меткой case. Если результат выражения соответствует метке case, то выполняется оператор, стоящий после этой метки, за которым обязательно должен следовать оператор перехода: break, goto и т.д. При использовании оператора break происходит выход из switch и управление передается оператору, следующему за switch. Если же используется оператор goto, то управление передается оператору, помеченному меткой, стоящей после goto.
Пример. По заданному виду арифметической операции (сложение, вычитание, умножение и деление) и двум операндам, вывести на экран результат применения данной операции к операндам.
static void Main()
{
Console.Write("OPER= ");
char oper=char.Parse(Console.ReadLine());
bool ok=true;
Console.Write("A= ");
int a=int.Parse(Console.ReadLine());
Console.Write("B= ");
int b=int.Parse(Console.ReadLine());
float res=0;
switch (oper)
{
case '+': res = a + b; break; //1
case '-': res = a - b; break;
case '*': res = a * b; break;
case ':': if (b != 0)
{
res = (float)a / b; break;
}
else goto default;
default: ok = false; break;
}
if (ok) Console.WriteLine("{0} {1} {2} = {3}", a, oper, b, res);
else Console.WriteLine("error");
}
Результат выполнения программы: oper x y rez
+ 4 5 9
: 4 0 error
% 4 3 error
Задания.
1. Замените в строке 1 оператор break, на оператор goto case '-' и посмотрите, что произойдет, если в качестве операции ввести +.
2. В условном операторе if уберите ветку else и посмотрите, что произойдет.
Если необходимо, чтобы для разных меток выполнялось одно и тоже действие, то метки перечисляются через двоеточие. Например:
switch (oper)
{
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': case ':': if (b != 0) // перечисление меток
{
res = (float)a / b; break;
}
else goto default;
default: ok = false; break;
}
Операторы цикла
Операторы цикла используются для организации многократно повторяющихся вычислений. К операторам цикла относятся: цикл с предусловием while, цикл с постусловием do while, цикл с параметром for и цикл перебора foreach..
Цикл с предусловием while
Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Формат цикла while:
while (B) S;
где B – выражение, истинность которого проверяется (условие завершения цикла); S – тело цикла - оператор (простой или составной).
Перед каждым выполнением тела цикла анализируется значение выражения В: если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В; если значение В ложно – цикл завершается и управление передается на оператор, следующий за оператором S.
Если результат выражения B окажется ложным при первой проверке, то тело цикла не выполнится ни разу. Отметим, что если условие B во время работы цикла не будет изменяться, то возможна ситуация зацикливания, то есть невозможность выхода из цикла. Поэтому внутри тела должны находиться операторы, приводящие к изменению значения выражения B так, чтобы цикл мог корректно завершиться.
В качестве иллюстрации выполнения цикла while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n.
static void Main()
{
Console.Write("N= ");
int n=int.Parse(Console.ReadLine());
int i = 1;
while (i <= n) //пока i меньше или равно n
Console.Write(" "+ i++ ); //выводим i на экран, затем увеличиваем его на 1
}
Результаты работы программы: n ответ
10 1 2 3 4 5 6 7 8 9 10
Задание. Измените программу так, чтобы:
1. числа выводились в обратном порядке;
2. выводились только нечетные числа.
Цикл с постусловием do while
Оператор цикла do while также организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла. Формат цикла do while:
do S while (B);
где В – выражение, истинность которого проверяется (условие завершения цикла); S – тело цикла - оператор (простой или блок).
Сначала выполняется оператор S, а затем анализируется значение выражения В: если оно истинно, то управление передается оператору S, если ложно - цикл завершается, и управление передается на оператор, следующий за условием B. Так как условие В проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз.
В операторе do while, так же как и в операторе while, возможна ситуация зацикливания в случае, если условие В всегда будет оставаться истинным.
В качестве иллюстрации выполнения цикла do while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n.
static void Main()
{
Console.Write("N= ");
int n=int.Parse(Console.ReadLine());
int i = 1;
do
Console.Write(" " + i++); //выводим i на экран, затем увеличиваем его на 1
while (i <= n); //пока i меньше или равно n
}
Задание. Измените программу так, чтобы:
1. числа выводились в обратном порядке;
2. выводились только четные числа.
Цикл с параметром for
Цикл с параметром имеет следующую структуру:
for ( <инициализация>; <выражение>; <модификация>) <оператор>;
Инициализация используется для объявления и/или присвоения начальных значений величинам, используемым в цикле в качестве параметров (счетчиков). В этой части можно записать несколько операторов, разделенных запятой. Областью действия переменных, объявленных в части инициализации цикла, является цикл и вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла.
Выражение определяет условие выполнения цикла: если его результат истинен, цикл выполняется. Истинность выражения проверяется перед каждым выполнением тела цикла, таким образом, цикл с параметром реализован как цикл с предусловием. В блоке выражение через запятую можно записать несколько логических выражений, тогда запятая равносильна операции логическое И (&&).
Модификация выполняется после каждой итерации цикла и служит обычно для изменения параметров цикла. В части модификация можно записать несколько операторов через запятую.
Оператор (простой или составной) представляет собой тело цикла.
Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запятой, определяющую позицию пропускаемой части, надо оставить.
static void Main()
{
Console.Write("N= ");
int n=int.Parse(Console.ReadLine());
for (int i=1; i<=n;) //блок модификации пустой
Console.Write(" " + i++);
}
Задание. Измените программу так, чтобы:
1. числа выводились в обратном порядке;
2. выводились квадраты чисел.
Замечание. Цикл перебора foreach будет рассмотрен позже.
Вложенные циклы
Циклы могут быть простые или вложенные (кратные, циклы в цикле). Вложенными могут быть циклы любых типов: while, do while, for. Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. «Пересечения» циклов не допускаются.
Рассмотрим пример использования вложенных циклов, который позволит вывести на экран числа следующим образом:
static void Main()
{
for (int i = 1; i <= 4; ++i, Console.WriteLine()) //1
for (int j=1; j<=5; ++j)
Console.Write(" " + 2);
}
Замечание. В строке 1 в блоке модификации содержится два оператора ++i и Console.WriteLine(). В данном случае после каждого увеличения параметра i на 1 курсор будет переводиться на новую строку.
Задание. Измените программу так, чтобы таблица содержала n и m столбцов (значения n и m вводятся с клавиатуры).
Дата добавления: 2017-06-02; просмотров: 2473;