C语言中同时索引传递矩阵值异常:子矩阵列偏移问题求助
解决C语言结构体矩阵中子矩阵列偏移的问题
嘿,我仔细看了你的代码和运行结果,马上就找到问题所在了——你在循环里没有重置列索引l的初始值!
问题原因分析
你原本的思路是用k和l记录用户输入的起始行列,然后通过嵌套循环同时递增索引来复制子矩阵。但问题出在:
- 处理第一行子矩阵时,内循环会把
l递增两次(从初始值变成初始l+2) - 进入第二行循环时,
l并没有回到用户输入的起始列位置,而是继续从初始l+2开始递增,导致第二行的列直接偏移了2位,所以才会出现你看到的“第二行列偏移”现象。
比如你输入起始列是3,第一行循环结束后l变成了5,第二行就会从原矩阵的第5列开始取值,自然拿到的是错误的元素。
修复方案
我们需要在每次处理子矩阵的新行时,把l重置为用户输入的起始列值。更稳妥的做法是先把起始行列值保存到临时变量里,然后通过循环索引来计算当前要访问的原矩阵位置,避免直接修改k和l导致的混乱。
修改后的matrixDeterminant函数核心循环代码如下:
void matrixDeterminant(struct matrix m1, struct matrix *m2, int * determinant) { int i, j, k, l; int start_k, start_l; // 新增临时变量保存起始位置 FILE* fin; fin = fopen("marks.txt", "r"); if(m1.nrows > 2) { printf("\n\nFinding the determinant now.\n"); if(fin!=NULL) { do { printf("Please assign a letter to name your matrix A - Z : "); scanf(" %c", &m2->name); // 用->简化指针访问 } while(m2->name < 'A' || m2->name > 'Z'); do { printf("\n\nEnter the row where you want to start the 2x2 matrix.\nNumber needs to be between 1 and %d : ", m1.nrows-1); scanf("%d", &k); } while(k >= m1.nrows); do { printf("\n\nEnter the column where you want to start your 2x2 matrix.\nNumber needs to be between 1 and %d : ", m1.ncols-1); scanf("%d", &l); } while(l >= m1.ncols); // 保存用户输入的起始行列 start_k = k; start_l = l; } // 重新编写循环逻辑 for(i=0; i<2; i++) { printf("Row %d:\t", i+1); // 每次处理新行时,重置列索引到起始位置 l = start_l; // 当前行 = 起始行 + 子矩阵行索引 k = start_k + i; for(j=0; j<2; j++, l++) { // 用->简化结构体指针访问,代码更清晰 m2->mValues[i][j] = m1.mValues[k-1][l-1]; printf("%d\t", m2->mValues[i][j]); } printf("\n"); } // 别忘了给新矩阵设置正确的行列数 m2->nrows = 2; m2->ncols = 2; } }
额外优化建议
- 用
m2->成员名代替(*m2).成员名,这是C语言中指针访问结构体成员的标准写法,代码更简洁易读。 - 修正代码里的拼写错误:
deterinamt→determinant,mtrix→matrix,避免后续维护时的混淆。 - 给新矩阵
m2设置正确的行列数(m2->nrows = 2; m2->ncols = 2;),这样后续如果调用matrixDisplay显示子矩阵时也能正常工作。
验证效果
修改后,当你输入起始行3、起始列3时,会正确提取原矩阵第3-4行、第3-4列的元素:
Row 1: 88 32 Row 2: 33 18
完全符合预期!
内容的提问来源于stack exchange,提问作者8TrackRobot
相关产品推荐
相关产品推荐

