Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР2. Раздатка.docx
Скачиваний:
6
Добавлен:
17.08.2019
Размер:
331.51 Кб
Скачать

Использование составных инструкций сравнения

Оператор if в инструкции сравнения может применять несколько инструкций, объединенных арифметическими операторами. В качестве последних используются операторы (&& — И), (|| —ИЛИ) и (! — НЕ). Рассмотрим пример использования составных инструкций в блоке if.

using System; class Conditions {     static void Main(string[] args)     {         int n1 = 5;         int n2 = 0;         if ((n1 == 5) && (n2 == 5))             Console.WriteLine("Инструкция 'И' верна");         else             Console.WriteLine("Инструкция 'И' не верна");         if ((n1 == 5) || (n2 == 5))             Console.WriteLine("Инструкция 'ИЛИ' верна");         else             Console.WriteLine("Инструкция 'ИЛИ' не верна");         Console.Read();     } }

В данном примере каждая инструкция if проверяет сразу два условия. Первое if условие использует оператор (&&) для проверки условия. Необходимо, чтобы сразу два условия в блоке if были истинны. Только тогда выражение будет считаться верным: if ((n1==5) &&(n2==5)) При этом не всегда выполняются все выражения в блоке if. Если первое выражение однозначно определяет результат операции, то второе уже не проверяется. Так, если бы условие n1 == 5 было ложным, то условие n2==5 уже не проверялось бы, поскольку его результат перестал бы играть роль. Второе выражение использует оператор (||) для проверки сложного условия: if ((n1==5)||(n2==5)) В данном случае для верности всего выражения достаточно истинности лишь одного из условий. И тогда действует правило проверки условий до выяснения однозначности результата. То есть, если условие n1 == 5 верно, то n2 == 5 уже проверяться не будет. Это свойство может сыграть очень важную роль при разработке кода программ. Рассмотрим пример.

using System; class Conditions {     static void Main(string[] args)     {         const int MAX_VALUE = 3;         int n1 = 1;         int n2 = 1;         if((++n1 < MAX_VALUE) && (++n2 < MAX_VALUE))             Console.WriteLine("Операция && nl:={0} n2:={1}", n1, n2);         if((++n1 < MAX_VALUE + 1) || (++n2 < MAX_VALUE + 1))             Console.WriteLine("Операция || nl:={0} n2:={1};", n1, n2);     } }

Результат работы программы будет следующий: Операция && n1:=2 n2:=2 Операция || n1:=3 n2:=2 Заметьте, что первый оператор if нарастил значения обеих переменных, потому как осуществлялась проверка обоих условий. Второй оператор if выполнил инкремент только переменной nl. Причина в том, что условие (++n1 Оператор switch как альтернатива оператору условия Достаточно часто встречаются ситуации, когда вложенные условные операторы выполняют множество проверок на совпадение значения переменной, но среди этих условных операторов только один является истинным. if (myValue == 10) Console.WriteLine("myValue равно 10"); else if (myValue == 20) Console.WriteLine("myValue равно 20 " ); else if (myValue == 30} Console.WriteLine("myValue равно 30 " ); else .... Когда вы имеете такой сложный набор условий, лучше всего воспользоваться оператором switch, который является более удобной альтернативой оператору if. Логика оператора switch следующая: «найти значение, соответствующее переменной для сравнения, и выполнить соответствующее действие». Иными словами, он работает как оператор выбора нужного действия.

switch (выражение) { case константное выражение: инструкция выражение перехода [default:: инструкция]

Вы видите, что, подобно оператору условия if...else, выражение условия помещено в круглые скобки в начале оператора switch. Внутри оператора switch есть секция выбора —case и секция действия по умолчанию —default. Секция выбора нужна для определения действия, которое будет выполняться при совпадении соответствующего константного выражения выражению в switch. В этой секции обязательно нужно указать одно или несколько действий. Секция default может в операторе switch не указываться. Она выполняется в том случае, если не совпала ни одна константная инструкция из секции выбора. Оператор case требует обязательного указания значения для сравнения (constant-expression) — константного выражение (литеральная или символическая константа, или перечисление), а также блока инструкций (statement) и оператора прерывания действия (jump-statement). Если результат условия совпадет с константным значением оператора case, то будет выполняться соответствующий ему блок инструкций. Как правило, в качестве оператор перехода используют оператор break, который прерывает выполнение оператора switch. Альтернативой ему может быть и другой оператор — goto, который обычно применяют для перехода в другое место программы. Чтобы вы могли увидеть, как оператор switch заменяет сложный набор условий, приведем пример той же программы, но с использованием оператора switch:

switch ( myValue ) {     case 100:         Console.WriteLine("Переменная myValue равна 100");     break;     case 200:         Console.WriteLine("Переменная myValue равна 200");     break;         case 300: Console.WriteLine("Переменная myValue равна 300");     break; }

В этом примере мы проверяем значение переменной myValue на равенство ее одному из следующих значений: 100, 200, 300. Если, например, myValue будет равно 100, то на экран выведется строка: myValue равно 100 В языке С и C++ вы можете автоматически перейти к секции следующего case, если в конце предыдущего не стоит инструкция перехода break или goto. Таким образом, на C++ вы можете написать: case 1: statment1; case 2: statment2; break; В этом примере на C++ после выполнения statement1 будет автоматически выполняться секция statment2. В С# это работать не будет. Автоматический переход от case 1 к следующей секции case 2 будет выполняться только в том случае, если секция case 1 окажется пустой (не будет содержать ни одной инструкции). В противном же случае перехода к выполнению case 2 не произойдет, так как в С# каждая непустая секция инструкций оператора case должна содержать в себе оператор break. case 1: Console.WriteLine("Выражение секции 1»); case 2: Здесь case 1 содержит инструкцию, поэтому вы не сможете автоматически перейти к выполнению case 2. Такой код вообще не будет компилироваться. Если вы хотите перейти после выполнения case 1 к выполнению case 2, то должны явно указать это при помощи оператора goto: case 1: Console.WriteLine("Выражение секции 1"); goto case 2 case 2: Однако другая форма использования оператора switch позволит обойтись без инструкции goto: case 1: case 2: Console.WriteLine("Выражение секций 1 и 2»); Такой принцип работы оператора switch используется в случае, когда необходимо выполнить одно и то же действие (или часть действия) для разных значений условного оператора. using System; namespace SwitchStatement {     class MyClass     {         static void Main(string[] args)         {             int user = 1;             user = Convert.ToInt32(Console.ReadLine());             switch (user)             {                 case 1:                     Console.WriteLine("Здравствуйте Userl");                 break;                 case 2:                     Console.WriteLine("Здравствуйте User2");                 break;                 case 3:                     Console.WriteLine("Здравствуйте User3");                 break;                 default:                     Console.WriteLine("Здравствуйте новый пользователь");                 break;             }         }     } }

Этот пример выводит на экран сообщение с приветствием пользователя в зависимости от введенного на экране значения. Так, если вы введете число 1, то на экране появится сообщение «Здравствуйте User2». В данном примере для выбора выражения, выводящего сообщение на экран, использовалось числовое значение {0, 1 или 2}. Если же вы введете иное значение, нежели представленное в массиве, то на экране появится сообщение «Здравствуйте новый пользователь». Объявление переменных внутри case инструкций Рассмотрим случай, когда вам необходимо создать в программе сложную case инструкцию. Для придания программе большей читабельности создание переменных, необходимых для использования, лучше всего объявлять непосредственно перед их применением. Так, если каждый блок case использует свой набор переменных, то и объявление переменных следует делать внутри блоков case. Посмотрите на следующий код:

using System; class Part {     public static void Main()     {         Console.WriteLine("Выбрать:");         Console.WriteLine("1: для ввода наименования товара\n2: для ввода количества товара");         int Choice = Convert.ToInt32(Console.ReadLine());         switch (Choice)         {             case 1:                 string Name;                 Console.Write("Введите наименование товара ");                 Name = Console.ReadLine();                 break;             case 2:                 int Count;                 Console.Write("Введите количество товара ");                 Name = Console.ReadLine();                 Count = Convert.ToInt32(Console.ReadLine());                 break;             default:             break;         }     } }

Знатоки C++ могут без труда увидеть, что на C++ такая switch инструкция компилироваться не будет. Причина этому — объявление переменных внутри блоков case. Однако разработчики С# постарались и предусмотрели возможность создания переменных внутри case блоков. Поэтому на С# такой код является рабочим. Switch и работа со строками В приведенном ранее примере переменная user была целочисленного типа. Если вам необходимо использовать в качестве условия оператора switch переменную строкового типа, то вы можете сделать это следующим образом: саsе "Светлана": Если строк для сравнения много, то по аналогии с целочисленной переменной user используйте несколько инструкций case. Вот пример использования строковой переменной в качестве условия оператора switch. using System; class MyClass {     static void Main(string[] args)     {         string user;         Console.WriteLine("Возможные варианты:");         Console.WriteLine("User1");         Console.WriteLine("User2");         Console.WriteLine("User3");         user = Console.ReadLine();         switch (user)         {             case "User1":                 Console.WriteLine("Здравствуйте пользователь один");                 break;             case "User2":                 Console.WriteLine("Здравствуйте пользователь два");                 break;             case "User3":                 Console.WriteLine("Здравствуйте пользователь три");                 break;             default:                 Console.WriteLine("Здравствуйте новый пользователь");                 break;         }     } }

В данном случае для идентификации пользователя вам необходимо применить не числовое значение, а строку. Если вы введете строку «User1», то на экране появится сообщение «Здравствуйте пользователь один».

Задание: Написать программу для решения уравнения (см. таблицу 1). Переменные вводятся с пользователем с клавиатуры. Предусмотреть проверки ввода неверных значений переменных. Выдавать пользователю сообщения о том, какая(е) переменные введены неверно, объяснить, почему.

Таблица 1

Уравнения для лабораторной работы №2

ФИО

Уравнение

1

Азмуханов Р.А.

2

Бенке А.Н.

3

Власов А.А.

4

Головин А.А.

5

Драгун Т.В.

6

Еремин Д.Д.

7

Коваль Н.В.

8

Козлов К.С.

9

Кривоногов. Е.Ю.

10

Локшин Д.А.

11

Осипова А.В.

12

Петухов А.В.

13

Сабиров С.М.

14

Сосновский М.И.

15

Стыглиц А.В.

16

Уральцев И.С.

17

Федоров Б.И.

18

Шабаев К.А.

19

Шишова В.П.

20

Шкредов С.А.