Урок № 8. Управление ходом выполнения программы


Ход выполнения программы

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

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

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

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

//Размер массива
const int SIZE = 10;

/*
* Создание массива из десяти элементов
* с инициализацией этих элементов
*/

int[] intArray = new int[SIZE] { 24, 51, 41, 54, 12, 24, 42, 35, 72, 11 };

//Обнуление всех элементов массива
intArray[0] = 0;
intArray[1] = 0;
intArray[2] = 0;
intArray[3] = 0;
intArray[4] = 0;
intArray[5] = 0;
intArray[6] = 0;
intArray[7] = 0;
intArray[8] = 0;
intArray[9] = 0;

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

//Обнуление элементов массива в цикле
for (int i = 0; i < intArray.Length; i++)
{
    intArray[i] = 0;
}

//Примечание: выражение i++ означает, что 
//значение переменной i увеличивается на единицу!

Согласитесь, что код получился значительно компактнее! Так как же пользоваться циклами? После ключевого слова for следуют круглые скобки, внутри которых есть три секции, разделенные символом «;» (точка с запятой). Первая секция – это секция инициализации, в ней мы создали временную переменную с именем «i», и тут же присвоили ей начальное значение. Эта переменная «i» будет служить индексом элемента массива. Вторая секция – это секция проверки условия. Вот тут мы и подошли к операциям сравнения. В данном случае, используется операция «меньше», работает она так же, как и в математике, если первый операнд (в нашем случае, переменная «i») меньше второго, свойства «Length» массива intArray, то операция сравнения считается успешной.

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

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

В нашем случае, тело цикла состоит из одного оператора. Элементу массива с индексом, который представлен значением переменной «i» присваивается значение «0». А значение переменной «i» с каждым повтором цикла увеличивается на единицу, и тело цикла будет выполняться до тех пор, пока это значение переменной «i» меньше 10 (т.е. длины нашего массива). Таким образом, в цикле перебираются все элементы массива с индексами от 0 до 9, т.е. абсолютно все элементы нашего массива.

А теперь, давайте рассмотрим так называемый оператор выбора. Скажу сразу, в C# есть два оператора выбора, сейчас мы рассмотрим простейший. Такой оператор может разделять ход выполнения программы на максимум на два пути. Обозначается этот оператор ключевым словом if, после которого идут круглые скобки с условием (например, каким-нибудь сравнением), и если условие выполняется, то программа «идет» одним путем, если условие не выполняется – другим.

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

//Перебор всех элементов массива
for (int i = 0; i < intArray.Length; i++)
{
    //Если элемент меньше 50
    if (intArray[i] < 50)
    {
        intArray[i] = 0; //Тогда обнулить его
    }
}

После оператора if с условием в круглых скобках идет блок операторов, который будет выполняться, только в том случае, если условие выполнилось. Но это только упрощенная форма, есть еще и полная, отличается она тем, что есть в ней есть еще и блок операторов, который будет выполняться, если условие не выполнилось.

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

//Перебор всех элементов массива
for (int i = 0; i < intArray.Length; i++)
{
    //Значение текущего элемента меньше 50?
    if (intArray[i] < 50)
    {
        //Если условие выполнилось
        intArray[i] = 0;
    }
    else
    {
        //Если условие не выполнилось
        intArray[i] = 100;
    }
}

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

В результате, код метода Main будет выглядеть так:

static void Main(string[] args)
{
    //Размер массива
    const int SIZE = 10;

    /*
    * Создание массива из десяти элементов
    * с инициализацией этих элементов
    */

    int[] intArray = new int[SIZE] { 24, 51, 41, 54, 12, 24, 42, 35, 72, 11 };

    //Перебор всех элементов массива
    for (int i = 0; i < intArray.Length; i++)
    {
        //Значение текущего элемента меньше 50?
        if (intArray[i] < 50)
        {
            //Если условие выполнилось
            intArray[i] = 0;
        }
        else
        {
            //Если условие не выполнилось
            intArray[i] = 100;
        }
    }
}

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

Перейти к следующему уроку