- •Содержание отчета
- •Оценивание работы студента
- •1. Проектирование, написание и отладка программ, содержащих структуру выбора
- •1.1. Цель работы
- •1.2. Методические указания по подготовке к лабораторной работе
- •1.3. Контрольные вопросы
- •1.4. Содержание отчета
- •1.5. Варианты индивидуальных заданий
- •2. Программная реализация циклических вычислительных процессов
- •2.1. Цель работы
- •2.2. Методические указания по подготовке к лабораторной работе
- •2.3. Контрольные вопросы
- •2.4. Содержание отчета
- •2.5. Варианты индивидуальных заданий на оценку «хорошо»
- •2.6. Варианты индивидуальных заданий на оценку «отлично»
- •3. Обработка массивов
- •3.1. Цель работы
- •3.2. Методические указания по подготовке к лабораторной работе
- •3.3. Контрольные вопросы
- •3.4. Содержание отчета
- •3.5. Варианты индивидуальных заданий
- •4.4. Содержание отчета
- •4.5. Варианты индивидуальных заданий
- •5. Сортировка массивов
- •5.1. Цель работы
- •5.2. Методические указания по подготовке к лабораторной работе
- •5.3. Контрольные вопросы
- •5.4. Содержание отчета
- •5.5. Варианты индивидуальных заданий
3. Обработка массивов
3.1. Цель работы
Изучение понятия «массив», представления элементов одномерных и многомерных массивов, порядка индексации элементов и освоение методики проектирования алгоритмов обработки массивов данных.
3.2. Методические указания по подготовке к лабораторной работе
Необходимо изучить понятие «массив», способы описания, инициализации, индексации массивов, языковые средства С++ для работы с массивами. Повторить материал предыдущего практического занятия по работе с циклами.
При подготовке к работе необходимо изучить конспект лекций по указанной теме, методические указания.
Массив – это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип. Чтобы сослаться на отдельную ячейку, называемую элементом массива, необходимо указать имя массива и порядковый номер ячейки – ее индекс.
Массив характеризуется типом данных ячеек, размерностью и размером. Размерность массива – это количество его измерений. Массив может быть одномерным (вектор), двухмерным (матрица), трехмерным и т.д. Размер массива – это количество его элементов. Для многомерных массивов каждое измерение имеет свой размер (10х15, 10х5х4 и т.д.). Общий размер массива равен произведению размеров его отдельных измерений (соответственно 150 и 200). Необходимо заметить, что на физическом уровне любой массив хранится в памяти как одномерный, т.е. как последовательность подряд пронумерованных ячеек. Представление массивов в матричном, трехмерном и т.д. виде осуществляется только для удобства пользователя (т.е. программиста). Например, элемент матрицы (размером m*n) с индексами(i,j) хранится в памяти со смещением i*n+j.
В языке С++ принято, что нумерация элементов массива (по любому из его измерений) начинается с нуля. Соответственно последний элемент массива имеет индекс на единицу меньше количества элементов.
Для доступа к элементу многомерного массива необходимо указать все его индексы (в соответствии с размерностью). Первый индекс – это номер строки, второй – номер столбца, третий – номер слоя и т.д. Например, выражение mas[3][2][1] означает обращение к элементу в третьей строке, втором столбце и первом слое трехмерного массива mas (в математической формуле в этом случае написали бы ). Не забывайте, что в языке С++ нумерация элементов массива (по любому из его измерений) начинается с нуля.
Часто при работе с массивами фактический размер не равен точно объявленному максимальному (т.е. заполнены и обрабатываются не все 100 ячеек массива, а, например, только первые 34). В этом случае фактический размер массива необходимо хранить в отдельной переменной.
Для доступа к элементу массива необходимо указать имя массива и индекс элемента. Часто элементы массива обрабатываются последовательно. Для этого удобно использовать цикл for: for(int i=0;i<n;i++) { обработка }. Здесь буквой n обозначен фактический размер массива. Можно аналогичным образом обрабатывать элементы массива и в обратном порядке:
for(int i=n-1;i>=0;i--) { обработка }.
При работе с массивами могут использоваться вспомогательные индексные массивы или массивы флагов. Индексные массивы используются для изменения порядка доступа к основному массиву и содержат в своих ячейках индексы основного массива. Очевидно, что тип данных для индексных массивов всегда целочисленный (обычно int или long). Массивы флагов содержат булевы переменные, логически (в уме программиста) связанные с соответствующими элементами основного массива.
При обмене местами двух элементов массива используется так называемый метод пустого стакана: обмен a[i]a[j] реализуется с помощью трех присваиваний w=a[i]; a[i]=a[j]; a[j]=w.
Частыми операциями с массивами являются вставка и удаление элемента массива. Для вставки элемента в середину массива на позицию k необходимо сдвинуть вправо все элементы массива с индексами большими или равными k, для чего используется обратный цикл for (почему?). Для удаления элемента с индексом k необходимо сдвинуть влево все элементы массива с индексами большими k.
Обработка элементов многомерных массивов обычно производится во вложенных циклах for. Для многомерных массивов также могут использоваться флаговые и (реже) индексные массивы. В качестве флагового может применяться массив, совпадающий по размеру с базовым массивом, либо совокупность отдельных одномерных флаговых массивов, флаги в которых означают вычеркивание (или сохранение) всей соответствующей строки или столбца.
Для хранения больших по размеру симметричных (относительно главной диагонали) матриц используется упакованный формат. В упакованном формате симметричные по расположению и равные между собой элементы и хранятся один раз, а не два, как в обычном формате за счет того, что хранится только нижняя или только верхняя треугольная часть матрицы. При использовании верхней треугольной упаковки матрица размером хранится в виде одномерного массива (размером ), элемент которого содержит значения элементов матрицы, где между индексами существует соотношение: , или при условии , .