我的任务是创建一个方阵,这个方阵需要乘以幂n,m代表方阵的大小。
用户输入首先会保存到原始数组和临时数组中。计算总和后,它将保存到结果中,然后我应该将结果数组与临时数组交换。
int main()
{
// define variables
int m, n;
int matrix_1;
int original[5][5];
int result[5][5];
int temporary[5][5];
int *ptrResult = &result[0][0];
int *ptrTemp = &temporary[0][0];
int *hold = &result[0][0];
// input from user with validations
do
{
printf("Please input an array size in between 1 to 5: ");
scanf("%d", &m);
} while (m < 1 || m > 5);
do
{
printf("Please input an integer as the multiplication power: ");
scanf("%d", &n);
} while (n <= 0);
// input for elements in array
if (m == 1)
{
printf("Value of element in matrix R with size M: ");
scanf("%d", &original[0][0]);
}
else {
for (int i = 0; i < m; i++) {
for (int k = 0; k < m; k++) {
printf("[%d][%d] = ", i, k);
scanf("%d", &original[i][k]);
temporary[i][k] = original[i][k];
}
}
}
int sum = 0;
int a;
for (int i = 1; i < n; i++) // Power nth
{
for (int c = 0; c < m; c++) // Row
{
for (int d = 0; d < m; d++) // Column
{
for (int k = 0; k < m; k++)
{
sum += temporary[c][k] * original[k][d];
}
result[c][d] = sum;
sum = 0;
}
*hold = *(ptrResult + d);
*(ptrResult + d) = *(ptrTemp + d);
*(ptrTemp +d) = *hold;
}
}
我对指针的基本知识非常糟糕,因为它对我来说是一个非常新的概念。
我想要做的是每次我的循环计算其中一个总和,我想将它从结果数组替换为临时数组。忘记提到这个原始矩阵实际上是一个5x5矩阵但是让用户想要m = 3,它只填充5x5矩阵内的3x3矩阵。
答案 0 :(得分:1)
我不清楚你想做什么。但是你的代码有一些/似乎是错误的。
代码无法编译,因为变量d
的使用超出范围。
for (int d = 0; d < m; d++) // Here d is defined, i.e. in scope
{
for (int k = 0; k < m; k++)
{
sum += temporary[c][k] * original[k][d];
}
result[c][d] = sum;
sum = 0;
} // Here d gets out of scope
*hold = *(ptrResult + d); // So d can't be used here and
// you'll get a compile error
原则上你的交换代码是可以的,因为它交换了两个值。
*hold = *(ptrResult + d); // Put X into temp
*(ptrResult + d) = *(ptrTemp + d); // Overwrite X with Y
*(ptrTemp +d) = *hold; // Overwrite Y with X
// So X and Y has been swapped
但请看一下你的hold
指针。它指向什么?
int *hold = &result[0][0];
它指向result
中的第一个元素。因此,无论何时交换,都会破坏result
的第一个元素。这可能不是你想要的。而是为交换创建另一个变量。像:
int temp;
int* hold = & temp;
但是,总的来说,我不明白你为什么要用指针来做。为什么不使用简单的array[x][y]
表单。
答案 1 :(得分:0)
int *ptrResult=&result[0][0];
和int *hold=&result[0][0];
都指向数组的第一个元素。
*hold = *(ptrResult + d);
*(ptrResult + d) = *(ptrTemp + d);
*(ptrTemp +d) = *hold;
避免声明保持为“int。
int hold;