Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 2 (СПбГУТ).doc
Скачиваний:
47
Добавлен:
10.09.2019
Размер:
801.79 Кб
Скачать

1. Основы программирования на языке Си

Последняя тема (“Организация циклов”), рассмотренная в первой части пособия, осталась незаконченной. С изложения нерассмотренных вопросов этой темы и начинается вторая часть пособия.

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

В общем случае цикл, управляемый инструкцией while, может состоять из трех структурных частей. К первой части относятся элементы инициализации. Вторую часть составляет сама инструкция while, а последнюю часть, часто называемую телом, − любая единственная инструкция языка Си. Если в теле цикла должны находиться несколько инструкций, их следует объединить с помощью фигурных скобок в составную инструкцию. Таким образом, в общем случае цикл, построенный на основе инструкции while, имеет следующий формат:

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

while(выражение) // Инструкция while инструкция // Единственная инструкция продолжение_программы

Заключенное в круглые скобки выражение относится к категории полных выражений (оно не является подвыражением другого выражения). Поэтому к моменту начала выполнения тела цикла все побочные эффекты при его вычислении будут завершены.

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

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

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

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

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

do // Начало инструкции do while инструкция // Единственная инструкция (тело цикла) while(выражение); // Конец инструкции do while продолжение_программы

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

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

Примеры применения циклов, управляемых инструкцией do while, приведены в разделе 2.4.

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

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

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

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

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

2. Выполнить проверку окончания цикла.

3. Увеличить текущее значение суммы s на величину x.

Анализ последовательности требуемых действий показывает, что для решения данной задачи предпочтительней такая структура цикла, при которой операция (2) − проверка окончания цикла находится в середине его тела. Для окончания работы цикла можно предложить пользователю ввести любое отрицательное число.

Программа, решающая поставленную задачу, приведена ниже.

/* Файл summa2_2.c */ #include<stdio.h> int main(void) { double x, s = 0; while(1) { printf(“Введите положительное число (для завершения” “вычислений введите отрицательное число)”); scanf(“%lf”, &x); if(x < 0) break; s += x; } printf(“summa=%10.3f\n”, s); getchar(); return 0; }

Заметим, что при организации цикла while(x >= 0) будем иметь дублирование кода в связи с тем, что инструкции printf() и scanf() пришлось бы писать дважды: (1) в подготовке цикла, (2) в теле цикла.