2.1. Встроенный тип данных "массив"Как было показано в главе 1, С++ предоставляет встроенную поддержку для основных типов данных – целых и вещественных чисел, логических значений и символов: // объявление целого объекта ival // ival инициализируется значением 1024 К числовым типам данных могут применяться встроенные арифметические и логические операции: объекты числового типа можно складывать, вычитать, умножать, делить и т.д. int ival2 = ival1 + 4096; // сложение int ival3 = ival2 - ival; // вычитание В дополнение к встроенным типам стандартная библиотека С++ предоставляет поддержку
для расширенного набора типов, таких, как строка и комплексное число. (Мы отложим
рассмотрение класса vector из стандартной библиотеки до раздела 2.7.) 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 является одной из самых распространенных ошибок начинающих
программистов на С++. int main() { int ia[10]; int index; for (index=0; index<10; ++index) Оба цикла выполняются по 10 раз. Все управление циклом for осуществляется инструкциями в круглых скобках за ключевым словом for. Первая присваивает начальное значение переменной index. Это производится один раз перед началом цикла: index = 0; Вторая инструкция: index < 10; представляет собой условие окончания цикла. Оно проверяется в самом начале каждой итерации цикла. Если результатом этой инструкции является true, то выполнение цикла продолжается; если же результатом является false, цикл заканчивается. В нашем примере цикл продолжается до тех пор, пока значение переменной index меньше 10. На каждой итерации цикла выполняется некоторая инструкция или группа инструкций, составляющих тело цикла. В нашем случае это инструкция ia[index] = index; Третья управляющая инструкция цикла ++index выполняется в конце каждой итерации, по завершении тела цикла. В нашем примере это увеличение переменной index на единицу. Мы могли бы записать то же действие как index = index + 1 но С++ дает возможность использовать более короткую (и более наглядную) форму
записи. Этой инструкцией завершается итерация цикла. Описанные действия повторяются
до тех пор, пока условие цикла не станет ложным. int array0[10]; array1[10]; ... array0 = array1; // ошибка Вместо этого мы должны программировать такую операцию с помощью цикла: for (int index=0; index<10; ++index) array0[index] = array1[index]; Массив “не знает” собственный размер. Поэтому мы должны сами следить за тем, чтобы случайно не обратиться к несуществующему элементу массива. Это становится особенно утомительным в таких ситуациях, как передача массива функции в качестве параметра. Можно сказать, что этот встроенный тип достался языку С++ в наследство от С и процедурно-ориентированной парадигмы программирования. В оставшейся части главы мы исследуем разные возможности “улучшить” массив. Упражнение 2.1Как вы думаете, почему для встроенных массивов не поддерживается операция присваивания? Какая информация нужна для того, чтобы поддержать эту операцию? Упражнение 2.2Какие операции должен поддерживать “полноценный” массив? Назад ВпередСодержание |
Нет комментариев. Оставить комментарий: |