1D数组传递给两个函数,只有一个函数输出正确的结果。为什么?

时间:2017-11-19 20:18:14

标签: c arrays

我有两个例程。我从main中的数组x开始。一个例程是为阵列x中的每个对应元素生成三角形数并输出新数组。另一个例程做同样的事情,除了它现在是阶乘数。

我在main函数中对每个例程进行了两次调用。但只有首先调用的一个会产生正确的结果。所以我知道我的代码对于这两个例程都是正确的。但我不知道出了什么问题。

#include <stdio.h>
#define maxRow 3
#define maxCol 4

void factorial(int matrix[maxRow][maxCol]) {
	int row, column, i, product;
	for (row = 0;row < maxRow;++row) {
		for (column = 0;column < maxCol;++column) {
			product = 1;
			for (i = 1; i <= matrix[row][column];++i) {
				product = product*i;
			}//innermost loop ends
			matrix[row][column] = product;
		}//inner loop ends
	}//big for ends

	printf("Factorial number matrix:\n");

	for (row = 0;row < maxRow;++row) {
		for (column = 0;column < maxCol;++column) {
			printf("%i\t\t", matrix[row][column]);
		}//inner loop ends
		printf("\n");
	}//big for ends
}

int main() {
	void triangular(int matrix[maxRow][maxCol]);
	int x[maxRow][maxCol] = {
		{ 1,2,3,4 },
		{ 5,6,7,8 },
		{ 9,10,11,12 }
	};//array ends
	
	factorial(x);
	triangular(x);
}


void triangular(int matrix[maxRow][maxCol]) {
	int row, column, i, sum;
	for (row = 0;row < maxRow;++row) {
		for (column = 0;column < maxCol;++column) {
			sum = 0;
			for (i = 1; i <= matrix[row][column];++i) {
				sum += i;
			}//innermost loop ends
			matrix[row][column] = sum;
		}//inner loop ends
	}//big for ends
	printf("Triangular number matrix:\n");
	for (row = 0;row < maxRow;++row) {
		for (column = 0;column < maxCol;++column) {
			printf("%i\t", matrix[row][column]);
		}//inner loop ends
		printf("\n");
	}//big for ends
	printf("\n");
}

这是控制台输出: enter image description here

1 个答案:

答案 0 :(得分:2)

第一次调用时,您正在对x进行更改。现在第二次将其传递给triangular()时,它不是原始x - 它是已更改的数组xfactorial()函数的结果)。

复制阵列可以解决问题。 (制作临时副本 - 打印结果 - 然后回滚对x所做的更改。)

void factorial(int matrix[maxRow][maxCol]) {
    int copy[maxCol][maxCol];
    int row, column, i, product;
    for (row = 0;row < maxRow;++row) {
        for (column = 0;column < maxCol;++column) {
            product = 1;
            copy[row][column]=matrix[row][column];
            for (i = 1; i <= matrix[row][column];++i) {
                product = product*i;
            }//innermost loop ends
            matrix[row][column] = product;
        }//inner loop ends
    }//big for ends

    printf("Factorial number matrix:\n");

    for (row = 0;row < maxRow;++row) {
        for (column = 0;column < maxCol;++column) {

            printf("%i\t\t", matrix[row][column]);
            matrix[row][column]=copy[row][column];
        }//inner loop ends
        printf("\n");
    }//big for ends
}

如果数字增加,则因子值不会保存在int变量中。尝试使用long来获得更好的范围并保持更大的阶乘值。

注意:正在传递指向数组的指针。如果我们对指针指向的数组进行更改 - 它将更改原始数组。