Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория ответы.doc
Скачиваний:
39
Добавлен:
24.12.2018
Размер:
1.61 Mб
Скачать
  1. Алгоритмы циклического типа. Цикл с фиксированным числом повторений for. Параметр цикла. Инструкции break, continue. Бесконечный цикл. Примеры.

Цикл

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

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

for {инициализация; выражение; инкремент) инструкция;

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

foг(инициализация; выражение; инкремент)

последовательность инструкций;

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

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

#include <iostream.h>

#include <math.h>

int main(){

int num; double sq_root;

for(num=l; num < 100; num++)

{ sq_root = sqrt( (double) num); cout <<num << " " << sq_root << '\n'

return 0; }

Вот как выглядят первые строки результатов, выводимых этой программой.

: 1

2 1.41421

2 1.73205

  1. 2

  2. 2.23607

6 2.44949 " 2.64575

  1. 2.82843

  2. 3

  1. 3.16228

  2. 3.31662

В этой программе использована еще одна стандартная функция C++: sqrt (). Эта функция возвращает значение квадратного корня из своего аргумента. Аргумент должен иметь тип double, и именно поэтому при вызове функции sqrt () параметр num приводится к типу double. Сама функция также возвращает значение типа double. Обратите внимание на то, что в программу включен заголовок <math.h>, поскольку этот заголовочный файл обеспечивает поддержку функции sqrt ().

Важно! Помимо функции sqrt (), C++ поддерживает широкий набор других математических функций, например sin(), cos(), tan О, log (), ceil () и floor (). Помните, что все математические функции требуют включения в программу заголовка <math.h>.

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

#include <iostream>

int main() {

int i;

for(i=100; i >= -100; i = i-5) cout << i << ' ';

return 0; }

Важно понимать, что условное выражение всегда тестируется в начале выполнения цикла for. Это значит, что если первая же проверка условия даст значение ЛОЖЬ, код тела цикла не выполнится ни разу. Вот пример:

for (count=10; count < 5; count++)

cout << count; // Эта инструкция не выполнится.

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

Вариации на тему цикла for

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

for(x=0, y=10; х<=10; ++х, —у) cout « х << ' ' << у << '\n';

Здесь запятыми отделяются две инструкции инициализации и два инкрементных выражения. Это делается для того, чтобы компилятор "понимал", что существует две инструкции инициализации и две инструкции инкремента (декремента). В C++ запятая представляет собой оператор, который, по сути, означает "сделай это и то". Другие применения оператора "запятая" мы рассмотрим ниже в этой книге, но чаще всего он используется в цикле for. При входе в данный цикл инициализируются обе переменные — х и у. После выполнения каждой итерации цикла переменная х инкрементируется. а переменная у декрементируется. Использование нескольких управляющих переменных в цикле иногда позволяет упростить алгоритмы. В разделах инициализации и инкремента цикла for можно использовать любое количество инструкций, но обычно их число не превышает двух.

Условным выражением, которое управляет циклом for, может быть любое допустимое С++-выражение. При этом оно необязательно должно включать управляющую переменную цикла. В следующем примере цикл будет выполняться до тех пор, пока пользователь не нажмет клавишу на клавиатуре. В этой программе представлена еще одна очень важная) библиотечная функция: kbhit (). Она возвращает значение ЛОЖЬ, если ни одна клавиша не была нажата на клавиатуре, и значение ИСТИНА в противном случае. Функция не ожидает нажатия клавиши, позволяя тем самым циклу выполняться до тех пор, пока оно не произойдет. Функция kbhit () не определяется стандартом C++, но включена в расширение языка C++, которое поддерживается большинством компиляторов. Для ее использования в программу необходимо включить заголовок <conio.h>. (Этот заголовок необходимо указывать с расширением . h, поскольку он не определен стандартом C++.)

#include <iostream.h>

#include <conio.h>

int main() {

int i; // Вывод чисел на экран до нажатия любой клавиши.

for(i=0; !kbhit(); i++) cout << i << ' ';

return 0;

}

На каждой итерации цикла вызывается функция kbhit (). Если после запуска программы нажать какую-нибудь клавишу, эта функция возвратит значение ИСТИНА, в результате чего выражение ! kbhit () даст значение ЛОЖЬ, и цикл остановится. Но если не нажимать клавишу, функция возвратит значение ЛОЖЬ, а выражение ! kbhit () даст значение ИСТИНА, что позволит циклу продолжать "крутиться".

Важно! Функция kbhit () не входит в состав стандартной библиотеки C++. Дело в том, что стандартная библиотека определяет только минимальный набор функций, который должны иметь все С++-компиляторы. Функция kbhit () не включена в этот минимальный набор, поскольку не все среды могут поддерживать взаимодействие с клавиатурой. Однако функцию kbhit () поддерживают практически все серийно выпускаемые С++-компиляторы. Производители компиляторов могут обеспечить поддержку большего числа функций, чем это необходимо для соблюдения минимальных требований по части стандартной библиотеки C++. Дополнительные же функции позволяют шире использовать возможности среды программирования. Если для вас не проблематичен вопрос переносимости кода в дру­гую среду выполнения, вы можете свободно использовать все функции, поддерживаемые вашим компилятором.

Отсутствие элементов в определении цикла

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

#include <iostream.h>

int main(){

int x;

for(x=0; x != 123; ) {

cout << "Введите число: "; cin >> x; }

return 0; }

Здесь в заголовке цикла for отсутствует выражение инкремента. Это означает, что при каждом повторении цикла выполняется только одно действие: значение переменной х сравнивается с числом 123. Но если ввести с клавиатуры число 123, условное выражение, проверяемое в цикле, станет ложным, и цикл завершится. Поскольку выражение инкремента в заголовке цикла for отсутствует, управляющая переменная цикла не модифицируется.

Приведем еще один вариант цикла for, в заголовке которого, как показано в следующем фрагменте кода, отсутствует раздел инициализации.

cout << "Введите номер позиции: "; cin >> х;

for( ; х < limit; x++) cout << ' ';

Здесь пустует раздел инициализации, а управляющая переменная х инициализируется значением, вводимым пользователем с клавиатуры до входа в цикл.

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

Бесконечный цикл

Бесконечный цикл — это цикл, который никогда не заканчивается.

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

for (;;)

Этот цикл будет работать без конца. Несмотря на существование некоторых задач программирования (например, командных процессоров операционных систем), которые требуют наличия бесконечного цикла, большинство "бесконечных циклов" — это просто циклы со специальными требованиями к завершению. Ближе к концу этой главы будет показано, как завершить цикл такого типа. (Подсказка: с помощью инструкции break.)

Циклы временной задержки

В программах часто используются так называемые циклы временной задержки. Их задача — просто "убить время". Для создания таких циклов достаточно оставить пустым тело цикла, т.е. опустить те инструкции, которые повторяет цикл на каждой итерации. Вот пример:

fог(х=0; х<1000; х++) ;

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

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

Использование инструкции break для выхода из цикла

Инструкция break позволяет немедленно выйти из цикла.

С помощью инструкции break можно организовать немедленный выход из цикла, опустив выполнение кода, оставшегося в его теле, и проверку условного выражения. При обнаружении внутри цикла инструкции break цикл завершается, а управление передается инструкции, следующей после цикла. Рассмотрим простой пример.

#include <iostream.h>

int main (){

int t;

// Цикл работает для значений t от 0 до 9, а не до 100!

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

if(t==10) break;

cout << t << ' ';

}

return 0; }

Эта программа выведет на экран числа от 0 до 9, а не до 100, поскольку инструкция, break при значении t, равном 10, обеспечивает немедленный выход из цикла.

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

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

// Какие-то действия.

if(kbhit()) break;

}

Инструкция break приводит к выходу из самого внутреннего цикла. Рассмотрим пример.

#include <iostream.h>

int main() {

int t, count;

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

count =1;

for(;;) {

cout << count << ' ';

count++;

if (count==10) break;

}

cout << '\n'; }

return 0; }

Эта программа 100 раз выводит на экран числа от 0 до 9. При каждом выполнении инструкции break управление передается назад во внешний цикл for.

На заметку. Инструкция break, которая завершает выполнение инструкции switch, влияет только на инструкцию switch, а не на содержащий ее цикл.

На примере предыдущей программы вы убедились, что в C++ с помощью инструкции for можно создать бесконечный цикл. (Бесконечные циклы можно также создавать, используя инструкции while или do-while, но цикл for — это традиционное решение. Для выхода из бесконечного цикла необходимо использовать инструкцию break. (Безусловно, инструкцию break можно использовать и для завершения небесконечного цикла.)

Использование инструкции continue

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

В C++ существует средство "досрочного" выхода из текущей итерации цикла. Этим средством является инструкция continue. Она принудительно выполняет переход к следующей итерации, опуская выполнение оставшегося кода в текущей.

Например, в следующей программе инструкция continue используется для "ускоренного" поиска четных чисел в диапазоне от 0 до 100.

#include <iostream.h>

int main() int x;

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

if(x%2) continue;

cout<< x << ' '; }

return 0; }

Здесь выводятся только четные числа, поскольку при обнаружении нечетного числа про­сходит преждевременный переход к следующей итерации, и cout-инструкция опускается.

В циклах while и do-while инструкция continue передает управление непосредственно инструкции, проверяющей условное выражение, после чего циклический процесс продолжает "идти своим чередом". А в цикле for после выполнения инструкции continue сначала вычисляется инкрементное выражение, а затем — условное. И только после этого циклический процесс будет продолжен.