【问题标题】:Reverse a 2D array in C [closed]在C中反转二维数组[关闭]
【发布时间】:2021-05-22 15:46:15
【问题描述】:

我正在尝试反转我的二维数组,我的这段代码有两个函数,第一个创建一个行和列的随机矩阵,第二个必须反转它,但我不太明白我在做什么那里做错了,因为最后它只打印了一行数字。示例:矩阵中的最后一个数字是 12,所以它打印我:“0 12 0”

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int ar[100][100];

void create_mat(int a)
{
    srand(time(NULL));
    for (int i=0; i<a; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {
            ar[a][a]=rand()%15+1;
            printf("%d\t", ar[a][a]);
        }
    }
}
void reverse_mat(int a)
{
    printf("\nReversed: ");
    for (int i=0; i<a/2; i++)
    {
        printf("\n");
        for (int j=0; j<a; j++)
        {
            int temp = ar[a][a];
            ar[a][a]=ar[a-i-1][a];
            ar[a-i-1][a]=temp;
            printf("%d\t", ar[a][a]);
        }
    }
}

int main()
{
    int (*funcptr)(int);
    int (*rev)(int);
    funcptr = &create_mat;
    rev = &reverse_mat;
    int a;
    printf("Introduce the number of rows and columns: ");
    scanf("%d", &a);
    funcptr(a);
    rev(a);

    return 0;
}

【问题讨论】:

  • 你为什么要用函数指针把它复杂化?
  • 如果您只打印ar[a][a],而a 永远不会改变,您为什么要打印整个内容?
  • 请注意,函数指针变量与您分配给它们的函数不匹配。
  • 还可以考虑类似ar[a][a]=rand()%15+1;... 尝试向您的rubber duck 解释它(以及它所在的循环)。尤其是索引。
  • 请将您的代码转换为最小完整可验证示例。删除对您的问题不必要的内容。在这种情况下,函数指针、用户输入 (scanf) 和随机值并不是手头问题的组成部分,而是在查找问题时需要做更多工作。

标签: c for-loop multidimensional-array reverse function-definition


【解决方案1】:

首先,生成矩阵的时候逻辑有错误。尽管打印结果看起来不错,但您并未将随机值分配给矩阵中的正确位置。为了避免这种混乱,最好将打印逻辑分离在一个新函数中。

其次,您为反向功能做了类似的事情。确保将值分配到矩阵中的正确位置。

void print_matrix(int a)
{
    printf("\n*********************\n");
    for (int i=0; i<a; i++)
    {
        for (int j=0; j<a; j++)
        {
            printf("%d\t", ar[i][j]);
        }
        printf("\n");
    }
}

void reverse_mat(int a)
{
    printf("\nReversed: ");
    for (int i=0; i<a/2; i++)
    {
        for (int j=0; j<a; j++)
        {
            int temp = ar[i][j]; // this line had the error
            ar[i][j]=ar[a-i-1][j]; // this line had the error
            ar[a-i-1][j]=temp; // this line had the error
        }
    }
}
void create_mat(int a)
{
    srand(time(NULL));
    for (int i=0; i<a; i++)
    {
        for (int j=0; j<a; j++)
        {
            ar[i][j]=rand()%15+1; // this line had the error
        }
    }
}

【讨论】:

    【解决方案2】:

    感谢大家的帮助!由于我暂停编码一个月,我犯了一些导致我的问题的错误,例如 ar[a][a]、rand()%15+1 等。在您的帮助和提示下,我修复了程序,现在它正在做我想要它做的事情。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int ar[100][100];
    
    void create_mat(int a)
    {
        srand(time(NULL));
        for (int i=0; i<a; i++)
        {
            printf("\n");
            for (int j=0; j<a; j++)
            {
                ar[i][j]=rand()%16;
                printf("%d\t", ar[i][j]);
            }
        }
    }
    void reverse_mat(int a)
    {
        for (int i=0; i<a/2; i++)
        {
            printf("\n");
            for (int j=0; j<a; j++)
            {
                int temp = ar[i][j];
                ar[i][j]=ar[a-i-1][j];
                ar[a-i-1][j]=temp;
            }
        }
    }
    
    void print_reversed(int a)
    {
        printf("\nMatricea in forma inversa: ");
        for (int i=0; i<a; i++)
        {
            printf("\n");
            for (int j=0; j<a; j++)
            {
    
                printf("%d\t", ar[i][j]);
            }
        }
    }
    
    int main()
    {
        int (*funcptr)(int);
        int (*rev)(int);
        int (*ptr_rev)(int);
        funcptr = &create_mat;
        rev = &reverse_mat;
        ptr_rev = &print_reversed;
        int a;
        printf("Introduceti nr de linii si coloane: ");
        scanf("%d", &a);
        funcptr(a);
        rev(a);
        ptr_rev(a);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      对于初学者来说,这些代码行

      int (*funcptr)(int);
      int (*rev)(int);
      funcptr = &create_mat;
      rev = &reverse_mat;
      

      是冗余的,而且由于返回类型不同,指针的类型与分配给指针的函数的函数类型不兼容。

      在 for 循环中,您总是使用不正确的索引。例如在函数create_mat 中有嵌套循环

      for (int i=0; i<a; i++)
      {
          printf("\n");
          for (int j=0; j<a; j++)
          {
              ar[a][a]=rand()%15+1;
              printf("%d\t", ar[a][a]);
          }
      }
      

      您使用变量a 作为索引的地方,它表示矩阵的大小,而不是使用变量ij

      for (int i=0; i<a; i++)
      {
          printf("\n");
          for (int j=0; j<a; j++)
          {
              ar[i][j]=rand()%15+1;
              printf("%d\t", ar[i][j]);
          }
      }
      

      如果变量a 的值为奇数,则在函数reverse_mat 中,由于外循环中的条件,中间行的元素不会被反转

      for (int i=0; i<a/2; i++)
      

      您再次使用无效索引的地方。

      该程序可以如下面的演示程序中所示的方式显示

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      #define N   100
      
      int a[N][N];
      
      void create_mat( size_t n, int max_value )
      {
          srand( time( NULL ) );
          
          for ( size_t i = 0; i < n; i++ )
          {
              for ( size_t j = 0; j < n; j++ )
              {
                  a[i][j] = rand() % max_value + 1;
              }
          }
      }
      
      void reverse_mat( size_t n )
      {
          if ( n )
          {
              for ( size_t i = 0, j = n * n; i < --j; i++ )
              {
                  int tmp = a[ i / n] [ i % n ];
                  a[ i / n ][ i % n ] = a[ j / n][ j % n ];
                  a[ j / n][ j % n ] = tmp;
              }
          }       
      }
      
      void display( size_t n )
      {
          for ( size_t i = 0; i < n; i++ )
          {
              for ( size_t j = 0; j < n; j++ )
              {
                  printf( "%2d ", a[i][j] );
              }
              
              putchar( '\n' );
          }
      }
      
      int main(void) 
      {
          size_t n = 0;
          
          printf( "Introduce the number of rows and columns: " );
          
          scanf( "%zu", &n );
          
          if ( N < n ) n = N;
          
          putchar( '\n' );
          
          create_mat( n, 15 );
          display( n );
          
          putchar( '\n' );
          
          reverse_mat( n );
          display( n );
          
          return 0;
      }
      

      程序输出可能看起来像

      Introduce the number of rows and columns: 3
      
      10  4 14 
      12 14  7 
       6  8  3 
      
       3  8  6 
       7 14 12 
      14  4 10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2018-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多