Основы программирования. Типы данных, переменные, операторы
Составной оператор. Блок
Группа операторов, заключенная в фигурные скобки, рассматривается как один оператор – составной оператор. Составной оператор – важная синтаксическая конструкция. В ряде случаев, по синтаксису конструкции требуется, чтобы в ней присутствовал ровно один оператор, а по смыслу требуется выполнения группы операторов. В этом случае группа объединяется в единый составной оператор.
Если в группе, объединяемой скобками, присутствуют объявления переменных, то такую группу принято называть блоком.
Оператор выбора if – then – else
В жизни, как витязю на распутье, часто приходится делать выбор. Без выбора нельзя обойтись и в программах. Во всех языках программирования есть оператор выбора, называемый оператором if, или if – then – else (если – то – иначе), позволяющий сделать альтернативный выбор, - выбор из двух возможностей.
В языке C# этот оператор имеет следующий синтаксис:
if (<выражение булевского типа>) <оператор А> else <оператор B>
Семантика выполнения этого оператора следующая. Вычисляется значение булевского выражения. Если значение выражения равно true (истина), то выполняется оператор А, в противном случае – оператор В.
Существует краткая форма этого оператора, когда ветвь else опускается. Тогда, когда выражение ложно ничего не делается и оператор if заканчивает работу.
По синтаксису if – ветвь и else - ветвь содержат только один оператор. Понятно, что этот оператор может быть составным, тогда выполняется группа операторов, заключенная в фигурные скобки, но синтаксически воспринимаемая как один оператор.
Несмотря на кажущуюся простоту семантики этого оператора, разобраться в его работе может быть достаточно сложно. Дело в том, что на оператор А и оператор В не накладывается никаких ограничений. Как сказано, это может быть группа операторов, каждый из операторов группы может быть сложным оператором – оператором if или оператором цикла.
Рассмотрим пример использования оператора if в классической задаче нахождения корней квадратного уравнения. В нашем проекте Lesson3 есть метод TestIf, решающий эту задачу. Приведу текст этого метода:
//объявление и ввод исходных данных double a, b, c; Console.WriteLine("Введите коэффициенты квадратного уравнения - a, b, c"); a = double.Parse(Console.ReadLine()); b = double.Parse(Console.ReadLine()); c = double.Parse(Console.ReadLine());
Выполнение метода начинается с объявления исходных данных и их ввода с консоли. Обратите внимание, знакомый нам метод ReadLine читает с консоли строку текста, представляющую число. Прежде чем это значение присвоить переменной типа double, метод Parse класса double преобразует эту строку в число типа double.
//объявление результатов - корней квадратного уравнения double x1, x2;
Объявляются результаты без инициализации. Значения этих переменных появятся в результате вычислений.
//объявление с инициализацией внутренней (вспомогательной) переменной double discriminant = b * b - 4 * a * c;
Помимо исходных данных и результатов программа в своей работе использует внутренние переменные. Таковой в данной задаче является переменная с именем discriminant. Она объявлена с инициализацией, поскольку все данные для расчета ее значения уже имеются.
//Вычисления if (discriminant > 0) { x1 = (-b + Math.Sqrt(discriminant)) / (2 * a); x2 = (-b - Math.Sqrt(discriminant)) / (2 * a); } else if (discriminant == 0) x1 = x2 = -b / (2 * a); else x1 = x2 = double.NaN;
Вычисления практически сводятся к выполнению одного оператора – оператора if. Ветвь if этого оператора содержит составной оператор, содержащий группу из двух операторов присваивания. Ветвь else содержит один оператор, - но это в свою очередь оператор выбора if. Обратите внимание, ветвь else этого оператора работает, когда квадратное уравнение не имеет вещественных корней. В данном случае корни получают специальное значение NaN (Not a Number – Это Не (вещественное) Число).
Console.WriteLine("x1 = " + x1 + " x2 = " + x2);