§ 5. Оператор цикла
Сайт: | Профильное обучение |
Курс: | Информатика. 10 класс (Повышенный уровень) |
Книга: | § 5. Оператор цикла |
Напечатано:: | Гость |
Дата: | Суббота, 21 Декабрь 2024, 20:00 |
5.1. Оператор цикла с предусловием
Для записи оператора цикла с предусловием используется команда while. Формат команды: while. Формат команды: while (<условие>){ тело цикла; } Условие в записи оператора цикла может быть простым и составным. Фигурные скобки могут быть опущены, если тело цикла состоит из одной команды. Пример 5.1. Написать программу, которая определит количество цифр в натуральном числе n. Этапы выполнения задания I. Исходные данные: n (заданное число). II. Результат: k — количество цифр в числе. III. Алгоритм решения задачи. 1. Ввод исходных значений. |
Цикл while работает до тех пор, пока условие цикла истинно. Для того чтобы цикл завершил свою работу, в теле цикла должны быть команды, выполнение которых приведет к тому, что условие цикла станет ложным. Если таких команд нет, цикл выполняется бесконечно. Такую ситуацию называют зацикливанием. В случае зацикливания нужно прервать выполнение программы. В Code::Blocks для этого можно использовать кнопку . |
5.2. Оператор цикла с постусловием
Цикл, в котором условие для завершения работы проверяется после выполнения тела цикла, в С++ записывается следующим образом: do { тело цикла; } while (<условие>); Цикл работает, пока условие истинно, и прекращает работу, когда условие становится ложным. Этот цикл называют циклом с постусловием, так как проверка условия осуществляется после выполнения тела цикла. Использовать цикл do...while лучше в тех случаях, когда команды в теле цикла должны выполниться хотя бы один раз, либо когда внутри тела цикла происходит инициализация переменных, участвующих в проверке условия окончания его работы. Фигурные скобки в записи цикла с постусловием могут быть опущены, если тело цикла состоит из одной команды. Пример 5.2. Написать программу, которая будет генерировать случайные числа из промежутка [1; x] до тех пор, пока не будет сгенерировано число, кратное k. Вывести это число и количество сгенерированных чисел. Значения k и x вводятся (k < x). Этапы выполнения задания I. Исходные данные: числа k и r. II. Результат: r (искомое число) и n (количество чисел). III. Алгоритм решения задачи. 1. Ввод исходных значений. 3.1. Генерируем случайное число r. В С++ для этого используется функция rand(), которая генерирует случайное число в промежутке [0; 32767). Это число будет использоваться в условии проверки окончания работы цикла. 4. Вывод результата. IV. Описание переменных: n, k, x — int. |
Числа, сгенерированные функцией rand(), называют псевдослучайными, поскольку при каждом запуске программы будет сгенерирована одна и та же последовательность чисел. Каждое новое число в последовательности генерируется по определенному алгоритму из предыдущего. Первое число в этой последовательности — константа, известная компилятору. Такой подход удобен для отладки программы. Однако для получения результатов необходимо при каждом запуске получать другие числа. Функция srand(n) из библиотеки cstdlib позволяет изменить первое число в последовательности в зависимости от значения параметра n. Однако, если значение n является константой, то последовательность чисел изменится по отношению к начальной, но не будет меняться при новых запусках программы. Если в качестве значения n взять системное время (функция time(NULL) из библиотеки ctime), то при каждом запуске программы будем получать новую последовательность случайных чисел. Пример 5.2. V. Программа:
VI. Тестирование. VII. Поскольку числа генерируются случайно, то для одних и тех же исходных данных могут получаться различные результаты (тесты 2—4) |
5.3. Оператор цикла с параметром
Для записи оператора цикла с параметром используется команда for. Формат команды: for (<Блок1>; <Блок2>; <Блок3>){ тело цикла; } Для организации работы такого цикла необходимо описать три операции:
Если в теле цикла for должен выполниться один оператор, тогда фигурные скобки можно опустить. В записи цикла for можно опустить один или несколько блоков, но нельзя опускать точку с запятой, разделяющую три составляющие цикла (пример 5.3). Наиболее распространен частный случай записи цикла for, который близок к записи аналогичного цикла на языке Pascal: for (счетчик = значение; счетчик < значение; шаг цикла) { тело цикла; } Счетчик цикла (параметр цикла) — переменная, в которой хранится количество проходов данного цикла. В отличие от Pascal, параметр цикла может быть вещественным и изменяться с любым значением шага цикла (пример 5.4). Переменные, определенные в заголовке цикла for или в его теле, имеют специальный тип области видимости: область видимости цикла. Такие переменные существуют только внутри цикла и недоступны за его пределами. Пример 5.5. Написать программу для вывода таблицы умножения на заданное число x. Этапы выполнения задания I. Исходные данные: x (введенное число). II. Результат: 9 строк вида . III. Алгоритм решения задачи. 1. Ввод исходных значений. VI. Описание переменных: x, a, c – int. Пример 5.6. Написать программу, которая выведет все двузначные числа в виде таблицы так, чтобы в каждой строке этой таблицы располагались числа одного десятка. Этапы выполнения задания I. Результат программы не зависит от исходных данных. II. Таблица с числами. III. Алгоритм решения задачи. 1. Для вывода такой таблицы можно использовать два вложенных цикла. Первый будет определять количество десятков в числе, а второй — количество единиц. IV. Описание переменных: i, j – int. Все циклы, которые есть в С++, взаимозаменяемы. Выбор того или другого цикла часто определяется тем, какой из циклов проще и быстрее позволит решить поставленную задачу. |
Пример 5.3. Различные варианты записи заголовка цикла for:
Если блок проверки условия оставить пустым, то условие всегда будет считаться истинным, и цикл будет выполняться бесконечно. Поэтому он должен будет прерван каким-либо другим способом. В последнем примере в заголовке цикла объявлены две переменные, которые по-разному меняют свои значения на каждой итерации цикла. Последний раз цикл выполнится для значений i = 14, j = 29. Пример 5.4. Различные варианты записи заголовка цикла for с параметром:
В заголовке цикла присутствует блок3, в который можно вписывать действия, проходящие на каждой итерации. Поэтому в некоторых случаях цикл for может быть записан без команд тела цикла. В качестве примера рассмотрим несколько вариантов вычисления суммы первых 10 натуральных чисел. Вариант 1
Вариант 2
Вариант 3
В первых двух вариантах, если после цикла записать команду cout << s; получим значение s = 55. Поскольку команды, находящиеся в блоке3, выполняются после выполнения тела цикла, то во втором варианте необходима лишняя итерация. В третьем варианте вывести значение переменной s не получится, поскольку ее область видимости ограничена циклом и ее значение за пределами цикла недоступно. Пример 5.5. V. Программа:
VI. Тестирование. Пример 5.6. VI. Программа:
VI. Тестирование. |
5.4. Операторы break и continue
Достаточно часто при использовании циклов и почти всегда при использовании оператора switch возникает необходимость прервать выполнение тела цикла или команды множественного выбора. Для этого используется команда break. Использование break для прерывания команды switch рассматривалось в § 4. Если оператор break встречается в теле цикла, то цикл прекращает свою работу, а программа продолжает выполняться со строки, следующей за циклом. Пример 5.7. Написать программу, которая выведет только те числа таблицы из примера 5.6, которые находятся не выше главной диагонали [1]. Этапы выполнения задания I. Результат программы не зависит от исходных данных. II. Таблица с числами. III. Алгоритм решения задачи. 1. Для вывода такой таблицы можно использовать два вложенных цикла. Первый будет определять десятки числа, а второй — единицы. IV. Описание переменных: i, j – int. Оператор continue позволяет пропустить часть операторов тела цикла, стоящих после него и начать новую итерацию. Это можно использовать в тех случаях, когда нужно завершить текущую итерацию раньше времени. Пример 5.8. Написать программу, которая выведет все числа таблицы из примера 5.6, исключая числа, оканчивающиеся на 5 или 7. Этапы выполнения задания I. Результат программы не зависит от исходных данных. II. Таблица с числами. III. Алгоритм решения задачи. 1. Для вывода такой таблицы можно использовать два вложенных цикла. Первый будет определять десятки числа, а второй — единицы. [1] Главная диагональ в таблице чисел (матрице) — все такие числа, у которых номер строки равен номеру столбца. Нумерация начинается с верхнего левого угла. |
С помощью оператора break можно прервать бесконечный цикл. Для этого в тело цикла добавляется условие, при выполнении которого сработает оператор break, и цикл завершит работу. Например, если программа должна работать с двузначными числами, то следующий бесконечный цикл прервется только тогда, когда пользователь введет двузначное число.
Пример 5.7. V. Программа:
Многие программисты считают, что операторы break и continue нарушают структурность программного кода, и предпочитают обходится без них. Эти операторы всегда можно заменить операторами, которые относятся к основным алгоритмическим конструкциям. Однако разумное использование операторов break и continue может улучшить понятность циклов в программе. При вложенных циклах действия операторов break и continue распространяется только на тот цикл, в котором они содержатся. |
5.5. Решение задач с использованием оператора цикла
В данном пункте рассмотрим возможность применения всех трех видов циклов для решения одной задачи. Пример 5.9. Вывести на экран наибольшее натуральное число из промежутка [n, m], которое делится на заданное число x, или сообщение «нет таких чисел». Этапы выполнения задания I. Исходные данные: n, m (границы промежутка), x (заданное число). II. Результат: искомое число или сообщение «нет таких чисел». III. Алгоритм решения задачи. 1. Пусть i — текущее число из промежутка. |
Пример 5.9. V. Программа (с циклом while):
Фрагмент решения с циклом do…while:
Фрагмент решения с циклом for:
VI. Тестирование. |
Вопросы к параграфу
1. Что такое оператор цикла? 2. Каким образом можно управлять количеством выполнений тела цикла? 3. Как записывается оператор цикла с предусловием? 4. Как записывается оператор цикла с постусловием? 5. Как записывается оператор цикла с параметром? 6. Для чего предназначен оператор break? 7. В каких случаях можно применять оператор continue? |
Упражнения
1. Перепишите программы из примеров 5.1, 5.2, 5.5–5.8, используя другие циклы. Проанализируйте, когда использование другого цикла менее эффективно.
2. Выполните задания для примера 5.1.
1. Команды
i. cout << "v chisle " << k;
ii. cout << " cifr" << endl;
заменили командами
iii. cout << "v chisle " << n;
iv. cout << k << " cifr" << endl;
Какой результат будет получен и почему? Какие изменения нужно внести в программу для получения правильного результата?
2. Изменится ли результат работы программы, если вместо условия цикла n > 0 использовать условие n > 1?
3. Проверьте работу программы для n = 0. Почему получился такой результат? Что нужно изменить в программе для получения правильного результата?
3. Внесите изменения в программу примера 5.5. Пользователь задает значение второго множителя, а также начальное и конечное значения первого множителя.
4. Задачу из примера 5.7 можно решить без использования команды break. Для этого нужно изменить условие цикла. Напишите программу, которая решит задачу таким способом.
5. В магазине продают конфеты в упаковках по 0.1 кг, 0.2 кг, … 0.9 кг, 1 кг. Известно, что 1 кг конфет стоит х рублей. Выведите стоимости каждой упаковки в виде:
0.1 кг конфет стоит … р.;
0.2 кг конфет стоит … р. …
6. Написать программу, которая выведет только те нечетные числа таблицы из примера 5.6, которые находятся ниже главной диагонали.
7. Выведите на экран наименьшее натуральное число из промежутка [n, m], которое является нечетным и делится на введенное значение x.