C++ 为什么我的程序不执行正确的对角线差分(C+;+;)?

C++ 为什么我的程序不执行正确的对角线差分(C+;+;)?,c++,c++11,debugging,C++,C++11,Debugging,由于某些原因,我的程序没有给我正确的对角线差 (11 2 4) (4 5 6) (10 8 -12) 通过加上(11+5+(-12))和(4+5+10)得到15,然后做2的abs差,但出于某种原因得到6 下面是我的代码函数: int diagonalDifference(vector<vector<int>> arr) { int result = 0; int difference = 0; int first_diagonal

由于某些原因,我的程序没有给我正确的对角线差 (11 2 4) (4 5 6) (10 8 -12) 通过加上(11+5+(-12))和(4+5+10)得到15,然后做2的abs差,但出于某种原因得到6

下面是我的代码函数:

int diagonalDifference(vector<vector<int>> arr) {
       int result = 0;
       int difference = 0;
       int first_diagonal =0;
       int second_diagonal = arr.size();
       int add_for_first_diagonal = 0;
       int add_for_second_diagonal = 0;
       for(int row = 0; row < (int)arr.size(); row++) {
           for(int column =0; column < (int)arr.size(); column++) {
               add_for_first_diagonal += arr[column][first_diagonal]; 
               add_for_second_diagonal += arr[column][second_diagonal];
        }
          first_diagonal += row;
          second_diagonal -= row;
    }
      difference = first_diagonal - second_diagonal;
      result = abs(difference);
      return result;
}
int对角线差(向量arr){
int结果=0;
int差=0;
int first_diagonal=0;
int second_diagonal=阵列大小();
int add_表示第一个对角线=0;
int加上第二个对角线=0;
对于(int row=0;row<(int)arr.size();row++){
对于(int column=0;column<(int)arr.size();column++){
为第一条对角线加上第一条对角线+=arr[列][第一条对角线];
为第二条对角线加上“+=arr[列][第二条对角线];
}
第一个_对角线+=行;
第二个_对角线-=行;
}
差=第一条对角线-第二条对角线;
结果=abs(差异);
返回结果;
}

感谢您的帮助。谢谢。

好吧,您正在访问矩阵的每个元素,您只需要对角线。因此,从这里开始,尽管还有一些错误,但它们并不重要

这可能是您想要的代码(我还没有做任何调试)。我希望这是对的

int diagonalDifference(const vector<vector<int>>& M) {
      const int n = static_cast<int>(M.size());
      int sum_1st_diag = 0;
      int sum_2nd_diag = 0;
      
      for (int row = 0; row < n; ++row) {
          sum_1st_diag += M[row][row];
          sum_2nd_diag += M[row][n - row - 1];
      }
      return abs(sum_1st_diag - sum_2nd_diag);
}
int对角线差(常数向量&M){
const int n=静态(M.size());
int sum_1st_diag=0;
int sum_2nd_diag=0;
对于(int行=0;行
欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:另一个不相关的注意事项是,每当你觉得有必要进行C风格的转换时(就像你使用例如
(int)arr.size()
),你应该将其视为你做错了什么。使用C样式强制转换来消除警告是错误的解决方案。对矩阵的访问可能是错误的。应该是
arr[row][column]
@NathanOliver非常感谢您提供的链接Nathan。我一定去看看。嗨,非常感谢。是的,它有效。然而,我有点困惑为什么要使用M[row][row]和M[row][n-row-1]。第二个数组[row]和[n-row-1]是如何工作的?再次感谢。
n-row-1
可能看起来很神奇,但它实际上是非常合乎逻辑的:如果row=0,1,2,…,那么表达式
n-row-1
给出了
n-1,n-2,n-3,…
,这正是访问作为第二对角线一部分的矩阵单元所需要的:
(0,n-1),(1,n-2),(2,n-3),…
。一张图表可能会让这更清楚,明白了。这是有道理的。谢谢。很高兴我能帮上忙。但是,解决这类问题最好更深思熟虑一点。我建议你画一些画。此外,一些显示变量值的
会发现矩阵是以不正确的方式访问的。