Лекции 2021 / OIT_lek_sem_13_10_2021
.docx6.4. Передача массива в функцию
Аргументом функции может быть массив. В функцию передаётся имя массива, т.е. указатель на массив:
void f1(int [], int); // прототип
void f1(int x[], int size) {………}
В прототипе функции f1 указывается, что аргумент это массив (int []) типа int (идентификатор массива не используется), далее следует размер массива без имени. Вызов функции имеет вид:
f1(x, size);
или
f1(&x[0], size);
Рассмотрим задачу сортировки двух массивов a[9], b[16] (примеры 18 и 19).
Пример 18.
#include "stdafx.h"
#include <iostream>
using namespace std;
// описание вспомогательной функции swop (аргументы-указатели)
void swop(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}// конец описания функции swop
// описание вспомогательной функции sort
void sort(int x[], int size1) {
int i, j;
for (i = 0; i < size1 - 1; i++)
for (j = 0; j < size1 - 1 - i; j++)
if (x[j] > x[j + 1])
swop(&x[j], &x[j + 1]);
}// конец функции sort
// основная функция main
void main() {
int i;
int a[9], b[16];
cout << "*****a*****";
cout << "\n";
for (i = 0; i < 9; i++) {
cout << "a[" << i << "]=";
cin >> a[i];
}// ввод вектора a с клавиатуры
cout << "\n";
sort(a, 9); // или sort(&a[0], 9);
for (i = 0; i < 9; i++)
cout << a[i] << ' ';// вывод вектора a после сортировки
cout << "\n";
cout << "*****b*****";
cout << "\n";
for (i = 0; i < 16; i++) {
cout << "b[" << i << "]=";
cin >> b[i];
}// ввод вектора b с клавиатуры
cout << "\n";
sort(b, 16); // или sort(&b[0], 16);
for (i = 0; i < 16; i++)
cout << b[i] << ' ';// вывод вектора b после сортировки
cout << "\n";
}// конец функции main
В функции сортировки sort для обмена значениями в цикле вызывается вспомогательная функция swop с аргументами-указателями:
swop(&x[j],&x[j+1]);
В основной функции последовательно выполняются следующие операции:
ввод вектора a[9] в цикле
for (i = 0; i < 9; i++) {
cout << "a[" << i << "]=";
cin >> a[i];
}
сортировка
sort(a, 9); или
sort(&a[0], 9);
вывод изменённого массива a[9] в цикле
for (i = 0; i < 9; i++)
cout << a[i] << ' ';.
Далее эти же действия повторяются и для вектора b[16].
В примере 19 для объявления вспомогательной функции сортировки sort используется прототип:
void sort(int [], int);
Для обмена значениями ‒ функция swop с аргументами-ссылками:
void swop(int &x, int &y) {
int t = x;
x = y;
y = t;
}
Пример 19.
#include "stdafx.h"
#include <iostream>
using namespace std;
// прототип вспомогательной функции sort
void sort(int [], int);
// описание вспомогательной функции swop (аргументы-ссылки)
void swop(int &x, int &y) {
int t = x;
x = y;
y = t;
}// конец описания функции swop
// основная функция main
void main() {
int i;
int a[9], b[16];
// ввод вектора a с клавиатуры
cout << "*****a*****";
cout << "\n";
for (i = 0; i < 9; i++)
cin >> a[i];
cout << "\n";
sort(a, 9);
for (i = 0; i < 9; i++)
cout << a[i] << ' ';// вывод вектора a после сортировки
cout << "\n";
// ввод вектора b с клавиатуры
cout << "*****b*****";
cout << "\n";
for (i = 0; i < 16; i++)
cin >> b[i];
cout << "\n";
sort(b, 16);
for (i = 0; i < 16; i++)
cout << b[i] << ' ';// вывод вектора b после сортировки
cout << "\n";
}// конец функции main
// описание функции sort
void sort(int x[], int size1) {
int i, j;
for (i = 0; i < size1 - 1; i++)
for (j = 0; j < size1 - 1 - i; j++)
if (x[j] > x[j + 1])
swop(x[j], x[j + 1]);
}// конец функции sort
Передача двухмерного массива в функцию. Рассмотрим следующую задачу (пример 20). Заданы целочисленные матрицы a[4][4], b[4][4]. Вычислить для каждой из них суммы элементов по столбцам. Результат сохранить в векторе.
j=0 j=1…
i=0 1 2 3 7
i=1 4 5 6 7
i=2 7 8 9 7
i=3 7 8 9 7
Пример 20.
#include "stdafx.h"
#include <iostream>
using namespace std;
// описание глобальной переменной s
int s[4];
// описание вспомогательной функции sumst
void sumst(int x[4][4]) {
int t;
for (int j = 0; j < 4; j++) {// внешний цикл
t = 0;
for (int i = 0; i < 4; i++) // внутренний цикл
t += x[i][j]; // конец внутреннего цикла
s[j] = t;
}// конец внешнего цикла
}// конец функции sumst
// основная функция main
void main() {
int a[4][4], b[4][4];
cout << "*****a*****";
cout << "\n";
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
cout << "a[" << i << "][" << j << "]=";
cin >> a[i][j];
}// ввод матрицы a с клавиатуры
cout << "\n";
sumst(a);
for (int i = 0; i < 4; i++)
cout << s[i] << ' ';// вывод вектора s
cout << "\n";
cout << "*****b*****";
cout << "\n";
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
cout << "b[" << i << "][" << j << "]=";
cin >> b[i][j];
}// ввод матрицы b с клавиатуры
cout << "\n";
sumst(b);
for (int i = 0; i < 4; i++)
cout << s[i] << ' ';// вывод вектора s
}// конец функции main
В примере 20 матрица передаётся в функцию по значению (void sumst(int x[4][4]). Размерности матриц a, b и x совпадают (количество строк – 4, количество столбцов – 4), поэтому возможна такая передача в функцию sumst значений элементов матриц a и b (sumst(a); sumst(b);)
В примере 21 для каждой из целочисленных матриц a[4][4], b[4][4] требуется определить наибольшие элементы в строках и поменять их местами с элементами побочной диагонали.
Пример 21.
#include "stdafx.h"
#include <iostream>
using namespace std;
// описание глобальной переменной x
int x[4][4];
// описание глобальных констант n и m
const int n = 4;
const int m = 4;
// описание вспомогательной функции vvod
void vvod() {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
cout << "x[" << i << "][" << j << "]=";
cin >> x[i][j];
}// ввод матрицы x с клавиатуры
}// конец функции vvod
// описание вспомогательной функции vivod
void vivod() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << x[i][j] << ' ';
cout << "\n";
}// вывод матрицы x после перестановок
}// конец функции vivod
// описание вспомогательной функции maxswop
j=0 j=1…
i=0 1 7 3 2
i=1 4 5 6 7
i=2 7 8 9 7
i=3 7 8 9 7
void maxswop() {
int max, imax, t;
for (int i = 0; i < n; i++) {// внешний цикл
max = x[i][0];
imax = 0;
for (int j = 1; j < m; j++) // внутренний цикл
if (x[i][j] > max) {
max = x[i][j];
imax = j;
}// конец внутреннего цикла
t = x[i][imax];
x[i][imax] = x[i][m - 1 - i];
x[i][m - 1 - i] = t;
}// конец внешнего цикла
}// конец функции maxswop
// основная функция main
void main() {
cout << "*****a*****";
cout << "\n";
vvod();
cout << "\n";
maxswop();
vivod();
cout << "*****b*****";
cout << "\n";
vvod();
cout << "\n";
maxswop();
vivod();
}// конец функции main
Переменная x является глобальной переменной. Область её действия распространяется на все вспомогательные функции (vvod, vivod, maxswop) и главную – main.