Теперь давайте подробнее рассмотрим структуру этой программы. Ее можно кратко описать следующим образом:
инициализировать переменную sum значением 0 выдать пользователю приглашение на ввод прочитать входные данные
пока входное значение представляет собой целое число, добавить входное значение к значению sum, выдать пользователю приглашение на ввод, затем прочитать следующий ввод по завершении ввода вывести значение переменной sum
Кстати, приведенное описание является примером псевдокода, который представляет собой искусство выражения программы на естественном языке, проводящее параллель с формами на языке компьютера. Псевдокод удобен при разработке логики программы. После того как логика выглядит правильной, псевдокод можно транслировать в действительный программный код. Одно из преимуществ псевдокода заключается в том, что он позволяет сосредоточиться на логике и организации программы, одновременно не беспокоясь о том, как выразить нужные идеи на языке программирования. Например, в показанном выше псевдокоде блоки указываются с помощью отступов, и совершенно не играет роли, что синтаксис С требует фигурных скобок. Еще одно достоинство псевдокода состоит в том, что он не привязан к конкретному языку программирования, благодаря чему один и тот же псевдокод можно транслировать на разные языки.
В любом случае, поскольку while является циклом с предусловием, программа должна получить входные данные и проверить значение переменной status до того, как будет произведен вход в тело цикла. Именно по этой причине в программе имеется вызов функции scanf() перед while. Чтобы цикл мог продолжаться, внутри него должен присутствовать оператор чтения, который позволит определить значение переменной status для следующего входного значения. В связи с этим оператор scanf() присутствует также в конце цикла while; он подготавливает цикл к следующей итерации. Приведенный ниже псевдокод можно считать стандартным форматом цикла:
получить первое значение, предназначенное для проверки пока проверка проходит успешно, обработать значение получить следующее значение
Цикл чтения в стиле С
Программу в листинге 6.1 можно было бы написать на Pascal, BASIC или FORTRAN с тем же самым проектом, представленным с помощью псевдокода. Тем не менее, язык С предлагает сокращение. Конструкция
Управляющие операторы С: циклы 203
status = scanf("%ld", &num);
while (status = 1)
{
/* действия, выполняемые в цикле */
^ status = scanf("%ld", &num);
может быть заменена следующей:
while (scanf("%ld", &num) == 1)
{
/* действия, выполняемые в цикле */
}
Во второй форме функция scanf() используется двумя разными способами одновременно. Во-первых, вызов функции в случае успешного завершения помещает значение в num. Во-вторых, возвращаемое значение этой функции (которое равно 1 или О и не является значением num) управляет циклом. Поскольку условие цикла проверяется на каждой итерации, то и функция scanf() вызывается на каждой итерации, предоставляя новое значение num и обеспечивая новую проверку. Другими словами, возможности синтаксиса С позволяют заменить стандартный формат цикла следующей компактной версией:
пока получение и проверка значения завершается успешно, обработать значение
А теперь рассмотрим оператор while более формально.
Оператор while
Общая форма цикла while имеет следующий вид:
while (выражение) оператор
Часть оператор может быть простым оператором, завершающимся точкой с запятой, либо составным оператором, заключенным в фигурные скобки.
До сих пор в примерах в качестве части выражение применялись выражения отношений, т.е. сравнивались значения. В общем случае здесь можно использовать любое выражение. Если выражение истинно (или в общем случае имеет ненулевое значение), то часть оператор выполняется один раз и затем выражение проверяется снова. Такой повторяющийся процесс проверки и выполнения повторяется до тех пор, пока выражение не станет ложным (получит нулевое значение). Каждый процесс проверки и выполнения называется итерацией (рис. 6.1).

PHс. 6.1. С труктура цикла while
204 глава 6
Завершение цикла while
Мы подошли к ключевому моменту, связанному с циклами while: при построении цикла while должен быть предусмотрен код, который изменяет значение проверочного выражения, чтобы оно в конечном итоге стало ложным. В противном случае цикл никогда не закончится. (В действительности для завершения цикла можно применить операторы break и if, но об этом речь пойдет позже.) Рассмотрим следующий пример:
Читать дальше