Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
  1. Цикл, управляемый инструкцией for

Как отмечалось выше, в общем случае цикл, управляемый инструкцией for,может состоять из трех частей. К первой необязательной части цикла могут относиться элементы инициализации цикла. Вторую часть составляет сама инструкцияfor, а последнюю часть, часто называемую телом, – любая другая единственная инструкция языка Си. Говорят, что инструкцияfor управляет работой тела цикла. В случае необходимости управлять в цикле работой нескольких инструкций их следует объединять в составную инструкцию.

В общем случае цикл, построенный на основе инструкции for,имеет следующий формат:

[инструкции_инициализации]for([выражение1];[выражение2];[выражение3])инструкцияпродолжение_программы

Здесь инструкции_инициализации– необязательная группа инструкций, используемая для инициализации цикла,for– зарезервированное слово,выражение1,выражение2ивыражение3– необязательные выражения, аинструкция– единственная инструкция языка Си.

Выражения выражение1,выражение2ивыражение3, входящие в состав инструкцииfor, имеют следующее функциональное назначение:

выражение1– инициализация цикла,

выражение2 – проверка нахождения в цикле,

выражение3– продвижение цикла.

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

Использование внешних инструкции_инициализацииможет быть обусловлено соображениями повышения читабельности программного кода.

Работу рассматриваемого цикла удобно иллюстрировать следующей схемой алгоритма.

Следует отметить, что эта схема совпадает с функциональной схемой цикла, которая приводилась в пункте 1.26. Порядок работы цикла, управляемого инструкцией for, состоит в следующем:

● Выполняются инструкции_инициализациии вычисляется значение выражениявыражение1 (символ 1 схемы алгоритма).

● Оценивается значение выражения выражение2 (символ 2). Если значение этого выражения равно true, то выполняется тело цикла (символ 3). В противном случае управление передается инструкции, непосредственно следующей за телом цикла (символ 5).

● После выполнения тела цикла вычисляется выражение выражение3 (символ 4). После этого вновь вычисляется выражениевыражение2.

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

Перейдем к рассмотрению примера организации цикла, управляемого циклической инструкцией for. Приведем решение типичной задачи, требующей организации арифметического цикла. Вначале рассмотрим принципы организации арифметических циклов.

Принципы организации арифметических циклов.

Общим при организации арифметических циклов является использование специальной управляющей переменной целого типа. Такую переменную часто называют счетчиком. В качестве синонимов используются следующие термины: параметр цикла и индекс цикла.

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

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

● начальное значение,

● конечное значение,

● порядок изменения переменной в процессе выполнения цикла.

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

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

Перейдем теперь к рассмотрению конкретного примера.

Постановка задачи. Вычислить значение величины “y”, заданной следующим образом

y=

Решение. В настоящей задаче следует выполнить сложение n слагаемых, каждое из которых полностью определяется значением двух переменных: i (переменная суммирования) и х. В связи с тем обстоятельством, что количество слагаемых в вычисляемой сумме до начала работы цикла известно (оно равно n - 1), задача может быть решена путем организации арифметического цикла. Удобно ее решать с применение цикла, управляемого инструкциейfor. В качестве управляющей переменной (счетчика) удобно использовать переменную суммирования i. В этом цикле необходимо значения переменной i последовательно увеличивать от значения i == 2 до значения i == n. Инициализацию переменной суммирования (i) и сравнение текущего значения этой переменной с ее наибольшим значением (n) можно поручить инструкцииfor. Эта же инструкция может выполнять на каждом шаге цикла увеличение переменной суммирования на 1. Сложнее дело обстоит с реализацией процесса накопления суммы. В теле цикла необходимо вычислять очередное слагаемое по формуле i / (i + x) и добавлять его к уже накопленному значению суммы. Если у – имя переменной, выступающей в роли накопителя суммы, то для накопления суммы необходимо в теле цикла написать следующую инструкцию

y += i / (i + x);

Переменную – накопитель суммы “y” необходимо до входа в цикл обнулить. Это требуется для того, чтобы при первом выполнении тела цикла значение суммы было равно первому слагаемому.

Изложенные соображения приводят к следующей программе.

/* Файл summa.c */. #include<stdio.h> #include<conio.h> int main(void) { clrcsr(); int i, n; double x, y;

printf(“n=”) scanf(“%d”, &n); printf(“x=”); scanf(“%lf”, &x); y = 0; for(i = 2; i <= n; i++) y += i / (i + x); printf(“y=%0.4\n”, y); getch(); return 0; }

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

/* Файл summa.c */. #include<stdio.h> #include<conio.h> int main(void) { clrcsr(); int n; printf(“n=”) scanf(“%d”, &n); double x; printf(“x=”); scanf(“%lf”, &x); double y = 0; for(int i = 2; i <= n; i++) y += i / (i + x); printf(“y=%0.4g\n”, y); getch(); return 0; }