Область видимости переменных

Оператор Switch

Операторы if-else с несколькими ветвями

Методика, в которой значение пере­менной определяет, какой оператор (или составное выражение) из возможных следует исполнять, настолько распространена в программировании, что была выработана стан­дартизованная система создания структур if-else, реализующих эту функциональность. Результирующие структуры называются операторами if-elseс несколькими ветвями.

Оператор_if_else_с_несколькими_ветвями::=

if (<Логическое_выражение_1>)

<Оператор_1> | <Составной_оператор_1>

else if (<Логическое_выражение_2>)

<Оператор_2>; | <Составной_оператор_2>

else if (<Логическое_выражение_3>)

<Оператор_3>; | <Составной_оператор_3>

else

<Оператор_по_умолчанию>; | <Составной_оператор_по_умопчанию>

Рассмотрим пример. Разработать программу, которая идентифицирует введенное число, определяя, относится ли оно к диапазону целых чисел от 1 до 5. Если оно относится к этому диапазону, то это число выводится на консоль совместно с сообщением «Число принадлежит диапазону от 1 до 5», в противном случае выводится сообщение «Число не входит в указанный диапазон».

Оператор switchпозволяет программе выбрать одно из нескольких действий на ос­нове значения заданного выражения. Логика, реализуемая switch,подобна логике опе­ратора if-else.Их сходства и отличия иллюстрируются примером.

Рассмотрим программу, которая осуществляет различные арифметические действия в зависимости от названия действия. Например, если в командной строке написать «суммирование»,то программа вычислит сумму введенных чисел. Для реализации этой программы использовать оператор if else.

using System;

class calculator

{

public static void Main()

{

string operation;

int a, b, c;

Console.WriteLine("Введите числа");

a=Convert.ToInt32(Console.ReadLine());

b=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Введите действие: сложение, вычитание, умножение, деление.");

operation=Console.ReadLine();

if (operation=="сложение")

Console.WriteLine("Сумма введенных чисел {0}",a+b);

else if (operation=="вычитание")

Console.WriteLine("Разность введенных чисел {0}",a-b);

else if (operation=="умножение")

Console.WriteLine("Произведение введенных чисел {0}",a*b);

else if (operation=="деление")

Console.WriteLine("Разность введенных чисел {0}",a/b);

else

Console.WriteLine("Введенная операция отсутствует");

Console.ReadLine();

}

}

Оператор switchпозволяет кратко выразить логику оператора if-else,приведенного в примере, с помощью более жесткой структуры.

Рассмотрим синтаксический блок оператора switch.

Switch (<Выражение для switch>)

case <Константное выражение>:

< Оператор1 >;

< Оператор2>;

...

< Оператор break>

case <Константное выражение>:

< Оператор1 >;

< Оператор2>;

...

< Оператор break>

...

default:

< Оператор1 >;

< Оператор2>;

...

< Оператор break>

<Выражение для switch> - это управляющее выражение.

сase, default – называются разделами выбора.

<Константное выражение> - следует за ключевым словом case и называется case-значением или case-меткой. Причем, каждая из них должна быть уникальной.

< Оператор break> - используется для завершения раздела выбора.

Примечание:

1. Количество блоков case не ограничено.

2. Блок default может быть один или не одного.

Напишем программу для предыдущего примера с использованием оператора switch.

using System;

class calculator

{

public static void Main()

{

string operation;

int a, b, c;

Console.WriteLine("Введите числа");

a=Convert.ToInt32(Console.ReadLine());

b=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Введите действие: сложение, вычитание, умножение, деление.");

operation=Console.ReadLine();

switch (operation)

{

case "сложение":

Console.WriteLine("Сумма введенных чисел {0}",a+b);

break;

case "вычитание":

Console.WriteLine("Разность введенных чисел {0}",a-b);

break;

case "умножение":

Console.WriteLine("Произведение введенных чисел {0}",a*b);

break;

case "деление":

Console.WriteLine("Разность введенных чисел {0}",a/b);

break;

default:

Console.WriteLine("Введенная операция отсутствует");

break;

}

Console.ReadLine();

}

}

Когда поток управления переходит от одного раздела switch к другому, такое выполне­ние называется провалом. Для его предотвращения применяется оператор break.

Рекомендации по использованию оператора switch

Ниже приведены основные рекомендации по использованию оператора switch.

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

Упорядочение разделов по вхождению, номеру или символу (в алфавитном порядке). Простые операторы switch, представленные в примерах этого раздела, содержат не­большое число разделов, и их логику легко понять с первого взгляда. Однако многие конструкции switch могут быть достаточно протяженными, что значительно затрудняет их чтение, Схема, в которой метки case упорядочены, повышает читаемость кода.

Существует несколько возможных схем:

1. Схемапо вхождению если те разделы switch,которые запускаются наиболее часто, рас­положены в начале, это упрощает восстановление логики кода. Кроме того, это ускоряет его, так как редко используемые блоки не будут обрабатываться при каж­дом проходе.

2. Схемав алфавитном или числовом порядке— для упрощения навигации по меткам жела­тельно расположить их в алфавитном или числовом порядке.

Использование раздела default с той же целью, что и выражение по умолчанию в операторе if-else с несколькими ветвями. Обратимся к двум основным правилам, обсуждавшимся при рассмотрении операто­ра if-else с несколькими ветвями, о выражении по умолчанию, следующем за последним условием else. Они применимы и к разделу default оператора switch:

1. Раздел default следует использовать только для тех действий, которые должны вы­полняться по умолчанию.

2. Если он не используется, в нем следует обрабатывать ошибки.

В большинстве программ, рассмотренных ранее, для обозначения контекста класса или метода, в частности, метода Main(), использовались блочные кон­струкции с фигурными скобками.

С введением операторов if-else (которые могут содержать составные операторы) по­явилась возможность создавать программы, включающие вложенные блоки кода. Здесь важно представить новую концепцию, называемую областью видимости. Она определя­ет, какие сегменты (а значит, и переменные) исходного кода видны (и, таким образом, доступны) из других его частей. Область видимости — это технический термин, исполь­зуемый для неформального словесного контекста.

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

Две основных области видимости в С # блок класса и блок метода, как показано на рисунке.

Хотя различие между ними, скорее, искусственное, область определения класса имеет несколько характеристик, отсутствующих в области определения метода. Например, операторы if-else можно разместить только в области определения метода. Для создания блока внутри блока совсем не обязательно использовать выражения на­подобие if-else. Новый блок (а значит, и новую область видимости) можно создать, просто вставив пару фигурных скобок. Когда блок В находится внутри другого блока А, область видимости первого называется внутренней, а второго — внешней. Эти термины несут, очевидно, относительный смысл, поскольку область блока А является внутренней по отношению к области блока Main(). Блоки, созданные добавлением фигурных скобок, не имеют явных имен, и ссылаться на них нельзя.

Переменная, объявленная внутри метода, называется локальной.

Такие переменные недоступны за пределами блоков, в которых они объявлены. Общее правило гласит, что переменные, объявленные внутри блока, доступны толь­ко в нем (это относится и к переменным других внутренних блоков, вложенных в него) и только после объявления переменной. Переменную можно объявить в любом месте блока.

Действие этих правил иллюстрирует следующий рисунок. Здесь показаны два блока кода: один принадлежит методу Main(), а другой (размешенный внутри Main() — оператору if). По­скольку переменная distance объявлена в начале внешней области видимости, она дос­тупна во всем блоке Main(), включая и код внутреннего блока оператора if.Перемен­ная mass объявлена ближе к окончанию метода Main(). поэтому она доступна в относительно небольшом сегменте кода, между ее объявлением и окончанием области видимости Main(). Переменная energy объявлена внутри блока if и доступна лишь внутри него.

Объявление переменной во внутренней области с именем, идентичным имени пере­менной во внешней, является ошибкой. Причина заключается в том, что это придавало бы иное значение имени переменной из внешней области.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: