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

a

c

-5

0

12

54

-8

0

0
-5

1
0

2
13

0

1

2

3

4

1

46

83

-8

2

54

0

93

b

A

N

D

0

1

2

3

O

R

...

T

4

5

... 255

Объявление массива:
[] [] ...[=
{}];
Количество индексов задает размерность массива.
Тип индекса – порядковый – определяет доступ к элементу.
Нумерация индексов ВСЕГДА начинается с 0.
Размер – определяет количество элементов по данному индексу.
Тип элемента – любой кроме файла, в том числе, другой массив.
Массив в памяти не может занимать более 2 Гб.

1

3.1 Одномерные массивы
Одномерными называются массивы, в котором положение элемента
в массиве определяется одним индексом.
Объявление одномерных массивов
Примеры определения одномерных массивов;
int a[10];

- массив на 10 целых чисел;// индекс меняется 0 - 9

float mas[20] – массив на 20 вещественных чисел;
char sim[8] – массив на 8 символов;
double massiv[30] – массив на 30 вещественных чисел двойной точности;
unsigned int koord[10] – массив целых беззнаковых чисел .
Индекс меняется от 0 до величины, на 1 меньшей указанной
в размере
Инициализация массива при объявлении
int a[5]={0,-36,78,3789,50};
float b[10]={0,-3.6,7.8,3.789,5.0,6.1,0,-6.5,8.9,3.0};
long double c[4]={7.89L,6.98L,0.5L,56.8L};

2

Операции над одномерными массивами
1. Доступ к элементу массива:
Пример:
int a[5],l;
...
a[0]=51; {прямой доступ}
...
l=3;
a[l]:=3; {косвенный доступ: значения индексов
находятся в переменных}

3

Косвенный доступ к элементам массива

Прямой доступ

Косвенный доступ

Косвенный доступ позволяет реализовать
последовательную обработку элементов массивов:
for(i=1;i=0;i--) a[i]=i*i;
4

Операции над массивами (2)
2. Ввод массивов.
Оуществляется поэлементно:
Пример 1. Ввод элементов одномерного массива
int a[5]; //массив на 5 целых чисел
...
for(i=0;i
Операции над массивами (3)
3. Вывод массива
Также осуществляется поэлементно.
0

6

int b[7]={-3,5,8,-45,0,-1,8};
...
for(j=0;j
Пример программы с вводом выводом
Написать программу формирования массива b из
отрицательных элементов массива a

// Ex3_1
#include "stdafx.h"
#include
int a[8],b[8];
int i,j,n;
int main(int argc, char* argv[])
{
puts("Input n
Пример программы с вводом выводом(2)
j=-1;
for(i=0;i
3.2 Основные приемы программирования
обработки одномерных массивов
Все задачи по работе с массивами можно разбить на следующие
группы:
1. Однотипная обработка массивов.
2. Переформирование массивов.
3. Одновременная обработка нескольких массивов и/или
подмассивов.
4. Поисковые задачи.
3.2.1 Однотипная обработка массивов
a) Поэлементная (нахождение суммы элементов, произведения
элементов,
среднего
арифметического,
среднего
геометрического, подсчет количества элементов, отвечающих
определенному условию или обладающих некоторыми
признаками, а также их суммы, произведения и т.д. ).
Пример. Написать программу определения
элемента массива и его положения в массиве.

максимального

Определить максимальный элемент массива и
его номер
А

45

АMAX
45
56

34

56

2

IMAX

i

20

-3

3
412

{

}

10

Программа определения максимального
элемента массива и его номера
//Ex3_2;
#include “stdafx.h”
#include
int main(int argc, char* argv[])
{float a[5], amax; int i, imax;
puts(“Input 5 values:”);
for(i=0;i
Однотипная обработка массивов(2)
b) Выборочная (задачи по формулировке сходные с задачами
предыдущего типа, но операция выполняется не надо всеми
элементами массива, а только теми, которые имеют вполне
определенное значение индексов).
Особенностью таких
задач является наличие определенного
закона изменения индексов рассматриваемых элементов.
Пример .
Написать программу, определяющую количество отрицательных
элементов среди элементов одномерного массива целых чисел,
стоящих на четных местах.
int A[7]
45 -34 12 -25 16

11

10

0

5

6

1

2

3

4

1.Счетный цикл
а) i = 1 – n/2 с шагом 1
Nel=i*2-1
б) i = 1 – n с шагом 2
Nel=i
2. Цикл с постусловием

Программа определения количества
отрицательных элементов, стоящих на четных
местах
// Ex3_3.cpp
#include "stdafx.h"
#include
int a[7];
int i,kol,n;
int main(int argc, char* argv[])
{ puts("Input n
Продолжение программы
1

kol=0;
for(i=1;i
3.2.2 Переформирование массива.


Переформирование массива без изменения его
размеров (перестановки элементов различного характера и
сортировки).

Пример. Написать программу
возрастанию его элементов.

упорядочивания

массива

1. Находим минимальный
элемент и его номер

int A[8]

2. Меняем его местами с 0
-10
20 -10
-4 15
6

0

1

2

-4
8

3

10
6 15
8 10
19 20
19

4

5

6

7

3. В оставшейся чисти массива
находим минимальный
элемент
4. Меняем его с 1
Далее действие 3 и 4 повторяем,
пока не закончится массив

по

Переформирование массива (2)
// Ex3_4.cpp
#include "stdafx.h"
#include
int a[8];
int i,j,imin,min,n;
int main(int argc, char* argv[])
{puts("Input n
Переформирование массивов (3)
for(i=0;i
Переформирование массивов (4)
b)

Переформирование массива с изменением его размеров
(вычеркивание и вставка элементов, отвечающих определенным
условиям или обладающих заданными признаками).

Пример. Дан одномерный массив. Вычеркнуть
отрицательные элементы. Есть 2 варианта решения.
1.

него

i=0

int B[6]
10
-3 10
-5
-5
6 10
-1
6 -1
2
6 -1
2
0
2
0

из

i
Переформирование массивов (5)
2.

i=2
i=1
i=0
i=5
i=4
i=3

i=0 - 5

10
-3

-5
6

10
2

J=j+1=0
J=j+1=1
j=
j= -1
3 -5
J=j+1=2

6
0

-1
0

j= -1
2
0

n=6
n=3

Ex3_5
#include "stdafx.h"
#include
int b[6];
int i,j,n;
int main(int argc, char* argv[])
{puts("Input n
Переформирование массивов (6)
puts("Inputed Massiv");
for(i=0;i
3.2.3 Одновременная обработка массивов
a)

Синхронная обработка нескольких массивов или подмассивов
Пример. Дан массив целых чисел, содержащий четное количество
элементов. Определить, является ли вторая половина массива,
копией первой.

int s[8]

key=false
key=true

key=true

1

8

3

9

1

8

3

9

0

1

2

3

4

5

6

7

5

6

4

2

6

4

key=1
i=0

i= 0 - 3

j= 4 - 7

key&&i
Синхронная обработка нескольких массивов
или подмассивов
//Ex3_6
#include "stdafx.h"
#include
int main(int argc, char* argv[])
{int s[8];
int i,n,key;
puts("Input kol.elementov chetnoe n
Продолжение программы
1

key=1;
for(i=0;i
Одновременная обработка массивов
Асинхронная обработка массивов
Пример. Дан массив А вещественных чисел.
Переписать в массив С все отрицательные элементы
массива А.
б)

float A[5],C[5]
J=j+1=2
j=j+1=0
j=j+1=1
j=-1
i=0
i=3
i=2
i=1
i=4
2.4 -6.4 -2.0 7.4 -1.9

-6.4 -2.0 -1.9

Асинхронная обработка массивов(2)
// Ex3_7.cpp
#include "stdafx.h"
#include
int main(int argc, char* argv[])
{ float A[5],C[5];
int i,j;
printf("Input 5 elem \n");
for(i=0;i
Асинхронная обработка массивов(3)
j=-1;
for(i=0;i
3.2.4 Поисковые задачи
Пример:
Дан массив А вещественных чисел. Определить первый
отрицательный элемент массива и его номер.
key=0

float A[6] ={2.6,4.7,-5.8,-4.0,7.1,-5.0}

i=0

i=2
i=1
i=0

нет
(key=0) и (i
Поисковые задачи (2)
// Ex3_8.cpp
#include "stdafx.h"
#include
int main(int argc, char* argv[])
{ float potr,A[6]={2.6,4.7,-5.8,-4.0,7.1,-5.0};
int i,iotr,key;
puts("Inputed Massiv A");
for(i=0;i
3.3 Обработка матриц
Двумерными называются массивы, имеющие два индекса. По аналогии
с математикой, иногда такие массивы называют матрицами.
Для простоты изложения в дальнейшем будем придерживаться именно
этой терминологии.
Описание матриц
int a[4][5] – матрица целого типа из 4 строк и 5 столбцов
индексы меняются первый от 0 до 3, второй от 0 до 4
float matr[10][20] – матрица вещественного типа из 10 строк и 20
столбцов
double x[10][10] - матрица вещественного типа с двойной
точностью из 10 строк и 10 столбцов
В памяти матрицы располагаются по строкам. Быстрее изменяется
второй индекс

Расположение матрицы в памяти
int A[4][3]
0

1

2

0

1

2

0

12

45

11

67

21

56

90

i=0

i=1

i=2

1
0

2

0

1

2

j=0 - 2

-13 44 -87 -54

i=3

Инициализация матриц при объявлении
short x[3][4] ={{9,6,-56,0}, {10,3,-4,78}, {-6,8,45,7}};
int A[4][3]={{12,45,11},{67,21,56},{90,0,-13},{44,-87,-54}};

Операции над матрицами
1. Доступ к элементам матрицы

Пример:
int a[5][4],i,j;
...
a[0][1]=5.1; {прямой доступ}
...
i=3;j=3
a[i][j]:=23; {косвенный доступ: значения индексов
находятся в переменных}

Операции над матрицами (2)
2. Ввод матриц
Оуществляется поэлементно, по строкам:
Пример 1. Ввод элементов матрицы

i=0,n-1,1

const int n=3;
const int m=4;
float A[n][m];
printf(“Input %3d strok po %3d elem.\n”);
for(int i=0;i
Операции над матрицами (3)
3. Вывод матриц
Осуществляется поэлементно, по строкам или
по столбцам, в зависимости от требования
программы
Пример 1. Вывод элементов матрицы

....
puts(“ MASSIV”);
for(int i=0;i
3.3.1 Особенности программирования
обработки матриц
1.
2.

При обработке матриц используются вложенные циклы.
Обработка матриц может производиться как по строкам, так и по
столбцам.
3.
Так как матрица расположена в памяти по строкам, второй индекс
меняется быстрее. Поэтому при обработке по строкам, внешний
цикл индексирует строки, а внутренний столбцы.
for(i=0;i
Поэлементная обработка матрицы
Пример.
Дана матрица вещественного типа. Определить максимальный
элемент матрицы и его координаты в матрице.
pmax=-1e+10

float P[3][5];
0

1

imax=-1
2

3

jmax=-1

4

0

2.45 17.5 -12.4 20.25 -0.45

i=0,4,1

1

45.0 -55.1 12.4 21.5 72.0

2

2.45 2.45 2.45 2.45 2.45

i=0,2,1

pmax=-1*e+10
pmax=20.25
pmax=2.45
pmax=17.5
pmax=72.0
pmax=45.0

imax=-1
imax=0
imax=1

jmax=-1
jmax=4
jmax=3
jmax=1
jmax=0

нет

P[i][j]>pmax
да
pmax=P[i][j]
imax=i
jmax=j

Поэлементная обработка матрицы (2)
// Ex3_10.cpp
#include "stdafx.h"
#include
#include
int main(int argc, char* argv[])
{ float P[3][5],pmax;
int i,j,imax,jmax;
for(i=0;i
Поэлементная обработка матрицы (2)
Пример.
Дана вещественная матрица. Определить номер строки, содержащей
самую большую сумму элементов.
Summ=-1e+10

float s[3][5] ;
summ=-1e+10
Summ=37.35
Summ=95.8
0

im=-1

im=0
im=-1
im=1
1

2

i=0,2,1
3

0

2.45 17.5

1

45.0 -55.1 12.4 21.5 72.0

2

2.45 2.45 2.45 2.45 2.45

Sumt=17.55
Sumt=19.95
Sumt=37.35
Sumt=12.25
Sumt=-10.1
Sumt=2.45
Sumt=37.8
Sumt=45.0
Sumt=95.8
Sumt=23.8
Sumt=2.45
Sumt=7.35
Sumt=2.3
Sumt=4.9
Sumt=9.8
Sumt=0
Sumt=0

Sumt=0

4

-2.4 20.25 -0.45

Summ,im

i=0,4,1
Sumt+=s[i][j]
нет

Sumt>Summ

да

Summ=Sumt
im=i

Поэлементная обработка матрицы(3)
// Ex3_11.cpp
#include "stdafx.h"
#include
#include
int main(int argc, char* argv[])
{ float s[3][5],Summ,Sumt;
int i,j,im;
for(i=0;i
Выборочная обработка матрицы
Пример. Дана целочисленная матрица. Определить среди четных
строк, строку, имеющую наибольшее среднее арифметическое ее
элементов.
Srm=-1e+6
a)

int C[4][3]
1

2

11 -41

17 -8 32

3

43 -31 6

Sr=-12
Sr=15
Sr=18
Sr=12
Sr=43
Sr=9
Sr=5
Sr=0
Sr=6

j=0,3,1

6

i=i+2

Sr+=C[i][j]

Sr=0

да

j=0,3,1

Sr=Sr/3
нет

нет

iSrm
Srm=Sr
im=i

Sr=Sr/3
нет

да

Sr>Srm
Srm=Sr
im=i

Выборочная обработка матрицы(2)
// Ex3_12.cpp
Srm=-1e+6;
#include "stdafx.h"
im=-1;
#include
for(i=1;i
Переформирование матрицы
Пример. Дана целочисленная матрица. Отсортировать ее по
возрастанию элементов последнего столбца.
key=1
i=0

int b[3][4]

ib[k+1][m-1]

i=i+1

j=0,m-1,1

да

c=b[k][m-1]
key=1

b[k][m-1=b[k+1][m-1]
b[k+1][m-1=c

Переформирование матрицы(2)
key=1;
// Ex3_13.cpp
i=0;
#include "stdafx.h"
while((i
Одновременная обработка массивов и
подмассивов.
Сумма элементов строк матрицы
А

j

S
{

i

Подсчет суммы
элементов i-ой
строки

Дана матрица А(5,5) целого типа.
Определить сумму элементов каждой
строки и записать ее в новый массив S.

}
43

Программа определения суммы строк марицы (Ex3_9)
#include "stdafx.h"
#include
#include
const int N=5;
int main(int argc, char* argv[])
{
int a[N][N],i,j,s[N];
for(i=0; i
Обработка матрицы по частям
Кроме задач, по приемам похожих на обработку одномерных
массивов, есть большая группа задач, связанных с различными
вариантами обхода матриц, и задач обработки разных групп
элементов.

int c[5][5]
i=j

i=0 – 4

i= 0 – 3

j=i+1- 4

j=0 – 4-i

i+j=4
j=4-i

i=1 – 4

i=1 -4

j=0 – i-1

j=4-i+1 - 4

Пример обработки элементов матрицы, лежащих в
определенной области
Пример. Дана целочисленная матрица F(10,10). Определить сумму
отрицательных элементов матрицы и их количество, среди элементов,
лежащих выше главной диагонали.
kol=0

int F[10][10] n=5

sum=0

i=2
i=1
i=0
i=3

i=1,n-2,1
j=4
j=3
j=2
j=1

j=i+1,n-1,1
нет

да

F[i][j]
Пример программы
// Ex3_14.cpp
#include "stdafx.h"
#include
#include
#include
#include
int main(int argc, char* argv[])
{int n,mat[10][10],i,j,sum,kol;
srand( (unsigned)time( NULL ));
printf(" Inputed size of massiv n





Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.