2D阵列 - 总和对角线,转置,移位列

时间:2018-03-15 03:35:50

标签: c++

我最近接过家庭作业,我原以为自己做得不对,但老师给我留下了我认为是对的东西。

第一个问题:填写以下代码,用于计算方阵A [7] [7]中主要和次要对角线上的值之和。假设矩阵已定义

int sum = 0; // he marked this wrong. Why is initializing to 0 wrong?
for(int i = 0; i < 7; i++) { 
    for(int j = 0; j < 7; j++) { // also marked j < 7 wrong
        sum = sum + A[i][i] + A[i][7-1-i]
    }
    return sum;
} 

问题2:转置方阵A [50] [50],即第一行成为第一列,反之亦然,第二行成为第二列,依此类推。假设定义了矩阵。

void transposeSquare(){
     for(int i=0;i<50;i++){
         for(int j=0;j<50;j++){ //marked j=0 wrong
             int temp = A[i][i];
             A[i][j] = A[j][i];
             A[j][i] = temp;
         }
     }
} 

为什么transposeSquare中的j = 0不对? 为什么总和不是0? 如果我&lt; 7应该j < 7如果它是一个方阵?

谢谢!

2 个答案:

答案 0 :(得分:0)

出于某些原因,你的逻辑是错误的。

  1. 通过在外部循环中使用嵌套循环,您将在对角线中添加7次而不是仅一次。

  2. <html> <head> <script> function updateOnlineStatus() { document.getElementById("status").innerHTML = "User is online"; } function updateOfflineStatus() { document.getElementById("status").innerHTML = "User is offline"; } window.addEventListener('online', updateOnlineStatus); window.addEventListener('offline', updateOfflineStatus); </script> </head> <body> <div id="status">User is online</div> </body> </html>为3时,行

    i

    相当于:

        sum = sum + A[i][i] + A[i][7-1-i]
    

    与:

    相同
        sum = sum + A[3][3] + A[3][7-1-3]
    

    sum = sum + A[3][3] + A[3][3] 两次添加到总和中是不正确的。

  3. 要解决问题,请使用:

    A[3][3]

    您可以使用for(int i = 0; i < 7; i++){ sum = sum + A[i][i] + A[i][7-1-i]; } sum -= A[3][3]; // Remove the element that was added twice. 来简化代码。

    +=

答案 1 :(得分:0)

您的代码存在小错误,这就是您的老师将您的代码视为错误的原因。

第一部分,

int sum = 0;
int size = 7; 
for(int i = 0; i < size; i++) { 
    sum += A[i][j] + A[i][sz-1-i]; // Error: Typo, it should be A[i][j] instead of A[i][i]
}
if(size%2 != 0)
    sum -= A[size/2][size/2];  // Missed Case: Subtract the middle element since its repeated only when the size of array is an odd number
return sum; // Return the sum at the end!

对于第二部分您不需要迭代整个二维数组。因为如果你这样做,它会将上三角复制到下三角,而不是计算Transpose。因此遍历任何三角形(UpperLower)。

就像我在此代码中遍历Lower Triangle一样。

void transposeSquare(){
     for(int i=0;i<50;i++){
         for(int j=0; j<i ;j++){ // Fix 1: Loop j to i-1 
             int temp = A[i][j]; // Fix 2: Typo it should be A[i][j] instead of A[i][i]
             A[i][j] = A[j][i];
             A[j][i] = temp;
         }
     }
} 

结帐Triangular Matrix 以获得更好的解释。