矩阵有啥问题?
Posted
技术标签:
【中文标题】矩阵有啥问题?【英文标题】:What's wrong with the matrix?矩阵有什么问题? 【发布时间】:2017-11-23 15:00:47 【问题描述】:这段代码有什么问题? 我的任务是:创建一个大小为 9x9 的整数方阵。用随机数填充矩阵。相对于垂直轴对称地显示主对角线和侧对角线。预期结果的例子在这里:matrix
Matrix :
20 20 76 65 93 76 16 2 85
6 87 78 43 48 81 71 90 38
10 12 35 77 48 88 24 53 7
12 66 51 35 74 7 30 22 49
58 14 71 46 68 68 10 81 51
98 16 74 47 64 25 17 30 37
2 44 44 74 34 54 86 73 28
85 4 57 75 18 28 51 76 2
35 17 53 76 15 91 83 85 72
The main and side diagonal:
85 20 76 65 93 76 16 2 20
6 90 78 43 48 81 71 87 38
10 12 24 77 48 88 35 53 7
12 66 51 7 74 35 30 22 49
58 14 71 46 68 68 10 81 51
98 16 74 25 64 47 17 30 37
2 44 86 74 34 54 44 73 28
85 76 57 75 18 29 51 4 2
72 17 53 76 15 91 83 85 35
但实际上程序只打印带有随机数的主矩阵,然后停止。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <Windows.h>
int main()
int a = 9;
int matrix[a][a];
int temp;
int i, j, n;
srand((unsigned)time(NULL));
printf("Matrix : \n\n");
for (i = 0; i < a; ++i)
for (j = 0; j < a; ++j)
matrix[i][j] = rand() % 100;
printf("%d\t", matrix[i][j]);
printf("\n\n");
printf("The main and side diagonal:\n\n");
for (i = 0; i < a; ++i)
temp = matrix[i][i];
matrix[i][i] = matrix[i][(a - 1) - i];
matrix[i][(a - 1) - i] = temp;
for (i = 0; i < a; ++i)
for (j = 0; j < a; ++j)
printf("Result:", matrix[i][j]);
printf("\n\n\n");
system("pause");
return 0;
【问题讨论】:
代码的预期和实际结果是什么? 请编辑您的问题,并附上导致您认为存在问题的原因。运行代码时出现错误消息、错误输出、成群尖叫的外星人从天而降,其他? 图像应作为“代码”嵌入问题中。它只是两个带有标题线的 9x9 矩阵的转储。看起来这些行是双倍行距的(一行数字,一行空白)。我不知道什么是“主对角矩阵和侧对角矩阵”——Google 也没有用三个或更少的音节来告诉我。 【参考方案1】:你正在返回你不应该去的地方。 (在计算中间)。完成 for 循环后,您应该返回。
for (i = 0; i < a; ++i)
for (j = 0; j < a; ++j)
printf("Result:", matrix[i][j]); <--- Not printing element
printf("\n\n\n");
system("pause");
return 0; <-----
应该是
for (i = 0; i < a; ++i)
for (j = 0; j < a; ++j)
printf("Result: %d ", matrix[i][j]); <----You forgot the
//format specifier
printf("\n\n\n");
system("pause");
return 0;<-----
这样的缩进会妨碍可读性。您从中实现了错误的逻辑。
OP 要求它在打印“结果”后停止,这是因为您忘记将格式说明符放入代码中。这就是为什么没有打印任何元素的原因。
Op 想要打印 相对于垂直轴对称的主对角线和侧对角线。
现在这就是打印部分的全部内容了。
现在我们必须找到一种方法来区分哪个是对角元素,哪个不是。
令人惊讶的是,编写先前交换逻辑的人应该知道答案。 (虽然不清楚为什么 OP 换了它)。
现在所有元素matrix[p][q]
将来自p=q
或p+q=a-1
的任一对角线。 (注意matrix
是方阵)。
但是 OP 的意思是打印矩阵
for (i = 0; i < a; ++i)
if( i == 0) printf("The main and side diagonal : \n");
for (j = 0; j < a; ++j)
printf("%d\t", matrix[i][j]);
printf("\n");
【讨论】:
谢谢,我做到了,但问题仍然存在……不明白问题出在哪里。 @ВасилийПупкин.: 有什么问题吗?你想生成随机矩阵并打印出来吗? 我想打印随机矩阵和边(辅助)矩阵相对于垂直轴对角线对称。但是程序会打印随机矩阵和字符串“主对角线和侧对角线:”和“结果:”,然后停止。 @ВасилийПупкин.: 所以你想像这样打印对角线a[0][0] a[0][2] a[1][1] a[1][1] a[0][2] a[2][2]
???
@ВасилийПупкин.:欢迎使用 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here? 和What do I do when someone answers my question?【参考方案2】:
使用函数。您打印矩阵两次;你应该有一个函数来打印你调用两次的矩阵。
使用这样的函数,您就不会在代码的末尾犯错误。例如,您可以这样使用:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static void print_matrix(const char *tag, int size, int matrix[size][size])
printf("%s (%dx%d):\n\n", tag, size, size);
for (int i = 0; i < size; ++i)
const char *pad = "";
for (int j = 0; j < size; ++j)
printf("%s%-2d", pad, matrix[i][j]);
pad = " ";
printf("\n\n");
int main(int argc, char **argv)
unsigned seed = time(0);
int a = 9;
int matrix[a][a];
if (argc == 2)
seed = atoi(argv[1]);
srand(seed);
printf("Seed: %u\n", seed);
for (int i = 0; i < a; ++i)
for (int j = 0; j < a; ++j)
matrix[i][j] = rand() % 100;
print_matrix("Matrix", a, matrix);
for (int i = 0, j = a - 1; i < a; ++i, --j)
int temp = matrix[i][i];
matrix[i][i] = matrix[i][j];
matrix[i][j] = temp;
print_matrix("The main and side diagonal", a, matrix);
return 0;
代码报告它使用的种子;这允许您通过指定要用作命令行参数的种子来重现任何运行。
示例输出:
Seed: 1511470282
Matrix (9x9):
11 39 3 88 98 63 75 81 76
93 9 60 22 45 50 46 58 65
13 99 25 43 14 57 44 70 65
30 57 55 0 37 84 47 49 40
60 28 46 1 96 78 33 20 9
93 61 11 38 84 16 91 26 15
43 85 66 72 85 39 96 45 45
45 25 33 3 78 90 61 65 62
88 84 56 34 74 8 78 57 74
The main and side diagonal (9x9):
76 39 3 88 98 63 75 81 11
93 58 60 22 45 50 46 9 65
13 99 44 43 14 57 25 70 65
30 57 55 84 37 0 47 49 40
60 28 46 1 96 78 33 20 9
93 61 11 16 84 38 91 26 15
43 85 96 72 85 39 66 45 45
45 65 33 3 78 90 61 25 62
74 84 56 34 74 8 78 57 88
如果不明显,交换过程会交换第一行的第一个和最后一个元素,第二行中的第二个和最后一个元素,依此类推,形成交换元素的 X。
【讨论】:
以上是关于矩阵有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章