Чтение онлайн

на главную - закладки

Жанры

Программирование на Objective-C 2.0
Шрифт:

Прежде чем закончить рассмотрение цикла for, рассмотрим синтаксические ва-риации, допустимые при формировании цикла. При написании цикла for может оказаться, что вам нужно инициализировать более одной переменной, прежде чем начнется цикл, или нужно проверять несколько условий на каждом шаге цикла. Вы можете включать несколько выражений в любые поля цикла for, раз-деляя выражения запятыми. Например, в операторе, который начинается с for (i = 0, j = 0; i < 10; ++i) ...

значения i и j до начала цикла задаются равными 0. Эти два выражения, i=0 и j=0, разделены запятой, и оба выражения считаются частью поля начальное_выражение этого цикла. Рассмотрим еще один пример. Он начинается с оператора for (i = 0, j = 100; i < 10; ++i, j -= 10 ) ...

Здесь задаются две индексные переменные, i и j, которым присваиваются до начала цикла начальные значения: 0 и 100. После каждого выполнения тела цикла значение i увеличивается на 1, значение j уменьшается на 10.

Вы можете включать несколько выражений в определенное поле оператора for или пропускать несколько полей в этом операторе. Пропустив соответствующее поле, на его месте нужно оставить точку с запятой. Наиболее распространенный случай пропуска поля в операторе for возникает, когда не нужно инициализировать начальное выражение. Вы можете просто оставить поле начальноевыражение пустым, как в следующем случае, оставив только символ «точка с запятой». for (; j != 100; ++j) ...

Этот оператор можно использовать, например, если для переменной j до входа в цикл уже задано некоторое начальное значение.

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

Вы можете определять переменные в составе начального выражения цикла for с помощью рассмотренных ранее типичных способов определения переменных. Например, следующий оператор задает цикл for с целой переменной counter, которая одновременно определяется и инициализируется со значением 1. for ( int counter = 1; counter <= 5; ++counter)

Переменная counter действует только при выполнении этого цикла (она называется локальной переменной цикла) и недоступна извне данного цикла.

В следующем цикле определяются две целые переменные и задаются их начальные значения. for ( int n = 1, triangularNumber = 0; n <= 200; ++n ) triangularNumber += n;

Последний вариант цикла, который называется быстрым перечислением (fast enumerations) коллекции объектов, подробно описывается в главе 15. 5.2. Оператор while

Оператор while еще больше расширяет возможности циклов в языке Objective-С. Эта часто применяемая конструкция имеет следующий синтаксис: while (выражение) программный оператор

Выполняется оценка выражения, указанного в круглых скобках. Если результатом оценки выражения является значение TRUE, то выполняется программный оператор. После выполнения этого оператора (или операторов, заключенных в фигурные скобки) снова выполняется оценка выражения. Если результатом оценки выражения является значение TRUE, то снова выполняется программный оператор. Этот процесс продолжается, пока результатом оценки выражения не станет значение FALSE, после чего цикл прекращается. Выполнение программы затем продолжается, начиная с оператора, который следует за программным оператором.

В качестве примера в следующей программе задается цикл while, используемый просто для счета от 1 до 5. // В этой программе вводится оператор while #import <Foundation/Foundation.h> #import <stdio.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int count = 1; while ( count <= 5 ) { NSLog (@"%i,,l count); ++count; } [pool drain]; return 0; }

Вывод программы 5.6 1 2 3 4 5

В этой программе сначала задается значение переменной count, равное 1; затем начинается выполнение цикла while. Поскольку значение count меньше 5, выполняется следующий оператор. В фигурных скобках содержится тело цикла с оператором NSLog и оператором, который наращивает значение переменной count. Из результатов вывода этой программы видно, что цикл выполняется пять раз, то есть до тех пор, пока значение count не достигнет 5.

Эту же задачу можно выполнить с помощью оператора for. Оператор for всегда можно преобразовать в эквивалентный оператор while, и наоборот. Общую форму оператора for for (начальное_выражение; условие_цикла; выражение_цикла ) программный оператор

можно выразить в эквивалентной форме оператора while: начальное_выражение; while (условие_цикла) { программный оператор выражение_цикла; }

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

В следующей программе содержится еще один пример использования оператора while. Эта программа вычисляет наибольший общий делитель двух целых значений. Наибольший общий делитель (далее мы будем применять для него сокращение gcd — greatest common divisor) - это наибольшее целое число, на которое делятся без остатка два целых числа. Например, gcd чисел Ю и 15 равен 5, так как 5 — наибольшее целое число, на которое делятся без остатка Ю и 15.

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

Задача. Найти наибольший общий делитель двух неотрицательных целых чисел и и V.

Шаг 1. Если v равно 0, то процедура завершена и gcd равен и.

Шаг 2. Вычислить temp = u % v, u = v, v = temp и вернуться к шагу 1.

Анализ шагов этого алгоритма показывает, что шаг 2 повторяется, пока значение v не станет равным 0. Из этого следует, что на Objective-C этот алгоритм следует реализовать опсредством оператора while.

Программа 5.7 выполняет поиск gcd двух неотрицательных целых значений, вводимых пользователем. // Эта программа ищет наибольший общий делитель // двух неотрицательных целых значений #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; unsigned int u, v, temp; NSLog (@"Please type in two nonnegative integers."); scant ("%u%u", &u, &v); while ( v != 0 ) { temp = u % v; u = v; v = temp; } NSLog (@"Their greatest common divisor is %u", u); [pool drain]; return 0; }

Вывод программы 5.7 Please type in two nonnegative integers. (Введите два неотрицательных целых числа) 150 35 Their greatest common divisor is 5 (Их наибольший общий делитель равен 5)

Вывод программы 5.7 (Повторный запуск) Please type in two nonnegative integers. (Введите два неотрицательных числа.) 1026 540 Their greatest common divisor is 54 (Их наибольший общий делитель равен 54.)

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

Поделиться:
Популярные книги

Клиент

Гришэм Джон
Детективы:
триллеры
8.40
рейтинг книги
Клиент

С чего все началось?

Katelyn
Любовные романы:
современные любовные романы
3.40
рейтинг книги
С чего все началось?

Лестница бога. Пенталогия

Киселев Юрий Львович
Вселенная EVE Online
Фантастика:
фэнтези
боевая фантастика
6.67
рейтинг книги
Лестница бога. Пенталогия

Дурак

Мур Кристофер
1. Карман из Песьих Мусек
Юмор:
юмористическая проза
7.50
рейтинг книги
Дурак

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.25
рейтинг книги
Вечный. Книга III

Старые добрые времена (сборник)

Шекли Роберт
Сборники Роберта Шекли
Фантастика:
научная фантастика
6.25
рейтинг книги
Старые добрые времена (сборник)

Интернет-журнал "Домашняя лаборатория", 2008 №2

Журнал «Домашняя лаборатория»
Дом и Семья:
хобби и ремесла
сделай сам
5.00
рейтинг книги
Интернет-журнал Домашняя лаборатория, 2008 №2

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Исторический материализм

Коллектив авторов
Научно-образовательная:
история
философия
политика
5.00
рейтинг книги
Исторический материализм

Полное собрание стихотворений

Брюсов Валерий Яковлевич
Поэзия:
поэзия
7.00
рейтинг книги
Полное собрание стихотворений

Поводыри на распутье

Панов Вадим Юрьевич
2. Анклавы
Фантастика:
киберпанк
9.00
рейтинг книги
Поводыри на распутье

Год 1942 — «учебный»

Бешанов Владимир Васильевич
Документальная литература:
биографии и мемуары
6.20
рейтинг книги
Год 1942 — «учебный»

Московское царство

Вернадский Георгий Владимирович
5. История России
Научно-образовательная:
история
7.00
рейтинг книги
Московское царство

Вечный. Книга VII

Рокотов Алексей
7. Вечный
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Вечный. Книга VII