Тема 2: Переключатели вычислительных процессов. Алгоритмы циклических процессов.
Лекция 5 ОПЕРАТОРЫ УСЛОВНОГО И БЕЗУСЛОВНОГО ПЕРЕХОДОВ
5.1 Оператор условного перехода if
В языках программирования все операторы условно подразделяются на простые операторы и сложные. При этом под сложными операторами языка подразумевают такие операторы, область действия которых включает другие операторы языка программирования. В языке C# область действия сложного оператора, если в ней более одного оператора языка, выделяется фигурными скобками.
Наиболее распространенными сложными операторами являются операторы условного перехода и операторы цикла. Естественно, в языке C# существуют и другие сложные операторы, но в этой лекции мы рассмотрим работу только этих сложных операторов.
Оператор условного перехода if(если) используется в программах, когда в алгоритме решения задачи необходимо выполнить проверку некоторого логического условия, и, в зависимости от результатов проверки, продолжать работу программы по одному из двух возможных направлений. Существует даже термин «разветвляющие» участки программ, переход на которые реализуется с помощью оператора условного перехода.
Формат записи оператора if:
if ( условие) { операторы; } else { операторы;}
Если условие «истинно», то выполняются операторы, стоящие в фигурных скобках за условием, иначе выполняются операторы, стоящие в фигурных скобках за словом else. Например,
if (a > b) { x = a; y = b;} else { x = b; y = a;}
В приведенном фрагменте рассмотрен алгоритм упорядочения значений двух переменных в порядке убывания. Сравниваются значения двух переменных a и b, и переменная с наибольшим значением присваивается переменной x, а с наименьшим значением присваивается переменной y.
Если по условию задачи необходимо найти только наибольшее значение двух переменных и присвоить его переменной x, то алгоритм решения этой задачи можно записать с помощью оператора условного перехода следующим образом:
if (a > b) x = a; else x = b;
В этой записи не использовались фигурные скобки для выделения областей действия оператора, так как области действия оператора, как при истинном, так и ложном значениях условия содержат только по одному оператору присваивания.
Служебное слово else может отсутствовать в записи оператора if. Тогда, в случае не выполнения условия, программа переходит к выполнению оператора, стоящего за оператором if.
Если в области действия оператора if находится другой или другие операторы условного перехода, то для исключения путаницы при определении соответствия областей действия, стоящих за словом else, принято считать, что они относятся к ближайшему по ходу описания оператору if.
При разработках структурных схем алгоритмов решения задач условие представляется в виде ромба с двумя возможными вариантами продолжения алгоритма.
Графическое представление условия имеет следующий вид:

Рисунок 5.1 – Графическое представление условия в структурных схемах алгоритмов решения задач.
Условие оператора if может включать алгебраические выражения, операции сравнения, логические операции или их комбинацию.
В языке программирования C# используются следующие операции сравнения:
A == B – результат true если A равно B, иначе результат равен false.
A!= B – результат true если A не равно B, иначе результат равен false.
A < B – результат true если A меньше B, иначе результат равен false.
A > B – результат true если A больше B, иначе результат равен false.
A <= B – результат true если A меньше или равно B, иначе результат равен false.
A >= B – результат true если A больше или равно B, иначе результат равен false.
В языке C# различают два типа логических операций – поразрядные логические операции и условные логические операции. Поразрядные логические операции применяются к целочисленным типам, представленным в двоичном виде. При использовании этих логических операций результатом является двоичное значение «0» или «1».
Условные логические операции применяются в «условиях» различных операторов и результатом их работы является значение true или false.
Поразрядные логические операции:
& – операция поразрядного логического умножения «И»;
| – операция поразрядного логического сложения «ИЛИ»;
^ – операция поразрядного логического исключающего «ИЛИ»;
Условные логические операции:
&& – операция логического умножения «И»;
|| – операция логического сложения «ИЛИ»;
! – операция логического отрицания «НЕ»;
Операция логического умножения «И» принимает значение true (истинно), если все сомножители этой операции равны true.
Операция логического сложения «ИЛИ» принимает значение true, если хотя бы одно из слагаемых этой операции равно true.
Значение операции логического отрицания выражения равно true, если выражение равно false, и значение операции логического отрицания выражения равно false, если выражение имеет значение true.
Следует отметить, что логические операции имеют более низкий приоритет, чем операции сравнения. Это необходимо учитывать при записи некоторых логических выражений. Например, если необходимо записать оператор условного перехода, в котором выражение «истинно», если некоторая переменная x больше 0, но меньше 10, то это выражение будет иметь следующий вид:
if ( x > 0 && x < 10 ).
Рассмотрим пример учебной задачи с использованием условия.
Задача 5.1 В режиме диалога необходимо задать стороны треугольника и вычислить его периметр. После ввода значений сторон треугольника выполнять следующие проверки: все стороны треугольника должны быть больше нуля и сумма любых двух сторон больше третьей. Работу программы сопровождать необходимыми комментариями.
Разработаем структурную схему алгоритма решения задачи. Сначала необходимо организовать ввод сторон треугольника в режиме диалога. Далее проверить условия, что введенные значения позволяют построить треугольник, и если «Да», вычислить и напечатать периметр треугольника, иначе напечатать соответствующие комментарии. Структурная схема алгоритма решения задачи 5.1 изображена на рисунке 5.2.
При изображении структурных схем линии «вниз» и «вправо» не имеют стрелок. Но если есть участки линии «влево» или «вверх», то общая линия должна заканчиваться стрелкой.

Рисунок 5.2 – Структурная схема алгоритма решения задачи.
В соответствии со структурной схемой алгоритма решения задачи мы разрабатываем исходный код программы.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int a, b, c;
string buf;
vvod:
Console. Write("Введите целое значение a ");
buf = Console. ReadLine();
a = Convert. ToInt32(buf);
Console. Write("Введите целое значение b ");
buf = Console. ReadLine();
b = Convert. ToInt32(buf);
Console. Write("Введите целое значение c ");
buf = Console. ReadLine();
c = Convert. ToInt32(buf);
if (a > 0 && b > 0 && c > 0)
if (a + b > c && a + c > b && b + c > a)
Console. WriteLine("PERIMETR = {0}",a+b+c);
else
{
Console. WriteLine("Одна из сторон треугольника больше суммы двух других"); goto vvod;
}
else
{
Console. WriteLine("Одна сторона < 0 !");
goto vvod;
}
Console. WriteLine("Для продолжения нажмите клавишу Enter");
Console. ReadLine();
}
}
}
Работа программы:
Введите целое значение a 1
Введите целое значение b 2
Введите целое значение c 3
Одна из сторон треугольника больше суммы двух других
Введите целое значение a -4
Введите целое значение b 5
Введите целое значение c 6
Одна сторона < 0 !
Введите целое значение a 7
Введите целое значение b 8
Введите целое значение c 9
PERIMETR = 24
Для продолжения нажмите клавишу Enter
«Условие» алгоритма решения задачи включает несколько проверок, которые можно реализовать либо одним оператором условного перехода, либо несколькими операторами, например, двумя.
В нашей программе использовано два оператора if.
Первый оператор if проверяет условие, что бы все стороны треугольника были больше 0. Если условие выполняется, то осуществляется переход ко второму оператору if, иначе на экран монитора выдается сообщение “Одна сторона <0 !” и программа с помощью оператора goto переходит на метку vvod для повторного ввода значений сторон треугольника.
Второй оператор if проверяет условие по соотношению сторон треугольника. Если условие выполняется (это эквивалентно, что выполняются условия обоих операторов if), то на экран монитора выводится значение периметра треугольника и программа заканчивается. Иначе, на экран монитора выдается сообщение «Одна из сторон треугольника больше суммы двух других”, и с помощью оператора goto осуществляется повторный ввод значений сторон треугольника.
5.2 Оператор безусловного перехода goto
Оператор goto не является сложным оператором языка C#, но традиционно этот оператор – оператор безусловного перехода рассматривается при изучении оператора условного перехода if.
Формат записи оператора безусловного перехода: goto метка;
Перед применением оператора безусловного перехода необходимо установить метку (в нашем примере это идентификатор vvod:), на которую мы будем направлять нашу программу. После имени метки необходимо установить символ двоеточие. Если в программе встречается оператор безусловного перехода, то программа переходит на выполнение операторов, стоящих за соответствующей меткой.
Одной метке должен соответствовать хотя бы один оператор безусловного перехода.
В нашей программе с помощью операторов безусловного перехода организован повторный ввод значений сторон треугольника (пока не будут заданы «правильные» значения) в случае не выполнения условий задачи.
Этого нет в алгоритме решения задачи (и в условии задачи), но при написании кода программы всегда можно дополнить решение задачи некоторыми фрагментами, улучшающими общее решение задачи.
По условию задачи выполнение программы необходимо сопровождать комментариями. В примере использованы комментарии при не выполнении условий построения треугольника.
5.3 Оператор условия, представленный функцией
В языке программирования C# имеется оператор условия, выполняющий роль функции – результат его работы необходимо присваивать некоторой переменной или использовать в некотором выражении или другом операторе. Сокращенно его обозначают – ?:. Формат этого оператора имеет следующий вид:
выражение1 ? выражение2 : выражение3;
где выражение1 является условием. Если условие истинно, то значение оператора?: соответствует выражению2, иначе выражению3.
Например, в следующем фрагменте программы с помощью этого оператора определяется максимальное значение, которое содержит одна из трех переменных a, b и c:
x= a>b? a : b;
x= x>c? x : c;
Часто оператор?: называют сокращенным оператором if, потому что в некоторых задачах его можно использовать вместо оператора условного перехода. Однако оператор if может включать другие операторы языка C#, а оператор?: нет.
В языке C# имеется еще один оператор условия switch (переключатель), который предназначен для выбора одного из нескольких вариантов продолжения программы. Формат записи и работу оператора switch мы рассмотрим в теме массивы при реализации меню программы.
5.4 Вопросы для проверки
5.4.1 Как в операторе if правильно записать условие 3<A и A<8 ?
3 < A < 8; (3 < A && A < 8); (3 < A) || ( (A < 8); (3 < A) ! (A < 8); (3 < A) && (A < 8);5.4.2 Какая из следующих последовательностей символов является правильной записью операции сравнения в языке C#?
(A > B > C); (A := B); A := B = C; (A > C); A :> C;5.4.3 Что означает запись A==B?
5.4.4 Чему равно выражение A && (! B) если обе переменные равны true?
5.4.5 Для чего используются символы ‘{’ . . . . ‘}’ в сложных операторах языка C#?
Продолжение темы 2: Переключатели вычислительных процессов. Алгоритмы циклических процессов.
Лекция 6 ОПЕРАТОР ЦИКЛА FOR
6.1 Формат записи оператора цикла for
Оператор цикла for применяется в программах, когда заранее известно количество циклических операций.
Формат записи оператора for:
for(выражение1;выражение2;выражение3)
{ операторы;}, где
выражение1 – задает начальное значение управляющей переменной цикла; выражение2 – определяет конечное значение управляющей переменной цикла; выражение3 – задает шаг изменения управляющей переменной цикла.
Например: for (i = 0; i <= 10; i++) {операторы цикла}
Графическое представление цикла for изображено на рисунке 6.1
Начальное
значение
управляющей
переменной.
Проверка
конечного нет
значения
управляющей
переменной. да
Операторы
цикла.
Изменение шага
управляющей
переменной.
Рисунок 6.1 – Графическое представление оператора for.
Рассмотрим еще примеры записи цикла for:
1) for (int i = 0; i <= 10; i++) {операторы цикла}
В данном примере записан оператор цикла for, в котором управляющая переменная целого типа объявляется внутри цикла и изменяется от 0 до 10 (включительно) с шагом 1.
2) for ( i = 10; i >= 0; i--) {операторы цикла}
В этом примере объявленная ранее переменная i используется в качестве управляющей переменной, которая изменяется от 10 до 0 (включительно) с шагом минус 1.
3) for ( x = 0; x <= 1; x = x + 0.1) {операторы цикла }
В данном примере в качестве управляющей переменной используется переменная вещественного типа x, которая изменяется от 0 до 1 с шагом 0.1.
В языке C# имеется специальный цикл (foreach), специально предназначенный для работы с данными массивов, коллекций и других форм объединения множества данных. Формат записи и работа этого цикла будет рассмотрена в теме массивы.
6.2 Использование оператора цикла for в программе
Для демонстрации работы оператора цикла for рассмотрим решение учебной задачи 6.1.
Задача 6.1 Напечатать 10 случайных целых чисел в диапазоне от минус 50 до 50. Найти и напечатать наибольшее и наименьшее числа.
Разработку алгоритма решения задачи не обязательно заканчивать изображением его структурной схемы. Алгоритм может быть представлен и в словесной форме – подробное описание всех шагов решения задачи.
Сначала нам необходимо объявить две переменные max и min, в которые мы будем записывать соответственно максимальное и минимальное значения из 10 случайно сформированных чисел.
Поскольку мы знаем диапазон случайных чисел, то переменной max необходимо присвоить число меньше или равное минимальному значению диапазона, например, минус 100, а переменной min число больше или равное максимальному значению диапазона. Естественно, лучше всего переменным max и min присвоить первое сформированное случайное число, но по условию задачи их нужно формировать 10 и, конечно лучше это делать в цикле, а нам необходимо задать некоторые значения до цикла. Если не использовать операции присваивания, то по умолчанию этим переменным будут присвоены нулевые значения, но число 0 является частью заданного диапазона и возможен вариант (все 10 сформированных чисел больше или меньше 0), когда нулевые значения могут исказить результат работы программы.
Итак, необходимо сформировать 10 случайных чисел, поэтому целесообразно использовать цикл for с управляющей переменной целого типа, изменяющейся от 1 до 10 и с шагом равным единице.
Тело цикла должно включать формирование случайного числа a в заданном диапазоне, его печать и поочередное сравнение этого числа со значениями max и min. Если a больше max, то в max необходимо записать значение a. Если a меньше min, то в min необходимо записать a (первое сформированное случайное число всегда будет больше max и меньше min).
По окончании 10 циклических операций, необходимо напечатать значения переменных max и min.
Исходный код программы:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
int i, j, k, a, max, min;
max = -100; min = 100; j = 0; k = 0;
Random rnd = new Random();
for(i=1;i<=10;i++)
{
a=rnd. Next() % 101 - 50;
Console. Write(" {0}",a. ToString());
if (a>max) {max = a; j = i;}
if (a<min) {min = a; k = i;}
}
Console. WriteLine();
Console. WriteLine("max={0} HOMEP={1}",max, j);
Console. WriteLine("min={0} HOMEP={1}",min, k);
Console. WriteLine("Для продолжения нажмите клавишу Enter");
Console. ReadLine();
}
}
}
Работа программы:
-33 -26 -10 -16 -44 40 -50 -35 -45 -38
max=40 HOMEP=6
min=-50 HOMEP=7
Для продолжения нажмите клавишу Enter
В дополнение к разработанному алгоритму мы ввели еще две переменные j и k, в которые запоминали соответственно номера максимального и минимального чисел в последовательности сформированных чисел.
В некоторых языках программирования изменять значение управляющей переменной в теле цикла категорически запрещено. В языке C# это разрешается. Например, фрагмент программы:
for(i=0;i<=10;i++)
{
Console. Write(" {0}",i. ToString());
if (i == 3) i = 6;
}
Console. WriteLine();
напечатает 0 1 2 3 7 8 9 10
В записи оператора цикла for можно объявлять управляющую переменную. Например:
for (int j=1;j<=10;j++) { операторы; }
Объявив переменную j внутри цикла for, мы автоматически определяем «время жизни» этой переменной, равное времени работы этого цикла. Т. е. при запуске цикла for в памяти компьютера выделяется место под значения управляющей переменной j, а по окончании цикла это место памяти будет освобождаться – помечаться как свободное. Этот способ объявления локальной переменной применяется при создании программ, одним из требований, к которым является минимальный объем занимаемой памяти компьютера.
Оператор цикла for позволяет использовать несколько управляющих переменных, например,
for ( i=1, j=10; i<j; i + +, j - -)
Можно превратить цикл for в цикл с условием, например,
for ( i=0; (char) Console. Read() != ‘n’; i++)
Эта запись цикла for связывает окончание работы цикла не с управляющей переменной, а с вводом символа ‘n’.
В языке C# возможны некоторые экзотические формы записи цикла for, например,
for (i=0; i<=10) { . . . ; i++} – шаг изменения управляющей переменной вынесен из описания заголовка цикла в его тело;
for (; ;) – бесконечный цикл и т. д.
В рассматриваемых учебных программах основным требованием является наглядность алгоритма работы программы, что часто противоречит требованию ее минимального объема, поэтому все экзотические формы записи цикла for мы не рассматриваем.
6.3 Операторы перехода
Операторы перехода предназначены для изменения «нормального» последовательного выполнения программы. Помимо известного Вам оператора безусловного перехода goto к ним относятся операторы break, continue и return. Обычно операторы перехода располагаются внутри сложных операторов языка C# и используются в некоторых нестандартных ситуациях работы этих сложных операторов, например, цикла.
Если по некоторому условию необходимо прервать (закончить) выполнение цикла до выполнения его условия в заголовке цикла, то необходимо использовать оператор break. Например, оператор break может использоваться в теле цикла for, когда необходимо контролировать и прерывать «бесконечность» выполнения цикла.
Оператор continue пропускает все операторы, оставшиеся до конца тела цикла, и запускает следующую итерацию цикла.
Оператор return – оператор возврата завершает выполнения сложного оператора или функции и передает управление программе в точку вызова функции или следующему оператору за сложным оператором, вызвавшим оператор return. Оператор return имеет следующий формат:
return [выражение];
где выражение должно иметь тот же тип, что и вызвавшая оператор return функция. Если оператор return вызывает сложный оператор языка C# или функция типа void, то выражение должно отсутствовать.
6.4 Вопросы для проверки
6.4.1 Укажите правильную запись цикла for в языке С#?
for (i = 10; i <>1; i --) for (i = 0.1; i = 1; i ++) for (i = 0.1; i <= 1; i = i + 0.1) for (i < 1; i == 10; i ++) for (i = 1; i = 10; i ++)6.4.2 Какое значение имеет управляющая переменная I после окончания цикла for?
int I;
int k = 5;
for (I = 0; I <= k; I++) k = k - 1;
Console. WriteLine("I = {0} ", I);
управляющая переменная I= 3; управляющая переменная I= 2; управляющая переменная I= 0; управляющая переменная I= 5; управляющая переменная I= 4.6.4.3 Когда целесообразно использовать в программе цикл for?
6.4.4 С помощью какого оператора можно «досрочно» заканчивать работу цикла?
6.4.5 С помощью какого оператора можно «пропустить» часть тела цикла?


