На этом шаге мы рассмотрим использование пустых блоков.
Как отмечалось на предыдущем шаге, case-блоки в конструкции выбора могут быть пустыми. Так поступают в случае, если необходимо, чтобы для нескольких контрольных значений выполнялись одни и те же команды. Если так, то вместо дублирования команд в соответствующих case-блоках (что неудобно и не очень рационально) используют несколько идущих один за другим пустых блоков. Причем в таких пустых case-блоках нет даже break-инструкций. Пример подобного подхода проиллюстрирован в следующей программе, представленной ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.VisualBasic; namespace pr37_1 { class Program { static void Main() { // Переменная для запоминания введенного числа: int number; // Переменная для текста сообщения: string txt=""; // Начальное значение переменной // Считывание числа: number = Int32.Parse( Interaction.InputBox( // Текст над полем ввода: "Введите целое число от 1 до 9:", // Заголовок окна: "Число") ); // Проверка значения переменной number: switch (number) { // Оператор выбора case 1: // Если значение 1 case 9: // Если значение 9 // Текст сообщения: txt = "Bы ввели нечетное,\n но не простое число."; break; // Завершение блока case 2: // Если значение 2 case 3: // Если значение 3 case 5: // Если значение 5 case 7: // Если значение 7 // Текст сообщения: txt = "Bы ввели простое число."; break; // Завершение блока case 4: case 8: // Текст сообщения: txt = "Bы ввели число - степень двойки."; break; // Завершение блока case 6: // Текст сообщения: txt = "Bы ввели 6 - совершенное число."; break; // Завершение блока } // Отображение диалогового окна с сообщением: MessageBox.Show(txt, "Число"); } } }
Данная программа в некотором смысле напоминает предыдущую. Сначала пользователю предлагается ввести целое число (в диапазоне от 1 до 9). Результат записывается в переменную number. После этого с помощью конструкции выбора проверяется значение этой переменной. Мы "классифицируем" числа но следующим категориям:
Введенное пользователем число с помощью конструкции выбора "приписывается" к одной из перечисленных групп. И в этом переключателе мы используем пустые case-блоки. Например, есть в переключателе такая конструкция (комментарии для удобства удалены):
case 2: case 3: case 5: case 7: txt="Bы ввели простое число."; break;
Как это работает? Допустим, пользователь ввел значение 2. При сравнении этого значения с контрольными значениями в case-блоке совпадение имеет место для блока case 2. Поэтому будут выполнены все команды от места, где идентифицировано совпадение, до первой инструкции break. В результате выполняется команда txt="Bы ввели простое число.". Теперь предположим, что пользователь ввел значение 5. Совпадение проверяемого (переменная number) и контрольного значения имеет место в блоке case 5. Он пустой. Но это все равно case-блок. Поэтому выполняются команды от места совпадения до первой инструкции break. Итог такой - выполняется команда txt="Bы ввели простое число.". То же получаем, когда пользователь вводит значение 3 и 7. Прочие блоки в операторе выбора работают по такому же принципу.
Внешне все выглядит следующим образом. При запуске программы на выполнение появляется окно с полем ввода, в которое следует ввести число от 1 до 9. Окно показано на рисунке 1.
Рис.1. Окно с полем для ввода числа в диапазоне от 1 до 9
Если пользователь вводит числа 1 или 9, то следующим появляется окно, представленное на рисунке 2.
Рис.2. Окно появляется, если пользователь вводит число 1 или 9
В случае, если пользователь вводит число 2, 3, 5 или 7, появится окно, представленное на рисунке 3.
Рис.3. Окно появляется, если пользователь вводит число 2, 3, 5 или 7
Если пользователь вводит число 6, появляется окно, показанное на рисунке 4.
Рис.4. Окно появляется, если пользователь вводит число 6
Наконец, если пользователь вводит число 4 или 8, то появляется окно, показанное на рисунке 5.
Рис.5. Окно появляется, если пользователь вводит числа 4 или 8
Хочется обратить внимание на несколько обстоятельств. Во-первых, в переключателе мы не использовали default-блок. Как упоминалось ранее, этот блок не является обязательным, чем мы, собственно, и воспользовались. Но поскольку теперь в конструкции switch default-блока нет, то теоретически может получиться, что в переключателе переменной txt значение не будет присвоено - например, если пользователь введет число, которое не попадает в диапазон значений от 1 до 9. И это проблема, поскольку переменная txt используется в команде MessageBox.Show (txt, "Число") после оператора выбора. Такие ситуации компилятором отслеживаются, и выдается ошибка еще на этапе компиляции. Чтобы ее избежать, при объявлении переменной txt мы ей сразу присвоили пустое текстовое значение. В таком случае, даже если пользователь введет значение вне рекомендуемого диапазона и в конструкции выбора значение переменной txt присвоено не будет, переменная останется со своим старым значением. Возможно, это не самый лучший способ решения проблемы, но, во всяком случае, при компиляции не будет ошибки.
Также стоит заметить, что, если пользователь в поле ввода введет не число, отменит ввод (щелкнув кнопку Отмена) или закроет окно щелчком по системной пиктограмме, возникнет ошибка. Чтобы ее избежать, можно воспользоваться системой перехвата и обработки исключений. Как это делается, кратко будет показано в одном из следующих шагов.
На следующем шаге мы рассмотрим цикл while.