Шрифт:
После сообщения, что printMessage не возвращает значений, ключевое слово void применяется во второй раз, указывая, что этой функции не передаются ни-какие аргументы.
Напомним, что main — это специальное имя в системе Objective-C, которое указывает, где должно начаться выполнение данной программы, main необхо-димо указывать всегда. Мы можем добавить функцию main к приведенному выше коду, чтобы получить законченную программу (см. программу 13.3). #import <Foundation/Foundation.h> void printMessage (void) { NSLog (@"Программировать интересно."); } int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; printMessage; [pool drain]; return 0; }
Вывод программы 13.3 Программировать интересно.
Программа 13.3 состоит из двух функций; printMessage и main. Поскольку printMessage не принимает никаких аргументов, при ее вызове используется просто пара круглых скобок. Аргументы и локальные переменные
В главе 5 мы разрабатывали программы для вычисления треугольных чисел. Здесь мы определим функцию с именем calculateTriangularNumber для генерации треугольного числа и будем вызывать ее. В качестве аргумента функции указы-вается номер треугольного числа. Функция будет вычислять нужное число и выводить результаты. В программе 13.4 показана функция для выполнения этой задачи и процедура main для ее проверки. #import <Foundation/Foundation.h> // Функция для вычисления п-го треугольного числа void calculateTriangularNumber {int n) { int i, triangularNumber = 0; for (i = 1; i <= n; ++i) triangularNumber += i; NSLog (@"Triangular number %i is %i", n, triangularNumber); } int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; calculateTriangularNumber (10); calculateTriangularNumber (20); calculateTriangularNumber (50); [pool drain]; return 0; }
Вывод программы 13.4 Triangular number 10 is 55 (10-е треугольное число равно 55) Triangular number 20 is 210 Triangular number 50 is 1275
Рассмотрим первую строку функции calculateTriangularNumber. void calculateTriangularNumber (int n)
Она указывает компилятору, что calculateTriangularNumber — это функция, которая не возвращает никакого значения (ключевое слово void) и которой передается один api-умент с именем п типа int. Отметим еще раз, что тип аргумента нельзя помещать в круглые скобки, как мы привыкли делать при написании методов.
Открывающая фигурная скобка указывает начало определения функции. Поскольку нам нужно вычислять я-е треугольное число, мы должны задать пе-ременную для сохранения значения треугольного числа при его вычислении. Нам нужна также переменная, действующая как индекс цикла. Для этих целей переменные TriangularNumber и i определяются и объявляются с типом int. Их оп-ределение и инициализацию мы выполняем так же, как для других переменных внутри процедуры main в предыдущих программах.
Локальные переменные действуют в функциях так же, как в методах. Если для переменной внутри функции задано начальное значение, это начальное значение присваивается переменной при каждом вызове данной функции.
Переменные, определенные внутри функции, называются автоматическими локальными (automatic local) переменными, поскольку они автоматически «создаются» каждый раз, когда происходит вызов данной функции, а их значения являются локальными по отношению к данной функции.
Статические локальные (Static local) переменные описываются с помощью ключевого слова static, сохраняют свои значения при вызовах функций и имеют начальные значения по умолчанию, равные 0.
Значение локальной переменной доступно только внутри функции, где оп-ределена эта переменная. Ее значение нельзя получить с помошыо непосред-ственного доступа извне этой функции.
Вернемся к нашему примеру. После определения локальных переменных в функции вычисляется треугольное число, и результаты выводятся на терминал. Закрывающая фигурная скобка определяет конец функции.
Внутри процедуры main при первом вызове функции calculateTriangularNumber ей передается в качестве аргумента значение 10. После этого управление передается непосредственно в функцию, где значение 10 становится значением формального параметра п внутри этой функции. Затем функция вычисляет значение 10-го треугольного числа и выводит результат.
При следующем вызове calculateTriangularNumber передается аргумент 20. Значение 20 становится значением формального параметра п внутри функции. Затем функция вычисляет значение 20-го треугольного числа и выводит резуль-тат. Возвращение результатов функций
Как и методы, функции могут возвращать значение. Тип значения, возвращае-мого с помощью оператора return, должен быть согласован с типом возвращае-мого значения, объявленного для этой функции. В объявлении функции, которое начинается с float kmh_to_mph (float km_speed)
содержится определение функции с именем kmh_to_mph, которая принимает один аргумент типа float с именем km_speed и возвращает значение тоже типа float. Аналогичным образом, int ged (int u, int v)
определяет функцию ged (наибольший общий делитель) с целыми аргументами и и v и возвращает целое значение.
Мы перепишем алгоритм определения наибольшего общего делителя, ис-пользуемый в программе 5.7, в форме функции. Этой функции передаются два аргумента в виде двух чисел, для которых нужно определить их наибольший общий делитель (ged, greatest common divisor), см. программу 13.5. #import <Foundation/Foundation.h> // Эта функция ищет наибольший общий делитель двух // неотрицательных целых значений и возвращает соответствующий результат int gcd (int u, int v) { int temp; while ( v != 0 ) { temp = u % v; u = v; v = temp; } return u; } main {) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int result; result = ged (150, 35); NSLog (@"The ged of 150 and 35 is %i", result); result - ged (1026, 405); NSLog (@nThe ged of 1026 and 405 is %i“, result); NSLog (<§>nThe ged of 83 and 240 is %Г, ged (83, 240)); [pool drain]; return 0; }