Создание паузы в программе
Лабораторная работа №7
ЦИКЛЫ
Программа начинает и заканчивает свою работу, но это не значит, что каждая инструкция в программе должна выполняться только однажды. Вы можете решить провести несколько циклов обработки данных или выполнить несколько различных вычислений. Вы можете также попросить пользователя вводить данные до тех пор, пока он не сделает это надлежащим образом.
Язык Си и Си++ имеет три структуры, известные под названием циклов, которые используются для управления повторами:
цикл for; цикл do...while; цикл while.Любой из этих циклов может быть применен для повторения инструкции, группы инструкций или даже целой программы.
Использование цикла for
Цикл for используется в том случае, когда известно точное количество повторов, которое нужно выполнить. Структура такого цикла показана на рис.1. Обратите внимание на то, что точка с запятой ставится только после инструкции, а не после параметров for. Однако три параметра внутри круглых скобок отделяются друг от друга точкой с запятой.
В приведенной ниже программе цикл for используется для того, чтобы вывести на экран монитора числа от 1 до 10, расположенные друг под другом.
main() { int repeat; for (repeat = 1; repeat <= 10; repeat++) printf("%d\n", repeat); }Этот цикл управляется переменной repeat, которая называется индексом. Индексу можно присвоить любое имя, но значение переменной обязательно должно быть целым числом. Выражение в круглых скобках после for делится на три составляющие:
repeat=1 | инициализация переменной repeat путем присваивания ей начального значения |
repeat <= 10 | задает условие повтора цикла до тех пор, пока значение переменной repeat остается меньше или равно 10 |
repeat++ | приращение значения переменной repeat после каждого повтора цикла |
Рис. 1. Структура цикла for
|
При каждом новом повторе цикла программа выводит на экран текущее значение переменной repeat.
Когда программа начнет выполнение цикла, она присвоит переменной repeat начальное значение, равное 1. Затем будет проверено, является ли истинным условие, что значение переменной меньше или равно 10. Если условие истинное, начнется выполнение инструкции, связанной с циклом, то есть вывод на экран значения переменной.
После выполнения инструкции произойдет увеличение значения переменной на единицу и снова будет проведена проверка истинности условия (рис.2). Так как условие все еще является истинным, цикл будет выполнен во второй раз, отображая на дисплее текущее значение переменной. Этот процесс будет
Рис. 2. Условие проверяется перед каждым повтором цикла
повторяться до тех пор, пока значение переменной не вырастет до 11. Как только это произойдет, условие repeat <= 10 уже не будет истинным, так что выполнение инструкции прекратится и цикл завершится.
В предыдущем примере значение индекса использовалось непосредственно в инструкции вывода. В то же время можно написать инструкции следующим образом:
main() { int repeat; char letter; puts("Введите 10 символов"); for(repeat = 1; repeat <= 10; repeat++) letter = getchar(); }В этой программе функция getchar() выполняется 10 раз, по количеству повторов цикла, пока значение переменной repeat не увеличится с 1 до 11. Индекс в данном случае используется только для определения количества повторов. С тем же результатом можно было записать инструкции следующим образом:
for (repeat = 101; repeat <= 110; repeat++) letter = getchar(); }Здесь также вводится 10 символов, но теперь значение индекса изменяется от 101 до 110. Точное значение индекса приобретает значение только в том случае, когда оно само по себе используется в цикле.
Создание паузы в программе
Цикл for можно использовать и без инструкций, с целью создания задержки в программе:
for (delay = 1; delay <= 1000; delay++);Хотя инструкции, связанные с циклом, отсутствуют, тем не менее, цикл будет повторен 1000 раз, пока выполняется указанное условие, то есть пока значение переменной delay не возрастет с 1 до 1001. Выполнение повторов цикла приостановит переход программы к выполнению следующих инструкций.
Одним из возможных применений такого цикла является временная остановка вывода на экран сообщений, с тем, чтобы дать пользователю время прочитать инструкции или подсказки. Этот способ можно использовать наряду с тем, где пользователю предлагается нажать Enter для продолжения вывода сообщений.
Составные инструкции
В одном цикле можно выполнить несколько инструкций. Для этого всю последовательность инструкций, относящихся к циклу, следует заключить в фигурные скобки. В качестве примера посмотрите программу перевода 101 последовательного значения температур (от 32 до 132) в значения по шкале Цельсия:
main() { int temp; float celsius; puts("Шкала Фаренгейта\tШкала Цельсия\n"); for (temp = 32; temp <= 132; temp++) { celsius = (5.0 / 9.0) * (temp - 32); printf("%d\t\t%6.2f\n", temp, celsius); } }
|
При каждом повторе цикла выполняются две инструкции. Значение индекса определяет как количество повторов, так и значения, которые следует перевести в шкалу Цельсия. Сравните только что просмотренную вами программу со следующей:
main() { int temp, repeat; float celsius; puts("Шкала Фаренгейта\tШкала Цельсия\n"); temp = 10; for (repeat = 1; repeat <= 10; repeat++) { celsius = (5.0 / 9.0) * (temp - 32); printf("%d\t\t%6.2f\n", temp, celsius); temp += 10; } }Теперь индекс определяет только количество повторов. Значения температуры, которые следует преобразовать, определяет переменная temp. Эта переменная увеличивает свое значение на 10 при каждом повторе: с 10 до 20, 30 и так далее, вплоть до 100.
Использование переменных
Если во время составления программы вы не знаете, сколько повторов потребуется, вы все же можете использовать цикл for, при условии, что количество повторов будет указано в момент запуска программы на выполнение. Можно ввести значение в переменную и использовать ее в условии. Например, следующая программа просит пользователя указать пределы значений температуры, которые требуется преобразовать, то есть, по сути, пользователь сам должен определить количество повторов цикла:
main() { int temp, start, end; float celsius; printf("Введите начальное значение температуры: "); scanf("%d", &start); printf("Введите конечное значение температуры: "); scanf("%d", &end); puts("Шкала Фаренгейта\tШкала Цельсия\n"); for (temp = start; temp <= end; temp++) { celsius = (5.0 / 9.0) * (temp - 32); printf("%d\t\t%6.2f\n", temp, celsius); } }Здесь требуется ввести начальное и конечное значения температур, которые мы хотим привести к шкале Цельсия. Переменные start и end используются в цикле for для установки начального значения индекса и для проверки условия. Цикл завершится, когда значение переменной temp превысит величину переменной end. Таким образом, если вы введете числа 20 и 43, программа преобразует значения температур от 20 до 43 градусов по Фаренгейту в соответствующие значения по шкале Цельсия. Цикл будет повторен 24 раза, затем завершится.
Вложенные циклы
Если один цикл for выполняется внутри другого, принято говорить, что мы имеем дело с вложенным циклом. Внутренний цикл целиком выполняется во время каждого повторения внешнего цикла. Вложенные циклы for можно представить себе как двухмерные, а единичный — как одномерный.
В качестве иллюстрации рассмотрим следующую программу:
main() { int row, column; for (row = 1; row <= 10; row++) { for (column = 1; column <= 10; column++) printf("*"); putchar('\n'); /*вне внутреннего цикла, но внутри внешнего*/ } }Программа выводит на экран монитора 10 рядов, состоящих из 10 звездочек. Здесь используются две целочисленные переменные row и column. Во внешнем цикле переменная row увеличивает свое значение на единицу при каждом повторе. Кроме того, при каждом повторе внешнего цикла, внутренний цикл повторяется 10 раз, увеличивая значение переменной column и выводя на экран ряд из десяти звездочек (обратите внимание, что имена переменным даны с таким расчетом, чтобы пояснить логику программы: row по-английски значит «строка», а column — «столбец» или «колонка»).
Рис. 3. Внешний и внутренний циклы
На рис. 3 продемонстрирована работа этих вложенных циклов. К инструкциям внутреннего цикла относится
for (column = 1; column <= 10; column++)printf("*");
Рис. 4. Значения, которые имеют переменные во время каждого повтора цикла
В результате работы программы на экране появятся 100 звездочек: 10 внутренних циклов сформируют 10 колонок, а 10 внешних циклов — 10 рядов. Значения, которые переменные приобретают при каждом повторе цикла, показаны на рис. 4.
Обратите внимание на положение инструкции putchar('\n');. Она не относится к внутреннему циклу, но в то же время находится внутри фигурных скобок, ограничивающих внешний цикл. Эта инструкция выполняется десять раз, по одному на каждый повтор внешнего цикла, вставляя код «новая строка» после каждого ряда звездочек.
В Листинге 1 приведен другой пример использования вложенных циклов. Десять внешних и десять внутренних циклов здесь используются для того, чтобы создать таблицу умножения. Вместо того чтобы просто выводить на экран ряды звездочек, программа выводит результаты произведения значения переменной row на значение переменной column.