Программирование на Objective-C 2.0
Шрифт:
Часть «Вычисление запрашиваемого треугольного числа» фактически состо-ит из задания значения 0 для переменной triangularNumber и цикла for, в котором вычисляется треугольное число. Таким образом, оператор for оказывается внут-ри другого оператора for. Вложение циклов может продолжаться до любого уровня.
Использование отступов становится крайне важным при работе с усложнен-ными программными конструкциями, такими как вложенные операторы for. Так вы сможете быстро определить, какие операторы содержатся внутри каждого оператора for. Варианты цикла for
Прежде чем закончить рассмотрение цикла for, рассмотрим синтаксические ва-риации, допустимые при формировании цикла. При написании цикла for может оказаться,
значения 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 и исходного значения переменной и с соответствующим сообщением.