我的作业需要以下内容:
- 对行和列进行命令行输入,并动态创建一个用随机数填充的二维数组
创建一个名为find_greatest_product的函数,以找到四个相邻的最大乘积 数组中的数字。四个相邻的数字可以是形状的任何配置 发现在游戏中的俄罗斯方块中。您的功能需要从最初的产品返回 使用结构的四个数字的位置,形状和方向。
是的,这是一个完全没用的程序,纯粹是为了练习2-D阵列。
我已经设置了阵列,所以我开始使用最简单的形状:盒子。但是,当我尝试访问充满随机数的数组时,产品和因子似乎都为0.任何提示为什么我无法访问随机数组中的整数来查找产品?相关的代码位如下。您可以假设此处未复制的所有功能都可以正常工作。
struct shape {
int highest;
int factors[4];
int startRow;
int startColumn;
} tShape, sShape, iShape, boxShape;
int main(int argc, char* argv[]) {
if(argc == 5) {
for(int i = 1; i < argc; i++) {
rows = getArg(argc, argv, i, compare1);
}
for(int i = 1; i < argc; i++) {
columns = getArg(argc, argv, i, compare2);
}
}
int ** array = new int*[rows];
int i, j;
for (i = 0; i < rows; i++) {
array[i] = new int[columns];
}
create_array(array, rows, columns);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
cout << array[i][j];
cout << " ";
}
cout << endl;
}
boxProduct(array, rows, columns, boxShape);
cout << boxShape.highest << endl;
for (int i = 0; i < 4; i++) {
cout << boxShape.factors[i];
cout << " ";
}
cout << endl;
return 0;
}
void boxProduct(int *array[], int rows, int columns, shape boxShape) {
int highest = 0;
int product = 0;
for (int i = 0; i < rows - 1; i++) {
for (int j = 0; j < columns - 1; j++) {
product = (array[i][j]*array[i][j+1]*array[i+1][j]*array[i+1][j+1]);
if (product > highest) {
boxShape.highest = product;
boxShape.factors[0] = array[i][j];
boxShape.factors[1] = array[i][j+1];
boxShape.factors[2] = array[i+1][j];
boxShape.factors[3] = array[i+1][j+1];
}
}
}
}
以下是带有10行×5列矩阵的示例输出:
27 86 4 41 44
17 6 5 40 32
42 58 14 95 53
8 28 95 27 91
63 22 27 49 2
38 37 39 37 76
9 17 14 13 10
10 30 16 67 22
49 10 33 63 5
86 71 86 34 50
0 <- product
0 0 0 0 <- the four factors
答案 0 :(得分:1)
默认情况下,C和C ++函数按值调用,而不是按引用调用。也就是说,编译器会创建赋予函数的参数副本,如果函数修改了它的参数,它会修改副本。
考虑这个例子:
void foo( int x )
{
x++; // increments foo's own local copy of 'x'
}
int main()
{
i = 42;
cout << i << endl; // prints 42
foo(i);
cout << i << endl; // ALSO prints 42!
return 0;
}
这将打印42次,因为foo
修改了副本。
如果稍微修改代码,则告诉C ++编译器通过引用传递参数。 (注意:这是一个仅限C ++的功能;它在C中不起作用。)现在,对函数内部参数的任何修改都将修改调用者看到的值:
void foo( int& x ) // The & means "pass this parameter by reference"
{
x++;
}
int main()
{
i = 42;
cout << i << endl; // prints 42
foo(i);
cout << i << endl; // prints 43
return 0;
}
修改调用者持有的值的另一种方法是传递指向该值的指针,而不是值本身。这仍然是按值调用,但在这种情况下,传递函数的值是指针。例如:
void foo( int* x ) // x is now a pointer to integer
{
(*x)++; // The (*x) dereferences the pointer. What happens if you leave off the parens?
}
int main()
{
i = 42;
cout << i << endl; // prints 42
foo(&i); // the & there takes the address of 'i' and passes that to foo()
cout << i << endl; // prints 43
return 0;
}
因为C不支持 call-by-reference 参数,所以它需要最后一个方案。一些C ++代码也以这种方式使用指针。现代C ++风格倾向于尽可能避免使用裸指针,但您仍会不时地看到指针。
Punchline:您需要将此知识应用于上述shape boxShape
结构。您要么通过引用传递shape boxShape
,要么将指针传递给shape boxShape
。两者都是有效的方法,尽管C ++更倾向于传递引用。