Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
cout << "количество байтов в типе int: " << sizeof(int) << 'n';
cout << "наибольшее число типа int: " << INT_MAX << endl;
cout << "наименьшее число типа int: " << numeric_limits<int>::min()
<< 'n';
if (numeric_limits<char>::is_signed)
cout << "тип char имеет знак n";
else
cout << "тип char не имеет знакаn";
cout << "char с минимальным значением: "
<< numeric_limits<char>::min() <<'n';
cout << "минимальное значение типа char: "
<< int(numeric_limits<char>::min()) << 'n';
Если вы пишете программу, которая должна работать на разных компьютерах, то возникает необходимость сделать эту информацию доступной для вашей программы. Иначе вам придется “зашить” ответы в программу, усложнив ее сопровождение.
Эти пределы также могут быть полезными для выявления переполнения.
24.3. Массивы
Массив (array) — это последовательность, в которой доступ к каждому элементу осуществляется с помощью его индекса (позиции). Синонимом этого понятия является вектор (vector). В этом разделе мы уделим внимание многомерным массивам, элементами которых являются тоже массивы. Обычно многомерный массив называют матрицей (matrix). Разнообразие синонимов свидетельствует о популярности и полезности этого общего понятия. Стандартные классы vector (см. раздел Б.4), array (см. раздел 20.9), а также встроенный массив (см. раздел A.8.2) являются одномерными. А что если нам нужен двумерный массив (например, матрица)? А если нам нужны семь измерений? Проиллюстрировать одно- и двухмерные массивы можно так.

Массивы имеют фундаментальное значение в большинстве вычислений, связанных с так называемым “перемалыванием чисел” (“number crunching”). Наиболее интересные научные, технические, статистические и финансовые вычисления тесно связаны с массивами.


Столбец — это последовательность элементов, имеющих одинаковые первые координаты (х-координаты). Строка — это множество элементов, имеющих одинаковые вторые координаты (y-координаты).
24.4. Многомерные массивы в стиле языка С
В качестве многомерного массива можно использовать встроенный массив в языке С++ . В этом случае многомерный массив интерпретируется как массив массивов, т.е. массив, элементами которого являются массивы. Рассмотрим пример.
int ai[4]; // 1-мерный массив
double ad[3][4]; // 2-мерный массив
char ac[3][4][5]; // 3-мерный массив
ai[1] = 7;
ad[2][3] = 7.2;
ac[2][3][4] = 'c';

• Преимущества
• Непосредственное отображение с помощью аппаратного обеспечения.
• Эффективные низкоуровневые операции.
• Непосредственная языковая поддержка.
• Проблемы
• Многомерные массивы в стиле языка являются массивами массивов(см. ниже).
• Фиксированные размеры (например, фиксированные на этапе компиляции). Если хотите определять размер массива на этапе выполнения программы, то должны использовать свободную память.
• Массивы невозможно передать аккуратно. Массив превращается в указатель на свой первый элемент при малейшей возможности.
• Нет проверки диапазона. Как обычно, массив не знает своего размера.
• Нет операций над массивами, даже присваивания (копирования).
Встроенные массивы широко используются в числовых расчетах. Они также являются основным источником ошибок и сложностей. Создание и отладка таких программ у большинства людей вызывают головную боль. Если вы вынуждены использовать встроенные массивы, почитайте учебники (например, The C++ Programming Language, Appendix C, p. 836–840). К сожалению, язык C++ унаследовал многомерные массивы от языка C, поэтому они до сих пор используются во многих программах.

void f1(int a[3][5]); // имеет смысл только в матрице [3][5]
void f2(int [ ][5], int dim1); // первая размерность может быть
// переменной
void f3(int [5 ][ ], int dim2); // ошибка: вторая размерность
// не может быть переменной
void f4(int[ ][ ], int dim1, int dim2); // ошибка (совсем
// не работает)
void f5(int* m, int dim1, int dim2) // странно, но работает
{
for (int i=0; i<dim1; ++i)
for (int j = 0; j<dim2; ++j) m[i*dim2+j] = 0;
}
Здесь мы передаем массив m как указатель int*, даже если он является двумерным. Поскольку вторая переменная должна быть переменной (параметром), у нас нет никакой возможности сообщить компилятору, что массив m является массивом (dim1, dim2), поэтому мы просто передаем указатель на первую его ячейку. Выражение m[i*dim2+j] на самом деле означает m[i,j], но, поскольку компилятор не знает, что переменная m — это двумерный массив, мы должны сначала вычислить позицию элемента m[i,j] в памяти.
Этот способ слишком сложен, примитивен и уязвим для ошибок. Он также слишком медленный, поскольку явное вычисление позиции элемента усложняет оптимизацию. Вместо того чтобы учить вас, как справиться с этой ситуацией, мы сконцентрируемся на библиотеке С++, которая вообще устраняет проблемы, связанные с встроенными массивами.
24.5. Библиотека Matrix

• “Мой код должен выглядеть очень похожим на описание массивов, изложенное в большинстве учебников по математике”.
• Это относится также к векторам, матрицам и тензорам.
• Проверка на этапах компиляции и выполнения программы.
• Массивы любой размерности.
• Массивы с произвольным количеством элементов в любой размерности.
• Массивы являются полноценными переменными/объектами.
• Их можно передавать куда угодно.
• Обычные операции над массивами.
• Индексирование: ().
• Срезка: [].
• Присваивание: =.
• Операции пересчета (+=, –=, *=, %= и т.д.).
• Встроенные векторные операции (например, res[i] = a[i]*c+b[2]).
• Скалярное произведение (res = сумма элементов a[i]*b[i]; известна также как inner_product).
• По существу, обеспечивает автоматическое преобразование традиционного исчисления массивов/векторов в текст программы, который в противном случае вы должны были бы написать сами (и добиться, чтобы они были не менее эффективными).
• Массивы при необходимости можно увеличивать (при их реализации не используются “магические” числа).
Библиотека
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова