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

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

Жанры

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

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]
в памяти.

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

Мастер Разума V

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

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Изгой. Пенталогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
9.01
рейтинг книги
Изгой. Пенталогия

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Невеста

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
8.54
рейтинг книги
Невеста

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Невеста напрокат

Завгородняя Анна Александровна
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Невеста напрокат