【问题标题】:Moving rows by one in a 2d array in c?在c中的二维数组中逐行移动?
【发布时间】:2021-12-25 23:22:23
【问题描述】:

免责声明:我是初学者。 所以我的作业是编写一个移动行的程序,例如,第 0 行到第 1 行,第 1 行到第 2 行,第 2 行到第 0 行。有问题的是 3x3 矩阵。我写了代码,但它似乎不起作用,它显示了 -858993460 之类的数字。这是我的尝试(部分代码):

#include<stdio.h>
int main(){
    int a[10][10], n, m, i, j, k, l,transpose[10][10];
    printf("Enter number of rows: ");
    scanf_s("%d", &n);
    printf("Enter number of columns: ");
    scanf_s("%d", &m);
    printf("Enter elements of the matrix: ");
    for ( i = 0; i < n; i++)
    {
        for ( j = 0; j < m; j++)
        {
            scanf_s("%d", &a[i][j]);
        }

    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    } 
for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            a[i][j] = a[i + 1][j];
                a[n - 1][n - 1] = a[0][0];
        }
        
    }
    printf("\n The new matrix is: \n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d\t", a[i ][j]);
        }
        printf("\n");
    }  ``

【问题讨论】:

  • as int a[10][10] ,然后输入后面的行数,即 3

标签: arrays c


【解决方案1】:

解决这个问题的一种方法是使用一个指向 int 的指针数组。

因此,您创建了一个包含 3 个指向 int 值数组的指针的数组

然后只需更改指针指向的内容。

int * a[3]; // declares 3 pointers to arrays of int

现在为每个点分配内存以保存 3 个 int 值

a[0] = malloc(sizeof(int)*3);
...

+------+     +--+--+--+
| a[0] | --> |  |  |  |
+------      +--+--+--+  
| a[1] | --> |  |  |  |
+------+     +--+--+--+
| a[2] | --> |  |  |  |
+------+     +--+--+--+

现在你有了三个指针,指向三个分配的内存区域,可以容纳 3 个 int 值。

将 a[1] 与 a[2] 交换即可

int* tmp = a[1];
a[1] = a[2];
a[2] = tmp;

我看到您在我上次查看后添加了一些代码,但仍然缺少代码。奇怪值的原因是你在矩阵之外

for (j = 0; j < m; j++)
{
  a[i][j] = a[i + 1][j];
  a[n - 1][n - 1] = a[0][0];
}

仔细看a[i+1][j]i+1在i的最后一次迭代中,它会在有效区间[0,n-1]之外,顺便说一句,这是什么目的:

a[n-1][n-1] = a[0][0];

一遍又一遍地分配到同一个位置?

要将一行复制到另一行,有一个临时存储来保存以前的内容

int tmp; 

假设您想在 3x3 矩阵中交换第 1 行和第 2 行

// I replaced "m" with the variable name "columns" 
// and "j" with "column" for clarity
int row1 = 1; 
int row2 = 2;

for (int column = 0; j < columns; ++column)
{
  int tmp = a[row1][column];
  a[row1][column] = a[row2][column];
  a[row2][column] = tmp;
}

您还需要从用户那里读取 row1 和 row2 值以 能够知道要交换哪些行。

【讨论】:

    【解决方案2】:

    假设n = 3,m = 3。当i = 2,j = 0;这行a[i][j] = a[i + 1][j]; 变为a[2][0] = a[3][0]
    在这种情况下, a[3][0] 没有被初始化。第 i 个索引 0、1、2 的初始化不是 3。因此,您会得到意外的值。

    这是对最后两个嵌套循环的一些修改,以生成预期的输出。

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            transpose[i][j] = a[(i + 1)%n][j];
            //a[n - 1][n - 1] = a[0][0];
        }
        
    }
    printf("\n The new matrix is: \n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d\t", transpose[i][j]);
        }
        printf("\n");
    } 
    

    【讨论】:

      【解决方案3】:

      使用针对您的平台优化的标准 C 函数,而不是逐个元素地复制。

      void moveRowDown(size_t rows, size_t cols, int (*array)[cols])
      {
          memmove(array[1], array[0], sizeof(*array) * (rows - 1));
          memset(array[0], 0, sizeof(*array));
      }
      
      void moveRowUp(size_t rows, size_t cols, int (*array)[cols])
      {
          memmove(array[0], array[1], sizeof(*array) * (rows - 1));
          memset(array[rows - 1], 0, sizeof(*array));
      }
      

      这些函数还会将移动后无效的行归零。

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多