Лекции по курсу программирования на C
Лекция 2. Управляющие конструкции языка С. Функции в языке С. Область действия переменных и связанные с ней понятия. Создание программ из нескольких модулей.
Условный оператор if … else
Условный оператор реализует структуру выбора. Он имеет следующий вид:
if (<условие>) <оператор1> [else <оператор2>]
Если условие оценивается как истинное (не равное 0), выполняется оператор1, если как ложное (равное 0), выполняется оператор2. Пример:
if (a>b)
max_ab=a;
else
max_ab=b;
Вместо одиночного оператора можно поставить блок из нескольких операторов, заключённый в фигурные скобки:
if (<условие>)
{<операторы блока if>}
else
{<операторы блока else>}
Ключевое слово else и соответствующий ему блок операторов могут отсутствовать. Можно также строить вложенные структуры if … else.
Условие оператора if может быть сколь угодно сложным выражением. Оно считается ложным, если его значение равно 0, и истинным, если значение не равно 0. Несколько примеров условий с пояснениями:
if (x) // Если х не равно 0
if (!x) // Если х равно 0 (в языке С операция ! означает отрицание)
if (c==a) // Если c равно a (операция == означает отношение равенства)
if (b!=c) // Если b не равно с (операция != означает отношение неравенства)
if (a>=b && a<=c) // Если а лежит между b и с (операция && означает логическое and)
if (a!=b || a!=c) // Если a не равно b или с (операция || означает логическое or).
ОПЕРАТОР ВЫБОРА switch
Иногда возникают ситуации, когда некоторая переменная может принимать несколько возможных значений-вариантов, и для каждого варианта требуется выполнить какие-то свои действия. Для подобных случаев в С существует специальная конструкция выбора switch. Выглядит она так:
switch (<выражение>)
{
case <константное выражение1>: <группа операторов1>
case <константное выражение2>: <группа операторов2>
…
[default: <группа операторов>]
}
Сначала производится оценка выражения в операторе switch; полученное значение последовательно сравнивается с каждым из константных выражений, и при совпадении значений управление передаётся на соответствующую группу операторов. Если значение выражения не подходит ни под один из вариантов, управление передаётся на группу операторов с меткой default или на следующий после блока switch оператор, если группа default отсутствует.
Пример:
int i = ...; // Переменная i получает некоторое значение
switch (i)
{
case 0: printf(“i is false”); break; // если i=0
case 1: printf(“i is true”); break; // если i=1
default: printf(“i is true but not 1”); // если i не 0 и не 1
}
Оператор goto
Исполнение оператора goto приводит к передаче управления на метку, указанную в операторе. Пример:
loop1:
goto loop1;
Примечание: не следует использовать данные оператор слишком часто. Это приводит к сложночитаемому программному коду.
ЦИКЛЫ
В языке С структуры многократного повторения реализуются тремя разновидностями операторов цикла: while, do … while и for.
Цикл while
Синтаксис оператора while выглядит так:
while (<условие продолжения>) оператор;
Сначала оценивается условие продолжения. Если оно истинно, выполняется оператор, после чего управление возвращается заголовку цикла и всё повторяется снова. Когда условие оказывается ложным, выполнение цикла прекращается и управление передаётся следующему после цикла оператору. Пример:
int j=0;
while (j<=5)
{
j=j+1;
printf(“j=%d \n”, j); // На консоль выводится значение j, пока j не станет больше 5
}
Следует обратить внимание, что в цикле while проверка условия делается перед выполнением тела цикла. Если условие изначально ложно, то тело цикла не исполняется ни одного раза.
Цикл do … while
Этот цикл имеет следующий вид:
do <оператор> while (<условие продолжения>);
Здесь сначала выполняется оператор, а затем производится проверка условия продолжения. Если условие истинно, управление возвращается на начало цикла, если ложно, цикл завершается. Отличие от предыдущей конструкции состоит в том, что тело цикла do .. while исполняется хотя бы один раз вне зависимости от каких либо условий.
Цикл for
Цикл for выглядит так:
for ([<инициализация>]; [<условие>]; [<модификация>]) <оператор>;
Прежде всего выполняется инициализация цикла; секция инициализации может содержать любое выражение. Инициализация производится только один раз перед началом работы цикла.
Затем оценивается выражение условия. Если оно истинно, выполняется оператор цикла, если ложно, происходит выход из цикла.
После исполнения цикла производится модификация, после неё управление возвращается заголовку цикла. Обычно в секции модификации изменяют значение управляющих переменных цикла.
Простейшей и самой востребованной конструкцией на основе цикла for является цикл с управляющей переменной счётчиком:
int i, k;
k=10;
for(i=0; i<k; i++)
{
...
}
В данном случае счётчик инициализируется значением i=0. В начале каждого прохода цикла проверяется, не достиг ли он значения k=10. Как только i станет равным k, выполнение цикла прекращается. Таким образом, тело цикла выполняется для значений i от 0 до k-1, то есть ровно k раз.
ОПЕРАТОРЫ ПРЕРЫВАНИЯ ЦИКЛОВ
Часто бывает необходимым досрочно прервать некоторый цикл, до того, как условие его продолжения станет ложным. Для досрочного завершения циклов в C применяются операторы break и continue.
Оператор break вызывает прерывание ближайшего (самого внутреннего) заключающего его блока switch, while, do … while или for.
Оператор continue воздействует только на блоки циклов. Он передаёт управление в конец тела цикла, пропуская, таким образом, следующие за ним операторы, досрочно завершая не сам цикл, а его текущую итерацию.
Пример:
char s[80];
int i;
//--------------------------
блок, в котором задаётся массив s
//--------------------------
i=0;
while (s[i]!=0 && i<80)
{
printf(“This is the letter %c”, s[i];
if (s[i]==’q’)
{
printf(“Quit the process”);
break;
}
i=i+1;
}
Данная программа будет последовательно выдавать символы, содержащиеся в массиве s, пока не встретиться терминальный 0 или символ ‘q’.
