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

Лекции 2021 / OIT_lek_sem_13_10_2021

.docx
Скачиваний:
1
Добавлен:
14.12.2023
Размер:
32.58 Кб
Скачать

6.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.

56

Соседние файлы в папке Лекции 2021