2.1. Встроенный тип данных "массив"
2.1. Встроенный тип данных "массив"
Как было показано в главе 1, С++ предоставляет встроенную поддержку для основных типов данных – целых и вещественных чисел, логических значений и символов:
// объявление целого объекта ival
// ival инициализируется значением 1024
int ival = 1024;
// объявление вещественного объекта двойной точности dval
// dval инициализируется значением 3.14159
double dval = 3.14159;
// объявление вещественного объекта одинарной точности fval
// fval инициализируется значением 3.14159
float fval = 3.14159;
К числовым типам данных могут применяться встроенные арифметические и логические операции: объекты числового типа можно складывать, вычитать, умножать, делить и т.д.
int ival2 = ival1 + 4096; // сложение
int ival3 = ival2 - ival; // вычитание
dval = fval * ival; // умножение
ival = ival3 / 2; // деление
bool result = ival2 == ival3; // сравнение на равенство
result = ival2 + ival != ival3; // сравнение на неравенство
result = fval + ival2 dval; // сравнение на меньше
result = ival ival2; // сравнение на больше
В дополнение к встроенным типам стандартная библиотека С++ предоставляет поддержку для расширенного набора типов, таких, как строка и комплексное число. (Мы отложим рассмотрение класса vector из стандартной библиотеки до раздела 2.7.)
Промежуточное положение между встроенными типами данных и типами данных из стандартной библиотеки занимают составные типы – массивы и указатели. (Указатели рассмотрены в разделе 2.2.)
Массив – это упорядоченный набор элементов одного типа. Например, последовательность
0 1 1 2 3 5 8 13 21
представляет собой первые 9 элементов последовательности Фибоначчи. (Выбрав начальные два числа, вычисляем каждый из следующих элементов как сумму двух предыдущих.)
Для того чтобы объявить массив и проинициализировать его данными элементами, мы должны написать следующую инструкцию С++:
int fibon[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
Здесь fibon – это имя массива. Элементы массива имеют тип int, размер (длина) массива равна 9. Значение первого элемента – 0, последнего – 21. Для работы с массивом мы индексируем (нумеруем) его элементы, а доступ к ним осуществляется с помощью операции взятия индекса. Казалось бы, для обращения к первому элементу массива естественно написать:
int first_elem = fibon[1];
Однако это не совсем правильно: в С++ (как и в С) индексация массивов начинается с 0, поэтому элемент с индексом 1 на самом деле является вторым элементом массива, а индекс первого равен 0.Таким образом, чтобы обратиться к последнему элементу массива, мы должны вычесть единицу из размера массива:
fibon[0]; // первый элемент
fibon[1]; // второй элемент
...
fibon[8]; // последний элемент
fibon[9]; // ... ошибка
Девять элементов массива fibon имеют индексы от 0 до 8. Употребление вместо этого индексов 1-9 является одной из самых распространенных ошибок начинающих программистов на С++.
Для перебора элементов массива обычно употребляют инструкцию цикла. Вот пример программы, которая инициализирует массив из десяти элементов числами от 0 до 9 и затем печатает их в обратном порядке:
int main()
{
int ia[10];
int index;
for (index=0; index10; ++index)
// ia[0] = 0, ia[1] = 1 и т.д.
ia[index] = index;
for (index=9; index=0; --index)
cout ia[index] " ";
cout endl;
}
Оба цикла выполняются по 10 раз. Все управление циклом for осуществляется инструкциями в круглых скобках за ключевым словом for. Первая присваивает начальное значение переменной index. Это производится один раз перед началом цикла:
index = 0;
Вторая инструкция:
index 10;
представляет собой условие окончания цикла. Оно проверяется в самом начале каждой итерации цикла. Если результатом этой инструкции является true, то выполнение цикла продолжается; если же результатом является false, цикл заканчивается. В нашем примере цикл продолжается до тех пор, пока значение переменной index меньше 10. На каждой итерации цикла выполняется некоторая инструкция или группа инструкций, составляющих тело цикла. В нашем случае это инструкция
ia[index] = index;
Третья управляющая инструкция цикла
++index
выполняется в конце каждой итерации, по завершении тела цикла. В нашем примере это увеличение переменной index на единицу. Мы могли бы записать то же действие как
index = index + 1
но С++ дает возможность использовать более короткую (и более наглядную) форму записи. Этой инструкцией завершается итерация цикла. Описанные действия повторяются до тех пор, пока условие цикла не станет ложным.
Вторая инструкция for в нашем примере печатает элементы массива. Она отличается от первой только тем, что в ней переменная index уменьшается от 9 до 0. (Подробнее инструкция for рассматривается в главе 5.)
Несмотря на то, что в С++ встроена поддержка для типа данных “массив”, она весьма ограничена. Фактически мы имеем лишь возможность доступа к отдельным элементам массива. С++ не поддерживает абстракцию массива, не существует операций над массивами в целом, таких, например, как присвоение одного массива другому или сравнение двух массивов на равенство, и даже такой простой, на первый взгляд, операции, как получение размера массива. Мы не можем скопировать один массив в другой, используя простой оператор присваивания:
int array0[10]; array1[10];
...
array0 = array1; // ошибка
Вместо этого мы должны программировать такую операцию с помощью цикла:
for (int index=0; index10; ++index)
array0[index] = array1[index];
Массив “не знает” собственный размер. Поэтому мы должны сами следить за тем, чтобы случайно не обратиться к несуществующему элементу массива. Это становится особенно утомительным в таких ситуациях, как передача массива функции в качестве параметра. Можно сказать, что этот встроенный тип достался языку С++ в наследство от С и процедурно-ориентированной парадигмы программирования. В оставшейся части главы мы исследуем разные возможности “улучшить” массив.
Упражнение 2.1
Как вы думаете, почему для встроенных массивов не поддерживается операция присваивания? Какая информация нужна для того, чтобы поддержать эту операцию?
Упражнение 2.2
Какие операции должен поддерживать “полноценный” массив?
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
(3.5) Как отключить Dr. Watson, встроенный дебагер?
(3.5) Как отключить Dr. Watson, встроенный дебагер? Это не только позволит быстрее закрывать подвиснувшие приложения, но и позволит ускорить запуск программ и освободить пару мегабайт оперативной памяти. Сделать это можно выставив ключ Auto равным 0 по адресу
3.4. Как отключить Dr. Watson, встроенный дебагер?
3.4. Как отключить Dr. Watson, встроенный дебагер? Это не только позволит быстрее закрывать подвиснувшие приложения, но и позволит ускорить запуск программ и освободить пару мегабайт оперативной памяти. Сделать это можно выставив ключ Auto равным 0 по адресу HKEY_LOCAL_MACHINE -> SOFTWARE ->
12.5.3 CoolEdit - встроенный редактор программы Midnight Commander
12.5.3 CoolEdit - встроенный редактор программы Midnight Commander CoolEdit - это простая в использовании программа с привычными для большинства пользователей (особенно для тех, кто работал с Norton Commander под DOS или с FAR под WINDOWS) комбинациями управляющих клавиш. Кроме того, надо учитывать, что
Upsell, встроенный в корзину
Upsell, встроенный в корзину Последнее время в Рунете стала применяться методика, которая давно и успешно используется на Западе и позволяет увеличить средний чек в интернет-магазине.Когда человек после выбора товаров для заказа переходит в свою корзину, он видит там еще
Встроенный модуль ParentalControl Bar
Встроенный модуль ParentalControl Bar Если для серфинга в Интернете вы используете обозреватель Internet Explorer или Mozilla Firefox, то можно порекомендовать еще одну бесплатную и простую программу, точнее, встроенный модуль к браузеру – ParentalControl Bar.Домашняя страница, откуда можно ее
6.2.5. Преобразование в массив
6.2.5. Преобразование в массив Когда диапазон преобразуется в массив, интерпретатор последовательно вызывает метод succ, пока не будет достигнута правая граница, и помещает каждый элемент диапазона в возвращаемый массив:r = 3..12arr = r.to_a # [3,4,5,6,7,8,9,10,11,12]Ясно, что для диапазонов
Глава 9 Встроенный ассемблерный код
Глава 9 Встроенный ассемблерный код Сегодня лишь немногие программисты используют в своей практике язык ассемблера. Языки высокого уровня, такие как С и C++, поддерживаются практически на всех архитектурах и обеспечивают достаточно высокую производительность программ.
3.4.1. Встроенный строковый тип
3.4.1. Встроенный строковый тип Как уже было сказано, встроенный строковый тип перешел к С++ по наследству от С. Строка символов хранится в памяти как массив, и доступ к ней осуществляется при помощи указателя типа char*. Стандартная библиотека С предоставляет набор функций
Встроенный сервер под Windows
Встроенный сервер под Windows Библиотека встроенного сервера под Windows, естественно, разработана для работы на машинах, которые не используются как полноценный сервер. Если у вас есть копия библиотеки fbembed.dll, расположенная где-нибудь на полностью серверной машине,
Пример 17-9. "Анонимный" Встроенный Документ
Пример 17-9. "Анонимный" Встроенный Документ #!/bin/bash: <<TESTVARIABLES${HOSTNAME?}${USER?}${MAIL?} # Если одна из переменных не определена, то выводится сообщение об ошибке.TESTVARIABLESexit 0 Подобную технику можно использовать для создания "блочных
Прямоугольный массив
Прямоугольный массив Для создания прямоугольного массива установите переключатель в окне Array (Массив) в положение Rectangular Array (Прямоугольный массив) (см. рис. 6.7). При этом станут доступны следующие параметры.• Для изменения количества строк и столбцов используют поля Rows
8.4. Векторный редактор, встроенный в Word, или КОМПАС?
8.4. Векторный редактор, встроенный в Word, или КОМПАС? В учебнике [19] утверждается, что Word располагает простыми и вместе с тем мощными средствами для создания рисунков различной степени сложности: от элементарных геометрических фигур до сложных объемных фигур. В учебнике [20]
Встроенный мастер установки
Встроенный мастер установки Запускается мастер установки (рис. 15.1) с помощью значка Установка и удаление программ расположенного на Панели управления. Рис. 15.1. Окно изменения или удаления программУстановка программыЧтобы установить программу, щелкните на кнопке
Встроенный в колесо буксир поможет авиалайнерам маневрировать на земле Николай Маслухин
Встроенный в колесо буксир поможет авиалайнерам маневрировать на земле Николай Маслухин Опубликовано 31 марта 2014 Компания WheelTug разработала одноимённую систему буксировки современных пассажирских самолётов, обычно весьма неповоротливых на