Шрифт:
Эту же задачу можно выполнить с помощью оператора 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 и исходного значения переменной и с соответствующим сообщением.
Тот же алгоритм будет использоваться для поиска наибольшего общего делителя в главе 7. В следующей программе с оператором while решается задача обращения порядка цифр целого числа, которое вводится с терминала. Например, если пользователь вводит число 1234, программа должна вывести результат 4321.
Примечание. При использовании вызовов NSLog каждая цифра будет выводиться в отдельной строке вывода. Программисты на С, которые знакомы с функцией printf, могут использовать эту процедуру вместо последовательного вывода цифр.
Чтобы написать такую программу, нужно сначала составить алгоритм, который выполняет поставленную задачу. Часто анализ метода решения задачи приводит к определенному алгоритму. Для задачи обращения цифр числа решение можно сформулировать как «успешное чтение цифр числа справа налево». Вы можете написать компьютерную программу, читающую числа, разработав процедуру извлечения каждой цифры числа, начиная с правой. Полученную цифру можно затем вывести на терминал как следующую цифру обращенного числа.
Чтобы извлечь правую цифру целого числа, можно взять остаток от деления этого числа на 10. Например, 1234 % 10 дает значение 4. Это правая цифра числа 1234 и первая цифра обращенного числа. Следующую цифру можно получить так же, если сначала выполнить целочисленное деление этого числа на 10. Деление 1234 / 10 дает в результате 123, а операция 123 % 10 дает 3, что является следующей цифрой обращенного числа.
Вы можете продолжать эту процедуру, пока не будет извлечена последняя цифра. Если результат последнего деления на 10 равен 0, значит, все цифры извлечены.
Программа 5.8 запрашивает у пользователя ввод числа и затем выводит цифры этого числа, начиная с крайней правой и заканчивая крайней левой. // Программа обращения цифр числа #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int number, right_digit; NSLog (@"Enter your number."); scant ("%i", &number); while ( number != 0 ) { right_digit = number % 10; NSLog (@"%Г, right_digit); number /= 10; } [pool drain]; return 0; }