§ 17. Массивы и структуры как параметры функций

17.3. Поиск заданного элемента в многомерном массиве

При организации линейного поиска в одномерном массиве для проверки сложных условий поиска создавали функции, которые проверяли отдельный элемент. При работе с двумерными массивами можно поступить аналогично. В этом случае функция будет принимать в качестве параметра линейный массив и обрабатывать его.

Пример 17.6. Задан двумерный массив a из m строк и n столбцов. Получить линейный массив b, в котором b[i] — сумма элементов i-й строки массива a, кратных 3.

Этапы выполнения задания

 I. Исходные данные: переменные n и m — количество строк и столбцов в массиве а, a — двумерный массив.

 II. Результат: линейный массив b.

III. Алгоритм решения задачи.

1. Ввод исходных данных. Элементы массива сгенерированы случайным образом.
2. 
Для обработки отдельной строки создадим функцию, вычисляющую сумму элементов линейного массива, кратных трем.
3. 
В цикле вызовем функцию для каждой строки.
4. 
Вывод результата. Для вывода линейного массива используется функция print. Она же используется для вывода строк двумерного массива.

IV. Описание переменных: n, m – int, a –  vector<vector<int>>, b – vector<int>.

Пример 17.7. Задан двумерный массив a из m строк и n столбцов. Вывести номера строк, элементы которых образуют возрастающую последовательность. Если таких строк в массиве нет, то ввести соответствующее сообщение.

Этапы выполнения задания

I. Исходные данные: переменные n и m — количество строк и столбцов в массиве а, a — двумерный массив.

II. Результат: номера строк и сообщение, что строк нет.

III. Алгоритм решения задачи.

1. Ввод исходных данных. Элементы массива сгенерированы случайным образом.
2. 
Для обработки отдельной строки создадим функцию, проверяющую, образуют ли ее элементы возрастающую последовательность.

2.1. Элементы образуют возрастающую последовательность, если каждый следующий больше предыдущего. 
2.2. Если для какой-то пары элементов условие не выполнилось дальнейшую проверку прекратим.

3. В цикле вызовем функцию для каждой строки и проверим результат.
4. 
Вывод результата. Создадим переменную-флаг, которая вначале будет иметь значение true. Если какой-то номер строки будет выведен, то изменим значение этой переменной. Если переменная-флаг не поменяла своего значения, то строки не найдены.

IV. Описание переменных: n, m – int, a –  vector<vector<int>>, b – vector<int>.

Пример 17.6.

V.  Программа:

#include <iostream>

#include <vector>

#include <cstdlib>

#include <ctime>

 

using namespace std;

 

void print(vector<int> &d)

{

  for (int i = 0; i < d.size(); i++){

    cout.width(5);

    cout << d[i];

  }

  cout<<endl;

}

 

int sum3(vector<int> &d)

{

  int s = 0;

  for (int i = 0; i < d.size(); i++)

    if (d[i] % 3 == 0)

      s += d[i];

  return s;

}

 

int main()

{

  srand(time(NULL));

  int m, n;

  cout << "m, n" << endl;

  cin >> m >> n;

  vector <vector <int>> a(m, vector <int> (n));

  vector <int> b(m);

  for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

      a[i][j] = rand () % 100;

  for (int i = 0; i < m; i++)

    print(a[i]);

  for (int i = 0; i < m; i++)

    b[i] = sum3(a[i]);

  cout << "rez" << endl;

  print(b);

  return 0;

}

 VI. Тестирование.

Пример 17.7.

 V. Программа:

#include <iostream>

#include <vector>

#include <cstdlib>

#include <ctime>

#include <iomanip>

 

using namespace std;

 

bool check(vector<int> &d)

{

  for (int i = 0; i < d.size() - 1; i++)

  if (d[i] >= d[+ 1])

    return false;

  return true;

}

 

int main()

{

  srand(time(NULL));

  int m, n;

  cout << "m, n" << endl;

  cin >> m >> n;

  vector <vector <int>> a(m, vector <int> (n));

  for (int i = 0; i < m; i++){

    for (int j = 0; j < n; j++){

      a[i][j] = rand () % 100;

      cout << setw(5) << a[i][j];

    }

    cout << endl;

  }

  bool f = true;

  for (int i = 0; i < m; i++)

    if (check(a[i])){

      cout << i << " ";

      f = false;

    }

  if (f)

    cout << "net strok" << endl;

  return 0;

}

 VI. Тестирование.