Программирование на Objective-C 2.0
Шрифт:
присваивает переменной g значение, содержащееся в элементе с номером i массива grades.
Чтобы сохранить значение в элементе массива, нужно указать этот элемент массива слева от знака равенства. В операторе grades[ 100] = 95;
значение 95 сохраняется в элементе с номером 100 массива grades.
Для перебора элементов массива нужно изменять значение переменной, которая используется как индекс массива. Например, в цикле for (i = 0; i < 100; ++i) sum += grades[i];
выполняется перебор первых 100 элементов массива grades (элементы 0-99), и значение каждой оценки (grade) добавляется к переменной sum. По окончании цикла for переменная sum
Как и с другими типами переменных, необходимо объявить массив, прежде чем использовать его. Объявление массива — это объявление типа элементов, содержащихся в массиве (например, int, float или объект) и максимального числа элементов в массиве.
Определение Fraction *fracts [100];
объявляет tracts как массив, содержащий 100 дробей (fraction). Для обозначения элементов этого массива нужно использовать индексы от 0 до 99. Выражение fracts[2] = [fracts[Q] add: fracts[1]];
представляет вызов метода add: класса Fraction для сложения первых двух дробей из массива tracts и сохранения результата в третьем элементе массива.
В программе 13.1 создается таблица из первых 15 чисел Фибоначчи. Попытайтесь предсказать ее результаты. Какая связь существует между числами этой таблицы? // Программа генерации первых 15 чисел Фибоначчи #import <Foundation/Foundation.h> int main (int arge, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int Fibonacci [15], i; Fibonacci [0] = 0; /* by definition */ Fibonacci[1] = 1; /* ditto 7 for ( i = 2; i < 15; ++i) Fibonacci[i] = Fibonacci[i-2] + Fibonacci [i-1]; for ( i = 0; i < 15; ++i) NSLog (@"%i", Fibonacci^]); [pool drain]; return 0; }
Вывод программы 13.1 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
Первые два числа Фибоначчи, которые мы назовем F0 и F, определяются соответственно как 0 и 1. Затем каждое следующее число Фибоначчи F определяется как сумма двух предыдущих чисел Фибоначчи F 2 и F,. Например, F2 вычисляется как сумма значений F0 и F, В приведенной профамме это соответствует вычислению Fibonacci[2] путем сложения значений Fibonacci[0] и Fibonacci[1]. Вычисление выполняется внутри цикла for для значений F0-F14 (то есть от Fibonacci[2] до Fibonacci[14]). Инициализация элементов массива
Элементам массива можно назначать начальные значения точно так же, как переменным при их объявлении. Для этого нужно просто перечислить начальные значения массива, начиная с первого элемента. Значения в списке разделяются запятыми, и весь список заключается в фигурные скобки.
В операторе int integers[5] = { 0, 1, 2, 3, 4 };
элементу integers[0] присваивается значение 1, integers[1] — значение 1, integers[2] — значение 2, и т.д. Массивы символов инициализируются аналогичным образом. Например, в операторе char letters[5] = {'а', 'b', 'с', 'd', 'е'};
определяется массив символов, и пяти элементам этого массива присваиваются соответственно значения 'a', 'b', 'с', 'd' и 'е'.
Вы не обязаны полностью инициализировать весь массив. Если указано меньшее количество начальных значений, инициализируется соответствующее количество элементов; остальные значения задаются равными нулю. Например, в объявлении float sample_data[500] = { 100.0, 300.0, 500.5 };
инициализируются первые три значения массива sample_data (соответственно 100.0,300.0 и 500.5), а остальным 497 элементам присваивается значение 0. Заключая
номер элемента в прямоугольные скобки, можно инициализировать определенные элементы массива в любом порядке. Например, в строках, int x = 1233; int а[] = {[9] = х + 1, [2] = 3, [1] = 2, [0] = 1 };определяется массив а из 10 элементов (по максимальному указанному индексу) и для последнего элемента задается значение х + 1 (1234). Кроме того, происходит инициализация первых трех элементов (значения 1,2 и 3 соответственно). Массивы символов
В программе 13.2 показано, как использовать массив символов. Однако здесь есть одна особенность, требующая обсуждения. Вы уже видите ее? #import <Foundation/Foundation.h> int main (int arge, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; char word[] = {'H', 'e', 'l', 'l', 'o', '!'}; int i; for ( i = 0; i < 6; ++i) NSLog word[i]); [pool drain]; return 0; }
Вывод программы 13.2 H e l l о !
Наиболее примечательной особенностью этой программы является объявление массива символов word без указания числа элементов. При определении массива без указания числа элементов размер массива определяется автоматически по числу инициализируемых элементов. Поскольку в программе 13.2 для массива word инициализируются шесть значений, язык Objective-C по умолчанию определяет, что данный массив содержит шесть элементов.
Этот принцип выполняется, если мы инициализируем каждый элемент массива в том месте, где определяется этот массив. В противном случае необходимо явным образом задать размер массива.
Если поместить завершающий нуль-символ ('\0') в конце массива символов, то создастся символьная строка (characterstring). Если в программе 13.2 заменить инициализацию массива word па строку char word[] = {'Н', 'е', 'l', 'l', 'o', '!', '\0'};
то в дальнейшем можно выводить эту строку с помощью одного вызова NSLog, например, NSLog (@"%s", word);
Символы форматирования %s указывают NSLog, что вывод символов должен продолжаться до тех пор, пока не будет достигнут завершающий нуль-символ. А именно этот символ мы поставили в конце массива word. Многомерные массивы
Все массивы, рассмотренные выше, являются линейными, то есть имеют одну размерность. Язык Objective-C позволяет определять массивы любой размер-ности. В этом разделе описываются двумерные массивы.
Типичным примером двумерного массива являются матрицы. Рассмотрим матрицу 4x5. 10 5 -3 17 82 9 0 0 8 -7 32 20 1 0 14 0 0 8 7 6
В математике для указания элемента матрицы используют два индекса. Если назвать эту матрицу М, то обозначение М.. будет указывать элемент /-й строки, у-го столбца, где / изменяется от 1 до 4 и/ изменяется от 1 до 5. Обозначение М3 2 указывает значение 20, которое находится в третьей строке втором столбце этой матрицы. Аналогичным образом, Л/45 указывает элемент, который находится в четвертой строке пятом столбце (значение 6).
В Objective-C при обозначении элементов двумерной матрицы используются аналогичные обозначения. Но поскольку в Objective-C нумерация начинается с 0, первая строка матрицы имеет номер 0, и первый столбец матрицы тоже имеет номер 0. Поэтому приведенная выше матрица будет иметь следующие обозначения строк и столбцов. Строка (i) Столбец (j) 0 1 2 3 4 0 10 5 -3 17 82 1 9 0 0 8 -7 2 32 20 1 0 14 3 0 0 8 7 6
Применяемое в математике обозначение Mij. заменяется в Objective-C обозначением M[i][j]