Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OOP_C++ / 04

.htm
Скачиваний:
31
Добавлен:
02.02.2015
Размер:
12 Кб
Скачать

04 - Массивы Содержание     Предыдущее занятие     Следующее занятие

Занятие 04 Массивы 1 Массивы Массивы относятся к так называемым сложным, или составным типам данных. Массив - это структура данных, состоящая из элементов одного типа. В отличие от других структур данных (например, списков), элементы массивов всегда последовательно расположены в памяти.

При объявлении массива после идентификатора в квадратных скобках задается константа (в частности именованная или константное выражение) - число элементов массива:

int a[5]; // Массив из пяти элементов типа int const int n = 5; double a1[n]; // Массив из пяти элементов типа double Число элементов массива нельзя задавать переменной или неконстантным выражением. Массив может инициализироваться списком значений в фигурных скобках:

int b[4] = {1, 2, 3, 4}; При наличии списка инициализации, охватывающего все элементы массива, можно не указывать число элементов массива, оно будет определено компилятором:

int c[] = {1, 2, 3}; // Массив из трех элементов типа int Если размерность массива больше числа значений в списке, то не инициализированные явно элементы массива будут установлены в 0 (значение по умолчанию). Если размерность массива меньше числа значений в списке, возникнет ошибка компиляции.

Один массив не может инициализироваться другим массивом и не может быть присвоен другому массиву. Чтобы скопировать один массив в другой, необходимо скопировать каждый элемент по очереди в цикле.

Доступ к каждому элементу осуществляется по его номеру в массиве (индексу), который указывается после имени массива в квадратных скобках. В качестве индекса массива может использоваться любое выражение, которое приводится к целочисленному значению. Индексы элементов массива всегда начинаются с 0, индекс последнего элемента на единицу меньше числа элементов в массиве. Размерность массива известна транслятору только в момент определения массива. При использовании стандартных массивов невозможен какой-либо автоматический контроль выхода за пределы массива.

2 Многомерные массивы Массивы с размерностью 2 и более рассматриваются как массивы массивов и для каждого измерения указывается число элементов:

double aa[2][2] = {1, 2, 3, 4}; // Матрица 2 * 2 То же самое, но более наглядно:

double aa[2][2] = {{1, 2}, {3, 4}}; Первая размерность - это размерность по строкам, а вторая - по столбцам. При инициализации списка значений вторая и последующие размерности должны указываться явно.

Для индексирования в многомерном массиве требуется пара скобок для каждого измерения:

int i = 0, j = 1; aa[i][j] = i + j; Элементы многомерных массивов в памяти выстраиваются в одномерную структуру (массив), в которой в начале стоят элементы первой строки, потом второй и т.д.

3 Примеры программ Пример 1 Следующая программа находит сумму элементов массива вещественных чисел.

#include <iostream> using namespace std; int main() { const int n = 5; double a[] = {1, 2, 1, 2.5, 1}; double sum = 0; for (int i = 0; i < n; i++) sum += a[i]; cout << "Sum is " << ' ' << sum; return 0; } Пример 2 Следующая программа находит номер максимального элемента в массиве целых чисел.

#include <iostream> using namespace std; int main() { const int n = 4; int a[] = {1, 2, 4, 8}; int indexOfMax = 0; for (int i = 1; i < n; i++) if (a[i] > a[indexOfMax]) indexOfMax = i; cout << indexOfMax << ' ' << a[indexOfMax]; return 0; } Пример 3 В следующей программе определяется сумма произведений строк двумерного массива.

#include <iostream> using namespace std; int main() { int a[][3] = {{1,2,3}, {2,3,4}, {0,1,2}, {1,1,12}}; int sum = 0; for (int i = 0; i < 4; i++) { int product = 1; for (int j = 0; j < 3; j++) product *= a[i][j]; sum += product; } cout << sum; return 0; } Пример 4 В следующей программе отрицательные элементы двумерного массива заменяются нулями.

#include <iostream> using namespace std; int main(int argc, char* argv[]) { double a[][3] = {{1, -2, 3}, {2.1, 3, -4}, {0,-0.5, 11}}; int i, j; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) if (a[i][j] < 0) a[i][j] = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) cout << '\t' << a[i][j]; cout << endl;

} return 0; } Пример 5 Необходимо проинициализировать двумерный массив целых чисел списком начальных значений, найти максимальный среди отрицательных элементов и вывести на экран.

При инициализации массива важно обратить внимание на обязательное явное указание количества столбцов:

int a[][3] = {{-4, 3, 11}, { 1, -1, -5}, { 0, -2, 12}, {15, 11, -9}}; Для вычисления максимума среди отрицательных элементов можно воспользоваться следующей схемой: вначале искомому значению присваивается очень большое по модулю отрицательное значение, затем в цикле данное значение заменяется, если текущий отрицательный элемент оказался больше. Гарантированно маленькое отрицательное число можно получить с помощью специализации шаблона класса numeric_limits (заголовочный файл limits) и получения искомого значения с помощью функции-элемента min() (объяснение данной конструкции будет дано позже):

int max = numeric_limits<int>::min(); Для обхода всех элементов двумерного массива необходимо вложить одну циклическую конструкцию в другую:

for (int i = 0; i < 4; i++) for (int j = 0; j < 3; j++) if (a[i][j] < 0) max = (max > a[i][j]) ? max : a[i][j]; // Выбор максимального из двух значений В некоторых случаях может оказаться, что исходный массив не содержит отрицательных элементов. В этом случае значение переменной max не изменится:

if (max == numeric_limits<int>::min()) cout << "No negative values"; else cout << max; Вся программа будет иметь следующий вид:

#include <iostream> #include <limits> using namespace std; int a[][3] = {{-4, 3, 11}, { 1, -1, -5}, { 0, -2, 12}, {15, 11, -9}}; int main(int argc, char* argv[]) { int max = numeric_limits<int>::min(); for (int i = 0; i < 4; i++) for (int j = 0; j < 3; j++) if (a[i][j] < 0) max = (max > a[i][j]) ? max : a[i][j]; if (max == numeric_limits<int>::min()) cout << "No negative values"; else cout << max; return 0; } 4 Задания на самостоятельную работу Задание 1 Найти сумму положительных элементов одномерного массива вещественных чисел.

Задание 2 Проинициализировать одномерный массив вещественных чисел списком начальных значений, определить сумму минимального и максимального элементов и вывести на экран.

Задание 3 Проинициализировать двумерный массив целых чисел списком начальных значений, найти произведение ненулевых (неравных нулю) элементов и вывести на экран. Для пропуска ненулевых элементов использовать оператор continue.

Задание 4* Проинициализировать одномерный массив вещественных чисел списком начальных значений, изменить порядок следования элементов на противоположный и вывести элементы массива на экран.

Задание 5* "Эратосфеново решето". Заполнить массив из трехсот целых чисел последовательными положительными значениями. Заменить все значения, не являющиеся простыми числами, некоторым отрицательным значением. Для этого последовательно исключать все числа - делители других чисел. Вывести на экран оставшиеся положительные значения (простые числа).

 

Содержание     Предыдущее занятие     Следующее занятие

 

© 2001 - 2006 Иванов Л.В.

Соседние файлы в папке OOP_C++