Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Вопрос 32. Многомерные массивы.Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Многомерный массив представляет собой массив массивов, то есть массив, элементами которого служат массивы. Определение многомерного массива в общем случае должно содержать сведения о типе, размерности и количествах элементов каждой размерности, например описание: int ARRAY[4][3][6]; определяет массив, состоящий из четырех элементов, каждый из которых - двухмерный массив с размерами 3 на 6. В памяти массив ARRAY размещается в порядке возрастания самого правого индекса, то есть самый младший адрес имеет элемент ARRAY[0][0][0], затем идет элемент ARRAY[0][0][1] и т.д. Компилятор первым делом вычисляет, сколько всего элементов в массиве умножается на double,отводится место в памяти. В массиве, где n- индексов, при вычислении функции делается n- умножений. a[3][4]= a[3][4]+1-ужасная эффективность. Лучше использовать еще одну ячейку памяти. Чтобы ускорить процесс работы системы нужно не каждый раз вызывать переменную из массива, а, вызвав 1 раз, вложить новую переменную и совершить нужные действия. С учетом порядка расположения в памяти элементов многомерного массива нужно размещать начальные значения его элементов в списке инициализации. Например, конструкция: int ARRAY [4][3][6] = {0,1,2,3,4,5,6,7} инициализирует только первые 8 элементов этого массива: ARRAY[0][0][0]=0, ARRAY[0][0][1]=1, ARRAY[0][0][2]=2, ARRAY[0][0][3]=3, ARRAY[0][0][4]=4, ARRAY[0][0][5]=5, ARRAY[0][1][0]=6, ARRAY[0][1][1]=7. Если многомерный массив при определении инициализируется, то его самая левая размерность может в скобках не указываться. Количество элементов компилятор определяет по числу членов в инициализирующем списке. Например, определение: float matrix [ ][5] = { {1}, {2}, {3} }; формирует массив matrix с размерами 3 на 5, но не определяет явно начальных значений всех его элементов. Многомерный массив Многомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы. Определение многомерного массива должно содержать информацию о типе, размерности и количестве элементов каждой размерности. int MyArray1[10]; // Одномерный массив размерности 10. int MyArray2[20][10]; // 20 одномерных массивов размерности 10. int MyArray3[30][20][10]; // 30 двумерных массивов размерности 20*10. По крайней мере, для Borland C++ 4.5, элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса, т.е. самый младший адрес имеют элементы MyArray1[0], MyArray2[0][0], MyArray3[0][0][0], затем элементы MyArray1[1], MyArray2[0][1], MyArray3[0][0][1] и т.д. Многомерный массив подобно одномерному массиву может быть проинициализирован с помощью списка инициализаторов. Первыми инициализируются элементы с самыми маленькими индексами: int MyArray[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11}; Начальные значения получают следующие элементы трёхмерного массива: MyArray[0][0][0] == 0 MyArray[0][0][1] == 1 MyArray[0][0][2] == 2 MyArray[0][1][0] == 3 MyArray[0][1][1] == 4 MyArray[0][1][2] == 5 MyArray[0][2][0] == 6 MyArray[0][2][1] == 7 MyArray[0][2][2] == 8 MyArray[1][0][0] == 9 MyArray[1][0][1] == 10 MyArray[1][0][2] == 11 Остальные элементы массива получают начальные значения в соответствии со статусом массива (в глобальном массиве значения остальных элементов равны 0, в локальном массиве элементам присваиваются неопределённые значения). Дополнительные фигурные скобки в инициализаторе позволяют инициализировать отдельные фрагменты многомерного массива. Каждая пара фигурных скобок специфицирует значения, относящиеся к одной определённой размерности. Пустые фигурные скобки не допускаются (и это означает, что в C++ реализован жёсткий алгоритм инициализации массивов): int MyArray[3][3][3] = { {{0,1}}, {{100},{200,210},{300}}, {{1000},{2000,2100},{3000,3100,3200}} }; В результате выполнения этого оператора определения будут означены следующие элементы массива MyArray: MyArray[0][0][0] == 0 MyArray[0][0][1] == 1 MyArray[1][0][0] == 100 MyArray[1][1][0] == 200 MyArray[1][1][1] == 210 MyArray[1][2][0] == 300 MyArray[2][0][0] == 1000 MyArray[2][1][0] == 2000 MyArray[2][1][1] == 2100 MyArray[2][2][0] == 3000 MyArray[2][2][1] == 3100 MyArray[2][2][2] == 3200 По аналогии с одномерным массивом, при явной инициализации массива входящего в состав многомерного массива его самая левая размерность может не указываться. Она определяется на основе инициализатора. int MyArray[ ][3][3] = { {{0,1}}, {{100},{200,210},{300}}, {{1000},{2000,2100}} }; Транслятор понимает, что речь идёт об определении массива размерности 3*3*3. А в таком случае int MyArray[ ][3][3] = { {{0,1}}, {{100},{200,210},{300}}, {{1000},{2000,2100}}, {{10000}} }; предполагается размерность 4*3*3. В результате MyArray оказывается массивом из четырёх частично проинициализированных двумерных массивов. Следует помнить, что в C++ нет принципиальной разницы между массивом массивов произвольной размерности и обычным одномерным массивом. Потому и простор для творчества в деле инициализации многомерных массивов ограничивается левым индексом. //Одномерный динамический массив int a = 5; int *r = new int[a]; for(int i = 0; i < a; i++) { r[i] = GetTickCount(); Memo1->Lines->Add(r[i]); } delete r;
//Двумерный динамический массив int len1 = 8; int len2 = 9; int **Arr = new int*[len1]; for(int i = 0; i < len1; i++) { Arr[i] = new int[len2]; } Arr[1][1] = 4444;
//Трехмерный динамический массив int l1 = 8; int l2 = 9; int l3 = 10; int ***Arra = new int**[l1]; for(int i = 0; i < l1; i++) { Arra[i] = new int*[l2]; for(int u = 0; u < l2; u++) { Arra[i][u] = new int[l3]; } } Arra[1][1][1] = 9; и так далее…
Вопрос 33. Строки и массивы символов. Строки предназначены для ввода, обработки и вывода символьной информации. Строковая константа - это последовательность из нуля или более символов, заключенных в кавычки. Кавычки не являются частью строковой константы, а служат только для ее ограничения. Строки представляются в виде массива элементов типа char. Это означает, что символы строки можно представить расположенными в соседних ячейках памяти - по одному символу в ячейке. Но массив символов - не всегда строка! последним элементом массива является символ '\0'. Это нуль-символ: в языке C++ он используется для того, чтобы отмечать конец строки. Нуль-символ - не есть цифра 0; он не выводится на печать и в таблице кодов ASCII имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть по крайней мере на одну больше, чем количество символов, которые необходимо размещать в памяти. Для символьных массивов существует специальный способ инициализации. Вместо фигурных скобок и запятых можно прямо использовать строку символов, заключенных в кавычки. При этом в описании не обязательно задавать размеры массива, поскольку компилятор "сам" определяет его длину, подсчитывая число начальных значений. #include <iostream.h> int n=5; char line[] = "Дом!"; /* Инициализация символьного мас- */ /* сива внешнего класса памяти. */ void main () { cout << "Получили слово: "; for (int i=0; i<n; i++) cout << line[i];
Большинство компиляторов C++ в своих библиотеках этапа выполнения обеспечивают широкий набор функций для манипулирования строками.
Строка представляет собой последовательность (одномерный массив) из одного или более символов, последним из которых является нулевой символ таблицы ASCII '\0'. Это единственный вид строки, определенный в C. Язык C поддерживает строковые константы, называемые строковыми литералами. Строковый литерал – это любая последовательность символов, заключенная в двойные кавычки ("…"). В конце литерала компилятор автоматически добавляет нулевой символ. Не следует путать понятия строки и символа. Символьная константа заключается в одинарные кавычки, а строковая – в двойные. Например, 'c' – символьная константа, а "c" – строковая константа. Литерал можно задать с помощью директивы препроцессора define: # define STR "…" Строковая переменная может быть сформирована как одномерный массив типа char либо с помощью указателя на переменную типа char. Количество символов в массиве (объем выделяемой памяти) должно быть не меньше, чем количество символов в строке плюс один символ для хранения символа нуль.
|
||||
Последнее изменение этой страницы: 2016-08-15; просмотров: 1057; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.184.125 (0.009 с.) |