Лекция: Средства разработки программ циклической структуры

 

Программой циклической структуры называют такую программу, в которой опе-раторы могут повторно, при изменяющихся значениях переменных выполняться не-сколько раз, образуя цикл. Различают следующие виды циклов (для их организации ис-пользуются специальные сложные операторы — операторы циклов):

 

цикл с заданным числом повторений илицикл с параметром (операторы циклаfor),цикл с предусловием (оператор циклаwhile),

 

цикл с постусловием (оператор циклаdo while).

 

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

 

Цикл с параметром (for)

 

Структура оператора цикла for описывается синтаксической диаграммой for ( Сп1 ; W ; Сп2 ) Oп

где используются следующие обозначения:

 

Сп1 – список операторов присваивания, задающих начальные значения одной или нескольким переменным — параметрам цикла, которые могут испольльзоваться в выра-жении W и других частях цикла. Список может отсутствовать, если параметры получили требуемые значения до входа в цикл.

W – выражение, вычисляемое перед передачей управления в тело цикла, если его значение «истина» (не ноль), или следующему за циклом оператору, если его значение «ложь» (ноль). Выражение может отсутствовать, если выход из цикла организован в его теле, например, с помощью оператора break (см. ниже).

 

Сп2 – список операторов, задающих новые значения одному или нескольким па-раметрам цикла. Он может отсутствовать, если значения параметров цикла изменяются, при необходимости, в теле цикла.

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

 

«Практикум по программированию на языке C в среде VS C++»


 

Алгоритма выполнения цикла представляет следующая схема

 

 

Например, в программе

 

#include «stdafx.h» #include «math.h»

 

int _tmain(int argc, _TCHAR* argv[])

 

{

 

int i;

 

for (i=0; i<=6; i++) printf("%10d%8.2f\n",i*10,sin(3.14/18*i));

 

return 0;

 

}

 

 

оператор printf будет выполняться 7 раз при значениях параметра целого типа i, изменяющемся от 0 до 6 с шагом 1.

 

На экран будет выведена таблица, в первом столбце которой будут целые числа 0, 10, 20, …, 60, представляющие величины углов в градусах, а во втором – соответствую-щие им значения синуса:

 

0 0.00

 

10 0.17

 

20 0.34

 

30 0.50

 

40 0.64

 

 

«Практикум по программированию на языке C в среде VS C++»


 

50 0.77

 

60 0.87

 

Параметром цикла for может быть и вещественная переменная, а при наличии в списках Сп1 и Сп2 нескольких операторов они будут выполняться в порядке слева на-право, как в следующем примере

 

int i; float r;

.. .

 

for (i=1, r=-1.0; i<=6; ++i, r/=-i) printf("%10d%8.4f\n",i,r);

Результатом выполнения этого фрагмента программы будет таблица

 

1 -1.0000

 

2 0.5000

 

3 -0.1667

 

4 0.0417

 

5 -0.0083

 

6 0.0014

 

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

При наличии в первом и последнем разделах заголовка цикла for нескольких операторов (как в рассмотренном примере) они должны разделяться знаком «запятая», и выполняться будут в порядке слева направо. Это позволяет сделать компактное описание цикла, возможно, в ущерб пониманию алгоритма. Для улучшения читаемости алгоритма лучше вынести все работы, связанные с собственно обработкой данных, а не организа-цией цикла, за пределы его заголовка, разместив соответствующие операторы в теле цикла и, если требуется, до входа в цикл. Для рассмотренного примера это выглядело бы так

 

int i; float r;

.. .

 

r=-1.0;

 

for (i=1; i<=6; ++i)

 

{

 

 

«Практикум по программированию на языке C в среде VS C++»


 

printf("%10d%8.4f\n",i,r); r/=-i-1;

 

}

 

 

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

 

for (i=1; fabs(r)>0.0013; ++i)

 

Цикл с предусловием (while)

 

Структура оператора цикла while описывается синтаксической диаграммой while ( W ) Oп

где используются следующие обозначения: W – выражение,

Oп – тело цикла — оператор или блок, выполняемый внутри цикла.

 

Заголовок цикла – конструкция, предшествующая части Оп, управляет выполне-нием цикла следующим образом: тело цикла будет последовательно выполняться, пока выражение W имеет отличное от нуля значение («истина»), или не будет выполняться вообще, если при входе в цикл значение выражения окажется равным нулю («ложь»).

Например, фрагмент программы i=0;

 

while (i<=60)

 

{

 

printf("%10d%8.2f\n",i,sin(3.14/180*i)); i=i+10;

 

}

 

буде выполнять ту же работу, что и в первом из предыдущих примеров на опера-тор for.

 

Цикл с постусловием (do while)

 

Структура оператора цикла do while описывается синтаксической диаграммой

do Oп while ( W ) ;

 

«Практикум по программированию на языке C в среде VS C++»


 

Внутри такого цикла может находиться либо один оператор, либо блок, который будет выполняться один или более раз до получения выражением W значения ноль («ложь»)… Например, такую же таблицу, что и в первом примере с применением опера-тора for, будет выводить следующий фрагмент программы:

 

i=0; do

{

 

printf("%10d%8.2f\n",i,sin(3.14/180*i)); i=i+10;

 

}

 

while (i<=60);

 

Существует возможность и досрочного выхода из любого цикла, организованного рассмотренными операторами, либо с помощью оператора безусловного перехода goto (их мы не будем использовать), либо с помощью оператора break.

 

В теле любого из рассмотренных циклов допускается использовать оператор continue. Его действие сводится к тому, что сразу происходит переход к очередному выполнению тела цикла (в циклах for с очередным значением параметра), или выход из цикла, если выполнено условие его завершения.

 

Следующий пример — на использование операторов break и continue

 

.. .

 

#include «conio.h»

 

.. .

 

int d,i;

 

.. .

 

d=0;

 

for (i=1; i<=3; ++i)

 

{

 

printf(Ruc("\nВведите перввый символ пароля: "));

 

if (getch() != 'a') //getch требует #include «conio.h» continue;

printf(Ruc("\nВведите второй символ пароля: ")); if (getch() == 'b')

 

{

 

 

«Практикум по программированию на языке C в среде VS C++»


 

d=1; break;

 

}

 

}

 

 

if (!d)

 

{

 

printf(Ruc("\nОшибка! Работа программы будет завершена.\n")); return 0;

 

}

 

printf(Ruc("\nВы допущены к работе с программой. \n"));

 

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

 

 

В этом примере программа предоставляет три попытки ввода пароля из двух сим-волов при запуске в режиме без отладки (Debug\Start Without Debugging). Ввод символа выполняется функцией getch(), требующей испоьзования директивы #include «conio.h». Функция возвращает символ нажатой клавиши без его отображения в окне программы. При ошибке ввода первого символа оператором continue происходит пе-реход к очередному выполнению тела цикла – повторному вводу первого символа паро-ля. Если первый символ введён правильно, а второй – нет, то очередная попытка ввода пароля также начинается с ввода первого символа.

 

Если за три попытки не удалось правильно ввести пароль (переменная d после выхода из цикла сохранила значение 0), то программа выводит сообщение «Ошибка! Работа программы будет завершена.» и завершает работу.

При успешном вводе пароля на любом шаге выполнения тела цикла переменная d получит значение 1, произойдёт выход из цикла по оператору break и пользователь по-

лучит сообщение «Вы допущены к работе с программой.»

 

еще рефераты
Еще работы по информатике