Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управляющие конструкции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
406 Кб
Скачать

3. Дополнительные операторы управления

- Принудительное завершение цикла break;

- Принудительное завершение текущего шага цикла и переход на следующий шаг цикла continue;

- Безусловный переход в заданную точку программы

goto_метка;

метка: оператор;

- Возврат из метода return;

Пример

Сгенерируем сочетание из двух десятичных цифр, первая – от 1 до 4, вторая – от 0 до 9. Первая цифра рассматривается как старшая цифра числа, вторая – как младшая. Вывести на экран числа кратные 5.

10 11 12 … 19 младшая цифра b

20 21 22 … 29

30 31 32 … 39

40 41 42 … 49

старшая цифра a

public static void Main()

{

int a, b, c;// старшая цифра, младшая цифра, число

for (a=1; a<=4; a++)

for (b=0; b<=9; b++)

{

c=a*10+b;

if (c%5 !=0) continue; // если с не кратно 5, начинаем следующую итерацию

Console.Write (c.ToString()+” “);

//break;

//goto_EXIT;

//return;

}

EXIT: Console.WriteLine (“\nВсе!”);

}

Результат вывода в исходном варианте программы

10 15 20…25 30 35 40 45

ВСЕ!

Убираем комментарий около break;

Выполнение оператора break приведет к прекращению перебора младшей цифры при обнаружении первого же числа, кратного 5.

Результат вывода

10 20 30 40

ВСЕ!

Комментируем оператор break и снимаем комментарий с оператора goto_EXIT. При обнаружении первого же числа, кратного 5, произойдет выход на метку EXIT:

Результат вывода

10

ВСЕ!

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

Убираем комментарий c оператора return и восстанавливаем комментарий около оператора goto EXIT. При обнаружении первого же числа, кратного 5, будет выполнен оператор return. Поскольку в данном случае оператор возврата применен к методу Main(), это приведет к завершению программы.

Результат вывода

10

Примечание: в примере использован цикл, который мы изучим позже. Сейчас важно понять, что оператор continue приводит к прекращению выполнения блока операторов цикла и переходу на следующий шаг цикла «досрочно».

4. Множественное ветвление

Конструкция предназначена для выбора одной из нескольких ветвей. В С есть соответствующая управляющая конструкция. Используется, когда ветвей больше двух.

switch (выражение – переключатель)

целочисленное значение, строка, char

{

case_Маркер: операторы; break;

константа

case_Маркер: операторы; break;

<default: операторы; break;> //необязательная часть

}

Схема выполнения:

1.Вычисляется значение переключателя.

2.Значение переключателя последовательно сравнивается с маркером ветвей.

3.Выполняется та ветвь, маркер которой совпал со значением переключателя.

Одна из ветвей может иметь стандартный маркер default. При наличии такого маркера, отмеченная им ветвь будет выполняться в том случае, когда переключатель не совпал ни с одним маркером.

В качестве метки (маркера) каждой ветки могут быть использованы константы любого допустимого в языке С типа. Важно помнить: операторы ветки (после case_Маркер:) выполняются до оператора break, который в соответствии со своим именем (от английского «ломать») прерывает выполнение операторов переключателя. Если break убрать, то будут выполнены ВСЕ операторы веток, которые начинаются с ветки, совпадающей со значением переключателя до конца.

Рассмотрим ряд примеров применения переключателя.

Заметим, что множественное ветвление можно реализовать без переключателя при помощи множественных сокращенных ветвлений. Рассмотрим пример множественного ветвления. Программа решает такую задачу – получая символ, она определяет, является ли он элементом из набора {I, V, X}. Если ответ отрицательный, то выводится соответствующее сообщение, иначе на экран выводится сообщение о правильно введенном символе:

char symbol='s';

switch (symbol)

{ case 'I': Console.WriteLine(" I well ");

case 'V': Console.WriteLine(" V well ");

case 'X': Console.WriteLine(" I well ");

default:

Console.WriteLine(" No well {0:c}", symbol); break;

}

Значение символьной переменной symbol равно s. Это значение переключателя в нашей программе. Сравниваем ветки и их маркеры (метки) с значением переключателя. Нет ни одной ветки, где метка была бы равна s. Следовательно, срабатываем значение переключателя по умолчанию и на экране появится сообщение «No well s» :

При значении переключателя ‘V’ выводится на экран:

V well

I well, т.е. все операторы до конца переключателя, т.к. отсутствует прерывание после одной ветки. Если вы обратили внимание, то здесь в ветках отсутствуют операторы break.

Естественно, чаще в практике требуется выбор одной из множества альтернатив. В переключателе используется оператор break; прерывания выполнения составного оператора или тела цикла (от английского break «сломать»).

char symbol='s';

switch (symbol)

{ case 'I': Console.WriteLine(" I well "); break;

case 'V': Console.WriteLine(" V well "); break;

case 'X': Console.WriteLine(" I well "); break;

default:

Console.WriteLine(" No well {0:c}", symbol); break;

}

В данном примере при значении переключателя V (при char symbol=V ';) будет выведено

V well

Значением переключателя может быть целое число, например:

int chislo=2;

switch (chislo)

{ case 1: Console.WriteLine(" I well "); break;

case 2: Console.WriteLine(" V well "); break;

case 3: Console.WriteLine(" I well "); break;

}

Будет выведено

V well

Обратите внимание, целочисленные константы в метках ветвей не имеют кавычек и апострофов. Напоминаем написание констант разных типов! Целое 12, вещественное 12.2, символьное ‘r’ и строковое константное значение “Это строка».

  1. Вложенное ветвление (сложное)

Реализация сложного вложенного ветвления осуществляется при помощи синтаксических конструкций.

if (условие1) оператор1;

if (условие2) оператор2;

else оператор3;

else оператор4;

В данное схеме есть классическое ветвление, у которого по внешней ветви при истинности условия есть еще внутреннее ветвление, т.е. дополнительные условия при истинности условия1.

Приведенная схема не является единственной. Более того, возможно множество комбинаций полных и сокращенных ветвлений внутри одного сложного разветвления. Например:

if (условие1) оператор1;

if (условие2) оператор2;

else оператор4;

Здесь при истинном условии1 есть дополнительный фильтр в виде сокращенного ветвления по условию2.

В следующей программе реализовано вычисление: является ли вычисленное Sin(x)>=0 одновременно равным Sin(x)<2.5. Значение х задано инициализатором.

. . . . . .

double x=1.0; bool f; // х задано при описании

f = (Math.Sin(x) >= 0) && (Math.Sin(x) < 2.5); // логическое условие с && - логическим //умножением

Console.WriteLine(" Итак:");

if ( f)

Console.WriteLine(" True x {0,5:f2} {1,7:f3} {2}", x, Math.Sin(x), f);

else

Console.WriteLine(" False x {0,5:f2} {1,7:f3} {2}", x, Math.Sin(x), f);

В результате выполнения логического умножения истинно значение выражения в случае, если обе части выражения имеют значение «истина». Программа включает классические варианты ветвления, имеющие ветви «да» и «нет». При вычислении синуса используются методы библиотеки Math. Обращение к методу класса в программе производится через имя класса: Math.Sin(x)

Следующая программа демонстрирует вычисление значения функции G=F(X,Y)

| true, если точка с координатами (X,Y) попадает в фигуру

G = <

| false, если точка с координатами (X,Y) не попадает в фигуру

Фигура - сектор круга радиусом R в диапазоне углов 270<= fi <=45

using System; //пространство имен

class Operator

{

public static void Main()

{const double R = 2.8; //Радиус

double x, y; //Координаты точки

bool g; //Значение функции

char rep; //Признак повторного выполнения

string str; //Строка для приема данных и вывода данных

Console.Clear(); // очистили экран

Console.Write("Введите X: "); // вывод строки на экран

str = Console.ReadLine(); //чтение строки с экрана

x = double.Parse(str); // конвертация значения из строки в вещественное число

Console.Write("Введите Y: ");

str = Console.ReadLine();

y = double.Parse(str);

if (x * x + y * y <= R * R) //в круге

if (x >= 0) //и справа от оси Y

if (y <= x) //и ниже прямой y = x

g = true; // в фигуре

else //и выше прямой y = x

g = false; // не в фигуре

else //и слева от оси Y

g = false; // вне фигуры

else //вне круга

g = false; //вне фигуры

str = string.Format("G({0:f3},{1:f3}) = {2}", x, y, g);

Console.WriteLine(str);

} //Конец определения метода

} //Конец объявления класса

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

Теперь рассмотрим программу, определяющую попадания точки в кольцо, образуемое двумя окружностями с радиусами r и R. Условия для попадания в кольцо для точки с координатами x и y можно записать так: (x2+y2>r2) И (x2+y2<R2)

Из условия видно, то учитываются только внутренние точки кольца, поскольку записаны строгие условия больше и меньше. Программа, решающая такую задачу будет выглядеть так.

double x, y;

double r = 1.0, R = 3.0;

Console.WriteLine(" Попадание точки в кольцо: ");

Console.WriteLine(" Введите координаты (x,y): ");

x = double.Parse(Console.ReadLine());

y = double.Parse(Console.ReadLine());

if ( ((x*x+y*y)>r*r) && ((x*x+y*y)<R*R) )

Console.WriteLine("YES {0} {1}",x,y);

else

Console.WriteLine(" NO {0} {1}",x,y);