如何在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数组”,但基本上是通过删除列(您确定要删除列,而不是行?)或在列之后移动列,覆盖要删除的列。这种情况看起来很奇怪。请发布一个。我需要删除一行