Перейти к основному содержимому

Оценка булевых выражений для принятия решений в C#.

Введение

Логика принятия решений основана на выражениях, известных как булевы выражения, которые оцениваются как «истина» или «ложь». Разработчики используют различные типы операторов для создания булевых выражений, которые отвечают их требованиям к кодированию. Когда выражения оцениваются, выполнение кода ветвится в зависимости от результата. Язык C# поддерживает широкий спектр операторов (таких как равенство, сравнение и булевы операторы), каждый из которых служит определенной цели при реализации логики принятия решений.

Предположим, вас выбрали для работы над серией консольных приложений на C#, которые используются для обработки данных о клиентах и вводимых пользователем данных. Каждое приложение требует от вас реализации логики принятия решений, которая обеспечивает выполнение требований к обработке данных и соответствующих бизнес-правил. Требования к обработке данных и бизнес-правила различаются для каждого приложения. Например, приложениям, обрабатывающим заказы клиентов, может потребоваться оценить статус клиента, прежде чем предпринимать какие-либо действия. Чтобы подготовиться к этому заданию, вы выполните несколько практических заданий, в которых будут использованы булевы выражения и операторы C#.

В этом модуле вы узнаете о булевых выражениях и используете различные типы операторов для оценки выражений на равенство, неравенство и сравнение. Вы также научитесь использовать специальную встроенную версию оператора if (условный оператор), которая выдает результат «или/или».

К концу этого модуля вы сможете писать код, используя любую комбинацию операторов C# для реализации логики принятия решений в ваших приложениях.

Цели обучения

В этом модуле вы узнаете как:

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

Упражнение - Оценить выражение

Логика принятия решений используется для создания альтернативных путей в коде, где решение о том, какой путь выбрать, принимается на основе оценки выражения. Например, вы можете написать код, который будет выполнять один из двух путей в зависимости от ввода пользователя. Если пользователь введет букву "a", ваш код выполнит один блок кода. Если пользователь введет букву "b", то будет выполнен другой блок кода. В этом примере вы управляете путем выполнения на основе значения, присвоенного строке. Ваш код выбирает путь выполнения на основе выражения, способа оценки этого выражения и базовой логики, используемой для определения путей.

Что такое выражение?

Выражение - это любая комбинация значений (литералов или переменных), операторов и методов, возвращающих одно значение. Оператор - это полная инструкция в C#, а операторы состоят из одного или нескольких выражений. Например, следующий оператор if содержит одно выражение, которое возвращает одно значение:

if (myName == "Luiz")

Вы могли подумать, что значение, возвращаемое выражением, - это число или, возможно, строка. Действительно, разработчики приложений используют разные типы выражений для разных целей. В данном случае, когда вы разрабатываете оператор выбора if, вы будете использовать выражение, которое возвращает либо true, либо false. Разработчики называют этот тип выражения булевым выражением. Когда ваш код содержит булево выражение, возвращаемое значение всегда является единственным значением true или false.

Булевы выражения важны, потому что ваш код может использовать эти выражения, чтобы решить, какой блок кода выполнить.

Существует множество различных типов операторов, которые можно использовать в булевых выражениях. Например, в приведенном выше выражении if используется оператор равенства == для проверки того, присвоено ли строковой переменной определенное значение. Выбор оператора зависит от доступных путей кода, условий, связанных с этими путями, и основной логики приложения.

Оценка равенства и неравенства

Одна из самых распространенных оценок кода - проверка равенства двух значений. При проверке на равенство между двумя проверяемыми значениями располагается оператор равенства ==. Если значения по обе стороны от оператора равенства эквивалентны, то выражение вернет true. В противном случае оно вернет false.

И наоборот, вам может понадобиться проверить, не равны ли два значения. Для проверки неравенства между двумя значениями используется оператор неравенства !=.

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

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

Используйте оператор равенства

  1. Убедитесь, что у вас открыт Visual Studio и на панели редактора отображается файл Program.cs. Обратите внимание, что файл Program.cs должен быть пустым. Если это не так, выделите и удалите все строки кода.
  2. Введите следующий код в редактор кода Visual Studio.
Console.WriteLine("a" == "a");
Console.WriteLine("a" == "A");
Console.WriteLine(1 == 2);

string myValue = "a";
Console.WriteLine(myValue == "a");
  1. Запустите код. Вы должны увидеть следующий результат.
True
False
False
True

Улучшите проверку равенства строк с помощью встроенных вспомогательных методов строки

Вас может удивить, что строка Console.WriteLine("a" == "A"); выводит false. При сравнении строк регистр имеет значение.

Также рассмотрим эту строку кода:

Console.WriteLine("a" == "a ");

Здесь вы добавили символ пробела в конец строки. Это выражение также выведет false.

В некоторых случаях наличие пробела до или после текста может быть вполне приемлемым. Однако если вам нужно принять неточное совпадение, вы можете сначала «помассировать» данные. «Массирование» данных означает, что перед сравнением на равенство вы выполняете некоторую очистку.

Например, рассмотрим случай, когда вы собираете пользовательский ввод внутри цикла. После ввода каждого значения можно выдать пользователю запрос, чтобы определить, хочет ли он продолжить, например «Хотите ли вы продолжить (Y/N)?». Если пользователь хочет продолжить, он, вероятно, введет либо y, либо Y. Вы захотите, чтобы ваш код одинаково интерпретировал оба значения, даже если y не эквивалентно Y.

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

  • Убедиться в том, что обе строки все в верхнем или во всем нижнем регистре, используя вспомогательный метод ToUpper() или ToLower() для любого строкового значения.
  • Удалить все ведущие и последующие пробелы с помощью вспомогательного метода Trim() для любого строкового значения.

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

  1. Замените код в редакторе кода Visual Studio следующим кодом:
string value1 = " a";
string value2 = "A ";
Console.WriteLine(value1.Trim().ToLower() == value2.Trim().ToLower());
  1. Сохраните файл с кодом, а затем используйте Visual Studio Code для запуска кода.
  2. Обратите внимание, что при выполнении кода в этот раз он выводит True.

Используйте оператор неравенства

  1. Используйте оператор комментария строки //, чтобы закомментировать весь код из предыдущего шага.
  2. Введите следующий код в редактор кода Visual Studio.
Console.WriteLine("a" != "a");
Console.WriteLine("a" != "A");
Console.WriteLine(1 != 2);

string myValue = "a";
Console.WriteLine(myValue != "a");
  1. Сохраните файл кода, а затем запустите его с помощью Visual Studio. Вы должны увидеть следующий результат.
False
True
True
False

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

Оценка сравнений

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

  • Больше >
  • Меньше <
  • Больше или равно >=
  • Меньше или равно <=

Естественно, операторы == и !=, которые вы использовали для сравнения строковых значений выше, будут работать и при сравнении числовых типов данных.

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

  1. Используйте оператор комментария строки //, чтобы закомментировать весь код из предыдущего задания.
  2. Введите следующий код в редактор кода Visual Studio.
Console.WriteLine(1 > 2);
Console.WriteLine(1 < 2);
Console.WriteLine(1 >= 1);
Console.WriteLine(1 <= 1);
  1. Сохраните файл кода, а затем используйте Visual Studio Code для сборки и запуска кода. Вы должны увидеть следующий результат:
False
True
True
True

Методы, возвращающие булево значение

Некоторые методы возвращают булево значение (true или false). В следующем упражнении вы будете использовать встроенный метод класса String, чтобы определить, содержит ли большая строка определенное слово или фразу, важные для вашего приложения.

примечание

Некоторые типы данных имеют методы, которые выполняют полезные утилиты. У типа данных String их много. Некоторые из них возвращают булево значение, в том числе Contains(), StartsWith() и EndsWith(). Подробнее о них вы можете узнать в модуле Microsoft Learn "Манипулирование буквенно-цифровыми данными с помощью методов класса String в C#".

Используйте метод, возвращающий булево значение

  1. Используйте оператор комментария строки //, чтобы закомментировать весь код из предыдущего шага.
  2. Введите следующий код в редактор кода Visual Studio.
string pangram = "The quick brown fox jumps over the lazy dog.";
Console.WriteLine(pangram.Contains("fox"));
Console.WriteLine(pangram.Contains("cow"));
  1. Сохраните файл кода, а затем используйте Visual Studio для сборки и запуска кода. Вы должны увидеть следующий результат.
True
False

Что такое логическое отрицание?

Термин "логическое отрицание" относится к унарному оператору отрицания ! Некоторые называют этот оператор "оператором НЕ". Когда вы помещаете оператор ! перед условным выражением (или любым кодом, который оценивается как true или false), он заставляет ваш код изменить оценку операнда на противоположную. Когда применяется логическое отрицание, в результате оценки получается true, если операнд оценивается как false, и false, если операнд оценивается как true.

Вот пример, который поможет вам увидеть связь между этими идеями. Следующие две строки кода приводят к одному и тому же результату. Вторая строка более компактна.

// These two lines of code will create the same output

Console.WriteLine(pangram.Contains("fox") == false);
Console.WriteLine(!pangram.Contains("fox"));

Используйте оператор логического отрицания

  1. Используйте оператор комментария строки //, чтобы закомментировать весь код из предыдущего шага.
  2. Введите следующий код в редактор кода Visual Studio.
string pangram = "The quick brown fox jumps over the lazy dog.";
Console.WriteLine(!pangram.Contains("fox"));
Console.WriteLine(!pangram.Contains("cow"));
  1. Сохраните файл кода, а затем используйте Visual Studio Code для сборки и запуска кода. Вы должны увидеть следующий результат.
False
True

Оператор неравенства в сравнении с логическим отрицанием

Оператор неравенства != включает символ !, но его не следует путать с логическим отрицанием. Оператор неравенства возвращает true, если его операнды не равны, и возвращает false, если операнды равны. Для операндов встроенных типов выражение x != y дает тот же результат, что и выражение !(x == y) (пример логического отрицания).

Следующий пример кода демонстрирует использование оператора !=:

int a = 7;
int b = 6;
Console.WriteLine(a != b); // output: True
string s1 = "Hello";
string s2 = "Hello";
Console.WriteLine(s1 != s2); // output: False

Вот основные выводы, которые вы уже узнали об оценке булевых выражений:

  • Существует множество различных видов выражений, которые оцениваются либо как истина, либо как ложь.
  • Оценка равенства с помощью оператора ==.
  • Оценка равенства строк требует учета возможности того, что строки имеют разный регистр и ведущие или завершающие пробелы. В зависимости от ситуации используйте вспомогательные методы ToLower() или ToUpper(), а также вспомогательный метод Trim(), чтобы повысить вероятность того, что две строки равны.
  • Оценивайте неравенство с помощью оператора !=.
  • Оценивайте больше, чем, меньше, чем и подобные операции с помощью операторов сравнения >, <, >= и <=.
  • Если метод возвращает bool, его можно использовать как булево выражение.
  • Используйте логический оператор отрицания ! для оценки противоположности данного выражения.

Упражнение - Реализация тернарного условного оператора

Предположим, вам нужно быстро определить, имеет ли покупка клиента право на скидку по акции. В описании акции указано, что если сумма покупки превышает 1000 долларов, то на покупку распространяется скидка в размере 100 долларов. Если сумма покупки составляет 1000 долларов или меньше, на покупку распространяется скидка в 50 долларов.

Конечно, для выражения этого бизнес-правила можно использовать конструкцию ветвления if ... elseif ... else, но использование условного оператора для оценки права на скидку по акции может быть более правильным выбором. Условный оператор использует компактный формат, который позволяет сэкономить несколько строк кода и, возможно, сделать его смысл более понятным.

Что такое тернарный условный оператор?

Условный оператор ?: оценивает булево выражение и возвращает один из двух результатов в зависимости от того, истинно или ложно булево выражение. Условный оператор обычно называют тернарным условным оператором.

Вот основная форма:

<evaluate this condition> ? <if condition is true, return this value> : <if condition is false, return this value>

Подумайте, как вы примените условный оператор к сценарию с рекламной скидкой. Ваша цель - вывести на экран сообщение для покупателя с указанием процента скидки. Размер скидки будет зависеть от того, потратили ли они на покупку более 1000 долларов.

Добавьте код, использующий условный оператор

  1. Введите следующий код в редактор кода Visual Studio.
int saleAmount = 1001;
int discount = saleAmount > 1000 ? 100 : 50;
Console.WriteLine($"Discount: {discount}");
  1. При выполнении кода вы должны увидеть следующий результат:
Discount: 100

Используйте условный оператор inline

Вы можете еще больше уплотнить этот код, исключив временную переменную discount.

  1. Обновите код в редакторе кода Visual Studio следующим образом:
int saleAmount = 1001;
// int discount = saleAmount > 1000 ? 100 : 50;

Console.WriteLine($"Discount: {(saleAmount > 1000 ? 100 : 50)}");
  1. Обратите внимание, что результат остался прежним.

  2. Потратьте минуту на изучение обновленного оператора Console.WriteLine().

Обратите внимание, что весь оператор условного оператора необходимо заключить в круглые скобки. Круглые скобки гарантируют, что среда выполнения поймет ваше намерение - вывести на экран результат условного оператора, а не результат оценки условия (saleAmount > 1000).

примечание

Хотя этот пример компактен и показывает, что возможно, читать его немного сложнее. Не всегда стоит объединять строки кода, особенно если это негативно сказывается на общей читабельности кода. Это часто субъективное решение.

Обзор

Вам следует запомнить следующие факты об условном операторе:

  • Вы можете использовать условный оператор для уменьшения размера кода, но при этом вы должны быть уверены, что полученный код легко читаем.
  • Вы можете использовать условный оператор, когда вам нужно вернуть значение, основанное на бинарном условии. Ваш код вернет первый вариант, если условие оценивается как true, и вернет второй вариант, если условие оценивается как false.

Упражнение - Выполните задание с использованием условных операторов

Задача с условным оператором

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

Задача: написать код для отображения результата подбрасывания монеты

Вот ваши требования к заданию:

  1. Используйте класс Random для генерации значения.
  2. Учитывайте диапазон чисел, который требуется.
  3. На основе сгенерированного значения используйте условный оператор, чтобы вывести на экран либо головы, либо хвосты.
  4. Вероятность того, что результат будет либо решкой, либо орлом, должна составлять 50%.
  5. Ваш код должен быть легко читаемым, но содержать как можно меньше строк.
  6. Вы должны быть в состоянии достичь желаемого результата в трех строках кода.

Задача "Логика принятия решений"

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

Инициализируйте значения разрешений и уровней

  1. Создайте новый проект
  2. Введите следующий код в редактор кода Visual Studio
string permission = "Admin|Manager";
int level = 55;
  1. Просмотрите начальные строки кода. Ваше приложение будет использовать комбинацию permission и level для применения/оценки бизнес-правил в этом проблемном сценарии. Полный список условий для бизнес-правил указан на следующем шаге. В готовом решении должны использоваться permission и level.
подсказка

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

Внедрение бизнес-правил

warning

Вам нужно будет использовать вспомогательный метод Contains(), чтобы определить, содержит ли значение, присвоенное строке разрешения, одно из значений разрешения, заданных "бизнес-правилами". Например, выражение permission.Contains("Admin") вернет true при использовании исходных значений данных, указанных в коде выше.

Вот бизнес-правила, которым должно удовлетворять ваше решение:

  • Если пользователь является администратором с уровнем выше 55, выведите сообщение:
Welcome, Super Admin user.
  • Если пользователь является администратором с уровнем меньше или равным 55, выведите сообщение:
Welcome, Admin user.
  • Если пользователь является менеджером с уровнем 20 или выше, выведите сообщение:
Contact an Admin for access.
  • Если пользователь - менеджер с уровнем ниже 20, выведите сообщение:
You do not have sufficient privileges.
  • Если пользователь не является администратором или менеджером, выведите сообщение:
You do not have sufficient privileges.
  1. Обновите код Program.cs, чтобы учесть каждое из бизнес-правил
  2. Сохраните код.

Проверьте свое решение, используя предложенные значения исходных данных.

  1. Соберите и запустите свой код.
  2. Оцените результат. Когда вы запустите свой код, включая данные начальной конфигурации, вы должны увидеть следующий результат:
Welcome, Admin user.

Протестируйте другие бизнес-правила

  • Обновите значения, присвоенные разрешениям и уровням.

  • Сохраните и запустите код.

  • Оцените результат, чтобы убедиться, что другие бизнес-правила выполнены.

Заключение

Ваша цель заключалась в разработке утверждений о принятии решений для различных ситуаций с помощью булевых выражений и операторов C#.

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

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