Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Структурная схема циклического алгоритма



В подавляющем большинстве программ встречаются группы операторов, вычисление по которым многократно повторяется. Такие повторяемые участки называются циклами, а сам вычислительный процесс – циклическим. Обычно цикл выполняется для ряда последова­тельных значений некоторой переменной, которая называется параметром (реже счетчиком) цикла. В зависимости от текущего значения параметра цикла, во-первых, могут изменяться численные значения обрабатываемых в цикле переменных, и, во-вторых, в определенный момент цикл заканчивается.

Для записи циклических алгоритмов в языке Си существует три различных оператора цикла. Каждый их них более удобен в определенной ситуации хотя в принципе они практически взаимозаменяемы.

Оператор цикла for

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

for (выражение_1; выражение_2; выражение_3)

{

тело цикла

}

В этой записи:

выражение_1 – задает начальное значение параметра цикла;

выражение_2 – условие продолжения цикла;

выражение_3 – действие, выполняемое чаще всего над параметром цикла после каждой итерации тела цикла перед очередной проверкой условия продолжения.

Алгоритм суммирования членов ряда S = 1 + 1/2 + 1/3 + 1/4 +
+... + 1/9 = может быть записан на языке Си очень просто:

double s = 0.; int k;

for (k = 1; k <= 9; k++)

s += 1. /k;

Обратите особое внимание на вещественную единицу в числителе дроби. Если записать последний оператор как s=s+ 1 /k, то расчет будет неверен, поскольку деление будет производиться согласно арифметике целых чисел – результат деления тоже будет целым числом. Поскольку числитель дроби 1 /k для всех членов ряда, кроме первого, меньше знаменателя, для них результат деления дает нуль. Поэтому итоговое значение величины s будет равно значению только первого члена ряда, т. е. единице. По этой же причине тип переменной s выбран не int, а double, чтобы не терять десятичные знаки.

Любое из трех выражений в заголовке цикла for независимо от других может быть опущено, но все символы "точка с запятой" обязательно сохраняются. Так, оператор

for (;;)

{ тело цикла }

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

int k = 10;

for (;;)

{.........

k--;

if (k) break;

}

Если опущено выражение_2, то считается, что оно истинно. В этом случае также получается бесконечный цикл.

Работа оператора for описывается такой последовательностью шагов:

1. Вычисляется выражение_1 (если оно присутствует).

2. Вычисляется выражение_2 (если оно присутствует). Если получается нуль (ложь), то цикл завершается.

3. Выполняется тело цикла.

4. Вычисляется выражение_3 (если оно присутствует).

5. Переход к п. 2.

Любое выражение, записываемое в заголовке цикла, может быть довольно сложным и даже представлять собой последовательность нескольких выражений, соединенных операцией "запятая":

for (i= 0; i< 10; cout<<"\n"<<i, i+= 2);

Приведенный фрагмент цикла обеспечивает вывод на экран чисел 0, 2, 4, 6, 8 "столбиком".

Предупреждение. Параметр цикла нельзя принудительно изменять внутри цикла посредством оператора присваивания, но его можно (и часто весьма удобно) использовать как простую переменную, например, как индекс элемента массива.

Оператор цикла while

Цикл for всегда можно заменить эквивалентной записью цикла while (...):

выражение_1;

while (выражение_2)

{

тело цикла;

выражение_3;

}

Общий вид записи оператора:

while (выражение)

{ тело цикла }

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

Наш пример суммирования девяти членов ряда можно при помощи оператора while записать так:

double s = 0.; int k = 1;

while (k<= 9)

{

s += 1. /k;

k++;

}

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

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

while (k<= 9)

s += 1. /k++;

Если выражение в заголовке оператора всегда истинно, то получается бесконечный цикл:

while (1)

{.......}

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

Запишем наш пример, используя бесконечный цикл:

int k= 1;

double s = 0.;

while (1)

{

s += 1. /k++;

if (k > 9) break;

}

Выполнение оператора break приводит к немедленному прекращению цикла и передаче управления следующему оператору программы, записанному сразу после оператора цикла.

Итак, цикл while завершается в следующих случаях:

· обратилось в нуль выражение, записанное в заголовке;

· в теле цикла встретились операторы break, exit;

· в теле цикла выполнился оператор return;

· в случае аварийного завершения программы (например, деление на ноль).

Оператор цикла do... while

Общий вид такого оператора цикла:

do

{ тело цикла }

while (условие);

Выполнение операторов тела цикла многократно повторяется, пока записанное условие остается истинным, т. е. ненулевым. В отличие от цикла while здесь проверка условия на истинность производится после выполнения операторов тела цикла. Поэтому цикл обязательно выполнится хотя бы один раз, даже если проверяемое условие изначально ложно. Прекращение выполнения цикла do... while происходит в случаях, аналогичных циклу while.

Оператор continue

Может использоваться во всех трех типах циклов. Выполнение оператора continue в теле цикла вызывает досрочное прекращение текущей итерации и переход к следующей. Это равносильно безусловному переходу на закрывающую скобку тела цикла.

Следующий фрагмент обеспечивает ввод цифр вплоть до нажатия клавиши Enter, игнорируя нажатие остальных клавиш.

while ((ch=getch ()) != '\r')

{

if (!isdigit (ch))

continue;

putchar (ch);

}

Можно было обойтись и без оператора continue. Достаточно было сменить проверяемое условие на противоположное:

while ((ch=getch ()) != '\r')

if (isdigit (ch))

putchar (ch);





Дата публикования: 2014-11-29; Прочитано: 467 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.011 с)...