我想让一个函数包含三个参数
表示我的函数原型应该像这样double Sub_avg(int arr[rows][cols],int n,int*arr[i][j])
功能说明
>
第一个参数是2D数组,表示要处理的数据。
这里的n
代表n×n矩阵,是指需要所有元素平均的方阵的维数。
最后一个参数int arr[i][j]
是子矩阵第一个元素的地址。
样本输入
输出
当然,通常在C++中,您会使用std::vector或std::array来存储数组并传递它们。但是如果您真的需要使用普通的旧数组和指针,那么我将提供您的任务的下一个解决方案。此外,当传递纯数组时,您可以使用模板魔术,但我认为您希望有一些非常简单的东西。
我对您的函数界面进行了最小化修改,使其足以解决使用普通数组和指针的任务。应该以int const*
的形式传递数组,因为在C/C++中,如果没有模板魔法,就不能传递int arr[rows][cols]
;而且,函数不知道数组的维数,所以必须传递rows
和cols
;另外,不应该传递指向子数组的指针,而应该传递sub_row
和sub_col
在数组中的位置。
同时,我决定实现sub_avg2()
函数,它与函数的接口非常接近,但它更高级和复杂,因为它使用模板。此外,由于模板的存在,这意味着函数的主体应该只放在库的header.h
文件中,主体应该在编译时作为源代码可用。但额外的好处是,这个函数执行额外的编译时间,自动传递数组维数。
您还可以注意到,我在代码中做了额外的越界检查,并在出错的情况下返回0。
网上试试吧!
#include <iostream>
static double Sub_avg(int const * arr, int rows, int cols, int n, int sub_row, int sub_col) {
if (!arr || rows < 0 || cols < 0 || n < 0 || sub_row < 0 || sub_col < 0 || sub_row + n > rows || sub_col + n > cols)
return 0; // Just out of bounds checking. Return error.
double sum = 0;
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j)
sum += arr[(sub_row + i) * cols + sub_col + j];
return sum / double(n * n);
}
template <int rows, int cols>
static double Sub_avg2(int const (&arr)[rows][cols], int n, int const * sarr) {
int sub_row = (sarr - &arr[0][0]) / cols, sub_col = (sarr - &arr[0][0]) % cols;
if (!arr || rows < 0 || cols < 0 || n < 0 || sub_row < 0 || sub_col < 0 || sub_row + n > rows || sub_col + n > cols)
return 0; // Just out of bounds checking. Return error.
double sum = 0;
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j)
sum += arr[sub_row + i][sub_col + j];
return sum / double(n * n);
}
int main() {
int const rows = 3, cols = 3, n = 2, sub_row = 1, sub_col = 1;
int arr[rows][cols] = {{3, 5, 6}, {5, 8, 7}, {5, 9, 9}};
std::cout << Sub_avg((int*)arr, rows, cols, n, sub_row, sub_col) << std::endl;
std::cout << Sub_avg2(arr, n, &arr[sub_row][sub_col]) << std::endl;
}
输出:
8.25
8.25