Skip to content

Функции и динамические двумерные массивы

Здравствуйте, любители C++, как я вам и обещал, сегодня мы с вами разберем динамические массивы и напишем свои собственные функции. За основу мы возьмем задание из статьи №3, где мы работали с двумерным массивом размерностью 8×8.

Вспомним то задание(оригинал в статье №3) и запишем его немножко в другом виде:
Для заданной матрицы размером n на m найти такие k, что k-ая строка матрицы совпадает с k-ым столбцом.
Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

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

#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int** sozdanie(int n, int m);
void initialize( int** A, int n, int m); // будем передавать динамический массив и размерность в качестве параметра
void compare(int** A, int n, int m);
void summa (int** A, int n, int m);

Для начала нам следует подключить стандартные библиотеки, пространство имен, и, самое главное, объявить наши функции.
Объявляют функцию в C++ следующим образом:

1) Тип возвращаемых данных
То есть если написать в самом начале int, то это значит что функция вернет какое то целочисленное значение, как видите, функция sozdanie возвращает динамический двумерный массив целых чисел(да именно так он обозначается int**), если же написать в начале объявления тип void(как во всех остальных функциях), то это означает, что функция ничего не возвращает(но не путайте, она все же что то делает с нашими данными).

2) Имя функции
Здесь все просто: мы просто придумываем имя нашим функциям(желательно, чтобы имя отражало суть функции).

3) Список параметров
Чтобы наши функции что то делали, им нужно передать какие то данные. Например функция sozdanie, она принимает 2 параметра: число строк n и число столбцов m, и на основе этих данных создает двумерный массив.

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

int** sozdanie(int n, int m)
{
    int **A;// Создаем матрицу введенной размерности
    A = new int *[n]; // через массив указателей
    for (int i = 0; i < n; i++) {
       A[i] = new int [m];
    }
    return A;
}

void initialize(int** A, int n, int m)// Функция заполнения
{
    srand(time(0));
    for(int i = 0; i < n; i++ )
        {
            for(int j = 0;  j < m;  j++ )
                {
                    A[i][j] = rand()%11 - 5 ;
                    cout << A[i][j] << "     ";
                }
    cout << endl;
        }
}

Таким образом описываются функции в C++, следует отметить, что описывать их можно как до main, так и после него.
Разберем функцию создания динамического массива:

Для начала нам следует создать одномерный массив указателей, затем в цикле в каждый указатель мы записываем еще одномерный массив, таким образом у нас выходит массив массивов, или, двумерный массив в котором n строк и m столбцов.

Так как мы работаем с динамическим массивом, то следует выделять память под него, это делается с помощью ключевого слова new.

Вторая функция, как и в статье №3, заполняет массив рандомными числами и выводит на экран. Заметьте, что в качестве параметра этой функции передается и сам массив.

void compare(int** A, int n, int m) // Функция сравнения
{
        int count(0), k(0);
        for(int i = 0; i < n; i++ )
        {
                for(int j = 0;  j < m;  j++ )
                {
                        if(A[i][j] == A[j][i])
                        {
                                count++;
                        }
                        if (count == n)
                        {
                                cout << " \n " << i + 1 << " строка совпадает с " << i + 1 << " столбцом " << endl;
                                k ++;
                        }
                        
                }
                count = 0;
        }
        if(k == 0)
                cout << "\n\n Нет совпадающих строк и столбцов" << endl;
}

void summa (int** A, int n, int m) // Функция суммы
{
        int result(0);
        for(int i = 0; i < n; i++ )
        {
                for(int j = 0;  j < m;  j++ )
                {
                        if(A[i][j] < 0)
                        {
                                for(int count = 0; count < m; count ++)
                                {
                                         result += A[i][count];
                                }
                                cout << "\n Сумма элементов на " << i + 1  << " строке равна "<< result << endl;
                                j = m;
                                result = 0;
                        }
                }
        }
}

Здесь подробно останавливаться не будем, так как рабочие моменты уже были пояснены в той самой насущной статье №3, поэтому сразу перейдем к main:

int main()
{
        setlocale(LC_ALL, "Russian");
     
        int n(0), m(0);
        cout << " Введите кол-во строк в массиве" << endl;
        cin >> n;
        cout << " \nВведите кол-во столбцов в массиве" << endl;
        cin >> m;
        cout << endl;
        int **A;

        A = sozdanie(n,m); // Создаем через функцию
        initialize(A, n, m); // заполняем матрицу
        compare(A, n, m); // сравниваем столбцы и строки
        summa(A, n, m); // считаем сумму элементов на строке с отрицательным элементом


        for ( int i = 0; i < n; i++ )
        {
                delete [] A[ i ];
        }
        delete [] A; // Освобождение памяти
        _getch();
        return 0;
}

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

И не лишним было бы освободить память по окончанию работы с динамическим массивом в C++

Скачать исходники

На этом сегодня все. Пишите свои комментарии, ваше мнение очень важно для нас!

Опубликовано вC++

Будьте первым, кто оставит комментарий

    Добавить комментарий