В языке Си существует 3 вида циклов: 1) цикл с параметром или цикл типа for; 2) цикл с предусловием или цикл типа while, 3) цикл с постусловием или цикл типа do ... while . Во всех этих циклах условие продолжения цикла заключается в круглые скобки. В циклах типов for и while повторяющаяся часть состоит из одного оператора; если требуется выполнить в цикле несколько операторов, они заключаются в фигурные скобки, образуя составной оператор. В цикле с постусловием тело цикла помещается между словами do и while. В отличие от цикла с предусловием, цикл с постусловием выполнится хотя бы один раз. Циклы с пред- и постусловием продолжаются, если условие продолжения истинно.
Для цикла типа for заголовок состоит из трех разделов: инициализации (присваивания начальных значений), проверки условия повторения, модификации (изменения параметров). Разделителем между разделами заголовка служит точка с запятой.
Пример вычисления суммы квадратов натурального ряда чисел от 1 до n.
S= = 12
+ 2 2 + . . . + n 2.
// сумма квадратов натурального ряда чисел #include <stdio.h> main() { int S,n,i; printf("\n Введите n "); scanf("%d",&n); for (S=0, i=1; i<=n; i++) S+=i*i; // соответствует S=S+i*i printf ("n=%d S=%d",n,S); }
В разделе инициализации присваиваются начальные значения переменным S и i. При i, не превышающем n, цикл повторяется, иначе выполняется выход из цикла. Оператор инкремента i++ (или декремента i--), эквивалентен i=i +1 (i=i-1). Для досрочного выхода из цикла и перехода на следующий оператор после цикла используется оператор break. Для пропуска всех операторов, оставшихся до конца тела цикла и перехода к следующему повторению цикла используется оператор continue.
Изменим условие в предыдущем примере: Определить число n, при котором сумма чисел S предыдущего ряда не превысит величину K, введенную с клавиатуры. Такую программу можно реализовать с помощью циклов предусловия или постусловия следующим образом:
// цикл while #include <stdio.h> #include <conio.h> main() {int K,S, i; clrscr(); // очистка экрана перед выводом printf ("Введите К "); scanf ("%d", &K); // цикл с предусловием S=0; i= 0; while ( S<K) {i++ ; S+=i*i }; printf ("n=%d S=%d \n", i, S); getch(); } // цикл do…while #include <stdio.h> #include <conio.h> main() {int K,S, i; clrscr(); // очистка экрана перед выводом printf ("Введите К "); scanf ("%d", &K); //цикл с постусловием S=0; i=0; do {i++; S+=i*i; } while ( S<K) ; printf ("n=%d S=%d \n", i, S); getch(); }
Отличие этих программ: если ввести К<1, то в программе с предусловием получим S=0, i=0 ; а в программе с постусловием S=1, i=1.
1. Какой алгоритм является алгоритмом циклической структуры?
2. Типы циклов в языке Си.
3. Какой цикл выполнится хотя бы один раз? А какой - ни разу?
4. Когда тело цикла заключается в фигурные скобки?
5. Поясните алгоритм работы цикла for.
6. При каком условии заканчивается цикл while? do..while?