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

Можно ли создать функцию, принимающую двумерный массив произвольного размера? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
11.10.2011, 15:34     Можно ли создать функцию, принимающую двумерный массив произвольного размера? #1
Добрый вечер всем.
Я прочитал в книге в главе Передача двумерных массивов в функцию следующую вещь:
При передаче функции в качестве фактического параметра одномерного массива нет необходимости указывать количество его элементов. При передаче функции двумерных массивов необязательным является только количество строк, но количество столбцов должно указываться.
Я написал маленькую программку с тремя функциями:
1) Выводит массив на экран
2) Ищет максимальный элемент
3) Определяет сумму строк
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
#include <stdio.h>
#include <conio.h> 
#include "D:\My documents\Программирование_Информатика\C++\26_2D_Array_in_function\max_elem.h"
#include "D:\My documents\Программирование_Информатика\C++\26_2D_Array_in_function\show_array.h"
#include "D:\My documents\Программирование_Информатика\C++\26_2D_Array_in_function\sum_strok.h"
int main() 
{       
    int array[3][4]={{1,99, 3, 4},
                     {5, 6, 7, 8},
                     {9,10,11,12}};
 
    show_array(array, 3); // Выводит массив на экран
    cout<<endl;
    max_elem(array, 3); //Ищет максимальный элемент
    cout<<endl<<endl;
    sum_strok(array, 3); //Определяет сумму строк
    cout<<endl;
        
    getch();  
    return 0; 
}
3 заголовочных файла:
C++
1
2
3
4
5
6
7
8
9
10
void show_array(int A[][4], int rows) 
{
    int i, j;
    for (i=0; i<rows; i++)
    {
        for (j=0; j<4; j++)
            printf("%3d", A[i][j]);
        cout<<endl;
    }
}
C++
1
2
3
4
5
6
7
8
void max_elem(int A[][4], int rows) 
{
    int i, j, max=0;
    for (i=0; i<rows; i++)
        for (j=0; j<4; j++)
            if (max<A[i][j]) max=A[i][j];
    cout<<"max elem = "<<max;
}
C++
1
2
3
4
5
6
7
8
9
10
11
void sum_strok(int A[][4], int rows) 
{
    int i, j, Sum; 
    for (i=0; i<rows; i++)
    {
        Sum=0;
        for (j=0; j<4; j++)
            Sum+=A[i][j];
        cout<<"Summa elementov stroki "<<i<<" = "<<Sum<<endl;
    }
}
Здесь все 3 функции написаны для матриц с 4 столбцами и произвольным количеством строк.
У меня возникла такая мысль. А вот я хочу написать функцию, которая подсчитывает сумму всех элементов произвольной матрицы, и чтобы потом заголовочный файл с этой функцией можно было включить в любой проект. Я так понял, что это сделать нельзя. Так как в каждой функции должно быть прописано количество столбцов массива. Но это так неудобно. Или я чего-то не понял?
В общем сформулирую вопрос:
Можно ли написать функцию, считающую сумму всех элементов матрицы с произвольным количеством как строк так и столбцов?

И заодно попутно второй маленький вопросик. Как тут видно, во всех трёх заголовочных файлах я использовал одни и те же переменные:
C++
1
int i, j, A[][4], rows;
Просто я подумал, что к функциям мы обращаемся здесь по очереди и поэтому одни и те же имена сойдут. Но в принципе то это правильно или всё же лучше в каждой функции свои новые буквы использовать? Например, в одной
C++
1
int i, j;
в другой:
C++
1
int a, b;
в третьей:
C++
1
int n, m;
Или всё равно? Как лучше?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2011, 15:34     Можно ли создать функцию, принимающую двумерный массив произвольного размера?
Посмотрите здесь:

C++ Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
C++ Можно ли на основе vector'а создать двумерный массив
C++ Можно ли передать в функцию массив произвольного размера ?
Можно ли создать символьный двумерный массив char ? C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
11.10.2011, 15:51     Можно ли создать функцию, принимающую двумерный массив произвольного размера? #2
А почему нет? Передайте количество строк и количество столбцов.

Добавлено через 3 минуты
И передавать придется указатель.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
12.10.2011, 12:28  [ТС]     Можно ли создать функцию, принимающую двумерный массив произвольного размера? #3
Цитата Сообщение от Predator_2004 Посмотреть сообщение
А почему нет? Передайте количество строк и количество столбцов
Ну тогда функция будет применима только к матрицам конкретного размера, а не к произвольным.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
12.10.2011, 13:51     Можно ли создать функцию, принимающую двумерный массив произвольного размера? #4
Alex Z, тебе предлагают воспользоваться динамическим выделением памяти под матрицу, тогда ее можно сделать любого размера и даже менять размер в процессе работы программы
Вот небольшой пример
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
#include<iostream>
#include <time.h>
 
using namespace std;
 
void fill(int **, int, int);//заполняет случайными числами
void print(int **, int, int);//печатает
 
int main()
{
    srand(time(NULL));
    int **a;
    int N, M;
    cout<<"N=";
    cin>>N;
    cout<<"M=";
    cin>>M;
    a=new int*[N];
    for(int i=0;i<N;i++)
        a[i]=new int[M];
    fill(a,N,M);
    cout<<"First matrix:\n";
    print(a,N,M);
    for(int i=0;i<N;i++)
        delete []a[i];
    delete[]a;
    N=N+2;
    M=M-1;
    a=new int*[N]; //меняем размер матрицы а
    for(int i=0;i<N;i++)
        a[i]=new int[M];
    fill(a, N,M);
    cout<<"\nSecond matrix:\n";
    print(a,N,M);
    for(int i=0;i<N;i++)
        delete []a[i];
    delete[]a;
 
}
 
void fill(int**a, int N, int M)
{
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
            a[i][j]=rand()%10;
}
 
void print(int**a, int N, int M)
{
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
 
}
в функцию вместе с указателем передаешь размеры матрицы
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
12.10.2011, 14:14  [ТС]     Можно ли создать функцию, принимающую двумерный массив произвольного размера? #5
Во. С примером понятнее. Спасибо.
Yandex
Объявления
12.10.2011, 14:14     Можно ли создать функцию, принимающую двумерный массив произвольного размера?
Ответ Создать тему
Опции темы

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