
Массивы
.pdf//заполнение пустой части массива for (i = m; i < N; i++)
{
//ввод нового элемента cin >> el;
//поиск и высвобождение места под новый элемент j = i - 1;
while (j >= 0 && el < mas[j])
{
//перемещение элемента mas[j] в позицию mas[j+1] mas[j+1] = mas[j];
j--;
}
//вставка нового элемента в массив mas[j+1] = el;
}
return 0;
}
Поиск ведется с конца заполненной части к началу массива следующим образом. Новый элемент el сравнивается по очереди с элементами mas[m-1], mas[m-2], mas[m-3+, … До тех пор, пока el меньше текущего элемента и не достигнуто начало массива, происходит высвобождение под него места путем перемещения большего элемента mas[j+ на одну позицию к концу массива. Новый элемент помещается в освободившуюся позицию.
Пример заполнения массива с помощью алгоритма сортировки вставкой приведен на рис. 4. Здесь к уже существующим элементам ,79, 420, 429-
(m=3) добавляются новые: 53, 908, 140, 897, 594, 682.
79 420 429 : 53
^
53 79 420 429 : 908
^
53 79 420 429 908 : 140
^
53 79 140 420 429 908 : 897
^
53 79 140 420 429 897 908 : 594
^
53 79 140 420 429 594 897 908 : 682
^
53 79 140 420 429 594 682 897 908
Рис. 4. Пример сортировки методом простых вставок
11
Для заполнения пустого массива нужно прежде ввести первый элемент (m=1), а после выполнить действия алгоритма сортировки вставкой.
...
cin >> mas[0];
for (i = 1; i < N; i++)
{
cin >> el; j = i - 1;
while (j >= 0 && el < mas[j])
{
mas[j+1] = mas[j]; j--;
}
mas[j+1] = el;
}
...
Поиск элемента по заданному значению
Рассмотрим два алгоритма поиска заданного элемента k в массиве mas из N элементов. Результатом поиска может быть одно из двух: либо поиск завершится успешно, и элемент k в массиве найден, либо поиск окажется неудачным, и элемент k не найден. Для хранения индекса найденного элемента будет использоваться целая переменная ind, которая в случае успешного поиска будет содержать индекс, в противном случае – значение -1.
Последовательный поиск
В данном алгоритме последовательно просматривается весь массив. Начинаем поиск с начала массива и продолжаем до конца, пока не будет найден искомый элемент; затем останавливаемся. Если элемент найден, то переменной ind присваиваем номер этого элемента.
#include "iostream"
int main()
{
const int N = 9; int k, ind, i;
//задание значений элементов массива
int mas[N] = {420, 79, 429, 53, 908, 140, 897, 594, 682};
cout << "Введите значение для поиска: "; cin >> k;
12
//поиск значения k в массиве ind = -1;
for (i = 0; i < N; i++)
if (mas[i] == k) { ind = i; break;}
//вывод результата поиска
if (ind < 0) cout << "Искомое значение в массиве не найдено!\n";
else cout << "Искомый элемент mas[" << ind << "] = " << mas[ind] << "\n";
return 0;
}
Бинарный поиск
Если массив упорядочен, то можно использовать более эффективный алгоритм поиска, например, бинарный поиск (или метод деления пополам). Обозначим через l – левую границу поиска, r – правую границу поиска и sr – индекс элемента, находящегося в середине массива. Сравним искомый элемент k со средним элементом a[sr+. Если они совпадают, то поиск завершен успешно и местоположение определено. Если искомый элемент больше, то берем правую половину массива (элементы с индексами от sr + 1 до r); если меньше – то левую (элементы с индексами от l до sr – 1). Процесс повторяется до тех пор, пока не будет найден нужный элемент или диапазон поиска не будет исчерпан.
#include "iostream"
int main()
{
const int N = 9;
int k, l, r, sr, ind;
//задание значений элементов массива
int mas[N] = {53, 79, 140, 420, 429, 594, 682, 897, 908};
cout << "Введите значение для поиска: "; cin >> k;
//поиск значения k в массиве ind = -1;
l = 0; r = N - 1; while ( l <= r)
{
sr = (l + r) / 2;
if (mas[sr] == k) { ind = sr; break;} if (mas[sr] < k) l = sr + 1;
13
else r = sr - 1;
}
//вывод результата поиска
if (ind < 0) cout << "Искомое значение в массиве не найдено!\n";
else cout << "Искомый элемент mas[" << ind << "] = " << mas[ind] << "\n";
return 0;
}
Пример процесса бинарного поиска элемента 594 в упорядоченном массиве из девяти элементов {53, 79, 140, 420, 429, 594, 682, 897, 908}
приведен на рис. 5. Скобки показывают границы просмотра (элементы с индексами от l до r), а подчеркнутое число – середину этого участка массива (элемент с индексом sr).
|
|
|
|
|
|
|
|
|
Переменные |
||
Элементы |
массива |
|
|
|
|
|
l |
sr |
r |
||
|
|
|
|
|
|
|
|
|
|
|
|
[53 |
79 |
140 |
420 |
429 |
594 |
682 |
897 |
908] |
0 |
4 |
8 |
53 |
79 |
140 |
420 |
429 |
[594 |
682 |
897 |
908] |
5 |
6 |
8 |
53 |
79 |
140 |
420 |
429 |
[594] 682 |
897 |
908 |
5 |
5 |
5 |
Рис. 5. Пример бинарного поиска элемента в массиве
Лабораторная работа «ОДНОМЕРНЫЕ МАССИВЫ»
Вариант 1
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)вычислить сумму отрицательных элементов массива;
2)вычислить произведение элементов массива, расположенных между максимальным и минимальным элементами;
3)отсортировать массив по убыванию методом выбора.
Вариант 2
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
1)вычислить сумму положительных элементов массива;
2)вычислить произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами;
3)отсортировать массив по возрастанию методом выбора.
14
Вариант 3
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)упорядочить при вводе элементы массива по возрастанию методом простой вставки;
2)выполнить бинарным методом поиск в массиве введенного пользователем значения и вывести его индекс на экран;
3)вычислить сумму элементов массива, расположенных между первым и последним положительными элементами.
Вариант 4
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
1)вычислить произведение элементов массива с четными номерами;
2)вычислить сумму элементов массива, расположенных между первым и последним отрицательными элементами;
3)отсортировать массив по убыванию методом "пузырька".
Вариант 5
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)вычислить сумму элементов массива с нечетными номерами;
2)отсортировать массив по возрастанию методом "пузырька";
3)выполнить бинарным методом поиск в массиве введенного пользователем значения.
Вариант 6
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
1)найти максимальный элемент массива;
2)подсчитать количество элементов массива, лежащих в диапазоне от R1 до R2, вводимых пользователем;
3)отсортировать массив по возрастанию методом "пузырька".
Вариант 7
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)найти минимальный элемент массива;
2)вычислить сумму элементов массива, расположенных между первым и последним нулевыми элементами;
15
3) отсортировать массив по убыванию методом выбора.
Вариант 8
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
1)найти максимальный по модулю элемент массива;
2)вычислить сумму элементов массива, расположенных после первого положительного элемента;
3)отсортировать массив по возрастанию методом выбора.
Вариант 9
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)упорядочить при вводе элементы массива по убыванию методом простой вставки;
2)найти методом последовательного поиска в массиве введенное пользователем значение и вывести его индекс на экран;
3)вычислить сумму модулей элементов массива, расположенных после последнего отрицательного элемента.
Вариант 10
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
1)найти индекс максимального по модулю элемента массива;
2)вычислить сумму элементов массива, расположенных до последнего положительного элемента включительно;
3)отсортировать массив по возрастанию методом "пузырька".
Вариант 11
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)вычислить сумму модулей элементов массива, расположенных после первого элемента, равного нулю;
2)найти методом последовательного поиска в массиве введенное пользователем значение и вывести его индекс на экран;
3)отсортировать массив по убыванию методом "пузырька".
Вариант 12
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
16
1)подсчитать количество элементов массива, больших введенного пользователем значения R;
2)вычислить сумму элементов массива, расположенных между первым и вторым отрицательными элементами;
3)отсортировать массив по возрастанию методом выбора.
Вариант 13
Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
1)упорядочить по убыванию при вводе элементы массива методом простой вставки;
2)подсчитать количество элементов массива, лежащих в диапазоне от R1 до R2, вводимых пользователем;
3)найти индекс минимального по модулю элемента массива.
Вариант 14
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)подсчитать количество положительных элементов массива;
2)вычислить произведение элементов массива, расположенных между первым и вторым нулевыми элементами;
3)отсортировать массив по убыванию методом выбора.
Вариант 15
Написать программу работы с одномерным массивом из 15 целых элементов для решения задач:
1)подсчитать количество элементов массива, равных 0;
2)вычислить сумму элементов массива, расположенных после максимального элемента;
3)отсортировать массив по убыванию методом "пузырька".
Многомерные массивы
Размерностью массива называется количество его индексов. Например, массив размерностью два – двумерный массив – соответствует математическому понятию прямоугольной матрицы.
17

При описании многомерного массива размерность задается квадратными скобками, в которых указывается количество допустимых значений каждого индекса.
Примеры описания многомерных массивов.
int mas[3][4]; |
//описание целочисленного двумерного массива |
|
//из 3-х строк и 4-х столбцов |
const int N = 5;
double A[2*N][2*N]; //описание двумерного вещественного массива
|
//A размером 10×10 элементов |
int B[2][4][2]; |
//описание трехмерного целочисленного |
|
//массива B |
Примечание.
Стандарт языка С++ не накладывает ограничения на размерность массива, но каждый компилятор задает максимальное количество индексов массива. На практике обычно
используются массивы размерностью не более трех.
Для доступа к элементу многомерного массива после имени в квадратных скобках указываются все его индексы. Например, mas[i][j+ или
A[0][0].
Для инициализации многомерного массива каждый элемент-массив заключается в свои фигурные скобки, либо задается общий список элементов в том порядке, в котором элементы располагаются в памяти.
Например,
int mas[3][4] = { {0, -1, 2, -7}, {9, 7, 5, 8}, {3, 0, 1, -6} };
или
int mas[3][4] = {0, -1, 2, -7, 9, 7, 5, 8, 3, 0, 1, -6};
Элементы многомерного массива размещаются в оперативной памяти в последовательных ячейках построчно. Поэтому многомерные массивы быстрее просматриваются по строкам, а не по столбцам. Для просмотра используются вложенные циклы. Быстрый просмотр массива будет обеспечен, если первый индекс будет изменяться во внешнем цикле, а последний индекс – во внутреннем цикле.
Рассмотрим работу с двумерными массивами на следующих примерах. Пример 1. Ввод и вывод элементов двумерного массива
const int kolStr = 3, kolStb = 4;
18
int i, j, mas[kolStr][kolStb] = {0};
//ввод элементов массива for (i = 0; i < kolStr; i++)
{
for (j = 0; j < kolStb; j++)
{
cout << "mas[" << i << "][" << j << "] = "; cin >> mas[i][j];
} |
|
cout << "---------- |
\n"; |
}
//вывод элементов массива for (i = 0; i < kolStr; i++)
{
for (j = 0; j < kolStb; j++) cout << mas[i][j] << '\t';
cout << '\n';
}
Пример 2. Вычисление суммы всех элементов матрицы
sum = 0;
for (i = 0; i < kolStr; i++)
for (j = 0; j < kolStb; j++) sum += mas[i][j];
Пример 3. Поиск максимального элемента матрицы
max = mas[0][0];
for (i = 0; i < kolStr; i++)
for (j = 0; j < kolStb; j++)
if (mas[i][j] > max) max = mas[i][j];
Пример 4. Дан двумерный массив mas. Составить вектор b такой, что а) bi – максимальный элемент i-й строки
for (i = 0; i < kolStr; i++)
{
max = mas[i][0];
for (j = 0; j < kolStb; j++)
if (mas[i][j] > max) max = mas[i][j]; b[i] = max;
}
б) bi – среднее арифметическое отрицательных элементов текущей строки
19
double s; int k;
for (i = 0; i < kolStr; i++)
{
k = 0; s = 0;
for (j = 0; j < kolStb; j++) if (mas[i][j] < 0)
{
s +=mas[i][j]; k++;
}
b[i] = s/k;
}
Лабораторная работа «ДВУМЕРНЫЕ МАССИВЫ»
Вариант 1
Написать программу работы с двумерным целочисленным массивом из 5 строк и 7 столбцов для решения задач:
1)определить количество строк, не содержащих ни одного нулевого элемента;
2)найти максимальное из чисел, встречающихся в заданном массиве более одного раза.
Вариант 2
Написать программу работы с двумерным вещественным массивом из 5 строк и 5 столбцов для решения задач:
1)вычислить сумму элементов главной и побочной диагоналей;
2)найти номер строки с максимальной суммой положительных элементов.
Вариант 3
Написать программу работы с двумерным целочисленным массивом из 5 строк и 7 столбцов для решения задач:
1)определить количество столбцов, не содержащих ни одного нулевого элемента;
2)найти номер строки, в которой находится самое минимальное количество одинаковых элементов.
Вариант 4
Написать программу работы с двумерным целочисленным массивом из 5 строк и 7 столбцов для решения задач:
20