- •Основные определения
- •Операции над массивами
- •Массивы и указатели
- •Варианты обращения к элементам массива
- •Примеры вывода элементов массива через указатель
- •Передача одномерного массива в функцию в качестве параметра
- •Способы передачи одномерного массива в качестве параметра
- •Массив указателей на функцию
- •Динамические одномерные массивы
- •Способы определения динамических одномерных массивов
- •Пример нахождения среднего значения элементов динамического массива
- •Перегрузка функций при работе с массивами
- •Шаблоны функций при работе с массивами
- •Поиск в массиве
- •Сортировка массивов
- •Сортировка обменом («пузырьковая» сортировка)
- •Сортировка одномерного массива по некоторому признаку
- •Сортировка вставкой
- •Сортировка выбором
- •Примеры
- •Нахождение номера первого вхождения числа y в массив Х
- •Поиск в массиве максимального элемента и его номера
- •Проверка элементов массива на некоторую закономерность
- •Построение элементов массива в соответствии с некоторой закономерностью.
- •Нахождение количества положительных элементов между максимальным и минимальным элементами целочисленного массива
- •Нахождение суммы элементов вещественного массива, расположенных правее последнего отрицательного элемента
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
0 |
|
1 |
2 |
|
3 |
4 |
|
|
||||||
*++*pp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%d |
%d |
%d\n", pp-p, *pp-a, **pp); |
// 1, |
2, |
2 |
|
|
|
|
|
|
|
|
|
|||||
|
|
pp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
|
1 |
|
2 |
|
|
3 |
4 |
|||||||
++**pp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("%d |
%d |
%d\n", pp-p, *pp-a, **pp); |
// 1, |
2, |
3 |
|
|
|
|
|
|
|
|
|
|||||
|
|
pp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
a |
|
0 |
|
|
1 |
|
3 |
|
3 |
4 |
|
|
|||||
_getch(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Передача одномерного массива в функцию в качестве параметра
Правила передачи одномерного массива в качестве параметра функции одинаковы:
•независимо от того, является ли массив для функции входным, выходным или одновременно входным и выходным (передается в функцию, преобразуется в ней и возвращается в вызывающую функцию), в функцию всегда передается адрес массива; поэтому изменение массива в вызываемой функции приводит к изменению массива-
аргумента в вызывающей функции; никакого ссылочного типа для возврата массива
из функции не требуется;
•использование имени массива и указателя на массив в качестве аргумента функции эквивалентны (в функцию передается адрес);
•при передаче массивов через механизм параметров возникает задача определения в теле функции количества элементов массива, используемого в качестве фактического параметра, поэтому необходимо передавать значение размера массива в функцию явным образом либо должны использоваться массивы фиксированного, заранее определенного размера;
•в вызывающей функции массив определяется обычным образом, и при вызове функции в качестве аргумента записывается:
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
10 |
o имя массива (например, А – адрес начала массива) или &A[0] (адрес первого элемента);
oа также может указываться:
размер массива;
количество обрабатываемых элементов
•в заголовке функции указываются:
oтип элементов массива, его имя, а также:
размер массива (например, int x[5];) или
пустые квадратные скобки (например, int x[];) или
указатель на базовый тип (например, int *x);
•в теле функции доступ к элементам массива осуществляется обычным способом:
oa[i] или *(a+i) или через указатель-переменную, проинициализированную именем массива.
Способы передачи одномерного массива в качестве параметра
const int n=7;
void myfunc(int a[n]); //C-стиль void myfunc(int a[]);
void myfunc(int *a);
Рассмотрим способы передачи одномерного массива в качестве параметра функции на примере вычисления суммы элементов массива.
//способ 1 с указанием размера массива
const int n=7; //размер массива - глобальная константа, видима везде
int add (int (&ar)[n]); //массив передается как ссылка //которую можно не указывать
int main()
{
static int iarray[n] = {5, 1, 6, 20, 15, 0, 12}; int isum = add(iarray);
cout |
<< "isum=" << isum << |
endl; |
_getch(); |
|
|
return 0; |
|
|
} |
|
|
int add (int (&piarray)[n]) |
//размер n массива определен |
|
{int |
i , ipartial = 0; |
//константа n – глобальная |
for |
(i=0; i<n; i++) |
ipartial +=piarray[i]; return (ipartial);
}
//способ 2 с использованием typedef
const int n=7; //размер массива - глобальная константа, видима везде
typedef int arra[n];
int add(arra); //тип arra объявлен в typedef
int main()
{
static arra iarray = {5, 1, 6, 20, 15, 0, 12}; int isum = add(iarray);
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
11 |
cout |
<< "isum=" << isum << |
endl; |
_getch(); |
|
|
return 0; |
|
|
} |
|
|
int add (arra piar) |
|
|
{int |
i , ipartial = 0; |
//константа n - глобальная |
for |
(i=0; i<n; i++) |
ipartial +=piar[i]; return (ipartial);
}
//способ 3 без указания размера массива
const int n=7; //размер массива - глобальная константа int add(int []); //прототип функции
int main()
{
static int iarray[n] ={5,1,6,20,15,0,12};
//инициализация массива
int isum; |
|
isum= add(iarray); |
endl; |
cout << "isum=" << isum << |
|
_getch(); |
|
return 0; |
|
} |
|
int add(int iar[]) |
//определение функции |
{ int i, ipartial=0; |
//константа n – глобальная |
for (i=0; i<n; i++) |
|
ipartial +=iar[i]; |
|
return (ipartial); |
|
} |
|
//способ 4 с описанием массива как указателя
int add (int *);
const int n=7; //размер массива – глобальная константа int main()
{int isum;
static int iarray[n] = {5, 1, 6, 20, 15, 0, 12}; isum= adder(iarray);
cout << "isum=" << isum << endl; _getch();
return 0; |
|
} |
|
int add (int *piar) |
|
{int i, ipartial=0; |
//константа n – глобальная |
for (i=0; i<n; i++) |
|
ipartial += *(piar+i); |
//или ipartial += piar[i]; |
return (ipartial); |
|
} |
|
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |
12 |
//способ 5 с передачей размера массива
int add (int [], int); int main()
{const int n=7; //размер массива – локальная константа
static int iarray[n] = {5,1,6,20,15,0,12}; int isum= add(iarray, n);
cout << "isum=" << isum << endl; _getch();
return 0;
}
int add (int *piar, int k) // значение k равно n
{int i , ipartial = 0; for (i=0; i<k; i++)
ipartial +=piar[i]; return (ipartial);
}
//способ 6 с указанием количества обрабатываемых элементов
int add (int [ ], int); //появился второй параметр, //количество обрабатываемых элементов
const int n=7; //размер массива – глобальная константа int main()
{int isum;
static int iarray[n] = {5,1,6,20,15,0,12};
//инициализация массива isum= add(iarray, 3); //функции передается массив и
//количество элементов для обработки,
//должно быть меньше размера массива n cout << "isum=" << isum << endl;
_getch(); return 0;
} |
//объявление функции |
int add (int iar[ ], int k) |
|
{int i, ipartial=0; |
//k – формальный параметр |
for (i=0; i<k; i++) |
|
ipartial +=iar[i]; |
|
return (ipartial); |
|
} |
|
//способ 7 с использованием шаблонной функции (С++ стиль)
Обычно в шаблоне компилятор не может идентифицировать самостоятельно параметры, не являющиеся типами, и их необходимо указывать явно при вызове. Но при передаче массива по ссылке, второй параметр, размер массива, не являющийся типом, можно при вызове не задавать. В этом случае параметр будет выведен компилятором.
template<typename T, unsigned N> |
|
T add(T (&arra)[N]) |
|
{T i , ipartial = 0; |
N; ++i) |
for (size_t i = 0; i < |
|
ipartial +=arra[i]; |
|
return (ipartial); |
|
} |
13 |
Программирование – лекция 12 (лекции Стрикелевой Л.В.) |