Логические операторы в Си-шарп

 

Логические операторы в Си-шарп служат для работы с логическим типом данных (bool), который может принимать только два значения – true или false. Их можно разделить на две категории: простые логические операторы и операторы сравнения.

В Си-шарп есть следующие логические операторы:

! – оператор «НЕ» является унарным и возвращает противоположное значение операнда.
static void Main(string[] args)
{
bool a, b = true, c = false;
a = !b; // a = false
a = !c; // a = true
}

|| - оператор «ИЛИ» является бинарным и возвращает false только тогда, когда оба операнда равны false, в остальных случаях результат будет true;
static void Main(string[] args)
{
bool a, bTrue = true, bFalse = false;
a = bFalse || bFalse; // a = false
a = bFalse || bTrue; // a = true
a = bTrue || bFalse; // a = true
a = bTrue || bTrue; // a = true
}

&& - оператор «И» является бинарным и возвращает true только тогда, когда оба операнда равны true, в остальных случаях результат будет false;
static void Main(string[] args)
{
bool a, bTrue = true, bFalse = false;
a = bFalse && bFalse; // a = false
a = bFalse && bTrue; // a = false
a = bTrue && bFalse; // a = false
a = bTrue && bTrue; // a = true
}

К операторам сравнения относятся:

 

Оператор Название
> больше
< меньше
>= больше или равно
<= меньше или равно
== равно
!= неравно

 

static void Main(string[] args)
{
bool a;
int b = 2, c = 3, d = 2;
a = b > c; // a = false
a = b < c; // a = true
a = b >= c; // a = false
a = b >= d; // a = true
a = b == c; // a = false
a = b == d; // a = true
a = b != c; // a = true
}

Логические операторы в первую очередь используются в условных операторах, о которых мы поговорим в следующем уроке.

Условные операторы служат для ветвления программы. В зависимости от некоторого условия выполняется тот или другой набор команд.

В Си-шарп есть три условных оператора: «if-else», «switch» и «?:» - тернарный оператор.

Оператор «if-else»

 

Данный оператор имеет следующую структуру:
if ([условное выражение])
{
Блок кода, который нужно выполнить при удовлетворении условия, [условное выражение] = true (истина)
}
else
{
Блок кода, который нужно выполнить при неудовлетворении условия, [условное выражение] = false (ложь)
}

 

Часть else не является обязательной и может отсутствовать.

Пример использования оператора «if-else» в программе, которая проверяет вводимое число на чётность:

 

static void Main(string[] args)
{
int a;
Console.WriteLine("Введите число:");
a = Convert.ToInt32(Console.ReadLine()); // вводим данные с клавиатуры*
if (a % 2 == 0) //проверяем число на чётность путем нахождения остатка от деления числа на 2
{
Console.WriteLine("Число " + a + " - чётное");
}
else
{
Console.WriteLine("Число " + a + " - нечётное");
}
Console.ReadKey();
}


* Функция Console.ReadLine() позволяет ввести данные с клавиатуры. Данные вводятся как строка, а так как нужно число, мы преобразовываем ее в числовой тип. Для преобразования мы используем функцию Convert.ToInt32().

Если после if или else необходимо выполнить лишь одну команду, фигурные скобки можно опускать:
if ([условное выражение])
[команда1] // команда1 выполнится лишь если условное выражение истинно
[команда2]// команда2 выполнится в любом случае

Оператор if может иметь несколько условий:
if ([логическое выражение1])
{блок1}
else if ([логическое выражение2])
{блок2}
else
{блок3}

 

Пример программы, которая определяет, какое из двух введенных чисел больше:
static void Main(string[] args)
{
int a, b;
Console.WriteLine("Введите первое число:");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите второе число:");
b = Convert.ToInt32(Console.ReadLine());
if (a > b)
Console.WriteLine("Первое число больше второго");
else if (a < b)
Console.WriteLine("Второе число больше первого");
else
Console.WriteLine("Числа равны");

Console.ReadKey();
}

 

Логическое выражение может быть сложнее. Здесь и используются логические операторы «!», «||» и «&&».

Пример программы которая дает совет, что делать, в зависимости от температуры на дворе:

 

static void Main(string[] args)
{
int t;
Console.WriteLine("Введите температуру во дворе");
t = Convert.ToInt32(Console.ReadLine());
if (t < -20 || t > 40) //если температура меньше -20 или больше 40
Console.WriteLine("Вам лучше посидеть дома!");
else
Console.WriteLine("Можете идти гулять");
Console.ReadKey();
}

Оператор switch

 

В некоторых случаях удобно использовать условный оператор «switch» вместо «if-else». Он имеет следующую структуру:

switch (выражение)
{
case значение1:
блок1;
break;
case значение2:
блок2;
break;
...
case значениеN:
блокN;
break;
default:
блокN+1;
break;
}

 

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

Пример программы с использованием switch, которая выводит на экран название дня недели соответственно вводимому порядковому номер дня:

 

static void Main(string[] args)
{
int a;
Console.WriteLine("Введите порядковый номер дня недели:");
a = Convert.ToInt32(Console.ReadLine());
switch (a)
{
case 1:
Console.WriteLine("Понедельник");
break;
case 2:
Console.WriteLine("Вторник");
break;
case 3:
Console.WriteLine("Среда");
break;
case 4:
Console.WriteLine("Четверг");
break;
case 5:
Console.WriteLine("Пятница");
break;
case 6:
Console.WriteLine("Суббота");
break;
case 7:
Console.WriteLine("Воскресенье");
break;
default :
Console.WriteLine("Ошибка");
break;
}
Console.ReadKey();
}

Тернарный оператор «?:»

 

Этот оператор используется для сокращения объема кода. Им можно заменять простые по сложности операторы if-else. Тернарный оператор имеет такую структуру:

логическое выражение ? выражение1 : выражение2

 

Сначала вычисляется логическое выражение. Если оно истинно, то вычисляется выражение1, в противном случае - вычисляется выражение2.

Пример использования тернарного оператора «?:» в той же программе для проверки числа на чётность:

 

static void Main(string[] args)
{
int a;
Console.WriteLine("Введите число:");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine( a % 2 == 0 ? "Число чётное" : "Число нечётное" );
Console.ReadKey();
}

 

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

 

static void Main(string[] args)
{
int a, b, max;
Console.WriteLine("Введите первое число:");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите второе число:");
b = Convert.ToInt32(Console.ReadLine());
max = a > b ? a : b;
}

Массив – это набор однотипных данных, которые располагаются в памяти последовательно друг за другом. Доступ к элементам массива осуществляется по индексу (номеру) элемента. Массив может содержать элементы любого типа данных, можно даже создавать массив массивов (ступенчатый массив). Количество элементов в массиве называется размером массива. Массивы относятся к ссылочным типам данных.

Массивы в Си-шарп могут быть одномерными и многомерными.

Одномерные массивы

 

Одномерный массив по-другому еще называется вектором, и для доступа к его элементам используется только один индекс. Выглядит вектор примерно так:

 

В Си-шарп объявление массива имеет такую структуру:

тип[] имя_массива = new тип[размер массива];

 

Пример:
int[] array = new int[5]; // создаем массив целых чисел
string[] seasons = new string[4] {"зима","весна","лето","осень"}; //объявление массива строк и его инициализация значениями

Если происходит инициализация, оператор new можно упускать:

 

string[] seasons = {"зима","весна","лето","осень"}; //корректно

Доступ к элементам осуществляется по индексу. Следует помнить, что индексация начинается с нуля – первый элемент массива имеет индекс 0, а последний n-1, где n – размер массива.

 

static void Main(string[] args)
{
int[] numbers = new int[5];
numbers[0] = 5;
numbers[1] = 2;
numbers[4] = 3;
numbers[5] = 2; // ошибка, индекс вне рамок массива
}

В качестве массива можно представить, например, список студентов в группе (имена), показатели температуры воздуха за последние несколько дней и так далее.

Многомерные массивы

 

Одним из случаев многомерного массива служит двумерный массив (матрица). В матрице для доступа к элементам необходимо использовать два индекса.

 

Количеством индексов, используемых для доступа к элементам массива называется размерность массива.

 

int[,] numbers1 = new int[2, 2]; // объявление двумерного массива
int[,,] numbers2 = new int[2, 2 ,3]; // объявление трехмерного массива
int[,] numbers3 = new int[3, 2] { {6, 0},
{5, 7},
{8, 9} }; // инициализация двумерного массива

Элементу массива numbers1 с координатами 1,1 присвоим значение 8:
numbers1[1, 1] = 8;

Многомерные массивы используются гораздо реже одномерных.