Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Сложные выражения с оператором for



 

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

 

Параметры цикла for

Синтаксис установок параметров цикла for следующий:

 

for (инициализация, проверка, операция)

выражения;

 

Выражение инициализации используется для установки начального значения счетчика цикла или для выполнения какой-нибудь другой операции, подготавливающей работу цикла. Под проверкой понимают некое выражение на языке C++, которое выполняется перед каждой новой итерацией цикла и возвращает логическое значение. Если возвращается значение true, то программа выполняет строки тела цикла. после чего выполняется третье выражение в параметрах цикла, которое, как правило/приращивает значение счетчика на заданную величину.

 

Пример 1:

// напечатать Hello десять раз

for(int 1=0; i< 10; i++)

cout < < " Hello! " < < endl;

 

Пример 2:

for(int 1=0; i< 10; i++)

{

cout < < " Hello! " < < endl;

cout < < " the value of i is: " < < i < < endl;

}

 

Цикл for работает в такой последовательности:

1. Присваивается начальное значение счетчику цикла.

2. Вычисляется значения выражения, устанавливающего условие продолжения цикла.

3. Если выражение условия возвращает true, то сначала выполняется тело цикла, а затем заданная операция над счетчиком цикла.

На каждой итерации шаги 2 и 3 повторяются.

 

Множественные инициализации и приращения счетчиков цикла

 

Синтаксис задания цикла for позволяет инициализировать несколько переменных- счетчиков, проверять сложные условия продолжения цикла или последовательно выполнять несколько операций над счетчиками цикла. Если присваиваются значения нескольким счетчикам или выполняется несколько операций, они записываются последовательно и разделяются запятыми. В листинге 7.10 инициализируются два счетчика, значения которых после каждой итерации увеличиваются на единицу.

Листинг 7.10. Использование нескольких счетчиков в цикле for

1: // Листинг 7.10.

2: // Использование нескольких счетчиков

3: // в цикле for

4:

5: #include < iostream.h>

6:

7: int main()

8: {

9: for (int i=0, j=0; i< 3; i++, j++)

10: cout < < " i: " < < i < < " j: " < < j < < endl;

11: return 0;

12: }

 

Результат:

i: 0 j: 0

i: 1 j: 1

i: 2 j: 2

 

Анализ: В строке 9 переменные i и j инициализируются нулевыми значениями. Затем проверяется условие i< 3 и, так как оно справедливо, выполняется первая итерация цикла. На каждой итерации осуществляется вывод значений счетчиков на экран. После этого выполняется третья часть конструкции for, в которой значения переменных-счетчиков увеличиваются на единицу. После выполнения строки 10 и изменения значений переменных условие проверяется снова. Если условие все еще справедливо, запускается следующая итерация цикла. Это происходит до тех пор, пока условие продолжения цикла не нарушится. В этом случае значения переменных не изменяются и управление передается следующему после цикла оператору.

 

Нулевые параметры цикла for

 

Любой параметр цикла for может быть опущен. Пропуск означает использование так называемого нулевого параметра. Нулевой параметр, как и любой другой, отделяется от остальных параметров цикла for символом точки с запятой (; ). Если опустить первый и третий параметры цикла for, как показано в листинге 7.11, результат его применения будет аналогичен полученному при использовании оператора while.

Листинг 7.11. Нулевые параметры цикла for

1: // Листинг 7.11.

2: // Нулевые параметры цикла for

3:

4: #include < iostream.h>

5:

6: int main()

7: {

8: int counter = 0;

9:

10: for(; counter < 5; )

11: {

12: counter++;

13: cout < < " Looping! ";

14: }

15:

16: cout < < " \nCounter: " < < counter < < ".\n";

17: return 0;

18: }

 

Результат:

Looping! Looping! Looping! Looping! Looping!

Counter: 5.

 

Анализ: Очевидно, что результат выполнения такого цикла в точности совпадает с результатом выполнения цикла while из листинга 7.8. В строке 8 присваивается значение переменной counter. Установки параметров цикла for, показанные в строке 10, содержат только проверку условия продолжения цикла. Операция над переменной цикла в конструкции for также опущена. Таким образом, этот цикл можно представить в виде

 

while (counter < 5).

 

Рассмотренный пример еще раз показывает, что возможности языка C++ позволяют решить одну и ту же задачу множеством способов. Листинг 7.11 приведен скорее для иллюстрации гибкости возможностей C++, поскольку ни один опытный программист не будет использовать цикл for подобным образом. Тем не менее можно опустить даже все три параметра цикла for, а для управления циклом использовать операторы break и continue. Пример использования конструкции for без параметров приведен в листинге 7.12.

Листинг 7.12. Использование оператора for без параметров

1: //Листинг 7.12.

2: // Использование оператора for без параметров

3:

4: #include < iostream.h>

5:

6: int nain()

7: {

8: int counter=0; , // установка начального значения счетчика

9: int max;

10: cout < < " How many hellos? ";

11: cin > > max;

12: for (;; ) // задание бесконечного цикла

13: {

14: if (counter < max) // проверка значения

15: {

16: cout < < " Hello! \n";

17: counter++; // приращение значения счетчика

18: }

19: else

20: break;

21: }

22: return 0;

23: }

 

Результат:

How many hellos?

Hello!

Hello!

Hello!

 

Анализ: В этом примере набор параметров оператора for максимально минимизирован. Опущены все три параметра — инициализация, условие и операция. Начальное значение счетчика присваивается в строке 8 еще до начала работы цикла. Условие продолжения цикла также проверяется в отдельной строке (строка 14), и, если оно истинно, выполняется операция тела цикла, после чего в строке 17 увеличивается значение счетчика. Если условие не выполняется, оператор break в строке 20 прерывает выполнение цикла.

Несмотря на то что рассмотренная программа выглядит достаточно нелепо, встречаются ситуации, когда конструкции for(;; ) и while(true) оказываются просто необходимыми. Более полезный пример использования таких конструкций будет приведен далее в этой главе после рассмотрения оператора switch.

 

Использование пустых циклов for

 

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

Листинг 7.13. Использование оператора for для организации пустого цикла

1: // Листинг 7.13.

2: // Использование оператора for

3: // для организации " пустого" цикла

4:

5: #include < iostream.h>

6: int main()

7: {

8: for (int i = 0; i< 5; cout < < " i: " < < i++ < < endl)

9: ;

10: return 0;

11: }

 

Результат:

i: 0

i: 1

i: 2

i: 3

i: 4

 

Анализ: Оператор for в строке 8 содержит все три параметра. Инициализация в данном случае состоит из описания переменной i и присвоения ей значения 0. Затем проверяется условие i< 5, и, если оно выполняется, в третьей части оператора for значение переменной выводится на экран и увеличивается на единицу.

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

 

8: for (int i = 0; i< 5; i++)

9: cout < < " i: " < < i < < endl;

 

Оба варианта записи равноценны, однако второй вариант гораздо читабельнее и понятнее.

 

Вложенные циклы

 

Цикл, организованный в теле другого цикла, называют вложенным. В этом случае внутренний цикл полностью выполняется на каждой итерации внешнего цикла. Листинг 7.14 демонстрирует заполнение элементов матрицы с помощью вложенного цикла.

Листинг 7.14. Вложенные циклы

1: // Листинг 7.14.

2: // Вложенные циклы с оператором for

3:

4: #include < iostream.h>

5:

6: int main()

7: {

8: int rows, columns;

9: char theChar;

10: cout < < " How many rows? ";

11: cin > > rows;

12: cout < < " How many columns? ";

13: cin > > columns;

14: cout < < " What character? ";

15; cin > > theChar;

16: for (int i = 0; i< rows; i++)

17: {

18: for (int j = 0; j< columns; j++)

19: cout < < theChar;

20: cout < < " \n";

21: }

22; return 0;

23: }

 

Результат:

How many rows? 4

How many columns? 12

What character? x

xxxxxxxxxxxx

xxxxxxxxxxxx

xxxxxxxxxxxx

xxxxxxxxxxxx

 

Анализ: В начале программы пользователю предлагается ввести количество строк и столбцов матрицы, а также символ, которым будет заполняться матрица. В строке 16 задается начальное значение переменной i, после чего начинается выполнение тела внешнего цикла.

В первой строке тела внешнего цикла (строка 18) инициализируется еще один цикл. Переменной j присваивается значение 0 и начинается выполнение тела внутреннего цикла. В строке 19 символ, введенный при начале работы программы, выводится на экран. На этом первая итерация внутреннего цикла заканчивается. Вывод одной строки матрицы продолжается до тех пор, пока выполняется условие внутреннего цикла (j< columns). Как только значение переменной j становится равным значению columns, выполнение внутреннего цикла прекращается.

После вывода на экран строки матрицы (12 символов " x" ) управление передается в строку 20 и выводится символ новой строки. После этого проверяется условие внешнего цикла (i< rows) и, если оно справедливо, выполняется следующая итерация.

Обратите внимание: во второй итерации внешнего цикла внутренний цикл начинает выполняться с начала. Переменной j присваивается нулевое значение, что позволяет повторно выполнить все итерации внутреннего цикла.

Основная идея вложенных циклов состоит в том, что на каждой итерации внешнего цикла внутренний цикл выполняется полностью. Таким образом, результат выполнения данной программы будет следующим: заданный символ выводится для каждой строки столько раз, сколько указано в переменной columns, а количество выводимых строк определяется переменной rows.

 


Поделиться:



Популярное:

  1. VII. Дайте русские эквиваленты следующим английским словм и выражениям.
  2. Более сложные задачи теории массового обслуживания
  3. Более сложные манеры поведения
  4. Взаимодействие с человеком-оператором
  5. Выражения, которые описывают чувства
  6. Высказывания. Логические операции, выражения
  7. ГЛАВА V Уровень значения и уровень выражения
  8. Горные породы представляют собой сложные и закономерные сочетания минеральных масс и залегают в виде слоев или крупных скоплений (тел).
  9. ДВУХСЛОЖНЫЕ СЛОВА ИЗ ОТКРЫТЫХ СЛОГОВ.
  10. День 4-й. Выражения и операторы
  11. Каждый персонаж или фигура карты и каждый сюжетный ход в ее композиции служат формой выражения и проявления актуального чувства или желания клиента.
  12. Классификация осуществляется на основе характера зависимости измеряемой величины от времени, условий, определяющих точность измерения, и способов выражения этих результатов.


Последнее изменение этой страницы: 2017-03-08; Просмотров: 877; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.05 с.)
Главная | Случайная страница | Обратная связь