Управляющие операторы

Язык Си, как и любой другой язык программирования, имеет два типа операторов: операторы преобразования данных и операторы управления исполнением программы. К числу первых относится, например, оператор присвоения, умножения и т.п.

В данном разделе, в основном, рассмотрены операторы второй группы. К ним относятся:

  1. условный оператор if-else (имеет сокращённую форму if);
  2. переключатель switch;
  3. операторы циклов for, while и do;
  4. операторы переходов goto (избегайте использовать на практике), break, continue, return;

Как и всегда, достаточно подробные материалы по теме можно нати в книге K&R C.

Пример 1 - Условный оператор if-else

Наберите в редакторе текст программы, иллюстрирующей действие условного оператора:

$ vim if.c

if.c.png

Скомпилируйте и запустите программу несколько раз:

$ gcc if.c -o if
$ ./if

Попробуте ввести корректные и некорректные данные. Объясните результаты работы программы.

Пример 2 - Условная тернарная операция ?:

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

(выражение 1) ? (выражение 2) : (выражение 3)

Здесь выражение 1 - это логическое выражение (им, конечно, может быть и арифметическое выражение, но это встречается только в специфических случаях), которое анализируется на истинность. В том случае, если выражение 1 равно ИСТИНЕ, то результатом вычисления условной операции является выражение 2, иначе - выражение 3.

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

$ vim abs-1.c

abs-1.c.png

Скомпилируйте и запустите программу:

$ gcc abs-1.c -o abs-1
$ ./abs-1

Является ли выражение (x<y)?y:x оператором? Что необходимо сделать, для того чтобы оно им стало? Что вообще такое оператор?

Пример 3 - Операции взятия остатка от деления % и проверки на равенство ==

Бинарные арифметические операции, которые поддерживает язык Си, включают:
  1. + сложение;
  2. - вычитание;
  3. * умножение;
  4. / деление;
  5. % взятие остатка от деления.

Пример: 11 / 4 = 2, 11 % 4 = 3.

К бинарным также относятся операции присвоения и сравнения. Их не следует путать!

В языке Си встречается как простая (=), так и составные операции присвоения: +=, *=, /= и т.п. Левым операндом этих операций могут быть только переменные! Результатом выполнения этой операции считается вычисленное значение её левого операнда.

Операция == представляет собой логическую операцию проверки на равенство. Обоими её операндами могут являться как переменные, так и непосредственные значения. Результатом этой операции является ИСТИНА или ЛОЖЬ, в зависимости от того, равны ли друг другу операнды или нет.

В языке Си нет специального булева типа данных для представления логических данных, но принято считать, что любое ненулевое значение соответствует ИСТИНЕ, в то время как нуль - это ЛОЖЬ.

Напишите программу, реализующую проверку значения, введённого пользователем, на чётность:

$ vim even.c

even.c.png

Скомпилируйте и выполните программу несколько раз:

$ gcc even.c -o even
$ ./even

Пример 4 - Параметрический цикл for

Достаточно часто возникает необходимость многократно повторять однотипные действия. Для автоматизации этого процесса используются циклы. Цикл for - это самый универсальный вид цикла в языке Си. Его синтаксис имеет следующий вид:

for([выражение 1] ; [выражение 2] ; [выражение 3])
тело цикла

Квадратные скобки [], как и всегда в подобных случаях, означают, что соответствующие аргументы не являются обязательными и могут отсутствовать. выражение 1 - это операция, задающая начальные условия для выполнения данного цикла. выражение 2 задаёт условие завершения цикла - до тех пор пока значение этого выражения истинно, тело цикла выполняется, как только оно становится ложным, цикл завершается. выражение 3 определяет набор операций, выполняемых после каждой итерации цикла. Телом цикла может являться как одиночный, так и составной оператор или блок {}.

Сначала напишите текст предлагаемой программы, исключая комментарии:

$ vim for.c

for.c.png

После этого скомпилируйте, запустите программу и разберитесь в подробностях с принципом её работы:

$ gcc for.c -o for
$ ./for

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

Пример 5 - Применение циклов для вычисления сумм

С помощью циклов легко реализуется расчёт сумм. В качестве примера напишем исходный текст программы, вычисляющей сумму натуральных чисел от 1 до N: \[ x = \sum\limits_{i=1}^Ni = 1 + 2 + \cdots + N. \]

$ vim summ.c

summ.c.png

Как и всегда, транслируем и запускаем программу:

$ gcc summ.c -o summ
$ ./summ

Пример 6 - Цикл while и тип short

Кроме цикла for в языке Си используется упрощённый цикл с предусловием while. Его синтаксис имеет вид:

while(выражение условия)
тело цикла

Идея работы этого цикла состоит в том, что тело цикла выполняется до тех пор пока выражение условия принимает истинное значение.

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

$ vim while.c

while.c.png

Скомпилируйте, запустите программу и объясните, что происходит:

$ gcc while.c -o while
$ ./while

Измените заголовок цикла на тот, который приведён в комментарии. Перекомпилируйте приложение, запустите его ещё раз и объясните изменения.

После этого уберите ключевое слово short из объявления переменной i. Перекомпилируйте пргорамму ещё раз, запустите её и сделайте выводы. Что означает ключевое слово short? А long?

Для сброса программы наммите сочетание клавиш Ctrl+C (^C).

Пример 7 - Альтернативный выбор на переключателе switch

Напишите текст программы:

$ vim day.c

day.c.png

Как и всегда, скомпилируйте, запустите программу несколько раз (в том числе и с некорретными данными, например вводя с клавиатуры значения: 1, 17, q, и т.д.).

$ gcc day.c -o day
$ ./day

Измените строку с комментарием, повторите предыдущие действия и сделайте выводы.

Пример 8 - Цикл do

Кроме цикла while в языке Си есть ещё один упрощённый цикл - цикл с постусловием do-while. Его синтаксис и логика работы очевиды из следующего примера:

$ vim do.c

do.c.png

После набора текста, как и всегда, компилируем, запускаем, разбираемся:

$ gcc do.c -o do
$ ./do

Напишите программу, выводящую на экран такой треугольник:

   *
  ***
 *****
*******

Пример 9 - Применение цикла do

Ещё один пример использования циклов:

$ vim temperature.c

temperature.c.png

$ gcc temperature.c -o temperature
$ ./temperature