Массивы в С++

Содержание

Слайд 2

Определение

Массив – это группа переменных одного типа, расположенных в памяти рядом (в

Определение Массив – это группа переменных одного типа, расположенных в памяти рядом
соседних ячейках) и имеющих общее имя. Каждая ячейка в массиве имеет уникальный номер (индекс).

Надо:

выделять память
записывать данные в нужную ячейку
читать данные из ячейки

Резервирование памяти для массива выполняется на этапе компиляции программы.

2

Слайд 3

Выделение памяти (объявление)

int A[5];
double V[8];
bool L[10];
char S[80];

число элементов

const int N = 10;
int

Выделение памяти (объявление) int A[5]; double V[8]; bool L[10]; char S[80]; число
A[N];

размер через константу

A[0], A[1], A[2], A[3], A[4]

тип имя_массива[размер];

Слайд 4

Обращение к элементу массива

A

массив

2

15

НОМЕР элемента массива
(ИНДЕКС)

A[0]

A[1]

A[2]

A[3]

A[4]

ЗНАЧЕНИЕ элемента массива

A[2]

НОМЕР (ИНДЕКС) элемента массива: 2

ЗНАЧЕНИЕ

Обращение к элементу массива A массив 2 15 НОМЕР элемента массива (ИНДЕКС)
элемента массива: 15

Слайд 5

Как обработать все элементы массива?

Объявление:
Обработка:

const int N = 5;
int A[N];

// обработать A[0]
//

Как обработать все элементы массива? Объявление: Обработка: const int N = 5;
обработать A[1]
// обработать A[2]
// обработать A[3]
// обработать A[4]

Слайд 6

Как обработать все элементы массива?

Обработка с переменной:

i = 0;
// обработать A[i]
i ++;
//

Как обработать все элементы массива? Обработка с переменной: i = 0; //
обработать A[i]
i ++;
// обработать A[i]
i ++;
// обработать A[i]
i ++;
// обработать A[i]

i ++;

Обработка в цикле:

i = 0;
while ( i < N )
{
// обработать A[i]
i ++;
}

Цикл с переменной:

for( i = 0; i < N; i++ )
{
// обработать A[i]
}

Слайд 7

Заполнение массива

main()
{
const int N = 10;
int A[N];
int i;
for

Заполнение массива main() { const int N = 10; int A[N]; int
( i = 0; i < N; i++ )
A[i] = i*i;
}

Слайд 8

Ввод с клавиатуры и вывод на экран

Объявление:
Ввод с клавиатуры:
Вывод на экран:

const int

Ввод с клавиатуры и вывод на экран Объявление: Ввод с клавиатуры: Вывод
N = 10;
int A[N];

for ( i = 0; i < N; i++ )
{
cout << "A[" << i << "]=";
cin >> A[i];
}

A[1] =
A[2] =
A[3] =
A[4] =
A[5] =

5
12
34
56
13

cout << "Массив A:\n";
for ( i = 0; i < N; i++ )
cout << A[i] << " ";

Слайд 9

Ввод с клавиатуры

Ввод с клавиатуры

Слайд 10

Вывод на экран

Вывод на экран

Слайд 11

Заполнение случайными числами

for ( i = 0; i < N; i++ )

Заполнение случайными числами for ( i = 0; i { A[i] =

{
A[i] = rand()% 81 +20;
cout << A[i] << " ";
}

Задача. Заполнить массив (псевдо)случайными целыми числами в диапазоне от 20 до 100.

Слайд 12

Перебор элементов

Общая схема:

for ( i = 0; i < N; i++ )

Перебор элементов Общая схема: for ( i = 0; i { ...
{
... // сделать что-то с A[i]
}

Подсчёт нужных элементов:

Задача. В массиве записаны данные о росте баскетболистов. Сколько из них имеет рост больше 180 см, но меньше 190 см?

count = 0;
for ( i = 0; i < N; i++ )
if ( 180 < A[i] && A[i] < 190 )
count ++;

Слайд 13

Перебор элементов

Среднее арифметическое:

int count, sum;
count = 0;
sum = 0;
for ( i =

Перебор элементов Среднее арифметическое: int count, sum; count = 0; sum =
0; i < N; i++ )
if ( 180 < A[i] && A[i] < 190 ) {
count ++;
sum += A[i];
}
cout << (float)sum / count;

среднее арифметическое

Слайд 14

АЛГОРИТМЫ ОБРАБОТКИ МАССИВОВ

АЛГОРИТМЫ ОБРАБОТКИ МАССИВОВ

Слайд 15

Поиск в массиве

Найти элемент, равный X:

i = 0;
while ( A[i] != X

Поиск в массиве Найти элемент, равный X: i = 0; while (
)
i ++;
cout << "A[" << i << "]=" << X;

i = 0;
while ( i < N && A[i] != X )
i ++;
if ( i < N )
cout << "A[" << i << "]=" << X;
else
cout << "Не нашли!";

i < N

Слайд 16

Поиск в массиве

nX = -1;
for ( i = 0; i < N;

Поиск в массиве nX = -1; for ( i = 0; i
i++ )
if ( A[i] == X )
{
nX = i;
break;
}
if ( nX >= 0 )
cout << "A[" << nX << "]=" << X;
else
cout << "Не нашли!";

Вариант с досрочным выходом:

break;

досрочный выход из цикла

Слайд 17

Максимальный элемент

M = A[0];
for ( i = 1; i < N; i++

Максимальный элемент M = A[0]; for ( i = 1; i if
)
if ( A[i]> M )
M = A[i];
cout << M;

Слайд 18

Максимальный элемент и его номер

Максимальный элемент и его номер

Слайд 19

Реверс массива

«Простое» решение:

for( i = 0; i < N ; i++ )

Реверс массива «Простое» решение: for( i = 0; i { // поменять
{
// поменять местами A[i] и A[N+1-i]
}

N/2

остановиться на середине!

Слайд 20

Реверс массива

for ( i = 0; i < (N/2); i++ )

Реверс массива for ( i = 0; i { c = A[i];
{
c = A[i];
A[i] = A[N-1-i];
A[N-1-i] = c;
}

Слайд 21

Циклический сдвиг элементов

«Простое» решение:

c = A[0];
for ( i = 0; i <

Циклический сдвиг элементов «Простое» решение: c = A[0]; for ( i =
N-1; i++ )
A[i] = A[i+1];
A[N-1] = c;

Слайд 22

Отбор нужных элементов

«Простое» решение:

Задача. Отобрать элементы массива A, удовлетворяющие некоторому условию, в

Отбор нужных элементов «Простое» решение: Задача. Отобрать элементы массива A, удовлетворяющие некоторому
массив B.

сделать для i от 0 до N-1
если условие выполняется для A[i] то
B[i]= A[i]

A

B

выбрать чётные элементы

Слайд 23

Отбор нужных элементов

A

B

выбрать чётные элементы

count = 0;
for ( i = 0; i

Отбор нужных элементов A B выбрать чётные элементы count = 0; for
< N; i++ )
if ( A[i] % 2 == 0 )
{
B[count] = A[i];
count ++;
}

B[count] = A[i];

Слайд 24

СОРТИРОВКА

СОРТИРОВКА

Слайд 25

Что такое сортировка?

Сортировка – это расстановка элементов массива в заданном порядке.

…по возрастанию,

Что такое сортировка? Сортировка – это расстановка элементов массива в заданном порядке.
убыванию, последней цифре, сумме делителей, по алфавиту, …

Алгоритмы:
простые и понятные, но неэффективные для больших массивов
метод пузырька
метод выбора
сложные, но эффективные
«быстрая сортировка» (QuickSort)
сортировка «кучей» (HeapSort)
сортировка слиянием (MergeSort)
пирамидальная сортировка

Слайд 26

Метод пузырька (сортировка обменами)

Идея: пузырек воздуха в стакане воды поднимается со дна

Метод пузырька (сортировка обменами) Идея: пузырек воздуха в стакане воды поднимается со
вверх.
Для массивов – самый маленький («легкий» элемент перемещается вверх («всплывает»).

сравниваем два соседних элемента; если они стоят «неправильно», меняем их местами
за 1 проход по массиву один элемент (самый маленький) становится на свое место

1-й проход:

Слайд 27

Метод пузырька

2-й проход:

3-й проход:

4-й проход:

Метод пузырька 2-й проход: 3-й проход: 4-й проход:

Слайд 28

Метод пузырька

1-й проход:

сделать для j от N-2 до 0 шаг -1
если

Метод пузырька 1-й проход: сделать для j от N-2 до 0 шаг
A[j+1]< A[j] то
// поменять местами A[j] и A[j+1]

2-й проход:

сделать для j от N-2 до 1 шаг -1
если A[j+1]< A[j] то
// поменять местами A[j] и A[j+1]

1

единственное отличие!

Слайд 29

Метод пузырька

for ( i = 0; i < N-1; i++ )
for

Метод пузырька for ( i = 0; i for ( j =
( j = N-2; j >= i ; j-- )
if ( A[j] > A[j+1] )
{
// поменять местами A[j] и A[j+1]
}

i

Слайд 30

Метод выбора (минимального элемента)

Идея: найти минимальный элемент и поставить его на первое

Метод выбора (минимального элемента) Идея: найти минимальный элемент и поставить его на
место.

сделать для i от 0 до N-2
// найти номер nMin минимального // элемента из A[i]..A[N]
если i != nMin то
// поменять местами A[i] и A[nMin]

Слайд 31

Метод выбора (минимального элемента)

for ( i = 0; i < N-1; i++

Метод выбора (минимального элемента) for ( i = 0; i { nMin
)
{
nMin = i;
for ( j = i+1; j < N; j++ )
if ( A[j] < A[nMin] )
nMin = j;
if ( i != nMin )
{
// поменять местами A[i] и A[nMin]
}
}

nMin = i;
for ( j = i+1; j < N; j++ )
if ( A[j] < A[nMin] )
nMin = j;

Слайд 32

Быстрая сортировка (QuickSort)

Идея: выгоднее переставлять элементы, который находятся дальше друг от друга.

Быстрая сортировка (QuickSort) Идея: выгоднее переставлять элементы, который находятся дальше друг от друга.

Слайд 33

Быстрая сортировка

Шаг 2: переставить элементы так:
при сортировке элементы не покидают

Быстрая сортировка Шаг 2: переставить элементы так: при сортировке элементы не покидают
« свою область»!

Шаг 1: выбрать некоторый элемент массива X

Шаг 3: так же отсортировать две получившиеся области

Разделяй и властвуй (англ. divide and conquer)

Медиана – такое значение X, что слева и справа от него в отсортированном массиве стоит одинаковое число элементов (для этого надо отсортировать массив…).

Слайд 34

Быстрая сортировка

Разделение:
выбрать средний элемент массива (X=67)
установить L = 1, R =

Быстрая сортировка Разделение: выбрать средний элемент массива (X=67) установить L = 1,
N
увеличивая L, найти первый элемент A[L], который >= X (должен стоять справа)
уменьшая R, найти первый элемент A[R], который <= X (должен стоять слева)
если L<=R то поменять местами A[L] и A[R] и перейти к п. 3 иначе стоп.

Слайд 35

Быстрая сортировка

Быстрая сортировка

Слайд 36

Быстрая сортировка

const int N = 7;
int A[N];
...
main()
{
// заполнить массив
qSort(

Быстрая сортировка const int N = 7; int A[N]; ... main() {
0, N-1 ); // сортировка
// вывести результат
}

Основная программа:

глобальные данные

процедура сортировки

Слайд 37

Быстрая сортировка

void qSort( int nStart, int nEnd )
{
int L, R, c,

Быстрая сортировка void qSort( int nStart, int nEnd ) { int L,
X;
if ( nStart >= nEnd ) return; // готово
L = nStart; R = nEnd;
X = A[(L+R)/2]; // или X = A[irand(L,R)];
while ( L <= R ) { // разделение
while ( A[L] < X ) L ++;
while ( A[R] > X ) R --;
if ( L <= R ) {
c = A[L]; A[L] = A[R]; A[R] = c;
L ++; R --;
}
}
qSort ( nStart, R ); // рекурсивные вызовы
qSort ( L, nEnd );
}

Слайд 38

Быстрая сортировка

void qSort( int A[], int nStart,
int nEnd )
{
...

Быстрая сортировка void qSort( int A[], int nStart, int nEnd ) {
qSort ( A, nStart, R );
qSort ( A, L, nEnd );
}

Передача массива через параметр:

A,

A,

int A[],

main()
{ // заполнить массив
qSort( A, 0, N-1 ); // сортировка
// вывести результат
}

A,

Слайд 39

Быстрая сортировка

Сортировка массива случайных значений:

Быстрая сортировка Сортировка массива случайных значений:

Слайд 40

ДВОИЧНЫЙ ПОИСК

ДВОИЧНЫЙ ПОИСК

Слайд 41

Двоичный поиск

X = 7

X < 8

8

4

X > 4

6

X > 6

Выбрать средний элемент

Двоичный поиск X = 7 X 8 4 X > 4 6
A[c] и сравнить с X.
Если X = A[c], то нашли (стоп).
Если X < A[c], искать дальше в первой половине.
Если X > A[c], искать дальше во второй половине.

Слайд 42

Двоичный поиск

X = 44

Двоичный поиск X = 44

Слайд 43

Двоичный поиск

int X, L, R, c;
L = 0; R = N; //

Двоичный поиск int X, L, R, c; L = 0; R =
начальный отрезок
while ( L < R-1 )
{
c = (L+R) / 2; // нашли середину
if ( X < A[c] ) // сжатие отрезка
R = c;
else L = c;
}
if ( A[L] == X )
printf ( "A[%d]=%d", L, X );
else printf ( "Не нашли!" );

Слайд 44

Двоичный поиск

скорость выше, чем при линейном поиске

нужна предварительная сортировка

Число сравнений:

Двоичный поиск скорость выше, чем при линейном поиске нужна предварительная сортировка Число сравнений:

Слайд 45

МАТРИЦЫ

МАТРИЦЫ

Слайд 46

Что такое матрица?

Матрица — это прямоугольная таблица, составленная из элементов одного типа

Что такое матрица? Матрица — это прямоугольная таблица, составленная из элементов одного
(чисел, строк и т.д.). Каждый элемент матрицы имеет два индекса – номера строки и столбца.

строка 1, столбец 2

Слайд 47

Объявление матриц

const int N = 3, M = 4;
int A[N][M];
double X[10][12];
bool L[N][2];

строки

столбцы

строки

столбцы

тип

Объявление матриц const int N = 3, M = 4; int A[N][M];
имя_массива[n][m];

Матрицу можно объявить так:
где n-количество строк, m-количество столбцов.

Слайд 48

Простые алгоритмы

Заполнение случайными числами:

for ( i = 0; i < N; i++

Простые алгоритмы Заполнение случайными числами: for ( i = 0; i for
) {
for ( j = 0; j < M; j++ ) {
A[i][j] = rand()%80;
cout << width(3);
cout << A[i][j];
}
cout << endl;
}

Суммирование:

sum = 0;
for ( i = 0; i < N; i++ )
for ( j = 0; j < M; j++ )
sum += A[i][j];

Слайд 49

Перебор элементов матрицы

Главная диагональ:

for ( i = 0; i < N; i++

Перебор элементов матрицы Главная диагональ: for ( i = 0; i //
) {
// работаем с  A[i][i]
}

Побочная диагональ:

for ( i = 0; i < N; i++ ){
// работаем с  A[i][N-1-i]
}

Главная диагональ и под ней:

for ( i = 0; i < N; i++ )
for ( j = 0; j <=  i ; j++ )
{
// работаем с  A[i][j]
}

Имя файла: Массивы-в-С++.pptx
Количество просмотров: 44
Количество скачиваний: 2