Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

Это позволяет нам лучше справляться с большим количеством размерностей. Индекс [x] всегда означает отдельный индекс, выделяя отдельную строку в объекте класса Matrix; если переменная a является n мерным объектом класса Matrix, то a[x] — это (n–1)-размерный объект класса Matrix. Обозначение (x,y,z) подразумевает использование нескольких индексов, выделяя соответствующий элемент объекта класса Matrix; количество индексов должно равняться количеству размерностей.

Посмотрим, что произойдет, если мы сделаем ошибку.

void f(int n1,int n2,int n3)

{

 Matrix ai0;   // ошибка: 0-размерных матриц не бывает

 Matrix ad1(5);

 Matrix ai(5);

 Matrix ad11(7);

 ad1(7) = 0;               // исключение Matrix_error

                           // (7 — за пределами диапазона)

 ad1 = ai;                 // ошибка: разные типы элементов

 ad1 = ad11;               // исключение Matrix_error

                           // (разные размерности)

Matrix ad2(n1);  // ошибка: пропущена длина 2-й

                           // размерности

 ad2(3) = 7.5;             // ошибка: неправильное количество

                           // индексов

 ad2(1,2,3) = 7.5;         // ошибка: неправильное количество

                           // индексов

 Matrix ad3(n1,n2,n3);

 Matrix ad33(n1,n2,n3);

 ad3 = ad33;               // OK: одинаковые типы элементов,

                           // одинаковые размерности

}

Несоответствия между объявленным количеством размерностей и их использованием обнаруживается на этапе компиляции. Выход за пределы диапазона перехватывается на этапе выполнения программы; при этом генерируется исключение Matrix_error.

  Первая размерность матрицы — это строка, а вторая — столбец, поэтому индекс — это двумерная матрица (двумерный массив), имеющая вид (строка,столбец). Можно также использовать обозначение [строка][столбец], так как индексирование двумерной матрицы с помощью одномерного индекса порождает одномерную матрицу — строку. Эту ситуацию можно проиллюстрировать следующим образом.

Этот объект класса Matrix размещается в памяти построчно.

Класс Matrix знает свою размерность, поэтому его элементы можно очень просто передавать как аргумент,

void init(Matrix& a) // инициализация каждого элемента

                            // характеристическим значением

{

  for (int i=0; i

    for (int j = 0; j

      a(i,j) = 10*i+j;

}

void print(const Matrix& a) // вывод элементов построчно

{

  for (int i=0; i

    for (int j = 0; j

      cout << a(i,j) <<'\t';

    cout << '\n';

  }

}

  Итак, dim1 — это количество элементов в первой размерности, dim2 — количество элементов во второй размерности и т.д. Тип элементов и количество размерностей являются частью класса Matrix, поэтому невозможно написать функцию, получающую объект класса Matrix как аргумент (но можно написать шаблон).

void init(Matrix& a); // ошибка: пропущены тип элементов

                      // и количество размерностей

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

<p id="AutBody_Root468"><strong>24.5.2. Одномерный объект класса Matrix</strong></p>

Что можно сделать с простейшим объектом класса Matrix — одномерной матрицей?

Количество размерностей в объявлении такого объекта можно не указывать, потому что по умолчанию это число равно единице.

Matrix a1(8); // a1 — это одномерная матрица целых чисел

Matrix a(8);    // т.е. Matrix a(8);

Таким образом, объекты a и a1 имеют одинаковый тип (Matrix). У каждого объекта класса Matrix можно запросить общее количество элементов и количество элементов в определенном измерении. У одномерного объекта класса Matrix эти параметры совпадают.

a.size; // количество элементов в объекте класса Matrix

a.dim1; // количество элементов в первом измерении

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT