Форум программистов, компьютерный форум CyberForum.ru

Передача двумерного массива в функцию. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.78
Кемаль
 Аватар для Кемаль
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 38
10.12.2010, 19:43     Передача двумерного массива в функцию. #1
Требуется написать функцию которая бы слагала и умножала матрицы. Для этого Я завел двумерный динамический массив, а вот с передачей его в функцию у меня туговато. Просьба помочь, то есть требуется просто пример, где бы двумерный динамик массив передавался в функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <math.h>
#include <time.h>
#include <cstdlib>
using namespace std;
int shape(int** x, int** y);
int mult (int **x, int** y);
int main ()
{
    int n;
    int m;
    cout <<"Enter the number of strings of matrix A"<<endl;
    cin >> n;
    cout <<"Enter the number of columns of matrix A"<<endl;
    cin >> m;
    srand(time(NULL));
    int **a = new int* [n];
    for (int i = 0; i < n; i++)
    {
        a[i] = new int [m];
    }
    cout <<"The array A is"<< endl;
    for (int i = 0; i< n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            a[i][j] = rand()% 10;
            cout << a[i][j]<<' ';
        }
        cout << endl;
    }
    // определили первую матрицу
    int z;
    int w;
    cout <<"Enter the number of strings of matrix B"<<endl;
    cin >> z;
    cout <<"Enter the number of columns of matrix B"<<endl;
    cin >> w;
    srand(time(NULL));
    int **b = new int* [z];
    for (int i = 0; i < z; i++)
    {
        b[i] = new int [w];
    }
    cout <<"The array B is"<< endl;
    for (int i = 0; i< z; i++)
    {
        for (int j = 0; j < w; j++)
        {
            b[i][j] = rand()% 10;
            cout << b[i][j]<<' ';
        }
        cout << endl;
    }
    // определили вторую матрицу
    int l;
    int k;
    cout <<"Enter the number of strings of matrix C"<<endl;
    cin >> l;
    cout <<"Enter the number of columns of matrix C"<<endl;
    cin >> k;
    srand(time(NULL));
    int **c = new int* [l];
    for (int i = 0; i < l; i++)
    {
        c[i] = new int [k];
    }
    cout <<"The array C is"<< endl;
    for (int i = 0; i< l; i++)
    {
        for (int j = 0; j < k; j++)
        {
            c[i][j] = rand()% 10;
            cout << c[i][j]<<' ';
        }
        cout << endl;
    }
    // определили третью матрицу
    system ("PAUSE");
    return 0;
}
int shape(????)
{
 
}
Помогите с передачей его в функцию shape.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.12.2010, 19:46     Передача двумерного массива в функцию. #2
Вот, програма находит произведение матриц, там жэ и пример передачи двумерного динамического масива, как параметр в функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <iomanip>
 
void matrixmult( int **m1, int m1_row, int m1_col, int **m2, int m2_row, int m2_col, int **m3, int m3_row, int m3_col);
 
void matrixfill( int **m, int row, int col)
{
                for (int i = 0; i < row; ++i)
                        for (int j = 0; j < col; ++j)
                        {
                                std::cout << "Enter [ " << i << " ][ " << j <<" ] element: ";
                                std::cin >> m[i][j];
                        }
}
 
void print_matr(int **m, int row, int col)
{
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
            std::cout << std::setw(3) << m[i][j] << ' ';
 
        std::cout << std::endl;
    }
}
 
int main()
{
        int row1 = 0;
        int col1 = 0;
 
        std::cout << "Enter number of rows of the first matrix: ";
        std::cin >> row1;
 
        std::cout << "Enter number of columns of the first matrix: ";
        std::cin >> col1;
 
        int **arr1 = new int*[row1];
        for (int i = 0; i < row1; ++i)
                arr1[i] = new int[col1];
 
        matrixfill(arr1,row1,col1);
 
        int row2 = 0;
        int col2 = 0;
 
        std::cout << "Enter number of rows of the second matrix: ";
        std::cin >> row2;
 
        std::cout << "Enter number of columns of the second matrix: ";
        std::cin >> col2;
 
        int **arr2 = new int*[row2];
        for (int i = 0; i < row2; ++i)
                arr2[i] = new int[col2];
 
        matrixfill(arr2,row2,col2);
 
        int row3 = row1;
        int col3 = col2;
 
        int **arr3 = new int*[row3];
        for (int i = 0; i < row3; ++i)
                arr3[i] = new int[col3];
 
        for (int i = 0; i < row3; ++i)
                        for (int j = 0; j < col3; ++j)
                                arr3[i][j] = 0;
 
        std::cout << "\nFirst matrix: \n";
        print_matr(arr1, row1, col1);
 
        std::cout << "\nSecond matrix: \n";
        print_matr(arr2, row2, col2);
        //если число столбцов первой матрицы равно числу строк второй матрицы
        if(col1 == row2)
            matrixmult(arr1,row1,col1, arr2,row2,col2, arr3,row3,col3);
 
        else
        {
            std::cerr << " Error! " << std::endl;
            return 1;
        }
 
        std::cout << "\nResult matrix:" << std::endl;
        print_matr(arr3, row3, col3);
 
        for(int i = 0; i < row1; i++)
          delete[] arr1[i];
        delete[] arr1;
        for(int i = 0; i < row2; i++)
           delete[] arr2[i];
        delete[] arr2;
        for(int i = 0;i < row3 ; i++)
            delete[] arr3[i];
        delete[] arr3;
 
        return 0;
}
 
 
 
void matrixmult( int **m1, int m1_row, int m1_col, int **m2, int m2_row, int m2_col, int **m3, int m3_row, int m3_col)
{
        for (int k = 0; k < m2_col; ++k)
                for (int i = 0; i < m1_row; ++i)
                        for (int j = 0; j < m1_col; ++j)
                                m3[i][k] += m1[i][j] * m2[j][k];
}
Кемаль
 Аватар для Кемаль
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 38
11.12.2010, 08:33  [ТС]     Передача двумерного массива в функцию. #3
Я дописал таким образом (функцию сложения)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void shape(int** x, int x_str, int x_col, int** y, int y_str, int y_col)
{
    int i;
    int **z = new int* [x_str];
    for (i = 0; i < x_str; i++)
    {
        z[i] = new int [x_col];
    }
    if (x_str == y_str && y_col == x_col) 
    {
        for (int k = 0; k < x_str; k++)
        {
            for (int h= 0; h < x_str; h++)
            {
                for (int j = 0; j < x_col; j++)
                {
                    z[i][j] = x[k][h] + y[k][h];
                }
            }
        }
    }
}
но при использовании её
C++
1
cout <<"The shape is" << shape((int)**a, (int)**b) << endl;
находит ошибку
Ошибка 4 error C2664: shape: невозможно преобразовать параметр 1 из 'int' в 'int **' c:\users\gelious\documents\visual studio 2008\projects\laba9\num3_matrix\matrix.cpp 80 Num3_matrix
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.12.2010, 08:47     Передача двумерного массива в функцию. #4
Ну дак, ф-ция должна принимать 6 аргументов, а вы передаёте 2. Нужно что-то типа:
C++
1
shape(a, m, n, b, m, n);
Хотя если матрицы одинакового размера, то можно переделать прототип:
C++
1
void shape(int** x, int** y, int rows, int cols);
Ну и к тому же она возвращает void, что вы хотите напечатать с помощью cout?
Кемаль
 Аватар для Кемаль
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 38
11.12.2010, 08:52  [ТС]     Передача двумерного массива в функцию. #5
Цитата Сообщение от Кемаль Посмотреть сообщение
Я дописал таким образом (функцию сложения)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int shape(int** x, int x_str, int x_col, int** y, int y_str, int y_col)
{
    int i;
    int **z = new int* [x_str];
    for (i = 0; i < x_str; i++)
    {
        z[i] = new int [x_col];
    }
    if (x_str == y_str && y_col == x_col) 
    {
        for (int k = 0; k < x_str; k++)
        {
            for (int h= 0; h < x_str; h++)
            {
                for (int j = 0; j < x_col; j++)
                {
                    z[i][j] = x[k][h] + y[k][h];
                }
            }
        }
    }
 return **z;
}
но при использовании её
C++
1
cout <<"The shape is" << shape((int)**a, (int)**b) << endl;
находит ошибку
Ошибка 4 error C2664: shape: невозможно преобразовать параметр 1 из 'int' в 'int **' c:\users\gelious\documents\visual studio 2008\projects\laba9\num3_matrix\matrix.cpp 80 Num3_matrix
Объясните мне пожалуйста, как потом, после объявления функции использовать её с такими массивами. (тобиш, например, функцию сложения массивов использовать в цикле или нет?)

Добавлено через 1 минуту
Цитата Сообщение от dihlofos Посмотреть сообщение
Ну дак, ф-ция должна принимать 6 аргументов, а вы передаёте 2. Нужно что-то типа:
C++
1
shape(a, m, n, b, m, n);
Хотя если матрицы одинакового размера, то можно переделать прототип:
C++
1
void shape(int** x, int** y, int rows, int cols);
Ну и к тому же она возвращает void, что вы хотите напечатать с помощью cout?
А Вы попробуйте передать 6 аргументов. "Функция не принимает 6 аргументов".
Void на int изменить недолго. Я пробовал так устранить ошибки, но как видно ошибок нет, а руки мои не из того места.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
11.12.2010, 09:42     Передача двумерного массива в функцию. #6
Ну типа как-то так (матрицы одинакового размера). Функцию не нужно в цикле вызывать, все циклы внутри неё самой)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
using namespace std;
////////////////////////////////////////////////////////////////
void summ(int ** x, int ** y, int ** z, int rows, int cols)
{
    int i, j;
 
    for (i = 0; i < rows;i++)
    {
        for (j = 0; j < cols; j++)
        {
        z[i][j] = x[i][j] + y[i][j];
        }
    } 
}
////////////////////////////////////////////////////////////////
int main()
{
    int n,m;
 
    cout <<"Enter the number of strings of matrix: "<<endl;
    cin >> n;
    cout <<"Enter the number of columns of matrix: "<<endl;
    cin >> m;
 
    srand(time(NULL));
 
    int **a = new int* [n];
    for (int i = 0; i < n; i++)
    {
            a[i] = new int [m];
    }
 
    int **b = new int* [n];
    for (int i = 0; i < n; i++)
    {
            b[i] = new int [m];
    }
 
    int **c = new int* [n];
    for (int i = 0; i < n; i++)
    {
            c[i] = new int [m];
    }
 
 
    // fill and print A
    cout <<"The array A is"<< endl;
    for (int i = 0; i< n; i++)
    {
            for (int j = 0; j < m; j++)
            {
                    a[i][j] = rand()% 10;
                    cout << a[i][j]<<' ';
            }
            cout << endl;
    }
 
    // fill and print B
    cout <<"The array B is"<< endl;
    for (int i = 0; i < n; i++)
    {
            for (int j = 0; j < m; j++)
            {
                    b[i][j] = rand()% 10;
                    cout << b[i][j]<<' ';
            }
            cout << endl;
    }
    
    summ(a, b, c, n, m); // call function
 
    // print C
    cout <<"The array C is"<< endl;
    for (int i = 0; i < n; i++)
    {
            for (int j = 0; j < m; j++)
            {
                    cout << c[i][j]<<' ';
            }
            cout << endl;
    }
 
    system ("pause");
    return 0;
}
Yandex
Объявления
11.12.2010, 09:42     Передача двумерного массива в функцию.
Ответ Создать тему
Опции темы

Текущее время: 22:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru