Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

Циклы for

C

Формат:

for([<выражение 1>];[<выражение 2>];[<выражение 3>])[<инструкция>];

Эквивалентная схема

<выражение 1>;

while(<выражение 2>){

<инструкция>

<выражение 3>;

}

Замечания.

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

2. Тело цикла – одна инструкция, которая может отсутствовать.

Примеры.

Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

u=v=0;

for(i=0; i<100; i++){

if(a[ i ]>0)u+=a[ i ]; if(a[ i ]<0)v+=a[ i ];

}

Найти xn/n!,n=1,2,..., пока |un|>5e-6.

s=0;

u=1;

for(n=1; fabs(u)>5e-6; n++){

u *= x/n;

s += u;

}

Определить число цифр натурального числа n.

for(k=0; n!=0; n/=10)k++;

Найти первый отрицательный элемент массива. Если его нет, то ответ = 0.

for(i=0; i<100 && a[ i ]>=0; i++); // Тело цикла отсутствует

if(i==100){

y=0;

}else{

y=a[ i ];

}

Замечания.

1. Как видно из примеров, почти все циклы используют для своей организации некоторую переменную, которую называют параметром или счетчиком цикла. См. переменные i, n, k, i в порядке следования примеров. Эту переменную не рекомендуется изменять в теле цикла, поскольку логика алгоритма становится запутанной.

2. После окончания цикла параметр сохраняет последнее присвоенное значение. В последнем примере i равно 100, если отрицательных элементов в массиве нет, или равно индексу первого по порядку следования в массиве отрицательного элемента.

3. Это наиболее универсальная форма инструкции цикла.

Basic

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

Формат:

for <счетчик>=<начало> to <конец> [step <шаг>]

<инструкции>

next [<счетчик>]

Эквивалентная схема:

<счетчик>=<начало>

do while <шаг> < 0 and <счетчик> >= <конец> or _

<шаг> >=0 and <счетчик> <= <конец>

<инструкции>

<счетчик> += <шаг>

loop

Замечания.

1. <счетчик> - переменная (без индексов!) числового типа, <начало>, <конец>, <шаг> - арифметические выражения.

2. Если опция (часть инструкции) step отсутствует, то шаг равен 1.

3. Отсутствие <счетчика> в инструкции next не влияет на работу цикла, являясь, по существу, дополнительным комментарием, особенно при вложенных циклах, о которых речь пойдет ниже.

4. Значение <счетчика> после окончания цикла равно последнему присвоенному значению (как в языке C).

5. Значения <начало>, <шаг> и <конец> вычисляются 1 раз при входе в цикл. Изменение переменных, входящих в эти выражения, в инструкциях тела цикла не влияют на число повторений, поэтому так действовать не рекомендуется.

Пример. Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

u=0 : v=0

for i=1 to 100

if a(i)>0 then u += a[i] : if a(i)<0 then v += a(i);

next i

5.6.2. Циклы с постусловием

Используются существенно реже, потому что основное отличие их от предыдущих инструкций заключается в том, что в них тело цикла в первый раз выполняется без проверки условия продолжения (прекращения) цикла. Единственный смысл применения такой конструкции, на наш взгляд, состоит в получении в теле цикла с помощью операций ввода-вывода информации из внешней среды, которая используется в условии. Заметим, что подобная манипуляция легко реализуется с помощью циклов с предусловием заданием условия, которое при первом проходе по циклу заведомо выполняется. Тем не менее рассмотрим инструкции, реализующие такие циклы.

C

Формат:

do <инструкция> while <условие>;

Эквивалентная схема:

label: <инструкция>;

if(<условие>)goto label;

Пример. Дано: {ai}, i=1...100. Найти ai и ai.

s=i=0;

p=1;

do { s += a[ i ];

p *= a[ i ];

i++;

} while(i<100);

Basic

Формат:

do

<инструкции>

loop {while | until} <условие>

Пример. Тот же.

s=0 : i=0

p=1

do

s += a( i )

p *= a( i )

i += 1

loop while i<100