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

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

Жанры

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

Двумерные массивы можно инициализировать аналогично одномерным. Перечисление элементов выполняется по строкам. Чтобы отделить инициали-зацию одной строки от другой, используются фигурные скобки. Таким образом, чтобы определить и инициализировать массив М с элементами из приведенной выше таблицы, можно использовать следующий оператор. int М[4][5] = { {10, 5, -3, 17, 82 }, { 9, 0, 0, 8, -7 }, {32,20, 1,0, 14}, { 0, 0, 8,7, 6 } };

Уделите особое внимание синтаксису этого оператора. Отметим, что после каждой закрывающей фигурной скобки (кроме последней) требуется запятая. Использование внутренних пар фигурных скобок не является обязательным.

Если они не указаны, инициализация происходит по строкам, поэтому преды-дущий оператор можно было бы написать следующим образом. int М[4][5] = { 10, 5, -3, 17, 82, 9, 0, 0, 8, -7, 32, 20,1,0, 14, 0, 0, 8, 7,6};

Как и в случае одномерных массивов, можно инициализировать не весь мас-сив. Например, в следующем операторе инициализируются только первые три элемента каждой строки матрицы. int М[4][5] = { { 10, 5, -3}, { 9, 0, 0 }, { 32, 20, 1 }, { 0, 0, 8 } };

Остальным значениям присваивается значение 0. Отметим, что в данном случае для правильной инициализации необходимы внутренние пары фигурных скобок. Без таких скобок были бы инициализированы первые две строки и первые два элемента третьей строки. (Проверьте это сами.) 13.2. Функции

Процедура NSLog, которую мы использовали в каждой профамме этой книги, является примером функции. Каждая программа содержит функцию с именем main. Вернемся к нашей первой программе (программа 2.1), где на терминал выводилась фраза «Программировать на Objective-C интересно». #import <Foundation/Foundation.h> int main (int arge, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"Программировать интересно."); [pool drain]; return 0; }

Следующая функция с именем printMessage выводит тот же текст. void printMessage (void) { NSLog (@"Программировать интересно."); }

Единственным отличием между printMessage и функцией main из профаммы 2.1 является первая строка. В первой строке определения функции компилятору сообщаются четыре факта об этой функции.

Кто может вызывать ее.

Тип значения, которое она возвращает.

Ее имя.

Количество и тип аргументов, которые она принимает.

В первой строке определения функции printMessage компилятору сообщается, что имя функции printMessage и что она не возвращает никакого значения (первое применение ключевого слова void). В отличие от методов, тип возвращаемого значения функции не заключают в круглые скобки. Компилятор выдаст сообщение об ошибке, если вы сделаете это.

После сообщения, что 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-го треугольного числа и выводит результат.

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

Черный Маг Императора 16

Герда Александр
16. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 16

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Имя нам Легион. Том 15

Дорничев Дмитрий
15. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 15

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

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

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Двойник короля 18

Скабер Артемий
18. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 18

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Точка Бифуркации XII

Смит Дейлор
12. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации XII

Эволюционер из трущоб. Том 9

Панарин Антон
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 9

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

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

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8