Материал: lectures_3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

1

 

Инструкции_инициализации

2

Нет

 

выражение

 

Да

3

 

 

инструкция тела цикла

4

 

 

Продолжение_программы

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

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

чисел.

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

Вводить очередное число x,

Увеличивать текущее значение суммы summa на величину

введенного числа.

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

Ниже приводится программа, реализующая требуемые вычисления. В программе использованы следующие локальные переменные: summa - искомая сумма, x – очередное введенное число. В комментариях к программе определены функциональные компоненты цикла.

61

//Файл summa2.c #include<stdio.h>

int main(void)

{

double x, summa = 0;

//Инициализация цикла

printf(“Введите

положительное

число

(для

завершения

 

вычислений

введите

отрицательное

число )”);

scanf(“%lf”, &x);

 

 

 

 

 

 

while(x > 0) //Инструкция

while (Заголовок цикла )

{

// начало

тела

цикла

 

 

 

summa += x;

 

 

 

 

 

 

 

 

printf(“Введите

положительное число (для

завершения

 

вычислений

введите

отрицательное

число )”);

scanf(“%lf”, &x);

}// Конец тела цикла

printf(“summa=%10.3g\n”, summa); return 0;

}

31.Цикл, управляемый инструкцией do … while

Вотличие от ранее рассмотренных двух циклических управляющих инструкций цикл, управляемый инструкцией do while, относится к

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

Цикл, управляемый инструкцией do while, имеет следующий формат:

Инструкции_инициализации

*/

do

/* Начало инструкции while

инструкция

/* Единственная инструкция (тело цикла)*/

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

/* Конец инструкции while

*/

продолжение_программы

Работу цикла удобно пояснить схемой алгоритма, приведенной ниже.

62

1

Инструкции_инициализации

2

инструкция (тело цикла)

Нет

3

выражение

Да

4

Продолжение_программы

Компонент инструкция, составляющая тело цикла (символ 2 схемы алгоритма), многократно выполняется в процессе работы цикла, пока логическая оценка компонента выражение (символ 3) дает значение, равное

true.

Рассмотрим пример задачи, решение которой приводит к целесообразности применения цикла, управляемого инструкцией do while.

Постановка задачи.

Последовательность целых чисел ai (i = 1,2, …) формируется в соответствии со следующим правилом:

i

 

 

 

ai = åj2

 

 

 

j=1

 

 

 

Требуется определить номер и значение первого элемента

последовательности, который удовлетворяет условию

ai

>

n, где “n” –

произвольное целое число.

 

 

 

Решение

 

 

 

С целью уяснения задачи получим вручную решение для конкретного

значения величины “n”. Пусть значение величины

n

==

25. Получим

следующую последовательность чисел: a1 == 1, a2

==

5,

a3 == 14, a4

== 30. На этом ручные вычисления элементов последовательности чисел можно прекратить. Дело в том, что уже получен элемент

63

последовательности, удовлетворяющий заданному условию (ai > n). Таким образом, искомый элемент последовательности имеет номер, равный 4 и значение, равное 30.

Следует отметить, что рассматриваемая задача всегда имеет решение, т.к. элементы ai образуют возрастающую последовательность.

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

Обозначим через i – номер очередного вычисляемого элемента последовательности, а через current_item – значение этого элемента. Для вычисления current_item следует использовать принцип накопления суммы. Желательно построить цикл таким образом, чтобы после окончания его работы значение переменной i совпадало с номером искомого элемента. Это можно обеспечить в том случае, когда продвижение цикла, обеспечиваемое инструкцией i++; будет расположено до рабочей части цикла, представленной инструкцией current_item += i * i;.

Программа, разработанная с учетом изложенных соображений,

приведена ниже.

#include<stdio.h> int main(void)

{

int i, n;

long current_item; printf(“n=”); scanf(“%d”, &n);

i = 0; current_item = 0; do

{

i++;

current_item += i * i; }while(current_item <= n);

printf(“Элемент последовательности с номером = %d”

и значением, равным %ld является первым”

элементом, удовлетворяющим заданному”

условию\n”, i, current_item);

getch(); return 0;

}

32.Цикл с выходом

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

64

применять в том случае, когда проверка условия в начале или конце приводят к ситуации, которую иногда называют “полтора цикла”. Элементы такой ситуации имеют место в программе, приведенной в пункте 1.31. В этой программе имеются вызовы функций printf() и scanf() до входа в цикл, затем такие же вызовы этих функций находятся в конце тела цикла. Такое дублирование кода может привести к ошибкам при модификации текста программы в процессе ее эксплуатации. При модификации текста программист может забыть о необходимости согласованного изменения двух идентичных фрагментов кода, что и может оказаться источником ошибок.

Циклы с выходом реализованы только в Visual Basic. В языке Си такие циклы можно построить, используя циклические инструкции for и while и инструкцию break. Для этого достаточно организовать “бесконечный” цикл, В теле этого цикла расположить инструкцию if, которая совместно с инструкцией break позволила бы в требуемый момент завершить выполнение цикла.

Модифицируем программу, приведенной в пункте 1.31, заменив использованный в ней цикл циклом с выходом.

/* Файл summa2_2.c */

/* Модернизированный вариант решения задачи , приведенной в пункте 1.31. В новом варианте используется цикл с выходом

*/

 

#include<stdio.h>

 

int main(void)

 

{

 

double x, summa = 0;

 

while(1)

 

{

 

printf(“Введите положительное

число (для завершения

вычислений введите

отрицательное число )”);

scanf(“%lf”, &x);

 

if(x <= 0)

 

break;

 

summa += x;

 

}

 

printf(“summa=%10.3f\n”, summa); return 0;

}

33. Вложенные циклы

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

Цикл, в теле которого находится один или несколько других циклов называется внешним. Цикл, находящийся в теле другого цикла, называется внутренним.

65

Источник: https://studfile.net/preview/16544272/