|
Программирование >> Процедурные приложения
изменение счетчика цикла. Как только проверка условного выражения даст результат false, все строки тела цикла и модифицирующее выражение будут пропущены и управление будет передано первому выражению, следующему за телом цикла. Если тело цикла содержит более одной команды, следует использовать фигурные скобки и руководствоваться определенными правилами оформления, чтобы сделать текст программы более понятным: for (инициализирующее выражение; условное выражение; модифицирукщее выражение) { выражение1; выражение2; выражениеЗ; выражение-n; } Давайте рассмотрим некоторые примеры использования цикла for. В следующем фрагменте вычисляется сумма ряда целых чисел от 1 до 5. Предполагается, что переменные isum и ivalue имеют тип int: isum = 0; for (ivalue = .1; ivalue <= 5; ivalue++) isum += ivalue; Сначала переменной isum присваивается нулевое значение, после чего запускается цикл for, который начинается с присваивания переменной ivalue значения 1. Эта операция выполняется только один раз. Затем проверяется условие ivalue<= 5. Поскольку на первом шаге цикла это выражение равно true, к переменной isum прибавляется текущее значение переменной ivalue - единица. По завершении выполнения последней строки цикла (в данном случае единственной) переменная ivalue увеличивается на единицу. Этот процесс будет повторяться до тех пор, пока значение переменной ivalue не достигнет 6, что приведет к завершению цикла. В программе на языке C++ приведенный фрагмент будет записан следующим образом (найдите одно отличие): isum = 0; for (intivalue = 1; ivalue <= 5; ivalue-м-) isum += ivalue; В C++ допускается объявление переменных прямо в строке инициализации цикла for. Тут затрагивается достаточно важный вопрос: где вообще следует размещать все объявления переменных? В C++ переменные можно создавать непосредственно перед той строкой, где они впервые используются. Поскольку в нашем случае переменная ivalue используется только внутри цикла, ее объявление в цикле не нарушает стройности программы. Но рассмотрим такой пример: int isum = 0; for(intivalue = i; ivalue <= 5; ivalue++) isum += ivalue; Подобное объявление переменной isum можно назвать плохим стилем программирования, если ее применение не ограничивается данным циклом. Желательно все объявления локальных переменных собирать сразу после заголовка функции, к которой они относятся, так как это повышает удобочитаемость программы и облегчает ее отладку. Значение счетчика цикла for вовсе не обязательно должно меняться только на единицу. В следующем примере вычисляется сумма ряда нечетных чисел от 1 до 9: iodd sum = 0; for(iodd value = 1; iodd value <- 9; iodd value += 2); iodd sum += iodd value; Здесь счетчиком цикла является переменная iodd value, и ее значение на каждом шаге увеличивается на 2. Кроме того, счетчик цикла может не только увеличиваться, но и уменьшаться, В следующем примере с помощью цикла for организуется считывание строки символов в массив са-ау, а затем с помощью другого цикла for эта строка выводится на экран в обратном порядке: * forloop.cpp * В этой программе на языке C++ демонстрируется использование * цикла for для работы с массивом символов. #include <stdio.h> 102 #define CARRAY SIZE 10 int main() int ioffset; char carray[CARRAY SIZE]; for(ioffset = 0; ioffset < CARRAY SIZE; ioffset++) carray[ioffset] = getchar(); for(ioffset = CARRAY SIZE - 1; ioffset >= 0; ioffset-) putchar(carray[ioffset]); return(0); } В первом цикле for переменной ioffset присваивается начальное значение 0, поскольку адресация элементов массива начинается с нуля. Затем происходит считывание символов по одному до тех пор, пока значение переменной ioffset не станет равным размеру массива. Во втором цикле for, в котором элементы массива выводятся на экран в обратном порядке, переменная ioffset инициализируется номером последнего элемента массива и по ходу цикла уменьшается на единицу. Цикл будет выполняться до тех пор, пока переменная ioffset не примет значение 0. При работе с вложенными циклами for обращайте внимание на правильную расстановку фигурных скобок, чтобы четко определить границы каждого цикла: * nsloopl. с * В этой программе на языке С демонстрируется важность * правильной расстановки фигурных скобок во вложенных циклах. #include <stdio.h> int main() int iouter val, iinner val; for (iouter val = 1; iouter val <= 4; iouter val++) ( printf ( \n%3d-- ,iouter val) ; for (iinner val = 1; iinner val <= 5; iinner val++) printf ( %3d ,iouter val * iinner val) ; return(0); } В результате выполнения программы будут выведены следующие данные: 1 - 12345.. 2 - 2 4 6 8 10 3 - 3 б 9 12 15 4 - 4 8 12 16 20 А теперь представим, что внешний цикл записан без фигурных скобок: * nsloop2.c * В этой программе на языке С демонстрируется, что произойдет, если при * задании внешнего цикла не поставить фигурные скобки. #include <stdio.h> int main () int iouter val, iinner val; for(iouter val = 1; iouter val <= 4; iouter val++) printf( \n%3d- , iouter val); for(iinner val = >>1; iinner val <= 5; iinner val++) printf( %3d , iouter val * iinner val); return(0); Выводимые данные будут выглядеть совершенно иначе: 1 -2 -3 -4 -- 5 10 15 20 25 Если тело внешнего цикла не будет выделено фигурными скобками, то к первому циклу будет отнесена только следующая за ним строка с функцией printf(). Только после того как функция printf() будет вызвана четыре раза подряд, начнется выполнение следующего цикла for. Во внутреннем цикле будет использовано самое последнее значение переменной iouter val, т.е. 5, на основе которого будет сгенерирован и выведен очередной функцией printf() соответствующий ряд чисел. Очень часто решение использовать или не использовать фигурные скобки в конструкциях со вложенными циклами принимается на основе того, насколько проще для понимания станет текст программы. Посмотрите на следующие два примера и попытайтесь определить, будет ли результат их выполнения одинаковым. Вот первый пример: * nsloop3.c * Еще одна программа на языке С, демонстрирующая использование фигурных скобок * в конструкциях со вложенными циклами. #include <stclio.h> int main () { int iouter val, iinner val; for(iouter val = 1; iouter val <= 4; iouter val++) { for(iinner val = 1; iinner val <= 5; iinner val++) printf( %3d , iouter val * iinner val); return(0); Запишем эту же программу несколько иначе: * nsloop4.c * Видоизмененный вариант предыдущей программы. #include <stdio.h> int main() { int iouter yal, iinner val; for(iouter val = 1; iouter val <= 4; iouter val++) for(iinner val = 1; iinner val <= 5; iinner val++) printf( %3d , iouter val * iinner val); return(0); } В обоих случаях на экран будет выводиться одна и та же последовательность: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 В рассмотренных программах после строки, задающей внешний цикл, сразу следует строка внутреннего цикла. При этом весь внутренний цикл, независимо от того, состоит ли он из одной или нескольких строк, будет восприниматься как одно выражение. Поэтому без фигурных скобок, ограничивающих внешний цикл, вполне можно было обойтись. Но их можно установить с целью повышения удобочитаемости программы. Цикл while
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |