如何在C中从2D数组中删除行?

如何在C中从2D数组中删除行?,c,arrays,sorting,2d,C,Arrays,Sorting,2d,如何从矩阵中删除特定行,保持相同的顺序? 例如: 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 =

如何从矩阵中删除特定行,保持相同的顺序? 例如:

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--;
    }
}
(i=0;i if(abs(prosjeci[i]-prosjek)<0.1){/*条件*/ 对于(k=i;k我看不出你的代码有什么问题

在评论中,有人要求您发布一个“最小、完整且可验证的示例”。这就是它的意思。我充实了您的程序,添加了
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");
    }
}
#包括
int matrica[][3]={
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}
};
int no_of_columns=3;
int no_of_行=3;
int main()
{
int i,j,k;
对于(i=0;i
因此,如果你一开始就发布类似的内容,那会更好

但是当我编译并运行这个程序时,它工作得非常好。(我一点也不惊讶——正如我所说,我看不出它有什么问题。)

所以不管你的问题是什么,都是你没有告诉我们的。你说“它实际上不能正常工作”是什么意思?你期望看到什么?你看到了什么


[p.S.你的问题还有一个问题。在你问得更好之前,我甚至不应该回答。我的这个答案实际上被否决了,以提醒我这个事实。我不是在抱怨,我期待它。但是,请下次问一个更完整、更负责任的问题。]

我试着按照你的意思做

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;
}
main(){
int matrica[3][3]={{1,2,3},
{ 4,4,4 },
{ 7,8,9 } };
第二行中的第二行=3;
int line_=0;
for(int i=0;imatrica[i][j]| | checker
您的方法不起作用,因为您修改了矩阵,相应地更新了
i
索引和行数
no\u行
,但未能更新单独的数组
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--;
    }
}
int-ii;//索引到prosjeci数组中。
对于(i=ii=0;i
或者,如果可以更新筛选数组,则可以执行以下操作:

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--;
    }
}
(i=0;i if(abs(prosjeci[i]-prosjek)<0.1){/*条件*/ 对于(k=i;k首先,事实上,如果不创建数组的新副本,就无法从数组中删除元素。只能使用其他值覆盖它们,并保留数组中实际使用的元素数

#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;
}
下面是一个演示程序,展示了如何实现这一点。名为
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;
}
至于您的方法,它是低效的,因为对于每次检查条件的迭代,您都会在给定行之后复制数组的所有行,而不是只复制一行


另外,在for循环体和for语句本身中同时更改for循环的控制变量也是一种不好的做法。这使得代码难以阅读。

这将取决于您如何实现“2D数组”,但基本上是通过删除列(您确定要删除列,而不是行?)或在列之后移动列,覆盖要删除的列。这种情况看起来很奇怪。请发布一个。我需要删除一行