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

Массивы

.pdf
Скачиваний:
24
Добавлен:
07.06.2015
Размер:
614.4 Кб
Скачать

//заполнение пустой части массива 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