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

А что если..? (операторы if…else в C#)

    До сих пор наши программы были линейными. То есть, они делали одно и то же. Единственное разнообразие было лишь тогда, когда пользователь неправильно вводил данные, и программа выдавала ошибку! А что, если мы хотим сделать программу, которая будет реагировать на то или иное обстоятельство? А что, если программа даже будет принимать решения, в зависимости от ввода пользователя? Действительно, » А что, если?»… Рассмотрим оператор «if» во всем его величестве:

    Console.Write("Введите свой возраст: "); int age = Convert.ToInt32( Console.ReadLine() ); if( age == 16 ) { Console.WriteLine("В этом возрасте уже можно водить машину!"); }   

    Первые две строки должны быть уже знакомы… мы спрашиваем пользователя его возраст. Следующие 4 строки «составляют» наш оператор. На первой линии, где «if» действительно упомянут, мы пишем наши логические выражения. Если перевести на русский, там написано: «если возраст пользователя 16, то выполнить код между символам «{» и «}»». То есть, если пользователь введет 16 как свой возраст, то получит это сообщение. В любом другом случае, код в «if» операторе будет пропущен.
      Конечно, == не единственное сравнение, которое мы можем использовать. Вот более полный список:

    == (равен) < (меньше чем) > (больше чем) != (не равен) <= (меньше или равен) >= (больше или равен)   Нужно быть осторожным и не спутать = с ==. 

    Обычное = используется для присвоения значений и, практически, не имеет никакого отношения к «if» оператору. == используется для проверки абсолютного равенства. Еще надо опасаться использования == на типах double и decimal, т.к. редко когда бывает, что их значение совпадает с искомым.
    Кстати о различиях, надо запомнить, что «age < 17» и «age <= 16» абсолютно одно и то же. Первое означает «любое число меньше 17», а второе «любое число меньшее или равное 16», а результат этих логических выражений одинаков(оба верны для чисел меньше 17).
      Все выражения, которые можно вписать в утверждение оператора «if» сводятся к булевому типу — то есть эти выражения либо верны (true) либо неверны (false). Для этого в С# есть специальный тип данных — «bool«(булевой тип). Познакомимся поближе:

    bool userAgeIs16 = age == 16; if( userAgeIs16 ) { Console.WriteLine("В этом возрасте уже можно водить машину!"); }   

    Этот код делает то же самое, что и в первом примере, только на этот раз мы передали значени «true/false» через булевую переменную. Надо заметить, что большинство начинающих программистов «зависают» на знаках равенства в «if» операторе. Они настолько привыкают видеть вещи типа «age == 16» в условиях, что для них просто неприемлемо, да и непонятно, видеть там булевую переменную. Не надо думать, что необходимо постоянно создавать лишние переменные, просто это показывает, что все эти «==» и цифры, и вообще, выражения в «if» операторе сводятся к одному булевому «верно-неверно»…
      А что, если мы хотим, чтобы «if» проверяло сразу несколько вещей? Например, возраст и IQ? Тогда делаем так:

    Console.Write("Введите свой возраст: "); int age = Convert.ToInt32( Console.ReadLine() ); Console.Write("Введите свой IQ: "); int iq = Convert.ToInt32( Console.ReadLine() ); if( age >= 16 && iq > 75 ) { Console.WriteLine("С таким умом и в таком возрасте можно водить машину!"); }   

    «&&» , которое означает «И», позволяет нашему условию быть более конкретным. Теперь мы получим сообщение, если будут введен возраст больше или равный 16 И IQ больший или равный 75. Если хотя бы одно из выражений неверно, все условие автоматом считается неверным и код из тела «if» будет пропущен.
      В противоположность «&&», «||» означает «ИЛИ». В выражении с «ИЛИ», если хотя бы одно из условий верно, все выражение считается верным. Все как и в русском. Если бы я сказал «чтобы купить водку, надо быть старше 18, или попросить дядю Вову из соседнего подъезда». Сразу понятно, что для покупки водки надо быть совершеннолетним ИЛИ попросить дядю Вову. Не надо просить соседа И быть совершеннолетним одновременно. Нужно только ОДНО из этих условий. Мдя, нехороший был пример… Зато все понятно, не так ли?
      Можно и поэкспериментировать, использовать все вперемешку. Например, следующее выражение (хотя и достаточно сложное) абсолютно разрешимо:

    if( (age != 5 && age < 50) || (age > 60 && iq > 90) )   

    Условие верно, если возраст меньше 50 и не равен 5, ИЛИ если он больше 60 и IQ выше 90. Это, конечно сложно, но зато прямолинейно. В любом выражении, как это && будет выполняться раньше ||. Несмотря на это, мы можем заставить С# сначала выполнять содержимое скобок. А еще можно вставлять скобки для улучшения читаемости кода.
      Ну что ж , продолжаем. Стоит заметить, что в тело «if» можно вписывать сколько угодно строк кода. Можно даже объявлять новые переменные…if( age > 15 )

    { Console.Write("А теперь введите имя: "); string name = Console.ReadLine(); Console.WriteLine(name + ", ты можешь водить машину!"); }   

    Нужно заметить, что все переменные, объявленные внутри «if» оператора, существуют только в нем. Если мы попытаемся использовать переменную вне фигурных скобок, «{}» оператора «if», то программа не заработает — переменная находится «out of scope«, т.е. фактически «вне досягаемости». А что если нам надо вызвать переменную после «if«? В этом случае просто объявляем ее до него, вот так…string name = «»; if( age > 15 )

    { Console.Write("А теперь введите имя: "); name = Console.ReadLine(); Console.WriteLine(name + ", ты можешь водить машину!"); } 

    …вот и все. Мы поговорим о границах видимости переменных позже, при рассмотрении функций, а пока надо запомнить: если надо, чтобы у нас был доступ к переменной по всей программе, не надо объявлять переменные внутри «if» оператора. Кстати, если после оператора условия мы планируем только одну строку кода, то можно «{}» опустить… Можно просто…:if( age > 15 )

    Console.WriteLine("Это тоже работает!");   Надо запомнить,что при пренебрежении "{}" только строка следующая непосредственно после "if" считается частью условия. Ну, а сейчас ситуация немного усложнится...if( age > 15 ) { Console.WriteLine("Можно водить машину."); } else { Console.WriteLine("Мал еще!"); }   

    Мы не только говорим программе, что делать при определенных условиях, но и что же делать, если эти условия не встречаются! Дополнительный блок «else» в «if» операторе пишется в конце и работает так же. Основное различие в том, что мы не передали условное выражение, потому что «else» «ловит» все те условия, которые не соответствуют основному(которое в «if»). А что если нам необходимо иметь несколько определенных путей развития? Можно сделать так:

    if( age == 16 ) { Console.WriteLine("Можно водить машину."); } else if( age > 15 ) { Console.WriteLine("Едва ли может водить!"); } else { Console.WriteLine("Мал еще!"); } 

    Можно добавлять сколько угодно «else if» блоков к «if» оператору, чтобы предусмотреть различные ситуации. Как «else if«, так и «else» блок является необязательным для «if» оператора; как бы то ни было, если «else» все же используется, он должен быть в самом конце. Еще надо заметить и объяснить почему мы написали условие age > 15 в блоке «else if». Дело в том, что в любой if/else if/else структуре, С# выполняет только первое попавшееся совпадение. Значит, если age >15 стоял бы в начале, и пользователь вписал бы 16 как свой возраст, age >15 было бы первым встречным совпадением. Выполнится «Можно водить машину.» код, вместо более конкретного «Едва ли может водить!», т.е. вместо того, который нам нужен. Нужно быть осторожным при написании условий, приходится следить за тем, чтобы первые выражения не «крали» условия у других.
      Ну чтож, мы изрядно потрудились, но еще не все кончено! Прежде чем продолжить, рассмотрим пример кода…

    using System; namespace A_If { class Class1 { [STAThread] static void Main(string[] args) { // Запрашиваем возраст Console.Write("Введите свой возраст: "); int age = Convert.ToInt32(Console.ReadLine()); // Простой if/else if/else if (age == 16) { Console.WriteLine("В этом возрасте уже можно водить машину!"); } else if (age < 16) { Console.WriteLine("Слишко мал для вождения!"); } else if (age > 16 && age < 150) { Console.WriteLine("Уже можно было бы и получить права!"); } else { Console.WriteLine("Ну да, конечно..."); } // Одностроковый if оператор if (age < 0) Console.WriteLine("Минуточку, возраст не может быть отрицательным!"); // Булевые переменные - то "горючее", на котором "работают" if операторы bool oldEnough = age >= 18; if (oldEnough) Console.WriteLine(Environment.NewLine + "Можно голосовать на выборах."); else Console.WriteLine(Environment.NewLine + "Слишком молод для голосования."); // "or" логика Console.Write(Environment.NewLine + "Введите число делимое либо на 4, ЛИБО на 5: "); int num = Convert.ToInt32(Console.ReadLine()); if ((num % 4 == 0) || (num % 5 == 0)) Console.WriteLine("Правильно."); else Console.WriteLine("Неправильно."); // "and" логика Console.Write(Environment.NewLine + "Введите число, делимое на 4 И на 5: "); num = Convert.ToInt32(Console.ReadLine()); if ((num % 4 == 0) && (num % 5 == 0)) Console.WriteLine("Правильно."); else Console.WriteLine("Неправильно."); // Ждем выхода... Console.Write(Environment.NewLine + "Программа завершена. Нажмите "Enter" для выхода..."); Console.ReadLine(); } } }


    Автор: Макагон Сергей
    Источник: http://devoid.com.ua

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *