2016-07-23 94 views
2

如何從矩陣中刪除特定的行,保持相同的順序? 例子:如何從C中的二維數組中刪除一行?

1 1 1 
2 2 2 
3 3 3 

比方說,我需要與所有偶數元素刪除行,所以刪除後,它應該看起來像:

1 1 1 
3 3 3 

我試着寫代碼自己,(條件不一樣我上面提到!)但它實際上並不能正常工作:

for (i = 0 ; i < no_of_rows ; i++) { 
    if (abs(prosjeci[i] - prosjek) < 0.1) { /* condition */ 
     for (k = i ; k < no_of_rows - 1 ; k++) { 
      for (j = 0 ; j < no_of_columns ; j++) { 
       matrica[k][j] = matrica[k+1][j]; 
      } 
     } 
     i--; 
     no_of_rows--; 
    } 
} 
+0

這取決於你如何實現「2D數組」,但基本上通過刪除列(你確定要刪除列而不是行嗎?)或在列之後移動列,覆蓋要刪除的列。 – MikeCAT

+0

排*,對不起 –

+0

情況看起來很奇怪。請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – MikeCAT

回答

3

,因爲你修改的地方矩陣您的方法不起作用,更新i索引和相應的行數no_of_rows,但未能更新單獨的數組prosjeci。每當某行匹配過濾器時,矩陣中的所有後續行都將被刪除。

您可以通過使用矩陣單列索引和過濾器陣列解決這個問題:

int ii; // index into the prosjeci array. 

for (i = ii = 0; i < no_of_rows ; i++, ii++) { 
    if (abs(prosjeci[ii] - prosjek) < 0.1) { /* condition */ 
     for (k = i; k < no_of_rows - 1; k++) { 
      for (j = 0; j < no_of_columns; j++) { 
       matrica[k][j] = matrica[k+1][j]; 
      } 
     } 
     i--; 
     no_of_rows--; 
    } 
} 

或者,如果你能更新過濾數組,你可以這樣做:

for (i = 0; i < no_of_rows ; i++) { 
    if (abs(prosjeci[i] - prosjek) < 0.1) { /* condition */ 
     for (k = i; k < no_of_rows - 1; k++) { 
      for (j = 0; j < no_of_columns; j++) { 
       matrica[k][j] = matrica[k+1][j]; 
      } 
      prosjeci[k] = prosjeci[k+1]; 
     } 
     i--; 
     no_of_rows--; 
    } 
} 
2

我沒有看到你的代碼有什麼問題。

在評論中,有人要求您發佈「最小,完整和可驗證的示例」。這就是這個意思。我充實了你的程序,增加了你的matrica數組和其他變量的聲明和初始化,改變條件來匹配你的例子,並在最後打印出數組。我結束了這個:

#include <stdio.h> 

int matrica[][3] = { 
    {1, 1, 1}, 
    {2, 2, 2}, 
    {3, 3, 3} 
}; 

int no_of_columns = 3; 
int no_of_rows = 3; 

int main() 
{ 
    int i, j, k; 

    for (i = 0 ; i < no_of_rows ; i++) { 
     if (matrica[i][0] % 2 == 0) { /* even row */ 
      for (k = i ; k < no_of_rows - 1 ; k++) { 
       for (j = 0 ; j < no_of_columns ; j++) { 
        matrica[k][j] = matrica[k+1][j]; 
       } 
      } 
      i--; 
      no_of_rows--; 
     } 
    } 

    for (i = 0 ; i < no_of_rows ; i++) { 
     for (j = 0 ; j < no_of_columns ; j++) { 
      printf("%d ", matrica[i][j]); 
     } 
     printf("\n"); 
    } 
} 

因此,如果你在第一個地方發佈了類似的東西會更好。

但是,當我編譯和運行這個程序,它完美的作品。 (我並不感到驚訝 - 正如我所說的,我沒有看到任何問題。)

所以無論你的問題是什麼,它是在你沒有向我們展示的東西。當你說「它實際上不能正常工作」時,你的意思是什麼?你期望看到什麼,而你看到了什麼?

[P.S.你的問題還有一個問題。在你問得更好之前,我甚至不應該回答它。我的這個答案實際上是低調提醒我這個事實。我沒有抱怨;我預料到了。但請,問一個更完整,交代問題,下一次。]

+0

現在看起來像對我的答案。對不起,這裏我們不得不manny分享教程的人,所以並不代表這樣的事情。 – Michi

+0

@Michi沒問題。 –

+0

@SteveSummit 你說得對,問題出在「我沒有告訴你的東西」,謝謝:) –

0

我試圖做你的意思..

main(){ 
    int matrica[3][3] = { { 1,2,3 }, 
          { 4,4,4 }, 
          { 7,8,9 } }; 
    double no_of_rows = 3; 
    int line_removed = 0; 
    for (int i = 0; i < no_of_rows; i++) { 
     double sum = 0; 
     for (int j = 0; j < no_of_rows; j++) 
     { 
      sum = sum + matrica[i][j]; 
     } 
     for (int j = 0; j < no_of_rows; j++) 
     { 
      int checker = 0.1 + (sum/no_of_rows); 
      if (checker > matrica[i][j] || checker < matrica[i][j]) 
      { 
       break; 
      } 
      if (j = (no_of_rows-1)) 
      { 
       for (int k = i ; k < no_of_rows; k++) 
       { 
        for (j = 0; j < no_of_rows; j++) 
        { 
         matrica[k][j] = matrica[k + 1][j]; 
        } 
       } 
       line_removed++; 
      } 
     } 
    } 

    for (int i = 0; i < (no_of_rows-line_removed); i++) 
    { 
     for (int j = 0; j < no_of_rows; j++) 
     { 
      printf("%d ", matrica[i][j]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
    return 0; 
} 
1

首先,事實上,如果不創建數組的新副本,您不能刪除數組中的元素。您只能用其他值覆蓋它們,並將實際使用的元素數保存在數組中。

下面是一個演示程序,顯示如何完成。名稱爲n的變量用於保留數組中實際使用的元素行數。

#include <stdio.h> 

#define N 10 

int all_of_even(const int *row, size_t n) 
{ 
    size_t i = 0; 

    while (i < n && row[i] % 2 == 0) i++; 

    return i == n; 
} 

int main(void) 
{ 
    int a[][N] = 
    { 
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
     { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 
     { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, 
     { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, 
     { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }, 
     { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }, 
     { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }, 
     { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, 
     { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }, 
     { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 } 
    }; 

    const size_t M = sizeof(a)/sizeof(* a); 

    size_t n = M; 

    for (size_t i = 0; i < n; i++) 
    { 
     for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 
    printf("\n"); 

    n = 0; 

    for (size_t i = 0; i < M; i++) 
    { 
     if (!all_of_even(a[i], N)) 
     { 
      if (n != i) 
      { 
       for (size_t j = 0; j < N; j++) a[n][j] = a[i][j]; 
      }    
      ++n; 
     } 
    } 

    for (size_t i = 0; i < n; i++) 
    { 
     for (size_t j = 0; j < N; j++) printf("%d ", a[i][j]); 
     printf("\n"); 
    } 
    printf("\n"); 
    return 0; 
} 

程序輸出是

0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 1 
2 2 2 2 2 2 2 2 2 2 
3 3 3 3 3 3 3 3 3 3 
4 4 4 4 4 4 4 4 4 4 
5 5 5 5 5 5 5 5 5 5 
6 6 6 6 6 6 6 6 6 6 
7 7 7 7 7 7 7 7 7 7 
8 8 8 8 8 8 8 8 8 8 
9 9 9 9 9 9 9 9 9 9 

1 1 1 1 1 1 1 1 1 1 
3 3 3 3 3 3 3 3 3 3 
5 5 5 5 5 5 5 5 5 5 
7 7 7 7 7 7 7 7 7 7 
9 9 9 9 9 9 9 9 9 9 

至於你的方法,那麼它是低效的,因爲與檢查的條件,而不是複製數組中的所有行給定行後只複製一個每次迭代行。

此外,同時更改for循環體內和for語句本身的控制變量是一種不好的做法。這使得難以閱讀代碼。

+0

return i == n;有趣的回報聲明。 – Michi

相關問題